Compare commits

..

3 Commits

Author SHA1 Message Date
@jamaludinarifrohman6661
ecf9096149 feature: form upload reklame 2025-02-11 16:57:53 +07:00
@jamaludinarifrohman6661
9c41fad232 Feature: crud reklame 2025-02-07 18:11:33 +07:00
@jamaludinarifrohman6661
a7b6f13d8c feature: create seeder master data 2025-02-06 00:28:55 +07:00
30 changed files with 10570 additions and 6 deletions

View File

@@ -0,0 +1,199 @@
<?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);
}
}

View File

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

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class AdvertisementRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'no' => 'required',
'business_name' => 'required|string',
'npwpd' => 'required|string',
'advertisement_type' => 'required|string',
'advertisement_content' => 'required|string',
'business_address' => 'required|string',
'advertisement_location' => 'required|string',
'village_name' => 'required',
'district_name' => 'required',
'length' => 'required',
'width' => 'required',
'viewing_angle' => 'required|string',
'face' => 'required|string',
'area' => 'required|string',
'angle' => 'required|string',
'contact' => 'required|string',
];
}
}

View File

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

View File

@@ -0,0 +1,92 @@
<?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;
}
}
}

View File

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

View File

@@ -10,10 +10,12 @@
"guzzlehttp/guzzle": "^7.9",
"laravel/framework": "^11.31",
"laravel/sanctum": "^4.0",
"laravel/tinker": "^2.9"
"laravel/tinker": "^2.9",
"maatwebsite/excel": "^3.1"
},
"require-dev": {
"fakerphp/faker": "^1.23",
"ibex/crud-generator": "^2.1",
"laravel/pail": "^1.1",
"laravel/pint": "^1.13",
"laravel/sail": "^1.26",

667
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "7bb7c3b4b4eb50972252c4683f797104",
"content-hash": "37b87e09a4c98ce5b5c07fac061edb29",
"packages": [
{
"name": "brick/math",
@@ -135,6 +135,166 @@
],
"time": "2024-02-09T16:56:22+00:00"
},
{
"name": "composer/pcre",
"version": "3.3.2",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0"
},
"conflict": {
"phpstan/phpstan": "<1.11.10"
},
"require-dev": {
"phpstan/phpstan": "^1.12 || ^2",
"phpstan/phpstan-strict-rules": "^1 || ^2",
"phpunit/phpunit": "^8 || ^9"
},
"type": "library",
"extra": {
"phpstan": {
"includes": [
"extension.neon"
]
},
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Pcre\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be"
}
],
"description": "PCRE wrapping library that offers type-safe preg_* replacements.",
"keywords": [
"PCRE",
"preg",
"regex",
"regular expression"
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.3.2"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
"type": "tidelift"
}
],
"time": "2024-11-12T16:29:46+00:00"
},
{
"name": "composer/semver",
"version": "3.4.3",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"shasum": ""
},
"require": {
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.11",
"symfony/phpunit-bridge": "^3 || ^7"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Semver\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nils Adermann",
"email": "naderman@naderman.de",
"homepage": "http://www.naderman.de"
},
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be"
},
{
"name": "Rob Bast",
"email": "rob.bast@gmail.com",
"homepage": "http://robbast.nl"
}
],
"description": "Semver library that offers utilities, version constraint parsing and validation.",
"keywords": [
"semantic",
"semver",
"validation",
"versioning"
],
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.4.3"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
"type": "tidelift"
}
],
"time": "2024-09-19T14:15:21+00:00"
},
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
@@ -510,6 +670,67 @@
],
"time": "2023-10-06T06:47:41+00:00"
},
{
"name": "ezyang/htmlpurifier",
"version": "v4.18.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
"reference": "cb56001e54359df7ae76dc522d08845dc741621b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b",
"reference": "cb56001e54359df7ae76dc522d08845dc741621b",
"shasum": ""
},
"require": {
"php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
},
"require-dev": {
"cerdic/css-tidy": "^1.7 || ^2.0",
"simpletest/simpletest": "dev-master"
},
"suggest": {
"cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
"ext-bcmath": "Used for unit conversion and imagecrash protection",
"ext-iconv": "Converts text to and from non-UTF-8 encodings",
"ext-tidy": "Used for pretty-printing HTML"
},
"type": "library",
"autoload": {
"files": [
"library/HTMLPurifier.composer.php"
],
"psr-0": {
"HTMLPurifier": "library/"
},
"exclude-from-classmap": [
"/library/HTMLPurifier/Language/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1-or-later"
],
"authors": [
{
"name": "Edward Z. Yang",
"email": "admin@htmlpurifier.org",
"homepage": "http://ezyang.com"
}
],
"description": "Standards compliant HTML filter written in PHP",
"homepage": "http://htmlpurifier.org/",
"keywords": [
"html"
],
"support": {
"issues": "https://github.com/ezyang/htmlpurifier/issues",
"source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0"
},
"time": "2024-11-01T03:51:45+00:00"
},
{
"name": "fruitcake/php-cors",
"version": "v1.3.0",
@@ -1893,6 +2114,272 @@
],
"time": "2024-09-21T08:32:55+00:00"
},
{
"name": "maatwebsite/excel",
"version": "3.1.62",
"source": {
"type": "git",
"url": "https://github.com/SpartnerNL/Laravel-Excel.git",
"reference": "decfb9140161fcc117571e47e35ddf27983189ce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/decfb9140161fcc117571e47e35ddf27983189ce",
"reference": "decfb9140161fcc117571e47e35ddf27983189ce",
"shasum": ""
},
"require": {
"composer/semver": "^3.3",
"ext-json": "*",
"illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0",
"php": "^7.0||^8.0",
"phpoffice/phpspreadsheet": "^1.29.7",
"psr/simple-cache": "^1.0||^2.0||^3.0"
},
"require-dev": {
"laravel/scout": "^7.0||^8.0||^9.0||^10.0",
"orchestra/testbench": "^6.0||^7.0||^8.0||^9.0",
"predis/predis": "^1.1"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Excel": "Maatwebsite\\Excel\\Facades\\Excel"
},
"providers": [
"Maatwebsite\\Excel\\ExcelServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Maatwebsite\\Excel\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Patrick Brouwers",
"email": "patrick@spartner.nl"
}
],
"description": "Supercharged Excel exports and imports in Laravel",
"keywords": [
"PHPExcel",
"batch",
"csv",
"excel",
"export",
"import",
"laravel",
"php",
"phpspreadsheet"
],
"support": {
"issues": "https://github.com/SpartnerNL/Laravel-Excel/issues",
"source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.62"
},
"funding": [
{
"url": "https://laravel-excel.com/commercial-support",
"type": "custom"
},
{
"url": "https://github.com/patrickbrouwers",
"type": "github"
}
],
"time": "2025-01-04T12:14:36+00:00"
},
{
"name": "maennchen/zipstream-php",
"version": "3.1.2",
"source": {
"type": "git",
"url": "https://github.com/maennchen/ZipStream-PHP.git",
"reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f",
"reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"ext-zlib": "*",
"php-64bit": "^8.2"
},
"require-dev": {
"brianium/paratest": "^7.7",
"ext-zip": "*",
"friendsofphp/php-cs-fixer": "^3.16",
"guzzlehttp/guzzle": "^7.5",
"mikey179/vfsstream": "^1.6",
"php-coveralls/php-coveralls": "^2.5",
"phpunit/phpunit": "^11.0",
"vimeo/psalm": "^6.0"
},
"suggest": {
"guzzlehttp/psr7": "^2.4",
"psr/http-message": "^2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"ZipStream\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paul Duncan",
"email": "pabs@pablotron.org"
},
{
"name": "Jonatan Männchen",
"email": "jonatan@maennchen.ch"
},
{
"name": "Jesse Donat",
"email": "donatj@gmail.com"
},
{
"name": "András Kolesár",
"email": "kolesar@kolesar.hu"
}
],
"description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
"keywords": [
"stream",
"zip"
],
"support": {
"issues": "https://github.com/maennchen/ZipStream-PHP/issues",
"source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2"
},
"funding": [
{
"url": "https://github.com/maennchen",
"type": "github"
}
],
"time": "2025-01-27T12:07:53+00:00"
},
{
"name": "markbaker/complex",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/MarkBaker/PHPComplex.git",
"reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
"reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"phpcompatibility/php-compatibility": "^9.3",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"squizlabs/php_codesniffer": "^3.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Complex\\": "classes/src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Baker",
"email": "mark@lange.demon.co.uk"
}
],
"description": "PHP Class for working with complex numbers",
"homepage": "https://github.com/MarkBaker/PHPComplex",
"keywords": [
"complex",
"mathematics"
],
"support": {
"issues": "https://github.com/MarkBaker/PHPComplex/issues",
"source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
},
"time": "2022-12-06T16:21:08+00:00"
},
{
"name": "markbaker/matrix",
"version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/MarkBaker/PHPMatrix.git",
"reference": "728434227fe21be27ff6d86621a1b13107a2562c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c",
"reference": "728434227fe21be27ff6d86621a1b13107a2562c",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"phpcompatibility/php-compatibility": "^9.3",
"phpdocumentor/phpdocumentor": "2.*",
"phploc/phploc": "^4.0",
"phpmd/phpmd": "2.*",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"sebastian/phpcpd": "^4.0",
"squizlabs/php_codesniffer": "^3.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Matrix\\": "classes/src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Baker",
"email": "mark@demon-angel.eu"
}
],
"description": "PHP Class for working with matrices",
"homepage": "https://github.com/MarkBaker/PHPMatrix",
"keywords": [
"mathematics",
"matrix",
"vector"
],
"support": {
"issues": "https://github.com/MarkBaker/PHPMatrix/issues",
"source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
},
"time": "2022-12-02T22:17:43+00:00"
},
{
"name": "monolog/monolog",
"version": "3.8.0",
@@ -2395,6 +2882,112 @@
],
"time": "2024-11-21T10:39:51+00:00"
},
{
"name": "phpoffice/phpspreadsheet",
"version": "1.29.10",
"source": {
"type": "git",
"url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
"reference": "c80041b1628c4f18030407134fe88303661d4e4e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/c80041b1628c4f18030407134fe88303661d4e4e",
"reference": "c80041b1628c4f18030407134fe88303661d4e4e",
"shasum": ""
},
"require": {
"composer/pcre": "^1||^2||^3",
"ext-ctype": "*",
"ext-dom": "*",
"ext-fileinfo": "*",
"ext-gd": "*",
"ext-iconv": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"ext-xmlreader": "*",
"ext-xmlwriter": "*",
"ext-zip": "*",
"ext-zlib": "*",
"ezyang/htmlpurifier": "^4.15",
"maennchen/zipstream-php": "^2.1 || ^3.0",
"markbaker/complex": "^3.0",
"markbaker/matrix": "^3.0",
"php": "^7.4 || ^8.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
"psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-main",
"dompdf/dompdf": "^1.0 || ^2.0 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.2",
"mitoteam/jpgraph": "^10.3",
"mpdf/mpdf": "^8.1.1",
"phpcompatibility/php-compatibility": "^9.3",
"phpstan/phpstan": "^1.1",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^8.5 || ^9.0",
"squizlabs/php_codesniffer": "^3.7",
"tecnickcom/tcpdf": "^6.5"
},
"suggest": {
"dompdf/dompdf": "Option for rendering PDF with PDF Writer",
"ext-intl": "PHP Internationalization Functions",
"mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
"mpdf/mpdf": "Option for rendering PDF with PDF Writer",
"tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
},
"type": "library",
"autoload": {
"psr-4": {
"PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Maarten Balliauw",
"homepage": "https://blog.maartenballiauw.be"
},
{
"name": "Mark Baker",
"homepage": "https://markbakeruk.net"
},
{
"name": "Franck Lefevre",
"homepage": "https://rootslabs.net"
},
{
"name": "Erik Tilt"
},
{
"name": "Adrien Crivelli"
}
],
"description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
"homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
"keywords": [
"OpenXML",
"excel",
"gnumeric",
"ods",
"php",
"spreadsheet",
"xls",
"xlsx"
],
"support": {
"issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
"source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.10"
},
"time": "2025-02-08T02:56:14+00:00"
},
{
"name": "phpoption/phpoption",
"version": "1.9.3",
@@ -5870,6 +6463,74 @@
},
"time": "2020-07-09T08:09:16+00:00"
},
{
"name": "ibex/crud-generator",
"version": "v2.1.2",
"source": {
"type": "git",
"url": "https://github.com/awais-vteams/laravel-crud-generator.git",
"reference": "3906f4a702c91bbe3a84d940c3021d1511834320"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/awais-vteams/laravel-crud-generator/zipball/3906f4a702c91bbe3a84d940c3021d1511834320",
"reference": "3906f4a702c91bbe3a84d940c3021d1511834320",
"shasum": ""
},
"require": {
"laravel/framework": "^10.30|^11.0",
"php": "^8.2"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Ibex\\CrudGenerator\\CrudServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Ibex\\CrudGenerator\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "M Awais",
"email": "asargodha@gmail.com"
}
],
"description": "Laravel CRUD Generator",
"keywords": [
"alpine js",
"bootstrap css",
"crud",
"crud generator",
"laravel",
"laravel crud generator",
"laravel package",
"tailwind css"
],
"support": {
"issues": "https://github.com/awais-vteams/laravel-crud-generator/issues",
"source": "https://github.com/awais-vteams/laravel-crud-generator/tree/v2.1.2"
},
"funding": [
{
"url": "https://github.com/awais-vteams",
"type": "github"
},
{
"url": "https://ko-fi.com/mawais",
"type": "ko_fi"
}
],
"time": "2024-12-09T06:01:54+00:00"
},
{
"name": "laravel/pail",
"version": "v1.2.1",
@@ -7906,12 +8567,12 @@
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^8.2"
},
"platform-dev": [],
"platform-dev": {},
"plugin-api-version": "2.6.0"
}

81
config/crud.php Normal file
View File

@@ -0,0 +1,81 @@
<?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 Normal file
View File

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

View File

@@ -0,0 +1,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('provincies', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->integer('province_code');
$table->string('province_name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('provincies');
}
};

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,32 @@
<?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();
});
}
};

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,114 @@
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();
}

View File

@@ -0,0 +1,132 @@
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;

View File

@@ -0,0 +1,91 @@
@extends('layouts.vertical', ['subtitle' => 'File Uploads'])
@section('content')
@include('layouts.partials/page-title', ['title' => 'Form', 'subtitle' => 'File Uploads'])
<div class="row">
<div class="col-xl-12">
<div class="card">
<div class="card-header">
<h5 class="card-title">Upload Data Reklame</h5>
<p class="card-subtitle">
Please upload a file with the extension <strong>.xls or .xlsx</strong> with a maximum size of <strong>10 MB</strong>.
<br>
For <strong>.xls</strong> and <strong>.xlsx</strong> files, ensure that the data is contained within a <strong>single sheet</strong> with the following columns:
<strong>No, Nama Wajib Pajak, NPWPD, Jenis Reklame, Isi Reklame, Alamat Wajib Pajak, Lokasi Reklame, Desa,
Kecamatan, Panajang, Lebar, Sudut Pandang, Muka, Luas, Sudut, Kontak.</strong>
</p>
</div>
<div class="card-body">
<div class="mb-3">
<div class="dropzone">
<form action="" method="post" enctype="multipart/form-data">
<div class="fallback">
<input id="file-dropzone"type="file" name="file" multiple/>
</div>
</form>
<div class="dz-message needsclick">
<i class="h1 bx bx-cloud-upload"></i>
<h3>Drop files here or click to upload.</h3>
</div>
</div>
<ul class="list-unstyled mb-0" id="dropzone-preview">
<li class="mt-2" id="dropzone-preview-list">
<!-- This is used as the file preview template -->
<div class="border rounded">
<div class="d-flex align-items-center p-2">
<div class="flex-shrink-0 me-3">
<div class="avatar-sm bg-light rounded">
<img data-dz-thumbnail class="img-fluid rounded d-block" src="#"
alt="" />
</div>
</div>
<div class="flex-grow-1">
<div class="pt-1">
<h5 class="fs-14 mb-1" data-dz-name>&nbsp;
</h5>
<p class="fs-13 text-muted mb-0" data-dz-size></p>
<strong class="error text-danger" data-dz-errormessage></strong>
</div>
</div>
<div class="flex-shrink-0 ms-3">
<button data-dz-remove class="btn btn-sm btn-danger">Delete</button>
</div>
</div>
</div>
</li>
</ul>
<!-- end dropzon-preview -->
</div>
<div class="d-flex justify-content-end">
<button id="submit-upload" class="btn btn-primary">Upload Files</button>
</div>
</div> <!-- end card body -->
</div> <!-- end card -->
</div> <!-- end col -->
</div> <!-- end row -->
<div class="toast-container position-fixed end-0 top-0 p-3">
<div id="toastUploadAdvertisement" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-header">
<div class="auth-logo me-auto">
</div>
<small class="text-muted"></small>
<button type="button" class="btn-close" data-bs-dismiss="toast"
aria-label="Close"></button>
</div>
<div class="toast-body">
</div>
</div>
</div>
@endsection
@section('scripts')
@vite(['resources/js/data/advertisements/form-upload.js'])
@endsection

