diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php
index 02d8f08..67f7493 100644
--- a/app/Http/Controllers/Auth/RegisteredUserController.php
+++ b/app/Http/Controllers/Auth/RegisteredUserController.php
@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\Application;
use App\Models\FileUploader;
+use App\Models\Instructors;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Carbon\Carbon;
@@ -12,37 +13,29 @@ use Illuminate\Auth\Events\Registered;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules;
use Illuminate\View\View;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
-
+use Illuminate\Support\Facades\Log;
class RegisteredUserController extends Controller
{
- /**
- * Display the registration view.
- */
public function create(): View
{
return view('auth.register');
}
- /**
- * Handle an incoming registration request.
- *
- * @throws \Illuminate\Validation\ValidationException
- */
public function store(Request $request): RedirectResponse
{
$input = $request->all();
if (get_frontend_settings('recaptcha_status') == true && check_recaptcha($input['g-recaptcha-response']) == false) {
-
Session::flash('error', get_phrase('Recaptcha verification failed'));
-
return redirect(route('register.form'));
}
@@ -62,15 +55,37 @@ class RegisteredUserController extends Controller
'password.min' => get_phrase('Password must be at least 8 characters'),
]);
-
if ($validator->fails()) {
- // Get the first error message to show as flash message
$firstError = $validator->errors()->first();
Session::flash('error', $firstError);
-
return redirect()->back()->withErrors($validator)->withInput();
}
+ // Check if the user is applying to be an instructor and validate instructor fields
+ if ($request->has('instructor') && $request->instructor == 1) {
+ // Validate instructor-specific fields (NIDN, Phone, Document)
+ $instructorValidator = Validator::make($request->all(), [
+ 'nidn' => ['required', 'string', 'max:11'],
+ 'phone' => ['required', 'string'],
+ 'document' => ['required', 'file', 'mimes:pdf,doc,docx', 'max:2048'],
+ ], [
+ 'nidn.required' => get_phrase('NIDN is required'),
+ 'nidn.string' => get_phrase('NIDN must be a valid number'),
+ 'nidn.max' => get_phrase('NIDN may not be greater than 11 characters'),
+ 'phone.required' => get_phrase('Phone number is required'),
+ 'document.required' => get_phrase('Document is required'),
+ 'document.file' => get_phrase('Document must be a valid file'),
+ 'document.mimes' => get_phrase('Document must be PDF, DOC, or DOCX'),
+ 'document.max' => get_phrase('Document size must be less than 2MB'),
+ ]);
+
+ if ($instructorValidator->fails()) {
+ $firstError = $instructorValidator->errors()->first();
+ Session::flash('error', $firstError);
+ return redirect()->back()->withErrors($instructorValidator)->withInput();
+ }
+ }
+
$user_data = [
'name' => $request->name,
'email' => $request->email,
@@ -84,36 +99,98 @@ class RegisteredUserController extends Controller
}
$user = User::create($user_data);
-
-
event(new Registered($user));
- Auth::login($user);
-
// If applying as an instructor, process the application
if ($request->has('instructor')) {
+ return $this->processInstructorApplication($request, $user);
+ }
- // Check if application already exists
- if (Application::where('user_id', $user->id)->exists()) {
- Session::flash('error', get_phrase('Your request is in process. Please wait for admin to respond.'));
- return redirect()->route('become.instructor');
+ // Log the user in after successful registration
+ Auth::login($user);
+
+ return redirect(RouteServiceProvider::HOME);
+ }
+
+ private function processInstructorApplication(Request $request, User $user): RedirectResponse
+ {
+ // Check if application already exists
+ if (Application::where('user_id', $user->id)->exists()) {
+ Session::flash('error', get_phrase('Your request is in process. Please wait for admin to respond.'));
+ return redirect()->route('become.instructor');
+ }
+
+ try {
+ // Check NIDN with the API
+ $nidn = $request->nidn;
+ $api_url = "https://sindig.unesa.ac.id/apipddikti/api?nidn={$nidn}&auto=1";
+
+ $response = Http::timeout(30)->get($api_url);
+ $data = $response->json();
+
+ Log::info('API Response for NIDN: ' . $nidn, ['response' => $data]);
+
+ // Extract matched dosen data
+ $matched_dosen = $data['matched_dosen'][0];
+ Log::info('Instructor data to be saved:', $matched_dosen);
+
+ if (!isset($data['ok']) || !isset($data['matched_dosen']) || count($data['matched_dosen']) == 0) {
+ Session::flash('error', get_phrase('NIDN not found in the system. Please check your NIDN.'));
+ return redirect()->back()->withInput();
+ }else if ($matched_dosen['nama'] != $user->name){
+ Session::flash('error', get_phrase('Name does not match PDDikti records. Please check your name.'));
+ return redirect()->back()->withInput();
}
- // Process instructor application
- $application['user_id'] = $user->id;
- $application['phone'] = $request->phone;
- $application['description'] = $request->description;
+ Log::info('API Response for Nama: ' . $matched_dosen['nama'], ' || nama :',$user->name);
+
+ // Prepare instructor data - adjust fields according to your database
+ $instructor = [
+ 'user_id' => $user->id,
+ 'nidn' => $nidn,
+ 'name' => $matched_dosen['nama'] ?? $user->name,
+ 'id_sdm' => $matched_dosen['id'] ?? null,
+ 'id_sms' => $matched_dosen['nama_prodi'] ?? null,
+ 'id_pt' => $matched_dosen['nama_pt'] ?? null
+ ];
+
+ Log::info('Instructor data to be saved:', $instructor);
// Upload document
- $doc = $request->file('document');
- $application['document'] = 'uploads/applications/' . $user->id . Str::random(20) . '.' . $doc->extension();
+ if ($request->hasFile('document') && $request->file('document')->isValid()) {
+ $doc = $request->file('document');
+ $fileName = 'uploads/applications/' . $user->id . Str::random(20) . '.' . $doc->extension();
- FileUploader::upload($doc, $application['document'], null, null, 300);
+ FileUploader::upload($doc, $fileName, null, null, 300);
+ } else {
+ Session::flash('error', 'Document upload failed or no document selected.');
+ return redirect()->back()->withInput();
+ }
- // Store application
- Application::insert($application);
+ // Prepare application data
+ $application = [
+ 'user_id' => $user->id,
+ 'phone' => $request->phone,
+ 'description' => $request->description
+ ];
- Session::flash('success', get_phrase('Your application has been submitted.'));
+ // Start database transaction to ensure both records are saved
+ DB::transaction(function () use ($application, $instructor) {
+ Application::create($application);
+ Instructors::create($instructor);
+ });
+
+ Session::flash('success', get_phrase('Your application has been submitted successfully.'));
+
+ } catch (\Exception $e) {
+ Log::error('Instructor registration error:', [
+ 'user_id' => $user->id,
+ 'error' => $e->getMessage(),
+ 'trace' => $e->getTraceAsString()
+ ]);
+
+ Session::flash('error', get_phrase('Error while processing your application. Please try again later!'));
+ return redirect()->back()->withInput();
}
return redirect(RouteServiceProvider::HOME);
diff --git a/app/Models/Instructors.php b/app/Models/Instructors.php
new file mode 100644
index 0000000..8e364b7
--- /dev/null
+++ b/app/Models/Instructors.php
@@ -0,0 +1,15 @@
+first();
+ $applicant_instrucutor = App\Models\Instructors::where('id', $id)->first();
$user = get_user_info($applicant_details->user_id);
+ $user_photo = get_user_info($applicant_details->user_id)->photo;
+
+ // Ensure the placeholder image path is correct
+ $placeholder_image = asset('uploads/users/student/placeholder/placeholder.png');
@endphp
+
-
+ $placeholder_image: {{ $placeholder_image ?? 'N/A' }}
+
+ $user_photo: {{ $user_photo ?? 'N/A' }}
+
+
-
{{ get_phrase('Applicant') }}
@@ -41,12 +52,16 @@
{{ $user->email }}
-
- {{ get_phrase('Phone number') }}
- {{ $user->phone }}
+ {{ get_phrase('NIDN') }}
+ {{ $applicant_instrucutor->nidn ?? 'N/A' }}
-
- {{ get_phrase('Address') }}
- {{ $user->address }}
+ {{ get_phrase('Study Program') }}
+ {{ $applicant_instrucutor->id_sms ?? 'N/A' }}
+
+ -
+ {{ get_phrase('University') }}
+ {{ $applicant_instrucutor->id_pt?? 'N/A' }}
-
{{ get_phrase('Message') }} :  
diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php
index 630a8de..079fbbc 100644
--- a/resources/views/auth/register.blade.php
+++ b/resources/views/auth/register.blade.php
@@ -2,158 +2,140 @@
@push('title', get_phrase('Sign Up'))
@push('meta')@endpush
@push('css')
-
+
@endpush
@section('content')
-
-
-
-
-
-
 . '/image/signup.gif') }})
