Compare commits
46 Commits
feature/um
...
feat/dashb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7994a62cea | ||
|
|
3a09e2e68a | ||
|
|
116dc1c8c7 | ||
|
|
f10bc153b4 | ||
|
|
06a3bb8c8b | ||
|
|
6c936d4c14 | ||
|
|
d4d0a485cd | ||
|
|
864fb26471 | ||
|
|
fd97a34344 | ||
|
|
1dd971fb73 | ||
|
|
aff31e08ef | ||
|
|
beac71d182 | ||
|
|
154b7f40df | ||
|
|
59e9431b2d | ||
|
|
074edc607d | ||
|
|
625d182d81 | ||
|
|
4d32d4a110 | ||
|
|
ac2f37d549 | ||
|
|
a9afb47f08 | ||
|
|
9efb6c346e | ||
|
|
6ba62da5ca | ||
|
|
ba95c185de | ||
|
|
b4b34b503e | ||
|
|
1a15bc03f8 | ||
|
|
2bf4b8b327 | ||
|
|
cb90f69d1e | ||
|
|
6307417ae3 | ||
|
|
55dc0751d3 | ||
|
|
97ffd322a1 | ||
|
|
6fb59e58e9 | ||
|
|
7e99d547c8 | ||
|
|
65f82c9bfd | ||
|
|
44ebc20d3c | ||
|
|
b60bbd4290 | ||
|
|
29b705b59c | ||
|
|
95ab8eff7f | ||
|
|
bfc2f7f1f9 | ||
|
|
50f1757a64 | ||
|
|
d54edb7783 | ||
|
|
3309664bae | ||
|
|
4eac6ab83d | ||
|
|
604e0d8479 | ||
|
|
99e99fa2e6 | ||
|
|
ff324014f6 | ||
|
|
7d06e12de8 | ||
|
|
f38d518f96 |
@@ -4,6 +4,7 @@ APP_KEY=
|
||||
APP_DEBUG=true
|
||||
APP_TIMEZONE=UTC
|
||||
APP_URL=http://localhost
|
||||
API_URL=http://localhost:8000
|
||||
|
||||
APP_LOCALE=en
|
||||
APP_FALLBACK_LOCALE=en
|
||||
@@ -65,6 +66,5 @@ AWS_USE_PATH_STYLE_ENDPOINT=false
|
||||
|
||||
VITE_APP_NAME="${APP_NAME}"
|
||||
|
||||
SIMBG_HOST="xxxxxx"
|
||||
SIMBG_EMAIL="xxxxxx"
|
||||
SIMBG_PASSWORD="xxxxx"
|
||||
API_KEY_GOOGLE="xxxxx"
|
||||
SPREAD_SHEET_ID="xxxxx"
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ class AdvertisementController extends Controller
|
||||
|
||||
public function downloadExcelAdvertisement()
|
||||
{
|
||||
$filePath = storage_path('app/public/templateFile/template_reklame.xlsx');
|
||||
$filePath = storage_path('app/public/templates/template_reklame.xlsx');
|
||||
|
||||
// Cek apakah file ada
|
||||
if (!file_exists($filePath)) {
|
||||
|
||||
120
app/Http/Controllers/Api/BusinessOrIndustriesController.php
Normal file
120
app/Http/Controllers/Api/BusinessOrIndustriesController.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\BusinessIndustryRequest;
|
||||
use App\Imports\BusinessIndustriesImport;
|
||||
use App\Models\BusinessOrIndustry;
|
||||
use Illuminate\Http\Request;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use \Illuminate\Support\Facades\Validator;
|
||||
class BusinessOrIndustriesController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$query = BusinessOrIndustry::query()->orderBy('id', 'desc');
|
||||
|
||||
if ($request->has("search") && !empty($request->get("search"))) {
|
||||
$search = $request->get("search");
|
||||
|
||||
info($request); // Debugging log
|
||||
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where("nop", "LIKE", "%{$search}%")
|
||||
->orWhere("nama_kecamatan", "LIKE", "%{$search}%")
|
||||
->orWhere("nama_kelurahan", "LIKE", "%{$search}%");
|
||||
});
|
||||
}
|
||||
|
||||
return response()->json($query->paginate());
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(BusinessIndustryRequest $request, string $id)
|
||||
{
|
||||
try{
|
||||
$data = BusinessOrIndustry::findOrFail($id);
|
||||
$data->update($request->validated());
|
||||
return response()->json(['message' => 'Data updated successfully.'], 200);
|
||||
}catch(\Exception $e){
|
||||
\Log::error($e->getMessage());
|
||||
return response()->json(['message' => 'Failed to update data'],500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
try{
|
||||
$data = BusinessOrIndustry::findOrFail($id);
|
||||
$data->delete();
|
||||
return response()->json(['message' => 'Data deleted successfully.'], 200);
|
||||
}catch(\Exception $e){
|
||||
\Log::error($e->getMessage());
|
||||
return response()->json(['message' => 'Failed to delete data'],500);
|
||||
}
|
||||
}
|
||||
|
||||
public function upload(Request $request){
|
||||
|
||||
if ($request->hasFile('file')) {
|
||||
$file = $request->file('file');
|
||||
}
|
||||
|
||||
// Validasi file
|
||||
$validator = Validator::make($request->all(), [
|
||||
'file' => 'required|mimes:xlsx,xls|max:102400', // Max 100MB
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'message' => 'File validation failed.',
|
||||
'errors' => $validator->errors()
|
||||
], 400);
|
||||
}
|
||||
|
||||
try {
|
||||
// Ambil file dari request
|
||||
$file = $request->file('file');
|
||||
|
||||
// Menggunakan Laravel Excel untuk mengimpor file
|
||||
Excel::import(new BusinessIndustriesImport, $file);
|
||||
|
||||
// Jika sukses, kembalikan respons sukses
|
||||
return response()->json([
|
||||
'message' => 'File uploaded and imported successfully!'
|
||||
], 200);
|
||||
} catch (\Exception $e) {
|
||||
// Jika ada error, kembalikan error response
|
||||
return response()->json([
|
||||
'message' => 'Error during file import.',
|
||||
'error' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -11,63 +11,162 @@ class DashboardController extends Controller
|
||||
{
|
||||
use GlobalApiResponse;
|
||||
|
||||
public function businnessDocument(Request $request){
|
||||
$businessData = DB::table('pbg_task')
|
||||
->leftJoin('pbg_task_retributions', 'pbg_task.uuid', '=', 'pbg_task_retributions.pbg_task_uid')
|
||||
->select(
|
||||
DB::raw('COUNT(DISTINCT pbg_task.id) as task_count'),
|
||||
DB::raw('SUM(pbg_task_retributions.nilai_retribusi_bangunan) as total_retribution')
|
||||
)
|
||||
->where(function ($query) {
|
||||
$query->where("pbg_task.function_type", "LIKE", "sebagai tempat usaha%");
|
||||
})
|
||||
->first();
|
||||
$taskCount = $businessData->task_count;
|
||||
$taskTotal = $businessData->total_retribution;
|
||||
$result = [
|
||||
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');
|
||||
})
|
||||
->where(function ($query) {
|
||||
$query->whereRaw('LOWER(TRIM(pt.function_type)) = ?', [strtolower(trim('Sebagai Tempat Usaha'))]);
|
||||
})
|
||||
->selectRaw('COUNT(pt.id) AS total_data,
|
||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
||||
->first();
|
||||
});
|
||||
|
||||
$taskCount = $query->total_data ?? 0;
|
||||
$taskTotal = $query->total_retribution ?? 0;
|
||||
|
||||
return $this->resSuccess([
|
||||
"count" => $taskCount,
|
||||
"series" => [$taskCount],
|
||||
"total" => $taskTotal
|
||||
];
|
||||
return $this->resSuccess($result);
|
||||
]);
|
||||
}
|
||||
public function nonBusinnessDocument(Request $request){
|
||||
$businessData = DB::table('pbg_task')
|
||||
->leftJoin('pbg_task_retributions', 'pbg_task.uuid', '=', 'pbg_task_retributions.pbg_task_uid')
|
||||
->select(
|
||||
DB::raw('COUNT(DISTINCT pbg_task.id) as task_count'),
|
||||
DB::raw('SUM(pbg_task_retributions.nilai_retribusi_bangunan) as total_retribution')
|
||||
)
|
||||
$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 ke pbg_task_retributions
|
||||
->whereBetween("pt.task_created_at", [$startOfYear, $endOfYear])
|
||||
->where(function ($query) {
|
||||
$query->where("pbg_task.function_type", "NOT LIKE", "sebagai tempat usaha%")
|
||||
->orWhereNull("pbg_task.function_type");
|
||||
$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();
|
||||
$taskCount = $businessData->task_count;
|
||||
$taskTotal = $businessData->total_retribution;
|
||||
$result = [
|
||||
});
|
||||
$taskCount = $query->total_data ?? 0;
|
||||
$taskTotal = $query->total_retribution ?? 0;
|
||||
return $this->resSuccess([
|
||||
"count" => $taskCount,
|
||||
"series" => [$taskCount],
|
||||
"total" => $taskTotal
|
||||
];
|
||||
return $this->resSuccess($result);
|
||||
]);
|
||||
}
|
||||
public function allTaskDocuments(){
|
||||
$query = 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();
|
||||
$taskCount = $query->task_count;
|
||||
$taskTotal = $query->total_retribution;
|
||||
$result = [
|
||||
});
|
||||
$taskCount = $query->task_count ?? 0;
|
||||
$taskTotal = $query->total_retribution ?? 0;
|
||||
return $this->resSuccess([
|
||||
"count" => $taskCount,
|
||||
"series" => [$taskCount],
|
||||
"total" => $taskTotal
|
||||
];
|
||||
return $this->resSuccess($result);
|
||||
]);
|
||||
}
|
||||
|
||||
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')
|
||||
->whereBetween("pt.task_created_at", [$startOfYear, $endOfYear])
|
||||
->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) = ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||
->selectRaw('COUNT(pt.id) AS total_data,
|
||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
||||
->first();
|
||||
});
|
||||
|
||||
$taskCount = $query->total_data ?? 0;
|
||||
$taskTotal = $query->total_retribution ?? 0;
|
||||
|
||||
return $this->resSuccess([
|
||||
"count"=> $taskCount,
|
||||
"total"=> $taskTotal
|
||||
]);
|
||||
}
|
||||
|
||||
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
|
||||
})
|
||||
->selectRaw('COUNT(pt.id) AS total_data,
|
||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
||||
->first();
|
||||
});
|
||||
|
||||
$taskCount = $query->total_data ?? 0;
|
||||
$taskTotal = $query->total_retribution ?? 0;
|
||||
|
||||
return $this->resSuccess([
|
||||
"count"=> $taskCount,
|
||||
"total"=> $taskTotal
|
||||
]);
|
||||
}
|
||||
|
||||
public function pbgTaskDocuments(Request $request){
|
||||
|
||||
104
app/Http/Controllers/Api/DataSettingController.php
Normal file
104
app/Http/Controllers/Api/DataSettingController.php
Normal file
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\DataSettingRequest;
|
||||
use App\Http\Resources\DataSettingResource;
|
||||
use App\Models\DataSetting;
|
||||
use App\Traits\GlobalApiResponse;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class DataSettingController extends Controller
|
||||
{
|
||||
use GlobalApiResponse;
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
try {
|
||||
$query = DataSetting::query()->orderBy('id', 'desc');
|
||||
if ($request->has("search") && !empty($request->get("search"))) {
|
||||
$query = $query->where("key", $request->get("search"));
|
||||
}
|
||||
|
||||
return DataSettingResource::collection($query->paginate());
|
||||
} catch (Exception $e) {
|
||||
return $this->resError($e->getMessage(), $e->getTrace());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(DataSettingRequest $request)
|
||||
{
|
||||
try {
|
||||
$data = DataSetting::create($request->validated());
|
||||
$result = [
|
||||
"success" => true,
|
||||
"message" => "Data Setting created successfully",
|
||||
"data" => new DataSettingResource($data)
|
||||
];
|
||||
return $this->resSuccess($result);
|
||||
} catch (Exception $e) {
|
||||
return $this->resError($e->getMessage(), $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
try {
|
||||
$setting = DataSetting::findOrFail($id);
|
||||
$result = [
|
||||
"setting" => true,
|
||||
"message" => "Data setting successfully",
|
||||
"data" => new DataSettingResource($setting)
|
||||
];
|
||||
return $this->resSuccess($result);
|
||||
} catch (Exception $e) {
|
||||
return $this->resError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(DataSettingRequest $request, string $id)
|
||||
{
|
||||
try {
|
||||
$data = DataSetting::findOrFail($id);
|
||||
$data->update($request->validated());
|
||||
$result = [
|
||||
"success" => true,
|
||||
"message" => "Data Setting updated successfully"
|
||||
];
|
||||
return $this->resSuccess($result);
|
||||
} catch (Exception $e) {
|
||||
return $this->resError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
try {
|
||||
$setting = DataSetting::findOrFail($id);
|
||||
$setting->delete();
|
||||
$result = [
|
||||
"success" => true,
|
||||
"message" => "Data Setting deleted successfully"
|
||||
];
|
||||
return $this->resSuccess($result);
|
||||
} catch (Exception $e) {
|
||||
return $this->resError($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
61
app/Http/Controllers/Api/GoogleSheetController.php
Normal file
61
app/Http/Controllers/Api/GoogleSheetController.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\GoogleSheetService;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class GoogleSheetController extends Controller
|
||||
{
|
||||
protected $googleSheetService;
|
||||
public function __construct(GoogleSheetService $googleSheetService){
|
||||
$this->googleSheetService = $googleSheetService;
|
||||
}
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$dataCollection = $this->googleSheetService->getSheetDataCollection();
|
||||
$result = [
|
||||
"last_row" => $this->googleSheetService->getLastRowByColumn("C"),
|
||||
"last_column" => $this->googleSheetService->getLastColumn(),
|
||||
"header" => $this->googleSheetService->getHeader(),
|
||||
"data_collection" => $dataCollection
|
||||
];
|
||||
return response()->json($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
56
app/Http/Controllers/Api/MenusController.php
Normal file
56
app/Http/Controllers/Api/MenusController.php
Normal 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)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
363
app/Http/Controllers/Api/PbgTaskController.php
Normal file
363
app/Http/Controllers/Api/PbgTaskController.php
Normal file
@@ -0,0 +1,363 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
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;
|
||||
use App\Services\GoogleSheetService;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class PbgTaskController extends Controller
|
||||
{
|
||||
protected $googleSheetService;
|
||||
public function __construct(GoogleSheetService $googleSheetService){
|
||||
$this->googleSheetService = $googleSheetService;
|
||||
}
|
||||
public function index()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(PbgTaskMultiStepRequest $request)
|
||||
{
|
||||
try {
|
||||
$data = PbgTask::create([
|
||||
"uuid" => $request->input("step1Form.uuid"),
|
||||
"name" => $request->input("step1Form.name"),
|
||||
"owner_name" => $request->input("step1Form.owner_name"),
|
||||
"application_type" => $request->input("step1Form.application_type"),
|
||||
"application_type_name" => $request->input("step1Form.application_type_name"),
|
||||
"condition" => $request->input("step1Form.condition"),
|
||||
"registration_number" => $request->input("step1Form.registration_number"),
|
||||
"document_number" => $request->input("step1Form.document_number"),
|
||||
"address" => $request->input("step1Form.address"),
|
||||
"status" => $request->input("step1Form.status"),
|
||||
"status_name" => $request->input("step1Form.status_name"),
|
||||
"slf_status" => $request->input("step1Form.slf_status"),
|
||||
"slf_status_name" => $request->input("step1Form.slf_status_name"),
|
||||
"function_type" => $request->input("step1Form.function_type"),
|
||||
"consultation_type" => $request->input("step1Form.consultation_type"),
|
||||
"due_date" => $request->input("step1Form.due_date"),
|
||||
"land_certificate_phase" => $request->input("step1Form.land_certificate_phase"),
|
||||
"task_created_at" => $request->input("step1Form.task_created_at"),
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
"success" => true,
|
||||
"message" => "Step 1 berhasil disimpan!",
|
||||
"data" => $data
|
||||
], 201);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
"success" => false,
|
||||
"message" => "Gagal menyimpan data",
|
||||
"error" => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
try{
|
||||
$pbg_task = PbgTask::with(['pbg_task_retributions','pbg_task_index_integrations','pbg_task_retributions.pbg_task_prasarana'])->findOrFail($id);
|
||||
return response()->json([
|
||||
"success"=> true,
|
||||
"message"=> "Data ditemukan",
|
||||
"data"=> $pbg_task
|
||||
]);
|
||||
}catch(\Exception $e){
|
||||
return response()->json([
|
||||
"success"=> false,
|
||||
"message"=> $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
protected function validatePbgTask(Request $request){
|
||||
return $request->validate([
|
||||
"uuid" => $request->input("step1Form.uuid"),
|
||||
]);
|
||||
}
|
||||
|
||||
public function syncPbgFromGoogleSheet(){
|
||||
$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;
|
||||
|
||||
foreach($sheetData as $data){
|
||||
$mapToUpsert[] =
|
||||
[
|
||||
'no_registrasi' => $data['no__registrasi'] ?? null,
|
||||
'jenis_konsultasi' => $data['jenis_konsultasi'] ?? null,
|
||||
'fungsi_bg' => $data['fungsi_bg'] ?? null,
|
||||
'tgl_permohonan' => $this->convertToDate($data['tgl_permohonan']),
|
||||
'status_verifikasi' => $data['status_verifikasi'] ?? null,
|
||||
'status_permohonan' => $this->convertToDate($data['status_permohonan']),
|
||||
'alamat_pemilik' => $data['alamat_pemilik'] ?? null,
|
||||
'no_hp' => $data['no__hp'] ?? null,
|
||||
'email' => $data['e_mail'] ?? null,
|
||||
'tanggal_catatan' => $this->convertToDate($data['tanggal_catatan']),
|
||||
'catatan_kekurangan_dokumen' => $data['catatan_kekurangan_dokumen'] ?? null,
|
||||
'gambar' => $data['gambar'] ?? null,
|
||||
'krk_kkpr' => $data['krk_kkpr'] ?? null,
|
||||
'no_krk' => $data['no__krk'] ?? null,
|
||||
'lh' => $data['lh'] ?? null,
|
||||
'ska' => $data['ska'] ?? null,
|
||||
'keterangan' => $data['keterangan'] ?? null,
|
||||
'helpdesk' => $data['helpdesk'] ?? null,
|
||||
'pj' => $data['pj'] ?? null,
|
||||
'kepemilikan' => $data['kepemilikan'] ?? null,
|
||||
'potensi_taru' => $data['potensi_taru'] ?? null,
|
||||
'validasi_dinas' => $data['validasi_dinas'] ?? null,
|
||||
'kategori_retribusi' => $data['kategori_retribusi'] ?? null,
|
||||
'no_urut_ba_tpt' => $data['no__urut_ba_tpt__2024_0001_'] ?? null,
|
||||
'tanggal_ba_tpt' => $this->convertToDate($data['tanggal_ba_tpt']),
|
||||
'no_urut_ba_tpa' => $data['no__urut_ba_tpa'] ?? null,
|
||||
'tanggal_ba_tpa' => $this->convertToDate($data['tanggal_ba_tpa']),
|
||||
'no_urut_skrd' => $data['no__urut_skrd__2024_0001_'] ?? null,
|
||||
'tanggal_skrd' => $this->convertToDate($data['tanggal_skrd']),
|
||||
'ptsp' => $data['ptsp'] ?? null,
|
||||
'selesai_terbit' => $data['selesai_terbit'] ?? null,
|
||||
'tanggal_pembayaran' => $this->convertToDate($data['tanggal_pembayaran__yyyy_mm_dd_']),
|
||||
'format_sts' => $data['format_sts'] ?? null,
|
||||
'tahun_terbit' => (int) $data['tahun_terbit'] ?? null,
|
||||
'tahun_berjalan' => (int) $data['tahun_berjalan'] ?? null,
|
||||
'kelurahan' => $data['kelurahan'] ?? null,
|
||||
'kecamatan' => $data['kecamatan'] ?? null,
|
||||
'lb' => $this->convertToDecimal($data['lb']) ?? null,
|
||||
'tb' => $this->convertToDecimal($data['tb']) ?? null,
|
||||
'jlb' => (int) $data['jlb'] ?? null,
|
||||
'unit' => (int) $data['unit'] ?? null,
|
||||
'usulan_retribusi' => (int) $data['usulan_retribusi'] ?? null,
|
||||
'nilai_retribusi_keseluruhan_simbg' => $this->convertToDecimal($data['nilai_retribusi_keseluruhan__simbg_']) ?? null,
|
||||
'nilai_retribusi_keseluruhan_pad' => $this->convertToDecimal($data['nilai_retribusi_keseluruhan__pad_']) ?? null,
|
||||
'denda' => $this->convertToDecimal($data['denda']) ?? null,
|
||||
'latitude' => $data['latitude'] ?? null,
|
||||
'longitude' => $data['longitude'] ?? null,
|
||||
'nik_nib' => $data['nik_nib'] ?? null,
|
||||
'dok_tanah' => $data['dok__tanah'] ?? null,
|
||||
'temuan' => $data['temuan'] ?? null,
|
||||
];
|
||||
}
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
$batchSize = 1000;
|
||||
$chunks = array_chunk($mapToUpsert, $batchSize);
|
||||
|
||||
foreach($chunks as $chunk){
|
||||
PbgTaskGoogleSheet::upsert($chunk, ["no_registrasi"],[
|
||||
'jenis_konsultasi',
|
||||
'nama_pemilik',
|
||||
'lokasi_bg',
|
||||
'fungsi_bg',
|
||||
'nama_bangunan',
|
||||
'tgl_permohonan',
|
||||
'status_verifikasi',
|
||||
'status_permohonan',
|
||||
'alamat_pemilik',
|
||||
'no_hp',
|
||||
'email',
|
||||
'tanggal_catatan',
|
||||
'catatan_kekurangan_dokumen',
|
||||
'gambar',
|
||||
'krk_kkpr',
|
||||
'no_krk',
|
||||
'lh',
|
||||
'ska',
|
||||
'keterangan',
|
||||
'helpdesk',
|
||||
'pj',
|
||||
'kepemilikan',
|
||||
'potensi_taru',
|
||||
'validasi_dinas',
|
||||
'kategori_retribusi',
|
||||
'no_urut_ba_tpt',
|
||||
'tanggal_ba_tpt',
|
||||
'no_urut_ba_tpa',
|
||||
'tanggal_ba_tpa',
|
||||
'no_urut_skrd',
|
||||
'tanggal_skrd',
|
||||
'ptsp',
|
||||
'selesai_terbit',
|
||||
'tanggal_pembayaran',
|
||||
'format_sts',
|
||||
'tahun_terbit',
|
||||
'tahun_berjalan',
|
||||
'kelurahan',
|
||||
'kecamatan',
|
||||
'lb',
|
||||
'tb',
|
||||
'jlb',
|
||||
'unit',
|
||||
'usulan_retribusi',
|
||||
'nilai_retribusi_keseluruhan_simbg',
|
||||
'nilai_retribusi_keseluruhan_pad',
|
||||
'denda',
|
||||
'latitude',
|
||||
'longitude',
|
||||
'nik_nib',
|
||||
'dok_tanah',
|
||||
'temuan',
|
||||
]);
|
||||
}
|
||||
|
||||
$total_data = count($mapToUpsert);
|
||||
|
||||
$import_datasource->update([
|
||||
"message" => "Successfully processed: {$total_data}",
|
||||
"status" => ImportDatasourceStatus::Success->value,
|
||||
]);
|
||||
|
||||
DB::commit();
|
||||
|
||||
return response()->json([
|
||||
"success" => true,
|
||||
"message" => "Data berhasil disimpan ke database"
|
||||
], 200);
|
||||
}catch(\Exception $ex){
|
||||
DB::rollBack();
|
||||
$import_datasource->update([
|
||||
"message" => "Failed to importing",
|
||||
"response_body" => $ex->getMessage(),
|
||||
"status" => ImportDatasourceStatus::Failed->value,
|
||||
]);
|
||||
return response()->json([
|
||||
"success" => false,
|
||||
"message" => "Gagal menyimpan data",
|
||||
"error" => $ex->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
protected function convertToDecimal(?string $value): ?float
|
||||
{
|
||||
if (empty($value)) {
|
||||
return null; // Return null if the input is empty
|
||||
}
|
||||
|
||||
// Remove all non-numeric characters except comma and dot
|
||||
$value = preg_replace('/[^0-9,\.]/', '', $value);
|
||||
|
||||
// If the number contains both dot (.) and comma (,)
|
||||
if (strpos($value, '.') !== false && strpos($value, ',') !== false) {
|
||||
$value = str_replace('.', '', $value); // Remove thousands separator
|
||||
$value = str_replace(',', '.', $value); // Convert decimal separator to dot
|
||||
}
|
||||
// If only a dot is present (assumed as thousands separator)
|
||||
elseif (strpos($value, '.') !== false) {
|
||||
$value = str_replace('.', '', $value); // Remove all dots (treat as thousands separators)
|
||||
}
|
||||
// If only a comma is present (assumed as decimal separator)
|
||||
elseif (strpos($value, ',') !== false) {
|
||||
$value = str_replace(',', '.', $value); // Convert comma to dot (decimal separator)
|
||||
}
|
||||
|
||||
// Ensure the value is numeric before returning
|
||||
return is_numeric($value) ? (float) number_format((float) $value, 2, '.', '') : null;
|
||||
}
|
||||
|
||||
protected function convertToInteger($value) {
|
||||
// Check if the value is an empty string, and return null if true
|
||||
if (trim($value) === "") {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Otherwise, cast to integer
|
||||
return (int) $value;
|
||||
}
|
||||
|
||||
protected function convertToDate($dateString)
|
||||
{
|
||||
try {
|
||||
// Check if the string is empty
|
||||
if (empty($dateString)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Try to parse the date string
|
||||
$date = Carbon::parse($dateString);
|
||||
|
||||
// Return the Carbon instance
|
||||
return $date->format('Y-m-d');
|
||||
} catch (\Exception $e) {
|
||||
// Return null if an error occurs during parsing
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,9 +14,10 @@ class RequestAssignmentController extends Controller
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$query = PbgTask::query();
|
||||
$query = PbgTask::query()->orderBy('id', 'desc');
|
||||
if($request->has('search') && !empty($request->get("search"))){
|
||||
$query->where('name', 'LIKE', '%'.$request->get('search').'%');
|
||||
$query->where('name', 'LIKE', '%'.$request->get('search').'%')
|
||||
->orWhere('registration_number', 'LIKE', '%'.$request->get('search').'%');
|
||||
}
|
||||
return RequestAssignmentResouce::collection($query->paginate());
|
||||
}
|
||||
|
||||
56
app/Http/Controllers/Api/RolesController.php
Normal file
56
app/Http/Controllers/Api/RolesController.php
Normal 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)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,6 @@ class TourismController extends Controller
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
info($request);
|
||||
$perPage = $request->input('per_page', 15);
|
||||
$search = $request->input('search', '');
|
||||
|
||||
@@ -31,12 +30,9 @@ class TourismController extends Controller
|
||||
$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 = $district ? $district->district_name : null;
|
||||
|
||||
$business_type = DB::table('business_type')->where('id', $tourisms->business_type_id)->first();
|
||||
$tourisms->business_type = $business_type ? $business_type->business_type : null;
|
||||
$district = DB::table('districts')->where('district_code', $tourisms->district_code)->first();
|
||||
$tourisms->district_name = $village ? $village->village_name : null;
|
||||
return $tourisms;
|
||||
});
|
||||
|
||||
@@ -46,7 +42,7 @@ class TourismController extends Controller
|
||||
'total' => $tourisms->total(),
|
||||
'per_page' => $tourisms->perPage(),
|
||||
'current_page' => $tourisms->currentPage(),
|
||||
'last_page' => $tourisms->lastPage(),
|
||||
'last_page'=>$tourisms->lastPage(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
@@ -56,11 +52,18 @@ class TourismController extends Controller
|
||||
*/
|
||||
public function store(TourismRequest $request): Tourism
|
||||
{
|
||||
return Tourism::create($request->validated());
|
||||
$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 or CSV
|
||||
* Import advertisements from Excel
|
||||
*/
|
||||
public function importFromFile(Request $request)
|
||||
{
|
||||
@@ -71,21 +74,21 @@ class TourismController extends Controller
|
||||
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'message' => 'File validation failed.',
|
||||
'errors' => $validator->errors()
|
||||
'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!'
|
||||
'message'=>'File uploaded and imported successfully!'
|
||||
], 200);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'message' => 'Error during file import.',
|
||||
'error' => $e->getMessage()
|
||||
'message'=>'Error during file import.',
|
||||
'error'=>$e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
@@ -103,7 +106,17 @@ class TourismController extends Controller
|
||||
*/
|
||||
public function update(TourismRequest $request, Tourism $tourism): Tourism
|
||||
{
|
||||
$tourism->update($request->validated());
|
||||
$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;
|
||||
}
|
||||
|
||||
@@ -69,9 +69,9 @@ class UmkmController extends Controller
|
||||
// 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'])->value('id');
|
||||
$permit_status_id = DB::table('permit_status')->where('id', $data['permit_status'])->value('id');
|
||||
$business_form_id = DB::table('business_form')->where('id', $data['business_form'])->value('id');
|
||||
$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);
|
||||
|
||||
@@ -176,7 +176,7 @@ class UmkmController extends Controller
|
||||
|
||||
public function downloadExcelUmkm()
|
||||
{
|
||||
$filePath = storage_path('app/public/templateFile/template_umkm.xlsx');
|
||||
$filePath = storage_path('app/public/templates/template_umkm.xlsx');
|
||||
|
||||
// Cek apakah file ada
|
||||
if (!file_exists($filePath)) {
|
||||
|
||||
@@ -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,27 @@ 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($request->role_id);
|
||||
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Successfully created'],201);
|
||||
}catch(\Exception $e){
|
||||
DB::rollBack();
|
||||
return response()->json(['message' => $e->getMessage()],500);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
66
app/Http/Controllers/BusinessOrIndustriesController.php
Normal file
66
app/Http/Controllers/BusinessOrIndustriesController.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\BusinessOrIndustry;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class BusinessOrIndustriesController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('business-industries.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view("business-industries.create");
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(string $id)
|
||||
{
|
||||
$data = BusinessOrIndustry::findOrFail($id);
|
||||
return view('business-industries.edit', compact('data'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
@@ -3,11 +3,19 @@
|
||||
namespace App\Http\Controllers\Dashboards;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\ImportDatasource;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class BigDataController extends Controller
|
||||
{
|
||||
public function index(){
|
||||
return view('dashboards.bigdata');
|
||||
$latest_import_datasource = ImportDatasource::latest()->first();
|
||||
$latest_created = $latest_import_datasource ?
|
||||
$latest_import_datasource->created_at->format("j F Y H:i:s") : null;
|
||||
return view('dashboards.bigdata', compact('latest_created'));
|
||||
}
|
||||
|
||||
public function pbg(){
|
||||
return view('index');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -36,8 +36,7 @@ class TourismController extends Controller
|
||||
// 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_type_id' => DB::table('business_type')->orderBy('business_type')->pluck('business_type', 'id'),
|
||||
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code')
|
||||
];
|
||||
|
||||
$fields = $this->getFields();
|
||||
@@ -69,13 +68,9 @@ class TourismController extends Controller
|
||||
$district = DB::table('districts')->where('district_code', $modelInstance->district_code)->first();
|
||||
$modelInstance->district_name = $district ? $district->district_name : null;
|
||||
|
||||
$business_type = DB::table('business_type')->where('id', $modelInstance->business_type_id)->first();
|
||||
$modelInstance->business_scale_id = $business_type ? $business_type->id : 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'),
|
||||
'business_type_id' => DB::table('business_type')->orderBy('business_type')->pluck('business_type', 'id'),
|
||||
'district_name' => DB::table('districts')->orderBy('district_name')->pluck('district_name', 'district_code')
|
||||
];
|
||||
|
||||
$fields = $this->getFields();
|
||||
@@ -89,30 +84,62 @@ class TourismController extends Controller
|
||||
private function getFields()
|
||||
{
|
||||
return [
|
||||
"business_name" => "Nama Usaha",
|
||||
"project_name" => "Nama Project",
|
||||
"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",
|
||||
"land_area" => "Luas Tanah",
|
||||
"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",
|
||||
"number_of_employee" => "TKI",
|
||||
"business_type_id" => "Jenis Usaha",
|
||||
"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_address" => "textarea",
|
||||
"business_scale" => "text",
|
||||
"business_address" => "text",
|
||||
"district_name" => "combobox",
|
||||
"village_name" => "combobox",
|
||||
"land_area" => "text",
|
||||
"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",
|
||||
"number_of_employee" => "text",
|
||||
"business_type_id" => "select",
|
||||
"tki" => "text",
|
||||
];
|
||||
}
|
||||
}
|
||||
119
app/Http/Controllers/DataSettingController.php
Normal file
119
app/Http/Controllers/DataSettingController.php
Normal file
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\DataSettingRequest;
|
||||
use App\Models\DataSetting;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Request;
|
||||
|
||||
class DataSettingController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view("data-settings.index");
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view("data-settings.create");
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(DataSettingRequest $request)
|
||||
{
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
DataSetting::create($request->validated());
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Successfully created'],201);
|
||||
}catch(Exception $ex){
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'message' => 'Failed to create data setting',
|
||||
'error' => $ex->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(DataSetting $dataSetting)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(string $id)
|
||||
{
|
||||
try{
|
||||
$data = DataSetting::findOrFail($id);
|
||||
if(empty($data)){
|
||||
return redirect()->route('data-settings.index')->with('error', 'Invalid id');
|
||||
}
|
||||
return view("data-settings.edit", compact("data"));
|
||||
}catch(Exception $ex){
|
||||
return redirect()->route("data-settings.index")->with("error", "Invalid id");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(DataSettingRequest $request,string $id)
|
||||
{
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
$data = DataSetting::findOrFail($id);
|
||||
$data->update($request->validated());
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Successfully updated'], 200);
|
||||
}catch(Exception $ex){
|
||||
DB::rollBack();
|
||||
return response()->json(['message' => $ex->getMessage()],500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
DataSetting::findOrFail($id)->delete();
|
||||
DB::commit();
|
||||
return response()->json(['success' => true, 'message' => 'Item deleted successfully.'], 200);
|
||||
}catch(Exception $e){
|
||||
DB::rollBack();
|
||||
Log::error($e->getMessage());
|
||||
return response()->json(['success' => false, 'message' => 'Failed to delete item.'], 500);
|
||||
}
|
||||
}
|
||||
|
||||
public function getValueSetting(Request $request){
|
||||
try{
|
||||
$data = DataSetting::where('key', $request->key_name)->first();
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => "Successfully retrieved data",
|
||||
"data"=> $data
|
||||
]);
|
||||
}catch(Exception $e){
|
||||
return response()->json(['success' => false, 'message' => $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
113
app/Http/Controllers/MenusController.php
Normal file
113
app/Http/Controllers/MenusController.php
Normal file
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\MenuRequest;
|
||||
use App\Models\Menu;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MenusController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('menus.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$parent_menus = Menu::whereNull('parent_id')->get();
|
||||
return view("menus.create", compact('parent_menus'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(MenuRequest $request)
|
||||
{
|
||||
try{
|
||||
$validated_menu = $request->validated();
|
||||
DB::beginTransaction();
|
||||
Menu::create($validated_menu);
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Successfully created'], 200);
|
||||
}catch(\Exception $e){
|
||||
DB::rollBack();
|
||||
\Log::error('Menu creation failed: ' . $e->getMessage()); // Log the error for debugging
|
||||
return response()->json(['message'=> $e->getMessage()],500);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(string $id)
|
||||
{
|
||||
$menu = Menu::findOrFail($id);
|
||||
$parent_menus = Menu::whereNull('parent_id')->where('id','!=',$id)->get();
|
||||
return view("menus.edit", compact('menu','parent_menus'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(MenuRequest $request, string $id)
|
||||
{
|
||||
try{
|
||||
$validate_menu = $request->validated();
|
||||
$menu = Menu::findOrFail($id);
|
||||
DB::beginTransaction();
|
||||
$menu->update($validate_menu);
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Successfully updated'], 200);
|
||||
}catch(\Exception $e){
|
||||
DB::rollBack();
|
||||
\Log::error('Menu update failed: '. $e->getMessage()); // Log the error for debugging
|
||||
return response()->json(['message' => $e->getMessage()],500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
$menu = Menu::findOrFail($id);
|
||||
$this->deleteChildren($menu);
|
||||
$menu->roles()->detach();
|
||||
$menu->delete();
|
||||
DB::commit();
|
||||
return response()->json(['success' => true, 'message' => 'Successfully deleted']);
|
||||
}catch(\Exception $e){
|
||||
DB::rollBack();
|
||||
\Log::error('failed delete menu'. $e->getMessage());
|
||||
return response()->json(['success' => false, 'message' => 'Something went wrong! Please try again.']);
|
||||
}
|
||||
}
|
||||
|
||||
private function deleteChildren($menu)
|
||||
{
|
||||
foreach ($menu->children as $child) {
|
||||
$this->deleteChildren($child); // Recursively delete its children
|
||||
$child->roles()->detach(); // Detach roles before deleting
|
||||
$child->delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Http\Controllers\Report;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\BusinessTypeCount;
|
||||
use App\Models\TourismBasedKBLI;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
@@ -14,8 +14,8 @@ class ReportTourismController extends Controller
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$businessTypeCounts = BusinessTypeCount::all();
|
||||
info($businessTypeCounts);
|
||||
return view('report.tourisms.index', compact('businessTypeCounts'));
|
||||
$tourismBasedKBLI = TourismBasedKBLI::all();
|
||||
info($tourismBasedKBLI);
|
||||
return view('report.tourisms.index', compact('tourismBasedKBLI'));
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Http\Controllers\RequestAssignment;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\PbgTask;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PbgTaskController extends Controller
|
||||
@@ -12,7 +13,7 @@ class PbgTaskController extends Controller
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('request-assignment.index');
|
||||
return view('pbg_task.index');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -20,7 +21,7 @@ class PbgTaskController extends Controller
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
//
|
||||
return view("pbg_task.create");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -28,7 +29,7 @@ class PbgTaskController extends Controller
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -36,7 +37,8 @@ class PbgTaskController extends Controller
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
//
|
||||
$data = PbgTask::with(['pbg_task_retributions','pbg_task_index_integrations', 'pbg_task_retributions.pbg_task_prasarana'])->findOrFail($id);
|
||||
return view("pbg_task.show", compact("data"));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -44,7 +46,7 @@ class PbgTaskController extends Controller
|
||||
*/
|
||||
public function edit(string $id)
|
||||
{
|
||||
//
|
||||
return view("pbg_task.edit");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
146
app/Http/Controllers/RolesController.php
Normal file
146
app/Http/Controllers/RolesController.php
Normal file
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\RoleRequest;
|
||||
use App\Models\Menu;
|
||||
use App\Models\Role;
|
||||
use App\Models\RoleMenu;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class RolesController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view("roles.index");
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view("roles.create");
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(RoleRequest $request)
|
||||
{
|
||||
try{
|
||||
$validate_role = $request->validated();
|
||||
|
||||
DB::beginTransaction();
|
||||
Role::create($validate_role);
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Role created successfully'], 201);
|
||||
}
|
||||
catch(\Exception $e){
|
||||
DB::rollBack();
|
||||
return response()->json(['message' => $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(string $id)
|
||||
{
|
||||
$role = Role::findOrFail($id);
|
||||
return view("roles.edit", compact('role'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(RoleRequest $request, string $id)
|
||||
{
|
||||
try{
|
||||
$validate_role = $request->validated();
|
||||
$role = Role::findOrFail($id);
|
||||
|
||||
DB::beginTransaction();
|
||||
$role->update($validate_role);
|
||||
DB::commit();
|
||||
return response()->json(['message' => 'Role updated successfully'], 200);
|
||||
}catch(\Exception $e){
|
||||
DB::rollBack();
|
||||
return response()->json(['message' => $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
Role::findOrFail($id)->delete();
|
||||
DB::commit();
|
||||
return response()->json(['success' => true, "message" => "Successfully deleted"]);
|
||||
}catch(\Exception $e){
|
||||
DB::rollBack();
|
||||
return response()->json(['success' => false, "message" => $e->getMessage()]);
|
||||
}
|
||||
}
|
||||
|
||||
public function menu_permission(string $role_id){
|
||||
try{
|
||||
$role = Role::findOrFail($role_id);
|
||||
$menus = Menu::all();
|
||||
$role_menus = RoleMenu::where('role_id', $role_id)->get() ?? collect();
|
||||
return view('roles.role_menu', compact('role', 'menus', 'role_menus'));
|
||||
}catch(\Exception $e){
|
||||
return redirect()->back()->with("error", $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function update_menu_permission(Request $request, string $role_id){
|
||||
try{
|
||||
$validateData = $request->validate([
|
||||
"permissions" => "array",
|
||||
"permissions.*.allow_show" => "nullable|boolean",
|
||||
"permissions.*.allow_create" => "nullable|boolean",
|
||||
"permissions.*.allow_update" => "nullable|boolean",
|
||||
"permissions.*.allow_destroy" => "nullable|boolean"
|
||||
]);
|
||||
|
||||
$role = Role::find($role_id);
|
||||
|
||||
$permissionsArray = [];
|
||||
foreach ($validateData['permissions'] as $menu_id => $permission) {
|
||||
$permissionsArray[$menu_id] = [
|
||||
"allow_show" => (int) ($permission["allow_show"] ?? 0),
|
||||
"allow_create" => (int) ($permission["allow_create"] ?? 0),
|
||||
"allow_update" => (int) ($permission["allow_update"] ?? 0),
|
||||
"allow_destroy" => (int) ($permission["allow_destroy"] ?? 0),
|
||||
"updated_at" => now(),
|
||||
];
|
||||
}
|
||||
|
||||
// Sync will update existing records and insert new ones
|
||||
$role->menus()->sync($permissionsArray);
|
||||
|
||||
return redirect()->route("role-menu.permission", $role_id)->with('success','Menu Permission updated successfully');
|
||||
}catch(\Exception $e){
|
||||
Log::error("Error updating role_menu:", ["error" => $e->getMessage()]);
|
||||
return redirect()->route("role-menu.permission", $role_id)->with("error", $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,30 +15,4 @@ class RoutingController extends Controller
|
||||
return redirect('auth.signin');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a view based on first route param
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function root(Request $request, $first)
|
||||
{
|
||||
return view($first);
|
||||
}
|
||||
|
||||
/**
|
||||
* second level route
|
||||
*/
|
||||
public function secondLevel(Request $request, $first, $second)
|
||||
{
|
||||
return view($first . '.' . $second);
|
||||
}
|
||||
|
||||
/**
|
||||
* third level route
|
||||
*/
|
||||
public function thirdLevel(Request $request, $first, $second, $third)
|
||||
{
|
||||
return view($first . '.' . $second . '.' . $third);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,37 +3,43 @@
|
||||
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
|
||||
{
|
||||
protected $service_simbg;
|
||||
public function __construct(ServiceSIMBG $service_simbg){
|
||||
$this->service_simbg = $service_simbg;
|
||||
}
|
||||
public function index(Request $request){
|
||||
return view('settings.syncronize.index');
|
||||
}
|
||||
|
||||
public function syncPbgTask(){
|
||||
$res = (new ServiceSIMBG())->syncTaskList();
|
||||
$res = $this->service_simbg->syncTaskList();
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function syncronizeTask(Request $request){
|
||||
$res = (new ServiceSIMBG())->syncTaskList();
|
||||
$res = $this->service_simbg->syncTaskList();
|
||||
return redirect()->back()->with('success', 'Processing completed successfully');
|
||||
}
|
||||
|
||||
public function getUserToken(){
|
||||
$res = (new ServiceSIMBG())->getToken();
|
||||
$res = $this->service_simbg->getToken();
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function syncIndexIntegration($uuid){
|
||||
$res = (new ServiceSIMBG())->syncIndexIntegration($uuid);
|
||||
public function syncIndexIntegration(Request $request, $uuid){
|
||||
$token = $request->get('token');
|
||||
$res = $this->service_simbg->syncIndexIntegration($uuid, $token);
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function syncTaskDetailSubmit($uuid){
|
||||
$res = (new ServiceSIMBG())->syncTaskDetailSubmit($uuid);
|
||||
public function syncTaskDetailSubmit(Request $request, $uuid){
|
||||
$token = $request->get('token');
|
||||
$res = $this->service_simbg->syncTaskDetailSubmit($uuid, $token);
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
39
app/Http/Requests/BusinessIndustryRequest.php
Normal file
39
app/Http/Requests/BusinessIndustryRequest.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class BusinessIndustryRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'nama_kecamatan' => 'required|string|max:255',
|
||||
'nama_kelurahan' => 'required|string|max:255',
|
||||
'nop' => 'required|string|max:255|unique:business_or_industries,nop,' . $this->route('api_business_industry'),
|
||||
'nama_wajib_pajak' => 'required|string|max:255',
|
||||
'alamat_wajib_pajak' => 'nullable|string|max:255',
|
||||
'alamat_objek_pajak' => 'required|string|max:255',
|
||||
'luas_bumi' => 'required|numeric',
|
||||
'luas_bangunan' => 'required|numeric',
|
||||
'njop_bumi' => 'required|numeric',
|
||||
'njop_bangunan' => 'required|numeric',
|
||||
'ketetapan' => 'required|string|max:255',
|
||||
'tahun_pajak' => 'required|integer|min:1900|max:' . date('Y'),
|
||||
];
|
||||
}
|
||||
}
|
||||
31
app/Http/Requests/DataSettingRequest.php
Normal file
31
app/Http/Requests/DataSettingRequest.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class DataSettingRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$id = $this->route('data_setting');
|
||||
return [
|
||||
"key" => "required|unique:data_settings,key," . $id,
|
||||
"value" => "required",
|
||||
"type" => "nullable",
|
||||
];
|
||||
}
|
||||
}
|
||||
32
app/Http/Requests/MenuRequest.php
Normal file
32
app/Http/Requests/MenuRequest.php
Normal 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'],
|
||||
];
|
||||
}
|
||||
}
|
||||
62
app/Http/Requests/PbgTaskMultiStepRequest.php
Normal file
62
app/Http/Requests/PbgTaskMultiStepRequest.php
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class PbgTaskMultiStepRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
// rules step 1
|
||||
"step1Form.uuid" => "required",
|
||||
"step1Form.name" => "nullable|string|max:255",
|
||||
"step1Form.owner_name" => "nullable|string|max:255",
|
||||
"step1Form.application_type" => "nullable|string|max:255",
|
||||
"step1Form.application_type_name" => "nullable|string|max:255",
|
||||
"step1Form.condition" => "nullable|string|max:255",
|
||||
"step1Form.registration_number" => "nullable|string|max:255",
|
||||
"step1Form.document_number" => "nullable|string|max:255",
|
||||
"step1Form.address" => "nullable|string|max:255",
|
||||
"step1Form.status" => "nullable|integer",
|
||||
"step1Form.status_name" => "nullable|string|max:255",
|
||||
"step1Form.slf_status" => "nullable|string|max:255",
|
||||
"step1Form.slf_status_name" => "nullable|string|max:255",
|
||||
"step1Form.function_type" => "nullable|string|max:255",
|
||||
"step1Form.consultation_type" => "nullable|string|max:255",
|
||||
"step1Form.due_date" => "nullable|date",
|
||||
"step1Form.land_certificate_phase" => "nullable|boolean",
|
||||
"step1Form.task_created_at" => "nullable|date",
|
||||
];
|
||||
}
|
||||
|
||||
public function messages()
|
||||
{
|
||||
return [
|
||||
// message step 1
|
||||
"step1Form.uuid.required" => "UUID wajib diisi.",
|
||||
"step1Form.uuid.uuid" => "Format UUID tidak valid.",
|
||||
"step1Form.name.max" => "Nama tidak boleh lebih dari 255 karakter.",
|
||||
"step1Form.owner_name.max" => "Nama pemilik tidak boleh lebih dari 255 karakter.",
|
||||
"step1Form.registration_number.max" => "Nomor registrasi tidak boleh lebih dari 255 karakter.",
|
||||
"step1Form.document_number.max" => "Nomor dokumen tidak boleh lebih dari 255 karakter.",
|
||||
"step1Form.status.integer" => "Status harus berupa angka.",
|
||||
"step1Form.due_date.date" => "Tanggal jatuh tempo tidak valid.",
|
||||
"step1Form.land_certificate_phase.boolean" => "Fase sertifikat tanah harus berupa true/false.",
|
||||
];
|
||||
}
|
||||
}
|
||||
30
app/Http/Requests/RoleRequest.php
Normal file
30
app/Http/Requests/RoleRequest.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class RoleRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$roleId = $this->route('role');
|
||||
return [
|
||||
'name' => 'required|string|max:255|unique:roles,name,' . ($roleId ?? 'NULL') . ',id',
|
||||
'description' => 'nullable|string',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -22,20 +22,31 @@ class TourismRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'jenis_proyek' => 'string',
|
||||
'nib' => 'string',
|
||||
'project_id' => 'required|string',
|
||||
'project_type_id' => 'required|string',
|
||||
'nib' => 'required|string',
|
||||
'business_name' => 'required|string',
|
||||
'status_penanaman_modal' => 'string',
|
||||
'business_form' => 'string',
|
||||
'uraian_resiko_proyek' => '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_code' => 'required|string',
|
||||
'village_code' => 'required|string',
|
||||
'land_area' => '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',
|
||||
'number_of_employee' => 'required|string',
|
||||
'business_type_id' => 'required|string',
|
||||
'tki' => 'required|string',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ class UmkmRequest extends FormRequest
|
||||
|
||||
'business_id_number.string' => 'Nomor ID usaha harus berupa teks.',
|
||||
|
||||
'business_scale.required' => 'Skala usaha wajib diisi.',
|
||||
'business_scale_id.required' => 'Skala usaha wajib diisi.',
|
||||
|
||||
'owner_id.required' => 'ID pemilik wajib diisi.',
|
||||
'owner_id.string' => 'ID pemilik harus berupa teks.',
|
||||
@@ -96,7 +96,7 @@ class UmkmRequest extends FormRequest
|
||||
|
||||
'number_of_employee.required' => 'Jumlah karyawan wajib diisi.',
|
||||
|
||||
'permit_status.required' => 'Status izin 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.',
|
||||
|
||||
43
app/Http/Requests/UsersRequest.php
Normal file
43
app/Http/Requests/UsersRequest.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class UsersRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$userId = $this->route('user'); // 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), // Ignore the user's own email when updating
|
||||
],
|
||||
'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'],
|
||||
];
|
||||
}
|
||||
}
|
||||
26
app/Http/Resources/DataSettingResource.php
Normal file
26
app/Http/Resources/DataSettingResource.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class DataSettingResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'key' => $this->key,
|
||||
'value' => $this->value,
|
||||
'type' => $this->type,
|
||||
'created_at' => $this->created_at->toDateTimeString(),
|
||||
'updated_at' => $this->updated_at->toDateTimeString(),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,7 @@ class UserResource extends JsonResource
|
||||
'position' => $this->position,
|
||||
'firstname' => $this->firstname,
|
||||
'lastname' => $this->lastname,
|
||||
'roles' => $this->roles->pluck('name'),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
39
app/Imports/BusinessIndustriesImport.php
Normal file
39
app/Imports/BusinessIndustriesImport.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Imports;
|
||||
|
||||
use App\Models\BusinessOrIndustry;
|
||||
use Maatwebsite\Excel\Concerns\ToModel;
|
||||
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
class BusinessIndustriesImport implements ToCollection
|
||||
{
|
||||
/**
|
||||
* @param array $row
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Model|null
|
||||
*/
|
||||
public function collection(Collection $rows)
|
||||
{
|
||||
foreach ($rows->skip(1) as $row){
|
||||
$clean_nop = preg_replace('/[^A-Za-z0-9]/', '', $row[2]);
|
||||
if (!BusinessOrIndustry::where('nop', $clean_nop)->exists()) {
|
||||
BusinessOrIndustry::create([
|
||||
'nama_kecamatan' => $row[0],
|
||||
'nama_kelurahan' => $row[1],
|
||||
'nop' => $clean_nop, // Store cleaned 'nop'
|
||||
'nama_wajib_pajak' => $row[3],
|
||||
'alamat_wajib_pajak' => $row[4],
|
||||
'alamat_objek_pajak' => $row[5],
|
||||
'luas_bumi' => $row[6],
|
||||
'luas_bangunan' => $row[7],
|
||||
'njop_bumi' => $row[8],
|
||||
'njop_bangunan' => $row[9],
|
||||
'ketetapan' => $row[10],
|
||||
'tahun_pajak' => $row[11],
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ use Illuminate\Support\Collection;
|
||||
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use DateTime;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class TourismImport implements ToCollection
|
||||
{
|
||||
@@ -41,13 +42,11 @@ class TourismImport implements ToCollection
|
||||
if ($headerIndex === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
info($rows);
|
||||
|
||||
|
||||
foreach ($rows->skip(1) as $row) {
|
||||
// Normalisasi nama kecamatan dan desa
|
||||
$districtName = strtolower(trim(str_replace('Kecamatan', '', $row[13])));
|
||||
$villageName = strtolower(trim($row[14]));
|
||||
$districtName = strtolower(trim(str_replace('Kecamatan', '', $row[12])));
|
||||
$villageName = strtolower(trim($row[13]));
|
||||
|
||||
// Cari distric_code dari table districts
|
||||
$districtCode = $districts[$districtName] ?? null;
|
||||
@@ -66,24 +65,51 @@ class TourismImport implements ToCollection
|
||||
// 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],
|
||||
'jenis_proyek' => $row[2],
|
||||
'project_type_id' => $row[2],
|
||||
'nib' => $row[3],
|
||||
'business_name' => $row[4],
|
||||
'terbit_oss' => DateTime::createFromFormat('d/m/Y', $row[5])->format('Y-m-d'),
|
||||
'status_penanaman_modal' => $row[6],
|
||||
'oss_publication_date' => DateTime::createFromFormat('d/m/Y', $row[5]),
|
||||
'investment_status_description' => $row[6],
|
||||
'business_form' => $row[7],
|
||||
'uraian_resiko_proyek' => $row[8],
|
||||
'project_risk' => $row[8],
|
||||
'project_name' => $row[9],
|
||||
'business_type_id' => $row[10],
|
||||
'business_scale_id' => (int) $row[11],
|
||||
'business_scale' => $row[10],
|
||||
'business_address' => $row[12],
|
||||
'district_code' => $districtCode,
|
||||
'village_code' => $villageCode,
|
||||
'land_area' => $row[15],
|
||||
'investment_amount' => (string) $row[16],
|
||||
'number_of_employee' => (string) $row[17],
|
||||
'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]
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
125
app/Models/BigdataResume.php
Normal file
125
app/Models/BigdataResume.php
Normal file
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class BigdataResume extends Model
|
||||
{
|
||||
protected $table = "bigdata_resumes";
|
||||
|
||||
protected $fillable = [
|
||||
'import_datasource_id',
|
||||
'potention_count',
|
||||
'potention_sum',
|
||||
'non_verified_count',
|
||||
'non_verified_sum',
|
||||
'verified_count',
|
||||
'verified_sum',
|
||||
'business_count',
|
||||
'business_sum',
|
||||
'non_business_count',
|
||||
'non_business_sum',
|
||||
];
|
||||
|
||||
public function importDatasource()
|
||||
{
|
||||
return $this->belongsTo(ImportDatasource::class, 'import_datasource_id');
|
||||
}
|
||||
|
||||
public static function generateResumeData($import_datasource_id){
|
||||
$query_verified = once( function () {
|
||||
return DB::table('pbg_task AS pt')
|
||||
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
|
||||
->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) = ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||
->selectRaw('COUNT(pt.id) AS total_data,
|
||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
||||
->first();
|
||||
});
|
||||
|
||||
$verified_count = $query_verified->total_data ?? 0;
|
||||
$verified_total = $query_verified->total_retribution ?? 0;
|
||||
|
||||
$query_business = once(function () {
|
||||
return DB::table('pbg_task AS pt')
|
||||
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
|
||||
->where(function ($query) {
|
||||
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||
->orWhereNull('ptgs.status_verifikasi');
|
||||
})
|
||||
->where(function ($query) {
|
||||
$query->whereRaw('LOWER(TRIM(pt.function_type)) = ?', [strtolower(trim('Sebagai Tempat Usaha'))]);
|
||||
})
|
||||
->selectRaw('COUNT(pt.id) AS total_data,
|
||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
||||
->first();
|
||||
});
|
||||
|
||||
$business_count = $query_business->total_data ?? 0;
|
||||
$business_total = $query_business->total_retribution ?? 0;
|
||||
|
||||
$query_non_business = once( function () {
|
||||
return DB::table('pbg_task AS pt')
|
||||
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join ke pbg_task_retributions
|
||||
->where(function ($query) {
|
||||
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
|
||||
})
|
||||
->where(function ($query) {
|
||||
$query->whereRaw('LOWER(TRIM(pt.function_type)) != ?', [strtolower(trim('Sebagai Tempat Usaha'))])
|
||||
->orWhereNull('pt.function_type'); // Include NULL values
|
||||
})
|
||||
->selectRaw('COUNT(pt.id) AS total_data,
|
||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
||||
->first();
|
||||
});
|
||||
$non_business_count = $query_non_business->total_data ?? 0;
|
||||
$non_business_total = $query_non_business->total_retribution ?? 0;
|
||||
|
||||
$query_non_verified = once(function () {
|
||||
return DB::table('pbg_task AS pt')
|
||||
->leftJoin('pbg_task_google_sheet AS ptgs', 'pt.registration_number', '=', 'ptgs.no_registrasi')
|
||||
->leftJoin('pbg_task_retributions AS ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid') // Join tabel pbg_task_retributions
|
||||
->where(function ($query) {
|
||||
$query->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) != ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||
->orWhereNull('ptgs.status_verifikasi'); // Include NULL values
|
||||
})
|
||||
->selectRaw('COUNT(pt.id) AS total_data,
|
||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution') // Menambahkan SUM dari pbg_task_retributions
|
||||
->first();
|
||||
});
|
||||
|
||||
$non_verified_count = $query_non_verified->total_data ?? 0;
|
||||
$non_verified_total = $query_non_verified->total_retribution ?? 0;
|
||||
|
||||
$query_potention = once( function () {
|
||||
return DB::table('pbg_task as pt')
|
||||
->leftJoin('pbg_task_retributions as ptr', 'pt.uuid', '=', 'ptr.pbg_task_uid')
|
||||
->select(
|
||||
DB::raw('COUNT(DISTINCT pt.id) as task_count'),
|
||||
DB::raw('SUM(ptr.nilai_retribusi_bangunan) as total_retribution')
|
||||
)
|
||||
->first();
|
||||
});
|
||||
$potention_count = $query_potention->task_count ?? 0;
|
||||
$potention_total = $query_potention->total_retribution ?? 0;
|
||||
|
||||
return self::create([
|
||||
'import_datasource_id' => $import_datasource_id,
|
||||
'potention_count' => $potention_count ?? 0,
|
||||
'potention_sum' => $potention_total ?? 0.00,
|
||||
'non_verified_count' => $non_verified_count ?? 0,
|
||||
'non_verified_sum' => $non_verified_total ?? 0.00,
|
||||
'verified_count' => $verified_count ?? 0,
|
||||
'verified_sum' => $verified_total ?? 0.00,
|
||||
'business_count' => $business_count ?? 0,
|
||||
'business_sum' => $business_total ?? 0.00,
|
||||
'non_business_count' => $non_business_count ?? 0,
|
||||
'non_business_sum' => $non_business_total ?? 0.00,
|
||||
]);
|
||||
}
|
||||
}
|
||||
24
app/Models/BusinessOrIndustry.php
Normal file
24
app/Models/BusinessOrIndustry.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class BusinessOrIndustry extends Model
|
||||
{
|
||||
protected $table = "business_or_industries";
|
||||
protected $fillable = [
|
||||
'nama_kecamatan',
|
||||
'nama_kelurahan',
|
||||
'nop',
|
||||
'nama_wajib_pajak',
|
||||
'alamat_wajib_pajak',
|
||||
'alamat_objek_pajak',
|
||||
'luas_bumi',
|
||||
'luas_bangunan',
|
||||
'njop_bumi',
|
||||
'njop_bangunan',
|
||||
'ketetapan',
|
||||
'tahun_pajak',
|
||||
];
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class BusinessTypeCount extends Model
|
||||
{
|
||||
protected $table = 'business_type_counts';
|
||||
protected $primaryKey = null;
|
||||
|
||||
public $timestamps = false;
|
||||
protected $fillable = ['business_type', 'count'];
|
||||
}
|
||||
15
app/Models/DataSetting.php
Normal file
15
app/Models/DataSetting.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class DataSetting extends Model
|
||||
{
|
||||
protected $table = "data_settings";
|
||||
protected $fillable = [
|
||||
"key",
|
||||
"value",
|
||||
"type"
|
||||
];
|
||||
}
|
||||
25
app/Models/Menu.php
Normal file
25
app/Models/Menu.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Menu extends Model
|
||||
{
|
||||
protected $table = 'menus';
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'url',
|
||||
'icon',
|
||||
'parent_id',
|
||||
'sort_order'
|
||||
];
|
||||
|
||||
public function roles(){
|
||||
return $this->belongsToMany(Role::class, 'role_menu')->withTimestamps();
|
||||
}
|
||||
|
||||
public function children(){
|
||||
return $this->hasMany(Menu::class,'parent_id');
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,11 @@ class PbgTask extends Model
|
||||
'task_created_at'
|
||||
];
|
||||
|
||||
public function retributions(){
|
||||
public function pbg_task_retributions(){
|
||||
return $this->hasOne(PbgTaskRetributions::class, 'pbg_task_uid', 'uuid');
|
||||
}
|
||||
|
||||
public function pbg_task_index_integrations(){
|
||||
return $this->hasOne(PbgTaskIndexIntegrations::class, 'pbg_task_uid', 'uuid');
|
||||
}
|
||||
}
|
||||
|
||||
68
app/Models/PbgTaskGoogleSheet.php
Normal file
68
app/Models/PbgTaskGoogleSheet.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class PbgTaskGoogleSheet extends Model
|
||||
{
|
||||
protected $table = "pbg_task_google_sheet";
|
||||
|
||||
protected $fillable = [
|
||||
'jenis_konsultasi',
|
||||
'no_registrasi',
|
||||
'nama_pemilik',
|
||||
'lokasi_bg',
|
||||
'fungsi_bg',
|
||||
'nama_bangunan',
|
||||
'tgl_permohonan',
|
||||
'status_verifikasi',
|
||||
'status_permohonan',
|
||||
'alamat_pemilik',
|
||||
'no_hp',
|
||||
'email',
|
||||
'tanggal_catatan',
|
||||
'catatan_kekurangan_dokumen',
|
||||
'gambar',
|
||||
'krk_kkpr',
|
||||
'no_krk',
|
||||
'lh',
|
||||
'ska',
|
||||
'keterangan',
|
||||
'helpdesk',
|
||||
'pj',
|
||||
'kepemilikan',
|
||||
'potensi_taru',
|
||||
'validasi_dinas',
|
||||
'kategori_retribusi',
|
||||
'no_urut_ba_tpt',
|
||||
'tanggal_ba_tpt',
|
||||
'no_urut_ba_tpa',
|
||||
'tanggal_ba_tpa',
|
||||
'no_urut_skrd',
|
||||
'tanggal_skrd',
|
||||
'ptsp',
|
||||
'selesai_terbit',
|
||||
'tanggal_pembayaran',
|
||||
'format_sts',
|
||||
'tahun_terbit',
|
||||
'tahun_berjalan',
|
||||
'kelurahan',
|
||||
'kecamatan',
|
||||
'lb',
|
||||
'tb',
|
||||
'jlb',
|
||||
'unit',
|
||||
'usulan_retribusi',
|
||||
'nilai_retribusi_keseluruhan_simbg',
|
||||
'nilai_retribusi_keseluruhan_pad',
|
||||
'denda',
|
||||
'latitude',
|
||||
'longitude',
|
||||
'nik_nib',
|
||||
'dok_tanah',
|
||||
'temuan',
|
||||
];
|
||||
|
||||
|
||||
}
|
||||
@@ -21,4 +21,8 @@ class PbgTaskIndexIntegrations extends Model
|
||||
'indeks_terintegrasi',
|
||||
'total',
|
||||
];
|
||||
|
||||
public function pbg_task(){
|
||||
return $this->belongsTo(PbgTask::class, 'pbg_task_uid', 'uuid');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,5 +20,10 @@ class PbgTaskPrasarana extends Model
|
||||
'quantity',
|
||||
'unit',
|
||||
'index_prasarana',
|
||||
'pbg_task_retribution_id'
|
||||
];
|
||||
|
||||
public function pbg_task_retributions(){
|
||||
return $this->hasMany(PbgTaskRetributions::class, 'pbg_task_retribution_id', 'id');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,11 @@ class PbgTaskRetributions extends Model
|
||||
'pbg_task_uid'
|
||||
];
|
||||
|
||||
public function task(){
|
||||
public function pbg_task(){
|
||||
return $this->belongsTo(PbgTask::class, 'pbg_task_uid', 'uuid');
|
||||
}
|
||||
|
||||
public function pbg_task_prasarana(){
|
||||
return $this->hasMany(PbgTaskPrasarana::class, 'pbg_task_retribution_id', 'id');
|
||||
}
|
||||
}
|
||||
|
||||
22
app/Models/Role.php
Normal file
22
app/Models/Role.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Role extends Model
|
||||
{
|
||||
protected $table = 'roles';
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'description'
|
||||
];
|
||||
|
||||
public function users(){
|
||||
return $this->belongsToMany(User::class,'user_role')->withTimestamps();
|
||||
}
|
||||
|
||||
public function menus(){
|
||||
return $this->belongsToMany(Menu::class,'role_menu')->withTimestamps();
|
||||
}
|
||||
}
|
||||
30
app/Models/RoleMenu.php
Normal file
30
app/Models/RoleMenu.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class RoleMenu extends Model
|
||||
{
|
||||
protected $table = 'role_menu';
|
||||
protected $primary = ['role_id', 'menu_id'];
|
||||
public $incrementing = false;
|
||||
protected $fillable = [
|
||||
'role_id',
|
||||
'menu_id',
|
||||
'allow_show',
|
||||
'allow_create',
|
||||
'allow_update',
|
||||
'allow_destroy',
|
||||
];
|
||||
|
||||
public $timestamps = true;
|
||||
|
||||
public function role(){
|
||||
return $this->belongsTo(Role::class, 'role_id');
|
||||
}
|
||||
|
||||
public function menu(){
|
||||
return $this->belongsTo(Menu::class,'menu_id');
|
||||
}
|
||||
}
|
||||
@@ -8,25 +8,33 @@ use Illuminate\Database\Eloquent\Model;
|
||||
* Class Tourism
|
||||
*
|
||||
* @property $id
|
||||
* @property $project_id
|
||||
* @property $jenis_proyek
|
||||
* @property $nib
|
||||
* @property $created_at
|
||||
* @property $updated_at
|
||||
* @property $project_id
|
||||
* @property $project_type_id
|
||||
* @property $nib
|
||||
* @property $business_name
|
||||
* @property $terbit_oss
|
||||
* @property $status_penanaman_modal
|
||||
* @property $oss_publication_date
|
||||
* @property $investment_status_description
|
||||
* @property $business_form
|
||||
* @property $uraian_resiko_proyek
|
||||
* @property $project_risk
|
||||
* @property $project_name
|
||||
* @property $business_scale_id
|
||||
* @property $business_scale
|
||||
* @property $business_address
|
||||
* @property $district_code
|
||||
* @property $village_code
|
||||
* @property $land_area
|
||||
* @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 $number_of_employee
|
||||
* @property $business_type_id
|
||||
* @property $tki
|
||||
*
|
||||
* @package App
|
||||
* @mixin \Illuminate\Database\Eloquent\Builder
|
||||
@@ -41,7 +49,7 @@ class Tourism extends Model
|
||||
*
|
||||
* @var array<int, string>
|
||||
*/
|
||||
protected $fillable = ['project_id', 'jenis_proyek', 'nib', 'business_name', 'terbit_oss', 'status_penanaman_modal', 'business_form', 'uraian_resiko_proyek', 'project_name', 'business_scale_id', 'business_address', 'district_code', 'village_code', 'land_area', 'investment_amount', 'number_of_employee', 'business_type_id'];
|
||||
protected $fillable = ['project_id', 'project_type_id', 'nib', 'business_name', 'oss_publication_date', 'investment_status_description', 'business_form', 'project_risk', 'project_name', 'business_scale', 'business_address', 'district_code', 'village_code', 'longitude', 'latitude', 'project_submission_date', 'kbli', 'kbli_title', 'supervisory_sector', 'user_name', 'email', 'contact', 'land_area_in_m2', 'investment_amount', 'tki'];
|
||||
|
||||
|
||||
}
|
||||
|
||||
14
app/Models/TourismBasedKBLI.php
Normal file
14
app/Models/TourismBasedKBLI.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class TourismBasedKBLI extends Model
|
||||
{
|
||||
protected $table = 'v_tourisms_based_kbli';
|
||||
protected $primaryKey = null;
|
||||
|
||||
public $timestamps = false;
|
||||
protected $fillable = ['kbli_title', 'total_records'];
|
||||
}
|
||||
@@ -49,4 +49,8 @@ class User extends Authenticatable
|
||||
'password' => 'hashed',
|
||||
];
|
||||
}
|
||||
|
||||
public function roles(){
|
||||
return $this->belongsToMany(Role::class, 'user_role')->withTimestamps();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,296 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App;
|
||||
|
||||
use App\Enums\ImportDatasourceStatus;
|
||||
use App\Models\GlobalSetting;
|
||||
use App\Models\ImportDatasource;
|
||||
use App\Models\PbgTaskIndexIntegrations;
|
||||
use App\Models\PbgTaskPrasarana;
|
||||
use App\Models\PbgTaskRetributions;
|
||||
use Exception;
|
||||
use App\Models\PbgTask;
|
||||
use App\Traits\GlobalApiResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class ServiceSIMBG
|
||||
{
|
||||
use GlobalApiResponse;
|
||||
private $email;
|
||||
private $password;
|
||||
private $simbg_host;
|
||||
private $fetch_per_page;
|
||||
/**
|
||||
* Create a new class instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->email = trim((string) GlobalSetting::where('key','SIMBG_EMAIL')->first()->value);
|
||||
$this->password = trim((string) GlobalSetting::where('key','SIMBG_PASSWORD')->first()->value);
|
||||
$this->simbg_host = trim((string)GlobalSetting::where('key','SIMBG_HOST')->first()->value);
|
||||
$this->fetch_per_page = trim((string)GlobalSetting::where('key','FETCH_PER_PAGE')->first()->value);
|
||||
}
|
||||
|
||||
public function getToken(){
|
||||
$clientHelper = new ServiceClient($this->simbg_host);
|
||||
$url = "/api/user/v1/auth/login/";
|
||||
$body = [
|
||||
'email' => $this->email,
|
||||
'password' => $this->password,
|
||||
];
|
||||
|
||||
$res = $clientHelper->post($url, $body);
|
||||
if(!$res->original['success']){
|
||||
Log::error("Token not retrieved ", ['response' => $res]);
|
||||
return null;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function syncIndexIntegration($uuid, $token)
|
||||
{
|
||||
$clientHelper = new ServiceClient($this->simbg_host);
|
||||
$url = "/api/pbg/v1/detail/" . $uuid . "/retribution/indeks-terintegrasi/";
|
||||
|
||||
$headers = [
|
||||
'Authorization' => "Bearer " . $token,
|
||||
];
|
||||
|
||||
$res = $clientHelper->get($url, $headers);
|
||||
|
||||
if (empty($res->original['success']) || !$res->original['success']) {
|
||||
// Log error
|
||||
Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]);
|
||||
return false;
|
||||
}
|
||||
|
||||
$data = $res->original['data']['data'] ?? null;
|
||||
if (!$data) {
|
||||
Log::error("No valid data returned from API", ['url' => $url, 'uuid' => $uuid]);
|
||||
return false;
|
||||
}
|
||||
|
||||
$resultData = PbgTaskIndexIntegrations::updateOrCreate(
|
||||
['pbg_task_uid' => $uuid],
|
||||
[
|
||||
'indeks_fungsi_bangunan' => $data['indeks_fungsi_bangunan'] ?? null,
|
||||
'indeks_parameter_kompleksitas' => $data['indeks_parameter_kompleksitas'] ?? null,
|
||||
'indeks_parameter_permanensi' => $data['indeks_parameter_permanensi'] ?? null,
|
||||
'indeks_parameter_ketinggian' => $data['indeks_parameter_ketinggian'] ?? null,
|
||||
'faktor_kepemilikan' => $data['faktor_kepemilikan'] ?? null,
|
||||
'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null,
|
||||
'total' => $data['total'] ?? null,
|
||||
]
|
||||
);
|
||||
|
||||
// Log success
|
||||
if ($resultData->wasRecentlyCreated) {
|
||||
Log::info("integration created successfully", ['uuid' => $uuid]);
|
||||
} else {
|
||||
Log::info("integration updated successfully", ['uuid' => $uuid]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function syncTaskList()
|
||||
{
|
||||
$clientHelper = new ServiceClient($this->simbg_host);
|
||||
$initResToken = $this->getToken();
|
||||
|
||||
$importDatasource = ImportDatasource::create([
|
||||
'status' => ImportDatasourceStatus::Processing->value,
|
||||
]);
|
||||
|
||||
if (empty($initResToken->original['data']['token']['access'])) {
|
||||
$importDatasource->update([
|
||||
'status' => ImportDatasourceStatus::Failed->value,
|
||||
'message' => 'Failed to retrieve token'
|
||||
]);
|
||||
return $this->resError("Failed to retrieve token");
|
||||
}
|
||||
|
||||
$apiToken = $initResToken->original['data']['token']['access'];
|
||||
$headers = ['Authorization' => "Bearer " . $apiToken];
|
||||
|
||||
$url = "/api/pbg/v1/list/?page=1&size={$this->fetch_per_page}&sort=ASC";
|
||||
$initialResponse = $clientHelper->get($url, $headers);
|
||||
|
||||
$totalPage = $initialResponse->original['data']['total_page'] ?? 0;
|
||||
if ($totalPage == 0) {
|
||||
$importDatasource->update([
|
||||
'status' => ImportDatasourceStatus::Failed->value,
|
||||
'message' => 'Invalid response: no total_page'
|
||||
]);
|
||||
return $this->resError("Invalid response from API");
|
||||
}
|
||||
|
||||
$savedCount = $failedCount = 0;
|
||||
|
||||
for ($currentPage = 1; $currentPage <= $totalPage; $currentPage++) {
|
||||
$pageUrl = "/api/pbg/v1/list/?page={$currentPage}&size={$this->fetch_per_page}&sort=ASC";
|
||||
$getToken = $this->getToken();
|
||||
if (empty($getToken->original['data']['token']['access'])) {
|
||||
$importDatasource->update([
|
||||
'status' => ImportDatasourceStatus::Failed->value,
|
||||
'message' => 'Failed to retrieve token'
|
||||
]);
|
||||
break;
|
||||
}
|
||||
$token = $getToken->original['data']['token']['access'];
|
||||
$headers = ['Authorization' => "Bearer " . $token];
|
||||
$response = $clientHelper->get($pageUrl, $headers);
|
||||
$tasks = $response->original['data']['data'] ?? [];
|
||||
|
||||
if (empty($tasks)) {
|
||||
$importDatasource->update([
|
||||
'status' => ImportDatasourceStatus::Failed->value,
|
||||
'message' => 'No data found on page'
|
||||
]);
|
||||
Log::warning("No data found on page", ['page' => $currentPage]);
|
||||
break;
|
||||
}
|
||||
|
||||
Log::info("executed page", ['page' => $currentPage, 'total' => $totalPage]);
|
||||
|
||||
$tasksCollective = [];
|
||||
foreach ($tasks as $item) {
|
||||
try {
|
||||
$tasksCollective[] = [
|
||||
'uuid' => $item['uid'],
|
||||
'name' => $item['name'],
|
||||
'owner_name' => $item['owner_name'],
|
||||
'application_type' => $item['application_type'],
|
||||
'application_type_name' => $item['application_type_name'],
|
||||
'condition' => $item['condition'],
|
||||
'registration_number' => $item['registration_number'],
|
||||
'document_number' => $item['document_number'],
|
||||
'address' => $item['address'],
|
||||
'status' => $item['status'],
|
||||
'status_name' => $item['status_name'],
|
||||
'slf_status' => $item['slf_status'] ?? null,
|
||||
'slf_status_name' => $item['slf_status_name'] ?? null,
|
||||
'function_type' => $item['function_type'],
|
||||
'consultation_type' => $item['consultation_type'],
|
||||
'due_date' => $item['due_date'],
|
||||
'land_certificate_phase' => $item['land_certificate_phase'],
|
||||
'task_created_at' => isset($item['created_at']) ? Carbon::parse($item['created_at'])->format('Y-m-d H:i:s') : null,
|
||||
'updated_at' => now(),
|
||||
'created_at' => now(),
|
||||
];
|
||||
|
||||
$this->syncIndexIntegration($item['uid'], $token);
|
||||
$this->syncTaskDetailSubmit($item['uid'], $token);
|
||||
$savedCount++;
|
||||
} catch (Exception $e) {
|
||||
$failedCount++;
|
||||
$importDatasource->update([
|
||||
'status' => ImportDatasourceStatus::Failed->value,
|
||||
'message' => "Successfully processed: $savedCount, Failed: $failedCount"
|
||||
]);
|
||||
Log::error("Failed to process task", [
|
||||
'error' => $e->getMessage(),
|
||||
'task' => $item,
|
||||
]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
PbgTask::upsert($tasksCollective, ['uuid'], [
|
||||
'name', 'owner_name', 'application_type', 'application_type_name', 'condition',
|
||||
'registration_number', 'document_number', 'address', 'status', 'status_name',
|
||||
'slf_status', 'slf_status_name', 'function_type', 'consultation_type', 'due_date',
|
||||
'land_certificate_phase', 'task_created_at', 'updated_at'
|
||||
]);
|
||||
}
|
||||
|
||||
$importDatasource->update([
|
||||
'status' => ImportDatasourceStatus::Success->value,
|
||||
'message' => "Successfully processed: $savedCount, Failed: $failedCount"
|
||||
]);
|
||||
|
||||
Log::info("syncTaskList completed", ['savedCount' => $savedCount, 'failedCount' => $failedCount]);
|
||||
|
||||
return $this->resSuccess(['savedCount' => $savedCount, 'failedCount' => $failedCount]);
|
||||
}
|
||||
|
||||
|
||||
public function syncTaskDetailSubmit($uuid, $token)
|
||||
{
|
||||
$clientHelper = new ServiceClient($this->simbg_host);
|
||||
|
||||
$url = "/api/pbg/v1/detail/" . $uuid . "/retribution/submit/";
|
||||
$headers = [
|
||||
'Authorization' => "Bearer " . $token,
|
||||
];
|
||||
|
||||
$res = $clientHelper->get($url, $headers);
|
||||
|
||||
if (empty($res->original['success']) || !$res->original['success']) {
|
||||
// Log error
|
||||
Log::error("API response indicates failure", ['url' => $url, 'uuid' => $uuid]);
|
||||
return false;
|
||||
}
|
||||
|
||||
$data = $res->original['data']['data'] ?? [];
|
||||
if (empty($data)) {
|
||||
Log::error("No data returned from API", ['url' => $url, 'uuid' => $uuid]);
|
||||
return false;
|
||||
}
|
||||
|
||||
$detailCreatedAt = isset($data['created_at'])
|
||||
? Carbon::parse($data['created_at'])->format('Y-m-d H:i:s')
|
||||
: null;
|
||||
|
||||
$detailUpdatedAt = isset($data['updated_at'])
|
||||
? Carbon::parse($data['updated_at'])->format('Y-m-d H:i:s')
|
||||
: null;
|
||||
|
||||
PbgTaskRetributions::updateOrCreate(
|
||||
['detail_id' => $data['id']],
|
||||
[
|
||||
'detail_uid' => $data['uid'] ?? null,
|
||||
'detail_created_at' => $detailCreatedAt ?? null,
|
||||
'detail_updated_at' => $detailUpdatedAt ?? null,
|
||||
'luas_bangunan' => $data['luas_bangunan'] ?? null,
|
||||
'indeks_lokalitas' => $data['indeks_lokalitas'] ?? null,
|
||||
'wilayah_shst' => $data['wilayah_shst'] ?? null,
|
||||
'kegiatan_id' => $data['kegiatan']['id'] ?? null,
|
||||
'kegiatan_name' => $data['kegiatan']['name'] ?? null,
|
||||
'nilai_shst' => $data['nilai_shst'] ?? null,
|
||||
'indeks_terintegrasi' => $data['indeks_terintegrasi'] ?? null,
|
||||
'indeks_bg_terbangun' => $data['indeks_bg_terbangun'] ?? null,
|
||||
'nilai_retribusi_bangunan' => $data['nilai_retribusi_bangunan'] ?? null,
|
||||
'nilai_prasarana' => $data['nilai_prasarana'] ?? null,
|
||||
'created_by' => $data['created_by'] ?? null,
|
||||
'pbg_document' => $data['pbg_document'] ?? null,
|
||||
'underpayment' => $data['underpayment'] ?? null,
|
||||
'skrd_amount' => $data['skrd_amount'] ?? null,
|
||||
'pbg_task_uid' => $uuid,
|
||||
]
|
||||
);
|
||||
|
||||
$prasaranaData = $data['prasarana'] ?? [];
|
||||
if (!empty($prasaranaData)) {
|
||||
$insertData = array_map(fn($item) => [
|
||||
'pbg_task_uid' => $uuid,
|
||||
'prasarana_id' => $item['id'] ?? null,
|
||||
'prasarana_type' => $item['prasarana_type'] ?? null,
|
||||
'building_type' => $item['building_type'] ?? null,
|
||||
'total' => $item['total'] ?? null,
|
||||
'quantity' => $item['quantity'] ?? null,
|
||||
'unit' => $item['unit'] ?? null,
|
||||
'index_prasarana' => $item['index_prasarana'] ?? null,
|
||||
], $prasaranaData);
|
||||
|
||||
// Use bulk insert or upsert for faster database operation
|
||||
PbgTaskPrasarana::upsert($insertData, ['pbg_task_uid', 'prasarana_id']);
|
||||
}
|
||||
|
||||
Log::info("retribution and prasarana successfully", ['uuid' => $uuid]);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
152
app/Services/GoogleSheetService.php
Normal file
152
app/Services/GoogleSheetService.php
Normal file
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Google_Client;
|
||||
use Google_Service_Sheets;
|
||||
|
||||
class GoogleSheetService
|
||||
{
|
||||
/**
|
||||
* Create a new class instance.
|
||||
*/
|
||||
protected $client;
|
||||
protected $service;
|
||||
protected $spreadsheetID;
|
||||
public function __construct()
|
||||
{
|
||||
$this->client = new Google_Client();
|
||||
$this->client->setApplicationName("Sibedas Google Sheets API");
|
||||
$this->client->setScopes([Google_Service_Sheets::SPREADSHEETS_READONLY]);
|
||||
$this->client->setAuthConfig(storage_path("app/teak-banner-450003-s8-ea05661d9db0.json"));
|
||||
$this->client->setAccessType("offline");
|
||||
|
||||
$this->service = new Google_Service_Sheets($this->client);
|
||||
$this->spreadsheetID = env("SPREAD_SHEET_ID");
|
||||
|
||||
$this->service_sheets = new Google_Service_Sheets($this->client);
|
||||
}
|
||||
|
||||
public function getSheetData($range){
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
return $response->getValues();
|
||||
}
|
||||
|
||||
public function getLastRowByColumn($column = "A")
|
||||
{
|
||||
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 0;
|
||||
}catch(\Exception $e){
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
public function getHeader()
|
||||
{
|
||||
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()
|
||||
{
|
||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||
$sheets = $spreadsheet->getSheets();
|
||||
|
||||
// Ambil nama sheet pertama
|
||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||
|
||||
// Ambil baris pertama untuk mendapatkan jumlah kolom yang terisi
|
||||
$range = "{$firstSheetTitle}!1:1";
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
$values = $response->getValues();
|
||||
|
||||
// Hitung jumlah kolom yang memiliki nilai
|
||||
return !empty($values) ? count(array_filter($values[0], fn($value) => $value !== "")) : 0;
|
||||
}
|
||||
|
||||
public function getSheetDataCollection($totalRow = 10){
|
||||
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();
|
||||
$sheetTitle = $sheets[$no_sheet]->getProperties()->getTitle();
|
||||
$range = "{$sheetTitle}";
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
$values = $response->getValues();
|
||||
return!empty($values)? $values : [];
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App;
|
||||
namespace App\Services;
|
||||
use App\Traits\GlobalApiResponse;
|
||||
use GuzzleHttp\Client;
|
||||
use Exception;
|
||||
@@ -26,7 +26,7 @@ class ServiceClient
|
||||
);
|
||||
}
|
||||
|
||||
public function makeRequest($url, $method = 'GET', $body = null, $headers = [], $timeout = 300){
|
||||
public function makeRequest($url, $method = 'GET', $body = null, $headers = [], $timeout = 14400){
|
||||
try {
|
||||
|
||||
$headers = array_merge($this->headers, $headers);
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
315
app/Services/ServiceSIMBG.php
Normal file
315
app/Services/ServiceSIMBG.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
26
app/View/Components/CustomCircle.php
Normal file
26
app/View/Components/CustomCircle.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\View\Components;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\View\Component;
|
||||
|
||||
class CustomCircle extends Component
|
||||
{
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*/
|
||||
public function render(): View|Closure|string
|
||||
{
|
||||
return view('components.custom-circle');
|
||||
}
|
||||
}
|
||||
25
app/View/Components/ModalConfirmation.php
Normal file
25
app/View/Components/ModalConfirmation.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\View\Components;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\View\Component;
|
||||
|
||||
class ModalConfirmation extends Component
|
||||
{
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*/
|
||||
public function render(): View|Closure|string
|
||||
{
|
||||
return view('components.modal-confirmation');
|
||||
}
|
||||
}
|
||||
25
app/View/Components/ToastNotification.php
Normal file
25
app/View/Components/ToastNotification.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\View\Components;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\View\Component;
|
||||
|
||||
class ToastNotification extends Component
|
||||
{
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*/
|
||||
public function render(): View|Closure|string
|
||||
{
|
||||
return view('components.toast-notification');
|
||||
}
|
||||
}
|
||||
@@ -3,10 +3,14 @@
|
||||
"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",
|
||||
"google/apiclient": "^2.12",
|
||||
"guzzlehttp/guzzle": "^7.9",
|
||||
"laravel/framework": "^11.31",
|
||||
"laravel/sanctum": "^4.0",
|
||||
|
||||
1381
composer.lock
generated
Executable file → Normal file
1381
composer.lock
generated
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
@@ -123,4 +123,5 @@ return [
|
||||
'store' => env('APP_MAINTENANCE_STORE', 'database'),
|
||||
],
|
||||
|
||||
'api_url' => env('API_URL', 'http://localhost:8000')
|
||||
];
|
||||
|
||||
52
config/laravel-code-generator.php
Normal file
52
config/laravel-code-generator.php
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| CodeGenerator config overrides
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| It is a good idea to separate your configuration form the code-generator's
|
||||
| own configuration. This way you won't lose any settings/preference
|
||||
| you have when upgrading to a new version of the package.
|
||||
|
|
||||
| Additionally, you will always know any the configuration difference between
|
||||
| the default config than your own.
|
||||
|
|
||||
| To override the setting that is found in the 'config/default.php' file, you'll
|
||||
| need to create identical key here with a different value
|
||||
|
|
||||
| IMPORTANT: When overriding an option that is an array, the configurations
|
||||
| are merged together using php's array_merge() function. This means that
|
||||
| any option that you list here will take presence during a conflict in keys.
|
||||
|
|
||||
| EXAMPLE: The following addition to this file, will add another entry in
|
||||
| the common_definitions collection
|
||||
|
|
||||
| 'common_definitions' =>
|
||||
| [
|
||||
| [
|
||||
| 'match' => '*_at',
|
||||
| 'set' => [
|
||||
| 'css-class' => 'datetime-picker',
|
||||
| ],
|
||||
| ],
|
||||
| ],
|
||||
|
|
||||
*/
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| The default path of where the uploaded files live.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You can use Laravel Storage filesystem. By default, the code-generator
|
||||
| uses the default file system.
|
||||
| For more info about Laravel's file system visit
|
||||
| https://laravel.com/docs/5.5/filesystem
|
||||
|
|
||||
*/
|
||||
'files_upload_path' => 'uploads',
|
||||
|
||||
];
|
||||
92138
database/inject-data-seeder/villages_202502082240.sql
Normal file
92138
database/inject-data-seeder/villages_202502082240.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('data_settings', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('key')->unique();
|
||||
$table->string('value');
|
||||
$table->string('type')->nullable()->default('integer');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('data_settings');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('pbg_task_google_sheet', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('jenis_konsultasi')->nullable();
|
||||
$table->string('no_registrasi')->nullable()->unique();
|
||||
$table->string('nama_pemilik')->nullable();
|
||||
$table->text('lokasi_bg')->nullable();
|
||||
$table->string('fungsi_bg')->nullable();
|
||||
$table->string('nama_bangunan')->nullable();
|
||||
$table->date('tgl_permohonan')->nullable();
|
||||
$table->string('status_verifikasi')->nullable();
|
||||
$table->string('status_permohonan')->nullable();
|
||||
$table->text('alamat_pemilik')->nullable();
|
||||
$table->string('no_hp')->nullable();
|
||||
$table->string('email')->nullable();
|
||||
$table->date('tanggal_catatan')->nullable();
|
||||
$table->text('catatan_kekurangan_dokumen')->nullable();
|
||||
$table->string('gambar')->nullable();
|
||||
$table->string('krk_kkpr')->nullable();
|
||||
$table->string('no_krk')->nullable();
|
||||
$table->string('lh')->nullable();
|
||||
$table->string('ska')->nullable();
|
||||
$table->text('keterangan')->nullable();
|
||||
$table->string('helpdesk')->nullable();
|
||||
$table->string('pj')->nullable();
|
||||
$table->string('kepemilikan')->nullable();
|
||||
$table->string('potensi_taru')->nullable();
|
||||
$table->string('validasi_dinas')->nullable();
|
||||
$table->string('kategori_retribusi')->nullable();
|
||||
$table->string('no_urut_ba_tpt')->nullable();
|
||||
$table->date('tanggal_ba_tpt')->nullable();
|
||||
$table->string('no_urut_ba_tpa')->nullable();
|
||||
$table->date('tanggal_ba_tpa')->nullable();
|
||||
$table->string('no_urut_skrd')->nullable();
|
||||
$table->date('tanggal_skrd')->nullable();
|
||||
$table->string('ptsp')->nullable();
|
||||
$table->string('selesai_terbit')->nullable();
|
||||
$table->date('tanggal_pembayaran')->nullable();
|
||||
$table->string('format_sts')->nullable();
|
||||
$table->integer('tahun_terbit')->nullable();
|
||||
$table->integer('tahun_berjalan')->nullable();
|
||||
$table->string('kelurahan')->nullable();
|
||||
$table->string('kecamatan')->nullable();
|
||||
$table->decimal('lb', 20,2)->nullable();
|
||||
$table->decimal('tb', 20, 2)->nullable();
|
||||
$table->integer('jlb')->nullable();
|
||||
$table->integer('unit')->nullable();
|
||||
$table->integer('usulan_retribusi')->nullable();
|
||||
$table->decimal('nilai_retribusi_keseluruhan_simbg', 20, 2)->nullable();
|
||||
$table->decimal('nilai_retribusi_keseluruhan_pad', 20, 2)->nullable();
|
||||
$table->decimal('denda', 20, 2)->nullable();
|
||||
$table->string('latitude')->nullable();
|
||||
$table->string('longitude')->nullable();
|
||||
$table->string('nik_nib')->nullable();
|
||||
$table->string('dok_tanah')->nullable();
|
||||
$table->text('temuan')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('pbg_task_google_sheet');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('pbg_task', function (Blueprint $table) {
|
||||
$constraintExists = DB::select("
|
||||
SELECT COUNT(*) as count
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'pbg_task'
|
||||
AND index_name = 'pbg_task_uuid_unique'
|
||||
");
|
||||
|
||||
if ($constraintExists[0]->count > 0) {
|
||||
$table->dropUnique('pbg_task_uuid_unique');
|
||||
}
|
||||
$table->string('uuid')->nullable()->unique()->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('pbg_task', function (Blueprint $table) {
|
||||
$table->dropUnique('pbg_task_uuid_unique');
|
||||
$table->string('uuid')->nullable()->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('pbg_task_index_integrations', function (Blueprint $table) {
|
||||
$constraintExists = DB::select("
|
||||
SELECT COUNT(*) as count
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'pbg_task_index_integrations'
|
||||
AND index_name = 'pbg_task_index_integrations_pbg_task_uid_unique'
|
||||
");
|
||||
|
||||
if ($constraintExists[0]->count > 0) {
|
||||
$table->dropUnique('pbg_task_index_integrations_pbg_task_uid_unique');
|
||||
}
|
||||
$table->string('pbg_task_uid')->unique()->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('pbg_task_index_integrations', function (Blueprint $table) {
|
||||
$table->dropUnique('pbg_task_index_integrations_pbg_task_uid_unique');
|
||||
$table->string('pbg_task_uid')->unique()->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('pbg_task_retributions', function (Blueprint $table) {
|
||||
$constraintExists = DB::select("
|
||||
SELECT COUNT(*) as count
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'pbg_task_retributions'
|
||||
AND index_name = 'pbg_task_retributions_detail_id_unique'
|
||||
");
|
||||
|
||||
if ($constraintExists[0]->count > 0) {
|
||||
$table->dropUnique('pbg_task_retributions_detail_id_unique');
|
||||
}
|
||||
$table->string('detail_id')->unique()->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('pbg_task_retributions', function (Blueprint $table) {
|
||||
$table->dropUnique('pbg_task_retributions_detail_id_unique');
|
||||
$table->string('detail_id')->unique()->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('pbg_task_prasarana', function (Blueprint $table) {
|
||||
$constraintExists = DB::select("
|
||||
SELECT COUNT(*) as count
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'pbg_task_prasarana'
|
||||
AND index_name = 'pbg_task_prasarana_prasarana_id_unique'
|
||||
");
|
||||
|
||||
if ($constraintExists[0]->count > 0) {
|
||||
$table->dropUnique('pbg_task_prasarana_prasarana_id_unique');
|
||||
}
|
||||
$table->integer('prasarana_id')->nullable()->unique()->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('pbg_task_prasarana', function (Blueprint $table) {
|
||||
$table->dropUnique('pbg_task_prasarana_prasarana_id_unique');
|
||||
$table->integer('prasarana_id')->nullable()->unique()->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('pbg_task_prasarana', function (Blueprint $table) {
|
||||
$table->unsignedBigInteger('pbg_task_retribution_id')->nullable(); // nullable in case some records do not match
|
||||
|
||||
// Step 2: Define the foreign key relation from `table3` to `table2`
|
||||
$table->foreign('pbg_task_retribution_id')->references('id')->on('pbg_task_retributions')->onDelete('cascade');
|
||||
});
|
||||
|
||||
\DB::table('pbg_task_prasarana')
|
||||
->join('pbg_task', 'pbg_task.uuid', '=', 'pbg_task_prasarana.pbg_task_uid') // Relating pbg_task_prasarana to pbg_task
|
||||
->join('pbg_task_retributions', 'pbg_task_retributions.pbg_task_uid', '=', 'pbg_task.uuid') // Relating pbg_task_retributions to pbg_task
|
||||
->whereNotNull('pbg_task_retributions.id') // Ensure the `pbg_task_retributions` id exists
|
||||
->update(['pbg_task_prasarana.pbg_task_retribution_id' => \DB::raw('pbg_task_retributions.id')]); // Set the foreign key
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('pbg_task_prasarana', function (Blueprint $table) {
|
||||
$table->dropForeign(['pbg_task_retribution_id']);
|
||||
$table->dropColumn('pbg_task_retribution_id');
|
||||
});
|
||||
}
|
||||
};
|
||||
29
database/migrations/2025_02_10_104053_create_roles_table.php
Normal file
29
database/migrations/2025_02_10_104053_create_roles_table.php
Normal 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');
|
||||
}
|
||||
};
|
||||
33
database/migrations/2025_02_10_104254_create_menus_table.php
Normal file
33
database/migrations/2025_02_10_104254_create_menus_table.php
Normal 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');
|
||||
}
|
||||
};
|
||||
@@ -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');
|
||||
}
|
||||
};
|
||||
@@ -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');
|
||||
}
|
||||
};
|
||||
@@ -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']);
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -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');
|
||||
}
|
||||
};
|
||||
@@ -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');
|
||||
}
|
||||
};
|
||||
@@ -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');
|
||||
}
|
||||
};
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
};
|
||||
70
database/seeders/DataSettingSeeder.php
Normal file
70
database/seeders/DataSettingSeeder.php
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\DataSetting;
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class DataSettingSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$data_settings = [
|
||||
[
|
||||
"key" => "TARGET_PAD",
|
||||
"value" => "50000000000",
|
||||
"type" => "integer"
|
||||
],
|
||||
[
|
||||
"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) {
|
||||
DataSetting::updateOrCreate([
|
||||
"key" => $setting["key"],
|
||||
],[
|
||||
"value" => $setting["value"],
|
||||
"type" => $setting["type"],
|
||||
"created_at" => now(),
|
||||
"updated_at" => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
258
database/seeders/UsersRoleMenuSeeder.php
Normal file
258
database/seeders/UsersRoleMenuSeeder.php
Normal file
@@ -0,0 +1,258 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\Menu;
|
||||
use App\Models\Role;
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class UsersRoleMenuSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$roles = [
|
||||
[
|
||||
"name" => "superadmin",
|
||||
"description" => "show all menus for super admins",
|
||||
],
|
||||
[
|
||||
"name" => "admin",
|
||||
"description" => "show only necessary menus for admins",
|
||||
],
|
||||
[
|
||||
"name" => "operator",
|
||||
"description" => "show only necessary menus for operators",
|
||||
]
|
||||
];
|
||||
|
||||
Role::upsert($roles, ['name']);
|
||||
|
||||
$parent_menus = [
|
||||
[
|
||||
"name" => "Dashboard",
|
||||
"url" => "/dashboard",
|
||||
"icon" => "mingcute:home-3-line",
|
||||
"parent_id" => null,
|
||||
"sort_order" => 1,
|
||||
],
|
||||
[
|
||||
"name" => "Master",
|
||||
"url" => "/master",
|
||||
"icon" => "mingcute:cylinder-line",
|
||||
"parent_id" => null,
|
||||
"sort_order" => 2,
|
||||
],
|
||||
[
|
||||
"name" => "Settings",
|
||||
"url" => "/settings",
|
||||
"icon" => "mingcute:settings-6-line",
|
||||
"parent_id" => null,
|
||||
"sort_order" => 3,
|
||||
],
|
||||
[
|
||||
"name" => "Data Settings",
|
||||
"url" => "/data-settings",
|
||||
"icon" => "mingcute:settings-1-line",
|
||||
"parent_id" => null,
|
||||
"sort_order" => 4,
|
||||
],
|
||||
[
|
||||
"name" => "Data",
|
||||
"url" => "/data",
|
||||
"icon" => "mingcute:task-line",
|
||||
"parent_id" => null,
|
||||
"sort_order" => 5,
|
||||
],
|
||||
[
|
||||
"name" => "Laporan",
|
||||
"url" => "/laporan",
|
||||
"icon" => "mingcute:task-line",
|
||||
"parent_id" => null,
|
||||
"sort_order" => 6,
|
||||
]
|
||||
];
|
||||
|
||||
foreach ($parent_menus as $parent_menu) {
|
||||
Menu::firstOrCreate(['name' => $parent_menu['name']], $parent_menu);
|
||||
}
|
||||
|
||||
// Attach Menus to Roles
|
||||
$superadmin = Role::where('name', 'superadmin')->first();
|
||||
$admin = Role::where('name', 'admin')->first();
|
||||
$operator = Role::where('name', 'operator')->first();
|
||||
|
||||
$dashboard = Menu::where('name', 'Dashboard')->first();
|
||||
$master = Menu::where('name', 'Master')->first();
|
||||
$settings = Menu::where('name', 'Settings')->first();
|
||||
$dataSettings = Menu::where('name', 'Data Settings')->first();
|
||||
$data = Menu::where('name', 'Data')->first();
|
||||
$laporan = Menu::where('name', 'Laporan')->first();
|
||||
|
||||
// create children menu
|
||||
$children_menus = [
|
||||
[
|
||||
"name" => "Dashboard Pimpinan",
|
||||
"url" => "dashboard.home",
|
||||
"icon" => null,
|
||||
"parent_id" => $dashboard->id,
|
||||
"sort_order" => 1,
|
||||
],
|
||||
[
|
||||
"name" => "Dashboard PBG",
|
||||
"url" => "dashboard.pbg",
|
||||
"icon" => null,
|
||||
"parent_id" => $dashboard->id,
|
||||
"sort_order" => 2,
|
||||
],
|
||||
[
|
||||
"name" => "Dashboard Potensi",
|
||||
"url" => "dashboard.lack_of_potential",
|
||||
"icon" => null,
|
||||
"parent_id" => $dashboard->id,
|
||||
"sort_order" => 3,
|
||||
],
|
||||
[
|
||||
"name" => "Users",
|
||||
"url" => "users.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $master->id,
|
||||
"sort_order" => 1,
|
||||
],
|
||||
[
|
||||
"name" => "Syncronize",
|
||||
"url" => "settings.syncronize",
|
||||
"icon" => null,
|
||||
"parent_id" => $settings->id,
|
||||
"sort_order" => 1,
|
||||
],
|
||||
[
|
||||
"name" => "Menu",
|
||||
"url" => "menus.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $settings->id,
|
||||
"sort_order" => 2,
|
||||
],
|
||||
[
|
||||
"name" => "Role",
|
||||
"url" => "roles.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $settings->id,
|
||||
"sort_order" => 3,
|
||||
],
|
||||
[
|
||||
"name" => "Setting Dashboard",
|
||||
"url" => "data-settings.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $dataSettings->id,
|
||||
"sort_order" => 1,
|
||||
],
|
||||
[
|
||||
"name" => "PBG",
|
||||
"url" => "pbg-task.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $data->id,
|
||||
"sort_order" => 1,
|
||||
],
|
||||
[
|
||||
"name" => "Reklame",
|
||||
"url" => "advertisements.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $data->id,
|
||||
"sort_order" => 2,
|
||||
],
|
||||
[
|
||||
"name" => "Usaha atau Industri",
|
||||
"url" => "business-industries.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $data->id,
|
||||
"sort_order" => 3,
|
||||
],
|
||||
[
|
||||
"name" => "UMKM",
|
||||
"url" => "umkm.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $data->id,
|
||||
"sort_order" => 4,
|
||||
],
|
||||
[
|
||||
"name" => "Pariwisata",
|
||||
"url" => "tourisms.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $data->id,
|
||||
"sort_order" => 5,
|
||||
],
|
||||
[
|
||||
"name" => "Lap Pariwisata",
|
||||
"url" => "tourisms.index",
|
||||
"icon" => null,
|
||||
"parent_id" => $laporan->id,
|
||||
"sort_order" => 1,
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($children_menus as $child_menu) {
|
||||
Menu::firstOrCreate(['name' => $child_menu['name']], $child_menu);
|
||||
}
|
||||
|
||||
$dashboard_pimpinan = Menu::where('name', 'Dashboard Pimpinan')->first();
|
||||
$dashboard_pbg = Menu::where('name', 'Dashboard PBG')->first();
|
||||
$users = Menu::where('name', 'Users')->first();
|
||||
$syncronize = Menu::where('name', 'Syncronize')->first();
|
||||
$setting_menu = Menu::where('name', 'Menu')->first();
|
||||
$setting_role = Menu::where('name', 'Role')->first();
|
||||
$setting_dashboard = Menu::where('name', 'Setting Dashboard')->first();
|
||||
$setting_pbg = Menu::where('name', 'PBG')->first();
|
||||
$reklame = Menu::where('name', 'Reklame')->first();
|
||||
$businessIndustries = Menu::where('name', 'Usaha atau Industri')->first();
|
||||
$pariwisata = Menu::where('name', 'Pariwisata')->first();
|
||||
$laporan_pariwisata = Menu::where('name', 'Lap Pariwisata')->first();
|
||||
$umkm = Menu::where('name', 'UMKM')->first();
|
||||
$lack_of_potentials = Menu::where('name', 'Dashboard Potensi')->first();
|
||||
|
||||
// Superadmin gets all menus
|
||||
$superadmin->menus()->sync([
|
||||
// parent
|
||||
$dashboard->id => ["allow_show" => true, "allow_create" => false, "allow_update" => false, "allow_destroy" => false],
|
||||
$master->id => ["allow_show" => true, "allow_create" => false, "allow_update" => false, "allow_destroy" => false],
|
||||
$settings->id => ["allow_show" => true, "allow_create" => false, "allow_update" => false, "allow_destroy" => false],
|
||||
$dataSettings->id => ["allow_show" => true, "allow_create" => false, "allow_update" => false, "allow_destroy" => false],
|
||||
$data->id => ["allow_show" => true, "allow_create" => false, "allow_update" => false, "allow_destroy" => false],
|
||||
$laporan->id => ["allow_show" => true, "allow_create" => false, "allow_update" => false, "allow_destroy" => false],
|
||||
// children
|
||||
$dashboard_pimpinan->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$dashboard_pbg->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$users->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$syncronize->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$setting_menu->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$setting_role->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$setting_dashboard->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$setting_pbg->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$reklame->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$businessIndustries->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$pariwisata->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$laporan_pariwisata->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$umkm->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$lack_of_potentials->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
]);
|
||||
|
||||
// Admin gets limited menus
|
||||
$admin->menus()->sync([
|
||||
$dashboard->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$master->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$settings->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
]);
|
||||
|
||||
// Operator gets only basic menus with full permissions
|
||||
$operator->menus()->sync([
|
||||
$dashboard->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
$data->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
|
||||
]);
|
||||
// Attach User to role super admin
|
||||
User::findOrFail(1)->roles()->sync([$superadmin->id]);
|
||||
}
|
||||
}
|
||||
63
package-lock.json
generated
63
package-lock.json
generated
@@ -6,6 +6,7 @@
|
||||
"": {
|
||||
"dependencies": {
|
||||
"apexcharts": "^3.44.2",
|
||||
"big.js": "^6.2.2",
|
||||
"bootstrap": "^5.3.3",
|
||||
"countup.js": "^2.3.2",
|
||||
"dropzone": "^5.9.0",
|
||||
@@ -60,22 +61,6 @@
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-x64": {
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
|
||||
"integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/types": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
|
||||
@@ -262,26 +247,6 @@
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-win32-x64": {
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
|
||||
"integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@pkgjs/parseargs": {
|
||||
"version": "0.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
|
||||
@@ -328,19 +293,6 @@
|
||||
"linux"
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||
"version": "4.28.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz",
|
||||
"integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
]
|
||||
},
|
||||
"node_modules/@types/estree": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
|
||||
@@ -478,6 +430,19 @@
|
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/big.js": {
|
||||
"version": "6.2.2",
|
||||
"resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz",
|
||||
"integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/bigjs"
|
||||
}
|
||||
},
|
||||
"node_modules/binary-extensions": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"apexcharts": "^3.44.2",
|
||||
"big.js": "^6.2.2",
|
||||
"bootstrap": "^5.3.3",
|
||||
"countup.js": "^2.3.2",
|
||||
"dropzone": "^5.9.0",
|
||||
|
||||
516
public/build/.vite/manifest.json
Normal file
516
public/build/.vite/manifest.json
Normal file
@@ -0,0 +1,516 @@
|
||||
{
|
||||
"__commonjsHelpers-C4iS2aBk.js": {
|
||||
"file": "assets/_commonjsHelpers-C4iS2aBk.js",
|
||||
"name": "_commonjsHelpers"
|
||||
},
|
||||
"_apexcharts.common-7mov3gaG.js": {
|
||||
"file": "assets/apexcharts.common-7mov3gaG.js",
|
||||
"name": "apexcharts.common",
|
||||
"imports": [
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"_dropzone-B5tMhgFp.js": {
|
||||
"file": "assets/dropzone-B5tMhgFp.js",
|
||||
"name": "dropzone"
|
||||
},
|
||||
"_global-config-9uDKFQ8j.js": {
|
||||
"file": "assets/global-config-9uDKFQ8j.js",
|
||||
"name": "global-config"
|
||||
},
|
||||
"_gridjs.umd-BiCNXlqL.js": {
|
||||
"file": "assets/gridjs.umd-BiCNXlqL.js",
|
||||
"name": "gridjs.umd",
|
||||
"imports": [
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"_table-generator-DPFVsCqk.js": {
|
||||
"file": "assets/table-generator-DPFVsCqk.js",
|
||||
"name": "table-generator",
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js"
|
||||
]
|
||||
},
|
||||
"_world-BH8KG5u4.js": {
|
||||
"file": "assets/world-BH8KG5u4.js",
|
||||
"name": "world",
|
||||
"imports": [
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"node_modules/flatpickr/dist/flatpickr.min.css": {
|
||||
"file": "assets/flatpickr-CksuuEqD.css",
|
||||
"src": "node_modules/flatpickr/dist/flatpickr.min.css",
|
||||
"isEntry": true
|
||||
},
|
||||
"node_modules/flatpickr/dist/themes/dark.css": {
|
||||
"file": "assets/dark-CLxH30By.css",
|
||||
"src": "node_modules/flatpickr/dist/themes/dark.css",
|
||||
"isEntry": true
|
||||
},
|
||||
"node_modules/gridjs/dist/theme/mermaid.css": {
|
||||
"file": "assets/mermaid-B5wPN5RC.css",
|
||||
"src": "node_modules/gridjs/dist/theme/mermaid.css",
|
||||
"isEntry": true
|
||||
},
|
||||
"node_modules/gridjs/dist/theme/mermaid.min.css": {
|
||||
"file": "assets/mermaid-1KsrsKla.css",
|
||||
"src": "node_modules/gridjs/dist/theme/mermaid.min.css",
|
||||
"isEntry": true
|
||||
},
|
||||
"node_modules/quill/dist/quill.bubble.css": {
|
||||
"file": "assets/quill-BzaoboQ1.css",
|
||||
"src": "node_modules/quill/dist/quill.bubble.css",
|
||||
"isEntry": true
|
||||
},
|
||||
"node_modules/quill/dist/quill.snow.css": {
|
||||
"file": "assets/quill-D-Ncpkvi.css",
|
||||
"src": "node_modules/quill/dist/quill.snow.css",
|
||||
"isEntry": true
|
||||
},
|
||||
"public/images/bg-dashboard.jpg": {
|
||||
"file": "assets/bg-dashboard-CUwt8_jP.jpg",
|
||||
"src": "public/images/bg-dashboard.jpg"
|
||||
},
|
||||
"resources/fonts/boxicons.eot": {
|
||||
"file": "assets/boxicons-0t2gX1vj.eot",
|
||||
"src": "resources/fonts/boxicons.eot"
|
||||
},
|
||||
"resources/fonts/boxicons.svg": {
|
||||
"file": "assets/boxicons-KSR1BgPC.svg",
|
||||
"src": "resources/fonts/boxicons.svg"
|
||||
},
|
||||
"resources/fonts/boxicons.ttf": {
|
||||
"file": "assets/boxicons-BEZXjQG5.ttf",
|
||||
"src": "resources/fonts/boxicons.ttf"
|
||||
},
|
||||
"resources/fonts/boxicons.woff": {
|
||||
"file": "assets/boxicons-CEgI8ccS.woff",
|
||||
"src": "resources/fonts/boxicons.woff"
|
||||
},
|
||||
"resources/fonts/boxicons.woff2": {
|
||||
"file": "assets/boxicons-C7pETWQJ.woff2",
|
||||
"src": "resources/fonts/boxicons.woff2"
|
||||
},
|
||||
"resources/js/app.js": {
|
||||
"file": "assets/app-Wz_4hh3O.js",
|
||||
"name": "app",
|
||||
"src": "resources/js/app.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/business-industries/create.js": {
|
||||
"file": "assets/create-CiRhiWZV.js",
|
||||
"name": "create",
|
||||
"src": "resources/js/business-industries/create.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_dropzone-B5tMhgFp.js",
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
]
|
||||
},
|
||||
"resources/js/business-industries/index.js": {
|
||||
"file": "assets/index-BIXijOG8.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/business-industries/index.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/business-industries/update.js": {
|
||||
"file": "assets/update-C8VOvIbF.js",
|
||||
"name": "update",
|
||||
"src": "resources/js/business-industries/update.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/config.js": {
|
||||
"file": "assets/config-DqV4EBmE.js",
|
||||
"name": "config",
|
||||
"src": "resources/js/config.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/dashboards/bigdata.js": {
|
||||
"file": "assets/bigdata-BGlke4DN.js",
|
||||
"name": "bigdata",
|
||||
"src": "resources/js/dashboards/bigdata.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
],
|
||||
"css": [
|
||||
"assets/flatpickr-CksuuEqD.css"
|
||||
]
|
||||
},
|
||||
"resources/js/data-settings/create.js": {
|
||||
"file": "assets/create-C1IbeTHP.js",
|
||||
"name": "create",
|
||||
"src": "resources/js/data-settings/create.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/data-settings/index.js": {
|
||||
"file": "assets/index-C4raIbBK.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/data-settings/index.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data-settings/update.js": {
|
||||
"file": "assets/update-nNw3P4hj.js",
|
||||
"name": "update",
|
||||
"src": "resources/js/data-settings/update.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/data/advertisements/data-advertisements.js": {
|
||||
"file": "assets/data-advertisements-ckr1EtLP.js",
|
||||
"name": "data-advertisements",
|
||||
"src": "resources/js/data/advertisements/data-advertisements.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"_table-generator-DPFVsCqk.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data/advertisements/form-create-update.js": {
|
||||
"file": "assets/form-create-update-CyN97GsU.js",
|
||||
"name": "form-create-update",
|
||||
"src": "resources/js/data/advertisements/form-create-update.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data/advertisements/form-upload.js": {
|
||||
"file": "assets/form-upload-tA9zPESO.js",
|
||||
"name": "form-upload",
|
||||
"src": "resources/js/data/advertisements/form-upload.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_dropzone-B5tMhgFp.js",
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data/tourisms/data-tourisms.js": {
|
||||
"file": "assets/data-tourisms-Db9aMSJn.js",
|
||||
"name": "data-tourisms",
|
||||
"src": "resources/js/data/tourisms/data-tourisms.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"_table-generator-DPFVsCqk.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data/tourisms/form-create-update.js": {
|
||||
"file": "assets/form-create-update-SviVezNW.js",
|
||||
"name": "form-create-update",
|
||||
"src": "resources/js/data/tourisms/form-create-update.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data/tourisms/form-upload.js": {
|
||||
"file": "assets/form-upload-BtbLOLpA.js",
|
||||
"name": "form-upload",
|
||||
"src": "resources/js/data/tourisms/form-upload.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_dropzone-B5tMhgFp.js",
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data/umkm/data-umkm.js": {
|
||||
"file": "assets/data-umkm-CLB33rMj.js",
|
||||
"name": "data-umkm",
|
||||
"src": "resources/js/data/umkm/data-umkm.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"_table-generator-DPFVsCqk.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data/umkm/form-create-update.js": {
|
||||
"file": "assets/form-create-update-BrB0xTMN.js",
|
||||
"name": "form-create-update",
|
||||
"src": "resources/js/data/umkm/form-create-update.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data/umkm/form-upload.js": {
|
||||
"file": "assets/form-upload-BDyAWo4b.js",
|
||||
"name": "form-upload",
|
||||
"src": "resources/js/data/umkm/form-upload.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_dropzone-B5tMhgFp.js",
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
]
|
||||
},
|
||||
"resources/js/master/users/create.js": {
|
||||
"file": "assets/create-BfiYISiN.js",
|
||||
"name": "create",
|
||||
"src": "resources/js/master/users/create.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/master/users/update.js": {
|
||||
"file": "assets/update-DhoG4v8r.js",
|
||||
"name": "update",
|
||||
"src": "resources/js/master/users/update.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/master/users/users.js": {
|
||||
"file": "assets/users-jfWUOWyP.js",
|
||||
"name": "users",
|
||||
"src": "resources/js/master/users/users.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/menus/create.js": {
|
||||
"file": "assets/create-ChUgh-yc.js",
|
||||
"name": "create",
|
||||
"src": "resources/js/menus/create.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/menus/index.js": {
|
||||
"file": "assets/index-C4xA1kYa.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/menus/index.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/menus/update.js": {
|
||||
"file": "assets/update-8JQOGES4.js",
|
||||
"name": "update",
|
||||
"src": "resources/js/menus/update.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/pages/chart.js": {
|
||||
"file": "assets/chart-DQBoD9wk.js",
|
||||
"name": "chart",
|
||||
"src": "resources/js/pages/chart.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_apexcharts.common-7mov3gaG.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/pages/dashboard.js": {
|
||||
"file": "assets/dashboard-nkb3Omy9.js",
|
||||
"name": "dashboard",
|
||||
"src": "resources/js/pages/dashboard.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_apexcharts.common-7mov3gaG.js",
|
||||
"_world-BH8KG5u4.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/pages/form-fileupload.js": {
|
||||
"file": "assets/form-fileupload-DGbdX8GT.js",
|
||||
"name": "form-fileupload",
|
||||
"src": "resources/js/pages/form-fileupload.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_dropzone-B5tMhgFp.js"
|
||||
]
|
||||
},
|
||||
"resources/js/pages/form-flatepicker.js": {
|
||||
"file": "assets/form-flatepicker-ChSlk6xC.js",
|
||||
"name": "form-flatepicker",
|
||||
"src": "resources/js/pages/form-flatepicker.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/pages/form-quilljs.js": {
|
||||
"file": "assets/form-quilljs-pSObT4Ti.js",
|
||||
"name": "form-quilljs",
|
||||
"src": "resources/js/pages/form-quilljs.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/pages/maps-canada.js": {
|
||||
"file": "assets/maps-canada-Btz07hSk.js",
|
||||
"name": "maps-canada",
|
||||
"src": "resources/js/pages/maps-canada.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/pages/maps-google.js": {
|
||||
"file": "assets/maps-google-KamR_rNw.js",
|
||||
"name": "maps-google",
|
||||
"src": "resources/js/pages/maps-google.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/pages/maps-iraq.js": {
|
||||
"file": "assets/maps-iraq-Blhf9V_8.js",
|
||||
"name": "maps-iraq",
|
||||
"src": "resources/js/pages/maps-iraq.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/pages/maps-russia.js": {
|
||||
"file": "assets/maps-russia-C3XucoMP.js",
|
||||
"name": "maps-russia",
|
||||
"src": "resources/js/pages/maps-russia.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/pages/maps-spain.js": {
|
||||
"file": "assets/maps-spain-CdBIHB66.js",
|
||||
"name": "maps-spain",
|
||||
"src": "resources/js/pages/maps-spain.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/pages/maps-vector.js": {
|
||||
"file": "assets/maps-vector-C2WpvMU7.js",
|
||||
"name": "maps-vector",
|
||||
"src": "resources/js/pages/maps-vector.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_world-BH8KG5u4.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/pages/table-gridjs.js": {
|
||||
"file": "assets/table-gridjs-BQh80cFh.js",
|
||||
"name": "table-gridjs",
|
||||
"src": "resources/js/pages/table-gridjs.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/pbg-task/index.js": {
|
||||
"file": "assets/index-CqcfkvSL.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/pbg-task/index.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/report/tourisms/index.js": {
|
||||
"file": "assets/index-DlxOSPEG.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/report/tourisms/index.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/roles/create.js": {
|
||||
"file": "assets/create-Dd-lHOwF.js",
|
||||
"name": "create",
|
||||
"src": "resources/js/roles/create.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/roles/index.js": {
|
||||
"file": "assets/index-C_kI_q7O.js",
|
||||
"name": "index",
|
||||
"src": "resources/js/roles/index.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/roles/role_menu.js": {
|
||||
"file": "assets/role_menu-BuFAi1wM.js",
|
||||
"name": "role_menu",
|
||||
"src": "resources/js/roles/role_menu.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/roles/update.js": {
|
||||
"file": "assets/update-CapXnAP8.js",
|
||||
"name": "update",
|
||||
"src": "resources/js/roles/update.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/settings/general/general-settings.js": {
|
||||
"file": "assets/general-settings-BoJeYQk1.js",
|
||||
"name": "general-settings",
|
||||
"src": "resources/js/settings/general/general-settings.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/settings/syncronize/syncronize.js": {
|
||||
"file": "assets/syncronize-DjtcngRb.js",
|
||||
"name": "syncronize",
|
||||
"src": "resources/js/settings/syncronize/syncronize.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/js/tables/common-table.js": {
|
||||
"file": "assets/common-table-KF_NVAIE.js",
|
||||
"name": "common-table",
|
||||
"src": "resources/js/tables/common-table.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_gridjs.umd-BiCNXlqL.js",
|
||||
"_global-config-9uDKFQ8j.js",
|
||||
"__commonjsHelpers-C4iS2aBk.js"
|
||||
]
|
||||
},
|
||||
"resources/scss/components/_circle.scss": {
|
||||
"file": "assets/_circle-DgPqpfJw.css",
|
||||
"src": "resources/scss/components/_circle.scss",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/scss/dashboards/_bigdata.scss": {
|
||||
"file": "assets/_bigdata-Syu0AGbZ.css",
|
||||
"src": "resources/scss/dashboards/_bigdata.scss",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/scss/icons.scss": {
|
||||
"file": "assets/icons-CHxf0fE3.css",
|
||||
"src": "resources/scss/icons.scss",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/scss/style.scss": {
|
||||
"file": "assets/style-CnBzxVPJ.css",
|
||||
"src": "resources/scss/style.scss",
|
||||
"isEntry": true
|
||||
}
|
||||
}
|
||||
1
public/build/assets/_commonjsHelpers-C4iS2aBk.js
Normal file
1
public/build/assets/_commonjsHelpers-C4iS2aBk.js
Normal file
@@ -0,0 +1 @@
|
||||
var u=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function f(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function l(e){if(e.__esModule)return e;var r=e.default;if(typeof r=="function"){var t=function o(){return this instanceof o?Reflect.construct(r,arguments,this.constructor):r.apply(this,arguments)};t.prototype=r.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach(function(o){var n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:function(){return e[o]}})}),t}export{f as a,u as c,l as g};
|
||||
808
public/build/assets/apexcharts.common-7mov3gaG.js
Normal file
808
public/build/assets/apexcharts.common-7mov3gaG.js
Normal file
File diff suppressed because one or more lines are too long
18
public/build/assets/app-Wz_4hh3O.js
Normal file
18
public/build/assets/app-Wz_4hh3O.js
Normal file
File diff suppressed because one or more lines are too long
BIN
public/build/assets/boxicons-0t2gX1vj.eot
Normal file
BIN
public/build/assets/boxicons-0t2gX1vj.eot
Normal file
Binary file not shown.
BIN
public/build/assets/boxicons-BEZXjQG5.ttf
Normal file
BIN
public/build/assets/boxicons-BEZXjQG5.ttf
Normal file
Binary file not shown.
BIN
public/build/assets/boxicons-C7pETWQJ.woff2
Normal file
BIN
public/build/assets/boxicons-C7pETWQJ.woff2
Normal file
Binary file not shown.
BIN
public/build/assets/boxicons-CEgI8ccS.woff
Normal file
BIN
public/build/assets/boxicons-CEgI8ccS.woff
Normal file
Binary file not shown.
1653
public/build/assets/boxicons-KSR1BgPC.svg
Normal file
1653
public/build/assets/boxicons-KSR1BgPC.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 1.2 MiB |
10
public/build/assets/chart-DQBoD9wk.js
Normal file
10
public/build/assets/chart-DQBoD9wk.js
Normal file
File diff suppressed because one or more lines are too long
1
public/build/assets/config-DqV4EBmE.js
Normal file
1
public/build/assets/config-DqV4EBmE.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(){var i=sessionStorage.getItem("__DARKONE_CONFIG__"),e=document.getElementsByTagName("html")[0],a={theme:"light",topbar:{color:"light"},menu:{size:"default",color:"light"}};document.getElementsByTagName("html")[0];var t=Object.assign(JSON.parse(JSON.stringify(a)),{});(t=Object.assign(JSON.parse(JSON.stringify(a)),{})).theme=e.getAttribute("data-bs-theme")||a.theme,t.topbar.color=e.getAttribute("data-topbar-color")||a.topbar.color,t.menu.color=e.getAttribute("data-sidebar-color")||a.menu.color,t.menu.size=e.getAttribute("data-sidebar-size")||a.menu.size,window.defaultConfig=JSON.parse(JSON.stringify(t)),i!==null&&(t=JSON.parse(i)),(window.config=t)&&(e.setAttribute("data-bs-theme",t.theme),e.setAttribute("data-topbar-color",t.topbar.color),e.setAttribute("data-sidebar-color",t.menu.color),window.innerWidth<=1140?e.setAttribute("data-sidebar-size","hidden"):e.setAttribute("data-sidebar-size",t.menu.size))})();
|
||||
1
public/build/assets/dark-CLxH30By.css
Normal file
1
public/build/assets/dark-CLxH30By.css
Normal file
File diff suppressed because one or more lines are too long
1
public/build/assets/dashboard-nkb3Omy9.js
Normal file
1
public/build/assets/dashboard-nkb3Omy9.js
Normal file
@@ -0,0 +1 @@
|
||||
import{A as t}from"./apexcharts.common-7mov3gaG.js";import{j as i}from"./world-BH8KG5u4.js";import"./_commonjsHelpers-C4iS2aBk.js";var r={chart:{type:"area",height:50,sparkline:{enabled:!0}},series:[{data:[25,28,32,38,43,55,60,48,42,51,35]}],stroke:{width:2,curve:"smooth"},markers:{size:0},colors:["#7e67fe"],tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},fill:{opacity:[1],type:["gradient"],gradient:{type:"vertical",inverseColors:!1,opacityFrom:.5,opacityTo:0,stops:[0,100]}}};new t(document.querySelector("#chart01"),r).render();var r={chart:{type:"area",height:50,sparkline:{enabled:!0}},series:[{data:[87,54,4,76,31,95,70,92,53,9,6]}],stroke:{width:2,curve:"smooth"},markers:{size:0},colors:["#7e67fe"],tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},fill:{opacity:[1],type:["gradient"],gradient:{type:"vertical",inverseColors:!1,opacityFrom:.5,opacityTo:0,stops:[0,100]}}};new t(document.querySelector("#chart02"),r).render();var r={chart:{type:"area",height:50,sparkline:{enabled:!0}},series:[{data:[41,42,35,42,6,12,13,22,42,94,95]}],stroke:{width:2,curve:"smooth"},markers:{size:0},colors:["#7e67fe"],tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},fill:{opacity:[1],type:["gradient"],gradient:{type:"vertical",inverseColors:!1,opacityFrom:.5,opacityTo:0,stops:[0,100]}}};new t(document.querySelector("#chart03"),r).render();var r={chart:{type:"area",height:50,sparkline:{enabled:!0}},series:[{data:[8,41,40,48,77,35,0,77,63,100,71]}],stroke:{width:2,curve:"smooth"},markers:{size:0},colors:["#7e67fe"],tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},fill:{opacity:[1],type:["gradient"],gradient:{type:"vertical",inverseColors:!1,opacityFrom:.5,opacityTo:0,stops:[0,100]}}};new t(document.querySelector("#chart04"),r).render();var a={chart:{height:180,type:"donut"},series:[44.25,52.68,45.98],legend:{show:!1},stroke:{width:0},plotOptions:{pie:{donut:{size:"70%",labels:{show:!1,total:{showAlways:!0,show:!0}}}}},labels:["Direct","Affilliate","Sponsored"],colors:["#7e67fe","#17c553","#7942ed"],dataLabels:{enabled:!1},responsive:[{breakpoint:480,options:{chart:{width:200}}}],fill:{type:"gradient"}},o=new t(document.querySelector("#conversions"),a);o.render();var a={series:[{name:"Page Views",type:"bar",data:[34,65,46,68,49,61,42,44,78,52,63,67]},{name:"Clicks",type:"area",data:[8,12,7,17,21,11,5,9,7,29,12,35]},{name:"Revenue",type:"area",data:[12,16,11,22,28,25,15,29,35,45,42,48]}],chart:{height:330,type:"line",toolbar:{show:!1}},stroke:{dashArray:[0,0,2],width:[0,2,2],curve:"smooth"},fill:{opacity:[1,1,1],type:["solid","gradient","gradient"],gradient:{type:"vertical",inverseColors:!1,opacityFrom:.5,opacityTo:0,stops:[0,90]}},markers:{size:[0,0],strokeWidth:2,hover:{size:4}},xaxis:{categories:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],axisTicks:{show:!1},axisBorder:{show:!1}},yaxis:{min:0,axisBorder:{show:!1}},grid:{show:!0,strokeDashArray:3,xaxis:{lines:{show:!1}},yaxis:{lines:{show:!0}},padding:{top:0,right:-2,bottom:10,left:10}},legend:{show:!0,horizontalAlign:"center",offsetX:0,offsetY:5,markers:{width:9,height:9,radius:6},itemMargin:{horizontal:10,vertical:0}},plotOptions:{bar:{columnWidth:"30%",barHeight:"70%",borderRadius:3}},colors:["#7e67fe","#17c553","#7942ed"],tooltip:{shared:!0,y:[{formatter:function(e){return typeof e<"u"?e.toFixed(1)+"k":e}},{formatter:function(e){return typeof e<"u"?e.toFixed(1)+"k":e}}]}},o=new t(document.querySelector("#dash-performance-chart"),a);o.render();class n{initWorldMapMarker(){new i({map:"world",selector:"#world-map-markers",zoomOnScroll:!0,zoomButtons:!1,markersSelectable:!0,markers:[{name:"Canada",coords:[56.1304,-106.3468]},{name:"Brazil",coords:[-14.235,-51.9253]},{name:"Russia",coords:[61,105]},{name:"China",coords:[35.8617,104.1954]},{name:"United States",coords:[37.0902,-95.7129]}],markerStyle:{initial:{fill:"#7f56da"},selected:{fill:"#1bb394"}},labels:{markers:{render:s=>s.name}},regionStyle:{initial:{fill:"rgba(169,183,197, 0.3)",fillOpacity:1}}})}init(){this.initWorldMapMarker()}}document.addEventListener("DOMContentLoaded",function(e){new n().init()});
|
||||
1
public/build/assets/flatpickr-CksuuEqD.css
Normal file
1
public/build/assets/flatpickr-CksuuEqD.css
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user