View File

@@ -0,0 +1,120 @@
@extends('layouts.vertical', ['subtitle' => $subtitle]) <!-- Menggunakan subtitle dari controller -->
@section('content')
@include('layouts.partials/page-title', ['title' => $title, 'subtitle' => $subtitle]) <!-- Menggunakan title dan subtitle dari controller -->
<div class="row d-flex justify-content-center">
@if (session('error'))
<div class="alert alert-danger">
{{ session('error') }}
</div>
@endif
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="col-lg-12 col-md-12">
<div class="card">
<div class="card-header">
<button class="btn btn-danger float-end btn-back">
<i class='bx bx-arrow-back'></i>
Back
</button>
</div>
<div class="card-body">
<form id="create-update-form" action="{{ isset($modelInstance) && $modelInstance->id ? $apiUrl . '/' . $modelInstance->id : $apiUrl }}" method="POST">
@csrf
@if(isset($modelInstance))
@method('PUT')
@endif
<div class="row">
@foreach($fields as $field => $label)
<div class="col-md-6 form-group mb-3">
<label for="{{ $field }}">{{ $label }}</label>
@php
$fieldType = $fieldTypes[$field] ?? 'text'; // Default text jika tidak ditemukan tipe
@endphp
@if($fieldType == 'textarea')
<textarea id="{{ $field }}" name="{{ $field }}" class="form-control">{{ old($field, isset($modelInstance) ? $modelInstance->{$field} : '') }}</textarea>
@elseif($fieldType == 'select' && isset($dropdownOptions[$field]))
<select id="{{ $field }}" name="{{ $field }}" class="form-control">
@foreach($dropdownOptions[$field] as $code => $name)
<option value="{{ $code }}" {{ old($field, isset($modelInstance) ? $modelInstance->{$field} : '') == $code ? 'selected' : '' }}>{{ $name }}</option>
@endforeach
</select>
@elseif($fieldType == 'combobox' && isset($dropdownOptions[$field]))
<input class="form-control" list="{{ $field }}Options" id="{{ $field }}" name="{{ $field }}"
value="{{ old($field, isset($modelInstance) ? $modelInstance->{$field} : '') }}" placeholder="Type to search..." oninput="fetchOptions('{{ $field }}')">
<datalist id="{{ $field }}Options"></datalist>
@else
<input type="{{ $fieldType }}" id="{{ $field }}" name="{{ $field }}" class="form-control" value="{{ old($field, isset($modelInstance) ? $modelInstance->{$field} : '') }}">
@endif
</div>
@endforeach
</div>
<div class="d-flex justify-content-end">
<button type="button" class="btn {{ isset($modelInstance) ? 'btn-warning' : 'btn-success' }} width-lg btn-modal" data-bs-toggle="modal" data-bs-target="#confirmationModalCenter">
{{ isset($modelInstance) ? 'Update' : 'Create' }}
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="confirmationModalCenter" tabindex="-1"
aria-labelledby="confirmationModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="confirmationModalCenterTitle">
{{ isset($modelInstance) ? 'Update Confirmation' : 'Create Confirmation' }}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<p>{{ isset($modelInstance) ? 'Are you sure you want to save the data changes?' : 'Are you sure you want to create new data based on the form contents?' }}</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary"
data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary {{ isset($modelInstance) ? 'btn-edit' : 'btn-create' }}" data-bs-dismiss="modal">Save changes</button>
</div>
</div>
</div>
</div>
<div class="toast-container position-fixed end-0 top-0 p-3">
<div id="toastEditUpdate" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-header">
<div class="auth-logo me-auto">
</div>
<small class="text-muted"></small>
<button type="button" class="btn-close" data-bs-dismiss="toast"
aria-label="Close"></button>
</div>
<div class="toast-body">
</div>
</div>
</div>
@endsection
@section('scripts')
@vite(['resources/js/data/advertisements/form-create-update.js'])
@endsection

View File

@@ -0,0 +1,39 @@
@extends('layouts.vertical', ['subtitle' => 'Reklame'])
@section('css')
@vite(['node_modules/gridjs/dist/theme/mermaid.min.css'])
@endsection
@section('content')
@include('layouts.partials/page-title', ['title' => 'Data', 'subtitle' => 'Reklame'])
<div class="card">
<div class="card-header">
<h5 class="card-title">Daftar Reklame</h5>
</div>
<div class="card-body">
<div class="row">
<div class="d-flex justify-content-end gap-10 pb-3">
<button class="btn btn-success me-2 width-lg btn-create" data-model="data/advertisements">
<i class='bx bxs-file-plus'></i>
Create</button>
<button class="btn btn-primary width-lg btn-bulk-create" data-model="data/advertisements">
<i class='bx bx-upload' ></i>
Bulk Create
</button>
</div>
<div>
<div id="reklame-data-table"></div>
</div>
</div>
</div>
</div>
@endsection
@section('scripts')
@vite(['resources/js/data/advertisements/data-advertisements.js'])
@endsection

View File

@@ -91,6 +91,9 @@
<li class="sub-nav-item">
<a class="sub-nav-link" href="{{ route ('request-assignments.index' ) }}">PBG</a>
</li>
<li class="sub-nav-item">
<a class="sub-nav-link" href="{{ route ('advertisements.index') }}">Reklame</a>
</li>
</ul>
</div>
</li>

View File

@@ -7,6 +7,7 @@ use App\Http\Controllers\Api\RequestAssignmentController;
use App\Http\Controllers\Api\ScrapingController;
use App\Http\Controllers\Api\UsersController;
use App\Http\Controllers\Settings\SyncronizeController;
use App\Http\Controllers\Api\AdvertisementController;
use Illuminate\Support\Facades\Route;
Route::post('/login', [UsersController::class, 'login'])->name('api.user.login');
@@ -39,10 +40,15 @@ Route::group(['middleware' => 'auth:sanctum'], function (){
// scraping
Route::apiResource('/scraping', ScrapingController::class);
// reklame
Route::apiResource('advertisements', AdvertisementController::class);
Route::get('/combobox/search-options', [AdvertisementController::class, 'searchOptionsInAdvertisements']);
Route::post('/advertisements/import', [AdvertisementController::class, 'importFromFile']);
});
Route::get('/sync-task', [SyncronizeController::class, 'syncPbgTask'])->name('api.task');
Route::get('/get-user-token', [SyncronizeController::class, 'getUserToken'])->name('api.task.token');
Route::get('/get-index-integration-retribution/{uuid}', [SyncronizeController::class, 'syncIndexIntegration'])->name('api.task.inntegration');
Route::get('/sync-task-submit/{uuid}', [SyncronizeController::class, 'syncTaskDetailSubmit'])->name('api.task.submit');
Route::get('/sync-task-submit/{uuid}', [SyncronizeController::class, 'syncTaskDetailSubmit'])->name('api.task.submit');

View File

@@ -6,6 +6,7 @@ use App\Http\Controllers\Master\UsersController;
use App\Http\Controllers\RequestAssignment\PbgTaskController;
use App\Http\Controllers\Settings\SettingsController;
use App\Http\Controllers\Settings\SyncronizeController;
use App\Http\Controllers\Data\AdvertisementController;
use Illuminate\Support\Facades\Route;
require __DIR__ . '/auth.php';
@@ -39,4 +40,14 @@ Route::group(['middleware' => 'auth'], function(){
Route::get('/index', 'index')->name('request-assignments.index');
});
});
// data
Route::group(['prefix' => '/data'], function(){
// Resource route, kecuali create karena dibuat terpisah
Route::resource('/advertisements', AdvertisementController::class)->except(['create', 'show']);
// Rute khusus untuk create dan bulk-create
Route::get('/advertisements/create', [AdvertisementController::class, 'create'])->name('advertisements.create');
Route::get('/advertisements/bulk-create', [AdvertisementController::class, 'bulkCreate'])->name('advertisements.bulk-create');
});
});

View File

@@ -31,7 +31,9 @@ export default defineConfig({
"resources/js/pages/maps-spain.js",
"resources/js/pages/maps-russia.js",
"resources/js/pages/maps-iraq.js",
"resources/js/pages/maps-canada.js"
"resources/js/pages/maps-canada.js",
"resources/js/data/advertisements/data-advertisements.js",
"resources/js/form-create-update.js"
],
refresh: true,