-
-
-
+
+
+
@endsection
@push('js')
-
+ // File size validation
+ function validateFileSize(input) {
+ const file = input.files[0];
+ if (file) {
+ const fileSizeInMB = file.size / (1024 * 1024); // Convert to MB
+ if (fileSizeInMB > 2) {
+ // Show error message using existing toaster system
+ error('{{ get_phrase("File size exceeds 2MB limit.") }}');
+ input.value = "";
+ }
+ }
+ }
+
@endpush
diff --git a/storage/app/.gitignore b/storage/app/.gitignore
deleted file mode 100755
index 8f4803c..0000000
--- a/storage/app/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*
-!public/
-!.gitignore
diff --git a/storage/app/data/cities.json b/storage/app/data/cities.json
new file mode 100644
index 0000000..dbfdc53
--- /dev/null
+++ b/storage/app/data/cities.json
@@ -0,0 +1,516 @@
+{
+ "1101": "SIMEULUE",
+ "1102": "ACEH SINGKIL",
+ "1103": "ACEH SELATAN",
+ "1104": "ACEH TENGGARA",
+ "1105": "ACEH TIMUR",
+ "1106": "ACEH TENGAH",
+ "1107": "ACEH BARAT",
+ "1108": "ACEH BESAR",
+ "1109": "PIDIE",
+ "1110": "BIREUEN",
+ "1111": "ACEH UTARA",
+ "1112": "ACEH BARAT DAYA",
+ "1113": "GAYO LUES",
+ "1114": "ACEH TAMIANG",
+ "1115": "NAGAN RAYA",
+ "1116": "ACEH JAYA",
+ "1117": "BENER MERIAH",
+ "1118": "PIDIE JAYA",
+ "1171": "BANDA ACEH",
+ "1172": "SABANG",
+ "1173": "LANGSA",
+ "1174": "LHOKSEUMAWE",
+ "1175": "SUBULUSSALAM",
+ "1201": "NIAS",
+ "1202": "MANDAILING NATAL",
+ "1203": "TAPANULI SELATAN",
+ "1204": "TAPANULI TENGAH",
+ "1205": "TAPANULI UTARA",
+ "1206": "TOBA",
+ "1207": "LABUHANBATU",
+ "1208": "ASAHAN",
+ "1209": "SIMALUNGUN",
+ "1210": "DAIRI",
+ "1211": "KARO",
+ "1212": "DELI SERDANG",
+ "1213": "LANGKAT",
+ "1214": "NIAS SELATAN",
+ "1215": "HUMBANG HASUNDUTAN",
+ "1216": "PAKPAK BHARAT",
+ "1217": "SAMOSIR",
+ "1218": "SERDANG BEDAGAI",
+ "1219": "BATU BARA",
+ "1220": "PADANG LAWAS UTARA",
+ "1221": "PADANG LAWAS",
+ "1222": "LABUHANBATU SELATAN",
+ "1223": "LABUHANBATU UTARA",
+ "1224": "NIAS UTARA",
+ "1225": "NIAS BARAT",
+ "1271": "SIBOLGA",
+ "1272": "TANJUNGBALAI",
+ "1273": "PEMATANGSIANTAR",
+ "1274": "TEBING TINGGI",
+ "1275": "MEDAN",
+ "1276": "BINJAI",
+ "1277": "PADANGSIDIMPUAN",
+ "1278": "GUNUNGSITOLI",
+ "1301": "KEPULAUAN MENTAWAI",
+ "1302": "PESISIR SELATAN",
+ "1303": "SOLOK",
+ "1304": "SIJUNJUNG",
+ "1305": "TANAH DATAR",
+ "1306": "PADANG PARIAMAN",
+ "1307": "AGAM",
+ "1308": "LIMA PULUH KOTA",
+ "1309": "PASAMAN",
+ "1310": "SOLOK SELATAN",
+ "1311": "DHARMASRAYA",
+ "1312": "PASAMAN BARAT",
+ "1371": "PADANG",
+ "1372": "SOLOK",
+ "1373": "SAWAHLUNTO",
+ "1374": "PADANG PANJANG",
+ "1375": "BUKITTINGGI",
+ "1376": "PAYAKUMBUH",
+ "1377": "PARIAMAN",
+ "1401": "KUANTAN SINGINGI",
+ "1402": "INDRAGIRI HULU",
+ "1403": "INDRAGIRI HILIR",
+ "1404": "PELALAWAN",
+ "1405": "SIAK",
+ "1406": "KAMPAR",
+ "1407": "ROKAN HULU",
+ "1408": "BENGKALIS",
+ "1409": "ROKAN HILIR",
+ "1410": "KEPULAUAN MERANTI",
+ "1471": "PEKANBARU",
+ "1473": "DUMAI",
+ "1501": "KERINCI",
+ "1502": "MERANGIN",
+ "1503": "SAROLANGUN",
+ "1504": "BATANG HARI",
+ "1505": "MUARO JAMBI",
+ "1506": "TANJUNG JABUNG TIMUR",
+ "1507": "TANJUNG JABUNG BARAT",
+ "1508": "TEBO",
+ "1509": "BUNGO",
+ "1571": "JAMBI",
+ "1572": "SUNGAI PENUH",
+ "1601": "OGAN KOMERING ULU",
+ "1602": "OGAN KOMERING ILIR",
+ "1603": "MUARA ENIM",
+ "1604": "LAHAT",
+ "1605": "MUSI RAWAS",
+ "1606": "MUSI BANYUASIN",
+ "1607": "BANYU ASIN",
+ "1608": "OGAN KOMERING ULU SELATAN",
+ "1609": "OGAN KOMERING ULU TIMUR",
+ "1610": "OGAN ILIR",
+ "1611": "EMPAT LAWANG",
+ "1612": "PENUKAL ABAB LEMATANG ILIR",
+ "1613": "MUSI RAWAS UTARA",
+ "1671": "PALEMBANG",
+ "1672": "PRABUMULIH",
+ "1673": "PAGAR ALAM",
+ "1674": "LUBUKLINGGAU",
+ "1701": "BENGKULU SELATAN",
+ "1702": "REJANG LEBONG",
+ "1703": "BENGKULU UTARA",
+ "1704": "KAUR",
+ "1705": "SELUMA",
+ "1706": "MUKOMUKO",
+ "1707": "LEBONG",
+ "1708": "KEPAHIANG",
+ "1709": "BENGKULU TENGAH",
+ "1771": "BENGKULU",
+ "1801": "LAMPUNG BARAT",
+ "1802": "TANGGAMUS",
+ "1803": "LAMPUNG SELATAN",
+ "1804": "LAMPUNG TIMUR",
+ "1805": "LAMPUNG TENGAH",
+ "1806": "LAMPUNG UTARA",
+ "1807": "WAY KANAN",
+ "1808": "TULANGBAWANG",
+ "1809": "PESAWARAN",
+ "1810": "PRINGSEWU",
+ "1811": "MESUJI",
+ "1812": "TULANG BAWANG BARAT",
+ "1813": "PESISIR BARAT",
+ "1871": "BANDAR LAMPUNG",
+ "1872": "METRO",
+ "1901": "BANGKA",
+ "1902": "BELITUNG",
+ "1903": "BANGKA BARAT",
+ "1904": "BANGKA TENGAH",
+ "1905": "BANGKA SELATAN",
+ "1906": "BELITUNG TIMUR",
+ "1971": "PANGKALPINANG",
+ "2101": "KARIMUN",
+ "2102": "BINTAN",
+ "2103": "NATUNA",
+ "2104": "LINGGA",
+ "2105": "KEPULAUAN ANAMBAS",
+ "2171": "BATAM",
+ "2172": "TANJUNG PINANG",
+ "3101": "KEPULAUAN SERIBU",
+ "3171": "JAKARTA SELATAN",
+ "3172": "JAKARTA TIMUR",
+ "3173": "JAKARTA PUSAT",
+ "3174": "JAKARTA BARAT",
+ "3175": "JAKARTA UTARA",
+ "3201": "BOGOR",
+ "3202": "SUKABUMI",
+ "3203": "CIANJUR",
+ "3204": "BANDUNG",
+ "3205": "GARUT",
+ "3206": "TASIKMALAYA",
+ "3207": "CIAMIS",
+ "3208": "KUNINGAN",
+ "3209": "CIREBON",
+ "3210": "MAJALENGKA",
+ "3211": "SUMEDANG",
+ "3212": "INDRAMAYU",
+ "3213": "SUBANG",
+ "3214": "PURWAKARTA",
+ "3215": "KARAWANG",
+ "3216": "BEKASI",
+ "3217": "BANDUNG BARAT",
+ "3218": "PANGANDARAN",
+ "3271": "BOGOR",
+ "3272": "SUKABUMI",
+ "3273": "BANDUNG",
+ "3274": "CIREBON",
+ "3275": "BEKASI",
+ "3276": "DEPOK",
+ "3277": "CIMAHI",
+ "3278": "TASIKMALAYA",
+ "3279": "BANJAR",
+ "3301": "CILACAP",
+ "3302": "BANYUMAS",
+ "3303": "PURBALINGGA",
+ "3304": "BANJARNEGARA",
+ "3305": "KEBUMEN",
+ "3306": "PURWOREJO",
+ "3307": "WONOSOBO",
+ "3308": "MAGELANG",
+ "3309": "BOYOLALI",
+ "3310": "KLATEN",
+ "3311": "SUKOHARJO",
+ "3312": "WONOGIRI",
+ "3313": "KARANGANYAR",
+ "3314": "SRAGEN",
+ "3315": "GROBOGAN",
+ "3316": "BLORA",
+ "3317": "REMBANG",
+ "3318": "PATI",
+ "3319": "KUDUS",
+ "3320": "JEPARA",
+ "3321": "DEMAK",
+ "3322": "SEMARANG",
+ "3323": "TEMANGGUNG",
+ "3324": "KENDAL",
+ "3325": "BATANG",
+ "3326": "PEKALONGAN",
+ "3327": "PEMALANG",
+ "3328": "TEGAL",
+ "3329": "BREBES",
+ "3371": "MAGELANG",
+ "3372": "SURAKARTA",
+ "3373": "SALATIGA",
+ "3374": "SEMARANG",
+ "3375": "PEKALONGAN",
+ "3376": "TEGAL",
+ "3401": "KULON PROGO",
+ "3402": "BANTUL",
+ "3403": "GUNUNGKIDUL",
+ "3404": "SLEMAN",
+ "3471": "YOGYAKARTA",
+ "3501": "PACITAN",
+ "3502": "PONOROGO",
+ "3503": "TRENGGALEK",
+ "3504": "TULUNGAGUNG",
+ "3505": "BLITAR",
+ "3506": "KEDIRI",
+ "3507": "MALANG",
+ "3508": "LUMAJANG",
+ "3509": "JEMBER",
+ "3510": "BANYUWANGI",
+ "3511": "BONDOWOSO",
+ "3512": "SITUBONDO",
+ "3513": "PROBOLINGGO",
+ "3514": "PASURUAN",
+ "3515": "SIDOARJO",
+ "3516": "MOJOKERTO",
+ "3517": "JOMBANG",
+ "3518": "NGANJUK",
+ "3519": "MADIUN",
+ "3520": "MAGETAN",
+ "3521": "NGAWI",
+ "3522": "BOJONEGORO",
+ "3523": "TUBAN",
+ "3524": "LAMONGAN",
+ "3525": "GRESIK",
+ "3526": "BANGKALAN",
+ "3527": "SAMPANG",
+ "3528": "PAMEKASAN",
+ "3529": "SUMENEP",
+ "3571": "KEDIRI",
+ "3572": "BLITAR",
+ "3573": "MALANG",
+ "3574": "PROBOLINGGO",
+ "3575": "PASURUAN",
+ "3576": "MOJOKERTO",
+ "3577": "MADIUN",
+ "3578": "SURABAYA",
+ "3579": "BATU",
+ "3601": "PANDEGLANG",
+ "3602": "LEBAK",
+ "3603": "TANGERANG",
+ "3604": "SERANG",
+ "3671": "TANGERANG",
+ "3672": "CILEGON",
+ "3673": "SERANG",
+ "3674": "TANGERANG SELATAN",
+ "5101": "JEMBRANA",
+ "5102": "TABANAN",
+ "5103": "BADUNG",
+ "5104": "GIANYAR",
+ "5105": "KLUNGKUNG",
+ "5106": "BANGLI",
+ "5107": "KARANGASEM",
+ "5108": "BULELENG",
+ "5171": "DENPASAR",
+ "5201": "LOMBOK BARAT",
+ "5202": "LOMBOK TENGAH",
+ "5203": "LOMBOK TIMUR",
+ "5204": "SUMBAWA",
+ "5205": "DOMPU",
+ "5206": "BIMA",
+ "5207": "SUMBAWA BARAT",
+ "5208": "LOMBOK UTARA",
+ "5271": "MATARAM",
+ "5272": "BIMA",
+ "5301": "SUMBA BARAT",
+ "5302": "SUMBA TIMUR",
+ "5303": "KUPANG",
+ "5304": "TIMOR TENGAH SELATAN",
+ "5305": "TIMOR TENGAH UTARA",
+ "5306": "BELU",
+ "5307": "ALOR",
+ "5308": "LEMBATA",
+ "5309": "FLORES TIMUR",
+ "5310": "SIKKA",
+ "5311": "ENDE",
+ "5312": "NGADA",
+ "5313": "MANGGARAI",
+ "5314": "ROTE NDAO",
+ "5315": "MANGGARAI BARAT",
+ "5316": "SUMBA TENGAH",
+ "5317": "SUMBA BARAT DAYA",
+ "5318": "NAGEKEO",
+ "5319": "MANGGARAI TIMUR",
+ "5320": "SABU RAIJUA",
+ "5321": "MALAKA",
+ "5371": "KUPANG",
+ "6101": "SAMBAS",
+ "6102": "BENGKAYANG",
+ "6103": "LANDAK",
+ "6104": "MEMPAWAH",
+ "6105": "SANGGAU",
+ "6106": "KETAPANG",
+ "6107": "SINTANG",
+ "6108": "KAPUAS HULU",
+ "6109": "SEKADAU",
+ "6110": "MELAWI",
+ "6111": "KAYONG UTARA",
+ "6112": "KUBU RAYA",
+ "6171": "PONTIANAK",
+ "6172": "SINGKAWANG",
+ "6201": "KOTAWARINGIN BARAT",
+ "6202": "KOTAWARINGIN TIMUR",
+ "6203": "KAPUAS",
+ "6204": "BARITO SELATAN",
+ "6205": "BARITO UTARA",
+ "6206": "SUKAMARA",
+ "6207": "LAMANDAU",
+ "6208": "SERUYAN",
+ "6209": "KATINGAN",
+ "6210": "PULANG PISAU",
+ "6211": "GUNUNG MAS",
+ "6212": "BARITO TIMUR",
+ "6213": "MURUNG RAYA",
+ "6271": "PALANGKA RAYA",
+ "6301": "TANAH LAUT",
+ "6302": "KOTABARU",
+ "6303": "BANJAR",
+ "6304": "BARITO KUALA",
+ "6305": "TAPIN",
+ "6306": "HULU SUNGAI SELATAN",
+ "6307": "HULU SUNGAI TENGAH",
+ "6308": "HULU SUNGAI UTARA",
+ "6309": "TABALONG",
+ "6310": "TANAH BUMBU",
+ "6311": "BALANGAN",
+ "6371": "BANJARMASIN",
+ "6372": "BANJARBARU",
+ "6401": "PASER",
+ "6402": "KUTAI BARAT",
+ "6403": "KUTAI KARTANEGARA",
+ "6404": "KUTAI TIMUR",
+ "6405": "BERAU",
+ "6409": "PENAJAM PASER UTARA",
+ "6411": "MAHAKAM ULU",
+ "6471": "BALIKPAPAN",
+ "6472": "SAMARINDA",
+ "6474": "BONTANG",
+ "6501": "MALINAU",
+ "6502": "BULUNGAN",
+ "6503": "TANA TIDUNG",
+ "6504": "NUNUKAN",
+ "6571": "TARAKAN",
+ "7101": "BOLAANG MONGONDOW",
+ "7102": "MINAHASA",
+ "7103": "KEPULAUAN SANGIHE",
+ "7104": "KEPULAUAN TALAUD",
+ "7105": "MINAHASA SELATAN",
+ "7106": "MINAHASA UTARA",
+ "7107": "BOLAANG MONGONDOW UTARA",
+ "7108": "SIAU TAGULANDANG BIARO",
+ "7109": "MINAHASA TENGGARA",
+ "7110": "BOLAANG MONGONDOW SELATAN",
+ "7111": "BOLAANG MONGONDOW TIMUR",
+ "7171": "MANADO",
+ "7172": "BITUNG",
+ "7173": "TOMOHON",
+ "7174": "KOTAMOBAGU",
+ "7201": "BANGGAI KEPULAUAN",
+ "7202": "BANGGAI",
+ "7203": "MOROWALI",
+ "7204": "POSO",
+ "7205": "DONGGALA",
+ "7206": "TOLI-TOLI",
+ "7207": "BUOL",
+ "7208": "PARIGI MOUTONG",
+ "7209": "TOJO UNA-UNA",
+ "7210": "SIGI",
+ "7211": "BANGGAI LAUT",
+ "7212": "MOROWALI UTARA",
+ "7271": "PALU",
+ "7301": "KEPULAUAN SELAYAR",
+ "7302": "BULUKUMBA",
+ "7303": "BANTAENG",
+ "7304": "JENEPONTO",
+ "7305": "TAKALAR",
+ "7306": "GOWA",
+ "7307": "SINJAI",
+ "7308": "MAROS",
+ "7309": "PANGKAJENE DAN KEPULAUAN",
+ "7310": "BARRU",
+ "7311": "BONE",
+ "7312": "SOPPENG",
+ "7313": "WAJO",
+ "7314": "SIDENRENG RAPPANG",
+ "7315": "PINRANG",
+ "7316": "ENREKANG",
+ "7317": "LUWU",
+ "7318": "TANA TORAJA",
+ "7322": "LUWU UTARA",
+ "7325": "LUWU TIMUR",
+ "7326": "TORAJA UTARA",
+ "7371": "MAKASSAR",
+ "7372": "PAREPARE",
+ "7373": "PALOPO",
+ "7401": "BUTON",
+ "7402": "MUNA",
+ "7403": "KONAWE",
+ "7404": "KOLAKA",
+ "7405": "KONAWE SELATAN",
+ "7406": "BOMBANA",
+ "7407": "WAKATOBI",
+ "7408": "KOLAKA UTARA",
+ "7409": "BUTON UTARA",
+ "7410": "KONAWE UTARA",
+ "7411": "KOLAKA TIMUR",
+ "7412": "KONAWE KEPULAUAN",
+ "7413": "MUNA BARAT",
+ "7414": "BUTON TENGAH",
+ "7415": "BUTON SELATAN",
+ "7471": "KENDARI",
+ "7472": "BAUBAU",
+ "7501": "BOALEMO",
+ "7502": "GORONTALO",
+ "7503": "POHUWATO",
+ "7504": "BONE BOLANGO",
+ "7505": "GORONTALO UTARA",
+ "7571": "GORONTALO",
+ "7601": "MAJENE",
+ "7602": "POLEWALI MANDAR",
+ "7603": "MAMASA",
+ "7604": "MAMUJU",
+ "7605": "PASANGKAYU",
+ "7606": "MAMUJU TENGAH",
+ "8101": "KEPULAUAN TANIMBAR",
+ "8102": "MALUKU TENGGARA",
+ "8103": "MALUKU TENGAH",
+ "8104": "BURU",
+ "8105": "KEPULAUAN ARU",
+ "8106": "SERAM BAGIAN BARAT",
+ "8107": "SERAM BAGIAN TIMUR",
+ "8108": "MALUKU BARAT DAYA",
+ "8109": "BURU SELATAN",
+ "8171": "AMBON",
+ "8172": "TUAL",
+ "8201": "HALMAHERA BARAT",
+ "8202": "HALMAHERA TENGAH",
+ "8203": "KEPULAUAN SULA",
+ "8204": "HALMAHERA SELATAN",
+ "8205": "HALMAHERA UTARA",
+ "8206": "HALMAHERA TIMUR",
+ "8207": "PULAU MOROTAI",
+ "8208": "PULAU TALIABU",
+ "8271": "TERNATE",
+ "8272": "TIDORE KEPULAUAN",
+ "9101": "FAKFAK",
+ "9102": "KAIMANA",
+ "9103": "TELUK WONDAMA",
+ "9104": "TELUK BINTUNI",
+ "9105": "MANOKWARI",
+ "9111": "MANOKWARI SELATAN",
+ "9112": "PEGUNUNGAN ARFAK",
+ "9201": "RAJA AMPAT",
+ "9202": "SORONG",
+ "9203": "SORONG SELATAN",
+ "9204": "MAYBRAT",
+ "9205": "TAMBRAUW",
+ "9271": "SORONG",
+ "9403": "JAYAPURA",
+ "9408": "KEPULAUAN YAPEN",
+ "9409": "BIAK NUMFOR",
+ "9419": "SARMI",
+ "9420": "KEEROM",
+ "9426": "WAROPEN",
+ "9427": "SUPIORI",
+ "9428": "MAMBERAMO RAYA",
+ "9471": "JAYAPURA",
+ "9501": "MERAUKE",
+ "9502": "BOVEN DIGOEL",
+ "9503": "MAPPI",
+ "9504": "ASMAT",
+ "9601": "MIMIKA",
+ "9602": "DOGIYAI",
+ "9603": "DEIYAI",
+ "9604": "NABIRE",
+ "9605": "PANIAI",
+ "9606": "INTAN JAYA",
+ "9607": "PUNCAK",
+ "9608": "PUNCAK JAYA",
+ "9701": "NDUGA",
+ "9702": "JAYAWIJAYA",
+ "9703": "LANNY JAYA",
+ "9704": "TOLIKARA",
+ "9705": "MAMBERAMO TENGAH",
+ "9706": "YALIMO",
+ "9707": "YAHUKIMO",
+ "9708": "PEGUNUNGAN BINTANG"
+}
\ No newline at end of file
diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore
deleted file mode 100755
index d6b7ef3..0000000
--- a/storage/app/public/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore