Compare commits

..

38 Commits

Author SHA1 Message Date
arifal
7a56735099 done crud spatial plannings 2025-02-20 15:35:06 +07:00
arifal
54146c8c08 partial update spatial plannings crud 2025-02-19 12:08:18 +07:00
arifal
e8da7193ef fix crud users 2025-02-19 11:23:15 +07:00
arifal
006c008542 done dashboard-potential 2025-02-19 07:22:06 +07:00
root
39bb8e6d5f hot fix vite and create view 2025-02-18 23:49:48 +00:00
arifal
7994a62cea change name dashboard 2025-02-19 06:24:44 +07:00
arifal
3a09e2e68a Merge branch 'bug-fix/tourisms' into feat/dashboard-kekurangan-potensi 2025-02-19 06:17:16 +07:00
arifal
116dc1c8c7 add dashboard potential 2025-02-19 06:15:35 +07:00
@jamaludinarifrohman6661
f10bc153b4 fix: tourisms 2025-02-19 01:39:27 +07:00
@jamaludinarifrohman6661
06a3bb8c8b fix:pariwisata and report pariwisata 2025-02-19 01:07:20 +07:00
arifal
6c936d4c14 add more handle if zero devided 2025-02-18 03:40:20 +07:00
arifal
d4d0a485cd fix vite resources 2025-02-18 03:32:00 +07:00
arifal
864fb26471 add local db backup 2025-02-18 02:58:11 +07:00
arifal
fd97a34344 add vite resources 2025-02-18 02:50:34 +07:00
arifal
1dd971fb73 create update tourisms 2025-02-18 02:45:39 +07:00
arifal
aff31e08ef merge feature umkm 2025-02-18 00:46:51 +07:00
@jamaludinarifrohman6661
2fb8aeceaa feature: viewnya ketinggalan 2025-02-18 00:35:50 +07:00
@jamaludinarifrohman6661
ecc243d1cc Upload Pariwisata dan report pariwisata 2025-02-17 23:58:31 +07:00
arifal
beac71d182 add business industry crud 2025-02-17 18:40:00 +07:00
@jamaludinarifrohman6661
8c236c460d feature: umkm crud and add template file for reklame 2025-02-17 13:03:54 +07:00
arifal hidayat
154b7f40df add sync data setting 2025-02-17 01:52:49 +07:00
arifal
59e9431b2d fetch data from data setting and make seeder realisasi terbit, menunggu klik dpmptsp, proses dinas teknis 2025-02-14 18:28:14 +07:00
arifal
074edc607d add hardcode number for realisasi terbit, proses dinas teknis, menunggu klik dashboards 2025-02-14 17:04:49 +07:00
arifal
625d182d81 fix service google sheet, add uemail to profile, fix detail pbg view, backupdb local last migrate, create menu and role request 2025-02-14 16:22:34 +07:00
arifal
4d32d4a110 fix button and fix service sync simbg 2025-02-14 00:23:50 +07:00
arifal
ac2f37d549 add js builk create 2025-02-13 01:50:14 +07:00
arifal
a9afb47f08 change filter year on dashboard to dropdown 2025-02-13 01:17:22 +07:00
arifal
9efb6c346e fix conflict and add seeder vilages 2025-02-12 23:50:16 +07:00
arifal
6ba62da5ca merge with feat reklame 2025-02-12 22:24:23 +07:00
arifal
ba95c185de create filter and bigdata resume sync 2025-02-12 21:28:08 +07:00
@jamaludinarifrohman6661
41ddbaef24 feature/create-migration-and-crud-api 2025-02-12 16:46:06 +07:00
arifal
b4b34b503e fix loading all pages 2025-02-12 01:53:40 +07:00
arifal
1a15bc03f8 create loading and handle from js create edit and delete roles 2025-02-11 23:40:31 +07:00
arifal
2bf4b8b327 create feat management role menu 2025-02-11 17:59:03 +07:00
@jamaludinarifrohman6661
ecf9096149 feature: form upload reklame 2025-02-11 16:57:53 +07:00
arifal
cb90f69d1e create user role and menu, create seeder for first user and create crud role, menu and user 2025-02-11 02:35:53 +07:00
@jamaludinarifrohman6661
9c41fad232 Feature: crud reklame 2025-02-07 18:11:33 +07:00
@jamaludinarifrohman6661
a7b6f13d8c feature: create seeder master data 2025-02-06 00:28:55 +07:00
201 changed files with 116978 additions and 5114 deletions

View File

@@ -2,7 +2,7 @@
namespace App\Console\Commands;
use App\ServiceSIMBG;
use App\Services\ServiceSIMBG;
use Illuminate\Console\Command;
use \Illuminate\Support\Facades\Log;
@@ -25,10 +25,16 @@ class ExecuteScraping extends Command
/**
* Execute the console command.
*/
private $service_simbg;
public function __construct(ServiceSIMBG $service_simbg){
$this->service_simbg = $service_simbg;
parent::__construct();
}
public function handle()
{
Log::info("running scheduler daily scraping");
$service = new ServiceSIMBG();
$service->syncTaskList();
$this->service_simbg->syncTaskList();
}
}

View 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 = storage_path('app/public/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);
}
}

View 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);
}
}
}

View File

