Compare commits
80 Commits
feat/data-
...
feature/ch
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fefef609ac | ||
|
|
7f8a2e4936 | ||
|
|
38948b6633 | ||
|
|
aa9943ba45 | ||
|
|
9e55ea0dbb | ||
|
|
93f0ac5ef7 | ||
|
|
8bae33519f | ||
|
|
6865e353e6 | ||
|
|
bb4ab5c769 | ||
|
|
e743b82087 | ||
|
|
c3c7b8e3ec | ||
|
|
d49035ce8d | ||
|
|
ffd9d3514c | ||
|
|
675477c734 | ||
|
|
4350c466e3 | ||
|
|
5ab407d672 | ||
|
|
2aaa487746 | ||
|
|
080582f7ab | ||
|
|
91475aeead | ||
|
|
a7afbd69fb | ||
|
|
1ff5587050 | ||
|
|
9c8a1a3f3f | ||
|
|
5c4be7635b | ||
|
|
ba315b1dee | ||
|
|
33b7131c33 | ||
|
|
7a56735099 | ||
|
|
dd331b4a08 | ||
|
|
dcd93d66e2 | ||
|
|
5d50d6d6cc | ||
|
|
39717d184c | ||
|
|
54146c8c08 | ||
|
|
e8da7193ef | ||
|
|
006c008542 | ||
|
|
39bb8e6d5f | ||
|
|
7994a62cea | ||
|
|
3a09e2e68a | ||
|
|
116dc1c8c7 | ||
|
|
f10bc153b4 | ||
|
|
06a3bb8c8b | ||
|
|
6c936d4c14 | ||
|
|
d4d0a485cd | ||
|
|
864fb26471 | ||
|
|
fd97a34344 | ||
|
|
1dd971fb73 | ||
|
|
aff31e08ef | ||
|
|
2fb8aeceaa | ||
|
|
ecc243d1cc | ||
|
|
beac71d182 | ||
|
|
8c236c460d | ||
|
|
154b7f40df | ||
|
|
59e9431b2d | ||
|
|
074edc607d | ||
|
|
625d182d81 | ||
|
|
4d32d4a110 | ||
|
|
ac2f37d549 | ||
|
|
a9afb47f08 | ||
|
|
9efb6c346e | ||
|
|
6ba62da5ca | ||
|
|
ba95c185de | ||
|
|
41ddbaef24 | ||
|
|
b4b34b503e | ||
|
|
1a15bc03f8 | ||
|
|
2bf4b8b327 | ||
|
|
ecf9096149 | ||
|
|
cb90f69d1e | ||
|
|
6307417ae3 | ||
|
|
9c41fad232 | ||
|
|
55dc0751d3 | ||
|
|
97ffd322a1 | ||
|
|
6fb59e58e9 | ||
|
|
7e99d547c8 | ||
|
|
65f82c9bfd | ||
|
|
44ebc20d3c | ||
|
|
b60bbd4290 | ||
|
|
29b705b59c | ||
|
|
95ab8eff7f | ||
|
|
bfc2f7f1f9 | ||
|
|
50f1757a64 | ||
|
|
3309664bae | ||
|
|
a7b6f13d8c |
@@ -4,6 +4,7 @@ APP_KEY=
|
|||||||
APP_DEBUG=true
|
APP_DEBUG=true
|
||||||
APP_TIMEZONE=UTC
|
APP_TIMEZONE=UTC
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
|
API_URL=http://localhost:8000
|
||||||
|
|
||||||
APP_LOCALE=en
|
APP_LOCALE=en
|
||||||
APP_FALLBACK_LOCALE=en
|
APP_FALLBACK_LOCALE=en
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Console\Commands;
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
use App\ServiceSIMBG;
|
use App\Services\ServiceSIMBG;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use \Illuminate\Support\Facades\Log;
|
use \Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
@@ -25,10 +25,16 @@ class ExecuteScraping extends Command
|
|||||||
/**
|
/**
|
||||||
* Execute the console command.
|
* Execute the console command.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
private $service_simbg;
|
||||||
|
|
||||||
|
public function __construct(ServiceSIMBG $service_simbg){
|
||||||
|
$this->service_simbg = $service_simbg;
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
Log::info("running scheduler daily scraping");
|
Log::info("running scheduler daily scraping");
|
||||||
$service = new ServiceSIMBG();
|
$this->service_simbg->syncTaskList();
|
||||||
$service->syncTaskList();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
212
app/Http/Controllers/Api/AdvertisementController.php
Normal file
212
app/Http/Controllers/Api/AdvertisementController.php
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Models\Advertisement;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use App\Http\Requests\AdvertisementRequest;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Resources\AdvertisementResource;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
|
use App\Imports\AdvertisementImport;
|
||||||
|
|
||||||
|
class AdvertisementController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$perPage = $request->input('per_page', 15); // Default 15 jika tidak dikirim oleh client
|
||||||
|
$search = $request->input('search', ''); // Ambil parameter 'search' jika ada
|
||||||
|
|
||||||
|
// Query dasar untuk mengambil iklan
|
||||||
|
$query = Advertisement::query();
|
||||||
|
// Jika ada pencarian, filter berdasarkan kolom yang diinginkan
|
||||||
|
if ($search) {
|
||||||
|
$query->where(function ($q) use ($search) {
|
||||||
|
$q->where('business_name', 'like', "%$search%")
|
||||||
|
->orWhere('npwpd', 'like', "%$search%")
|
||||||
|
->orWhere('advertisement_content', 'like', "%$search%")
|
||||||
|
->orWhere('business_address', 'like', "%$search%")
|
||||||
|
->orWhere('advertisement_location', 'like', "%$search%")
|
||||||
|
->orWhereIn('village_code', function ($subQuery) use ($search) {
|
||||||
|
$subQuery->select('village_code')
|
||||||
|
->from('villages')
|
||||||
|
->where('village_name', 'like', "%$search%");
|
||||||
|
})
|
||||||
|
->orWhereIn('district_code', function ($subQuery) use ($search) {
|
||||||
|
$subQuery->select('district_code')
|
||||||
|
->from('districts')
|
||||||
|
->where('district_name', 'like', "%$search%");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$advertisements = $query->paginate($perPage);
|
||||||
|
|
||||||
|
$advertisements->getCollection()->transform(function ($advertisement) {
|
||||||
|
$village = DB::table('villages')->where('village_code', $advertisement->village_code)->first();
|
||||||
|
$advertisement->village_name = $village ? $village->village_name : null;
|
||||||
|
|
||||||
|
$district = DB::table('districts')->where('district_code', $advertisement->district_code)->first();
|
||||||
|
$advertisement->district_name = $district ? $district->district_name : null;
|
||||||
|
return $advertisement;
|
||||||
|
});
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'data' => AdvertisementResource::collection($advertisements),
|
||||||
|
'meta' => [
|
||||||
|
'total' => $advertisements->total(),
|
||||||
|
'per_page' => $advertisements->perPage(),
|
||||||
|
'current_page' => $advertisements->currentPage(),
|
||||||
|
'last_page' => $advertisements->lastPage(),
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(AdvertisementRequest $request): Advertisement
|
||||||
|
{
|
||||||
|
$data = $request->validated();
|
||||||
|
|
||||||
|
// Cari district_code berdasarkan district_name
|
||||||
|
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
|
||||||
|
// Cari village_code berdasarkan village_name
|
||||||
|
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
|
||||||
|
|
||||||
|
// Tambahkan village_code dan district_code ke data
|
||||||
|
$data['village_code'] = $village_code;
|
||||||
|
$data['district_code'] = $district_code;
|
||||||
|
|
||||||
|
// Log data setelah transformasi
|
||||||
|
info($data);
|
||||||
|
return Advertisement::create($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Import advertisements from Excel or CSV.
|
||||||
|
*/
|
||||||
|
public function importFromFile(Request $request)
|
||||||
|
{
|
||||||
|
// Validasi file
|
||||||
|
info($request);
|
||||||
|
$validator = Validator::make($request->all(), [
|
||||||
|
'file' => 'required|mimes:xlsx,xls|max:10240', // Max 10MB
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($validator->fails()) {
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'File validation failed.',
|
||||||
|
'errors' => $validator->errors()
|
||||||
|
], 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Ambil file dari request
|
||||||
|
$file = $request->file('file');
|
||||||
|
|
||||||
|
// Menggunakan Laravel Excel untuk mengimpor file
|
||||||
|
Excel::import(new AdvertisementImport, $file);
|
||||||
|
|
||||||
|
// Jika sukses, kembalikan respons sukses
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'File uploaded and imported successfully!'
|
||||||
|
], 200);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// Jika ada error, kembalikan error response
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Error during file import.',
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(Advertisement $advertisement): Advertisement
|
||||||
|
{
|
||||||
|
return $advertisement;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(AdvertisementRequest $request, Advertisement $advertisement): Advertisement
|
||||||
|
{
|
||||||
|
$data = $request->validated();
|
||||||
|
|
||||||
|
// Cari district_code berdasarkan district_name
|
||||||
|
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
|
||||||
|
// Cari village_code berdasarkan village_name
|
||||||
|
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
|
||||||
|
|
||||||
|
// Tambahkan village_code dan district_code ke data
|
||||||
|
$data['village_code'] = $village_code;
|
||||||
|
$data['district_code'] = $district_code;
|
||||||
|
|
||||||
|
// Log data setelah transformasi
|
||||||
|
info($data);
|
||||||
|
|
||||||
|
$advertisement->update($data);
|
||||||
|
|
||||||
|
return $advertisement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(Advertisement $advertisement): Response
|
||||||
|
{
|
||||||
|
$advertisement->delete();
|
||||||
|
|
||||||
|
return response()->noContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function searchOptionsInAdvertisements(Request $request)
|
||||||
|
{
|
||||||
|
$query = $request->input('query');
|
||||||
|
$field = $request->input('field');
|
||||||
|
$district = $request->input('district'); // Ambil kecamatan jika ada
|
||||||
|
|
||||||
|
info("Query: $query, Field: $field, District: $district");
|
||||||
|
|
||||||
|
if ($field === 'district_name') {
|
||||||
|
$results = DB::table('districts')
|
||||||
|
->where('district_name', 'like', '%' . $query . '%')
|
||||||
|
->limit(10)
|
||||||
|
->get(['district_name AS name', 'district_code AS code']);
|
||||||
|
} elseif ($field === 'village_name' && $district) {
|
||||||
|
$results = DB::table('villages')
|
||||||
|
->where('village_name', 'like', '%' . $query . '%')
|
||||||
|
->whereExists(function ($query) use ($district) {
|
||||||
|
$query->select(DB::raw(1))
|
||||||
|
->from('districts')
|
||||||
|
->whereColumn('villages.district_code', 'districts.district_code')
|
||||||
|
->where('districts.district_name', $district);
|
||||||
|
})
|
||||||
|
->limit(10)
|
||||||
|
->get(['village_name AS name', 'village_code AS code']);
|
||||||
|
} else {
|
||||||
|
$results = collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json($results);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function downloadExcelAdvertisement()
|
||||||
|
{
|
||||||
|
$filePath = public_path('templates/template_reklame.xlsx');
|
||||||
|
|
||||||
|
// Cek apakah file ada
|
||||||
|
if (!file_exists($filePath)) {
|
||||||
|
return response()-> json(['message' => 'File tidak ditemukan!'], Response::HTTP_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return file to download
|
||||||
|
return response()->download($filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
241
app/Http/Controllers/Api/BigDataResumeController.php
Normal file
241
app/Http/Controllers/Api/BigDataResumeController.php
Normal file
@@ -0,0 +1,241 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\BigdataResume;
|
||||||
|
use App\Models\DataSetting;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
|
class BigDataResumeController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$filterDate = $request->get("filterByDate");
|
||||||
|
|
||||||
|
// If filterByDate is "latest" or empty, get the most recent record
|
||||||
|
if (!$filterDate || $filterDate === "latest") {
|
||||||
|
$big_data_resume = BigdataResume::latest()->first();
|
||||||
|
} else {
|
||||||
|
// Filter by specific date
|
||||||
|
$big_data_resume = BigdataResume::whereDate('created_at', $filterDate)
|
||||||
|
->orderBy('id', 'desc')
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if (!$big_data_resume) {
|
||||||
|
return $this->response_empty_resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$data_settings = DataSetting::all();
|
||||||
|
if($data_settings->isEmpty()){
|
||||||
|
return response()->json(['message' => 'No data setting found']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$target_pad = floatval(optional($data_settings->where('key', 'TARGET_PAD')->first())->value);
|
||||||
|
$tata_ruang = floatval(optional($data_settings->where('key', 'TATA_RUANG')->first())->value);
|
||||||
|
$realisasi_terbit_pbg_sum = floatval(optional($data_settings->where('key', 'REALISASI_TERBIT_PBG_SUM')->first())->value);
|
||||||
|
$realisasi_terbit_pbg_count = floatval(optional($data_settings->where('key', 'REALISASI_TERBIT_PBG_COUNT')->first())->value);
|
||||||
|
$menuggu_klik_dpmptsp_sum = floatval(optional($data_settings->where('key', 'MENUNGGU_KLIK_DPMPTSP_SUM')->first())->value);
|
||||||
|
$menuggu_klik_dpmptsp_count = floatval(optional($data_settings->where('key', 'MENUNGGU_KLIK_DPMPTSP_COUNT')->first())->value);
|
||||||
|
$proses_dinas_teknis_sum = floatval(optional($data_settings->where('key', 'PROSES_DINAS_TEKNIS_SUM')->first())->value);
|
||||||
|
$proses_dinas_teknis_count = floatval(optional($data_settings->where('key', 'PROSES_DINAS_TEKNIS_COUNT')->first())->value);
|
||||||
|
|
||||||
|
$kekurangan_potensi = $target_pad - $big_data_resume->potention_sum;
|
||||||
|
|
||||||
|
// percentage kekurangan potensi
|
||||||
|
$kekurangan_potensi_percentage = $target_pad > 0 && $target_pad > 0
|
||||||
|
? round(($kekurangan_potensi / $target_pad) * 100, 2) : 0;
|
||||||
|
|
||||||
|
// percentage total potensi
|
||||||
|
$total_potensi_percentage = $big_data_resume->potention_sum > 0 && $target_pad > 0
|
||||||
|
? round(($big_data_resume->potention_sum / $target_pad) * 100, 2) : 0;
|
||||||
|
|
||||||
|
// percentage verified document
|
||||||
|
$verified_percentage = $big_data_resume->verified_sum > 0 && $big_data_resume->potention_sum > 0
|
||||||
|
? round(($big_data_resume->verified_sum / $big_data_resume->potention_sum) * 100, 2) : 0;
|
||||||
|
|
||||||
|
// percentage non-verified document
|
||||||
|
$non_verified_percentage = $big_data_resume->non_verified_sum > 0 && $big_data_resume->potention_sum > 0
|
||||||
|
? round(($big_data_resume->non_verified_sum / $big_data_resume->potention_sum) * 100, 2) : 0;
|
||||||
|
|
||||||
|
// percentage business document
|
||||||
|
$business_percentage = $big_data_resume->business_sum > 0 && $big_data_resume->non_verified_sum > 0
|
||||||
|
? round(($big_data_resume->business_sum / $big_data_resume->non_verified_sum) * 100, 2) : 0;
|
||||||
|
|
||||||
|
// percentage non-business document
|
||||||
|
$non_business_percentage = $big_data_resume->non_business_sum > 0 && $big_data_resume->potention_sum > 0
|
||||||
|
? round(($big_data_resume->non_business_sum / $big_data_resume->potention_sum) * 100, 2) : 0;
|
||||||
|
|
||||||
|
// percentage tata ruang
|
||||||
|
$tata_ruang_percentage = $tata_ruang > 0 && $big_data_resume->potention_sum > 0
|
||||||
|
? round(($tata_ruang / $big_data_resume->potention_sum) * 100, 2) : 0;
|
||||||
|
|
||||||
|
// percentage realisasi terbit pbg
|
||||||
|
$realisasi_terbit_percentage = $big_data_resume->verified_sum > 0 && $realisasi_terbit_pbg_sum > 0
|
||||||
|
? round(($realisasi_terbit_pbg_sum / $big_data_resume->verified_sum) * 100, 2) : 0;
|
||||||
|
|
||||||
|
// percentage menunggu klik dpmptsp
|
||||||
|
$menunggu_klik_dpmptsp_percentage = $big_data_resume->verified_sum > 0 && $menuggu_klik_dpmptsp_sum > 0
|
||||||
|
? round(($menuggu_klik_dpmptsp_sum / $big_data_resume->verified_sum) * 100, 2) : 0;
|
||||||
|
|
||||||
|
// percentage proses_dinas_teknis
|
||||||
|
$proses_dinas_teknis_percentage = $big_data_resume->verified_sum > 0 && $proses_dinas_teknis_sum > 0
|
||||||
|
? round(($proses_dinas_teknis_sum / $big_data_resume->verified_sum) * 100, 2) : 0;
|
||||||
|
|
||||||
|
$result = [
|
||||||
|
'target_pad' => [
|
||||||
|
'sum' => $target_pad,
|
||||||
|
'percentage' => 100,
|
||||||
|
],
|
||||||
|
'tata_ruang' => [
|
||||||
|
'sum' => $tata_ruang,
|
||||||
|
'percentage' => $tata_ruang_percentage,
|
||||||
|
],
|
||||||
|
'kekurangan_potensi' => [
|
||||||
|
'sum' => $kekurangan_potensi,
|
||||||
|
'percentage' => $kekurangan_potensi_percentage
|
||||||
|
],
|
||||||
|
'total_potensi' => [
|
||||||
|
'sum' => (float) $big_data_resume->potention_sum,
|
||||||
|
'count' => $big_data_resume->potention_count,
|
||||||
|
'percentage' => $total_potensi_percentage
|
||||||
|
],
|
||||||
|
'verified_document' => [
|
||||||
|
'sum' => (float) $big_data_resume->verified_sum,
|
||||||
|
'count' => $big_data_resume->verified_count,
|
||||||
|
'percentage' => $verified_percentage
|
||||||
|
],
|
||||||
|
'non_verified_document' => [
|
||||||
|
'sum' => (float) $big_data_resume->non_verified_sum,
|
||||||
|
'count' => $big_data_resume->non_verified_count,
|
||||||
|
'percentage' => $non_verified_percentage
|
||||||
|
],
|
||||||
|
'business_document' => [
|
||||||
|
'sum' => (float) $big_data_resume->business_sum,
|
||||||
|
'count' => $big_data_resume->business_count,
|
||||||
|
'percentage' => $business_percentage
|
||||||
|
],
|
||||||
|
'non_business_document' => [
|
||||||
|
'sum' => (float) $big_data_resume->non_business_sum,
|
||||||
|
'count' => $big_data_resume->non_business_count,
|
||||||
|
'percentage' => $non_business_percentage
|
||||||
|
],
|
||||||
|
'realisasi_terbit' => [
|
||||||
|
'sum' => $realisasi_terbit_pbg_sum,
|
||||||
|
'count' => $realisasi_terbit_pbg_count,
|
||||||
|
'percentage' => $realisasi_terbit_percentage
|
||||||
|
],
|
||||||
|
'menunggu_klik_dpmptsp' => [
|
||||||
|
'sum' => $menuggu_klik_dpmptsp_sum,
|
||||||
|
'count' => $menuggu_klik_dpmptsp_count,
|
||||||
|
'percentage' => $menunggu_klik_dpmptsp_percentage
|
||||||
|
],
|
||||||
|
'proses_dinas_teknis' => [
|
||||||
|
'sum' => $proses_dinas_teknis_sum,
|
||||||
|
'count' => $proses_dinas_teknis_count,
|
||||||
|
'percentage' => $proses_dinas_teknis_percentage
|
||||||
|
]
|
||||||
|
];
|
||||||
|
return response()->json($result);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return response()->json(['message' => 'Error when fetching data'], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(Request $request)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(Request $request, string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
private function response_empty_resume(){
|
||||||
|
$result = [
|
||||||
|
'target_pad' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'percentage' => 100,
|
||||||
|
],
|
||||||
|
'tata_ruang' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'percentage' => 0,
|
||||||
|
],
|
||||||
|
'kekurangan_potensi' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'percentage' => 0
|
||||||
|
],
|
||||||
|
'total_potensi' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'count' => 0,
|
||||||
|
'percentage' => 0
|
||||||
|
],
|
||||||
|
'verified_document' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'count' => 0,
|
||||||
|
'percentage' => 0
|
||||||
|
],
|
||||||
|
'non_verified_document' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'count' => 0,
|
||||||
|
'percentage' => 0
|
||||||
|
],
|
||||||
|
'business_document' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'count' => 0,
|
||||||
|
'percentage' => 0
|
||||||
|
],
|
||||||
|
'non_business_document' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'count' => 0,
|
||||||
|
'percentage' => 0
|
||||||
|
],
|
||||||
|
'realisasi_terbit' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'count' => 0,
|
||||||
|
'percentage' => 0
|
||||||
|
],
|
||||||
|
'menunggu_klik_dpmptsp' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'count' => 0,
|
||||||
|
'percentage' => 0
|
||||||
|
],
|
||||||
|
'proses_dinas_teknis' => [
|
||||||
|
'sum' => 0,
|
||||||
|
'count' => 0,
|
||||||
|
'percentage' => 0
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
return response()->json($result);
|
||||||
|
}
|
||||||
|
}
|
||||||
120
app/Http/Controllers/Api/BusinessOrIndustriesController.php
Normal file
120
app/Http/Controllers/Api/BusinessOrIndustriesController.php
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\BusinessIndustryRequest;
|
||||||
|
use App\Imports\BusinessIndustriesImport;
|
||||||
|
use App\Models\BusinessOrIndustry;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
|
use \Illuminate\Support\Facades\Validator;
|
||||||
|
class BusinessOrIndustriesController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$query = BusinessOrIndustry::query()->orderBy('id', 'desc');
|
||||||
|
|
||||||
|
if ($request->has("search") && !empty($request->get("search"))) {
|
||||||
|
$search = $request->get("search");
|
||||||
|
|
||||||
|
info($request); // Debugging log
|
||||||
|
|
||||||
|
$query->where(function ($q) use ($search) {
|
||||||
|
$q->where("nop", "LIKE", "%{$search}%")
|
||||||
|
->orWhere("nama_kecamatan", "LIKE", "%{$search}%")
|
||||||
|
->orWhere("nama_kelurahan", "LIKE", "%{$search}%");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json($query->paginate());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(Request $request)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(BusinessIndustryRequest $request, string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$data = BusinessOrIndustry::findOrFail($id);
|
||||||
|
$data->update($request->validated());
|
||||||
|
return response()->json(['message' => 'Data updated successfully.'], 200);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
\Log::error($e->getMessage());
|
||||||
|
return response()->json(['message' => 'Failed to update data'],500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$data = BusinessOrIndustry::findOrFail($id);
|
||||||
|
$data->delete();
|
||||||
|
return response()->json(['message' => 'Data deleted successfully.'], 200);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
\Log::error($e->getMessage());
|
||||||
|
return response()->json(['message' => 'Failed to delete data'],500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function upload(Request $request){
|
||||||
|
|
||||||
|
if ($request->hasFile('file')) {
|
||||||
|
$file = $request->file('file');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validasi file
|
||||||
|
$validator = Validator::make($request->all(), [
|
||||||
|
'file' => 'required|mimes:xlsx,xls|max:102400', // Max 100MB
|
||||||
|
]);
|
||||||
|
|
||||||
|
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 BusinessIndustriesImport, $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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
84
app/Http/Controllers/Api/ChatbotController.php
Normal file
84
app/Http/Controllers/Api/ChatbotController.php
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use App\Services\OpenAIService;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
class ChatbotController extends Controller
|
||||||
|
{
|
||||||
|
protected $openAIService;
|
||||||
|
|
||||||
|
public function __construct(OpenAIService $openAIService)
|
||||||
|
{
|
||||||
|
$this->openAIService = $openAIService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateText(Request $request)
|
||||||
|
{
|
||||||
|
info($request);
|
||||||
|
$request->validate([
|
||||||
|
'tab_active' => 'required|string',
|
||||||
|
'prompt' => 'required|string',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$tab_active = $request->input('tab_active');
|
||||||
|
$main_content = match ($tab_active) {
|
||||||
|
"count-retribusi" => "RETRIBUTION",
|
||||||
|
"document-validation" => "DOCUMENT VALIDATION",
|
||||||
|
"data-information" => "DATA SUMMARY",
|
||||||
|
default => "UNKNOWN",
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($main_content === "UNKNOWN") {
|
||||||
|
return response()->json(['response' => 'Invalid tab_active value.'], 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
info($main_content);
|
||||||
|
|
||||||
|
// Klasifikasi apakah pertanyaan butuh database atau bisa dijawab langsung
|
||||||
|
$classifyResponse = $this->openAIService->generateClassifyMainContent($request->input('prompt'), $main_content);
|
||||||
|
|
||||||
|
if ($classifyResponse === "DATABASE") {
|
||||||
|
$queryResponse = $this->openAIService->generateQueryBasedMainContent($request->input('prompt'), $main_content);
|
||||||
|
if (is_array($queryResponse)) {
|
||||||
|
info('Query Response is an array: ', $queryResponse);
|
||||||
|
} else {
|
||||||
|
info('Query Response is a string: ' . $queryResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validasi query dua kali sebelum eksekusi
|
||||||
|
if (
|
||||||
|
$this->openAIService->validateSyntaxQuery($queryResponse) === "VALID" &&
|
||||||
|
$this->openAIService->validateSyntaxQuery($queryResponse) === "VALID"
|
||||||
|
) {
|
||||||
|
info($queryResponse);
|
||||||
|
$queryResponse = str_replace(['```sql', '```'], '', $queryResponse);
|
||||||
|
$resultQuery = DB::select($queryResponse);
|
||||||
|
$formattedResultQuery = json_encode($resultQuery, JSON_PRETTY_PRINT);
|
||||||
|
$nlpResult = $this->openAIService->generateNLPFromQuery($request->input('prompt'), $formattedResultQuery);
|
||||||
|
$finalGeneratedText =$this->openAIService->generateFinalText($nlpResult);
|
||||||
|
return response()->json(['response' => $finalGeneratedText]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json(['response' => ''], 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($classifyResponse === "GENERAL") {
|
||||||
|
$nlpResult = $this->openAIService->generateGeneralText($request->input('prompt'), $main_content);
|
||||||
|
$finalGeneratedText =$this->openAIService->generateFinalText($nlpResult);
|
||||||
|
return response()->json(['response' => $finalGeneratedText]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json(['response' => ''], 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function classifyContent(string $prompt) {
|
||||||
|
$classifyResponse = $this->openAIService->generateClassifyContent($prompt);
|
||||||
|
return $classifyResponse;
|
||||||
|
}
|
||||||
|
}
|
||||||
130
app/Http/Controllers/Api/CustomersController.php
Normal file
130
app/Http/Controllers/Api/CustomersController.php
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\CustomersRequest;
|
||||||
|
use App\Http\Requests\ExcelUploadRequest;
|
||||||
|
use App\Http\Resources\CustomersResource;
|
||||||
|
use App\Imports\CustomersImport;
|
||||||
|
use App\Models\Customer;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
|
|
||||||
|
class CustomersController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$query = Customer::query()->orderBy('id', 'desc');
|
||||||
|
if ($request->has('search') &&!empty($request->get('search'))) {
|
||||||
|
$query = $query->where('nomor_pelanggan', 'LIKE', '%'.$request->get('search').'%')
|
||||||
|
->orWhere('nama', 'LIKE', '%'.$request->get('search').'%')
|
||||||
|
->orWhere('kota_palayanan', 'LIKE', '%'.$request->get('search').'%');
|
||||||
|
}
|
||||||
|
return CustomersResource::collection($query->paginate());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(CustomersRequest $request)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$customer = Customer::create($request->validated());
|
||||||
|
return response()->json(['message' => 'Successfully created', new CustomersResource($customer)]);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Failed to create customer',
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$customer = Customer::find($id);
|
||||||
|
if($customer){
|
||||||
|
return new CustomersResource($customer);
|
||||||
|
} else {
|
||||||
|
return response()->json(['message' => 'Customer not found'], 404);
|
||||||
|
}
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Failed to retrieve customer',
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(CustomersRequest $request, string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$customer = Customer::find($id);
|
||||||
|
if($customer){
|
||||||
|
$customer->update($request->validated());
|
||||||
|
return response()->json(['message' => 'Successfully updated', new CustomersResource($customer)]);
|
||||||
|
} else {
|
||||||
|
return response()->json(['message' => 'Customer not found'], 404);
|
||||||
|
}
|
||||||
|
}catch(\Exception $e) {
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Failed to update customer',
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$customer = Customer::find($id);
|
||||||
|
if($customer){
|
||||||
|
$customer->delete();
|
||||||
|
return response()->json(['message' => 'Successfully deleted']);
|
||||||
|
}else {
|
||||||
|
return response()->json(['message' => 'Customer not found'], 404);
|
||||||
|
}
|
||||||
|
}catch(\Exception $e) {
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Failed to delete customer',
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function upload(ExcelUploadRequest $request){
|
||||||
|
try{
|
||||||
|
if(!$request->hasFile('file')){
|
||||||
|
return response()->json([
|
||||||
|
'error' => 'No file provided'
|
||||||
|
], 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = $request->file('file');
|
||||||
|
Excel::import(new CustomersImport, $file);
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'File uploaded successfully',
|
||||||
|
]);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
\Log::info($e->getMessage());
|
||||||
|
return response()->json([
|
||||||
|
'error' => 'Failed to upload file',
|
||||||
|
'message' => $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,33 +11,56 @@ class DashboardController extends Controller
|
|||||||
{
|
{
|
||||||
use GlobalApiResponse;
|
use GlobalApiResponse;
|
||||||
|
|
||||||
public function businnessDocument(Request $request){
|
public function businnessDocument(Request $request)
|
||||||
$query = DB::table('pbg_task AS pt')
|
{
|
||||||
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
$request->validate([
|
||||||
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
|
"year" => "required|integer"
|
||||||
->where(function ($query) {
|
]);
|
||||||
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
|
||||||
->orWhereNull('ptgs.status_verifikasi');
|
$current_year = $request->get('year');
|
||||||
})
|
|
||||||
->where(function ($query) {
|
$startOfYear = "$current_year-01-01 00:00:00";
|
||||||
$query->whereRaw('LOWER(TRIM(pt.function_type)) = ?', [strtolower(trim('Sebagai Tempat Usaha'))]);
|
$endOfYear = "$current_year-12-31 23:59:59";
|
||||||
})
|
$query = once(function () use ($startOfYear, $endOfYear) {
|
||||||
->selectRaw('COUNT(pt.id) AS total_data,
|
return DB::table('pbg_task AS pt')
|
||||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
->first();
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
|
||||||
$taskCount = $query->total_data;
|
->whereBetween("pt.task_created_at", [$startOfYear, $endOfYear])
|
||||||
|
->where(function ($query) {
|
||||||
|
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||||
|
->orWhereNull('ptgs.status_verifikasi');
|
||||||
|
})
|
||||||
|
->where(function ($query) {
|
||||||
|
$query->whereRaw('LOWER(TRIM(pt.function_type)) = ?', [strtolower(trim('Sebagai Tempat Usaha'))]);
|
||||||
|
})
|
||||||
|
->selectRaw('COUNT(pt.id) AS total_data,
|
||||||
|
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
||||||
|
->first();
|
||||||
|
});
|
||||||
|
|
||||||
|
$taskCount = $query->total_data ?? 0;
|
||||||
$taskTotal = $query->total_retribution ?? 0;
|
$taskTotal = $query->total_retribution ?? 0;
|
||||||
$result = [
|
|
||||||
|
return $this->resSuccess([
|
||||||
"count" => $taskCount,
|
"count" => $taskCount,
|
||||||
"total" => $taskTotal
|
"total" => $taskTotal
|
||||||
];
|
]);
|
||||||
return $this->resSuccess($result);
|
|
||||||
}
|
}
|
||||||
public function nonBusinnessDocument(Request $request){
|
public function nonBusinnessDocument(Request $request){
|
||||||
|
$request->validate([
|
||||||
|
"year" => "required|integer"
|
||||||
|
]);
|
||||||
|
|
||||||
$query = DB::table('pbg_task AS pt')
|
$current_year = $request->get('year');
|
||||||
|
|
||||||
|
$startOfYear = "$current_year-01-01 00:00:00";
|
||||||
|
$endOfYear = "$current_year-12-31 23:59:59";
|
||||||
|
|
||||||
|
$query = once( function () use ($startOfYear, $endOfYear) {
|
||||||
|
return DB::table('pbg_task AS pt')
|
||||||
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
|
||||||
|
->whereBetween("pt.task_created_at", [$startOfYear, $endOfYear])
|
||||||
->where(function ($query) {
|
->where(function ($query) {
|
||||||
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||||
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
|
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
|
||||||
@@ -49,55 +72,85 @@ class DashboardController extends Controller
|
|||||||
->selectRaw('COUNT(pt.id) AS total_data,
|
->selectRaw('COUNT(pt.id) AS total_data,
|
||||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
||||||
->first();
|
->first();
|
||||||
$taskCount = $query->total_data;
|
});
|
||||||
|
$taskCount = $query->total_data ?? 0;
|
||||||
$taskTotal = $query->total_retribution ?? 0;
|
$taskTotal = $query->total_retribution ?? 0;
|
||||||
$result = [
|
return $this->resSuccess([
|
||||||
"count" => $taskCount,
|
"count" => $taskCount,
|
||||||
"total" => $taskTotal
|
"total" => $taskTotal
|
||||||
];
|
]);
|
||||||
return $this->resSuccess($result);
|
|
||||||
}
|
}
|
||||||
public function allTaskDocuments(){
|
public function allTaskDocuments(Request $request){
|
||||||
$query = DB::table('pbg_task')
|
$request->validate([
|
||||||
->leftJoin('pbg_task_retributions', 'pbg_task.uuid', '=', 'pbg_task_retributions.pbg_task_uid')
|
"year" => "required|integer"
|
||||||
|
]);
|
||||||
|
|
||||||
|
$current_year = $request->get('year');
|
||||||
|
|
||||||
|
$startOfYear = "$current_year-01-01 00:00:00";
|
||||||
|
$endOfYear = "$current_year-12-31 23:59:59";
|
||||||
|
$query = once( function () use ($startOfYear, $endOfYear) {
|
||||||
|
return DB::table('pbg_task as pt')
|
||||||
|
->leftJoin('pbg_task_retributions as ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
|
||||||
|
->whereBetween("pt.task_created_at", [$startOfYear, $endOfYear])
|
||||||
->select(
|
->select(
|
||||||
DB::raw('COUNT(DISTINCT pbg_task.id) as task_count'),
|
DB::raw('COUNT(DISTINCT pt.id) as task_count'),
|
||||||
DB::raw('SUM(pbg_task_retributions.nilai_retribusi_bangunan) as total_retribution')
|
DB::raw('SUM(ptr.nilai_retribusi_bangunan) as total_retribution')
|
||||||
)
|
)
|
||||||
->first();
|
->first();
|
||||||
$taskCount = $query->task_count;
|
});
|
||||||
$taskTotal = $query->total_retribution;
|
$taskCount = $query->task_count ?? 0;
|
||||||
$result = [
|
$taskTotal = $query->total_retribution ?? 0;
|
||||||
|
return $this->resSuccess([
|
||||||
"count" => $taskCount,
|
"count" => $taskCount,
|
||||||
"total" => $taskTotal
|
"total" => $taskTotal
|
||||||
];
|
]);
|
||||||
return $this->resSuccess($result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function verificationDocuments(){
|
public function verificationDocuments(Request $request){
|
||||||
$query = DB::table('pbg_task AS pt')
|
$request->validate([
|
||||||
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
"year" => "required|integer"
|
||||||
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Menambahkan join ke pbg_task_retributions
|
]);
|
||||||
->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) = ?', [strtolower(trim('Selesai Verifikasi'))])
|
|
||||||
->selectRaw('COUNT(pt.id) AS total_data,
|
|
||||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
|
||||||
->first();
|
|
||||||
|
|
||||||
$taskCount = $query->total_data;
|
$current_year = $request->get('year');
|
||||||
$taskTotal = $query->total_retribution;
|
|
||||||
|
|
||||||
$result = [
|
$startOfYear = "$current_year-01-01 00:00:00";
|
||||||
|
$endOfYear = "$current_year-12-31 23:59:59";
|
||||||
|
$query = once( function () use ($startOfYear, $endOfYear){
|
||||||
|
return DB::table('pbg_task AS pt')
|
||||||
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
|
||||||
|
->whereBetween("pt.task_created_at", [$startOfYear, $endOfYear])
|
||||||
|
->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) = ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||||
|
->selectRaw('COUNT(pt.id) AS total_data,
|
||||||
|
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
||||||
|
->first();
|
||||||
|
});
|
||||||
|
|
||||||
|
$taskCount = $query->total_data ?? 0;
|
||||||
|
$taskTotal = $query->total_retribution ?? 0;
|
||||||
|
|
||||||
|
return $this->resSuccess([
|
||||||
"count"=> $taskCount,
|
"count"=> $taskCount,
|
||||||
"total"=> $taskTotal
|
"total"=> $taskTotal
|
||||||
];
|
]);
|
||||||
|
|
||||||
return $this->resSuccess($result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function nonVerificationDocuments(){
|
public function nonVerificationDocuments(Request $request){
|
||||||
$query = DB::table('pbg_task AS pt')
|
$request->validate([
|
||||||
|
"year" => "required|integer"
|
||||||
|
]);
|
||||||
|
|
||||||
|
$current_year = $request->get('year');
|
||||||
|
|
||||||
|
$startOfYear = "$current_year-01-01 00:00:00";
|
||||||
|
$endOfYear = "$current_year-12-31 23:59:59";
|
||||||
|
|
||||||
|
$query = once(function () use ($startOfYear, $endOfYear) {
|
||||||
|
return DB::table('pbg_task AS pt')
|
||||||
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join tabel pbg_task_retributions
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join tabel pbg_task_retributions
|
||||||
|
->whereBetween("pt.task_created_at", [$startOfYear, $endOfYear])
|
||||||
->where(function ($query) {
|
->where(function ($query) {
|
||||||
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||||
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
|
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
|
||||||
@@ -105,16 +158,15 @@ class DashboardController extends Controller
|
|||||||
->selectRaw('COUNT(pt.id) AS total_data,
|
->selectRaw('COUNT(pt.id) AS total_data,
|
||||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
||||||
->first();
|
->first();
|
||||||
|
});
|
||||||
|
|
||||||
$taskCount = $query->total_data;
|
$taskCount = $query->total_data ?? 0;
|
||||||
$taskTotal = $query->total_retribution ?? 0;
|
$taskTotal = $query->total_retribution ?? 0;
|
||||||
|
|
||||||
$result = [
|
return $this->resSuccess([
|
||||||
"count"=> $taskCount,
|
"count"=> $taskCount,
|
||||||
"total"=> $taskTotal
|
"total"=> $taskTotal
|
||||||
];
|
]);
|
||||||
|
|
||||||
return $this->resSuccess($result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function pbgTaskDocuments(Request $request){
|
public function pbgTaskDocuments(Request $request){
|
||||||
|
|||||||
31
app/Http/Controllers/Api/LackOfPotentialController.php
Normal file
31
app/Http/Controllers/Api/LackOfPotentialController.php
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\Advertisement;
|
||||||
|
use App\Models\Customer;
|
||||||
|
use App\Models\SpatialPlanning;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class LackOfPotentialController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
public function count_lack_of_potential(){
|
||||||
|
try{
|
||||||
|
$total_reklame = Advertisement::count();
|
||||||
|
$total_pdam = Customer::count();
|
||||||
|
$total_tata_ruang = SpatialPlanning::count();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'total_reklame' => $total_reklame,
|
||||||
|
'total_pdam' => $total_pdam,
|
||||||
|
'total_tata_ruang' => $total_tata_ruang
|
||||||
|
], 200);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Error: '.$e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
109
app/Http/Controllers/Api/MenusController.php
Normal file
109
app/Http/Controllers/Api/MenusController.php
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\MenuRequest;
|
||||||
|
use App\Http\Resources\MenuResource;
|
||||||
|
use App\Models\Menu;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
|
class MenusController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$query = Menu::query()->orderBy('id', 'desc');
|
||||||
|
|
||||||
|
if($request->has("search") && !empty($request->get("search"))){
|
||||||
|
$query = $query->where("name", "like", "%".$request->get("search")."%");
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json($query->paginate());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(MenuRequest $request)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$menu = Menu::create($request->validated());
|
||||||
|
return response()->json(['message' => 'Menu created successfully', 'data' => new MenuResource($menu)]);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
Log::error($e);
|
||||||
|
return response()->json(['message' => 'Error when creating menu'], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$menu = Menu::find($id);
|
||||||
|
if($menu){
|
||||||
|
return response()->json(['message' => 'Menu found', 'data' => new MenuResource($menu)]);
|
||||||
|
} else {
|
||||||
|
return response()->json(['message' => 'Menu not found'], 404);
|
||||||
|
}
|
||||||
|
}catch(\Exception $e){
|
||||||
|
Log::error($e);
|
||||||
|
Log::error($e->getMessage());
|
||||||
|
return response()->json(['message' => 'Error when finding menu'], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(MenuRequest $request, string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$menu = Menu::findOrFail($id);
|
||||||
|
if($menu){
|
||||||
|
$menu->update($request->validated());
|
||||||
|
return response()->json(['message' => 'Menu updated successfully', 'data' => new MenuResource($menu)]);
|
||||||
|
} else {
|
||||||
|
return response()->json(['message' => 'Menu not found'], 404);
|
||||||
|
}
|
||||||
|
}catch(\Exception $e){
|
||||||
|
Log::error($e);
|
||||||
|
return response()->json(['message' => 'Error when updating menu'], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$menu = Menu::findOrFail($id);
|
||||||
|
if($menu){
|
||||||
|
$this->deleteChildren($menu);
|
||||||
|
$menu->roles()->detach();
|
||||||
|
$menu->delete();
|
||||||
|
return response()->json(['message' => 'Menu deleted successfully']);
|
||||||
|
} else {
|
||||||
|
return response()->json(['message' => 'Menu not found'], 404);
|
||||||
|
}
|
||||||
|
}catch(\Exception $e){
|
||||||
|
Log::error($e);
|
||||||
|
return response()->json(['message' => 'Error when deleting menu'], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function deleteChildren($menu)
|
||||||
|
{
|
||||||
|
foreach ($menu->children as $child) {
|
||||||
|
$this->deleteChildren($child); // Recursively delete its children
|
||||||
|
$child->roles()->detach(); // Detach roles before deleting
|
||||||
|
$child->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,8 +2,12 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers\Api;
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Enums\ImportDatasourceStatus;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Http\Requests\PbgTaskMultiStepRequest;
|
use App\Http\Requests\PbgTaskMultiStepRequest;
|
||||||
|
use App\Http\Resources\PbgTaskResource;
|
||||||
|
use App\Models\DataSetting;
|
||||||
|
use App\Models\ImportDatasource;
|
||||||
use App\Models\PbgTask;
|
use App\Models\PbgTask;
|
||||||
use App\Models\PbgTaskGoogleSheet;
|
use App\Models\PbgTaskGoogleSheet;
|
||||||
use App\Services\GoogleSheetService;
|
use App\Services\GoogleSheetService;
|
||||||
@@ -17,9 +21,35 @@ class PbgTaskController extends Controller
|
|||||||
public function __construct(GoogleSheetService $googleSheetService){
|
public function __construct(GoogleSheetService $googleSheetService){
|
||||||
$this->googleSheetService = $googleSheetService;
|
$this->googleSheetService = $googleSheetService;
|
||||||
}
|
}
|
||||||
public function index()
|
public function index(Request $request)
|
||||||
{
|
{
|
||||||
//
|
info($request);
|
||||||
|
|
||||||
|
$isLastUpdated = filter_var($request->query('isLastUpdated', false), FILTER_VALIDATE_BOOLEAN);
|
||||||
|
|
||||||
|
$query = PbgTask::query();
|
||||||
|
|
||||||
|
if ($isLastUpdated) {
|
||||||
|
$query->orderBy('updated_at', 'desc');
|
||||||
|
} else {
|
||||||
|
$query->where('status', 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ambil maksimal 10 data
|
||||||
|
$pbg_task = $query->limit(10)->get();
|
||||||
|
$totalData = $pbg_task->count();
|
||||||
|
|
||||||
|
// Tambahkan nomor urut
|
||||||
|
$data = $pbg_task->map(function ($item, $index) {
|
||||||
|
return array_merge($item->toArray(), ['no' => $index + 1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'data' => $data,
|
||||||
|
'meta' => [
|
||||||
|
'total' => $totalData
|
||||||
|
]
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,7 +98,19 @@ class PbgTaskController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function show(string $id)
|
public function show(string $id)
|
||||||
{
|
{
|
||||||
//
|
try{
|
||||||
|
$pbg_task = PbgTask::with(['pbg_task_retributions','pbg_task_index_integrations','pbg_task_retributions.pbg_task_prasarana'])->findOrFail($id);
|
||||||
|
return response()->json([
|
||||||
|
"success"=> true,
|
||||||
|
"message"=> "Data ditemukan",
|
||||||
|
"data"=> $pbg_task
|
||||||
|
]);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return response()->json([
|
||||||
|
"success"=> false,
|
||||||
|
"message"=> $e->getMessage(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -94,11 +136,55 @@ class PbgTaskController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function syncPbgFromGoogleSheet(){
|
public function syncPbgFromGoogleSheet(){
|
||||||
|
$import_datasource = ImportDatasource::create([
|
||||||
|
"message" => "initialization",
|
||||||
|
"response_body" => null,
|
||||||
|
"status" => ImportDatasourceStatus::Processing->value,
|
||||||
|
]);
|
||||||
try{
|
try{
|
||||||
$totalRowCount = $this->googleSheetService->getLastRowByColumn("C");
|
$totalRowCount = $this->googleSheetService->getLastRowByColumn("C");
|
||||||
$sheetData = $this->googleSheetService->getSheetDataCollection($totalRowCount);
|
$sheetData = $this->googleSheetService->getSheetDataCollection($totalRowCount);
|
||||||
|
$sheet_big_data = $this->googleSheetService->get_data_by_sheet();
|
||||||
|
$data_setting_result = []; // Initialize result storage
|
||||||
|
|
||||||
|
$found_section = null; // Track which section is found
|
||||||
|
|
||||||
|
foreach ($sheet_big_data as $row) {
|
||||||
|
// Check for section headers
|
||||||
|
if (in_array("•PROSES PENERBITAN:", $row)) {
|
||||||
|
$found_section = "MENUNGGU_KLIK_DPMPTSP";
|
||||||
|
} elseif (in_array("•BERKAS AKTUAL TERVERIFIKASI DINAS TEKNIS 2024:", $row)) {
|
||||||
|
$found_section = "REALISASI_TERBIT_PBG";
|
||||||
|
} elseif (in_array("•TERPROSES DI DPUTR: belum selesai rekomtek'", $row)) {
|
||||||
|
$found_section = "PROSES_DINAS_TEKNIS";
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a section is found and we reach "Grand Total", save the corresponding values
|
||||||
|
if ($found_section && isset($row[0]) && trim($row[0]) === "Grand Total") {
|
||||||
|
if ($found_section === "MENUNGGU_KLIK_DPMPTSP") {
|
||||||
|
$data_setting_result["MENUNGGU_KLIK_DPMPTSP_COUNT"] = $row[2] ?? null;
|
||||||
|
$data_setting_result["MENUNGGU_KLIK_DPMPTSP_SUM"] = $row[3] ?? null;
|
||||||
|
} elseif ($found_section === "REALISASI_TERBIT_PBG") {
|
||||||
|
$data_setting_result["REALISASI_TERBIT_PBG_COUNT"] = $row[2] ?? null;
|
||||||
|
$data_setting_result["REALISASI_TERBIT_PBG_SUM"] = $row[4] ?? null;
|
||||||
|
} elseif ($found_section === "PROSES_DINAS_TEKNIS") {
|
||||||
|
$data_setting_result["PROSES_DINAS_TEKNIS_COUNT"] = $row[2] ?? null;
|
||||||
|
$data_setting_result["PROSES_DINAS_TEKNIS_SUM"] = $row[3] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset section tracking after capturing "Grand Total"
|
||||||
|
$found_section = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($data_setting_result as $key => $value) {
|
||||||
|
DataSetting::updateOrInsert(
|
||||||
|
["key" => $key], // Find by key
|
||||||
|
["value" => $value] // Update or insert value
|
||||||
|
);
|
||||||
|
}
|
||||||
$mapToUpsert = [];
|
$mapToUpsert = [];
|
||||||
$count = 0;
|
$count = 0;
|
||||||
|
|
||||||
foreach($sheetData as $data){
|
foreach($sheetData as $data){
|
||||||
$mapToUpsert[] =
|
$mapToUpsert[] =
|
||||||
[
|
[
|
||||||
@@ -217,6 +303,13 @@ class PbgTaskController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$total_data = count($mapToUpsert);
|
||||||
|
|
||||||
|
$import_datasource->update([
|
||||||
|
"message" => "Successfully processed: {$total_data}",
|
||||||
|
"status" => ImportDatasourceStatus::Success->value,
|
||||||
|
]);
|
||||||
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
@@ -225,6 +318,11 @@ class PbgTaskController extends Controller
|
|||||||
], 200);
|
], 200);
|
||||||
}catch(\Exception $ex){
|
}catch(\Exception $ex){
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
|
$import_datasource->update([
|
||||||
|
"message" => "Failed to importing",
|
||||||
|
"response_body" => $ex->getMessage(),
|
||||||
|
"status" => ImportDatasourceStatus::Failed->value,
|
||||||
|
]);
|
||||||
return response()->json([
|
return response()->json([
|
||||||
"success" => false,
|
"success" => false,
|
||||||
"message" => "Gagal menyimpan data",
|
"message" => "Gagal menyimpan data",
|
||||||
|
|||||||
91
app/Http/Controllers/Api/RolesController.php
Normal file
91
app/Http/Controllers/Api/RolesController.php
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\RoleRequest;
|
||||||
|
use App\Models\Role;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class RolesController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$query = Role::query()->orderBy('id', 'desc');
|
||||||
|
|
||||||
|
if($request->has('search') && !empty($request->get('search'))){
|
||||||
|
$query = $query->where('name', 'like', '%'. $request->get('search') . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json($query->paginate());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(RoleRequest $request)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$role = Role::create($request->validated());
|
||||||
|
return response()->json(['message' => 'Successfully created', 'data' => $role]);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return response()->json(['message' => 'Error when creating role', 'error' => $e->getMessage()], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$role = Role::find($id);
|
||||||
|
if($role){
|
||||||
|
return response()->json(['data' => $role]);
|
||||||
|
} else {
|
||||||
|
return response()->json(['message' => 'Role not found'], 404);
|
||||||
|
}
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return response()->json(['message' => 'Error when getting role', 'error' => $e->getMessage()], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(RoleRequest $request, string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$role = Role::find($id);
|
||||||
|
if($role){
|
||||||
|
$role->update($request->validated());
|
||||||
|
return response()->json(['message' => 'Successfully updated', 'data' => $role]);
|
||||||
|
} else {
|
||||||
|
return response()->json(['message' => 'Role not found'], 404);
|
||||||
|
}
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return response()->json(['message' => 'Error when updating role', 'error' => $e->getMessage()], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$role = Role::find($id);
|
||||||
|
if($role){
|
||||||
|
$role->delete();
|
||||||
|
return response()->json(['message' => 'Successfully deleted']);
|
||||||
|
} else {
|
||||||
|
return response()->json(['message' => 'Role not found'], 404);
|
||||||
|
}
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return response()->json(['message' => 'Error when deleting role', 'error' => $e->getMessage()], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
146
app/Http/Controllers/Api/SpatialPlanningController.php
Normal file
146
app/Http/Controllers/Api/SpatialPlanningController.php
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Models\SpatialPlanning;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use App\Http\Requests\SpatialPlanningRequest;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Resources\SpatialPlanningResource;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
|
use App\Imports\SpatialPlanningImport;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
|
||||||
|
class SpatialPlanningController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
info($request);
|
||||||
|
$perPage = $request->input('per_page', 15);
|
||||||
|
$search = $request->input('search', '');
|
||||||
|
|
||||||
|
$query = SpatialPlanning::query();
|
||||||
|
if ($search) {
|
||||||
|
$query->where(function ($q) use ($search) {
|
||||||
|
$q->where('name', 'like', "%$search%")
|
||||||
|
->orWhere('kbli', 'like', "%$search%")
|
||||||
|
->orWhere('activities', 'like', "%$search%")
|
||||||
|
->orWhere('area', 'like', "%$search%")
|
||||||
|
->orWhere('location', 'like', "%$search%")
|
||||||
|
->orWhere('number', 'like', "%$search%");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$spatialPlannings = $query->paginate($perPage);
|
||||||
|
|
||||||
|
// Menambhakan nomor urut (No)
|
||||||
|
$start = ($spatialPlannings->currentPage()-1) * $perPage + 1;
|
||||||
|
|
||||||
|
// Tambahkan nomor urut ke dalam data
|
||||||
|
$data = $spatialPlannings->map(function ($item, $index) use ($start) {
|
||||||
|
return array_merge($item->toArray(), ['no' => $start + $index]);
|
||||||
|
});
|
||||||
|
|
||||||
|
info($data);
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'data' => $data,
|
||||||
|
'meta' => [
|
||||||
|
'total' => $spatialPlannings->total(),
|
||||||
|
'per_page' => $spatialPlannings->perPage(),
|
||||||
|
'current_page' => $spatialPlannings->currentPage(),
|
||||||
|
'last_page'=>$spatialPlannings->lastPage(),
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(SpatialPlanningRequest $request): SpatialPlanning
|
||||||
|
{
|
||||||
|
$data = $request->validated();
|
||||||
|
return SpatialPlanning::create($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* import spatial planning from excel
|
||||||
|
*/
|
||||||
|
public function importFromFile(Request $request)
|
||||||
|
{
|
||||||
|
info($request);
|
||||||
|
//validasi file
|
||||||
|
$validator = Validator::make($request->all(), [
|
||||||
|
'file' => 'required|mimes:xlsx, xls|max:10240'
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($validator->fails()) {
|
||||||
|
return response()->json([
|
||||||
|
'message'=>'File vaildation failed.',
|
||||||
|
"errors"=>$validator->errors()
|
||||||
|
], 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$file = $request->file('file');
|
||||||
|
Excel::import(new SpatialPlanningImport, $file);
|
||||||
|
return response()->json([
|
||||||
|
'message'=>'File uploaded and imported successfully!'
|
||||||
|
], 200);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return response()->json([
|
||||||
|
'message'=>'Error during file import.',
|
||||||
|
'error'=>$e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(SpatialPlanning $spatialPlanning): SpatialPlanning
|
||||||
|
{
|
||||||
|
return $spatialPlanning;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(SpatialPlanningRequest $request, SpatialPlanning $spatialPlanning): SpatialPlanning
|
||||||
|
{
|
||||||
|
info($request);
|
||||||
|
$data = $request->validated();
|
||||||
|
info($data);
|
||||||
|
|
||||||
|
$spatialPlanning->update($data);
|
||||||
|
|
||||||
|
return $spatialPlanning;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(SpatialPlanning $spatialPlanning): Response
|
||||||
|
{
|
||||||
|
$spatialPlanning->delete();
|
||||||
|
|
||||||
|
return response()->noContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function downloadExcelSpatialPlanning()
|
||||||
|
{
|
||||||
|
$filePath = public_path('templates/template_spatial_planning.xlsx');
|
||||||
|
info(sprintf("File Path: %s | Exists: %s", $filePath, file_exists($filePath) ? 'Yes' : 'No'));
|
||||||
|
|
||||||
|
// Cek apakah file ada
|
||||||
|
if (!file_exists($filePath)) {
|
||||||
|
return response()-> json(['message' => 'File tidak ditemukan!'], Response::HTTP_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return file to download
|
||||||
|
return response()->download($filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
169
app/Http/Controllers/Api/TourismController.php
Normal file
169
app/Http/Controllers/Api/TourismController.php
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Models\Tourism;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use App\Http\Requests\TourismRequest;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Resources\TourismResource;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
|
use App\Imports\TourismImport;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
|
||||||
|
class TourismController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$perPage = $request->input('per_page', 15);
|
||||||
|
$search = $request->input('search', '');
|
||||||
|
|
||||||
|
$query = Tourism::query();
|
||||||
|
if ($search) {
|
||||||
|
$query->where(function ($q) use ($search) {
|
||||||
|
$q->where('business_name', 'like', "%$search%")
|
||||||
|
->orWhere('project_name', 'like', "%$search%")
|
||||||
|
->orWhere('business_address', 'like', "%$search%");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$tourisms = $query->paginate($perPage);
|
||||||
|
|
||||||
|
$tourisms->getCollection()->transform(function ($tourisms) {
|
||||||
|
$village = DB::table('villages')->where('village_code', $tourisms->village_code)->first();
|
||||||
|
$tourisms->village_name = $village ? $village->village_name : null;
|
||||||
|
|
||||||
|
$district = DB::table('districts')->where('district_code', $tourisms->district_code)->first();
|
||||||
|
$tourisms->district_name = $village ? $village->village_name : null;
|
||||||
|
return $tourisms;
|
||||||
|
});
|
||||||
|
|
||||||
|
$start = ($tourisms->currentPage()-1) * $perPage + 1;
|
||||||
|
|
||||||
|
$data = $tourisms->map(function ($item, $index) use ($start) {
|
||||||
|
return array_merge($item->toArray(), ['no' => $start + $index]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'data' => $data,
|
||||||
|
'meta' => [
|
||||||
|
'total' => $tourisms->total(),
|
||||||
|
'per_page' => $tourisms->perPage(),
|
||||||
|
'current_page' => $tourisms->currentPage(),
|
||||||
|
'last_page'=>$tourisms->lastPage(),
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(TourismRequest $request): Tourism
|
||||||
|
{
|
||||||
|
$data = $request->validated();
|
||||||
|
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
|
||||||
|
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
|
||||||
|
|
||||||
|
$data['district_code'] = $district_code;
|
||||||
|
$data['village_code'] = $village_code;
|
||||||
|
|
||||||
|
return Tourism::create($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Import advertisements from Excel
|
||||||
|
*/
|
||||||
|
public function importFromFile(Request $request)
|
||||||
|
{
|
||||||
|
//Validasi file
|
||||||
|
$validator = Validator::make($request->all(), [
|
||||||
|
'file' => 'required|mimes:xlsx, xls|max:10240'
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($validator->fails()) {
|
||||||
|
return response()->json([
|
||||||
|
'message'=>'File validation failed.',
|
||||||
|
'errors'=>$validator->errors()
|
||||||
|
], 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$file = $request->file('file');
|
||||||
|
Excel::import(new TourismImport, $file);
|
||||||
|
return response()->json([
|
||||||
|
'message'=>'File uploaded and imported successfully!'
|
||||||
|
], 200);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return response()->json([
|
||||||
|
'message'=>'Error during file import.',
|
||||||
|
'error'=>$e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAllLocation()
|
||||||
|
{
|
||||||
|
$locations = Tourism::whereNotNull('longitude')
|
||||||
|
->whereNotNull('latitude')
|
||||||
|
->select('project_name', 'longitude', 'latitude')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'data' => $locations
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(Tourism $tourism): Tourism
|
||||||
|
{
|
||||||
|
return $tourism;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(TourismRequest $request, Tourism $tourism): Tourism
|
||||||
|
{
|
||||||
|
$data = $request->validated();
|
||||||
|
|
||||||
|
// Cari district_code berdasarkan district_name
|
||||||
|
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
|
||||||
|
// Cari village_code berdasarkan village_name
|
||||||
|
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
|
||||||
|
// Tambahkan village_code dan district_code ke data
|
||||||
|
$data['village_code'] = $village_code;
|
||||||
|
$data['district_code'] = $district_code;
|
||||||
|
|
||||||
|
$tourism->update($data);
|
||||||
|
|
||||||
|
return $tourism;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(Tourism $tourism): Response
|
||||||
|
{
|
||||||
|
$tourism->delete();
|
||||||
|
|
||||||
|
return response()->noContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function downloadExcelTourism()
|
||||||
|
{
|
||||||
|
$filePath = public_path('templates/template_pariwisata.xlsx');
|
||||||
|
info(sprintf("File Path: %s | Exists: %s", $filePath, file_exists($filePath) ? 'Yes' : 'No'));
|
||||||
|
|
||||||
|
// Cek apakah file ada
|
||||||
|
if (!file_exists($filePath)) {
|
||||||
|
return response()-> json(['message' => 'File tidak ditemukan!'], Response::HTTP_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return file to download
|
||||||
|
return response()->download($filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
206
app/Http/Controllers/Api/UmkmController.php
Normal file
206
app/Http/Controllers/Api/UmkmController.php
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Models\Umkm;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use App\Http\Requests\UmkmRequest;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Resources\UmkmResource;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
|
use App\Imports\UmkmImport;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
|
||||||
|
class UmkmController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
info($request);
|
||||||
|
$perPage = $request->input('per_page', 15);
|
||||||
|
$search = $request->input('search', '');
|
||||||
|
|
||||||
|
$query = Umkm::query();
|
||||||
|
|
||||||
|
if ($search) {
|
||||||
|
$query->where(function ($q) use ($search) {
|
||||||
|
$q->where('business_name', 'like', "%$search%")
|
||||||
|
->orWhere('business_address', 'like', "%$search%")
|
||||||
|
->orWhere('business_desc', 'like', "%$search%")
|
||||||
|
->orWhere('business_id_number', 'like', "%$search%")
|
||||||
|
->orWhere('owner_id', 'like', "%$search%")
|
||||||
|
->orWhere('owner_name', 'like', "%$search%");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$umkm = $query->paginate($perPage);
|
||||||
|
|
||||||
|
$umkm->getCollection()->transform(function ($umkm) {
|
||||||
|
$village = DB::table('villages')->where('village_code', $umkm->village_code)->first();
|
||||||
|
$umkm->village_name = $village ? $village->village_name : null;
|
||||||
|
|
||||||
|
$district = DB::table('districts')->where('district_code', $umkm->district_code)->first();
|
||||||
|
$umkm->district_name = $district ? $district->district_name : null;
|
||||||
|
|
||||||
|
$business_scale = DB::table('business_scale')->where('id', $umkm->business_scale_id)->first();
|
||||||
|
$umkm->business_scale = $business_scale ? $business_scale->business_scale : null;
|
||||||
|
|
||||||
|
$permit_status = DB::table('permit_status')->where('id', $umkm->permit_status_id)->first();
|
||||||
|
$umkm->permit_status = $permit_status ? $permit_status->permit_status : null;
|
||||||
|
|
||||||
|
$business_form = DB::table('business_form')->where('id', $umkm->business_form_id)->first();
|
||||||
|
$umkm->business_form = $business_form ? $business_form->business_form : null;
|
||||||
|
return $umkm;
|
||||||
|
});
|
||||||
|
|
||||||
|
$start = ($umkm->currentPage()-1) * $perPage + 1;
|
||||||
|
|
||||||
|
$data = $umkm->map(function ($item, $index) use ($start) {
|
||||||
|
return array_merge($item->toArray(), ['no' => $start + $index]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'data' => $data,
|
||||||
|
'meta' => [
|
||||||
|
'total' => $umkm->total(),
|
||||||
|
'per_page' => $umkm->perPage(),
|
||||||
|
'current_page' => $umkm->currentPage(),
|
||||||
|
'last_page' => $umkm->lastPage(),
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(UmkmRequest $request): Umkm
|
||||||
|
{
|
||||||
|
info($request);
|
||||||
|
$data = $request->validated();
|
||||||
|
|
||||||
|
// Cari kode berdasarkan nama
|
||||||
|
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
|
||||||
|
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
|
||||||
|
$business_scale_id = DB::table('business_scale')->where('id', $data['business_scale_id'])->value('id');
|
||||||
|
$permit_status_id = DB::table('permit_status')->where('id', $data['permit_status_id'])->value('id');
|
||||||
|
$business_form_id = DB::table('business_form')->where('id', $data['business_form_id'])->value('id');
|
||||||
|
|
||||||
|
info($business_scale_id);
|
||||||
|
|
||||||
|
// Update data dengan kode yang ditemukan
|
||||||
|
$data['village_code'] = $village_code;
|
||||||
|
$data['district_code'] = $district_code;
|
||||||
|
$data['land_area'] = (double) $request['land_area'];
|
||||||
|
$data['business_scale_id'] = (int) $business_scale_id;
|
||||||
|
$data['permit_status_id'] = (int) $permit_status_id;
|
||||||
|
$data['business_form_id'] = (int) $business_form_id;
|
||||||
|
|
||||||
|
info($data);
|
||||||
|
|
||||||
|
// Simpan ke database
|
||||||
|
return Umkm::create($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Import advertisements from Excel or CSV.
|
||||||
|
*/
|
||||||
|
public function importFromFile(Request $request)
|
||||||
|
{
|
||||||
|
// Validasi file
|
||||||
|
$validator = Validator::make($request->all(), [
|
||||||
|
'file' => 'required|mimes:xlsx, xls|max:10240',
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($validator->fails()) {
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'File validation failed.',
|
||||||
|
'errors' => $validator->errors()
|
||||||
|
], 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Ambil file dari request
|
||||||
|
$file = $request->file('file');
|
||||||
|
|
||||||
|
// Menggunakan Laravel Excel untuk mengimpor file
|
||||||
|
Excel::import(new UmkmImport, $file);
|
||||||
|
|
||||||
|
// Jika sukses, kembalikan response sukses
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'File uploaded and imported successfully!'
|
||||||
|
], 200);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Error during file import.',
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(Umkm $umkm): Umkm
|
||||||
|
{
|
||||||
|
return $umkm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(UmkmRequest $request, Umkm $umkm): Umkm
|
||||||
|
{
|
||||||
|
info($request);
|
||||||
|
$data = $request->validated();
|
||||||
|
|
||||||
|
|
||||||
|
// Cari district_code berdasarkan district_name
|
||||||
|
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
|
||||||
|
// Cari village_code berdasarkan village_name
|
||||||
|
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
|
||||||
|
$business_scale_id = DB::table('business_scale')->where('id', $data['business_scale_id'])->value('id');
|
||||||
|
$permit_status_id = DB::table('permit_status')->where('id', $data['permit_status_id'])->value('id');
|
||||||
|
$business_form_id = DB::table('business_form')->where('id', $data['business_form_id'])->value('id');
|
||||||
|
|
||||||
|
|
||||||
|
// Tambahkan village_code dan district_code ke data
|
||||||
|
$data['village_code'] = $village_code;
|
||||||
|
$data['district_code'] = $district_code;
|
||||||
|
$data['land_area'] = (double) $request['land_area'];
|
||||||
|
$data['business_scale_id'] = (int) $business_scale_id;
|
||||||
|
$data['permit_status_id'] = (int) $permit_status_id;
|
||||||
|
$data['business_form_id'] = (int) $business_form_id;
|
||||||
|
|
||||||
|
// Log data setelah transformasi
|
||||||
|
info($data);
|
||||||
|
|
||||||
|
$umkm->update($data);
|
||||||
|
|
||||||
|
return $umkm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(Umkm $umkm): Response
|
||||||
|
{
|
||||||
|
$umkm->delete();
|
||||||
|
|
||||||
|
return response()->noContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function downloadExcelUmkm()
|
||||||
|
{
|
||||||
|
$filePath = public_path('templates/template_umkm.xlsx');
|
||||||
|
|
||||||
|
// Cek apakah file ada
|
||||||
|
if (!file_exists($filePath)) {
|
||||||
|
return response()-> json(['message' => 'File tidak ditemukan!'], Response::HTTP_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return file to download
|
||||||
|
return response()->download($filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,9 +4,11 @@ namespace App\Http\Controllers\Api;
|
|||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Http\Requests\Auth\LoginRequest;
|
use App\Http\Requests\Auth\LoginRequest;
|
||||||
|
use App\Http\Requests\UsersRequest;
|
||||||
use App\Http\Resources\UserResource;
|
use App\Http\Resources\UserResource;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Traits\GlobalApiResponse;
|
use App\Traits\GlobalApiResponse;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
@@ -35,4 +37,50 @@ class UsersController extends Controller
|
|||||||
$request->user()->tokens()->delete();
|
$request->user()->tokens()->delete();
|
||||||
return response()->json(['message' => 'logged out successfully']);
|
return response()->json(['message' => 'logged out successfully']);
|
||||||
}
|
}
|
||||||
|
public function store(UsersRequest $request){
|
||||||
|
$validate_data = $request->validated();
|
||||||
|
|
||||||
|
DB::beginTransaction();
|
||||||
|
try{
|
||||||
|
$user = User::create([
|
||||||
|
'name' => $validate_data['name'],
|
||||||
|
'email' => $validate_data['email'],
|
||||||
|
'password' => Hash::make($validate_data['password']),
|
||||||
|
'firstname' => $validate_data['firstname'],
|
||||||
|
'lastname' => $validate_data['lastname'],
|
||||||
|
'position' => $validate_data['position'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$user->roles()->attach((int) $validate_data['role_id']);
|
||||||
|
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['message' => 'Successfully created'],201);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json(['message' => $e->getMessage()],500);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
public function update(UsersRequest $request, $id){
|
||||||
|
try{
|
||||||
|
$validate_data = $request->validated();
|
||||||
|
$user = User::findOrFail($id);
|
||||||
|
|
||||||
|
DB::beginTransaction();
|
||||||
|
$user->update([
|
||||||
|
'name' => $validate_data['name'],
|
||||||
|
'email' => $validate_data['email'],
|
||||||
|
'firstname' => $validate_data['firstname'],
|
||||||
|
'lastname' => $validate_data['lastname'],
|
||||||
|
'position' => $validate_data['position']
|
||||||
|
]);
|
||||||
|
|
||||||
|
$user->roles()->sync($request->role_id);
|
||||||
|
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['message' => 'Successfully updated'], 200);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json(['message' => $e->getMessage()],500);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
66
app/Http/Controllers/BusinessOrIndustriesController.php
Normal file
66
app/Http/Controllers/BusinessOrIndustriesController.php
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\BusinessOrIndustry;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class BusinessOrIndustriesController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('business-industries.index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view("business-industries.create");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(Request $request)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing the specified resource.
|
||||||
|
*/
|
||||||
|
public function edit(string $id)
|
||||||
|
{
|
||||||
|
$data = BusinessOrIndustry::findOrFail($id);
|
||||||
|
return view('business-industries.edit', compact('data'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(Request $request, string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
17
app/Http/Controllers/Chatbot/ChatbotController.php
Normal file
17
app/Http/Controllers/Chatbot/ChatbotController.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Chatbot;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class ChatbotController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Displya a listing of the resource
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('chatbot.index');
|
||||||
|
}
|
||||||
|
}
|
||||||
26
app/Http/Controllers/CustomersController.php
Normal file
26
app/Http/Controllers/CustomersController.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\Customer;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class CustomersController extends Controller
|
||||||
|
{
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('customers.index');
|
||||||
|
}
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view('customers.create');
|
||||||
|
}
|
||||||
|
public function edit(string $id)
|
||||||
|
{
|
||||||
|
$data = Customer::findOrFail($id);
|
||||||
|
return view('customers.edit', compact('data'));
|
||||||
|
}
|
||||||
|
public function upload(){
|
||||||
|
return view('customers.upload');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,11 +3,20 @@
|
|||||||
namespace App\Http\Controllers\Dashboards;
|
namespace App\Http\Controllers\Dashboards;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\ImportDatasource;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class BigDataController extends Controller
|
class BigDataController extends Controller
|
||||||
{
|
{
|
||||||
public function index(){
|
public function index(){
|
||||||
return view('dashboards.bigdata');
|
$latest_import_datasource = ImportDatasource::latest()->first();
|
||||||
|
$latest_created = $latest_import_datasource ?
|
||||||
|
$latest_import_datasource->created_at->format("j F Y H:i:s") : null;
|
||||||
|
return view('dashboards.bigdata', compact('latest_created'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function pbg()
|
||||||
|
{
|
||||||
|
return view('dashboards.pbg');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Dashboards;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class LackOfPotentialController extends Controller
|
||||||
|
{
|
||||||
|
public function lack_of_potential(){
|
||||||
|
return view('dashboards.lack_of_potential');
|
||||||
|
}
|
||||||
|
}
|
||||||
135
app/Http/Controllers/Data/AdvertisementController.php
Normal file
135
app/Http/Controllers/Data/AdvertisementController.php
Normal 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",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
125
app/Http/Controllers/Data/SpatialPlanningController.php
Normal file
125
app/Http/Controllers/Data/SpatialPlanningController.php
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Data;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\SpatialPlanning;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class SpatialPlanningController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('data.spatialPlannings.index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show the form for creating a new resource.
|
||||||
|
*/
|
||||||
|
public function bulkCreate()
|
||||||
|
{
|
||||||
|
return view('data.spatialPlannings.form-upload');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
$title = 'Rencana Tata Ruang';
|
||||||
|
$subtitle = "Create Data";
|
||||||
|
|
||||||
|
// Mengambil data untuk dropdown
|
||||||
|
$dropdownOptions = [];
|
||||||
|
|
||||||
|
$fields = $this->getFields();
|
||||||
|
$fieldTypes = $this->getFieldTypes();
|
||||||
|
|
||||||
|
$apiUrl = url('/api/spatial-plannings');
|
||||||
|
return view('data.spatialPlannings.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(Request $request)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing the specified resource.
|
||||||
|
*/
|
||||||
|
public function edit(string $id)
|
||||||
|
{
|
||||||
|
$title = 'Rencana Tata Ruang';
|
||||||
|
$subtitle = 'Update Data';
|
||||||
|
|
||||||
|
$modelInstance = SpatialPlanning::find($id);
|
||||||
|
// Pastikan model ditemukan
|
||||||
|
if (!$modelInstance) {
|
||||||
|
return redirect()->route('spatialPlanning.index') ->with('error', 'Rencana tata ruang tidak ditemukan');
|
||||||
|
}
|
||||||
|
|
||||||
|
$dropdownOptions = [];
|
||||||
|
|
||||||
|
$fields = $this->getFields();
|
||||||
|
$fieldTypes = $this->getFieldTypes();
|
||||||
|
|
||||||
|
$apiUrl = url('/api/spatial-plannings');
|
||||||
|
return view('data.spatialPlannings.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(Request $request, string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getFields()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
"name"=> "Nama",
|
||||||
|
"kbli"=> "KBLI",
|
||||||
|
"activities"=> "Kegiatan",
|
||||||
|
"area"=> "Luas (m2)",
|
||||||
|
"location"=> "Lokasi",
|
||||||
|
"number"=> "Nomor",
|
||||||
|
"date"=> "Tanggal",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getFieldTypes()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
"name"=> "text",
|
||||||
|
"kbli"=> "text",
|
||||||
|
"activities"=> "text",
|
||||||
|
"area"=> "text",
|
||||||
|
"location"=> "text",
|
||||||
|
"number"=> "text",
|
||||||
|
"date"=> "date",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
145
app/Http/Controllers/Data/TourismController.php
Normal file
145
app/Http/Controllers/Data/TourismController.php
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Data;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\Tourism;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
class TourismController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('data.tourisms.index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show the form for creating a new rsource.
|
||||||
|
*/
|
||||||
|
public function bulkCreate()
|
||||||
|
{
|
||||||
|
return view('data.tourisms.form-upload');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show th form for creating a new resource
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
$title = 'Pariwisata';
|
||||||
|
$subtitle = 'Create Data';
|
||||||
|
|
||||||
|
// Mengambil data untuk dropdown
|
||||||
|
$dropdownOptions = [
|
||||||
|
'village_name' => DB::table('villages')->orderBy('village_name')->pluck('village_name', 'village_code'),
|
||||||
|
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code')
|
||||||
|
];
|
||||||
|
|
||||||
|
$fields = $this->getFields();
|
||||||
|
$fieldTypes = $this->getFieldTypes();
|
||||||
|
|
||||||
|
$apiUrl = url('/api/tourisms');
|
||||||
|
|
||||||
|
return view('data.tourisms.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show the form for editing the specified resource.
|
||||||
|
*/
|
||||||
|
public function edit($id)
|
||||||
|
{
|
||||||
|
$title = 'Pariwisata';
|
||||||
|
$subtitle = 'Update Data';
|
||||||
|
|
||||||
|
$modelInstance = Tourism::find($id);
|
||||||
|
// Pastikan model ditemukan
|
||||||
|
if (!$modelInstance) {
|
||||||
|
return redirect()->route('tourisms.index') ->with('error', 'Pariwisata tidak ditemukan');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mengambil dan memetakan village_name dan district_name
|
||||||
|
$village = DB::table('villages')->where('village_code', $modelInstance->village_code)->first();
|
||||||
|
$modelInstance->village_name = $village ? $village->village_name : null;
|
||||||
|
|
||||||
|
$district = DB::table('districts')->where('district_code', $modelInstance->district_code)->first();
|
||||||
|
$modelInstance->district_name = $district ? $district->district_name : null;
|
||||||
|
|
||||||
|
$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/tourisms');
|
||||||
|
|
||||||
|
return view('data.tourisms.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getFields()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
"project_id" => "ID Proyek",
|
||||||
|
"project_type_id" => "Jenis Proyek",
|
||||||
|
"nib" => "NIB",
|
||||||
|
"business_name" => "Nama Perusahaan",
|
||||||
|
"oss_publication_date" => "Tanggal Terbit OSS",
|
||||||
|
"investment_status_description" => "Uraian Status Penanaman Modal",
|
||||||
|
"business_form" => "Uraian Jenis Perusahaan",
|
||||||
|
"project_risk" => "Risiko Proyek",
|
||||||
|
"project_name" => "Nama Proyek",
|
||||||
|
"business_scale" => "Uraian Skala Usaha",
|
||||||
|
"business_address" => "Alamat Usaha",
|
||||||
|
"district_name" => "Kecamatan",
|
||||||
|
"village_name" => "Desa",
|
||||||
|
"longitude" => "Longitude",
|
||||||
|
"latitude" => "Latitude",
|
||||||
|
"project_submission_date" => "Tanggal Pengajuan Project",
|
||||||
|
"kbli" => "KBLI",
|
||||||
|
"kbli_title" => "Judul KBLI",
|
||||||
|
"supervisory_sector" => "Sektor Pembina",
|
||||||
|
"user_name" => "Nama User",
|
||||||
|
"email" => "Email",
|
||||||
|
"contact" => "Kontak",
|
||||||
|
"land_area_in_m2" => "Luas Tanah (m2)",
|
||||||
|
"investment_amount" => "Jumlah Investasi",
|
||||||
|
"tki" => "TKI",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getFieldTypes()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
"project_id" => "text",
|
||||||
|
"project_type_id" => "text",
|
||||||
|
"nib" => "text",
|
||||||
|
"business_name" => "text",
|
||||||
|
"oss_publication_date" => "date",
|
||||||
|
"investment_status_description" => "text",
|
||||||
|
"business_form" => "text",
|
||||||
|
"project_risk" => "text",
|
||||||
|
"project_name" => "text",
|
||||||
|
"business_scale" => "text",
|
||||||
|
"business_address" => "text",
|
||||||
|
"district_name" => "combobox",
|
||||||
|
"village_name" => "combobox",
|
||||||
|
"longitude" => "text",
|
||||||
|
"latitude" => "text",
|
||||||
|
"project_submission_date" => "date",
|
||||||
|
"kbli" => "text",
|
||||||
|
"kbli_title" => "text",
|
||||||
|
"supervisory_sector" => "text",
|
||||||
|
"user_name" => "text",
|
||||||
|
"email" => "text",
|
||||||
|
"contact" => "text",
|
||||||
|
"land_area_in_m2" => "text",
|
||||||
|
"investment_amount" => "text",
|
||||||
|
"tki" => "text",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
149
app/Http/Controllers/Data/UmkmController.php
Normal file
149
app/Http/Controllers/Data/UmkmController.php
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Data;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\Umkm;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
class UmkmController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('data.umkm.index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*/
|
||||||
|
public function bulkCreate()
|
||||||
|
{
|
||||||
|
return view('data.umkm.form-upload');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
$title = 'UMKM';
|
||||||
|
$subtitle = 'Create Data';
|
||||||
|
|
||||||
|
// Mengambil data untuk dropdown
|
||||||
|
$dropdownOptions = [
|
||||||
|
'village_name' => DB::table('villages')->orderBy('village_name')->pluck('village_name', 'village_code'),
|
||||||
|
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code'),
|
||||||
|
'business_scale_id' => DB::table('business_scale')->orderBy('business_scale')->pluck('business_scale', 'id'),
|
||||||
|
'permit_status_id' => DB::table('permit_status')->orderBy('permit_status')->pluck('permit_status', 'id'),
|
||||||
|
'business_form_id' => DB::table('business_form')->orderBy('business_form')->pluck('business_form', 'id')
|
||||||
|
];
|
||||||
|
|
||||||
|
$fields = $this->getFields();
|
||||||
|
$fieldTypes = $this->getFieldTypes();
|
||||||
|
|
||||||
|
$apiUrl = url('/api/umkm');
|
||||||
|
|
||||||
|
return view('data.umkm.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing the specified resource.
|
||||||
|
*/
|
||||||
|
public function edit($id)
|
||||||
|
{
|
||||||
|
$title = 'UMKM';
|
||||||
|
$subtitle = 'Update Data';
|
||||||
|
$modelInstance = Umkm::find($id);
|
||||||
|
// Pastikan model ditemukan
|
||||||
|
if (!$modelInstance) {
|
||||||
|
return redirect()->route('umkm.index')->with('error', 'Umkm not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mengambil dan memetakan village_name dan district_name
|
||||||
|
$village = DB::table('villages')->where('village_code', $modelInstance->village_code)->first();
|
||||||
|
$modelInstance->village_name = $village ? $village->village_name : null;
|
||||||
|
|
||||||
|
$district = DB::table('districts')->where('district_code', $modelInstance->district_code)->first();
|
||||||
|
$modelInstance->district_name = $district ? $district->district_name : null;
|
||||||
|
|
||||||
|
$business_scale = DB::table('business_scale')->where('id', $modelInstance->business_scale_id)->first();
|
||||||
|
$modelInstance->business_scale_id = $business_scale ? $business_scale->id : null;
|
||||||
|
|
||||||
|
$permit_status = DB::table('permit_status')->where('id', $modelInstance->permit_status_id)->first();
|
||||||
|
$modelInstance->permit_status_id = $permit_status ? $permit_status->id : null;
|
||||||
|
|
||||||
|
$business_form = DB::table('business_form')->where('id', $modelInstance->business_form_id)->first();
|
||||||
|
$modelInstance->business_form_id = $business_form ? $business_form->id : null;
|
||||||
|
|
||||||
|
// dd($modelInstance['business_form_id']);
|
||||||
|
// Mengambil data untuk dropdown
|
||||||
|
$dropdownOptions = [
|
||||||
|
'village_name' => DB::table('villages')->orderBy('village_name')->pluck('village_name', 'village_code'),
|
||||||
|
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code'),
|
||||||
|
'business_scale_id' => DB::table('business_scale')->orderBy('business_scale')->pluck('business_scale', 'id'),
|
||||||
|
'permit_status_id' => DB::table('permit_status')->orderBy('permit_status')->pluck('permit_status', 'id'),
|
||||||
|
'business_form_id' => DB::table('business_form')->orderBy('business_form')->pluck('business_form', 'id')
|
||||||
|
];
|
||||||
|
|
||||||
|
info("AdvertisementController@edit diakses dengan Model Instance: $modelInstance");
|
||||||
|
$fields = $this->getFields();
|
||||||
|
$fieldTypes = $this->getFieldTypes();
|
||||||
|
|
||||||
|
$apiUrl = url('/api/umkm');
|
||||||
|
|
||||||
|
// dd($modelInstance->business_form_id, $dropdownOptions['business_form']);
|
||||||
|
return view('data.umkm.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getFields()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
"business_name" => "Nama Usaha",
|
||||||
|
"business_address" => "Alamat Usaha",
|
||||||
|
"business_desc" => "Deskripsi Usaha",
|
||||||
|
"business_contact" => "Kontak Usaha",
|
||||||
|
"business_id_number" => "NIB",
|
||||||
|
"business_scale_id" => "Skala Usaha",
|
||||||
|
"owner_id" => "NIK",
|
||||||
|
"owner_name" => "Nama Pemilik",
|
||||||
|
"owner_address" => "Alamat Pemilik",
|
||||||
|
"owner_contact" => "Kontak Pemilik",
|
||||||
|
"business_type" => "Jenis Usaha",
|
||||||
|
"district_name" => "Kecamatan",
|
||||||
|
"village_name" => "Desa",
|
||||||
|
"number_of_employee" => "Jumlah Karyawan",
|
||||||
|
"land_area" => "Luas Tanah",
|
||||||
|
"permit_status_id" => "Ijin Status",
|
||||||
|
"business_form_id" => "Bisnis Form",
|
||||||
|
"revenue" => "Omset"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getFieldTypes()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
"business_name" => "text",
|
||||||
|
"business_address" => "text",
|
||||||
|
"business_desc" => "textarea",
|
||||||
|
"business_contact" => "text",
|
||||||
|
"business_id_number" => "text",
|
||||||
|
"business_scale_id" => "select",
|
||||||
|
"owner_id" => "text",
|
||||||
|
"owner_name" => "text",
|
||||||
|
"owner_address" => "text",
|
||||||
|
"owner_contact" => "text",
|
||||||
|
"business_type" => "text",
|
||||||
|
"district_name" => "combobox",
|
||||||
|
"village_name" => "combobox",
|
||||||
|
"number_of_employee" => "text",
|
||||||
|
"land_area" => "text",
|
||||||
|
"permit_status_id" => "select",
|
||||||
|
"business_form_id" => "select",
|
||||||
|
"revenue" => "text"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -36,12 +36,13 @@ class DataSettingController extends Controller
|
|||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
DataSetting::create($request->validated());
|
DataSetting::create($request->validated());
|
||||||
DB::commit();
|
DB::commit();
|
||||||
return redirect()->route("data-settings.index")->with("success","Successfully created");
|
return response()->json(['message' => 'Successfully created'],201);
|
||||||
}catch(Exception $ex){
|
}catch(Exception $ex){
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
return redirect()->back()
|
return response()->json([
|
||||||
->withInput()
|
'message' => 'Failed to create data setting',
|
||||||
->with('error', 'Something went wrong while saving data. ' . $ex->getMessage());
|
'error' => $ex->getMessage()
|
||||||
|
], 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,12 +80,10 @@ class DataSettingController extends Controller
|
|||||||
$data = DataSetting::findOrFail($id);
|
$data = DataSetting::findOrFail($id);
|
||||||
$data->update($request->validated());
|
$data->update($request->validated());
|
||||||
DB::commit();
|
DB::commit();
|
||||||
return redirect()->route("data-settings.index")->with("success","Successfully updated");
|
return response()->json(['message' => 'Successfully updated'], 200);
|
||||||
}catch(Exception $ex){
|
}catch(Exception $ex){
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
return redirect()->back()
|
return response()->json(['message' => $ex->getMessage()],500);
|
||||||
->withInput()
|
|
||||||
->with('error', 'Something went wrong while saving data. ' . $ex->getMessage());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +96,7 @@ class DataSettingController extends Controller
|
|||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
DataSetting::findOrFail($id)->delete();
|
DataSetting::findOrFail($id)->delete();
|
||||||
DB::commit();
|
DB::commit();
|
||||||
return response()->json(['success' => true, 'message' => 'Item deleted successfully.']);
|
return response()->json(['success' => true, 'message' => 'Item deleted successfully.'], 200);
|
||||||
}catch(Exception $e){
|
}catch(Exception $e){
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
Log::error($e->getMessage());
|
Log::error($e->getMessage());
|
||||||
|
|||||||
12
app/Http/Controllers/GoogleApisController.php
Normal file
12
app/Http/Controllers/GoogleApisController.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class GoogleApisController extends Controller
|
||||||
|
{
|
||||||
|
public function index(){
|
||||||
|
return view('maps.google-api');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,11 @@
|
|||||||
namespace App\Http\Controllers\Master;
|
namespace App\Http\Controllers\Master;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\UsersRequest;
|
||||||
|
use App\Models\Role;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
use Illuminate\Validation\Rules;
|
use Illuminate\Validation\Rules;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
@@ -22,30 +26,40 @@ class UsersController extends Controller
|
|||||||
return view('master.users.index', compact('users'));
|
return view('master.users.index', compact('users'));
|
||||||
}
|
}
|
||||||
public function create(){
|
public function create(){
|
||||||
return view('master.users.create');
|
$roles = Role::all();
|
||||||
|
return view('master.users.create', compact('roles'));
|
||||||
}
|
}
|
||||||
public function store(Request $request){
|
public function store(UsersRequest $request){
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'name' => ['required', 'string', 'max:255'],
|
'name' => ['required', 'string', 'max:255'],
|
||||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
|
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
|
||||||
'password' => ['required', 'confirmed', 'max:255'],
|
'password' => ['required', 'confirmed', 'max:255'],
|
||||||
'firstname' => ['required', 'string', 'max:255'],
|
'firstname' => ['required', 'string', 'max:255'],
|
||||||
'lastname' => ['required', 'string', 'max:255'],
|
'lastname' => ['required', 'string', 'max:255'],
|
||||||
'position' => ['required', 'string', 'max:255']
|
'position' => ['required', 'string', 'max:255'],
|
||||||
|
'role_id' => 'required|exists:roles,id'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// dd($request);
|
|
||||||
|
|
||||||
$user = User::create([
|
DB::beginTransaction();
|
||||||
'name' => $request->name,
|
try{
|
||||||
'email' => $request->email,
|
$user = User::create([
|
||||||
'password' => Hash::make($request->password),
|
'name' => $request->name,
|
||||||
'firstname' => $request->firstname,
|
'email' => $request->email,
|
||||||
'lastname' => $request->lastname,
|
'password' => Hash::make($request->password),
|
||||||
'position' => $request->position
|
'firstname' => $request->firstname,
|
||||||
]);
|
'lastname' => $request->lastname,
|
||||||
|
'position' => $request->position
|
||||||
|
]);
|
||||||
|
|
||||||
return redirect()->route('users.index')->with('success','Successfully registered');
|
$user->roles()->attach($request->role_id);
|
||||||
|
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['message' => 'Successfully created'],201);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json(['message' => $e->getMessage()],500);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
public function show($id){
|
public function show($id){
|
||||||
$user = User::find($id);
|
$user = User::find($id);
|
||||||
@@ -53,24 +67,40 @@ class UsersController extends Controller
|
|||||||
}
|
}
|
||||||
public function edit($id){
|
public function edit($id){
|
||||||
$user = User::find($id);
|
$user = User::find($id);
|
||||||
return view('master.users.edit', compact('user'));
|
$roles = Role::all();
|
||||||
|
return view('master.users.edit', compact('user', 'roles'));
|
||||||
}
|
}
|
||||||
public function update(Request $request, $id){
|
public function update(Request $request, $id){
|
||||||
$user = User::find($id);
|
$user = User::find($id);
|
||||||
$validate = $request->validate([
|
$validatedData = $request->validate([
|
||||||
'name' => ['required', 'string', 'max:255'],
|
'name' => ['required', 'string', 'max:255'],
|
||||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
|
'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($id)],
|
||||||
'password' => ['required', 'confirmed', Rules\Password::defaults()],
|
|
||||||
'firstname' => ['required', 'string', 'max:255'],
|
'firstname' => ['required', 'string', 'max:255'],
|
||||||
'lastname' => ['required', 'string', 'max:255'],
|
'lastname' => ['required', 'string', 'max:255'],
|
||||||
'position' => ['required', 'string', 'max:255']
|
'position' => ['required', 'string', 'max:255'],
|
||||||
|
'role_id' => ['required', 'exists:roles,id'],
|
||||||
]);
|
]);
|
||||||
$user->update($validate);
|
try{
|
||||||
return redirect()->route('master.users')->with('success', 'Successfully');
|
DB::beginTransaction();
|
||||||
|
$updateData = [
|
||||||
|
'name' => $validatedData['name'],
|
||||||
|
'email' => $validatedData['email'],
|
||||||
|
'firstname' => $validatedData['firstname'],
|
||||||
|
'lastname' => $validatedData['lastname'],
|
||||||
|
'position' => $validatedData['position'],
|
||||||
|
];
|
||||||
|
$user->update($updateData);
|
||||||
|
$user->roles()->sync([$request->role_id]);
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['message' => 'Successfully updated'],200);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json(['message' => $e->getMessage()],500);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public function destroy($id){
|
public function destroy($id){
|
||||||
$user = User::find($id);
|
$user = User::find($id);
|
||||||
$user->delete();
|
$user->delete();
|
||||||
return redirect()->route('master.users')->with('success','Successfully deleted');
|
return redirect()->route('users.index')->with('success','Successfully deleted');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
113
app/Http/Controllers/MenusController.php
Normal file
113
app/Http/Controllers/MenusController.php
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Requests\MenuRequest;
|
||||||
|
use App\Models\Menu;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
class MenusController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('menus.index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
$parent_menus = Menu::whereNull('parent_id')->get();
|
||||||
|
return view("menus.create", compact('parent_menus'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(MenuRequest $request)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$validated_menu = $request->validated();
|
||||||
|
DB::beginTransaction();
|
||||||
|
Menu::create($validated_menu);
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['message' => 'Successfully created'], 200);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
\Log::error('Menu creation failed: ' . $e->getMessage()); // Log the error for debugging
|
||||||
|
return response()->json(['message'=> $e->getMessage()],500);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing the specified resource.
|
||||||
|
*/
|
||||||
|
public function edit(string $id)
|
||||||
|
{
|
||||||
|
$menu = Menu::findOrFail($id);
|
||||||
|
$parent_menus = Menu::whereNull('parent_id')->where('id','!=',$id)->get();
|
||||||
|
return view("menus.edit", compact('menu','parent_menus'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(MenuRequest $request, string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$validate_menu = $request->validated();
|
||||||
|
$menu = Menu::findOrFail($id);
|
||||||
|
DB::beginTransaction();
|
||||||
|
$menu->update($validate_menu);
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['message' => 'Successfully updated'], 200);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
\Log::error('Menu update failed: '. $e->getMessage()); // Log the error for debugging
|
||||||
|
return response()->json(['message' => $e->getMessage()],500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
DB::beginTransaction();
|
||||||
|
$menu = Menu::findOrFail($id);
|
||||||
|
$this->deleteChildren($menu);
|
||||||
|
$menu->roles()->detach();
|
||||||
|
$menu->delete();
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['success' => true, 'message' => 'Successfully deleted']);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
\Log::error('failed delete menu'. $e->getMessage());
|
||||||
|
return response()->json(['success' => false, 'message' => 'Something went wrong! Please try again.']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function deleteChildren($menu)
|
||||||
|
{
|
||||||
|
foreach ($menu->children as $child) {
|
||||||
|
$this->deleteChildren($child); // Recursively delete its children
|
||||||
|
$child->roles()->detach(); // Detach roles before deleting
|
||||||
|
$child->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
21
app/Http/Controllers/Report/ReportTourismController.php
Normal file
21
app/Http/Controllers/Report/ReportTourismController.php
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Report;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\TourismBasedKBLI;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
class ReportTourismController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listring of the resource
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$tourismBasedKBLI = TourismBasedKBLI::all();
|
||||||
|
info($tourismBasedKBLI);
|
||||||
|
return view('report.tourisms.index', compact('tourismBasedKBLI'));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Controllers\RequestAssignment;
|
namespace App\Http\Controllers\RequestAssignment;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\PbgTask;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class PbgTaskController extends Controller
|
class PbgTaskController extends Controller
|
||||||
@@ -36,7 +37,8 @@ class PbgTaskController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function show(string $id)
|
public function show(string $id)
|
||||||
{
|
{
|
||||||
return view("pbg_task.show");
|
$data = PbgTask::with(['pbg_task_retributions','pbg_task_index_integrations', 'pbg_task_retributions.pbg_task_prasarana'])->findOrFail($id);
|
||||||
|
return view("pbg_task.show", compact("data"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
146
app/Http/Controllers/RolesController.php
Normal file
146
app/Http/Controllers/RolesController.php
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Requests\RoleRequest;
|
||||||
|
use App\Models\Menu;
|
||||||
|
use App\Models\Role;
|
||||||
|
use App\Models\RoleMenu;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class RolesController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view("roles.index");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view("roles.create");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(RoleRequest $request)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$validate_role = $request->validated();
|
||||||
|
|
||||||
|
DB::beginTransaction();
|
||||||
|
Role::create($validate_role);
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['message' => 'Role created successfully'], 201);
|
||||||
|
}
|
||||||
|
catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json(['message' => $e->getMessage()], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing the specified resource.
|
||||||
|
*/
|
||||||
|
public function edit(string $id)
|
||||||
|
{
|
||||||
|
$role = Role::findOrFail($id);
|
||||||
|
return view("roles.edit", compact('role'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(RoleRequest $request, string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$validate_role = $request->validated();
|
||||||
|
$role = Role::findOrFail($id);
|
||||||
|
|
||||||
|
DB::beginTransaction();
|
||||||
|
$role->update($validate_role);
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['message' => 'Role updated successfully'], 200);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json(['message' => $e->getMessage()], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
DB::beginTransaction();
|
||||||
|
Role::findOrFail($id)->delete();
|
||||||
|
DB::commit();
|
||||||
|
return response()->json(['success' => true, "message" => "Successfully deleted"]);
|
||||||
|
}catch(\Exception $e){
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json(['success' => false, "message" => $e->getMessage()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function menu_permission(string $role_id){
|
||||||
|
try{
|
||||||
|
$role = Role::findOrFail($role_id);
|
||||||
|
$menus = Menu::all();
|
||||||
|
$role_menus = RoleMenu::where('role_id', $role_id)->get() ?? collect();
|
||||||
|
return view('roles.role_menu', compact('role', 'menus', 'role_menus'));
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return redirect()->back()->with("error", $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update_menu_permission(Request $request, string $role_id){
|
||||||
|
try{
|
||||||
|
$validateData = $request->validate([
|
||||||
|
"permissions" => "array",
|
||||||
|
"permissions.*.allow_show" => "nullable|boolean",
|
||||||
|
"permissions.*.allow_create" => "nullable|boolean",
|
||||||
|
"permissions.*.allow_update" => "nullable|boolean",
|
||||||
|
"permissions.*.allow_destroy" => "nullable|boolean"
|
||||||
|
]);
|
||||||
|
|
||||||
|
$role = Role::find($role_id);
|
||||||
|
|
||||||
|
$permissionsArray = [];
|
||||||
|
foreach ($validateData['permissions'] as $menu_id => $permission) {
|
||||||
|
$permissionsArray[$menu_id] = [
|
||||||
|
"allow_show" => (int) ($permission["allow_show"] ?? 0),
|
||||||
|
"allow_create" => (int) ($permission["allow_create"] ?? 0),
|
||||||
|
"allow_update" => (int) ($permission["allow_update"] ?? 0),
|
||||||
|
"allow_destroy" => (int) ($permission["allow_destroy"] ?? 0),
|
||||||
|
"updated_at" => now(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sync will update existing records and insert new ones
|
||||||
|
$role->menus()->sync($permissionsArray);
|
||||||
|
|
||||||
|
return redirect()->route("role-menu.permission", $role_id)->with('success','Menu Permission updated successfully');
|
||||||
|
}catch(\Exception $e){
|
||||||
|
Log::error("Error updating role_menu:", ["error" => $e->getMessage()]);
|
||||||
|
return redirect()->route("role-menu.permission", $role_id)->with("error", $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,37 +3,43 @@
|
|||||||
namespace App\Http\Controllers\Settings;
|
namespace App\Http\Controllers\Settings;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\ServiceSIMBG;
|
use App\Services\ServiceSIMBG;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Exception;
|
use Exception;
|
||||||
class SyncronizeController extends Controller
|
class SyncronizeController extends Controller
|
||||||
{
|
{
|
||||||
|
protected $service_simbg;
|
||||||
|
public function __construct(ServiceSIMBG $service_simbg){
|
||||||
|
$this->service_simbg = $service_simbg;
|
||||||
|
}
|
||||||
public function index(Request $request){
|
public function index(Request $request){
|
||||||
return view('settings.syncronize.index');
|
return view('settings.syncronize.index');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function syncPbgTask(){
|
public function syncPbgTask(){
|
||||||
$res = (new ServiceSIMBG())->syncTaskList();
|
$res = $this->service_simbg->syncTaskList();
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function syncronizeTask(Request $request){
|
public function syncronizeTask(Request $request){
|
||||||
$res = (new ServiceSIMBG())->syncTaskList();
|
$res = $this->service_simbg->syncTaskList();
|
||||||
return redirect()->back()->with('success', 'Processing completed successfully');
|
return redirect()->back()->with('success', 'Processing completed successfully');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUserToken(){
|
public function getUserToken(){
|
||||||
$res = (new ServiceSIMBG())->getToken();
|
$res = $this->service_simbg->getToken();
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function syncIndexIntegration($uuid){
|
public function syncIndexIntegration(Request $request, $uuid){
|
||||||
$res = (new ServiceSIMBG())->syncIndexIntegration($uuid);
|
$token = $request->get('token');
|
||||||
|
$res = $this->service_simbg->syncIndexIntegration($uuid, $token);
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function syncTaskDetailSubmit($uuid){
|
public function syncTaskDetailSubmit(Request $request, $uuid){
|
||||||
$res = (new ServiceSIMBG())->syncTaskDetailSubmit($uuid);
|
$token = $request->get('token');
|
||||||
|
$res = $this->service_simbg->syncTaskDetailSubmit($uuid, $token);
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
79
app/Http/Requests/AdvertisementRequest.php
Normal file
79
app/Http/Requests/AdvertisementRequest.php
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
<?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',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pesan error validasi
|
||||||
|
*/
|
||||||
|
public function messages(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'no.required' => 'Nomor harus diisi.',
|
||||||
|
'business_name.required' => 'Nama usaha harus diisi.',
|
||||||
|
'business_name.string' => 'Nama usaha harus berupa teks.',
|
||||||
|
'npwpd.required' => 'NPWPD harus diisi.',
|
||||||
|
'npwpd.string' => 'NPWPD harus berupa teks.',
|
||||||
|
'advertisement_type.required' => 'Jenis reklame harus diisi.',
|
||||||
|
'advertisement_type.string' => 'Jenis reklame harus berupa teks.',
|
||||||
|
'advertisement_content.required' => 'Isi reklame harus diisi.',
|
||||||
|
'advertisement_content.string' => 'Isi reklame harus berupa teks.',
|
||||||
|
'business_address.required' => 'Alamat usaha harus diisi.',
|
||||||
|
'business_address.string' => 'Alamat usaha harus berupa teks.',
|
||||||
|
'advertisement_location.required' => 'Lokasi reklame harus diisi.',
|
||||||
|
'advertisement_location.string' => 'Lokasi reklame harus berupa teks.',
|
||||||
|
'village_name.required' => 'Nama desa harus diisi.',
|
||||||
|
'district_name.required' => 'Nama kecamatan harus diisi.',
|
||||||
|
'length.required' => 'Panjang harus diisi.',
|
||||||
|
'width.required' => 'Lebar harus diisi.',
|
||||||
|
'viewing_angle.required' => 'Sudut pandang harus diisi.',
|
||||||
|
'viewing_angle.string' => 'Sudut pandang harus berupa teks.',
|
||||||
|
'face.required' => 'Jumlah sisi harus diisi.',
|
||||||
|
'face.string' => 'Jumlah sisi harus berupa teks.',
|
||||||
|
'area.required' => 'Luas harus diisi.',
|
||||||
|
'area.string' => 'Luas harus berupa teks.',
|
||||||
|
'angle.required' => 'Sudut harus diisi.',
|
||||||
|
'angle.string' => 'Sudut harus berupa teks.',
|
||||||
|
'contact.required' => 'Kontak harus diisi.',
|
||||||
|
'contact.string' => 'Kontak harus berupa teks.',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
39
app/Http/Requests/BusinessIndustryRequest.php
Normal file
39
app/Http/Requests/BusinessIndustryRequest.php
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class BusinessIndustryRequest 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 [
|
||||||
|
'nama_kecamatan' => 'required|string|max:255',
|
||||||
|
'nama_kelurahan' => 'required|string|max:255',
|
||||||
|
'nop' => 'required|string|max:255|unique:business_or_industries,nop,' . $this->route('api_business_industry'),
|
||||||
|
'nama_wajib_pajak' => 'required|string|max:255',
|
||||||
|
'alamat_wajib_pajak' => 'nullable|string|max:255',
|
||||||
|
'alamat_objek_pajak' => 'required|string|max:255',
|
||||||
|
'luas_bumi' => 'required|numeric',
|
||||||
|
'luas_bangunan' => 'required|numeric',
|
||||||
|
'njop_bumi' => 'required|numeric',
|
||||||
|
'njop_bangunan' => 'required|numeric',
|
||||||
|
'ketetapan' => 'required|string|max:255',
|
||||||
|
'tahun_pajak' => 'required|integer|min:1900|max:' . date('Y'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
33
app/Http/Requests/CustomersRequest.php
Normal file
33
app/Http/Requests/CustomersRequest.php
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class CustomersRequest 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 [
|
||||||
|
'nomor_pelanggan' => ['required', 'string'],
|
||||||
|
'kota_pelayanan' => ['required', 'string'],
|
||||||
|
'nama' => ['required', 'string'],
|
||||||
|
'alamat' => ['required', 'string'],
|
||||||
|
'latitude' => ['required', 'numeric', 'between:-90,90'],
|
||||||
|
'longitude' => ['required', 'numeric', 'between:-180,180'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,7 +21,7 @@ class DataSettingRequest extends FormRequest
|
|||||||
*/
|
*/
|
||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
$id = $this->route('data_setting');
|
$id = $this->route('data_setting_id');
|
||||||
return [
|
return [
|
||||||
"key" => "required|unique:data_settings,key," . $id,
|
"key" => "required|unique:data_settings,key," . $id,
|
||||||
"value" => "required",
|
"value" => "required",
|
||||||
|
|||||||
28
app/Http/Requests/ExcelUploadRequest.php
Normal file
28
app/Http/Requests/ExcelUploadRequest.php
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class ExcelUploadRequest 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 [
|
||||||
|
"file" => "required|file|mimes:xlsx,xls|max:102400"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
35
app/Http/Requests/MenuRequest.php
Normal file
35
app/Http/Requests/MenuRequest.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
|
class MenuRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
$menuId = $this->route('menu_id'); // Get the menu ID if updating
|
||||||
|
|
||||||
|
return [
|
||||||
|
'name' => ['required', 'string', 'max:255', Rule::unique('menus', 'name')->ignore($menuId)],
|
||||||
|
'url' => ['nullable', 'string', 'max:255'],
|
||||||
|
'icon' => ['nullable', 'string', 'max:255'],
|
||||||
|
'parent_id' => ['nullable', 'exists:menus,id'],
|
||||||
|
'sort_order' => ['required', 'integer'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
30
app/Http/Requests/RoleRequest.php
Normal file
30
app/Http/Requests/RoleRequest.php
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class RoleRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
$roleId = $this->route('role_id');
|
||||||
|
return [
|
||||||
|
'name' => 'required|string|max:255|unique:roles,name,' . ($roleId ?? 'NULL') . ',id',
|
||||||
|
'description' => 'nullable|string',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
52
app/Http/Requests/SpatialPlanningRequest.php
Normal file
52
app/Http/Requests/SpatialPlanningRequest.php
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class SpatialPlanningRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'name' => 'string',
|
||||||
|
'kbli' => 'string',
|
||||||
|
'activities' => 'string',
|
||||||
|
'area' => 'string',
|
||||||
|
'location' => 'string',
|
||||||
|
'number' => 'string',
|
||||||
|
'date' => 'date_format:Y-m-d',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation messages for the defined validation rules.
|
||||||
|
*
|
||||||
|
* @return array<string, string>
|
||||||
|
*/
|
||||||
|
public function messages(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'name.string' => 'Kolom Nama harus berupa teks.',
|
||||||
|
'kbli.string' => 'Kolom KBLI harus berupa teks.',
|
||||||
|
'activities.string' => 'Kolom Kegiatan harus berupa teks.',
|
||||||
|
'area.string' => 'Kolom Area harus berupa teks.',
|
||||||
|
'location.string' => 'Kolom Lokasi harus berupa teks.',
|
||||||
|
'number.string' => 'Kolom Nomor harus berupa teks.',
|
||||||
|
'date.date_format' => 'Format tanggal tidak valid, gunakan format Y-m-d H:i:s.',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
35
app/Http/Requests/SpatialPlanningsRequest.php
Normal file
35
app/Http/Requests/SpatialPlanningsRequest.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
|
class SpatialPlanningsRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'name' => ['required','string','max:255'],
|
||||||
|
'kbli' => ['required','string','max:255'],
|
||||||
|
'kegiatan' => ['required','string'],
|
||||||
|
'luas' => ['required','numeric','regex:/^\d{1,16}(\.\d{1,2})?$/'],
|
||||||
|
'lokasi' => ['required','string'],
|
||||||
|
'nomor' => ['required','string','max:255',Rule::unique('spatial_plannings')->ignore($this->id)],
|
||||||
|
'sp_date' => ['required','date'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
133
app/Http/Requests/TourismRequest.php
Normal file
133
app/Http/Requests/TourismRequest.php
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class TourismRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'project_id' => 'required|string',
|
||||||
|
'project_type_id' => 'required|string',
|
||||||
|
'nib' => 'required|string',
|
||||||
|
'business_name' => 'required|string',
|
||||||
|
'oss_publication_date' => 'required',
|
||||||
|
'investment_status_description' => 'required|string',
|
||||||
|
'business_form' => 'required|string',
|
||||||
|
'project_risk' => 'required|string',
|
||||||
|
'project_name' => 'required|string',
|
||||||
|
'business_scale' => 'required|string',
|
||||||
|
'business_address' => 'required|string',
|
||||||
|
'district_name' => 'required',
|
||||||
|
'village_name' => 'required',
|
||||||
|
'longitude' => 'required|string',
|
||||||
|
'latitude' => 'required|string',
|
||||||
|
'project_submission_date' => 'required',
|
||||||
|
'kbli' => 'required|string',
|
||||||
|
'kbli_title' => 'required|string',
|
||||||
|
'supervisory_sector' => 'required|string',
|
||||||
|
'user_name' => 'required|string',
|
||||||
|
'email' => 'required|string',
|
||||||
|
'contact' => 'required|string',
|
||||||
|
'land_area_in_m2' => 'required|string',
|
||||||
|
'investment_amount' => 'required|string',
|
||||||
|
'tki' => 'required|string',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation messages for the defined validation rules.
|
||||||
|
*
|
||||||
|
* @return array<string, string>
|
||||||
|
*/
|
||||||
|
public function messages(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'project_id.required' => 'ID proyek harus diisi.',
|
||||||
|
'project_id.string' => 'ID proyek harus berupa teks.',
|
||||||
|
|
||||||
|
'project_type_id.required' => 'ID tipe proyek harus diisi.',
|
||||||
|
'project_type_id.string' => 'ID tipe proyek harus berupa teks.',
|
||||||
|
|
||||||
|
'nib.required' => 'NIB harus diisi.',
|
||||||
|
'nib.string' => 'NIB harus berupa teks.',
|
||||||
|
|
||||||
|
'business_name.required' => 'Nama usaha harus diisi.',
|
||||||
|
'business_name.string' => 'Nama usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'oss_publication_date.required' => 'Tanggal publikasi OSS harus diisi.',
|
||||||
|
|
||||||
|
'investment_status_description.required' => 'Deskripsi status investasi harus diisi.',
|
||||||
|
'investment_status_description.string' => 'Deskripsi status investasi harus berupa teks.',
|
||||||
|
|
||||||
|
'business_form.required' => 'Bentuk usaha harus diisi.',
|
||||||
|
'business_form.string' => 'Bentuk usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'project_risk.required' => 'Risiko proyek harus diisi.',
|
||||||
|
'project_risk.string' => 'Risiko proyek harus berupa teks.',
|
||||||
|
|
||||||
|
'project_name.required' => 'Nama proyek harus diisi.',
|
||||||
|
'project_name.string' => 'Nama proyek harus berupa teks.',
|
||||||
|
|
||||||
|
'business_scale.required' => 'Skala usaha harus diisi.',
|
||||||
|
'business_scale.string' => 'Skala usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'business_address.required' => 'Alamat usaha harus diisi.',
|
||||||
|
'business_address.string' => 'Alamat usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'district_name.required' => 'Nama kecamatan harus diisi.',
|
||||||
|
|
||||||
|
'village_name.required' => 'Nama desa harus diisi.',
|
||||||
|
|
||||||
|
'longitude.required' => 'Garis bujur harus diisi.',
|
||||||
|
'longitude.string' => 'Garis bujur harus berupa teks.',
|
||||||
|
|
||||||
|
'latitude.required' => 'Garis lintang harus diisi.',
|
||||||
|
'latitude.string' => 'Garis lintang harus berupa teks.',
|
||||||
|
|
||||||
|
'project_submission_date.required' => 'Tanggal pengajuan proyek harus diisi.',
|
||||||
|
|
||||||
|
'kbli.required' => 'Kode KBLI harus diisi.',
|
||||||
|
'kbli.string' => 'Kode KBLI harus berupa teks.',
|
||||||
|
|
||||||
|
'kbli_title.required' => 'Judul KBLI harus diisi.',
|
||||||
|
'kbli_title.string' => 'Judul KBLI harus berupa teks.',
|
||||||
|
|
||||||
|
'supervisory_sector.required' => 'Sektor pengawasan harus diisi.',
|
||||||
|
'supervisory_sector.string' => 'Sektor pengawasan harus berupa teks.',
|
||||||
|
|
||||||
|
'user_name.required' => 'Nama pengguna harus diisi.',
|
||||||
|
'user_name.string' => 'Nama pengguna harus berupa teks.',
|
||||||
|
|
||||||
|
'email.required' => 'Email harus diisi.',
|
||||||
|
'email.string' => 'Email harus berupa teks.',
|
||||||
|
|
||||||
|
'contact.required' => 'Kontak harus diisi.',
|
||||||
|
'contact.string' => 'Kontak harus berupa teks.',
|
||||||
|
|
||||||
|
'land_area_in_m2.required' => 'Luas lahan dalam m² harus diisi.',
|
||||||
|
'land_area_in_m2.string' => 'Luas lahan dalam m² harus berupa teks.',
|
||||||
|
|
||||||
|
'investment_amount.required' => 'Jumlah investasi harus diisi.',
|
||||||
|
'investment_amount.string' => 'Jumlah investasi harus berupa teks.',
|
||||||
|
|
||||||
|
'tki.required' => 'Jumlah tenaga kerja Indonesia harus diisi.',
|
||||||
|
'tki.string' => 'Jumlah tenaga kerja Indonesia harus berupa teks.',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
106
app/Http/Requests/UmkmRequest.php
Normal file
106
app/Http/Requests/UmkmRequest.php
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class UmkmRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'business_name' => 'required|string',
|
||||||
|
'business_address' => 'required|string',
|
||||||
|
'business_desc' => 'required|string',
|
||||||
|
'business_contact' => 'required|string',
|
||||||
|
'business_id_number' => 'string',
|
||||||
|
'business_scale_id' => 'required',
|
||||||
|
'owner_id' => 'required|string',
|
||||||
|
'owner_name' => 'required|string',
|
||||||
|
'owner_address' => 'required|string',
|
||||||
|
'owner_contact' => 'required|string',
|
||||||
|
'business_type' => 'required|string',
|
||||||
|
'business_form_id' => 'required|string',
|
||||||
|
'revenue' => 'required|numeric|between:0,999999999999999999.99',
|
||||||
|
'village_name' => 'required|string',
|
||||||
|
'district_name' => 'required',
|
||||||
|
'number_of_employee' => 'required',
|
||||||
|
'permit_status_id' => 'required',
|
||||||
|
'land_area' => 'required|integer|between:0,99999999999',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation messages for the request.
|
||||||
|
*
|
||||||
|
* @return array<string, string>
|
||||||
|
*/
|
||||||
|
public function messages(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'business_name.required' => 'Nama usaha wajib diisi.',
|
||||||
|
'business_name.string' => 'Nama usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'business_address.required' => 'Alamat usaha wajib diisi.',
|
||||||
|
'business_address.string' => 'Alamat usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'business_desc.required' => 'Deskripsi usaha wajib diisi.',
|
||||||
|
'business_desc.string' => 'Deskripsi usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'business_contact.required' => 'Kontak usaha wajib diisi.',
|
||||||
|
'business_contact.string' => 'Kontak usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'business_id_number.string' => 'Nomor ID usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'business_scale_id.required' => 'Skala usaha wajib diisi.',
|
||||||
|
|
||||||
|
'owner_id.required' => 'ID pemilik wajib diisi.',
|
||||||
|
'owner_id.string' => 'ID pemilik harus berupa teks.',
|
||||||
|
|
||||||
|
'owner_name.required' => 'Nama pemilik wajib diisi.',
|
||||||
|
'owner_name.string' => 'Nama pemilik harus berupa teks.',
|
||||||
|
|
||||||
|
'owner_address.required' => 'Alamat pemilik wajib diisi.',
|
||||||
|
'owner_address.string' => 'Alamat pemilik harus berupa teks.',
|
||||||
|
|
||||||
|
'owner_contact.required' => 'Kontak pemilik wajib diisi.',
|
||||||
|
'owner_contact.string' => 'Kontak pemilik harus berupa teks.',
|
||||||
|
|
||||||
|
'business_type.required' => 'Jenis usaha wajib diisi.',
|
||||||
|
'business_type.string' => 'Jenis usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'business_form.required' => 'Bentuk usaha wajib diisi.',
|
||||||
|
'business_form.string' => 'Bentuk usaha harus berupa teks.',
|
||||||
|
|
||||||
|
'revenue.required' => 'Omset wajib diisi.',
|
||||||
|
'revenue.numeric' => 'Omset harus berupa angka yang valid.',
|
||||||
|
'revenue.between' => 'Omset harus berada di antara 0 dan 9.999.999.999,99.',
|
||||||
|
|
||||||
|
'village_name.required' => 'Nama desa wajib diisi.',
|
||||||
|
'village_name.string' => 'Nama desa harus berupa teks.',
|
||||||
|
|
||||||
|
'district_name.required' => 'Nama distrik wajib diisi.',
|
||||||
|
|
||||||
|
'number_of_employee.required' => 'Jumlah karyawan wajib diisi.',
|
||||||
|
|
||||||
|
'permit_status_id.required' => 'Status izin wajib diisi.',
|
||||||
|
|
||||||
|
'land_area.required' => 'Luas lahan wajib diisi.',
|
||||||
|
'land_area.integer' => 'Luas lahan harus berupa angka bulat.',
|
||||||
|
'land_area.between' => 'Luas lahan harus berada di antara 0 dan 99.999.999.999.',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
43
app/Http/Requests/UsersRequest.php
Normal file
43
app/Http/Requests/UsersRequest.php
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
|
class UsersRequest 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
|
||||||
|
{
|
||||||
|
$userId = $this->route('users'); // Get user ID from route (used in update)
|
||||||
|
|
||||||
|
return [
|
||||||
|
'name' => ['required', 'string', 'max:255'],
|
||||||
|
'email' => [
|
||||||
|
'required',
|
||||||
|
'string',
|
||||||
|
'email',
|
||||||
|
'max:255',
|
||||||
|
Rule::unique('users')->ignore($userId)
|
||||||
|
],
|
||||||
|
'password' => [$this->isMethod('post') ? 'required' : 'nullable', 'confirmed', 'max:255'],
|
||||||
|
'firstname' => ['required', 'string', 'max:255'],
|
||||||
|
'lastname' => ['required', 'string', 'max:255'],
|
||||||
|
'position' => ['required', 'string', 'max:255'],
|
||||||
|
'role_id' => ['required', 'exists:roles,id'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
19
app/Http/Resources/AdvertisementResource.php
Normal file
19
app/Http/Resources/AdvertisementResource.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
app/Http/Resources/CustomersResource.php
Normal file
19
app/Http/Resources/CustomersResource.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Resources;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
|
class CustomersResource extends JsonResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function toArray(Request $request): array
|
||||||
|
{
|
||||||
|
return parent::toArray($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
app/Http/Resources/MenuResource.php
Normal file
19
app/Http/Resources/MenuResource.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Resources;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
|
class MenuResource extends JsonResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function toArray(Request $request): array
|
||||||
|
{
|
||||||
|
return parent::toArray($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
app/Http/Resources/SpatialPlanningResource.php
Normal file
19
app/Http/Resources/SpatialPlanningResource.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Resources;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
|
class SpatialPlanningResource extends JsonResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function toArray(Request $request): array
|
||||||
|
{
|
||||||
|
return parent::toArray($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
app/Http/Resources/SpatialPlanningsResource.php
Normal file
19
app/Http/Resources/SpatialPlanningsResource.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Resources;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
|
class SpatialPlanningsResource extends JsonResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function toArray(Request $request): array
|
||||||
|
{
|
||||||
|
return parent::toArray($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
app/Http/Resources/TourismResource.php
Normal file
19
app/Http/Resources/TourismResource.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Resources;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
|
class TourismResource extends JsonResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function toArray(Request $request): array
|
||||||
|
{
|
||||||
|
return parent::toArray($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
app/Http/Resources/UmkmResource.php
Normal file
19
app/Http/Resources/UmkmResource.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Resources;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
|
class UmkmResource extends JsonResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function toArray(Request $request): array
|
||||||
|
{
|
||||||
|
return parent::toArray($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@ class UserResource extends JsonResource
|
|||||||
'position' => $this->position,
|
'position' => $this->position,
|
||||||
'firstname' => $this->firstname,
|
'firstname' => $this->firstname,
|
||||||
'lastname' => $this->lastname,
|
'lastname' => $this->lastname,
|
||||||
|
'roles' => $this->roles->pluck('name'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
92
app/Imports/AdvertisementImport.php
Normal file
92
app/Imports/AdvertisementImport.php
Normal 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)
|
||||||
|
->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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
39
app/Imports/BusinessIndustriesImport.php
Normal file
39
app/Imports/BusinessIndustriesImport.php
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Imports;
|
||||||
|
|
||||||
|
use App\Models\BusinessOrIndustry;
|
||||||
|
use Maatwebsite\Excel\Concerns\ToModel;
|
||||||
|
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
|
class BusinessIndustriesImport implements ToCollection
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param array $row
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Database\Eloquent\Model|null
|
||||||
|
*/
|
||||||
|
public function collection(Collection $rows)
|
||||||
|
{
|
||||||
|
foreach ($rows->skip(1) as $row){
|
||||||
|
$clean_nop = preg_replace('/[^A-Za-z0-9]/', '', $row[2]);
|
||||||
|
if (!BusinessOrIndustry::where('nop', $clean_nop)->exists()) {
|
||||||
|
BusinessOrIndustry::create([
|
||||||
|
'nama_kecamatan' => $row[0],
|
||||||
|
'nama_kelurahan' => $row[1],
|
||||||
|
'nop' => $clean_nop, // Store cleaned 'nop'
|
||||||
|
'nama_wajib_pajak' => $row[3],
|
||||||
|
'alamat_wajib_pajak' => $row[4],
|
||||||
|
'alamat_objek_pajak' => $row[5],
|
||||||
|
'luas_bumi' => $row[6],
|
||||||
|
'luas_bangunan' => $row[7],
|
||||||
|
'njop_bumi' => $row[8],
|
||||||
|
'njop_bangunan' => $row[9],
|
||||||
|
'ketetapan' => $row[10],
|
||||||
|
'tahun_pajak' => $row[11],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
52
app/Imports/CustomersImport.php
Normal file
52
app/Imports/CustomersImport.php
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Imports;
|
||||||
|
|
||||||
|
use App\Models\Customer;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithLimit;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithChunkReading;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithHeadingRow;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithBatchInserts;
|
||||||
|
|
||||||
|
class CustomersImport implements ToCollection, WithMultipleSheets
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param Collection $collection
|
||||||
|
*/
|
||||||
|
public function collection(Collection $collection)
|
||||||
|
{
|
||||||
|
$batchData = [];
|
||||||
|
|
||||||
|
foreach ($collection->skip(1) as $row) {
|
||||||
|
if (!isset($row[0]) || empty($row[0])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$latitude = filter_var($row[4], FILTER_VALIDATE_FLOAT) ? bcadd($row[4], '0', 18) : null;
|
||||||
|
$longitude = filter_var($row[5], FILTER_VALIDATE_FLOAT) ? bcadd($row[5], '0', 18) : null;
|
||||||
|
|
||||||
|
$batchData[] = [
|
||||||
|
'nomor_pelanggan' => $row[0],
|
||||||
|
'kota_pelayanan' => $row[1],
|
||||||
|
'nama' => $row[2],
|
||||||
|
'alamat' => $row[3],
|
||||||
|
'latitude' => $latitude,
|
||||||
|
'longitude' => $longitude,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($batchData)) {
|
||||||
|
Customer::upsert($batchData, ['nomor_pelanggan'], ['kota_pelayanan', 'nama', 'alamat', 'latitude', 'longitude']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sheets(): array {
|
||||||
|
return [
|
||||||
|
0 => $this
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
63
app/Imports/SpatialPlanningImport.php
Normal file
63
app/Imports/SpatialPlanningImport.php
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Imports;
|
||||||
|
|
||||||
|
use App\Models\SpatialPlanning;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use DateTime;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
|
class SpatialPlanningImport implements ToCollection
|
||||||
|
{
|
||||||
|
protected static $processed = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process each row in the file
|
||||||
|
*/
|
||||||
|
public function collection(Collection $rows)
|
||||||
|
{
|
||||||
|
if (self::$processed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::$processed = true;
|
||||||
|
|
||||||
|
if ($rows->isEmpty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//cari header secara otomatis
|
||||||
|
$header = $rows->first();
|
||||||
|
$headerIndex = collect($header)->search(fn($value) => !empty($value));
|
||||||
|
|
||||||
|
// Pastikan header ditemukan
|
||||||
|
if ($headerIndex === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($rows->skip(1) as $row) {
|
||||||
|
$dateValue = trim($row[7]);
|
||||||
|
info($dateValue);
|
||||||
|
$parsedDate = Carbon::createFromFormat('Y-m-d', $dateValue)->format('Y-m-d');
|
||||||
|
info($parsedDate);
|
||||||
|
|
||||||
|
$dataToInsert[] = [
|
||||||
|
'name'=>$row[1],
|
||||||
|
'kbli'=>$row[2],
|
||||||
|
'activities'=>$row[3],
|
||||||
|
'area'=>$row[4],
|
||||||
|
'location'=>$row[5],
|
||||||
|
'number'=>$row[6],
|
||||||
|
'date'=>$parsedDate,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!empty($dataToInsert)) {
|
||||||
|
SpatialPlanning::insert($dataToInsert);
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
113
app/Imports/TourismImport.php
Normal file
113
app/Imports/TourismImport.php
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Imports;
|
||||||
|
|
||||||
|
use App\Models\Tourism;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use DateTime;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
|
class TourismImport implements ToCollection
|
||||||
|
{
|
||||||
|
protected static $processed = false;
|
||||||
|
/**
|
||||||
|
* Process each row in the file.
|
||||||
|
*/
|
||||||
|
public function collection(Collection $rows)
|
||||||
|
{
|
||||||
|
if (self::$processed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::$processed = true;
|
||||||
|
|
||||||
|
if ($rows->isEmpty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ambil data districts dengan normalisasi nama
|
||||||
|
$districts = DB::table('districts')
|
||||||
|
->get()
|
||||||
|
->mapWithKeys(function ($item) {
|
||||||
|
return [strtolower(trim($item->district_name)) => $item->district_code];
|
||||||
|
})
|
||||||
|
->toArray();
|
||||||
|
// Cari header secara otomatis
|
||||||
|
$header = $rows->first();
|
||||||
|
$headerIndex = collect($header)->search(fn($value) => !empty($value));
|
||||||
|
|
||||||
|
// Pastikan header ditemukan
|
||||||
|
if ($headerIndex === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($rows->skip(1) as $row) {
|
||||||
|
// Normalisasi nama kecamatan dan desa
|
||||||
|
$districtName = strtolower(trim(str_replace('Kecamatan', '', $row[12])));
|
||||||
|
$villageName = strtolower(trim($row[13]));
|
||||||
|
|
||||||
|
// Cari distric_code dari table districts
|
||||||
|
$districtCode = $districts[$districtName] ?? null;
|
||||||
|
|
||||||
|
$listTrueVillage = DB::table('villages')
|
||||||
|
->where('district_code', $districtCode)
|
||||||
|
->get()
|
||||||
|
->mapWithKeys(function ($item) {
|
||||||
|
return [strtolower(trim($item->village_name)) => [
|
||||||
|
'village_code' => $item->village_code,
|
||||||
|
'district_code' => $item->district_code
|
||||||
|
]];
|
||||||
|
})
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
// ambill village code yang village_name sama dengan $villageName
|
||||||
|
$villageCode = $listTrueVillage[$villageName]['village_code'] ?? '000000';
|
||||||
|
|
||||||
|
$excelSerialDate = $row[16];
|
||||||
|
if (is_numeric($excelSerialDate)) {
|
||||||
|
$projectSubmissionDate = Carbon::createFromFormat('Y-m-d', '1899-12-30')
|
||||||
|
->addDays($excelSerialDate)
|
||||||
|
->format('Y-m-d H:i:s');
|
||||||
|
} else {
|
||||||
|
$projectSubmissionDate = Carbon::createFromFormat('m/d/Y', $excelSerialDate)
|
||||||
|
->format('Y-m-d H:i:s');
|
||||||
|
}
|
||||||
|
|
||||||
|
$dataToInsert[] = [
|
||||||
|
'project_id' => $row[1],
|
||||||
|
'project_type_id' => $row[2],
|
||||||
|
'nib' => $row[3],
|
||||||
|
'business_name' => $row[4],
|
||||||
|
'oss_publication_date' => DateTime::createFromFormat('d/m/Y', $row[5]),
|
||||||
|
'investment_status_description' => $row[6],
|
||||||
|
'business_form' => $row[7],
|
||||||
|
'project_risk' => $row[8],
|
||||||
|
'project_name' => $row[9],
|
||||||
|
'business_scale' => $row[10],
|
||||||
|
'business_address' => $row[12],
|
||||||
|
'district_code' => $districtCode,
|
||||||
|
'village_code' => $villageCode,
|
||||||
|
'longitude' => $row[14],
|
||||||
|
'latitude' => (string) $row[15],
|
||||||
|
'project_submission_date' => $projectSubmissionDate,
|
||||||
|
'kbli'=> $row[17],
|
||||||
|
'kbli_title'=>$row[18],
|
||||||
|
'supervisory_sector'=>$row[19],
|
||||||
|
'user_name'=>$row[20],
|
||||||
|
'email'=>$row[21],
|
||||||
|
'contact'=>$row[22],
|
||||||
|
'land_area_in_m2'=>$row[23],
|
||||||
|
'investment_amount'=>$row[24],
|
||||||
|
'tki'=>$row[25]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!empty($dataToInsert)) {
|
||||||
|
Tourism::insert($dataToInsert);
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
98
app/Imports/UmkmImport.php
Normal file
98
app/Imports/UmkmImport.php
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Imports;
|
||||||
|
|
||||||
|
use App\Models\Umkm;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
class UmkmImport implements ToCollection
|
||||||
|
{
|
||||||
|
|
||||||
|
protected static $processed = false;
|
||||||
|
/**
|
||||||
|
* Process each row in the file.
|
||||||
|
*/
|
||||||
|
public function collection(Collection $rows)
|
||||||
|
{
|
||||||
|
if (self::$processed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::$processed = true;
|
||||||
|
|
||||||
|
if ($rows->isEmpty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ambil data districts dengan normalisasi nama
|
||||||
|
$districts = DB::table('districts')
|
||||||
|
->get()
|
||||||
|
->mapWithKeys(function ($item) {
|
||||||
|
return [strtolower(trim($item->district_name)) => $item->district_code];
|
||||||
|
})
|
||||||
|
->toArray();
|
||||||
|
// Cari header secara otomatis
|
||||||
|
$header = $rows->first();
|
||||||
|
$headerIndex = collect($header)->search(fn($value) => !empty($value));
|
||||||
|
|
||||||
|
// Pastikan header ditemukan
|
||||||
|
if ($headerIndex === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
info($rows);
|
||||||
|
|
||||||
|
foreach ($rows->skip(1) as $row) {
|
||||||
|
// Normalisasi nama kecamatan dan desa
|
||||||
|
$districtName = strtolower(trim(str_replace('Kecamatan', '', $row[14])));
|
||||||
|
$villageName = strtolower(trim($row[13]));
|
||||||
|
|
||||||
|
// Cari distric_code dari table districts
|
||||||
|
$districtCode = $districts[$districtName] ?? null;
|
||||||
|
|
||||||
|
$listTrueVillage = DB::table('villages')
|
||||||
|
->where('district_code', $districtCode)
|
||||||
|
->get()
|
||||||
|
->mapWithKeys(function ($item) {
|
||||||
|
return [strtolower(trim($item->village_name)) => [
|
||||||
|
'village_code' => $item->village_code,
|
||||||
|
'district_code' => $item->district_code
|
||||||
|
]];
|
||||||
|
})
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
// ambil village code yang village_name sama dengan $villageName
|
||||||
|
$villageCode = $listTrueVillage[$villageName]['village_code'] ?? '0000';
|
||||||
|
|
||||||
|
$dataToInsert[] = [
|
||||||
|
'business_name' => $row[0],
|
||||||
|
'business_address' => $row[1],
|
||||||
|
'business_desc' => $row[2],
|
||||||
|
'business_contact' => $row[3],
|
||||||
|
'business_id_number' => $row[4],
|
||||||
|
'business_scale_id' => $row[5],
|
||||||
|
'owner_id' => $row[6],
|
||||||
|
'owner_name' => $row[7],
|
||||||
|
'owner_address' => $row[8],
|
||||||
|
'owner_contact' => $row[9],
|
||||||
|
'business_type' => $row[10],
|
||||||
|
'business_form_id' => $row[11],
|
||||||
|
'revenue' => $row[12],
|
||||||
|
'village_code' => $villageCode,
|
||||||
|
'district_code' => $districtCode,
|
||||||
|
'number_of_employee' => $row[15],
|
||||||
|
'land_area' => $row[16],
|
||||||
|
'permit_status_id' => $row[17],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
info($dataToInsert);
|
||||||
|
if (!empty($dataToInsert)) {
|
||||||
|
Umkm::insert($dataToInsert);
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
46
app/Models/Advertisement.php
Normal file
46
app/Models/Advertisement.php
Normal 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'];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
125
app/Models/BigdataResume.php
Normal file
125
app/Models/BigdataResume.php
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
class BigdataResume extends Model
|
||||||
|
{
|
||||||
|
protected $table = "bigdata_resumes";
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'import_datasource_id',
|
||||||
|
'potention_count',
|
||||||
|
'potention_sum',
|
||||||
|
'non_verified_count',
|
||||||
|
'non_verified_sum',
|
||||||
|
'verified_count',
|
||||||
|
'verified_sum',
|
||||||
|
'business_count',
|
||||||
|
'business_sum',
|
||||||
|
'non_business_count',
|
||||||
|
'non_business_sum',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function importDatasource()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(ImportDatasource::class, 'import_datasource_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function generateResumeData($import_datasource_id){
|
||||||
|
$query_verified = once( function () {
|
||||||
|
return DB::table('pbg_task AS pt')
|
||||||
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
|
||||||
|
->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) = ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||||
|
->selectRaw('COUNT(pt.id) AS total_data,
|
||||||
|
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
||||||
|
->first();
|
||||||
|
});
|
||||||
|
|
||||||
|
$verified_count = $query_verified->total_data ?? 0;
|
||||||
|
$verified_total = $query_verified->total_retribution ?? 0;
|
||||||
|
|
||||||
|
$query_business = once(function () {
|
||||||
|
return DB::table('pbg_task AS pt')
|
||||||
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
|
||||||
|
->where(function ($query) {
|
||||||
|
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||||
|
->orWhereNull('ptgs.status_verifikasi');
|
||||||
|
})
|
||||||
|
->where(function ($query) {
|
||||||
|
$query->whereRaw('LOWER(TRIM(pt.function_type)) = ?', [strtolower(trim('Sebagai Tempat Usaha'))]);
|
||||||
|
})
|
||||||
|
->selectRaw('COUNT(pt.id) AS total_data,
|
||||||
|
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
||||||
|
->first();
|
||||||
|
});
|
||||||
|
|
||||||
|
$business_count = $query_business->total_data ?? 0;
|
||||||
|
$business_total = $query_business->total_retribution ?? 0;
|
||||||
|
|
||||||
|
$query_non_business = once( function () {
|
||||||
|
return DB::table('pbg_task AS pt')
|
||||||
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
|
||||||
|
->where(function ($query) {
|
||||||
|
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||||
|
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
|
||||||
|
})
|
||||||
|
->where(function ($query) {
|
||||||
|
$query->whereRaw('LOWER(TRIM(pt.function_type)) != ?', [strtolower(trim('Sebagai Tempat Usaha'))])
|
||||||
|
->orWhereNull('pt.function_type'); // Include NULL values
|
||||||
|
})
|
||||||
|
->selectRaw('COUNT(pt.id) AS total_data,
|
||||||
|
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
||||||
|
->first();
|
||||||
|
});
|
||||||
|
$non_business_count = $query_non_business->total_data ?? 0;
|
||||||
|
$non_business_total = $query_non_business->total_retribution ?? 0;
|
||||||
|
|
||||||
|
$query_non_verified = once(function () {
|
||||||
|
return DB::table('pbg_task AS pt')
|
||||||
|
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||||
|
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join tabel pbg_task_retributions
|
||||||
|
->where(function ($query) {
|
||||||
|
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||||
|
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
|
||||||
|
})
|
||||||
|
->selectRaw('COUNT(pt.id) AS total_data,
|
||||||
|
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
||||||
|
->first();
|
||||||
|
});
|
||||||
|
|
||||||
|
$non_verified_count = $query_non_verified->total_data ?? 0;
|
||||||
|
$non_verified_total = $query_non_verified->total_retribution ?? 0;
|
||||||
|
|
||||||
|
$query_potention = once( function () {
|
||||||
|
return DB::table('pbg_task as pt')
|
||||||
|
->leftJoin('pbg_task_retributions as ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
|
||||||
|
->select(
|
||||||
|
DB::raw('COUNT(DISTINCT pt.id) as task_count'),
|
||||||
|
DB::raw('SUM(ptr.nilai_retribusi_bangunan) as total_retribution')
|
||||||
|
)
|
||||||
|
->first();
|
||||||
|
});
|
||||||
|
$potention_count = $query_potention->task_count ?? 0;
|
||||||
|
$potention_total = $query_potention->total_retribution ?? 0;
|
||||||
|
|
||||||
|
return self::create([
|
||||||
|
'import_datasource_id' => $import_datasource_id,
|
||||||
|
'potention_count' => $potention_count ?? 0,
|
||||||
|
'potention_sum' => $potention_total ?? 0.00,
|
||||||
|
'non_verified_count' => $non_verified_count ?? 0,
|
||||||
|
'non_verified_sum' => $non_verified_total ?? 0.00,
|
||||||
|
'verified_count' => $verified_count ?? 0,
|
||||||
|
'verified_sum' => $verified_total ?? 0.00,
|
||||||
|
'business_count' => $business_count ?? 0,
|
||||||
|
'business_sum' => $business_total ?? 0.00,
|
||||||
|
'non_business_count' => $non_business_count ?? 0,
|
||||||
|
'non_business_sum' => $non_business_total ?? 0.00,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
24
app/Models/BusinessOrIndustry.php
Normal file
24
app/Models/BusinessOrIndustry.php
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class BusinessOrIndustry extends Model
|
||||||
|
{
|
||||||
|
protected $table = "business_or_industries";
|
||||||
|
protected $fillable = [
|
||||||
|
'nama_kecamatan',
|
||||||
|
'nama_kelurahan',
|
||||||
|
'nop',
|
||||||
|
'nama_wajib_pajak',
|
||||||
|
'alamat_wajib_pajak',
|
||||||
|
'alamat_objek_pajak',
|
||||||
|
'luas_bumi',
|
||||||
|
'luas_bangunan',
|
||||||
|
'njop_bumi',
|
||||||
|
'njop_bangunan',
|
||||||
|
'ketetapan',
|
||||||
|
'tahun_pajak',
|
||||||
|
];
|
||||||
|
}
|
||||||
20
app/Models/Customer.php
Normal file
20
app/Models/Customer.php
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Customer extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'customers';
|
||||||
|
protected $fillable = [
|
||||||
|
'nomor_pelanggan',
|
||||||
|
'kota_pelayanan',
|
||||||
|
'nama',
|
||||||
|
'alamat',
|
||||||
|
'latitude',
|
||||||
|
'longitude',
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
25
app/Models/Menu.php
Normal file
25
app/Models/Menu.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Menu extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'menus';
|
||||||
|
protected $fillable = [
|
||||||
|
'name',
|
||||||
|
'url',
|
||||||
|
'icon',
|
||||||
|
'parent_id',
|
||||||
|
'sort_order'
|
||||||
|
];
|
||||||
|
|
||||||
|
public function roles(){
|
||||||
|
return $this->belongsToMany(Role::class, 'role_menu')->withTimestamps();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function children(){
|
||||||
|
return $this->hasMany(Menu::class,'parent_id');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,7 +30,11 @@ class PbgTask extends Model
|
|||||||
'task_created_at'
|
'task_created_at'
|
||||||
];
|
];
|
||||||
|
|
||||||
public function retributions(){
|
public function pbg_task_retributions(){
|
||||||
return $this->hasOne(PbgTaskRetributions::class, 'pbg_task_uid', 'uuid');
|
return $this->hasOne(PbgTaskRetributions::class, 'pbg_task_uid', 'uuid');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function pbg_task_index_integrations(){
|
||||||
|
return $this->hasOne(PbgTaskIndexIntegrations::class, 'pbg_task_uid', 'uuid');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,4 +21,8 @@ class PbgTaskIndexIntegrations extends Model
|
|||||||
'indeks_terintegrasi',
|
'indeks_terintegrasi',
|
||||||
'total',
|
'total',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function pbg_task(){
|
||||||
|
return $this->belongsTo(PbgTask::class, 'pbg_task_uid', 'uuid');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,5 +20,10 @@ class PbgTaskPrasarana extends Model
|
|||||||
'quantity',
|
'quantity',
|
||||||
'unit',
|
'unit',
|
||||||
'index_prasarana',
|
'index_prasarana',
|
||||||
|
'pbg_task_retribution_id'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function pbg_task_retributions(){
|
||||||
|
return $this->hasMany(PbgTaskRetributions::class, 'pbg_task_retribution_id', 'id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,11 @@ class PbgTaskRetributions extends Model
|
|||||||
'pbg_task_uid'
|
'pbg_task_uid'
|
||||||
];
|
];
|
||||||
|
|
||||||
public function task(){
|
public function pbg_task(){
|
||||||
return $this->belongsTo(PbgTask::class, 'pbg_task_uid', 'uuid');
|
return $this->belongsTo(PbgTask::class, 'pbg_task_uid', 'uuid');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function pbg_task_prasarana(){
|
||||||
|
return $this->hasMany(PbgTaskPrasarana::class, 'pbg_task_retribution_id', 'id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
22
app/Models/Role.php
Normal file
22
app/Models/Role.php
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Role extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'roles';
|
||||||
|
protected $fillable = [
|
||||||
|
'name',
|
||||||
|
'description'
|
||||||
|
];
|
||||||
|
|
||||||
|
public function users(){
|
||||||
|
return $this->belongsToMany(User::class,'user_role')->withTimestamps();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function menus(){
|
||||||
|
return $this->belongsToMany(Menu::class,'role_menu')->withTimestamps();
|
||||||
|
}
|
||||||
|
}
|
||||||
30
app/Models/RoleMenu.php
Normal file
30
app/Models/RoleMenu.php
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class RoleMenu extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'role_menu';
|
||||||
|
protected $primary = ['role_id', 'menu_id'];
|
||||||
|
public $incrementing = false;
|
||||||
|
protected $fillable = [
|
||||||
|
'role_id',
|
||||||
|
'menu_id',
|
||||||
|
'allow_show',
|
||||||
|
'allow_create',
|
||||||
|
'allow_update',
|
||||||
|
'allow_destroy',
|
||||||
|
];
|
||||||
|
|
||||||
|
public $timestamps = true;
|
||||||
|
|
||||||
|
public function role(){
|
||||||
|
return $this->belongsTo(Role::class, 'role_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function menu(){
|
||||||
|
return $this->belongsTo(Menu::class,'menu_id');
|
||||||
|
}
|
||||||
|
}
|
||||||
37
app/Models/SpatialPlanning.php
Normal file
37
app/Models/SpatialPlanning.php
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class SpatialPlanning
|
||||||
|
*
|
||||||
|
* @property $id
|
||||||
|
* @property $created_at
|
||||||
|
* @property $updated_at
|
||||||
|
* @property $name
|
||||||
|
* @property $kbli
|
||||||
|
* @property $activities
|
||||||
|
* @property $area
|
||||||
|
* @property $location
|
||||||
|
* @property $number
|
||||||
|
* @property $date
|
||||||
|
*
|
||||||
|
* @package App
|
||||||
|
* @mixin \Illuminate\Database\Eloquent\Builder
|
||||||
|
*/
|
||||||
|
class SpatialPlanning extends Model
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $perPage = 20;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The attributes that are mass assignable.
|
||||||
|
*
|
||||||
|
* @var array<int, string>
|
||||||
|
*/
|
||||||
|
protected $fillable = ['name', 'kbli', 'activities', 'area', 'location', 'number', 'date'];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
55
app/Models/Tourism.php
Normal file
55
app/Models/Tourism.php
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Tourism
|
||||||
|
*
|
||||||
|
* @property $id
|
||||||
|
* @property $created_at
|
||||||
|
* @property $updated_at
|
||||||
|
* @property $project_id
|
||||||
|
* @property $project_type_id
|
||||||
|
* @property $nib
|
||||||
|
* @property $business_name
|
||||||
|
* @property $oss_publication_date
|
||||||
|
* @property $investment_status_description
|
||||||
|
* @property $business_form
|
||||||
|
* @property $project_risk
|
||||||
|
* @property $project_name
|
||||||
|
* @property $business_scale
|
||||||
|
* @property $business_address
|
||||||
|
* @property $district_code
|
||||||
|
* @property $village_code
|
||||||
|
* @property $longitude
|
||||||
|
* @property $latitude
|
||||||
|
* @property $project_submission_date
|
||||||
|
* @property $kbli
|
||||||
|
* @property $kbli_title
|
||||||
|
* @property $supervisory_sector
|
||||||
|
* @property $user_name
|
||||||
|
* @property $email
|
||||||
|
* @property $contact
|
||||||
|
* @property $land_area_in_m2
|
||||||
|
* @property $investment_amount
|
||||||
|
* @property $tki
|
||||||
|
*
|
||||||
|
* @package App
|
||||||
|
* @mixin \Illuminate\Database\Eloquent\Builder
|
||||||
|
*/
|
||||||
|
class Tourism extends Model
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $perPage = 20;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The attributes that are mass assignable.
|
||||||
|
*
|
||||||
|
* @var array<int, string>
|
||||||
|
*/
|
||||||
|
protected $fillable = ['project_id', 'project_type_id', 'nib', 'business_name', 'oss_publication_date', 'investment_status_description', 'business_form', 'project_risk', 'project_name', 'business_scale', 'business_address', 'district_code', 'village_code', 'longitude', 'latitude', 'project_submission_date', 'kbli', 'kbli_title', 'supervisory_sector', 'user_name', 'email', 'contact', 'land_area_in_m2', 'investment_amount', 'tki'];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
14
app/Models/TourismBasedKBLI.php
Normal file
14
app/Models/TourismBasedKBLI.php
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class TourismBasedKBLI extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'v_tourisms_based_kbli';
|
||||||
|
protected $primaryKey = null;
|
||||||
|
|
||||||
|
public $timestamps = false;
|
||||||
|
protected $fillable = ['kbli_title', 'total_records'];
|
||||||
|
}
|
||||||
48
app/Models/Umkm.php
Normal file
48
app/Models/Umkm.php
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Umkm
|
||||||
|
*
|
||||||
|
* @property $id
|
||||||
|
* @property $created_at
|
||||||
|
* @property $updated_at
|
||||||
|
* @property $business_name
|
||||||
|
* @property $business_address
|
||||||
|
* @property $business_desc
|
||||||
|
* @property $business_contact
|
||||||
|
* @property $business_id_number
|
||||||
|
* @property $business_scale_id
|
||||||
|
* @property $owner_id
|
||||||
|
* @property $owner_name
|
||||||
|
* @property $owner_address
|
||||||
|
* @property $owner_contact
|
||||||
|
* @property $business_type
|
||||||
|
* @property $business_form_id
|
||||||
|
* @property $revenue
|
||||||
|
* @property $village_code
|
||||||
|
* @property $distric_code
|
||||||
|
* @property $number_of_employee
|
||||||
|
* @property $land_area
|
||||||
|
* @property $permit_status_id
|
||||||
|
*
|
||||||
|
* @package App
|
||||||
|
* @mixin \Illuminate\Database\Eloquent\Builder
|
||||||
|
*/
|
||||||
|
class Umkm extends Model
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $perPage = 20;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The attributes that are mass assignable.
|
||||||
|
*
|
||||||
|
* @var array<int, string>
|
||||||
|
*/
|
||||||
|
protected $fillable = ['business_name', 'business_address', 'business_desc', 'business_contact', 'business_id_number', 'business_scale_id', 'owner_id', 'owner_name', 'owner_address', 'owner_contact', 'business_type', 'business_form_id', 'revenue', 'village_code', 'district_code', 'number_of_employee', 'land_area', 'permit_status_id'];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -49,4 +49,8 @@ class User extends Authenticatable
|
|||||||
'password' => 'hashed',
|
'password' => 'hashed',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function roles(){
|
||||||
|
return $this->belongsToMany(Role::class, 'user_role')->withTimestamps();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,11 @@
|
|||||||
|
|
||||||
namespace App\Providers;
|
namespace App\Providers;
|
||||||
|
|
||||||
|
use App\Models\Menu;
|
||||||
use App\View\Components\Circle;
|
use App\View\Components\Circle;
|
||||||
|
use Auth;
|
||||||
use Illuminate\Support\Facades\Blade;
|
use Illuminate\Support\Facades\Blade;
|
||||||
|
use Illuminate\Support\Facades\View;
|
||||||
use Illuminate\Support\ServiceProvider;
|
use Illuminate\Support\ServiceProvider;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
|
||||||
@@ -23,5 +26,26 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
public function boot(): void
|
public function boot(): void
|
||||||
{
|
{
|
||||||
Blade::component('circle', Circle::class);
|
Blade::component('circle', Circle::class);
|
||||||
|
|
||||||
|
View::composer('layouts.partials.sidebar', function ($view){
|
||||||
|
$user = Auth::user();
|
||||||
|
|
||||||
|
if($user){
|
||||||
|
$menus = Menu::whereHas('roles', function ($query) use ($user){
|
||||||
|
$query->where('roles.id', $user->roles->pluck('id'));
|
||||||
|
})
|
||||||
|
->with(['children' => function ($query) {
|
||||||
|
$query->whereHas('roles', function ($subQuery) {
|
||||||
|
$subQuery->where('role_menu.allow_show', 1);
|
||||||
|
});
|
||||||
|
}])
|
||||||
|
->orderBy('sort_order', 'asc')
|
||||||
|
->get();
|
||||||
|
}else{
|
||||||
|
$menus = collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
$view->with('menus', $menus);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,301 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App;
|
|
||||||
|
|
||||||
use App\Enums\ImportDatasourceStatus;
|
|
||||||
use App\Models\GlobalSetting;
|
|
||||||
use App\Models\ImportDatasource;
|
|
||||||
use App\Models\PbgTaskIndexIntegrations;
|
|
||||||
use App\Models\PbgTaskPrasarana;
|
|
||||||
use App\Models\PbgTaskRetributions;
|
|
||||||
use Exception;
|
|
||||||
use App\Models\PbgTask;
|
|
||||||
use App\Traits\GlobalApiResponse;
|
|
||||||
use Illuminate\Support\Facades\Log;
|
|
||||||
use Carbon\Carbon;
|
|
||||||
|
|
||||||
class ServiceSIMBG
|
|
||||||
{
|
|
||||||
use GlobalApiResponse;
|
|
||||||
private $email;
|
|
||||||
private $password;
|
|
||||||
private $simbg_host;
|
|
||||||
private $fetch_per_page;
|
|
||||||
/**
|
|
||||||
* Create a new class instance.
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->email = trim((string) GlobalSetting::where('key','SIMBG_EMAIL')->first()->value);
|
|
||||||
$this->password = trim((string) GlobalSetting::where('key','SIMBG_PASSWORD')->first()->value);
|
|
||||||
$this->simbg_host = trim((string)GlobalSetting::where('key','SIMBG_HOST')->first()->value);
|
|
||||||
$this->fetch_per_page = trim((string)GlobalSetting::where('key','FETCH_PER_PAGE')->first()->value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getToken(){
|
|
||||||
$clientHelper = new ServiceClient($this->simbg_host);
|
|
||||||
$url = "/api/user/v1/auth/login/";
|
|
||||||
$body = [
|
|
||||||
'email' => $this->email,
|
|
||||||
'password' => $this->password,
|
|
||||||
];
|
|
||||||
|
|
||||||
$res = $clientHelper->post($url, $body);
|
|
||||||
if(!$res->original['success']){
|
|
||||||
Log::error("Token not retrieved ", ['response' => $res]);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function syncIndexIntegration($uuid, $token)
|
|
||||||
{
|
|
||||||
$clientHelper = new ServiceClient($this->simbg_host);
|
|
||||||
$url = "/api/pbg/v1/detail/" . $uuid . "/retribution/indeks-terintegrasi/";
|
|
||||||
|
|
||||||
$headers = [
|
|
||||||
'Authorization' => "Bearer " . $token,
|
|
||||||
];
|
|
||||||
|
|
||||||
$res = $clientHelper->get($url, $headers);
|
|
||||||
|
|
||||||
Log::info("response index integration", ['res' => $res]);
|
|
||||||
|
|
||||||
if (empty($res->original['success']) || !$res->original['success']) {
|
|
||||||
// Log error
|
|
||||||
Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = $res->original['data']['data'] ?? null;
|
|
||||||
if (!$data) {
|
|
||||||
Log::error("No valid data returned from API", ['url' => $url, 'uuid' => $uuid]);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$resultData = PbgTaskIndexIntegrations::updateOrCreate(
|
|
||||||
['pbg_task_uid' => $uuid],
|
|
||||||
[
|
|
||||||
'indeks_fungsi_bangunan' => $data['indeks_fungsi_bangunan'] ?? null,
|
|
||||||
'indeks_parameter_kompleksitas' => $data['indeks_parameter_kompleksitas'] ?? null,
|
|
||||||
'indeks_parameter_permanensi' => $data['indeks_parameter_permanensi'] ?? null,
|
|
||||||
'indeks_parameter_ketinggian' => $data['indeks_parameter_ketinggian'] ?? null,
|
|
||||||
'faktor_kepemilikan' => $data['faktor_kepemilikan'] ?? null,
|
|
||||||
'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null,
|
|
||||||
'total' => $data['total'] ?? null,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
// Log success
|
|
||||||
if ($resultData->wasRecentlyCreated) {
|
|
||||||
Log::info("integration created successfully", ['uuid' => $uuid]);
|
|
||||||
} else {
|
|
||||||
Log::info("integration updated successfully", ['uuid' => $uuid]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function syncTaskList()
|
|
||||||
{
|
|
||||||
$clientHelper = new ServiceClient($this->simbg_host);
|
|
||||||
$initResToken = $this->getToken();
|
|
||||||
|
|
||||||
$importDatasource = ImportDatasource::create([
|
|
||||||
'status' => ImportDatasourceStatus::Processing->value,
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (empty($initResToken->original['data']['token']['access'])) {
|
|
||||||
$importDatasource->update([
|
|
||||||
'status' => ImportDatasourceStatus::Failed->value,
|
|
||||||
'message' => 'Failed to retrieve token'
|
|
||||||
]);
|
|
||||||
return $this->resError("Failed to retrieve token");
|
|
||||||
}
|
|
||||||
|
|
||||||
$apiToken = $initResToken->original['data']['token']['access'];
|
|
||||||
$headers = ['Authorization' => "Bearer " . $apiToken];
|
|
||||||
|
|
||||||
$url = "/api/pbg/v1/list/?page=1&size={$this->fetch_per_page}&sort=ASC";
|
|
||||||
$initialResponse = $clientHelper->get($url, $headers);
|
|
||||||
|
|
||||||
$totalPage = $initialResponse->original['data']['total_page'] ?? 0;
|
|
||||||
if ($totalPage == 0) {
|
|
||||||
$importDatasource->update([
|
|
||||||
'status' => ImportDatasourceStatus::Failed->value,
|
|
||||||
'message' => 'Invalid response: no total_page'
|
|
||||||
]);
|
|
||||||
return $this->resError("Invalid response from API");
|
|
||||||
}
|
|
||||||
|
|
||||||
$savedCount = $failedCount = 0;
|
|
||||||
|
|
||||||
for ($currentPage = 50; $currentPage <= $totalPage; $currentPage++) {
|
|
||||||
$pageUrl = "/api/pbg/v1/list/?page={$currentPage}&size={$this->fetch_per_page}&sort=ASC";
|
|
||||||
$getToken = $this->getToken();
|
|
||||||
Log::info("response index integration", ['currentPage' => $currentPage]);
|
|
||||||
if (empty($getToken->original['data']['token']['access'])) {
|
|
||||||
$importDatasource->update([
|
|
||||||
'status' => ImportDatasourceStatus::Failed->value,
|
|
||||||
'message' => 'Failed to retrieve token'
|
|
||||||
]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$token = $getToken->original['data']['token']['access'];
|
|
||||||
$headers = ['Authorization' => "Bearer " . $token];
|
|
||||||
$response = $clientHelper->get($pageUrl, $headers);
|
|
||||||
$tasks = $response->original['data']['data'] ?? [];
|
|
||||||
|
|
||||||
if (empty($tasks)) {
|
|
||||||
$importDatasource->update([
|
|
||||||
'status' => ImportDatasourceStatus::Failed->value,
|
|
||||||
'message' => 'No data found on page'
|
|
||||||
]);
|
|
||||||
Log::warning("No data found on page", ['page' => $currentPage]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log::info("executed page", ['page' => $currentPage, 'total' => $totalPage]);
|
|
||||||
|
|
||||||
$tasksCollective = [];
|
|
||||||
foreach ($tasks as $item) {
|
|
||||||
try {
|
|
||||||
$tasksCollective[] = [
|
|
||||||
'uuid' => $item['uid'],
|
|
||||||
'name' => $item['name'],
|
|
||||||
'owner_name' => $item['owner_name'],
|
|
||||||
'application_type' => $item['application_type'],
|
|
||||||
'application_type_name' => $item['application_type_name'],
|
|
||||||
'condition' => $item['condition'],
|
|
||||||
'registration_number' => $item['registration_number'],
|
|
||||||
'document_number' => $item['document_number'],
|
|
||||||
'address' => $item['address'],
|
|
||||||
'status' => $item['status'],
|
|
||||||
'status_name' => $item['status_name'],
|
|
||||||
'slf_status' => $item['slf_status'] ?? null,
|
|
||||||
'slf_status_name' => $item['slf_status_name'] ?? null,
|
|
||||||
'function_type' => $item['function_type'],
|
|
||||||
'consultation_type' => $item['consultation_type'],
|
|
||||||
'due_date' => $item['due_date'],
|
|
||||||
'land_certificate_phase' => $item['land_certificate_phase'],
|
|
||||||
'task_created_at' => isset($item['created_at']) ? Carbon::parse($item['created_at'])->format('Y-m-d H:i:s') : null,
|
|
||||||
'updated_at' => now(),
|
|
||||||
'created_at' => now(),
|
|
||||||
];
|
|
||||||
|
|
||||||
$this->syncIndexIntegration($item['uid'], $token);
|
|
||||||
$this->syncTaskDetailSubmit($item['uid'], $token);
|
|
||||||
$savedCount++;
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$failedCount++;
|
|
||||||
$importDatasource->update([
|
|
||||||
'status' => ImportDatasourceStatus::Failed->value,
|
|
||||||
'message' => "Successfully processed: $savedCount, Failed: $failedCount"
|
|
||||||
]);
|
|
||||||
Log::error("Failed to process task", [
|
|
||||||
'error' => $e->getMessage(),
|
|
||||||
'task' => $item,
|
|
||||||
]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PbgTask::upsert($tasksCollective, ['uuid'], [
|
|
||||||
'name', 'owner_name', 'application_type', 'application_type_name', 'condition',
|
|
||||||
'registration_number', 'document_number', 'address', 'status', 'status_name',
|
|
||||||
'slf_status', 'slf_status_name', 'function_type', 'consultation_type', 'due_date',
|
|
||||||
'land_certificate_phase', 'task_created_at', 'updated_at'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$importDatasource->update([
|
|
||||||
'status' => ImportDatasourceStatus::Success->value,
|
|
||||||
'message' => "Successfully processed: $savedCount, Failed: $failedCount"
|
|
||||||
]);
|
|
||||||
|
|
||||||
Log::info("syncTaskList completed", ['savedCount' => $savedCount, 'failedCount' => $failedCount]);
|
|
||||||
|
|
||||||
return $this->resSuccess(['savedCount' => $savedCount, 'failedCount' => $failedCount]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function syncTaskDetailSubmit($uuid, $token)
|
|
||||||
{
|
|
||||||
$clientHelper = new ServiceClient($this->simbg_host);
|
|
||||||
|
|
||||||
$url = "/api/pbg/v1/detail/" . $uuid . "/retribution/submit/";
|
|
||||||
$headers = [
|
|
||||||
'Authorization' => "Bearer " . $token,
|
|
||||||
];
|
|
||||||
|
|
||||||
$res = $clientHelper->get($url, $headers);
|
|
||||||
|
|
||||||
Log::info("response task detail submit", ['res' => $res]);
|
|
||||||
|
|
||||||
if (empty($res->original['success']) || !$res->original['success']) {
|
|
||||||
// Log error
|
|
||||||
Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = $res->original['data']['data'] ?? [];
|
|
||||||
if (empty($data)) {
|
|
||||||
Log::error("No data returned from API", ['url' => $url, 'uuid' => $uuid]);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$detailCreatedAt = isset($data['created_at'])
|
|
||||||
? Carbon::parse($data['created_at'])->format('Y-m-d H:i:s')
|
|
||||||
: null;
|
|
||||||
|
|
||||||
$detailUpdatedAt = isset($data['updated_at'])
|
|
||||||
? Carbon::parse($data['updated_at'])->format('Y-m-d H:i:s')
|
|
||||||
: null;
|
|
||||||
|
|
||||||
PbgTaskRetributions::updateOrCreate(
|
|
||||||
['detail_id' => $data['id']],
|
|
||||||
[
|
|
||||||
'detail_uid' => $data['uid'] ?? null,
|
|
||||||
'detail_created_at' => $detailCreatedAt ?? null,
|
|
||||||
'detail_updated_at' => $detailUpdatedAt ?? null,
|
|
||||||
'luas_bangunan' => $data['luas_bangunan'] ?? null,
|
|
||||||
'indeks_lokalitas' => $data['indeks_lokalitas'] ?? null,
|
|
||||||
'wilayah_shst' => $data['wilayah_shst'] ?? null,
|
|
||||||
'kegiatan_id' => $data['kegiatan']['id'] ?? null,
|
|
||||||
'kegiatan_name' => $data['kegiatan']['name'] ?? null,
|
|
||||||
'nilai_shst' => $data['nilai_shst'] ?? null,
|
|
||||||
'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null,
|
|
||||||
'indeks_bg_terbangun' => $data['indeks_bg_terbangun'] ?? null,
|
|
||||||
'nilai_retribusi_bangunan' => $data['nilai_retribusi_bangunan'] ?? null,
|
|
||||||
'nilai_prasarana' => $data['nilai_prasarana'] ?? null,
|
|
||||||
'created_by' => $data['created_by'] ?? null,
|
|
||||||
'pbg_document' => $data['pbg_document'] ?? null,
|
|
||||||
'underpayment' => $data['underpayment'] ?? null,
|
|
||||||
'skrd_amount' => $data['skrd_amount'] ?? null,
|
|
||||||
'pbg_task_uid' => $uuid,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
$prasaranaData = $data['prasarana'] ?? [];
|
|
||||||
if (!empty($prasaranaData)) {
|
|
||||||
$insertData = array_map(fn($item) => [
|
|
||||||
'pbg_task_uid' => $uuid,
|
|
||||||
'prasarana_id' => $item['id'] ?? null,
|
|
||||||
'prasarana_type' => $item['prasarana_type'] ?? null,
|
|
||||||
'building_type' => $item['building_type'] ?? null,
|
|
||||||
'total' => $item['total'] ?? null,
|
|
||||||
'quantity' => $item['quantity'] ?? null,
|
|
||||||
'unit' => $item['unit'] ?? null,
|
|
||||||
'index_prasarana' => $item['index_prasarana'] ?? null,
|
|
||||||
], $prasaranaData);
|
|
||||||
|
|
||||||
// Use bulk insert or upsert for faster database operation
|
|
||||||
PbgTaskPrasarana::upsert($insertData, ['pbg_task_uid', 'prasarana_id']);
|
|
||||||
}
|
|
||||||
|
|
||||||
Log::info("retribution and prasarana successfully", ['uuid' => $uuid]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -34,51 +34,59 @@ class GoogleSheetService
|
|||||||
|
|
||||||
public function getLastRowByColumn($column = "A")
|
public function getLastRowByColumn($column = "A")
|
||||||
{
|
{
|
||||||
// Ambil spreadsheet
|
try{
|
||||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
// Ambil spreadsheet
|
||||||
$sheets = $spreadsheet->getSheets();
|
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||||
|
$sheets = $spreadsheet->getSheets();
|
||||||
|
|
||||||
if (!empty($sheets)) {
|
if (!empty($sheets)) {
|
||||||
// Ambil nama sheet pertama dengan benar
|
// Ambil nama sheet pertama dengan benar
|
||||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||||
|
|
||||||
// ✅ Format range harus benar!
|
// ✅ Format range harus benar!
|
||||||
$range = "{$firstSheetTitle}!{$column}:{$column}";
|
$range = "{$firstSheetTitle}!{$column}:{$column}";
|
||||||
|
|
||||||
// Ambil data dari kolom yang diminta
|
// Ambil data dari kolom yang diminta
|
||||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||||
$values = $response->getValues();
|
$values = $response->getValues();
|
||||||
|
|
||||||
// Cek nilai terakhir yang tidak kosong
|
// Cek nilai terakhir yang tidak kosong
|
||||||
$lastRow = 0;
|
$lastRow = 0;
|
||||||
if (!empty($values)) {
|
if (!empty($values)) {
|
||||||
foreach ($values as $index => $row) {
|
foreach ($values as $index => $row) {
|
||||||
if (!empty($row[0])) { // Jika ada data, update lastRow
|
if (!empty($row[0])) { // Jika ada data, update lastRow
|
||||||
$lastRow = $index + 1;
|
$lastRow = $index + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $lastRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $lastRow;
|
return 0;
|
||||||
|
}catch(\Exception $e){
|
||||||
|
throw $e;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
public function getHeader()
|
public function getHeader()
|
||||||
{
|
{
|
||||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
try{
|
||||||
$sheets = $spreadsheet->getSheets();
|
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||||
|
$sheets = $spreadsheet->getSheets();
|
||||||
|
|
||||||
// Ambil nama sheet pertama
|
// Ambil nama sheet pertama
|
||||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||||
|
|
||||||
// Ambil data dari baris pertama (header)
|
// Ambil data dari baris pertama (header)
|
||||||
$range = "{$firstSheetTitle}!1:1";
|
$range = "{$firstSheetTitle}!1:1";
|
||||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||||
$values = $response->getValues();
|
$values = $response->getValues();
|
||||||
|
|
||||||
// Kembalikan header (baris pertama)
|
// Kembalikan header (baris pertama)
|
||||||
return !empty($values) ? $values[0] : [];
|
return !empty($values) ? $values[0] : [];
|
||||||
|
}catch(\Exception $e){
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLastColumn()
|
public function getLastColumn()
|
||||||
@@ -99,33 +107,46 @@ class GoogleSheetService
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function getSheetDataCollection($totalRow = 10){
|
public function getSheetDataCollection($totalRow = 10){
|
||||||
|
try{
|
||||||
|
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||||
|
$sheets = $spreadsheet->getSheets();
|
||||||
|
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||||
|
|
||||||
|
$header = $this->getHeader();
|
||||||
|
$header = array_map(function($columnHeader) {
|
||||||
|
// Trim spaces first, then replace non-alphanumeric characters with underscores
|
||||||
|
$columnHeader = trim($columnHeader);
|
||||||
|
return strtolower(preg_replace('/[^A-Za-z0-9_]/', '_', $columnHeader));
|
||||||
|
}, $header);
|
||||||
|
$range = "{$firstSheetTitle}!2:{$totalRow}";
|
||||||
|
|
||||||
|
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||||
|
$values = $response->getValues();
|
||||||
|
|
||||||
|
$mappedData = [];
|
||||||
|
if (!empty($values)) {
|
||||||
|
foreach ($values as $row) {
|
||||||
|
$rowData = [];
|
||||||
|
foreach ($header as $index => $columnHeader) {
|
||||||
|
// Map header to the corresponding value from the row
|
||||||
|
$rowData[$columnHeader] = isset($row[$index]) ? $row[$index] : null;
|
||||||
|
}
|
||||||
|
$mappedData[] = $rowData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $mappedData;
|
||||||
|
}catch(\Exception $e){
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function get_data_by_sheet($no_sheet = 1){
|
||||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||||
$sheets = $spreadsheet->getSheets();
|
$sheets = $spreadsheet->getSheets();
|
||||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
$sheetTitle = $sheets[$no_sheet]->getProperties()->getTitle();
|
||||||
|
$range = "{$sheetTitle}";
|
||||||
$header = $this->getHeader();
|
|
||||||
$header = array_map(function($columnHeader) {
|
|
||||||
// Trim spaces first, then replace non-alphanumeric characters with underscores
|
|
||||||
$columnHeader = trim($columnHeader);
|
|
||||||
return strtolower(preg_replace('/[^A-Za-z0-9_]/', '_', $columnHeader));
|
|
||||||
}, $header);
|
|
||||||
$range = "{$firstSheetTitle}!2:{$totalRow}";
|
|
||||||
|
|
||||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||||
$values = $response->getValues();
|
$values = $response->getValues();
|
||||||
|
return!empty($values)? $values : [];
|
||||||
$mappedData = [];
|
|
||||||
if (!empty($values)) {
|
|
||||||
foreach ($values as $row) {
|
|
||||||
$rowData = [];
|
|
||||||
foreach ($header as $index => $columnHeader) {
|
|
||||||
// Map header to the corresponding value from the row
|
|
||||||
$rowData[$columnHeader] = isset($row[$index]) ? $row[$index] : null;
|
|
||||||
}
|
|
||||||
$mappedData[] = $rowData;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $mappedData;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
157
app/Services/OpenAIService.php
Normal file
157
app/Services/OpenAIService.php
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services;
|
||||||
|
|
||||||
|
use OpenAI;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
|
||||||
|
class OpenAIService
|
||||||
|
{
|
||||||
|
protected $client;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->client = OpenAI::client(env('OPENAI_API_KEY'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateGeneralText($prompt, $mainContent)
|
||||||
|
{
|
||||||
|
$response = $this->client->chat()->create([
|
||||||
|
'model' => 'gpt-4o-mini',
|
||||||
|
'messages' => [
|
||||||
|
[
|
||||||
|
'role' => 'system',
|
||||||
|
'content' => "You are an expert assistant. Your task is to generate a concise response based on the provided prompt and main content.
|
||||||
|
|
||||||
|
Guidelines:
|
||||||
|
- Summarize the key points in exactly 5 bullet points.
|
||||||
|
- Ensure the response is clear and relevant to the prompt.
|
||||||
|
- Use simple and professional language."
|
||||||
|
],
|
||||||
|
['role' => 'user', 'content' => "Prompt: $prompt \nMain Content: $mainContent"],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateClassifyMainContent($prompt, $mainContent)
|
||||||
|
{
|
||||||
|
$response = $this->client->chat()->create([
|
||||||
|
'model' => 'gpt-4o-mini',
|
||||||
|
'messages' => [
|
||||||
|
[
|
||||||
|
'role' => 'system',
|
||||||
|
'content' => "You are an expert assistant in classifying questions based on whether their answers must be retrieved from a database or can be explained generally.
|
||||||
|
Your task is to return one of the following two labels:
|
||||||
|
- \"DATABASE\" → If the question requires specific data that can only be obtained from a database.
|
||||||
|
- \"GENERAL\" → If the question can be answered without accessing a database.
|
||||||
|
|
||||||
|
Consider the following context: \"$mainContent\"
|
||||||
|
|
||||||
|
Respond with only one of the labels: \"DATABASE\" or \"GENERAL\"."
|
||||||
|
],
|
||||||
|
['role' => 'user', 'content' => $prompt],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateQueryBasedMainContent($prompt, $mainContent)
|
||||||
|
{
|
||||||
|
// Load file JSON
|
||||||
|
$jsonPath = public_path('templates/contentTemplatePrompt.json'); // Sesuaikan path
|
||||||
|
$jsonData = json_decode(file_get_contents($jsonPath), true);
|
||||||
|
|
||||||
|
// Periksa apakah kategori ada dalam JSON
|
||||||
|
if (!isset($jsonData[$mainContent])) {
|
||||||
|
return "Template prompt tidak ditemukan.";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ambil template berdasarkan kategori
|
||||||
|
$promptTemplate = $jsonData[$mainContent]['prompt'];
|
||||||
|
|
||||||
|
$response = $this->client->chat()->create([
|
||||||
|
'model' => 'gpt-4o-mini',
|
||||||
|
'messages' => [
|
||||||
|
['role' => 'system', 'content' => $promptTemplate],
|
||||||
|
['role' => 'user', 'content' => $prompt],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function validateSyntaxQuery($queryResponse)
|
||||||
|
{
|
||||||
|
$response = $this->client->chat()->create([
|
||||||
|
'model' => 'gpt-4o-mini',
|
||||||
|
'messages' => [
|
||||||
|
[
|
||||||
|
'role' => 'system',
|
||||||
|
'content' => "You are a MariaDB SQL expert. Your task is to validate the syntax of an SQL query to ensure it follows proper MariaDB syntax rules.
|
||||||
|
|
||||||
|
Guidelines:
|
||||||
|
- Check for any syntax errors, missing keywords, or incorrect clause usage.
|
||||||
|
- Ensure the query is well-structured and adheres to best practices.
|
||||||
|
- Verify that all SQL keywords are used correctly and in the right order.
|
||||||
|
- If the query is valid, respond with: \"VALID\".
|
||||||
|
- If the query has issues, respond with: \"INVALID\".
|
||||||
|
|
||||||
|
Always respond with either \"VALID\" or \"INVALID\"."
|
||||||
|
],
|
||||||
|
['role' => 'user', 'content' => $queryResponse],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateNLPFromQuery($inputUser, $resultQuery) {
|
||||||
|
$response = $this->client->chat()->create([
|
||||||
|
'model' => 'gpt-4o-mini',
|
||||||
|
'messages' => [
|
||||||
|
[
|
||||||
|
'role' => 'system',
|
||||||
|
'content' => "You are an expert assistant. Your task is to analyze the database query results and transform them into a human-readable answer based on the user's question.
|
||||||
|
|
||||||
|
Guidelines:
|
||||||
|
- Understand the user's question and extract the key intent.
|
||||||
|
- Summarize or format the query results to directly answer the user's question.
|
||||||
|
- Ensure the response is clear, concise, and relevant.
|
||||||
|
- If the query result is empty or does not match the question, provide a polite response indicating that no data is available.
|
||||||
|
|
||||||
|
Always provide a well-structured response that makes sense based on the input question."
|
||||||
|
],
|
||||||
|
['role' => 'user', 'content' => "User's question: $inputUser \nDatabase result: $resultQuery"],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateFinalText($nlpResult) {
|
||||||
|
$response = $this->client->chat()->create([
|
||||||
|
'model' => 'gpt-4o-mini',
|
||||||
|
'messages' => [
|
||||||
|
[
|
||||||
|
'role' => 'system',
|
||||||
|
'content' => "You are an expert text formatter. Your task is to take the given NLP result and format it into a structured, human-readable text suitable for rendering inside an HTML <div>.
|
||||||
|
|
||||||
|
Guidelines:
|
||||||
|
- Preserve the meaning and clarity of the content.
|
||||||
|
- Use proper line breaks for readability.
|
||||||
|
- If the text contains lists, convert them into bullet points.
|
||||||
|
- Emphasize important keywords using <strong> tags if necessary.
|
||||||
|
- Ensure the response remains clean and concise without extra explanations."
|
||||||
|
],
|
||||||
|
['role' => 'user', 'content' => "Here is the NLP result that needs formatting:\n\n$nlpResult"],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
return trim($response['choices'][0]['message']['content'] ?? 'No response');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace App;
|
namespace App\Services;
|
||||||
use App\Traits\GlobalApiResponse;
|
use App\Traits\GlobalApiResponse;
|
||||||
use GuzzleHttp\Client;
|
use GuzzleHttp\Client;
|
||||||
use Exception;
|
use Exception;
|
||||||
@@ -42,10 +42,17 @@ class ServiceClient
|
|||||||
}
|
}
|
||||||
|
|
||||||
$response = $this->client->request($method, $this->baseUrl . $url, $options);
|
$response = $this->client->request($method, $this->baseUrl . $url, $options);
|
||||||
|
$responseBody = (string) $response->getBody();
|
||||||
|
|
||||||
$resultResponse = json_decode($response->getBody(), true);
|
if (!str_contains($response->getHeaderLine('Content-Type'), 'application/json')) {
|
||||||
|
\Log::error('Unexpected response format: ' . $responseBody);
|
||||||
|
return $this->resError('API response is not JSON');
|
||||||
|
}
|
||||||
|
|
||||||
|
$resultResponse = json_decode($responseBody, true, 512, JSON_THROW_ON_ERROR);
|
||||||
return $this->resSuccess($resultResponse);
|
return $this->resSuccess($resultResponse);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
\Log::error('error from client service'. $e->getMessage());
|
||||||
return $this->resError($e->getMessage());
|
return $this->resError($e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
338
app/Services/ServiceSIMBG.php
Normal file
338
app/Services/ServiceSIMBG.php
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services;
|
||||||
|
|
||||||
|
use App\Enums\ImportDatasourceStatus;
|
||||||
|
use App\Models\BigdataResume;
|
||||||
|
use App\Models\GlobalSetting;
|
||||||
|
use App\Models\ImportDatasource;
|
||||||
|
use App\Models\PbgTaskIndexIntegrations;
|
||||||
|
use App\Models\PbgTaskPrasarana;
|
||||||
|
use App\Models\PbgTaskRetributions;
|
||||||
|
use Exception;
|
||||||
|
use App\Models\PbgTask;
|
||||||
|
use App\Traits\GlobalApiResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use App\Services\ServiceClient;
|
||||||
|
|
||||||
|
class ServiceSIMBG
|
||||||
|
{
|
||||||
|
use GlobalApiResponse;
|
||||||
|
private $email;
|
||||||
|
private $password;
|
||||||
|
private $simbg_host;
|
||||||
|
private $fetch_per_page;
|
||||||
|
private $service_client;
|
||||||
|
/**
|
||||||
|
* Create a new class instance.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$settings = GlobalSetting::whereIn('key', [
|
||||||
|
'SIMBG_EMAIL', 'SIMBG_PASSWORD', 'SIMBG_HOST', 'FETCH_PER_PAGE'
|
||||||
|
])->pluck('value', 'key');
|
||||||
|
|
||||||
|
$this->email = trim((string) ($settings['SIMBG_EMAIL'] ?? ""));
|
||||||
|
$this->password = trim((string) ($settings['SIMBG_PASSWORD'] ?? ""));
|
||||||
|
$this->simbg_host = trim((string) ($settings['SIMBG_HOST'] ?? ""));
|
||||||
|
$this->fetch_per_page = trim((string) ($settings['FETCH_PER_PAGE'] ?? ""));
|
||||||
|
|
||||||
|
$this->service_client = new ServiceClient($this->simbg_host);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getToken(){
|
||||||
|
try{
|
||||||
|
$url = "/api/user/v1/auth/login/";
|
||||||
|
$body = [
|
||||||
|
'email' => $this->email,
|
||||||
|
'password' => $this->password,
|
||||||
|
];
|
||||||
|
|
||||||
|
$res = $this->service_client->post($url, $body);
|
||||||
|
if(!$res->original['success']){
|
||||||
|
Log::error("Token not retrieved ", ['response' => $res]);
|
||||||
|
throw new Exception("Token not retrieved.");
|
||||||
|
}
|
||||||
|
return $res;
|
||||||
|
}catch(Exception $e){
|
||||||
|
Log::error("Error on method get token ", ['response' => $e->getMessage()]);
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function syncIndexIntegration($uuids, $token)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
if(empty($uuids)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$integrations = [];
|
||||||
|
foreach($uuids as $uuid){
|
||||||
|
$url = "/api/pbg/v1/detail/" . $uuid . "/retribution/indeks-terintegrasi/";
|
||||||
|
|
||||||
|
$headers = [
|
||||||
|
'Authorization' => "Bearer " . $token,
|
||||||
|
];
|
||||||
|
|
||||||
|
$res = $this->service_client->get($url, $headers);
|
||||||
|
|
||||||
|
if (empty($res->original['success']) || !$res->original['success']) {
|
||||||
|
// Log error
|
||||||
|
Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = $res->original['data']['data'] ?? null;
|
||||||
|
if (!$data) {
|
||||||
|
Log::error("No valid data returned from API", ['url' => $url, 'uuid' => $uuid]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$integrations[] = [
|
||||||
|
'pbg_task_uid' => $uuid,
|
||||||
|
'indeks_fungsi_bangunan' => $data['indeks_fungsi_bangunan'] ?? null,
|
||||||
|
'indeks_parameter_kompleksitas' => $data['indeks_parameter_kompleksitas'] ?? null,
|
||||||
|
'indeks_parameter_permanensi' => $data['indeks_parameter_permanensi'] ?? null,
|
||||||
|
'indeks_parameter_ketinggian' => $data['indeks_parameter_ketinggian'] ?? null,
|
||||||
|
'faktor_kepemilikan' => $data['faktor_kepemilikan'] ?? null,
|
||||||
|
'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null,
|
||||||
|
'total' => $data['total'] ?? null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
PbgTaskIndexIntegrations::upsert($integrations, ['pbg_task_uid'], ['indeks_fungsi_bangunan',
|
||||||
|
'indeks_parameter_kompleksitas', 'indeks_parameter_permanensi', 'indeks_parameter_ketinggian', 'faktor_kepemilikan', 'indeks_terintegrasi', 'total']);
|
||||||
|
|
||||||
|
// $resultData = PbgTaskIndexIntegrations::updateOrCreate(
|
||||||
|
// ['pbg_task_uid' => $uuid],
|
||||||
|
// [
|
||||||
|
// 'indeks_fungsi_bangunan' => $data['indeks_fungsi_bangunan'] ?? null,
|
||||||
|
// 'indeks_parameter_kompleksitas' => $data['indeks_parameter_kompleksitas'] ?? null,
|
||||||
|
// 'indeks_parameter_permanensi' => $data['indeks_parameter_permanensi'] ?? null,
|
||||||
|
// 'indeks_parameter_ketinggian' => $data['indeks_parameter_ketinggian'] ?? null,
|
||||||
|
// 'faktor_kepemilikan' => $data['faktor_kepemilikan'] ?? null,
|
||||||
|
// 'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null,
|
||||||
|
// 'total' => $data['total'] ?? null,
|
||||||
|
// ]
|
||||||
|
// );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}catch (Exception $e){
|
||||||
|
Log::error('error when sync index integration ', ['index integration'=> $e->getMessage()]);
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function syncTaskList()
|
||||||
|
{
|
||||||
|
$initResToken = $this->getToken();
|
||||||
|
|
||||||
|
$importDatasource = ImportDatasource::create([
|
||||||
|
'status' => ImportDatasourceStatus::Processing->value,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (empty($initResToken->original['data']['token']['access'])) {
|
||||||
|
$importDatasource->update([
|
||||||
|
'status' => ImportDatasourceStatus::Failed->value,
|
||||||
|
'message' => 'Failed to retrieve token'
|
||||||
|
]);
|
||||||
|
return $this->resError("Failed to retrieve token");
|
||||||
|
}
|
||||||
|
|
||||||
|
$apiToken = $initResToken->original['data']['token']['access'];
|
||||||
|
$headers = ['Authorization' => "Bearer " . $apiToken];
|
||||||
|
|
||||||
|
$url = "/api/pbg/v1/list/?page=1&size={$this->fetch_per_page}&sort=ASC";
|
||||||
|
$initialResponse = $this->service_client->get($url, $headers);
|
||||||
|
|
||||||
|
$totalPage = $initialResponse->original['data']['total_page'] ?? 0;
|
||||||
|
if ($totalPage == 0) {
|
||||||
|
$importDatasource->update([
|
||||||
|
'status' => ImportDatasourceStatus::Failed->value,
|
||||||
|
'message' => 'Invalid response: no total_page'
|
||||||
|
]);
|
||||||
|
return $this->resError("Invalid response from API");
|
||||||
|
}
|
||||||
|
|
||||||
|
$savedCount = $failedCount = 0;
|
||||||
|
|
||||||
|
for ($currentPage = 1; $currentPage <= $totalPage; $currentPage++) {
|
||||||
|
$pageUrl = "/api/pbg/v1/list/?page={$currentPage}&size={$this->fetch_per_page}&sort=ASC";
|
||||||
|
$getToken = $this->getToken();
|
||||||
|
Log::info("response index integration", ['currentPage' => $currentPage]);
|
||||||
|
if (empty($getToken->original['data']['token']['access'])) {
|
||||||
|
$importDatasource->update([
|
||||||
|
'status' => ImportDatasourceStatus::Failed->value,
|
||||||
|
'message' => 'Failed to retrieve token'
|
||||||
|
]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$token = $getToken->original['data']['token']['access'];
|
||||||
|
$headers = ['Authorization' => "Bearer " . $token];
|
||||||
|
$response = $this->service_client->get($pageUrl, $headers);
|
||||||
|
$tasks = $response->original['data']['data'] ?? [];
|
||||||
|
|
||||||
|
if (empty($tasks)) {
|
||||||
|
$importDatasource->update([
|
||||||
|
'status' => ImportDatasourceStatus::Failed->value,
|
||||||
|
'message' => 'No data found on page'
|
||||||
|
]);
|
||||||
|
Log::warning("No data found on page", ['page' => $currentPage]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log::info("executed page", ['page' => $currentPage, 'total' => $totalPage]);
|
||||||
|
|
||||||
|
$tasksCollective = [];
|
||||||
|
foreach ($tasks as $item) {
|
||||||
|
try {
|
||||||
|
$tasksCollective[] = [
|
||||||
|
'uuid' => $item['uid'],
|
||||||
|
'name' => $item['name'],
|
||||||
|
'owner_name' => $item['owner_name'],
|
||||||
|
'application_type' => $item['application_type'],
|
||||||
|
'application_type_name' => $item['application_type_name'],
|
||||||
|
'condition' => $item['condition'],
|
||||||
|
'registration_number' => $item['registration_number'],
|
||||||
|
'document_number' => $item['document_number'],
|
||||||
|
'address' => $item['address'],
|
||||||
|
'status' => $item['status'],
|
||||||
|
'status_name' => $item['status_name'],
|
||||||
|
'slf_status' => $item['slf_status'] ?? null,
|
||||||
|
'slf_status_name' => $item['slf_status_name'] ?? null,
|
||||||
|
'function_type' => $item['function_type'],
|
||||||
|
'consultation_type' => $item['consultation_type'],
|
||||||
|
'due_date' => $item['due_date'],
|
||||||
|
'land_certificate_phase' => $item['land_certificate_phase'],
|
||||||
|
'task_created_at' => isset($item['created_at']) ? Carbon::parse($item['created_at'])->format('Y-m-d H:i:s') : null,
|
||||||
|
'updated_at' => now(),
|
||||||
|
'created_at' => now(),
|
||||||
|
];
|
||||||
|
|
||||||
|
// $this->syncIndexIntegration($item['uid'], $token);
|
||||||
|
|
||||||
|
$this->syncTaskDetailSubmit($item['uid'], $token);
|
||||||
|
|
||||||
|
$savedCount++;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$failedCount++;
|
||||||
|
$importDatasource->update([
|
||||||
|
'status' => ImportDatasourceStatus::Failed->value,
|
||||||
|
'message' => "Successfully processed: $savedCount, Failed: $failedCount"
|
||||||
|
]);
|
||||||
|
Log::error("Failed to process task", [
|
||||||
|
'error' => $e->getMessage(),
|
||||||
|
'task' => $item,
|
||||||
|
]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PbgTask::upsert($tasksCollective, ['uuid'], [
|
||||||
|
'name', 'owner_name', 'application_type', 'application_type_name', 'condition',
|
||||||
|
'registration_number', 'document_number', 'address', 'status', 'status_name',
|
||||||
|
'slf_status', 'slf_status_name', 'function_type', 'consultation_type', 'due_date',
|
||||||
|
'land_certificate_phase', 'task_created_at', 'updated_at'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$uuids = array_column($tasksCollective, 'uuid');
|
||||||
|
$this->syncIndexIntegration($uuids, $token);
|
||||||
|
}
|
||||||
|
|
||||||
|
$importDatasource->update([
|
||||||
|
'status' => ImportDatasourceStatus::Success->value,
|
||||||
|
'message' => "Successfully processed: $savedCount, Failed: $failedCount"
|
||||||
|
]);
|
||||||
|
|
||||||
|
BigdataResume::generateResumeData($importDatasource->id);
|
||||||
|
|
||||||
|
Log::info("syncTaskList completed", ['savedCount' => $savedCount, 'failedCount' => $failedCount]);
|
||||||
|
|
||||||
|
return $this->resSuccess(['savedCount' => $savedCount, 'failedCount' => $failedCount]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function syncTaskDetailSubmit($uuid, $token)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$url = "/api/pbg/v1/detail/" . $uuid . "/retribution/submit/";
|
||||||
|
$headers = [
|
||||||
|
'Authorization' => "Bearer " . $token,
|
||||||
|
];
|
||||||
|
|
||||||
|
$res = $this->service_client->get($url, $headers);
|
||||||
|
|
||||||
|
if (empty($res->original['success']) || !$res->original['success']) {
|
||||||
|
// Log error
|
||||||
|
Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = $res->original['data']['data'] ?? [];
|
||||||
|
if (empty($data)) {
|
||||||
|
Log::error("No data returned from API", ['url' => $url, 'uuid' => $uuid]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$detailCreatedAt = isset($data['created_at'])
|
||||||
|
? Carbon::parse($data['created_at'])->format('Y-m-d H:i:s')
|
||||||
|
: null;
|
||||||
|
|
||||||
|
$detailUpdatedAt = isset($data['updated_at'])
|
||||||
|
? Carbon::parse($data['updated_at'])->format('Y-m-d H:i:s')
|
||||||
|
: null;
|
||||||
|
|
||||||
|
$pbg_task_retributions = PbgTaskRetributions::updateOrCreate(
|
||||||
|
['detail_id' => $data['id']],
|
||||||
|
[
|
||||||
|
'detail_uid' => $data['uid'] ?? null,
|
||||||
|
'detail_created_at' => $detailCreatedAt ?? null,
|
||||||
|
'detail_updated_at' => $detailUpdatedAt ?? null,
|
||||||
|
'luas_bangunan' => $data['luas_bangunan'] ?? null,
|
||||||
|
'indeks_lokalitas' => $data['indeks_lokalitas'] ?? null,
|
||||||
|
'wilayah_shst' => $data['wilayah_shst'] ?? null,
|
||||||
|
'kegiatan_id' => $data['kegiatan']['id'] ?? null,
|
||||||
|
'kegiatan_name' => $data['kegiatan']['name'] ?? null,
|
||||||
|
'nilai_shst' => $data['nilai_shst'] ?? null,
|
||||||
|
'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null,
|
||||||
|
'indeks_bg_terbangun' => $data['indeks_bg_terbangun'] ?? null,
|
||||||
|
'nilai_retribusi_bangunan' => $data['nilai_retribusi_bangunan'] ?? null,
|
||||||
|
'nilai_prasarana' => $data['nilai_prasarana'] ?? null,
|
||||||
|
'created_by' => $data['created_by'] ?? null,
|
||||||
|
'pbg_document' => $data['pbg_document'] ?? null,
|
||||||
|
'underpayment' => $data['underpayment'] ?? null,
|
||||||
|
'skrd_amount' => $data['skrd_amount'] ?? null,
|
||||||
|
'pbg_task_uid' => $uuid,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$pbg_task_retribution_id = $pbg_task_retributions->id;
|
||||||
|
|
||||||
|
$prasaranaData = $data['prasarana'] ?? [];
|
||||||
|
if (!empty($prasaranaData)) {
|
||||||
|
$insertData = array_map(fn($item) => [
|
||||||
|
'pbg_task_uid' => $uuid,
|
||||||
|
'pbg_task_retribution_id' => $pbg_task_retribution_id,
|
||||||
|
'prasarana_id' => $item['id'] ?? null,
|
||||||
|
'prasarana_type' => $item['prasarana_type'] ?? null,
|
||||||
|
'building_type' => $item['building_type'] ?? null,
|
||||||
|
'total' => $item['total'] ?? null,
|
||||||
|
'quantity' => $item['quantity'] ?? null,
|
||||||
|
'unit' => $item['unit'] ?? null,
|
||||||
|
'index_prasarana' => $item['index_prasarana'] ?? null,
|
||||||
|
], $prasaranaData);
|
||||||
|
|
||||||
|
// Use bulk insert or upsert for faster database operation
|
||||||
|
PbgTaskPrasarana::upsert($insertData, ['prasarana_id']);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}catch(Exception $e){
|
||||||
|
Log::error("Failed to sync task detail submit", ['error' => $e->getMessage(), 'uuid' => $uuid]);
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
26
app/View/Components/CustomCircle.php
Normal file
26
app/View/Components/CustomCircle.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\View\Components;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Contracts\View\View;
|
||||||
|
use Illuminate\View\Component;
|
||||||
|
|
||||||
|
class CustomCircle extends Component
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a new component instance.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the view / contents that represent the component.
|
||||||
|
*/
|
||||||
|
public function render(): View|Closure|string
|
||||||
|
{
|
||||||
|
return view('components.custom-circle');
|
||||||
|
}
|
||||||
|
}
|
||||||
25
app/View/Components/ModalConfirmation.php
Normal file
25
app/View/Components/ModalConfirmation.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\View\Components;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Contracts\View\View;
|
||||||
|
use Illuminate\View\Component;
|
||||||
|
|
||||||
|
class ModalConfirmation extends Component
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a new component instance.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the view / contents that represent the component.
|
||||||
|
*/
|
||||||
|
public function render(): View|Closure|string
|
||||||
|
{
|
||||||
|
return view('components.modal-confirmation');
|
||||||
|
}
|
||||||
|
}
|
||||||
25
app/View/Components/ToastNotification.php
Normal file
25
app/View/Components/ToastNotification.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\View\Components;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Contracts\View\View;
|
||||||
|
use Illuminate\View\Component;
|
||||||
|
|
||||||
|
class ToastNotification extends Component
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a new component instance.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the view / contents that represent the component.
|
||||||
|
*/
|
||||||
|
public function render(): View|Closure|string
|
||||||
|
{
|
||||||
|
return view('components.toast-notification');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,10 @@
|
|||||||
"name": "laravel/laravel",
|
"name": "laravel/laravel",
|
||||||
"type": "project",
|
"type": "project",
|
||||||
"description": "The skeleton application for the Laravel framework.",
|
"description": "The skeleton application for the Laravel framework.",
|
||||||
"keywords": ["laravel", "framework"],
|
"keywords": [
|
||||||
|
"laravel",
|
||||||
|
"framework"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^8.2",
|
"php": "^8.2",
|
||||||
@@ -11,7 +14,9 @@
|
|||||||
"guzzlehttp/guzzle": "^7.9",
|
"guzzlehttp/guzzle": "^7.9",
|
||||||
"laravel/framework": "^11.31",
|
"laravel/framework": "^11.31",
|
||||||
"laravel/sanctum": "^4.0",
|
"laravel/sanctum": "^4.0",
|
||||||
"laravel/tinker": "^2.9"
|
"laravel/tinker": "^2.9",
|
||||||
|
"maatwebsite/excel": "^3.1",
|
||||||
|
"openai-php/client": "^0.10.3"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"fakerphp/faker": "^1.23",
|
"fakerphp/faker": "^1.23",
|
||||||
@@ -70,11 +75,5 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"minimum-stability": "stable",
|
"minimum-stability": "stable",
|
||||||
"prefer-stable": true,
|
"prefer-stable": true
|
||||||
"repositories": {
|
|
||||||
"grocery-crud": {
|
|
||||||
"type": "composer",
|
|
||||||
"url": "https://composer.grocerycrud.com/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
925
composer.lock
generated
Executable file → Normal file
925
composer.lock
generated
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
@@ -123,4 +123,5 @@ return [
|
|||||||
'store' => env('APP_MAINTENANCE_STORE', 'database'),
|
'store' => env('APP_MAINTENANCE_STORE', 'database'),
|
||||||
],
|
],
|
||||||
|
|
||||||
|
'api_url' => env('API_URL', 'http://localhost:8000')
|
||||||
];
|
];
|
||||||
|
|||||||
81
config/crud.php
Normal file
81
config/crud.php
Normal 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
380
config/excel.php
Normal 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,
|
||||||
|
],
|
||||||
|
];
|
||||||
92138
database/inject-data-seeder/villages_202502082240.sql
Normal file
92138
database/inject-data-seeder/villages_202502082240.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -12,6 +12,17 @@ return new class extends Migration
|
|||||||
public function up(): void
|
public function up(): void
|
||||||
{
|
{
|
||||||
Schema::table('pbg_task', function (Blueprint $table) {
|
Schema::table('pbg_task', function (Blueprint $table) {
|
||||||
|
$constraintExists = DB::select("
|
||||||
|
SELECT COUNT(*) as count
|
||||||
|
FROM information_schema.statistics
|
||||||
|
WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'pbg_task'
|
||||||
|
AND index_name = 'pbg_task_uuid_unique'
|
||||||
|
");
|
||||||
|
|
||||||
|
if ($constraintExists[0]->count > 0) {
|
||||||
|
$table->dropUnique('pbg_task_uuid_unique');
|
||||||
|
}
|
||||||
$table->string('uuid')->nullable()->unique()->change();
|
$table->string('uuid')->nullable()->unique()->change();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -22,6 +33,7 @@ return new class extends Migration
|
|||||||
public function down(): void
|
public function down(): void
|
||||||
{
|
{
|
||||||
Schema::table('pbg_task', function (Blueprint $table) {
|
Schema::table('pbg_task', function (Blueprint $table) {
|
||||||
|
$table->dropUnique('pbg_task_uuid_unique');
|
||||||
$table->string('uuid')->nullable()->change();
|
$table->string('uuid')->nullable()->change();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,17 @@ return new class extends Migration
|
|||||||
public function up(): void
|
public function up(): void
|
||||||
{
|
{
|
||||||
Schema::table('pbg_task_index_integrations', function (Blueprint $table) {
|
Schema::table('pbg_task_index_integrations', function (Blueprint $table) {
|
||||||
|
$constraintExists = DB::select("
|
||||||
|
SELECT COUNT(*) as count
|
||||||
|
FROM information_schema.statistics
|
||||||
|
WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'pbg_task_index_integrations'
|
||||||
|
AND index_name = 'pbg_task_index_integrations_pbg_task_uid_unique'
|
||||||
|
");
|
||||||
|
|
||||||
|
if ($constraintExists[0]->count > 0) {
|
||||||
|
$table->dropUnique('pbg_task_index_integrations_pbg_task_uid_unique');
|
||||||
|
}
|
||||||
$table->string('pbg_task_uid')->unique()->change();
|
$table->string('pbg_task_uid')->unique()->change();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -22,6 +33,7 @@ return new class extends Migration
|
|||||||
public function down(): void
|
public function down(): void
|
||||||
{
|
{
|
||||||
Schema::table('pbg_task_index_integrations', function (Blueprint $table) {
|
Schema::table('pbg_task_index_integrations', function (Blueprint $table) {
|
||||||
|
$table->dropUnique('pbg_task_index_integrations_pbg_task_uid_unique');
|
||||||
$table->string('pbg_task_uid')->unique()->change();
|
$table->string('pbg_task_uid')->unique()->change();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,17 @@ return new class extends Migration
|
|||||||
public function up(): void
|
public function up(): void
|
||||||
{
|
{
|
||||||
Schema::table('pbg_task_retributions', function (Blueprint $table) {
|
Schema::table('pbg_task_retributions', function (Blueprint $table) {
|
||||||
|
$constraintExists = DB::select("
|
||||||
|
SELECT COUNT(*) as count
|
||||||
|
FROM information_schema.statistics
|
||||||
|
WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'pbg_task_retributions'
|
||||||
|
AND index_name = 'pbg_task_retributions_detail_id_unique'
|
||||||
|
");
|
||||||
|
|
||||||
|
if ($constraintExists[0]->count > 0) {
|
||||||
|
$table->dropUnique('pbg_task_retributions_detail_id_unique');
|
||||||
|
}
|
||||||
$table->string('detail_id')->unique()->change();
|
$table->string('detail_id')->unique()->change();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -22,6 +33,7 @@ return new class extends Migration
|
|||||||
public function down(): void
|
public function down(): void
|
||||||
{
|
{
|
||||||
Schema::table('pbg_task_retributions', function (Blueprint $table) {
|
Schema::table('pbg_task_retributions', function (Blueprint $table) {
|
||||||
|
$table->dropUnique('pbg_task_retributions_detail_id_unique');
|
||||||
$table->string('detail_id')->unique()->change();
|
$table->string('detail_id')->unique()->change();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('pbg_task_prasarana', function (Blueprint $table) {
|
||||||
|
$constraintExists = DB::select("
|
||||||
|
SELECT COUNT(*) as count
|
||||||
|
FROM information_schema.statistics
|
||||||
|
WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'pbg_task_prasarana'
|
||||||
|
AND index_name = 'pbg_task_prasarana_prasarana_id_unique'
|
||||||
|
");
|
||||||
|
|
||||||
|
if ($constraintExists[0]->count > 0) {
|
||||||
|
$table->dropUnique('pbg_task_prasarana_prasarana_id_unique');
|
||||||
|
}
|
||||||
|
$table->integer('prasarana_id')->nullable()->unique()->change();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('pbg_task_prasarana', function (Blueprint $table) {
|
||||||
|
$table->dropUnique('pbg_task_prasarana_prasarana_id_unique');
|
||||||
|
$table->integer('prasarana_id')->nullable()->unique()->change();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user