Compare commits
7 Commits
feature/re
...
feat/data-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d54edb7783 | ||
|
|
4eac6ab83d | ||
|
|
604e0d8479 | ||
|
|
99e99fa2e6 | ||
|
|
ff324014f6 | ||
|
|
7d06e12de8 | ||
|
|
f38d518f96 |
@@ -65,6 +65,5 @@ AWS_USE_PATH_STYLE_ENDPOINT=false
|
|||||||
|
|
||||||
VITE_APP_NAME="${APP_NAME}"
|
VITE_APP_NAME="${APP_NAME}"
|
||||||
|
|
||||||
SIMBG_HOST="xxxxxx"
|
API_KEY_GOOGLE="xxxxx"
|
||||||
SIMBG_EMAIL="xxxxxx"
|
SPREAD_SHEET_ID="xxxxx"
|
||||||
SIMBG_PASSWORD="xxxxx"
|
|
||||||
@@ -1,199 +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 village_code berdasarkan village_name
|
|
||||||
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->value('village_code');
|
|
||||||
// Cari district_code berdasarkan district_name
|
|
||||||
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_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 village_code berdasarkan village_name
|
|
||||||
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->value('village_code');
|
|
||||||
// Cari district_code berdasarkan district_name
|
|
||||||
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -12,42 +12,47 @@ class DashboardController extends Controller
|
|||||||
use GlobalApiResponse;
|
use GlobalApiResponse;
|
||||||
|
|
||||||
public function businnessDocument(Request $request){
|
public function businnessDocument(Request $request){
|
||||||
$businessData = DB::table('pbg_task')
|
$query = DB::table('pbg_task AS pt')
|
||||||
->leftJoin('pbg_task_retributions', 'pbg_task.uuid', '=', 'pbg_task_retributions.pbg_task_uid')
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
->select(
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
|
||||||
DB::raw('COUNT(DISTINCT pbg_task.id) as task_count'),
|
|
||||||
DB::raw('SUM(pbg_task_retributions.nilai_retribusi_bangunan) as total_retribution')
|
|
||||||
)
|
|
||||||
->where(function ($query) {
|
->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();
|
->first();
|
||||||
$taskCount = $businessData->task_count;
|
$taskCount = $query->total_data;
|
||||||
$taskTotal = $businessData->total_retribution;
|
$taskTotal = $query->total_retribution ?? 0;
|
||||||
$result = [
|
$result = [
|
||||||
"count" => $taskCount,
|
"count" => $taskCount,
|
||||||
"series" => [$taskCount],
|
|
||||||
"total" => $taskTotal
|
"total" => $taskTotal
|
||||||
];
|
];
|
||||||
return $this->resSuccess($result);
|
return $this->resSuccess($result);
|
||||||
}
|
}
|
||||||
public function nonBusinnessDocument(Request $request){
|
public function nonBusinnessDocument(Request $request){
|
||||||
$businessData = DB::table('pbg_task')
|
|
||||||
->leftJoin('pbg_task_retributions', 'pbg_task.uuid', '=', 'pbg_task_retributions.pbg_task_uid')
|
$query = DB::table('pbg_task AS pt')
|
||||||
->select(
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
DB::raw('COUNT(DISTINCT pbg_task.id) as task_count'),
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
|
||||||
DB::raw('SUM(pbg_task_retributions.nilai_retribusi_bangunan) as total_retribution')
|
|
||||||
)
|
|
||||||
->where(function ($query) {
|
->where(function ($query) {
|
||||||
$query->where("pbg_task.function_type", "NOT LIKE", "sebagai tempat usaha%")
|
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||||
->orWhereNull("pbg_task.function_type");
|
->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();
|
->first();
|
||||||
$taskCount = $businessData->task_count;
|
$taskCount = $query->total_data;
|
||||||
$taskTotal = $businessData->total_retribution;
|
$taskTotal = $query->total_retribution ?? 0;
|
||||||
$result = [
|
$result = [
|
||||||
"count" => $taskCount,
|
"count" => $taskCount,
|
||||||
"series" => [$taskCount],
|
|
||||||
"total" => $taskTotal
|
"total" => $taskTotal
|
||||||
];
|
];
|
||||||
return $this->resSuccess($result);
|
return $this->resSuccess($result);
|
||||||
@@ -64,12 +69,54 @@ class DashboardController extends Controller
|
|||||||
$taskTotal = $query->total_retribution;
|
$taskTotal = $query->total_retribution;
|
||||||
$result = [
|
$result = [
|
||||||
"count" => $taskCount,
|
"count" => $taskCount,
|
||||||
"series" => [$taskCount],
|
|
||||||
"total" => $taskTotal
|
"total" => $taskTotal
|
||||||
];
|
];
|
||||||
return $this->resSuccess($result);
|
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){
|
public function pbgTaskDocuments(Request $request){
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'status' => 'required|string'
|
'status' => 'required|string'
|
||||||
|
|||||||
104
app/Http/Controllers/Api/DataSettingController.php
Normal file
104
app/Http/Controllers/Api/DataSettingController.php
Normal 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
61
app/Http/Controllers/Api/GoogleSheetController.php
Normal file
61
app/Http/Controllers/Api/GoogleSheetController.php
Normal 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)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
291
app/Http/Controllers/Api/PbgTaskController.php
Normal file
291
app/Http/Controllers/Api/PbgTaskController.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,9 +14,10 @@ class RequestAssignmentController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function index(Request $request)
|
public function index(Request $request)
|
||||||
{
|
{
|
||||||
$query = PbgTask::query();
|
$query = PbgTask::query()->orderBy('id', 'desc');
|
||||||
if($request->has('search') && !empty($request->get("search"))){
|
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());
|
return RequestAssignmentResouce::collection($query->paginate());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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",
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
120
app/Http/Controllers/DataSettingController.php
Normal file
120
app/Http/Controllers/DataSettingController.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@ class PbgTaskController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
return view('request-assignment.index');
|
return view('pbg_task.index');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -20,7 +20,7 @@ class PbgTaskController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function create()
|
public function create()
|
||||||
{
|
{
|
||||||
//
|
return view("pbg_task.create");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,7 +28,7 @@ class PbgTaskController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function store(Request $request)
|
public function store(Request $request)
|
||||||
{
|
{
|
||||||
//
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,7 +36,7 @@ class PbgTaskController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function show(string $id)
|
public function show(string $id)
|
||||||
{
|
{
|
||||||
//
|
return view("pbg_task.show");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -44,7 +44,7 @@ class PbgTaskController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function edit(string $id)
|
public function edit(string $id)
|
||||||
{
|
{
|
||||||
//
|
return view("pbg_task.edit");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -15,30 +15,4 @@ class RoutingController extends Controller
|
|||||||
return redirect('auth.signin');
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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',
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
31
app/Http/Requests/DataSettingRequest.php
Normal file
31
app/Http/Requests/DataSettingRequest.php
Normal 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",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
62
app/Http/Requests/PbgTaskMultiStepRequest.php
Normal file
62
app/Http/Requests/PbgTaskMultiStepRequest.php
Normal 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.",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
26
app/Http/Resources/DataSettingResource.php
Normal file
26
app/Http/Resources/DataSettingResource.php
Normal 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(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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) // Perbaikan pada where()
|
|
||||||
->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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -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'];
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
15
app/Models/DataSetting.php
Normal file
15
app/Models/DataSetting.php
Normal 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"
|
||||||
|
];
|
||||||
|
}
|
||||||
68
app/Models/PbgTaskGoogleSheet.php
Normal file
68
app/Models/PbgTaskGoogleSheet.php
Normal 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',
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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 {
|
try {
|
||||||
|
|
||||||
$headers = array_merge($this->headers, $headers);
|
$headers = array_merge($this->headers, $headers);
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ class ServiceSIMBG
|
|||||||
];
|
];
|
||||||
|
|
||||||
$res = $clientHelper->get($url, $headers);
|
$res = $clientHelper->get($url, $headers);
|
||||||
|
|
||||||
|
Log::info("response index integration", ['res' => $res]);
|
||||||
|
|
||||||
if (empty($res->original['success']) || !$res->original['success']) {
|
if (empty($res->original['success']) || !$res->original['success']) {
|
||||||
// Log error
|
// Log error
|
||||||
@@ -128,9 +130,10 @@ class ServiceSIMBG
|
|||||||
|
|
||||||
$savedCount = $failedCount = 0;
|
$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";
|
$pageUrl = "/api/pbg/v1/list/?page={$currentPage}&size={$this->fetch_per_page}&sort=ASC";
|
||||||
$getToken = $this->getToken();
|
$getToken = $this->getToken();
|
||||||
|
Log::info("response index integration", ['currentPage' => $currentPage]);
|
||||||
if (empty($getToken->original['data']['token']['access'])) {
|
if (empty($getToken->original['data']['token']['access'])) {
|
||||||
$importDatasource->update([
|
$importDatasource->update([
|
||||||
'status' => ImportDatasourceStatus::Failed->value,
|
'status' => ImportDatasourceStatus::Failed->value,
|
||||||
@@ -227,6 +230,8 @@ class ServiceSIMBG
|
|||||||
|
|
||||||
$res = $clientHelper->get($url, $headers);
|
$res = $clientHelper->get($url, $headers);
|
||||||
|
|
||||||
|
Log::info("response task detail submit", ['res' => $res]);
|
||||||
|
|
||||||
if (empty($res->original['success']) || !$res->original['success']) {
|
if (empty($res->original['success']) || !$res->original['success']) {
|
||||||
// Log error
|
// Log error
|
||||||
Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]);
|
Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]);
|
||||||
|
|||||||
131
app/Services/GoogleSheetService.php
Normal file
131
app/Services/GoogleSheetService.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,15 +7,14 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^8.2",
|
"php": "^8.2",
|
||||||
|
"google/apiclient": "^2.12",
|
||||||
"guzzlehttp/guzzle": "^7.9",
|
"guzzlehttp/guzzle": "^7.9",
|
||||||
"laravel/framework": "^11.31",
|
"laravel/framework": "^11.31",
|
||||||
"laravel/sanctum": "^4.0",
|
"laravel/sanctum": "^4.0",
|
||||||
"laravel/tinker": "^2.9",
|
"laravel/tinker": "^2.9"
|
||||||
"maatwebsite/excel": "^3.1"
|
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"fakerphp/faker": "^1.23",
|
"fakerphp/faker": "^1.23",
|
||||||
"ibex/crud-generator": "^2.1",
|
|
||||||
"laravel/pail": "^1.1",
|
"laravel/pail": "^1.1",
|
||||||
"laravel/pint": "^1.13",
|
"laravel/pint": "^1.13",
|
||||||
"laravel/sail": "^1.26",
|
"laravel/sail": "^1.26",
|
||||||
@@ -71,5 +70,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"minimum-stability": "stable",
|
"minimum-stability": "stable",
|
||||||
"prefer-stable": true
|
"prefer-stable": true,
|
||||||
|
"repositories": {
|
||||||
|
"grocery-crud": {
|
||||||
|
"type": "composer",
|
||||||
|
"url": "https://composer.grocerycrud.com/"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1748
composer.lock
generated
1748
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -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',
|
|
||||||
],
|
|
||||||
];
|
|
||||||
380
config/excel.php
380
config/excel.php
@@ -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,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
52
config/laravel-code-generator.php
Normal file
52
config/laravel-code-generator.php
Normal 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',
|
||||||
|
|
||||||
|
];
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<?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('data_settings', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->string('key')->unique();
|
||||||
|
$table->string('value');
|
||||||
|
$table->string('type')->nullable()->default('integer');
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('data_settings');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -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');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -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');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -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');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?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('pbg_task', function (Blueprint $table) {
|
||||||
|
$table->string('uuid')->nullable()->unique()->change();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('pbg_task', function (Blueprint $table) {
|
||||||
|
$table->string('uuid')->nullable()->change();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?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('pbg_task_index_integrations', function (Blueprint $table) {
|
||||||
|
$table->string('pbg_task_uid')->unique()->change();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('pbg_task_index_integrations', function (Blueprint $table) {
|
||||||
|
$table->string('pbg_task_uid')->unique()->change();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?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('pbg_task_retributions', function (Blueprint $table) {
|
||||||
|
$table->string('detail_id')->unique()->change();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('pbg_task_retributions', function (Blueprint $table) {
|
||||||
|
$table->string('detail_id')->unique()->change();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -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');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -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();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
35
database/seeders/DataSettingSeeder.php
Normal file
35
database/seeders/DataSettingSeeder.php
Normal 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
@@ -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'],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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'],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
16
package-lock.json
generated
16
package-lock.json
generated
@@ -1,11 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "Darkone-Laravel",
|
"name": "sibedas-pbg-web",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"apexcharts": "^3.44.2",
|
"apexcharts": "^3.44.2",
|
||||||
|
"big.js": "^6.2.2",
|
||||||
"bootstrap": "^5.3.3",
|
"bootstrap": "^5.3.3",
|
||||||
"countup.js": "^2.3.2",
|
"countup.js": "^2.3.2",
|
||||||
"dropzone": "^5.9.0",
|
"dropzone": "^5.9.0",
|
||||||
@@ -477,6 +478,19 @@
|
|||||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
||||||
"dev": true
|
"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": {
|
"node_modules/binary-extensions": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"apexcharts": "^3.44.2",
|
"apexcharts": "^3.44.2",
|
||||||
|
"big.js": "^6.2.2",
|
||||||
"bootstrap": "^5.3.3",
|
"bootstrap": "^5.3.3",
|
||||||
"countup.js": "^2.3.2",
|
"countup.js": "^2.3.2",
|
||||||
"dropzone": "^5.9.0",
|
"dropzone": "^5.9.0",
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ use Illuminate\Http\Request;
|
|||||||
|
|
||||||
define('LARAVEL_START', microtime(true));
|
define('LARAVEL_START', microtime(true));
|
||||||
|
|
||||||
|
ini_set('max_execution_time',14400);
|
||||||
|
|
||||||
// Determine if the application is in maintenance mode...
|
// Determine if the application is in maintenance mode...
|
||||||
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
|
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
|
||||||
require $maintenance;
|
require $maintenance;
|
||||||
|
|||||||
@@ -1,13 +1,83 @@
|
|||||||
import ApexCharts from "apexcharts";
|
import Big from "big.js";
|
||||||
|
|
||||||
import GlobalConfig, { addThousandSeparators } from "../global-config.js";
|
import GlobalConfig, { addThousandSeparators } from "../global-config.js";
|
||||||
|
|
||||||
class BigData {
|
class BigData {
|
||||||
async init() {
|
async init() {
|
||||||
try{
|
try {
|
||||||
this.resultDataTotal = await this.getTotalAllTask();
|
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");
|
console.error("Failed to load chart data");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -15,424 +85,469 @@ class BigData {
|
|||||||
this.initChartTargetPAD();
|
this.initChartTargetPAD();
|
||||||
this.initChartUsaha();
|
this.initChartUsaha();
|
||||||
this.initChartNonUsaha();
|
this.initChartNonUsaha();
|
||||||
this.initChartStatus1();
|
this.initChartTotalPotensi();
|
||||||
this.initChartStatus2();
|
this.initChartVerificationDocuments();
|
||||||
this.initChartStatus3();
|
this.initChartNonVerificationDocuments();
|
||||||
this.initChartStatus4();
|
this.initChartKekuranganPotensi();
|
||||||
this.initChartStatus5();
|
this.initChartRealisasiTerbitPBG();
|
||||||
this.initChartStatus6();
|
this.initChartMenungguKlikDPMPTSP();
|
||||||
this.initChartStatus7();
|
this.initChartProsesDinasTeknis();
|
||||||
this.initChartStatus20();
|
this.initChartPotensiTataRuang();
|
||||||
this.initChartStatus24();
|
} catch (e) {
|
||||||
}catch(e){
|
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async getTotalAllTask() {
|
async getDataTotalPotensi() {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`${GlobalConfig.apiHost}/api/all-task-documents`, {
|
const response = await fetch(
|
||||||
credentials: "include",
|
`${GlobalConfig.apiHost}/api/all-task-documents`,
|
||||||
headers: {
|
{
|
||||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
credentials: "include",
|
||||||
"Content-Type": "application/json",
|
headers: {
|
||||||
},
|
Authorization: `Bearer ${
|
||||||
});
|
document.querySelector("meta[name='api-token']")
|
||||||
|
.content
|
||||||
|
}`,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
console.error("Network response was not ok", response);
|
console.error("Network response was not ok", response);
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
return {
|
return {
|
||||||
seriesData: data.data.series,
|
seriesData: data.data.series,
|
||||||
countData: data.data.count,
|
countData: data.data.count,
|
||||||
totalData: data.data.total
|
totalData: data.data.total,
|
||||||
};
|
};
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error fetching chart data:", 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() {
|
initChartTargetPAD() {
|
||||||
const total = this.resultDataTotal.totalData;
|
let totalPad = 0;
|
||||||
const count = this.resultDataTotal.countData;
|
fetch(
|
||||||
document.querySelectorAll('.document-count.chart-all-task').forEach((element) => {
|
`${GlobalConfig.apiHost}/api/api-data-settings?search=target_pad`,
|
||||||
element.innerText = `${count}`;
|
{
|
||||||
});
|
credentials: "include",
|
||||||
document.querySelectorAll('.document-total.chart-all-task').forEach((element) => {
|
headers: {
|
||||||
element.innerText = `Rp.${addThousandSeparators(total)}`;
|
Authorization: `Bearer ${
|
||||||
});
|
document.querySelector("meta[name='api-token']").content
|
||||||
document.querySelectorAll('.small-percentage.chart-all-task').forEach((element) => {
|
}`,
|
||||||
element.innerText = `${100}%`;
|
"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() {
|
initChartUsaha() {
|
||||||
fetch(`${GlobalConfig.apiHost}/api/business-documents`,{
|
document
|
||||||
credentials: "include",
|
.querySelectorAll(".document-count.chart-business")
|
||||||
headers: {
|
.forEach((element) => {
|
||||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
element.innerText = `${this.dataBusiness.count}`;
|
||||||
"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-total.chart-business').forEach((element) => {
|
document
|
||||||
element.innerText = `Rp.${addThousandSeparators(totalUsaha)}`;
|
.querySelectorAll(".document-total.chart-business")
|
||||||
|
.forEach((element) => {
|
||||||
|
element.innerText = `Rp.${addThousandSeparators(
|
||||||
|
this.bigTotalBusiness.toString()
|
||||||
|
)}`;
|
||||||
});
|
});
|
||||||
document.querySelectorAll('.small-percentage.chart-business').forEach((element) => {
|
document
|
||||||
element.innerText = `${resultPercentage.toFixed(2)}%`;
|
.querySelectorAll(".small-percentage.chart-business")
|
||||||
|
.forEach((element) => {
|
||||||
|
element.innerText = `${this.percentageResultBusiness}%`;
|
||||||
});
|
});
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
console.error("error fetching chart dara : ", error);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
initChartNonUsaha() {
|
initChartNonUsaha() {
|
||||||
fetch(`${GlobalConfig.apiHost}/api/non-business-documents`, {
|
document
|
||||||
credentials: "include",
|
.querySelectorAll(".document-count.chart-non-business")
|
||||||
headers: {
|
.forEach((element) => {
|
||||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
element.innerText = `${this.dataNonBusiness.count}`;
|
||||||
"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-total.chart-non-business').forEach((element) => {
|
document
|
||||||
element.innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
.querySelectorAll(".document-total.chart-non-business")
|
||||||
|
.forEach((element) => {
|
||||||
|
element.innerText = `Rp.${addThousandSeparators(
|
||||||
|
this.bigTotalNonBusiness.toString()
|
||||||
|
)}`;
|
||||||
});
|
});
|
||||||
document.querySelectorAll('.small-percentage.chart-non-business').forEach((element) => {
|
document
|
||||||
element.innerText = `${resultPercentage.toFixed(2)}%`;
|
.querySelectorAll(".small-percentage.chart-non-business")
|
||||||
|
.forEach((element) => {
|
||||||
|
element.innerText = `${this.percentageResultNonBusiness}%`;
|
||||||
});
|
});
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
console.error("error fetching chart dara : ", error);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
initChartStatus1(){
|
initChartKekuranganPotensi() {
|
||||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=1`, {
|
document
|
||||||
credentials: "include",
|
.querySelectorAll(".document-count.chart-kekurangan-potensi")
|
||||||
headers: {
|
.forEach((element) => {
|
||||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
element.innerText = ``;
|
||||||
"Content-Type": "application/json",
|
});
|
||||||
}
|
document
|
||||||
})
|
.querySelectorAll(".document-total.chart-kekurangan-potensi")
|
||||||
.then((response) => {
|
.forEach((element) => {
|
||||||
if (!response.ok) {
|
element.innerText = `Rp.${addThousandSeparators(
|
||||||
throw new Error("Network response was not ok");
|
this.totalKekuranganPotensi.toString()
|
||||||
}
|
)}`;
|
||||||
return response.json();
|
});
|
||||||
})
|
document
|
||||||
.then((data) => {
|
.querySelectorAll(".small-percentage.chart-kekurangan-potensi")
|
||||||
const seriesData = data.data.series;
|
.forEach((element) => {
|
||||||
// document.getElementById(
|
element.innerText = `${this.percentageKekuranganPotensi}%`;
|
||||||
// "countStatus1"
|
});
|
||||||
// ).innerText = `${data.data.count} Berkas`;
|
|
||||||
// document.getElementById(
|
|
||||||
// "totalStatus1"
|
|
||||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
console.error("error fetching chart dara : ", error);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
initChartStatus2(){
|
initChartRealisasiTerbitPBG() {
|
||||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=2`, {
|
document
|
||||||
credentials: "include",
|
.querySelectorAll(".document-count.chart-realisasi-tebit-pbg")
|
||||||
headers: {
|
.forEach((element) => {
|
||||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
element.innerText = `0`;
|
||||||
"Content-Type": "application/json",
|
});
|
||||||
}
|
document
|
||||||
})
|
.querySelectorAll(".document-total.chart-realisasi-tebit-pbg")
|
||||||
.then((response) => {
|
.forEach((element) => {
|
||||||
if (!response.ok) {
|
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
|
||||||
throw new Error("Network response was not ok");
|
});
|
||||||
}
|
document
|
||||||
return response.json();
|
.querySelectorAll(".small-percentage.chart-realisasi-tebit-pbg")
|
||||||
})
|
.forEach((element) => {
|
||||||
.then((data) => {
|
element.innerText = `0.00%`;
|
||||||
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);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
initChartStatus3(){
|
initChartMenungguKlikDPMPTSP() {
|
||||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=3`, {
|
document
|
||||||
credentials: "include",
|
.querySelectorAll(".document-count.chart-menunggu-klik-dpmptsp")
|
||||||
headers: {
|
.forEach((element) => {
|
||||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
element.innerText = `${0}`;
|
||||||
"Content-Type": "application/json",
|
});
|
||||||
}
|
document
|
||||||
})
|
.querySelectorAll(".document-total.chart-menunggu-klik-dpmptsp")
|
||||||
.then((response) => {
|
.forEach((element) => {
|
||||||
if (!response.ok) {
|
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
|
||||||
throw new Error("Network response was not ok");
|
});
|
||||||
}
|
document
|
||||||
return response.json();
|
.querySelectorAll(".small-percentage.chart-menunggu-klik-dpmptsp")
|
||||||
})
|
.forEach((element) => {
|
||||||
.then((data) => {
|
element.innerText = `0.00%`;
|
||||||
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);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
initChartStatus4(){
|
initChartProsesDinasTeknis() {
|
||||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=4`, {
|
document
|
||||||
credentials: "include",
|
.querySelectorAll(".document-count.chart-proses-dinas-teknis")
|
||||||
headers: {
|
.forEach((element) => {
|
||||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
element.innerText = `${0}`;
|
||||||
"Content-Type": "application/json",
|
});
|
||||||
}
|
document
|
||||||
})
|
.querySelectorAll(".document-total.chart-proses-dinas-teknis")
|
||||||
.then((response) => {
|
.forEach((element) => {
|
||||||
if (!response.ok) {
|
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
|
||||||
throw new Error("Network response was not ok");
|
});
|
||||||
}
|
document
|
||||||
return response.json();
|
.querySelectorAll(".small-percentage.chart-proses-dinas-teknis")
|
||||||
})
|
.forEach((element) => {
|
||||||
.then((data) => {
|
element.innerText = `0.00%`;
|
||||||
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);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
initChartStatus5(){
|
initChartPotensiTataRuang() {
|
||||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=5`, {
|
document
|
||||||
credentials: "include",
|
.querySelectorAll(".document-count.chart-potensi-tata-ruang")
|
||||||
headers: {
|
.forEach((element) => {
|
||||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
element.innerText = `${0}`;
|
||||||
"Content-Type": "application/json",
|
});
|
||||||
}
|
document
|
||||||
})
|
.querySelectorAll(".document-total.chart-potensi-tata-ruang")
|
||||||
.then((response) => {
|
.forEach((element) => {
|
||||||
if (!response.ok) {
|
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
|
||||||
throw new Error("Network response was not ok");
|
});
|
||||||
}
|
document
|
||||||
return response.json();
|
.querySelectorAll(".small-percentage.chart-potensi-tata-ruang")
|
||||||
})
|
.forEach((element) => {
|
||||||
.then((data) => {
|
element.innerText = `0.00%`;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", async function (e) {
|
document.addEventListener("DOMContentLoaded", async function (e) {
|
||||||
await new BigData().init();
|
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();
|
||||||
});
|
});
|
||||||
|
|||||||
107
resources/js/data-settings/index.js
Normal file
107
resources/js/data-settings/index.js
Normal 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();
|
||||||
|
});
|
||||||
@@ -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();
|
|
||||||
});
|
|
||||||
@@ -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();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
import { Dropzone } from "dropzone";
|
|
||||||
|
|
||||||
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: "http://localhost:8000/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);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 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();
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,12 +1,28 @@
|
|||||||
const GlobalConfig = {
|
const GlobalConfig = {
|
||||||
apiHost: 'http://localhost:8000'
|
apiHost: "http://localhost:8000",
|
||||||
};
|
};
|
||||||
|
|
||||||
export default GlobalConfig;
|
export default GlobalConfig;
|
||||||
|
|
||||||
export function addThousandSeparators(number, fractionDigits = 2) {
|
export function addThousandSeparators(value, fractionDigits = 2) {
|
||||||
return new Intl.NumberFormat('en-US', {
|
if (!value) return null; // Handle empty or null values
|
||||||
minimumFractionDigits: fractionDigits,
|
|
||||||
maximumFractionDigits: fractionDigits,
|
// Remove any non-numeric characters except commas and dots
|
||||||
}).format(number);
|
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);
|
||||||
|
}
|
||||||
|
|||||||
132
resources/js/pbg-task/create.js
Normal file
132
resources/js/pbg-task/create.js
Normal 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();
|
||||||
|
});
|
||||||
69
resources/js/pbg-task/index.js
Normal file
69
resources/js/pbg-task/index.js
Normal 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();
|
||||||
|
});
|
||||||
@@ -7,6 +7,7 @@ class SyncronizeTask {
|
|||||||
init() {
|
init() {
|
||||||
this.initTableImportDatasources();
|
this.initTableImportDatasources();
|
||||||
this.handleSubmitSync();
|
this.handleSubmitSync();
|
||||||
|
this.handleSubmitSnycGoogleSheet();
|
||||||
}
|
}
|
||||||
initTableImportDatasources() {
|
initTableImportDatasources() {
|
||||||
new Grid({
|
new Grid({
|
||||||
@@ -48,68 +49,112 @@ class SyncronizeTask {
|
|||||||
}
|
}
|
||||||
handleSubmitSync() {
|
handleSubmitSync() {
|
||||||
const button = document.getElementById("btn-sync-submit");
|
const button = document.getElementById("btn-sync-submit");
|
||||||
|
|
||||||
// Check if the button should be enabled or disabled based on the status
|
// Check if the button should be enabled or disabled based on the status
|
||||||
fetch(`${GlobalConfig.apiHost}/api/import-datasource/check-datasource`, {
|
fetch(
|
||||||
method: "GET",
|
`${GlobalConfig.apiHost}/api/import-datasource/check-datasource`,
|
||||||
headers: {
|
{
|
||||||
Authorization: `Bearer ${document
|
method: "GET",
|
||||||
.querySelector('meta[name="api-token"]')
|
headers: {
|
||||||
.getAttribute("content")}`,
|
Authorization: `Bearer ${document
|
||||||
"Content-Type": "application/json",
|
.querySelector('meta[name="api-token"]')
|
||||||
|
.getAttribute("content")}`,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
})
|
)
|
||||||
.then(response => {
|
.then((response) => {
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error("Network response was not ok");
|
throw new Error("Network response was not ok");
|
||||||
}
|
}
|
||||||
return response.json();
|
return response.json();
|
||||||
})
|
})
|
||||||
.then(data => {
|
.then((data) => {
|
||||||
console.log("data check button sync", data.can_execute);
|
console.log("data check button sync", data.can_execute);
|
||||||
button.disabled = !data.can_execute;
|
button.disabled = !data.can_execute;
|
||||||
|
|
||||||
// If the button is enabled, add click event to trigger sync
|
// If the button is enabled, add click event to trigger sync
|
||||||
if (!button.disabled) {
|
if (!button.disabled) {
|
||||||
button.addEventListener("click", function(e) {
|
button.addEventListener("click", function (e) {
|
||||||
button.disabled = true; // Disable button to prevent multiple clicks
|
button.disabled = true; // Disable button to prevent multiple clicks
|
||||||
button.textContent = "Syncing..."; // Change button text to show syncing
|
button.textContent = "Syncing..."; // Change button text to show syncing
|
||||||
|
|
||||||
// Trigger the scraping API call
|
// Trigger the scraping API call
|
||||||
fetch(`${GlobalConfig.apiHost}/api/scraping`, {
|
fetch(`${GlobalConfig.apiHost}/api/scraping`, {
|
||||||
method: "GET",
|
method: "GET",
|
||||||
headers: {
|
headers: {
|
||||||
Authorization: `Bearer ${document
|
Authorization: `Bearer ${document
|
||||||
.querySelector('meta[name="api-token"]')
|
.querySelector('meta[name="api-token"]')
|
||||||
.getAttribute("content")}`,
|
.getAttribute("content")}`,
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
.then(response => {
|
.then((response) => {
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error("Network response was not ok");
|
throw new Error(
|
||||||
}
|
"Network response was not ok"
|
||||||
return response.json();
|
);
|
||||||
})
|
}
|
||||||
.then(data => {
|
return response.json();
|
||||||
console.log("data sync button", data);
|
})
|
||||||
alert("Synchronization executed successfully");
|
.then((data) => {
|
||||||
window.location.reload();
|
console.log("data sync button", data);
|
||||||
})
|
alert("Synchronization executed successfully");
|
||||||
.catch(err => {
|
window.location.reload();
|
||||||
console.error("Fetch error:", err);
|
})
|
||||||
alert("An error occurred during synchronization");
|
.catch((err) => {
|
||||||
})
|
console.error("Fetch error:", err);
|
||||||
.finally(() => {
|
alert(
|
||||||
button.disabled = false; // Re-enable the button after the request is complete
|
"An error occurred during synchronization"
|
||||||
button.textContent = "Sync Data"; // Reset button text
|
);
|
||||||
|
})
|
||||||
|
.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");
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,132 +0,0 @@
|
|||||||
import { Grid } from "gridjs/dist/gridjs.umd.js";
|
|
||||||
import "gridjs/dist/gridjs.umd.js";
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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",
|
|
||||||
},
|
|
||||||
// headers: {
|
|
||||||
// 'Authorization': `Bearer ${document.querySelector('meta[name="api-token"]').getAttribute("content")}`,
|
|
||||||
// 'Content-Type': 'application/json',
|
|
||||||
// },
|
|
||||||
});
|
|
||||||
if (response.status === 204) { // Jika status code 204, berarti berhasil
|
|
||||||
alert('Data deleted successfully!');
|
|
||||||
location.reload();
|
|
||||||
} else {
|
|
||||||
const data = await response.json(); // Jika ada data di response body
|
|
||||||
alert('Failed to delete data: ' + (data.message || 'Unknown error.'));
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error deleting data:', error);
|
|
||||||
alert('Error deleting data.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default GeneralTable;
|
|
||||||
@@ -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 %]
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_deleted %]);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
return $this->successResponse(
|
||||||
|
[% model_was_deleted %],
|
||||||
|
$this->transform($[% model_name_singular_variable %])
|
||||||
|
);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_collection_class %]($[% model_name_plural_variable %], [% models_were_retrieved %]);
|
||||||
@@ -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(),
|
||||||
|
],
|
||||||
|
]
|
||||||
|
);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_retrieved %]);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
return $this->successResponse(
|
||||||
|
[% model_was_retrieved %],
|
||||||
|
$this->transform($[% model_name_singular_variable %])
|
||||||
|
);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_added %]);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
return $this->successResponse(
|
||||||
|
[% model_was_added %],
|
||||||
|
$this->transform($[% model_name_singular_variable %])
|
||||||
|
);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_updated %]);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
return $this->successResponse(
|
||||||
|
[% model_was_updated %],
|
||||||
|
$this->transform($[% model_name_singular_variable %])
|
||||||
|
);
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Get an error response
|
||||||
|
*
|
||||||
|
* @param mix $message
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
protected function errorResponse($message)
|
||||||
|
{
|
||||||
|
return response()->json([
|
||||||
|
'errors' => (array) $message,
|
||||||
|
'success' => false,
|
||||||
|
], 422);
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a new validator instance with the defined rules.
|
||||||
|
*
|
||||||
|
* @param [% request_fullname %] $request
|
||||||
|
*
|
||||||
|
* @return Illuminate\Support\Facades\Validator
|
||||||
|
*/
|
||||||
|
protected function getValidator(Request $request)
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
[% validation_rules %]
|
||||||
|
];
|
||||||
|
[% file_validation_snippet %]
|
||||||
|
return Validator::make($request->all(), $rules);
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Get a success response
|
||||||
|
*
|
||||||
|
* @param mix $message
|
||||||
|
* @param mix $data
|
||||||
|
* @param array $meta
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
protected function successResponse($message, $data, array $meta = [])
|
||||||
|
{
|
||||||
|
return response()->json(
|
||||||
|
array_merge([
|
||||||
|
'data' => $data,
|
||||||
|
'message' => $message,
|
||||||
|
'success' => true,
|
||||||
|
], $meta), 200);
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Transform the giving [% model_name %] to public friendly array
|
||||||
|
*
|
||||||
|
* @param [% use_full_model_name %] $[% model_name_singular_variable %]
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function [% transform_method_name %]([% model_name_class %] $[% model_name_singular_variable %])
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[% model_api_array %]
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
$validator = $this->getValidator($request);
|
||||||
|
|
||||||
|
if ($validator->fails()) {
|
||||||
|
return $this->errorResponse($validator->errors()->all());
|
||||||
|
}
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
[% use_command_placeholder %]
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class [% controller_name %] [% controller_extends %]
|
||||||
|
{
|
||||||
|
[% constructor %]
|
||||||
|
/**
|
||||||
|
* Display a listing of the assets.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$[% model_name_plural_variable %] = [% model_name_class %]::[% with_relations_for_index %]paginate([% models_per_page %]);
|
||||||
|
|
||||||
|
[% index_return_success %]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a new [% model_name %] in the storage.
|
||||||
|
*
|
||||||
|
* @param [% request_fullname %] [% request_variable %]
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function store([% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
[% validator_request %]
|
||||||
|
$[% data_variable %] = [% call_get_data %];
|
||||||
|
[% on_store_setter %]
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::create($[% data_variable %]);
|
||||||
|
|
||||||
|
[% store_return_success %]
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
return $this->errorResponse([% unexpected_error %]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified [% model_name %].
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function show($id)
|
||||||
|
{
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::[% with_relations_for_show %]findOrFail($id);
|
||||||
|
|
||||||
|
[% show_return_success %]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified [% model_name %] in the storage.
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
* @param [% request_fullname %] [% request_variable %]
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function update($id, [% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
[% validator_request %]
|
||||||
|
$[% data_variable %] = [% call_get_data %];
|
||||||
|
[% on_update_setter %]
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id);
|
||||||
|
$[% model_name_singular_variable %]->update($[% data_variable %]);
|
||||||
|
|
||||||
|
[% update_return_success %]
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
return $this->errorResponse([% unexpected_error %]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified [% model_name %] from the storage.
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function destroy($id)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id);
|
||||||
|
$[% model_name_singular_variable %]->delete();
|
||||||
|
|
||||||
|
[% destroy_return_success %]
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
return $this->errorResponse([% unexpected_error %]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[% get_validator_method %]
|
||||||
|
[% get_data_method %]
|
||||||
|
[% upload_method %]
|
||||||
|
[% transform_method %]
|
||||||
|
[% response_methods %]
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
[% use_command_placeholder %]
|
||||||
|
|
||||||
|
class [% controller_name %] [% controller_extends %]
|
||||||
|
{
|
||||||
|
[% constructor %]
|
||||||
|
/**
|
||||||
|
* Display the documentation which corresponds to the giving version.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function index($version)
|
||||||
|
{
|
||||||
|
$viewName = sprintf('[% view_access_fullname %]index', $this->getVersion($version));
|
||||||
|
|
||||||
|
return view($viewName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
[% use_command_placeholder %]
|
||||||
|
|
||||||
|
class [% controller_name %] [% controller_extends %]
|
||||||
|
{
|
||||||
|
[% constructor %]
|
||||||
|
/**
|
||||||
|
* Display the documentation's view.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('[% view_access_fullname %]index');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<span class="label label-danger" title="[% this_parameter_must_be_present_in_the_request %]">[% required_title %]</span>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<tr>
|
||||||
|
<td>Authorization</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>
|
||||||
|
<span class="label label-primary" title="[% this_parameter_is_an_http_header %]">[% header_title %]</span>
|
||||||
|
</td>
|
||||||
|
<td>[% access_token_with_bearer %]</td>
|
||||||
|
@if(isset($showValidation) && $showValidation)
|
||||||
|
<td></td>
|
||||||
|
@endif
|
||||||
|
</tr>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<h4 class="text-danger"><strong>401 - Unauthorized</strong></h4>
|
||||||
|
<p class="text-muted">[% the_user_does_not_have_permission_to_access_the_requested_resource %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>error</td>
|
||||||
|
<td>[% array_of_strings %]</td>
|
||||||
|
<td>[% the_error_message %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<h4 class="text-danger"><strong>202 - Accepted</strong></h4>
|
||||||
|
<p class="text-muted">[% the_requested_model_does_not_exists %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>error</td>
|
||||||
|
<td>[% array_of_strings %]</td>
|
||||||
|
<td>[% the_error_message %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<h4 class="text-danger"><strong>422 - Unprocessable Entity</strong></h4>
|
||||||
|
<p class="text-muted">[% the_request_failed_validation %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>errors</td>
|
||||||
|
<td>[% array_of_strings %]</td>
|
||||||
|
<td>[% list_of_the_invalid_errors %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<tr>
|
||||||
|
<td>[% field_name %]</td>
|
||||||
|
<td>[% field_type_title %]</td>
|
||||||
|
<td>[% api_field_description %]</td>
|
||||||
|
</tr>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<tr>
|
||||||
|
<td>[% field_name %]</td>
|
||||||
|
<td>[% field_type_title %]</td>
|
||||||
|
<td><span class="label label-default" title="[% this_parameter_is_part_of_the_body %]">[% body_title %]</span></td>
|
||||||
|
<td>[% api_field_description %]</td>
|
||||||
|
@if($showValidation)
|
||||||
|
<td>
|
||||||
|
[% validation_rule_required %]
|
||||||
|
<span>[% validation_rules %]</span>
|
||||||
|
</td>
|
||||||
|
@endif
|
||||||
|
</tr>
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
$showValidation = (isset($withValidation) && $withValidation) ? true : false;
|
||||||
|
?>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>[% parameter_name_title %]</th>
|
||||||
|
<th>[% data_type_title %]</th>
|
||||||
|
<th>[% parameter_type_title %]</th>
|
||||||
|
<th>[% description_title %]</th>
|
||||||
|
@if($showValidation)
|
||||||
|
<th>[% validation_title %]</th>
|
||||||
|
@endif
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% include_parameter_for_authorized_request %]
|
||||||
|
@if(isset($withPathId) && $withPathId)
|
||||||
|
<tr>
|
||||||
|
<td>[% model_name %]</td>
|
||||||
|
<td>[% primary_key_type_title %]</td>
|
||||||
|
<td><span class="label label-info" title="[% this_parameter_is_part_of_the_path %]">[% path_title %]</span></td>
|
||||||
|
<td>[% the_id_of_the_model %]</td>
|
||||||
|
@if($showValidation)
|
||||||
|
<td>
|
||||||
|
[% validation_rule_required %]
|
||||||
|
</td>
|
||||||
|
@endif
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
@endif
|
||||||
|
|
||||||
|
[% fields_list_for_body %]
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>[% parameter_name_title %]</th>
|
||||||
|
<th>[% data_type_title %]</th>
|
||||||
|
<th>[% parameter_type_title %]</th>
|
||||||
|
<th>[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% include_parameter_for_authorized_request %]
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<tr>
|
||||||
|
<td>[% field_name %]</td>
|
||||||
|
<td>[% field_type_title %]</td>
|
||||||
|
<td>[% api_field_description %]</td>
|
||||||
|
</tr>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>[% name_title %]</th>
|
||||||
|
<th>[% type_title %]</th>
|
||||||
|
<th>[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% fields_list_for_body %]
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<h4 class="text-success"><strong>200 - Ok</strong></h4>
|
||||||
|
<p class="text-muted">[% request_was_successful %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>message</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% the_success_message %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>data</td>
|
||||||
|
<td>[% array_title %]</td>
|
||||||
|
<td>[% the_key_is_the_model_property_and_the_value_is_the_model_value %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,386 @@
|
|||||||
|
@extends('[% layout_name %]')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<h2>[% model_plural %]</h2>
|
||||||
|
[% general_description %]
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>[% available_resources %]</h2>
|
||||||
|
<div class="card mb-3" id="index-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-primary d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">GET</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% index_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% index_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#index" aria-controls="index" class="btn btn-primary btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="index">
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
[% authorized_request_for_index %]
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
|
||||||
|
<p>[% index_route_response_description %]</p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
<h4><strong class="text-success">200 - Ok</strong></h4>
|
||||||
|
<p class="text-muted">[% request_was_successful %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>Was the request successful or not.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>message</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% the_success_message %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>data</td>
|
||||||
|
<td>[% array_title %]</td>
|
||||||
|
<td>
|
||||||
|
[% the_key_is_the_model_property_and_the_value_is_the_model_value %]
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>links</td>
|
||||||
|
<td>[% array_title %]</td>
|
||||||
|
<td>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-2">[% key_title %]</th>
|
||||||
|
<th class="col-md-2">[% data_type_title %]</th>
|
||||||
|
<th class="col-md-8">[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>first</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% link_to_retrieve_first_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>last</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% link_to_retrieve_last_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>prev</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% link_to_retrieve_previous_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>next</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% link_to_retrieve_next_page %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>meta</td>
|
||||||
|
<td>[% array_title %]</td>
|
||||||
|
<td>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-2">[% key_title %]</th>
|
||||||
|
<th class="col-md-2">[% data_type_title %]</th>
|
||||||
|
<th class="col-md-8">[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>current_page</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_number_of_current_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>from</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_index_of_the_first_retrieved_item %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>last_page</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_number_of_the_last_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>Path</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% the_base_link_to_the_resource %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>per_page</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_number_of_models_per_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>to</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_index_of_the_last_retrieved_item %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>total</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_total_of_available_pages %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card mb-3" id="store-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-success d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span>POST</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% store_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% store_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#store" aria-controls="store" class="btn btn-success btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="store">
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]fields-list', [
|
||||||
|
'withValidation' => true
|
||||||
|
])
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
<p>[% store_route_response_description %]</p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]retrieved')
|
||||||
|
@include('[% path_to_view_home %]failed-to-retrieve')
|
||||||
|
@include('[% path_to_view_home %]failed-validation')
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card mb-3" id="update-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-warning d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">POST</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% update_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% update_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#update" aria-controls="update" class="btn btn-warning btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-collapse collapse" id="update">
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]fields-list', [
|
||||||
|
'withValidation' => true,
|
||||||
|
'withPathId' => true,
|
||||||
|
])
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
<p>[% update_route_response_description %]</p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]retrieved')
|
||||||
|
@include('[% path_to_view_home %]failed-to-retrieve')
|
||||||
|
@include('[% path_to_view_home %]failed-validation')
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card mb-3" id="show-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-info d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">GET</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% show_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% show_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#show" aria-controls="show" class="btn btn-info btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="show">
|
||||||
|
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-2">[% parameter_name_title %]</th>
|
||||||
|
<th class="col-md-2">[% data_type_title %]</th>
|
||||||
|
<th class="col-md-2">[% parameter_type_title %]</th>
|
||||||
|
<th class="col-md-6">[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% include_parameter_for_authorized_request %]
|
||||||
|
<tr>
|
||||||
|
<td>[% model_name %]</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td><span class="label label-info" title="[% this_parameter_is_part_of_the_path %]">[% path_title %]</span></td>
|
||||||
|
<td>[% the_id_of_model_to_retrieve %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
<p>[% show_route_response_description %] </p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]retrieved')
|
||||||
|
@include('[% path_to_view_home %]failed-to-retrieve')
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card card-danger mb-3" id="destroy-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-danger d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">DELETE</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% destroy_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% destroy_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#destroy" aria-controls="destroy" class="btn btn-danger btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="destroy">
|
||||||
|
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-2">[% parameter_name_title %]</th>
|
||||||
|
<th class="col-md-2">[% data_type_title %]</th>
|
||||||
|
<th class="col-md-2">[% parameter_type_title %]</th>
|
||||||
|
<th class="col-md-6">[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% include_parameter_for_authorized_request %]
|
||||||
|
<tr>
|
||||||
|
<td>[% model_name %]</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td><span class="label label-info" title="[% this_parameter_is_part_of_the_path %]">[% path_title %]</span></td>
|
||||||
|
<td>[% the_id_of_model_to_delete %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
<p>[% destroy_route_response_description %]</p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]retrieved')
|
||||||
|
@include('[% path_to_view_home %]failed-to-retrieve')
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>[% model_definition_title %]</h2>
|
||||||
|
<div class="card" id="[% model_name %]-model-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-secondary d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">[% model_name_title %]</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#model-definitions" aria-controls="model-definitions" class="btn btn-secondary btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="model-definitions">
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>[% field_name_title %]</th>
|
||||||
|
<th>[% field_type_title %]</th>
|
||||||
|
<th>[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% fields_list_for_body %]
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Route::get('[% prefix %][% version %]', [[% controller_name %]::class, 'index'])
|
||||||
|
->name('[% index_route_name %]');
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Route::get('[% prefix %][% version %]', '[% controller_name %]@index')
|
||||||
|
->name('[% index_route_name %]');
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valid versions
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $versions = [
|
||||||
|
'[% api_version_number %]',
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a valid version from the available list.
|
||||||
|
*
|
||||||
|
* @param string $version
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function getVersion($version)
|
||||||
|
{
|
||||||
|
if (in_array($version, $this->versions)) {
|
||||||
|
return $version;
|
||||||
|
}
|
||||||
|
|
||||||
|
return end($this->versions);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
use Illuminate\Http\Resources\Json\ResourceCollection;
|
||||||
|
use [% use_full_model_name %];
|
||||||
|
|
||||||
|
class [% api_resource_collection_class %] extends ResourceCollection
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The response message
|
||||||
|
*
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
protected $message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new resource instance.
|
||||||
|
*
|
||||||
|
* @param mixed $resource
|
||||||
|
* @param mixed $message
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct($resource, $message = null)
|
||||||
|
{
|
||||||
|
parent::__construct($resource);
|
||||||
|
|
||||||
|
$this->message = $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform the resource collection into an array.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray($request)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'data' => $this->collection->transform(function ($[% model_name_singular_variable %]) {
|
||||||
|
return $this->transformModel($[% model_name_singular_variable %]);
|
||||||
|
}),
|
||||||
|
'message' => $this->message,
|
||||||
|
'success' => true,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
[% transform_method %]
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
use Illuminate\Http\Resources\Json\Resource;
|
||||||
|
|
||||||
|
class [% api_resource_class %] extends Resource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The response message
|
||||||
|
*
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
protected $message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new resource instance.
|
||||||
|
*
|
||||||
|
* @param mixed $resource
|
||||||
|
* @param mixed $message
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct($resource, $message = null)
|
||||||
|
{
|
||||||
|
parent::__construct($resource);
|
||||||
|
|
||||||
|
$this->message = $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray($request)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[% model_api_array %]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get any additional data that should be returned with the resource array.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function with($request)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'success' => true,
|
||||||
|
'message' => $this->message,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Route::get('/', [[% controller_name %]::class, 'index'])
|
||||||
|
->name('[% index_route_name %]');
|
||||||
|
Route::get('/show/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'show'])
|
||||||
|
->name('[% show_route_name %]')[% route_id_clause %];
|
||||||
|
Route::post('/', [[% controller_name %]::class, 'store'])
|
||||||
|
->name('[% store_route_name %]');
|
||||||
|
Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', [[% controller_name %]::class, 'update'])
|
||||||
|
->name('[% update_route_name %]')[% route_id_clause %];
|
||||||
|
Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'destroy'])
|
||||||
|
->name('[% destroy_route_name %]')[% route_id_clause %];
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Route::get('/', '[% controller_name %]@index')
|
||||||
|
->name('[% index_route_name %]');
|
||||||
|
Route::get('/show/{[% model_name_singular_variable %]}','[% controller_name %]@show')
|
||||||
|
->name('[% show_route_name %]')[% route_id_clause %];
|
||||||
|
Route::post('/', '[% controller_name %]@store')
|
||||||
|
->name('[% store_route_name %]');
|
||||||
|
Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', '[% controller_name %]@update')
|
||||||
|
->name('[% update_route_name %]')[% route_id_clause %];
|
||||||
|
Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}','[% controller_name %]@destroy')
|
||||||
|
->name('[% destroy_route_name %]')[% route_id_clause %];
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Validate the given request with the defined rules.
|
||||||
|
*
|
||||||
|
* @param [% request_fullname %] $request
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
protected function affirm(Request $request)
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
[% validation_rules %]
|
||||||
|
];
|
||||||
|
[% file_validation_snippet %]
|
||||||
|
|
||||||
|
return $this->validate($request, $rules);
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
/**
|
||||||
|
* Create a new controller instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
[% auth_middleware %]
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Get the request's data from the request.
|
||||||
|
*
|
||||||
|
* [% request_name_comment %]
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
[% visibility_level %] function getData([% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
[% validation_rules %]
|
||||||
|
];
|
||||||
|
|
||||||
|
[% file_validation_snippet %]
|
||||||
|
$data = [% request_variable %]->validate($rules);
|
||||||
|
|
||||||
|
[% file_snippet %]
|
||||||
|
[% boolean_snippet %]
|
||||||
|
[% string_to_null_snippet %]
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Get the request's data from the request.
|
||||||
|
*
|
||||||
|
* [% request_name_comment %]
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
[% visibility_level %] function getData([% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
$data = [% request_variable %]->only([% fillable %]);
|
||||||
|
[% file_snippet %]
|
||||||
|
[% boolean_snippet %]
|
||||||
|
[% string_to_null_snippet %]
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Moves the attached file to the server.
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\HttpFoundation\File\UploadedFile $file
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function moveFile($file)
|
||||||
|
{
|
||||||
|
if (!$file->isValid()) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$path = config('laravel-code-generator.files_upload_path', 'uploads');
|
||||||
|
$saved = $file->store('public/' . $path, config('filesystems.default'));
|
||||||
|
|
||||||
|
return substr($saved, 7);
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user