@@ -11,11 +11,21 @@ class DashboardController extends Controller
{
use GlobalApiResponse;
public function businnessDocument(Request $request){
$query = once(function () {
public function businnessDocument(Request $request)
{
$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_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
->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');
@@ -37,11 +47,20 @@ class DashboardController extends Controller
]);
}
public function nonBusinnessDocument(Request $request){
$request->validate([
"year" => "required|integer"
]);
$query = once( function () {
$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_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
->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'); // Include NULL values
@@ -61,13 +80,22 @@ class DashboardController extends Controller
"total" => $taskTotal
]);
}
public function allTaskDocuments(){
$query = once( function () {
return DB::table('pbg_task')
->leftJoin('pbg_task_retributions', 'pbg_task.uuid', '=', 'pbg_task_retributions.pbg_task_uid')
public function allTaskDocuments(Request $request){
$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_retributions as ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
->whereBetween("pt.task_created_at", [$startOfYear, $endOfYear])
->select(
DB::raw('COUNT(DISTINCT pbg_task.id) as task_count'),
DB::raw('SUM(pbg_task_retributions.nilai_retribusi_bangunan) as total_retribution')
DB::raw('COUNT(DISTINCT pt.id) as task_count'),
DB::raw('SUM(ptr.nilai_retribusi_bangunan) as total_retribution')
)
->first();
});
@@ -79,11 +107,20 @@ class DashboardController extends Controller
]);
}
public function verificationDocuments(){
$query = once( function (){
public function verificationDocuments(Request $request){
$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_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Menambahkan join ke pbg_task_retributions
->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')
@@ -99,11 +136,21 @@ class DashboardController extends Controller
]);
}
public function nonVerificationDocuments(){
$query = once(function () {
public function nonVerificationDocuments(Request $request){
$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_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join tabel pbg_task_retributions
->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'); // Include NULL values

View File

@@ -0,0 +1,56 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Menu;
use Illuminate\Http\Request;
class MenusController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$query = Menu::query();
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(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -6,6 +6,7 @@ use App\Enums\ImportDatasourceStatus;
use App\Http\Controllers\Controller;
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\PbgTaskGoogleSheet;
@@ -109,18 +110,55 @@ class PbgTaskController extends Controller
}
public function syncPbgFromGoogleSheet(){
$import_datasource = ImportDatasource::create([
"message" => "initialization",
"response_body" => null,
"status" => ImportDatasourceStatus::Processing->value,
]);
try{
$totalRowCount = $this->googleSheetService->getLastRowByColumn("C");
$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 = [];
$count = 0;
$import_datasource = ImportDatasource::create([
"message" => "initialization",
"response_body" => null,
"status" => ImportDatasourceStatus::Processing->value,
]);
foreach($sheetData as $data){
$mapToUpsert[] =
[
@@ -242,7 +280,7 @@ class PbgTaskController extends Controller
$total_data = count($mapToUpsert);
$import_datasource->update([
"message" => "Successfully imported {$total_data}",
"message" => "Successfully processed: {$total_data}",
"status" => ImportDatasourceStatus::Success->value,
]);

View File

@@ -0,0 +1,56 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
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();
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(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\ExcelUploadRequest;
use App\Http\Requests\SpatialPlanningsRequest;
use App\Http\Resources\SpatialPlanningsResource;
use App\Imports\SpatialPlanningImport;
use App\Models\SpatialPlanning;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class SpatialPlanningsController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$query = SpatialPlanning::query()->orderBy('id', 'desc');
if ($request->has("search") &&!empty($request->get("search"))) {
$query = $query->where("name", "LIKE", "%{$request->get("search")}%")
->orWhere("nomor", "LIKE", "%{$request->get("search")}%");
}
return SpatialPlanningsResource::collection($query->paginate());
}
public function store(SpatialPlanningsRequest $request)
{
try{
$validated = $request->validated();
$data = SpatialPlanning::create($validated);
return response()->json(['message' => 'Successfully created', new SpatialPlanningsResource($data)]);
}catch(\Exception $e){
return response()->json([
'message' => $e->getMessage()
], 500);
}
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(SpatialPlanningsRequest $request, string $id)
{
try{
$validated = $request->validated();
$data = SpatialPlanning::find($id);
$data->update($validated);
return response()->json(['message' => 'Successfully updated', new SpatialPlanningsResource($data)]);
}catch(\Exception $e){
return response()->json([
'message' => $e->getMessage()
], 500);
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
try{
SpatialPlanning::destroy($id);
return response()->json([
'message' => 'Successfully deleted'
], 200);
}catch(\Exception $e){
return response()->json([
'message' => $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 SpatialPlanningImport, $file);
return response()->json([
'message' => 'Successfully imported'
], 200);
}catch(\Exception $e){
return response()->json([
'error' => $e->getMessage()
], 500);
}
}
}

View File

@@ -0,0 +1,130 @@
<?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();
$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;
});
return response()->json([
'data' => TourismResource::collection($tourisms),
'meta' => [
'total' => $tourisms->total(),
'per_page' => $tourisms->perPage(),
'current_page' => $tourisms->currentPage(),
'last_page'=>$tourisms->lastPage(),
]
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(TourismRequest $request): Tourism
{
$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);
}
}
/**
* 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();
}
}

View File

@@ -0,0 +1,189 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Umkm;
use Illuminate\Http\Request;
use App\Http\Requests\UmkmRequest;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use App\Http\Resources\UmkmResource;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\UmkmImport;
use Illuminate\Support\Facades\Storage;
class UmkmController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
info($request);
$perPage = $request->input('per_page', 15);
$search = $request->input('search', '');
$query = Umkm::query();
$umkm = $query->paginate($perPage);
$umkm->getCollection()->transform(function ($umkm) {
$village = DB::table('villages')->where('village_code', $umkm->village_code)->first();
$umkm->village_name = $village ? $village->village_name : null;
$district = DB::table('districts')->where('district_code', $umkm->district_code)->first();
$umkm->district_name = $district ? $district->district_name : null;
$business_scale = DB::table('business_scale')->where('id', $umkm->business_scale_id)->first();
$umkm->business_scale = $business_scale ? $business_scale->business_scale : null;
$permit_status = DB::table('permit_status')->where('id', $umkm->permit_status_id)->first();
$umkm->permit_status = $permit_status ? $permit_status->permit_status : null;
$business_form = DB::table('business_form')->where('id', $umkm->business_form_id)->first();
$umkm->business_form = $business_form ? $business_form->business_form : null;
return $umkm;
});
return response()->json([
'data' => UmkmResource::collection($umkm),
'meta' => [
'total' => $umkm->total(),
'per_page' => $umkm->perPage(),
'current_page' => $umkm->currentPage(),
'last_page' => $umkm->lastPage(),
]
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(UmkmRequest $request): Umkm
{
info($request);
$data = $request->validated();
// Cari kode berdasarkan nama
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->where('district_code', $district_code)->value('village_code');
$business_scale_id = DB::table('business_scale')->where('id', $data['business_scale_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 = storage_path('app/public/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);
}
}

View File

@@ -4,9 +4,11 @@ namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Http\Requests\UsersRequest;
use App\Http\Resources\UserResource;
use App\Models\User;
use App\Traits\GlobalApiResponse;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;
@@ -35,4 +37,50 @@ class UsersController extends Controller
$request->user()->tokens()->delete();
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);
}
}
}

View 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)
{
//
}
}

View File

@@ -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');
}
}

View File

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

View File

@@ -0,0 +1,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 = 'Create Data';
$modelInstance = Tourism::find($id);
// Pastikan model ditemukan
if (!$modelInstance) {
return redirect()->route('tourisms.index') ->with('error', 'Pariwisata tidak ditemukan');
}
// Mengambil dan memetakan village_name dan district_name
$village = DB::table('villages')->where('village_code', $modelInstance->village_code)->first();
$modelInstance->village_name = $village ? $village->village_name : null;
$district = DB::table('districts')->where('district_code', $modelInstance->district_code)->first();
$modelInstance->district_name = $district ? $district->district_name : null;
$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",
];
}
}

View 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"
];
}
}

View File

@@ -36,12 +36,13 @@ class DataSettingController extends Controller
DB::beginTransaction();
DataSetting::create($request->validated());
DB::commit();
return redirect()->route("data-settings.index")->with("success","Successfully created");
return response()->json(['message' => 'Successfully created'],201);
}catch(Exception $ex){
DB::rollBack();
return redirect()->back()
->withInput()
->with('error', 'Something went wrong while saving data. ' . $ex->getMessage());
return response()->json([
'message' => 'Failed to create data setting',
'error' => $ex->getMessage()
], 500);
}
}
@@ -79,12 +80,10 @@ class DataSettingController extends Controller
$data = DataSetting::findOrFail($id);
$data->update($request->validated());
DB::commit();
return redirect()->route("data-settings.index")->with("success","Successfully updated");
return response()->json(['message' => 'Successfully updated'], 200);
}catch(Exception $ex){
DB::rollBack();
return redirect()->back()
->withInput()
->with('error', 'Something went wrong while saving data. ' . $ex->getMessage());
return response()->json(['message' => $ex->getMessage()],500);
}
}
@@ -97,7 +96,7 @@ class DataSettingController extends Controller
DB::beginTransaction();
DataSetting::findOrFail($id)->delete();
DB::commit();
return response()->json(['success' => true, 'message' => 'Item deleted successfully.']);
return response()->json(['success' => true, 'message' => 'Item deleted successfully.'], 200);
}catch(Exception $e){
DB::rollBack();
Log::error($e->getMessage());

View File

@@ -3,7 +3,11 @@
namespace App\Http\Controllers\Master;
use App\Http\Controllers\Controller;
use App\Http\Requests\UsersRequest;
use App\Models\Role;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
@@ -22,30 +26,40 @@ class UsersController extends Controller
return view('master.users.index', compact('users'));
}
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([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'confirmed', 'max:255'],
'firstname' => ['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([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'firstname' => $request->firstname,
'lastname' => $request->lastname,
'position' => $request->position
]);
DB::beginTransaction();
try{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'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){
$user = User::find($id);
@@ -53,24 +67,40 @@ class UsersController extends Controller
}
public function edit($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){
$user = User::find($id);
$validate = $request->validate([
$validatedData = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($id)],
'firstname' => ['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);
return redirect()->route('master.users')->with('success', 'Successfully');
try{
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){
$user = User::find($id);
$user->delete();
return redirect()->route('master.users')->with('success','Successfully deleted');
return redirect()->route('users.index')->with('success','Successfully deleted');
}
}

View 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();
}
}
}

View 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'));
}
}

View 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());
}
}
}

View File

@@ -3,7 +3,7 @@
namespace App\Http\Controllers\Settings;
use App\Http\Controllers\Controller;
use App\ServiceSIMBG;
use App\Services\ServiceSIMBG;
use Illuminate\Http\Request;
use Exception;
class SyncronizeController extends Controller

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
use App\Models\SpatialPlanning;
use Illuminate\Http\Request;
class SpatialPlanningsController extends Controller
{
public function index()
{
return view('spatial-plannings.index');
}
public function create()
{
return view('spatial-plannings.create');
}
public function edit(string $id)
{
$data = SpatialPlanning::findOrFail($id);
return view('spatial-plannings.update', compact('data'));
}
public function upload (){
return view('spatial-plannings.upload');
}
}

View File

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

View File

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

View 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"
];
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
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
{
return [
'name' => ['required','string','max:255'],
'url' => ['nullable','string','max:255'],
'icon' => ['nullable','string','max:255'],
'parent_id' => ['nullable','exists:menus,id'],
'sort_order' => ['required','integer'],
];
}
}

View 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');
return [
'name' => 'required|string|max:255|unique:roles,name,' . ($roleId ?? 'NULL') . ',id',
'description' => 'nullable|string',
];
}
}

View 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'],
];
}
}

View File

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

View 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.',
];
}
}

View 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'],
];
}
}

View File

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

View File

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

View 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);
}
}

View 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);
}
}

View File

@@ -23,6 +23,7 @@ class UserResource extends JsonResource
'position' => $this->position,
'firstname' => $this->firstname,
'lastname' => $this->lastname,
'roles' => $this->roles->pluck('name'),
];
}
}

View File

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

View File

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

View File

@@ -0,0 +1,77 @@
<?php
namespace App\Imports;
use App\Models\SpatialPlanning;
use Carbon\Carbon;
use DateTime;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
class SpatialPlanningImport implements ToCollection, WithMultipleSheets
{
/**
* @param Collection $collection
*/
public function collection(Collection $collection)
{
$months = [
"Januari" => "January", "Februari" => "February", "Maret" => "March",
"April" => "April", "Mei" => "May", "Juni" => "June",
"Juli" => "July", "Agustus" => "August", "September" => "September",
"Oktober" => "October", "November" => "November", "Desember" => "December"
];
$collection->skip(2)->each(function ($row) use ($months) {
if (empty(array_filter($row->toArray()))) {
return;
}
if (!isset($row[6]) || empty($row[6])) {
return;
}
if(!SpatialPlanning::where("nomor", $row[6])->exists()){
$clean_nomor = str_replace('\\','',$row[6]);
$date_string = isset($row[7]) ? trim($row[7]) : null;
$clean_sp_date = null;
if ($date_string) {
if(is_numeric($date_string)) {
$clean_sp_date = Carbon::createFromFormat('Y-m-d', '1900-01-01')->addDays($date_string - 2)->format('Y-m-d');
}else{
foreach ($months as $id => $en) {
$date_string = str_replace($id, $en, $date_string);
}
$formats = ['j F Y', 'd F Y', 'j-M-Y', 'd-M-Y'];
foreach ($formats as $format) {
$date = DateTime::createFromFormat($format, $date_string);
if ($date) {
$clean_sp_date = $date->format('Y-m-d');
break;
}
}
}
}
SpatialPlanning::create([
'name' => $row[1],
'kbli' => $row[2],
'kegiatan' => $row[3],
'luas' => $row[4],
'lokasi' => $row[5],
'nomor' => $clean_nomor,
'sp_date' => $clean_sp_date,
]);
}
});
}
public function sheets(): array {
return [
0 => $this
];
}
}

View File

@@ -0,0 +1,122 @@
<?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';
// if (empty($row[16])) {
// info("Data kosong");
// } else {
// info("Baris ke- | Nilai: " . $row[16]);
// }
$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');
}
info("Tanggal dikonversi: " . $projectSubmissionDate);
$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;
}
}
}

View 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;
}
}
}

View File

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

View File

@@ -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,
]);
}
}

View 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',
];
}

25
app/Models/Menu.php Normal file
View 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');
}
}

22
app/Models/Role.php Normal file
View 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
View 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');
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class SpatialPlanning extends Model
{
protected $table = "spatial_plannings";
protected $fillable = [
'name',
'kbli',
'kegiatan',
'luas',
'lokasi',
'nomor',
'sp_date'
];
}

55
app/Models/Tourism.php Normal file
View 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'];
}

View 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
View 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'];
}

View File

@@ -49,4 +49,8 @@ class User extends Authenticatable
'password' => 'hashed',
];
}
public function roles(){
return $this->belongsToMany(Role::class, 'user_role')->withTimestamps();
}
}

View File

@@ -2,8 +2,11 @@
namespace App\Providers;
use App\Models\Menu;
use App\View\Components\Circle;
use Auth;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use Carbon\Carbon;
@@ -23,5 +26,26 @@ class AppServiceProvider extends ServiceProvider
public function boot(): void
{
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);
});
}
}

View File

@@ -1,299 +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;
private $service_client;
/**
* Create a new class instance.
*/
public function __construct(ServiceClient $service_client)
{
$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);
$this->service_client = new ServiceClient($this->simbg_host);
}
public function getToken(){
$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]);
return null;
}
return $res;
}
public function syncIndexIntegration($uuid, $token)
{
$url = "/api/pbg/v1/detail/" . $uuid . "/retribution/indeks-terintegrasi/";
$headers = [
'Authorization' => "Bearer " . $token,
];
$res = $this->service_client->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()
{
$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'
]);
}
$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)
{
$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']);
}
Log::info("retribution and prasarana successfully", ['uuid' => $uuid]);
return true;
}
}

View File

@@ -34,51 +34,59 @@ class GoogleSheetService
public function getLastRowByColumn($column = "A")
{
// Ambil spreadsheet
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
$sheets = $spreadsheet->getSheets();
if (!empty($sheets)) {
// Ambil nama sheet pertama dengan benar
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
// ✅ Format range harus benar!
$range = "{$firstSheetTitle}!{$column}:{$column}";
// Ambil data dari kolom yang diminta
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
$values = $response->getValues();
// Cek nilai terakhir yang tidak kosong
$lastRow = 0;
if (!empty($values)) {
foreach ($values as $index => $row) {
if (!empty($row[0])) { // Jika ada data, update lastRow
$lastRow = $index + 1;
try{
// Ambil spreadsheet
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
$sheets = $spreadsheet->getSheets();
if (!empty($sheets)) {
// Ambil nama sheet pertama dengan benar
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
// ✅ Format range harus benar!
$range = "{$firstSheetTitle}!{$column}:{$column}";
// Ambil data dari kolom yang diminta
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
$values = $response->getValues();
// Cek nilai terakhir yang tidak kosong
$lastRow = 0;
if (!empty($values)) {
foreach ($values as $index => $row) {
if (!empty($row[0])) { // Jika ada data, update lastRow
$lastRow = $index + 1;
}
}
}
return $lastRow;
}
return $lastRow;
return 0;
}catch(\Exception $e){
throw $e;
}
return 0;
}
public function getHeader()
{
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
$sheets = $spreadsheet->getSheets();
// Ambil nama sheet pertama
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
// Ambil data dari baris pertama (header)
$range = "{$firstSheetTitle}!1:1";
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
$values = $response->getValues();
// Kembalikan header (baris pertama)
return !empty($values) ? $values[0] : [];
try{
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
$sheets = $spreadsheet->getSheets();
// Ambil nama sheet pertama
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
// Ambil data dari baris pertama (header)
$range = "{$firstSheetTitle}!1:1";
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
$values = $response->getValues();
// Kembalikan header (baris pertama)
return !empty($values) ? $values[0] : [];
}catch(\Exception $e){
throw $e;
}
}
public function getLastColumn()
@@ -99,33 +107,46 @@ class GoogleSheetService
}
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);
$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}";
$sheetTitle = $sheets[$no_sheet]->getProperties()->getTitle();
$range = "{$sheetTitle}";
$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;
return!empty($values)? $values : [];
}
}

View File

@@ -1,6 +1,6 @@
<?php
namespace App;
namespace App\Services;
use App\Traits\GlobalApiResponse;
use GuzzleHttp\Client;
use Exception;
@@ -42,10 +42,17 @@ class ServiceClient
}
$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);
} catch (Exception $e) {
\Log::error('error from client service'. $e->getMessage());
return $this->resError($e->getMessage());
}
}

View File

@@ -0,0 +1,315 @@
<?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($uuid, $token)
{
try{
$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;
}
$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'
]);
}
$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;
}
}
}

View 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');
}
}

View 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');
}
}

View 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');
}
}

View File

@@ -3,7 +3,10 @@
"name": "laravel/laravel",
"type": "project",
"description": "The skeleton application for the Laravel framework.",
"keywords": ["laravel", "framework"],
"keywords": [
"laravel",
"framework"
],
"license": "MIT",
"require": {
"php": "^8.2",
@@ -11,10 +14,12 @@
"guzzlehttp/guzzle": "^7.9",
"laravel/framework": "^11.31",
"laravel/sanctum": "^4.0",
"laravel/tinker": "^2.9"
"laravel/tinker": "^2.9",
"maatwebsite/excel": "^3.1"
},
"require-dev": {
"fakerphp/faker": "^1.23",
"ibex/crud-generator": "^2.1",
"laravel/pail": "^1.1",
"laravel/pint": "^1.13",
"laravel/sail": "^1.26",
@@ -70,11 +75,5 @@
}
},
"minimum-stability": "stable",
"prefer-stable": true,
"repositories": {
"grocery-crud": {
"type": "composer",
"url": "https://composer.grocerycrud.com/"
}
}
"prefer-stable": true
}

771
composer.lock generated Executable file → Normal file
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "3fea2988b5efebfd50ec7c29aeae3830",
"content-hash": "52617d098d62b15c6ce8538cc8aea775",
"packages": [
{
"name": "brick/math",
@@ -135,6 +135,166 @@
],
"time": "2024-02-09T16:56:22+00:00"
},
{
"name": "composer/pcre",
"version": "3.3.2",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0"
},
"conflict": {
"phpstan/phpstan": "<1.11.10"
},
"require-dev": {
"phpstan/phpstan": "^1.12 || ^2",
"phpstan/phpstan-strict-rules": "^1 || ^2",
"phpunit/phpunit": "^8 || ^9"
},
"type": "library",
"extra": {
"phpstan": {
"includes": [
"extension.neon"
]
},
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Pcre\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be"
}
],
"description": "PCRE wrapping library that offers type-safe preg_* replacements.",
"keywords": [
"PCRE",
"preg",
"regex",
"regular expression"
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.3.2"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
"type": "tidelift"
}
],
"time": "2024-11-12T16:29:46+00:00"
},
{
"name": "composer/semver",
"version": "3.4.3",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"shasum": ""
},
"require": {
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.11",
"symfony/phpunit-bridge": "^3 || ^7"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Semver\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nils Adermann",
"email": "naderman@naderman.de",
"homepage": "http://www.naderman.de"
},
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be"
},
{
"name": "Rob Bast",
"email": "rob.bast@gmail.com",
"homepage": "http://robbast.nl"
}
],
"description": "Semver library that offers utilities, version constraint parsing and validation.",
"keywords": [
"semantic",
"semver",
"validation",
"versioning"
],
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.4.3"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
"type": "tidelift"
}
],
"time": "2024-09-19T14:15:21+00:00"
},
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
@@ -510,6 +670,67 @@
],
"time": "2024-12-27T00:36:43+00:00"
},
{
"name": "ezyang/htmlpurifier",
"version": "v4.18.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
"reference": "cb56001e54359df7ae76dc522d08845dc741621b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b",
"reference": "cb56001e54359df7ae76dc522d08845dc741621b",
"shasum": ""
},
"require": {
"php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
},
"require-dev": {
"cerdic/css-tidy": "^1.7 || ^2.0",
"simpletest/simpletest": "dev-master"
},
"suggest": {
"cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
"ext-bcmath": "Used for unit conversion and imagecrash protection",
"ext-iconv": "Converts text to and from non-UTF-8 encodings",
"ext-tidy": "Used for pretty-printing HTML"
},
"type": "library",
"autoload": {
"files": [
"library/HTMLPurifier.composer.php"
],
"psr-0": {
"HTMLPurifier": "library/"
},
"exclude-from-classmap": [
"/library/HTMLPurifier/Language/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1-or-later"
],
"authors": [
{
"name": "Edward Z. Yang",
"email": "admin@htmlpurifier.org",
"homepage": "http://ezyang.com"
}
],
"description": "Standards compliant HTML filter written in PHP",
"homepage": "http://htmlpurifier.org/",
"keywords": [
"html"
],
"support": {
"issues": "https://github.com/ezyang/htmlpurifier/issues",
"source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0"
},
"time": "2024-11-01T03:51:45+00:00"
},
{
"name": "firebase/php-jwt",
"version": "v6.11.0",
@@ -715,16 +936,16 @@
},
{
"name": "google/apiclient-services",
"version": "v0.393.0",
"version": "v0.394.0",
"source": {
"type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git",
"reference": "ed24c09584df8ef0cdcfb9d4305abf66fc17e609"
"reference": "17fa8210d62c02c398fb4985ed4bc461d18989c1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/ed24c09584df8ef0cdcfb9d4305abf66fc17e609",
"reference": "ed24c09584df8ef0cdcfb9d4305abf66fc17e609",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/17fa8210d62c02c398fb4985ed4bc461d18989c1",
"reference": "17fa8210d62c02c398fb4985ed4bc461d18989c1",
"shasum": ""
},
"require": {
@@ -753,22 +974,22 @@
],
"support": {
"issues": "https://github.com/googleapis/google-api-php-client-services/issues",
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.393.0"
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.394.0"
},
"time": "2025-02-03T00:54:21+00:00"
"time": "2025-02-10T01:06:23+00:00"
},
{
"name": "google/auth",
"version": "v1.45.3",
"version": "v1.45.4",
"source": {
"type": "git",
"url": "https://github.com/googleapis/google-auth-library-php.git",
"reference": "000d9439f430c6e56cba105c5ab750f5f7d69ea8"
"reference": "c70b987a3c2685c78e5e86280f9d259d4603839b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/000d9439f430c6e56cba105c5ab750f5f7d69ea8",
"reference": "000d9439f430c6e56cba105c5ab750f5f7d69ea8",
"url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/c70b987a3c2685c78e5e86280f9d259d4603839b",
"reference": "c70b987a3c2685c78e5e86280f9d259d4603839b",
"shasum": ""
},
"require": {
@@ -812,11 +1033,11 @@
"oauth2"
],
"support": {
"docs": "https://googleapis.github.io/google-auth-library-php/main/",
"docs": "https://cloud.google.com/php/docs/reference/auth/latest",
"issues": "https://github.com/googleapis/google-auth-library-php/issues",
"source": "https://github.com/googleapis/google-auth-library-php/tree/v1.45.3"
"source": "https://github.com/googleapis/google-auth-library-php/tree/v1.45.4"
},
"time": "2025-01-29T18:17:08+00:00"
"time": "2025-02-10T18:04:06+00:00"
},
{
"name": "graham-campbell/result-type",
@@ -1293,16 +1514,16 @@
},
{
"name": "laravel/framework",
"version": "v11.41.3",
"version": "v11.42.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "3ef433d5865f30a19b6b1be247586068399b59cc"
"reference": "006375ba67e830e87daa7b52ab65163ba3508d26"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/3ef433d5865f30a19b6b1be247586068399b59cc",
"reference": "3ef433d5865f30a19b6b1be247586068399b59cc",
"url": "https://api.github.com/repos/laravel/framework/zipball/006375ba67e830e87daa7b52ab65163ba3508d26",
"reference": "006375ba67e830e87daa7b52ab65163ba3508d26",
"shasum": ""
},
"require": {
@@ -1410,11 +1631,11 @@
"league/flysystem-read-only": "^3.25.1",
"league/flysystem-sftp-v3": "^3.25.1",
"mockery/mockery": "^1.6.10",
"orchestra/testbench-core": "^9.6",
"orchestra/testbench-core": "^9.9.4",
"pda/pheanstalk": "^5.0.6",
"php-http/discovery": "^1.15",
"phpstan/phpstan": "^1.11.5",
"phpunit/phpunit": "^10.5.35|^11.3.6",
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1",
"predis/predis": "^2.3",
"resend/resend-php": "^0.10.0",
"symfony/cache": "^7.0.3",
@@ -1446,7 +1667,7 @@
"mockery/mockery": "Required to use mocking (^1.6).",
"pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).",
"php-http/discovery": "Required to use PSR-7 bridging features (^1.15).",
"phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).",
"phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.3.6|^12.0.1).",
"predis/predis": "Required to use the predis connector (^2.3).",
"psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
"pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).",
@@ -1504,20 +1725,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2025-01-30T13:25:22+00:00"
"time": "2025-02-11T17:17:56+00:00"
},
{
"name": "laravel/prompts",
"version": "v0.3.4",
"version": "v0.3.5",
"source": {
"type": "git",
"url": "https://github.com/laravel/prompts.git",
"reference": "abeaa2ba4294247d5409490d1ca1bc6248087011"
"reference": "57b8f7efe40333cdb925700891c7d7465325d3b1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/prompts/zipball/abeaa2ba4294247d5409490d1ca1bc6248087011",
"reference": "abeaa2ba4294247d5409490d1ca1bc6248087011",
"url": "https://api.github.com/repos/laravel/prompts/zipball/57b8f7efe40333cdb925700891c7d7465325d3b1",
"reference": "57b8f7efe40333cdb925700891c7d7465325d3b1",
"shasum": ""
},
"require": {
@@ -1561,9 +1782,9 @@
"description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": {
"issues": "https://github.com/laravel/prompts/issues",
"source": "https://github.com/laravel/prompts/tree/v0.3.4"
"source": "https://github.com/laravel/prompts/tree/v0.3.5"
},
"time": "2025-01-24T15:41:01+00:00"
"time": "2025-02-11T13:34:40+00:00"
},
{
"name": "laravel/sanctum",
@@ -1631,16 +1852,16 @@
},
{
"name": "laravel/serializable-closure",
"version": "v2.0.2",
"version": "v2.0.3",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
"reference": "2e1a362527783bcab6c316aad51bf36c5513ae44"
"reference": "f379c13663245f7aa4512a7869f62eb14095f23f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/2e1a362527783bcab6c316aad51bf36c5513ae44",
"reference": "2e1a362527783bcab6c316aad51bf36c5513ae44",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f379c13663245f7aa4512a7869f62eb14095f23f",
"reference": "f379c13663245f7aa4512a7869f62eb14095f23f",
"shasum": ""
},
"require": {
@@ -1688,7 +1909,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
"time": "2025-01-24T15:42:37+00:00"
"time": "2025-02-11T15:03:05+00:00"
},
{
"name": "laravel/tinker",
@@ -2307,6 +2528,272 @@
],
"time": "2024-12-08T08:18:47+00:00"
},
{
"name": "maatwebsite/excel",
"version": "3.1.62",
"source": {
"type": "git",
"url": "https://github.com/SpartnerNL/Laravel-Excel.git",
"reference": "decfb9140161fcc117571e47e35ddf27983189ce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/decfb9140161fcc117571e47e35ddf27983189ce",
"reference": "decfb9140161fcc117571e47e35ddf27983189ce",
"shasum": ""
},
"require": {
"composer/semver": "^3.3",
"ext-json": "*",
"illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0",
"php": "^7.0||^8.0",
"phpoffice/phpspreadsheet": "^1.29.7",
"psr/simple-cache": "^1.0||^2.0||^3.0"
},
"require-dev": {
"laravel/scout": "^7.0||^8.0||^9.0||^10.0",
"orchestra/testbench": "^6.0||^7.0||^8.0||^9.0",
"predis/predis": "^1.1"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Excel": "Maatwebsite\\Excel\\Facades\\Excel"
},
"providers": [
"Maatwebsite\\Excel\\ExcelServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Maatwebsite\\Excel\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Patrick Brouwers",
"email": "patrick@spartner.nl"
}
],
"description": "Supercharged Excel exports and imports in Laravel",
"keywords": [
"PHPExcel",
"batch",
"csv",
"excel",
"export",
"import",
"laravel",
"php",
"phpspreadsheet"
],
"support": {
"issues": "https://github.com/SpartnerNL/Laravel-Excel/issues",
"source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.62"
},
"funding": [
{
"url": "https://laravel-excel.com/commercial-support",
"type": "custom"
},
{
"url": "https://github.com/patrickbrouwers",
"type": "github"
}
],
"time": "2025-01-04T12:14:36+00:00"
},
{
"name": "maennchen/zipstream-php",
"version": "3.1.2",
"source": {
"type": "git",
"url": "https://github.com/maennchen/ZipStream-PHP.git",
"reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f",
"reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"ext-zlib": "*",
"php-64bit": "^8.2"
},
"require-dev": {
"brianium/paratest": "^7.7",
"ext-zip": "*",
"friendsofphp/php-cs-fixer": "^3.16",
"guzzlehttp/guzzle": "^7.5",
"mikey179/vfsstream": "^1.6",
"php-coveralls/php-coveralls": "^2.5",
"phpunit/phpunit": "^11.0",
"vimeo/psalm": "^6.0"
},
"suggest": {
"guzzlehttp/psr7": "^2.4",
"psr/http-message": "^2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"ZipStream\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paul Duncan",
"email": "pabs@pablotron.org"
},
{
"name": "Jonatan Männchen",
"email": "jonatan@maennchen.ch"
},
{
"name": "Jesse Donat",
"email": "donatj@gmail.com"
},
{
"name": "András Kolesár",
"email": "kolesar@kolesar.hu"
}
],
"description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
"keywords": [
"stream",
"zip"
],
"support": {
"issues": "https://github.com/maennchen/ZipStream-PHP/issues",
"source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2"
},
"funding": [
{
"url": "https://github.com/maennchen",
"type": "github"
}
],
"time": "2025-01-27T12:07:53+00:00"
},
{
"name": "markbaker/complex",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/MarkBaker/PHPComplex.git",
"reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
"reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"phpcompatibility/php-compatibility": "^9.3",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"squizlabs/php_codesniffer": "^3.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Complex\\": "classes/src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Baker",
"email": "mark@lange.demon.co.uk"
}
],
"description": "PHP Class for working with complex numbers",
"homepage": "https://github.com/MarkBaker/PHPComplex",
"keywords": [
"complex",
"mathematics"
],
"support": {
"issues": "https://github.com/MarkBaker/PHPComplex/issues",
"source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
},
"time": "2022-12-06T16:21:08+00:00"
},
{
"name": "markbaker/matrix",
"version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/MarkBaker/PHPMatrix.git",
"reference": "728434227fe21be27ff6d86621a1b13107a2562c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c",
"reference": "728434227fe21be27ff6d86621a1b13107a2562c",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"phpcompatibility/php-compatibility": "^9.3",
"phpdocumentor/phpdocumentor": "2.*",
"phploc/phploc": "^4.0",
"phpmd/phpmd": "2.*",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"sebastian/phpcpd": "^4.0",
"squizlabs/php_codesniffer": "^3.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Matrix\\": "classes/src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Baker",
"email": "mark@demon-angel.eu"
}
],
"description": "PHP Class for working with matrices",
"homepage": "https://github.com/MarkBaker/PHPMatrix",
"keywords": [
"mathematics",
"matrix",
"vector"
],
"support": {
"issues": "https://github.com/MarkBaker/PHPMatrix/issues",
"source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
},
"time": "2022-12-02T22:17:43+00:00"
},
{
"name": "monolog/monolog",
"version": "3.8.1",
@@ -2412,16 +2899,16 @@
},
{
"name": "nesbot/carbon",
"version": "3.8.4",
"version": "3.8.5",
"source": {
"type": "git",
"url": "https://github.com/CarbonPHP/carbon.git",
"reference": "129700ed449b1f02d70272d2ac802357c8c30c58"
"reference": "b1a53a27898639579a67de42e8ced5d5386aa9a4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/129700ed449b1f02d70272d2ac802357c8c30c58",
"reference": "129700ed449b1f02d70272d2ac802357c8c30c58",
"url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/b1a53a27898639579a67de42e8ced5d5386aa9a4",
"reference": "b1a53a27898639579a67de42e8ced5d5386aa9a4",
"shasum": ""
},
"require": {
@@ -2497,8 +2984,8 @@
],
"support": {
"docs": "https://carbon.nesbot.com/docs",
"issues": "https://github.com/briannesbitt/Carbon/issues",
"source": "https://github.com/briannesbitt/Carbon"
"issues": "https://github.com/CarbonPHP/carbon/issues",
"source": "https://github.com/CarbonPHP/carbon"
},
"funding": [
{
@@ -2514,7 +3001,7 @@
"type": "tidelift"
}
],
"time": "2024-12-27T09:25:35+00:00"
"time": "2025-02-11T16:28:45+00:00"
},
{
"name": "nette/schema",
@@ -2926,6 +3413,112 @@
},
"time": "2020-10-15T08:29:30+00:00"
},
{
"name": "phpoffice/phpspreadsheet",
"version": "1.29.10",
"source": {
"type": "git",
"url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
"reference": "c80041b1628c4f18030407134fe88303661d4e4e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/c80041b1628c4f18030407134fe88303661d4e4e",
"reference": "c80041b1628c4f18030407134fe88303661d4e4e",
"shasum": ""
},
"require": {
"composer/pcre": "^1||^2||^3",
"ext-ctype": "*",
"ext-dom": "*",
"ext-fileinfo": "*",
"ext-gd": "*",
"ext-iconv": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"ext-xmlreader": "*",
"ext-xmlwriter": "*",
"ext-zip": "*",
"ext-zlib": "*",
"ezyang/htmlpurifier": "^4.15",
"maennchen/zipstream-php": "^2.1 || ^3.0",
"markbaker/complex": "^3.0",
"markbaker/matrix": "^3.0",
"php": "^7.4 || ^8.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
"psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-main",
"dompdf/dompdf": "^1.0 || ^2.0 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.2",
"mitoteam/jpgraph": "^10.3",
"mpdf/mpdf": "^8.1.1",
"phpcompatibility/php-compatibility": "^9.3",
"phpstan/phpstan": "^1.1",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^8.5 || ^9.0",
"squizlabs/php_codesniffer": "^3.7",
"tecnickcom/tcpdf": "^6.5"
},
"suggest": {
"dompdf/dompdf": "Option for rendering PDF with PDF Writer",
"ext-intl": "PHP Internationalization Functions",
"mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
"mpdf/mpdf": "Option for rendering PDF with PDF Writer",
"tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
},
"type": "library",
"autoload": {
"psr-4": {
"PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Maarten Balliauw",
"homepage": "https://blog.maartenballiauw.be"
},
{
"name": "Mark Baker",
"homepage": "https://markbakeruk.net"
},
{
"name": "Franck Lefevre",
"homepage": "https://rootslabs.net"
},
{
"name": "Erik Tilt"
},
{
"name": "Adrien Crivelli"
}
],
"description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
"homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
"keywords": [
"OpenXML",
"excel",
"gnumeric",
"ods",
"php",
"spreadsheet",
"xls",
"xlsx"
],
"support": {
"issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
"source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.10"
},
"time": "2025-02-08T02:56:14+00:00"
},
{
"name": "phpoption/phpoption",
"version": "1.9.3",
@@ -6562,6 +7155,74 @@
},
"time": "2020-07-09T08:09:16+00:00"
},
{
"name": "ibex/crud-generator",
"version": "v2.1.2",
"source": {
"type": "git",
"url": "https://github.com/awais-vteams/laravel-crud-generator.git",
"reference": "3906f4a702c91bbe3a84d940c3021d1511834320"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/awais-vteams/laravel-crud-generator/zipball/3906f4a702c91bbe3a84d940c3021d1511834320",
"reference": "3906f4a702c91bbe3a84d940c3021d1511834320",
"shasum": ""
},
"require": {
"laravel/framework": "^10.30|^11.0",
"php": "^8.2"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Ibex\\CrudGenerator\\CrudServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Ibex\\CrudGenerator\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "M Awais",
"email": "asargodha@gmail.com"
}
],
"description": "Laravel CRUD Generator",
"keywords": [
"alpine js",
"bootstrap css",
"crud",
"crud generator",
"laravel",
"laravel crud generator",
"laravel package",
"tailwind css"
],
"support": {
"issues": "https://github.com/awais-vteams/laravel-crud-generator/issues",
"source": "https://github.com/awais-vteams/laravel-crud-generator/tree/v2.1.2"
},
"funding": [
{
"url": "https://github.com/awais-vteams",
"type": "github"
},
{
"url": "https://ko-fi.com/mawais",
"type": "ko_fi"
}
],
"time": "2024-12-09T06:01:54+00:00"
},
{
"name": "laravel/pail",
"version": "v1.2.2",
@@ -6854,16 +7515,16 @@
},
{
"name": "myclabs/deep-copy",
"version": "1.12.1",
"version": "1.13.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
"reference": "024473a478be9df5fdaca2c793f2232fe788e414"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
"reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414",
"reference": "024473a478be9df5fdaca2c793f2232fe788e414",
"shasum": ""
},
"require": {
@@ -6902,7 +7563,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
"source": "https://github.com/myclabs/DeepCopy/tree/1.13.0"
},
"funding": [
{
@@ -6910,7 +7571,7 @@
"type": "tidelift"
}
],
"time": "2024-11-08T17:47:46+00:00"
"time": "2025-02-12T12:17:51+00:00"
},
{
"name": "nunomaduro/collision",
@@ -7453,16 +8114,16 @@
},
{
"name": "phpunit/phpunit",
"version": "11.5.6",
"version": "11.5.7",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "3c3ae14c90f244cdda95028c3e469028e8d1c02c"
"reference": "e1cb706f019e2547039ca2c839898cd5f557ee5d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3c3ae14c90f244cdda95028c3e469028e8d1c02c",
"reference": "3c3ae14c90f244cdda95028c3e469028e8d1c02c",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e1cb706f019e2547039ca2c839898cd5f557ee5d",
"reference": "e1cb706f019e2547039ca2c839898cd5f557ee5d",
"shasum": ""
},
"require": {
@@ -7534,7 +8195,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.6"
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.7"
},
"funding": [
{
@@ -7550,7 +8211,7 @@
"type": "tidelift"
}
],
"time": "2025-01-31T07:03:30+00:00"
"time": "2025-02-06T16:10:05+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -8655,12 +9316,12 @@
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
"stability-flags": [],
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^8.2"
},
"platform-dev": {},
"platform-dev": [],
"plugin-api-version": "2.6.0"
}

81
config/crud.php Normal file
View File

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

380
config/excel.php Normal file
View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,29 @@
<?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('roles', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->text('description')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('roles');
}
};

View File

@@ -0,0 +1,33 @@
<?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('menus', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('url');
$table->string('icon')->nullable();
$table->unsignedBigInteger('parent_id')->nullable();
$table->integer('sort_order')->default(0);
$table->foreign('parent_id')->references('id')->on('menus')->onDelete('set null');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('menus');
}
};

View File

@@ -0,0 +1,29 @@
<?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('user_role', function (Blueprint $table) {
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->foreignId('role_id')->constrained()->onDelete('cascade');
$table->primary(['user_id', 'role_id']);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('user_role');
}
};

View File

@@ -0,0 +1,29 @@
<?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('role_menu', function (Blueprint $table) {
$table->foreignId('role_id')->constrained()->cascadeOnDelete();
$table->foreignId('menu_id')->constrained()->cascadeOnDelete();
$table->primary(['role_id', 'menu_id']);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('role_menu');
}
};

View File

@@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('role_menu', function (Blueprint $table) {
$table->boolean('allow_show')->default(true)->after('menu_id');
$table->boolean('allow_create')->default(true)->after('allow_show');
$table->boolean('allow_update')->default(true)->after('allow_create');
$table->boolean('allow_destroy')->default(true)->after('allow_update');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('role_menu', function (Blueprint $table) {
$table->dropColumn(['allow_show','allow_create', 'allow_update', 'allow_destroy']);
});
}
};

View File

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

View File

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

View File

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

View File

@@ -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::table('umkm', function (Blueprint $table) {
$table->dropColumn('business_form');
$table->integer('business_form_id')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('umkm', function (Blueprint $table) {
$table->dropColumn('business_form_id');
$table->string('business_form')->nullable();
});
}
};

View File

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

View File

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

View File

@@ -0,0 +1,39 @@
<?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('bigdata_resumes', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('import_datasource_id');
$table->integer('potention_count')->default(0);
$table->decimal('potention_sum', 20, 2)->default(0);
$table->integer('non_verified_count')->default(0);
$table->decimal('non_verified_sum', 20, 2)->default(0);
$table->integer('verified_count')->default(0);
$table->decimal('verified_sum', 20, 2)->default(0);
$table->integer('business_count')->default(0);
$table->decimal('business_sum', 20, 2)->default(0);
$table->integer('non_business_count')->default(0);
$table->decimal('non_business_sum', 20, 2)->default(0);
$table->timestamps();
$table->foreign('import_datasource_id')->references('id')->on('import_datasources')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('bigdata_resumes');
}
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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('tourisms', function (Blueprint $table) {
$table->string('project_id')->change();
$table->integer('district_code')->change();
$table->integer('business_type_id')->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('tourisms', function (Blueprint $table) {
$table->integer('project_id')->change();
$table->string('district_code')->change();
$table->string('business_type_id')->change();
});
}
};

View File

@@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('business_or_industries', function (Blueprint $table) {
$table->id();
$table->string('nama_kecamatan');
$table->string('nama_kelurahan');
$table->string('nop')->unique();
$table->string('nama_wajib_pajak');
$table->text('alamat_wajib_pajak')->nullable();
$table->text('alamat_objek_pajak');
$table->decimal('luas_bumi',20,2)->default(0);
$table->decimal('luas_bangunan',20,2)->default(0);
$table->decimal('njop_bumi',20,2)->default(0);
$table->decimal('njop_bangunan',20,2)->default(0);
$table->decimal('ketetapan',20,2)->default(0);
$table->integer('tahun_pajak');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('business_or_industries');
}
};

View File

@@ -0,0 +1,54 @@
<?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::dropIfExists('tourisms');
Schema::create('tourisms', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->string('project_id');
$table->string('project_type_id');
$table->string('nib');
$table->string('business_name');
$table->datetime('oss_publication_date');
$table->string('investment_status_description');
$table->string('business_form');
$table->string('project_risk');
$table->string('project_name');
$table->string('business_scale');
$table->string('business_address');
$table->integer('district_code');
$table->integer('village_code');
$table->string('longitude');
$table->string('latitude');
$table->datetime('project_submission_date');
$table->string('kbli');
$table->string('kbli_title');
$table->string('supervisory_sector');
$table->string('user_name');
$table->string('email');
$table->string('contact');
$table->string('land_area_in_m2');
$table->string('investment_amount');
$table->string('tki');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tourisms');
}
};

View File

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

View File

@@ -0,0 +1,34 @@
<?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('spatial_plannings', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('kbli');
$table->text('kegiatan');
$table->decimal('luas',18,2);
$table->text('lokasi');
$table->string('nomor')->unique();
$table->date('sp_date');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('spatial_plannings');
}
};

View File

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

View File

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

View File

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

View File

@@ -23,7 +23,37 @@ class DataSettingSeeder extends Seeder
"key" => "TATA_RUANG",
"value" => "10000000000",
"type" => "integer"
]
],
[
"key" => "REALISASI_TERBIT_PBG_SUM",
"value" => "1507253788",
"type" => "integer"
],
[
"key" => "REALISASI_TERBIT_PBG_COUNT",
"value" => "88",
"type" => "integer"
],
[
"key" => "MENUNGGU_KLIK_DPMPTSP_SUM",
"value" => "83457536",
"type" => "integer"
],
[
"key" => "MENUNGGU_KLIK_DPMPTSP_COUNT",
"value" => "266",
"type" => "integer"
],
[
"key" => "PROSES_DINAS_TEKNIS_SUM",
"value" => "83457536",
"type" => "integer"
],
[
"key" => "PROSES_DINAS_TEKNIS_COUNT",
"value" => "11",
"type" => "integer"
],
];
foreach ($data_settings as $setting) {

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