Compare commits
20 Commits
feature/um
...
feat/detai
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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"
|
||||
@@ -12,62 +12,114 @@ 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 = [
|
||||
$query = 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();
|
||||
});
|
||||
|
||||
$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')
|
||||
)
|
||||
|
||||
$query = 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->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')
|
||||
$query = once( function () {
|
||||
return 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')
|
||||
)
|
||||
->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(){
|
||||
$query = 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') // Menambahkan join ke pbg_task_retributions
|
||||
->whereRaw('LOWER(TRIM(ptgs.status_verifikasi)) = ?', [strtolower(trim('Selesai Verifikasi'))])
|
||||
->selectRaw('COUNT(pt.id) AS total_data,
|
||||
SUM(ptr.nilai_retribusi_bangunan) AS total_retribution')
|
||||
->first();
|
||||
});
|
||||
|
||||
$taskCount = $query->total_data ?? 0;
|
||||
$taskTotal = $query->total_retribution ?? 0;
|
||||
|
||||
return $this->resSuccess([
|
||||
"count"=> $taskCount,
|
||||
"total"=> $taskTotal
|
||||
]);
|
||||
}
|
||||
|
||||
public function nonVerificationDocuments(){
|
||||
$query = 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();
|
||||
});
|
||||
|
||||
$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)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
325
app/Http/Controllers/Api/PbgTaskController.php
Normal file
325
app/Http/Controllers/Api/PbgTaskController.php
Normal file
@@ -0,0 +1,325 @@
|
||||
<?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\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(){
|
||||
try{
|
||||
$totalRowCount = $this->googleSheetService->getLastRowByColumn("C");
|
||||
$sheetData = $this->googleSheetService->getSheetDataCollection($totalRowCount);
|
||||
$mapToUpsert = [];
|
||||
$count = 0;
|
||||
|
||||
$import_datasource = ImportDatasource::create([
|
||||
"message" => "initialization",
|
||||
"response_body" => null,
|
||||
"status" => ImportDatasourceStatus::Processing->value,
|
||||
]);
|
||||
|
||||
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 imported {$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());
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
120
app/Http/Controllers/DataSettingController.php
Normal file
120
app/Http/Controllers/DataSettingController.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?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 redirect()->route("data-settings.index")->with("success","Successfully created");
|
||||
}catch(Exception $ex){
|
||||
DB::rollBack();
|
||||
return redirect()->back()
|
||||
->withInput()
|
||||
->with('error', 'Something went wrong while saving data. ' . $ex->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 redirect()->route("data-settings.index")->with("success","Successfully updated");
|
||||
}catch(Exception $ex){
|
||||
DB::rollBack();
|
||||
return redirect()->back()
|
||||
->withInput()
|
||||
->with('error', 'Something went wrong while saving data. ' . $ex->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.']);
|
||||
}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,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");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,32 +8,38 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
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",
|
||||
];
|
||||
}
|
||||
}
|
||||
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.",
|
||||
];
|
||||
}
|
||||
}
|
||||
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(),
|
||||
];
|
||||
}
|
||||
}
|
||||
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"
|
||||
];
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -21,26 +21,27 @@ class ServiceSIMBG
|
||||
private $password;
|
||||
private $simbg_host;
|
||||
private $fetch_per_page;
|
||||
private $service_client;
|
||||
/**
|
||||
* Create a new class instance.
|
||||
*/
|
||||
public function __construct()
|
||||
public function __construct(ServiceClient $service_client)
|
||||
{
|
||||
$this->email = trim((string) GlobalSetting::where('key','SIMBG_EMAIL')->first()->value);
|
||||
$this->password = trim((string) GlobalSetting::where('key','SIMBG_PASSWORD')->first()->value);
|
||||
$this->simbg_host = trim((string)GlobalSetting::where('key','SIMBG_HOST')->first()->value);
|
||||
$this->fetch_per_page = trim((string)GlobalSetting::where('key','FETCH_PER_PAGE')->first()->value);
|
||||
$this->service_client = new ServiceClient($this->simbg_host);
|
||||
}
|
||||
|
||||
public function getToken(){
|
||||
$clientHelper = new ServiceClient($this->simbg_host);
|
||||
$url = "/api/user/v1/auth/login/";
|
||||
$body = [
|
||||
'email' => $this->email,
|
||||
'password' => $this->password,
|
||||
];
|
||||
|
||||
$res = $clientHelper->post($url, $body);
|
||||
$res = $this->service_client->post($url, $body);
|
||||
if(!$res->original['success']){
|
||||
Log::error("Token not retrieved ", ['response' => $res]);
|
||||
return null;
|
||||
@@ -50,14 +51,15 @@ class ServiceSIMBG
|
||||
|
||||
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);
|
||||
$res = $this->service_client->get($url, $headers);
|
||||
|
||||
Log::info("response index integration", ['res' => $res]);
|
||||
|
||||
if (empty($res->original['success']) || !$res->original['success']) {
|
||||
// Log error
|
||||
@@ -96,7 +98,6 @@ class ServiceSIMBG
|
||||
|
||||
public function syncTaskList()
|
||||
{
|
||||
$clientHelper = new ServiceClient($this->simbg_host);
|
||||
$initResToken = $this->getToken();
|
||||
|
||||
$importDatasource = ImportDatasource::create([
|
||||
@@ -115,7 +116,7 @@ class ServiceSIMBG
|
||||
$headers = ['Authorization' => "Bearer " . $apiToken];
|
||||
|
||||
$url = "/api/pbg/v1/list/?page=1&size={$this->fetch_per_page}&sort=ASC";
|
||||
$initialResponse = $clientHelper->get($url, $headers);
|
||||
$initialResponse = $this->service_client->get($url, $headers);
|
||||
|
||||
$totalPage = $initialResponse->original['data']['total_page'] ?? 0;
|
||||
if ($totalPage == 0) {
|
||||
@@ -131,6 +132,7 @@ class ServiceSIMBG
|
||||
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,
|
||||
@@ -140,7 +142,7 @@ class ServiceSIMBG
|
||||
}
|
||||
$token = $getToken->original['data']['token']['access'];
|
||||
$headers = ['Authorization' => "Bearer " . $token];
|
||||
$response = $clientHelper->get($pageUrl, $headers);
|
||||
$response = $this->service_client->get($pageUrl, $headers);
|
||||
$tasks = $response->original['data']['data'] ?? [];
|
||||
|
||||
if (empty($tasks)) {
|
||||
@@ -218,14 +220,12 @@ class ServiceSIMBG
|
||||
|
||||
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);
|
||||
$res = $this->service_client->get($url, $headers);
|
||||
|
||||
if (empty($res->original['success']) || !$res->original['success']) {
|
||||
// Log error
|
||||
@@ -247,7 +247,7 @@ class ServiceSIMBG
|
||||
? Carbon::parse($data['updated_at'])->format('Y-m-d H:i:s')
|
||||
: null;
|
||||
|
||||
PbgTaskRetributions::updateOrCreate(
|
||||
$pbg_task_retributions = PbgTaskRetributions::updateOrCreate(
|
||||
['detail_id' => $data['id']],
|
||||
[
|
||||
'detail_uid' => $data['uid'] ?? null,
|
||||
@@ -271,10 +271,13 @@ class ServiceSIMBG
|
||||
]
|
||||
);
|
||||
|
||||
$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,
|
||||
@@ -285,7 +288,7 @@ class ServiceSIMBG
|
||||
], $prasaranaData);
|
||||
|
||||
// Use bulk insert or upsert for faster database operation
|
||||
PbgTaskPrasarana::upsert($insertData, ['pbg_task_uid', 'prasarana_id']);
|
||||
PbgTaskPrasarana::upsert($insertData, ['prasarana_id']);
|
||||
}
|
||||
|
||||
Log::info("retribution and prasarana successfully", ['uuid' => $uuid]);
|
||||
|
||||
131
app/Services/GoogleSheetService.php
Normal file
131
app/Services/GoogleSheetService.php
Normal file
@@ -0,0 +1,131 @@
|
||||
<?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")
|
||||
{
|
||||
// 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;
|
||||
}
|
||||
public function getHeader()
|
||||
{
|
||||
$spreadsheet = $this->service->spreadsheets->get($this->spreadsheetID);
|
||||
$sheets = $spreadsheet->getSheets();
|
||||
|
||||
// Ambil nama sheet pertama
|
||||
$firstSheetTitle = $sheets[0]->getProperties()->getTitle();
|
||||
|
||||
// Ambil data dari baris pertama (header)
|
||||
$range = "{$firstSheetTitle}!1:1";
|
||||
$response = $this->service->spreadsheets_values->get($this->spreadsheetID, $range);
|
||||
$values = $response->getValues();
|
||||
|
||||
// Kembalikan header (baris pertama)
|
||||
return !empty($values) ? $values[0] : [];
|
||||
}
|
||||
|
||||
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){
|
||||
$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;
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^8.2",
|
||||
"google/apiclient": "^2.12",
|
||||
"guzzlehttp/guzzle": "^7.9",
|
||||
"laravel/framework": "^11.31",
|
||||
"laravel/sanctum": "^4.0",
|
||||
@@ -69,5 +70,11 @@
|
||||
}
|
||||
},
|
||||
"minimum-stability": "stable",
|
||||
"prefer-stable": true
|
||||
"prefer-stable": true,
|
||||
"repositories": {
|
||||
"grocery-crud": {
|
||||
"type": "composer",
|
||||
"url": "https://composer.grocerycrud.com/"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1361
composer.lock
generated
1361
composer.lock
generated
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',
|
||||
|
||||
];
|
||||
@@ -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');
|
||||
});
|
||||
}
|
||||
};
|
||||
40
database/seeders/DataSettingSeeder.php
Normal file
40
database/seeders/DataSettingSeeder.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?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"
|
||||
]
|
||||
];
|
||||
|
||||
foreach ($data_settings as $setting) {
|
||||
DataSetting::updateOrCreate([
|
||||
"key" => $setting["key"],
|
||||
],[
|
||||
"value" => $setting["value"],
|
||||
"type" => $setting["type"],
|
||||
"created_at" => now(),
|
||||
"updated_at" => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
5906
package-lock.json
generated
5906
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
65
package.json
65
package.json
@@ -1,34 +1,35 @@
|
||||
{
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "vite build",
|
||||
"dev": "vite"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^10.4.20",
|
||||
"axios": "^1.7.4",
|
||||
"concurrently": "^9.0.1",
|
||||
"laravel-vite-plugin": "^1.0",
|
||||
"postcss": "^8.4.47",
|
||||
"sass": "^1.81.1",
|
||||
"tailwindcss": "^3.4.13",
|
||||
"vite": "^5.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"apexcharts": "^3.44.2",
|
||||
"bootstrap": "^5.3.3",
|
||||
"countup.js": "^2.3.2",
|
||||
"dropzone": "^5.9.0",
|
||||
"flatpickr": "^4.6.13",
|
||||
"gmaps": "^0.4.25",
|
||||
"gridjs": "^5.1.0",
|
||||
"iconify-icon": "^2.1.0",
|
||||
"jsvectormap": "^1.5.1",
|
||||
"moment": "^2.29.4",
|
||||
"node-waves": "^0.7.6",
|
||||
"quill": "^1.3.7",
|
||||
"simplebar": "^5.3.9",
|
||||
"wnumb": "^1.2.0"
|
||||
}
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "vite build",
|
||||
"dev": "vite"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^10.4.20",
|
||||
"axios": "^1.7.4",
|
||||
"concurrently": "^9.0.1",
|
||||
"laravel-vite-plugin": "^1.0",
|
||||
"postcss": "^8.4.47",
|
||||
"sass": "^1.81.1",
|
||||
"tailwindcss": "^3.4.13",
|
||||
"vite": "^5.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"apexcharts": "^3.44.2",
|
||||
"big.js": "^6.2.2",
|
||||
"bootstrap": "^5.3.3",
|
||||
"countup.js": "^2.3.2",
|
||||
"dropzone": "^5.9.0",
|
||||
"flatpickr": "^4.6.13",
|
||||
"gmaps": "^0.4.25",
|
||||
"gridjs": "^5.1.0",
|
||||
"iconify-icon": "^2.1.0",
|
||||
"jsvectormap": "^1.5.1",
|
||||
"moment": "^2.29.4",
|
||||
"node-waves": "^0.7.6",
|
||||
"quill": "^1.3.7",
|
||||
"simplebar": "^5.3.9",
|
||||
"wnumb": "^1.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
284
public/build/.vite/manifest.json
Normal file
284
public/build/.vite/manifest.json
Normal file
@@ -0,0 +1,284 @@
|
||||
{
|
||||
"__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"
|
||||
]
|
||||
},
|
||||
"_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"
|
||||
]
|
||||
},
|
||||
"_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
|
||||
},
|
||||
"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/config.js": {
|
||||
"file": "assets/config-DqV4EBmE.js",
|
||||
"name": "config",
|
||||
"src": "resources/js/config.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"resources/js/dashboards/bigdata.js": {
|
||||
"file": "assets/bigdata-C1y9KS-u.js",
|
||||
"name": "bigdata",
|
||||
"src": "resources/js/dashboards/bigdata.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_global-config-9uDKFQ8j.js"
|
||||
]
|
||||
},
|
||||
"resources/js/data-settings/index.js": {
|
||||
"file": "assets/index-CzuDcG6g.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/master/users/users.js": {
|
||||
"file": "assets/users-BoDXPe3W.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/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-mrxZaoHv.js",
|
||||
"name": "form-fileupload",
|
||||
"src": "resources/js/pages/form-fileupload.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"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-BW29TEbh.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/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-ByHaR-XI.css",
|
||||
"src": "resources/scss/components/_circle.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-B2v4WMju.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
8
public/build/assets/form-fileupload-mrxZaoHv.js
Normal file
8
public/build/assets/form-fileupload-mrxZaoHv.js
Normal file
File diff suppressed because one or more lines are too long
18
public/build/assets/form-flatepicker-ChSlk6xC.js
Normal file
18
public/build/assets/form-flatepicker-ChSlk6xC.js
Normal file
File diff suppressed because one or more lines are too long
41
public/build/assets/form-quilljs-pSObT4Ti.js
Normal file
41
public/build/assets/form-quilljs-pSObT4Ti.js
Normal file
File diff suppressed because one or more lines are too long
1
public/build/assets/icons-CHxf0fE3.css
Normal file
1
public/build/assets/icons-CHxf0fE3.css
Normal file
File diff suppressed because one or more lines are too long
1
public/build/assets/maps-canada-Btz07hSk.js
Normal file
1
public/build/assets/maps-canada-Btz07hSk.js
Normal file
File diff suppressed because one or more lines are too long
7
public/build/assets/maps-google-KamR_rNw.js
Normal file
7
public/build/assets/maps-google-KamR_rNw.js
Normal file
File diff suppressed because one or more lines are too long
1
public/build/assets/maps-iraq-Blhf9V_8.js
Normal file
1
public/build/assets/maps-iraq-Blhf9V_8.js
Normal file
File diff suppressed because one or more lines are too long
1
public/build/assets/maps-russia-C3XucoMP.js
Normal file
1
public/build/assets/maps-russia-C3XucoMP.js
Normal file
File diff suppressed because one or more lines are too long
1
public/build/assets/maps-spain-CdBIHB66.js
Normal file
1
public/build/assets/maps-spain-CdBIHB66.js
Normal file
File diff suppressed because one or more lines are too long
1
public/build/assets/maps-vector-C2WpvMU7.js
Normal file
1
public/build/assets/maps-vector-C2WpvMU7.js
Normal file
@@ -0,0 +1 @@
|
||||
import{j as a}from"./world-BH8KG5u4.js";import"./_commonjsHelpers-C4iS2aBk.js";class r{initWorldMapMarker(){new a({map:"world",selector:"#world-map-markers",zoomOnScroll:!1,zoomButtons:!0,markersSelectable:!0,markers:[{name:"Greenland",coords:[72,-42]},{name:"Canada",coords:[56.1304,-106.3468]},{name:"Brazil",coords:[-14.235,-51.9253]},{name:"Egypt",coords:[26.8206,30.8025]},{name:"Russia",coords:[61,105]},{name:"China",coords:[35.8617,104.1954]},{name:"United States",coords:[37.0902,-95.7129]},{name:"Norway",coords:[60.472024,8.468946]},{name:"Ukraine",coords:[48.379433,31.16558]}],markerStyle:{initial:{fill:"#5B8DEC"},selected:{fill:"#ed5565"}},labels:{markers:{render:i=>i.name}},regionStyle:{initial:{fill:"rgba(169,183,197, 0.2)",fillOpacity:1}}})}initCanadaVectorMap(){new a({map:"canada",selector:"#canada-vector-map",zoomOnScroll:!1,regionStyle:{initial:{fill:"#1e84c4"}}})}initRussiaVectorMap(){new a({map:"russia",selector:"#russia-vector-map",zoomOnScroll:!1,regionStyle:{initial:{fill:"#1bb394"}}})}initIraqVectorMap(){new a({map:"iraq",selector:"#iraq-vector-map",zoomOnScroll:!1,regionStyle:{initial:{fill:"#f8ac59"}}})}initSpainVectorMap(){new a({map:"spain",selector:"#spain-vector-map",zoomOnScroll:!1,regionStyle:{initial:{fill:"#23c6c8"}}})}initUsaVectorMap(){new a({map:"us_merc_en",selector:"#usa-vector-map",regionStyle:{initial:{fill:"#ffe381"}}})}init(){this.initWorldMapMarker(),this.initCanadaVectorMap(),this.initRussiaVectorMap(),this.initIraqVectorMap(),this.initSpainVectorMap()}}document.addEventListener("DOMContentLoaded",function(e){new r().init()});
|
||||
1
public/build/assets/mermaid-1KsrsKla.css
Normal file
1
public/build/assets/mermaid-1KsrsKla.css
Normal file
File diff suppressed because one or more lines are too long
1
public/build/assets/mermaid-B5wPN5RC.css
Normal file
1
public/build/assets/mermaid-B5wPN5RC.css
Normal file
File diff suppressed because one or more lines are too long
6
public/build/assets/quill-BzaoboQ1.css
Normal file
6
public/build/assets/quill-BzaoboQ1.css
Normal file
File diff suppressed because one or more lines are too long
6
public/build/assets/quill-D-Ncpkvi.css
Normal file
6
public/build/assets/quill-D-Ncpkvi.css
Normal file
File diff suppressed because one or more lines are too long
2
public/build/assets/world-BH8KG5u4.js
Normal file
2
public/build/assets/world-BH8KG5u4.js
Normal file
File diff suppressed because one or more lines are too long
BIN
public/images/bg-dashboard.jpg
Normal file
BIN
public/images/bg-dashboard.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 126 KiB |
@@ -4,6 +4,8 @@ use Illuminate\Http\Request;
|
||||
|
||||
define('LARAVEL_START', microtime(true));
|
||||
|
||||
ini_set('max_execution_time',14400);
|
||||
|
||||
// Determine if the application is in maintenance mode...
|
||||
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
|
||||
require $maintenance;
|
||||
|
||||
643
pupr_app.sql
Normal file
643
pupr_app.sql
Normal file
File diff suppressed because one or more lines are too long
@@ -1,9 +1,8 @@
|
||||
|
||||
import bootstrap from 'bootstrap/dist/js/bootstrap'
|
||||
import bootstrap from "bootstrap/dist/js/bootstrap";
|
||||
window.bootstrap = bootstrap;
|
||||
import 'iconify-icon';
|
||||
import 'simplebar/dist/simplebar'
|
||||
|
||||
import "iconify-icon";
|
||||
import "simplebar/dist/simplebar";
|
||||
|
||||
class Components {
|
||||
initBootstrapComponents() {
|
||||
[...document.querySelectorAll('[data-bs-toggle="popover"]')].map(
|
||||
|
||||
@@ -1,13 +1,95 @@
|
||||
import ApexCharts from "apexcharts";
|
||||
|
||||
import Big from "big.js";
|
||||
import GlobalConfig, { addThousandSeparators } from "../global-config.js";
|
||||
|
||||
class BigData {
|
||||
async init() {
|
||||
try{
|
||||
this.resultDataTotal = await this.getTotalAllTask();
|
||||
try {
|
||||
this.totalTargetPAD = await this.getTargetPAD();
|
||||
this.resultDataTotal = await this.getDataTotalPotensi();
|
||||
this.dataVerification = await this.getDataVerfication();
|
||||
this.dataNonVerification = await this.getDataNonVerfication();
|
||||
this.dataBusiness = await this.getDataBusiness();
|
||||
this.dataNonBusiness = await this.getDataNonBusiness();
|
||||
this.dataTataRuang = await this.getDataTataRuang();
|
||||
|
||||
if (!this.resultDataTotal) {
|
||||
// total potensi
|
||||
this.bigTargetPAD = new Big(this.totalTargetPAD ?? 0);
|
||||
this.bigTotalPotensi = new Big(this.resultDataTotal.totalData ?? 0);
|
||||
|
||||
this.resultPercentage = 0;
|
||||
if (this.bigTotalPotensi > 0 && this.bigTargetPAD > 0) {
|
||||
this.resultPercentage = this.bigTotalPotensi
|
||||
.div(this.bigTargetPAD)
|
||||
.times(100)
|
||||
.toFixed(2);
|
||||
if (this.resultPercentage > 100) {
|
||||
this.resultPercentage = 100;
|
||||
}
|
||||
}
|
||||
|
||||
// tata ruang
|
||||
this.bigTotalTataRuang = new Big(this.dataTataRuang);
|
||||
this.percentageResultTataRuang =
|
||||
this.bigTotalTataRuang <= 0 || this.bigTotalPotensi <= 0
|
||||
? 0
|
||||
: this.bigTotalTataRuang
|
||||
.div(this.bigTotalPotensi)
|
||||
.times(100)
|
||||
.toFixed(2);
|
||||
|
||||
// kekurangan potensi
|
||||
this.totalKekuranganPotensi = new Big(
|
||||
this.bigTargetPAD - this.bigTotalPotensi
|
||||
);
|
||||
|
||||
this.percentageKekuranganPotensi =
|
||||
this.totalKekuranganPotensi <= 0 || this.bigTargetPAD <= 0
|
||||
? 0
|
||||
: this.totalKekuranganPotensi
|
||||
.div(this.bigTargetPAD)
|
||||
.times(100)
|
||||
.toFixed(2);
|
||||
|
||||
// non-verification documents
|
||||
this.bigTotalNonVerification = new Big(
|
||||
this.dataNonVerification.total
|
||||
);
|
||||
this.percentageResultNonVerification = this.bigTotalNonVerification
|
||||
.div(this.bigTotalPotensi)
|
||||
.times(100)
|
||||
.toFixed(2);
|
||||
|
||||
// verification documents
|
||||
this.bigTotalVerification = new Big(this.dataVerification.total);
|
||||
this.percetageResultVerification =
|
||||
this.bigTotalVerification <= 0 || this.bigTotalPotensi <= 0
|
||||
? 0
|
||||
: this.bigTotalVerification
|
||||
.div(this.bigTargetPAD)
|
||||
.times(100)
|
||||
.toFixed(2);
|
||||
|
||||
// business documents
|
||||
this.bigTotalBusiness = new Big(this.dataBusiness.total);
|
||||
this.percentageResultBusiness =
|
||||
this.bigTotalNonVerification <= 0
|
||||
? 0
|
||||
: this.bigTotalBusiness
|
||||
.div(this.bigTotalNonVerification)
|
||||
.times(100)
|
||||
.toFixed(2);
|
||||
|
||||
// non-business documents
|
||||
this.bigTotalNonBusiness = new Big(this.dataNonBusiness.total);
|
||||
this.percentageResultNonBusiness =
|
||||
this.bigTotalNonBusiness <= 0
|
||||
? 0
|
||||
: this.bigTotalNonBusiness
|
||||
.div(this.bigTotalNonVerification)
|
||||
.times(100)
|
||||
.toFixed(2);
|
||||
|
||||
if (!this.bigTargetPAD) {
|
||||
console.error("Failed to load chart data");
|
||||
return;
|
||||
}
|
||||
@@ -15,424 +97,474 @@ class BigData {
|
||||
this.initChartTargetPAD();
|
||||
this.initChartUsaha();
|
||||
this.initChartNonUsaha();
|
||||
this.initChartStatus1();
|
||||
this.initChartStatus2();
|
||||
this.initChartStatus3();
|
||||
this.initChartStatus4();
|
||||
this.initChartStatus5();
|
||||
this.initChartStatus6();
|
||||
this.initChartStatus7();
|
||||
this.initChartStatus20();
|
||||
this.initChartStatus24();
|
||||
}catch(e){
|
||||
this.initChartTotalPotensi();
|
||||
this.initChartVerificationDocuments();
|
||||
this.initChartNonVerificationDocuments();
|
||||
this.initChartKekuranganPotensi();
|
||||
this.initChartRealisasiTerbitPBG();
|
||||
this.initChartMenungguKlikDPMPTSP();
|
||||
this.initChartProsesDinasTeknis();
|
||||
this.initChartPotensiTataRuang();
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async getTotalAllTask() {
|
||||
async getDataTotalPotensi() {
|
||||
try {
|
||||
const response = await fetch(`${GlobalConfig.apiHost}/api/all-task-documents`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
});
|
||||
|
||||
const response = await fetch(
|
||||
`${GlobalConfig.apiHost}/api/all-task-documents`,
|
||||
{
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${
|
||||
document.querySelector("meta[name='api-token']")
|
||||
.content
|
||||
}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("Network response was not ok", response);
|
||||
}
|
||||
|
||||
|
||||
const data = await response.json();
|
||||
return {
|
||||
seriesData: data.data.series,
|
||||
countData: data.data.count,
|
||||
totalData: data.data.total
|
||||
totalData: data.data.total,
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.error("Error fetching chart data:", error);
|
||||
return null; // Mengembalikan null jika terjadi error
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async getTargetPAD() {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${GlobalConfig.apiHost}/api/api-data-settings?search=target_pad`,
|
||||
{
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${
|
||||
document.querySelector("meta[name='api-token']")
|
||||
.content
|
||||
}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("Network response was not ok", response);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
return data.data[0].value;
|
||||
} catch (error) {
|
||||
console.error("Error fetching chart data:", error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
async getDataVerfication() {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${GlobalConfig.apiHost}/api/verification-documents`,
|
||||
{
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${
|
||||
document.querySelector("meta[name='api-token']")
|
||||
.content
|
||||
}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("Network response was not ok", response);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
return {
|
||||
count: data.data.count,
|
||||
total: data.data.total,
|
||||
};
|
||||
} catch (error) {
|
||||
console.error("Error fetching chart data:", error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
async getDataNonVerfication() {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${GlobalConfig.apiHost}/api/non-verification-documents`,
|
||||
{
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${
|
||||
document.querySelector("meta[name='api-token']")
|
||||
.content
|
||||
}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("Network response was not ok", response);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
return {
|
||||
count: data.data.count,
|
||||
total: data.data.total,
|
||||
};
|
||||
} catch (error) {
|
||||
console.error("Error fetching chart data:", error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
async getDataBusiness() {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${GlobalConfig.apiHost}/api/business-documents`,
|
||||
{
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${
|
||||
document.querySelector("meta[name='api-token']")
|
||||
.content
|
||||
}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("Network response was not ok", response);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
return {
|
||||
count: data.data.count,
|
||||
total: data.data.total,
|
||||
};
|
||||
} catch (error) {
|
||||
console.error("Error fetching chart data:", error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
async getDataNonBusiness() {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${GlobalConfig.apiHost}/api/non-business-documents`,
|
||||
{
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${
|
||||
document.querySelector("meta[name='api-token']")
|
||||
.content
|
||||
}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("Network response was not ok", response);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
return {
|
||||
count: data.data.count,
|
||||
total: data.data.total,
|
||||
};
|
||||
} catch (error) {
|
||||
console.error("Error fetching chart data:", error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
async getDataTataRuang() {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${GlobalConfig.apiHost}/api/api-data-settings?search=tata_ruang`,
|
||||
{
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${
|
||||
document.querySelector("meta[name='api-token']")
|
||||
.content
|
||||
}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("Network response was not ok", response);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
return data.data[0].value;
|
||||
} catch (error) {
|
||||
console.error("Error fetching chart data:", error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
initChartTargetPAD() {
|
||||
const total = this.resultDataTotal.totalData;
|
||||
const count = this.resultDataTotal.countData;
|
||||
document.querySelectorAll('.document-count.chart-all-task').forEach((element) => {
|
||||
element.innerText = `${count}`;
|
||||
});
|
||||
document.querySelectorAll('.document-total.chart-all-task').forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(total)}`;
|
||||
});
|
||||
document.querySelectorAll('.small-percentage.chart-all-task').forEach((element) => {
|
||||
element.innerText = `${100}%`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-target-pad")
|
||||
.forEach((element) => {
|
||||
element.innerText = ``;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-target-pad")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(
|
||||
this.bigTargetPAD.toString()
|
||||
)}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-target-pad")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${100}%`;
|
||||
});
|
||||
}
|
||||
initChartTotalPotensi() {
|
||||
const countAll = this.resultDataTotal.countData ?? 0;
|
||||
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-total-potensi")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${countAll}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-total-potensi")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(
|
||||
this.bigTotalPotensi.toString()
|
||||
)}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-total-potensi")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.resultPercentage}%`;
|
||||
});
|
||||
}
|
||||
initChartVerificationDocuments() {
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-berkas-terverifikasi")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.dataVerification.count}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-berkas-terverifikasi")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(
|
||||
this.bigTotalVerification.toString()
|
||||
)}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-berkas-terverifikasi")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.percetageResultVerification}%`;
|
||||
});
|
||||
}
|
||||
initChartNonVerificationDocuments() {
|
||||
document
|
||||
.querySelectorAll(
|
||||
".document-count.chart-berkas-belum-terverifikasi"
|
||||
)
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.dataNonVerification.count}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(
|
||||
".document-total.chart-berkas-belum-terverifikasi"
|
||||
)
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(
|
||||
this.bigTotalNonVerification.toString()
|
||||
)}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(
|
||||
".small-percentage.chart-berkas-belum-terverifikasi"
|
||||
)
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.percentageResultNonVerification}%`;
|
||||
});
|
||||
}
|
||||
initChartUsaha() {
|
||||
fetch(`${GlobalConfig.apiHost}/api/business-documents`,{
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
// Pastikan this.resultDataTotal sudah ada
|
||||
if (!this.resultDataTotal) {
|
||||
console.error("Error: resultDataTotal is undefined");
|
||||
return;
|
||||
}
|
||||
|
||||
const totalAll = this.resultDataTotal.totalData ?? 0;
|
||||
const countAll = this.resultDataTotal.countData ?? 0;
|
||||
const countUsaha = data?.data?.count ?? 0;
|
||||
const totalUsaha = data?.data?.total ?? 0;
|
||||
|
||||
// Perbaikan perhitungan persentase
|
||||
let resultPercentage = 0;
|
||||
if (countUsaha > 0) {
|
||||
resultPercentage = (countUsaha / countAll) * 100;
|
||||
if (resultPercentage > 100) {
|
||||
resultPercentage = 100; // Batasi maksimum 100%
|
||||
}
|
||||
}
|
||||
document.querySelectorAll('.document-count.chart-business').forEach((element) => {
|
||||
element.innerText = `${countUsaha}`;
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-business")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.dataBusiness.count}`;
|
||||
});
|
||||
document.querySelectorAll('.document-total.chart-business').forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(totalUsaha)}`;
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-business")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(
|
||||
this.bigTotalBusiness.toString()
|
||||
)}`;
|
||||
});
|
||||
document.querySelectorAll('.small-percentage.chart-business').forEach((element) => {
|
||||
element.innerText = `${resultPercentage.toFixed(2)}%`;
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-business")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.percentageResultBusiness}%`;
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
}
|
||||
initChartNonUsaha() {
|
||||
fetch(`${GlobalConfig.apiHost}/api/non-business-documents`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
// Pastikan this.resultDataTotal sudah ada
|
||||
if (!this.resultDataTotal) {
|
||||
console.error("Error: resultDataTotal is undefined");
|
||||
return;
|
||||
}
|
||||
|
||||
const totalAll = this.resultDataTotal.totalData ?? 0;
|
||||
const countAll = this.resultDataTotal.countData ?? 0;
|
||||
const countUsaha = data?.data?.count ?? 0;
|
||||
const totalUsaha = data?.data?.total ?? 0;
|
||||
|
||||
// Perbaikan perhitungan persentase
|
||||
let resultPercentage = 0;
|
||||
if (countUsaha > 0) {
|
||||
resultPercentage = (countUsaha / countAll) * 100;
|
||||
if (resultPercentage > 100) {
|
||||
resultPercentage = 100; // Batasi maksimum 100%
|
||||
}
|
||||
}
|
||||
document.querySelectorAll('.document-count.chart-non-business').forEach((element) => {
|
||||
element.innerText = `${data.data.count}`;
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-non-business")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.dataNonBusiness.count}`;
|
||||
});
|
||||
document.querySelectorAll('.document-total.chart-non-business').forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-non-business")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(
|
||||
this.bigTotalNonBusiness.toString()
|
||||
)}`;
|
||||
});
|
||||
document.querySelectorAll('.small-percentage.chart-non-business').forEach((element) => {
|
||||
element.innerText = `${resultPercentage.toFixed(2)}%`;
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-non-business")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.percentageResultNonBusiness}%`;
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
}
|
||||
initChartStatus1(){
|
||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=1`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
const seriesData = data.data.series;
|
||||
// document.getElementById(
|
||||
// "countStatus1"
|
||||
// ).innerText = `${data.data.count} Berkas`;
|
||||
// document.getElementById(
|
||||
// "totalStatus1"
|
||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
initChartKekuranganPotensi() {
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-kekurangan-potensi")
|
||||
.forEach((element) => {
|
||||
element.innerText = ``;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-kekurangan-potensi")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(
|
||||
this.totalKekuranganPotensi.toString()
|
||||
)}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-kekurangan-potensi")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.percentageKekuranganPotensi}%`;
|
||||
});
|
||||
}
|
||||
initChartStatus2(){
|
||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=2`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
const seriesData = data.data.series;
|
||||
// document.getElementById(
|
||||
// "countStatus2"
|
||||
// ).innerText = `${data.data.count} Berkas`;
|
||||
// document.getElementById(
|
||||
// "totalStatus2"
|
||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
initChartRealisasiTerbitPBG() {
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-realisasi-tebit-pbg")
|
||||
.forEach((element) => {
|
||||
element.innerText = `0`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-realisasi-tebit-pbg")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-realisasi-tebit-pbg")
|
||||
.forEach((element) => {
|
||||
element.innerText = `0.00%`;
|
||||
});
|
||||
}
|
||||
initChartStatus3(){
|
||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=3`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
const seriesData = data.data.series;
|
||||
// document.getElementById(
|
||||
// "countStatus3"
|
||||
// ).innerText = `${data.data.count} Berkas`;
|
||||
// document.getElementById(
|
||||
// "totalStatus3"
|
||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
initChartMenungguKlikDPMPTSP() {
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-menunggu-klik-dpmptsp")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${0}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-menunggu-klik-dpmptsp")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-menunggu-klik-dpmptsp")
|
||||
.forEach((element) => {
|
||||
element.innerText = `0.00%`;
|
||||
});
|
||||
}
|
||||
initChartStatus4(){
|
||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=4`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
const seriesData = data.data.series;
|
||||
// document.getElementById(
|
||||
// "countStatus4"
|
||||
// ).innerText = `${data.data.count} Berkas`;
|
||||
// document.getElementById(
|
||||
// "totalStatus4"
|
||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
initChartProsesDinasTeknis() {
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-proses-dinas-teknis")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${0}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-proses-dinas-teknis")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators("0.00")}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-proses-dinas-teknis")
|
||||
.forEach((element) => {
|
||||
element.innerText = `0.00%`;
|
||||
});
|
||||
}
|
||||
initChartStatus5(){
|
||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=5`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
const seriesData = data.data.series;
|
||||
// document.getElementById(
|
||||
// "countStatus5"
|
||||
// ).innerText = `${data.data.count} Berkas`;
|
||||
// document.getElementById(
|
||||
// "totalStatus5"
|
||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
}
|
||||
initChartStatus6(){
|
||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=6`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
const seriesData = data.data.series;
|
||||
// document.getElementById(
|
||||
// "countStatus6"
|
||||
// ).innerText = `${data.data.count} Berkas`;
|
||||
// document.getElementById(
|
||||
// "totalStatus6"
|
||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
}
|
||||
initChartStatus7(){
|
||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=7`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
const seriesData = data.data.series;
|
||||
// document.getElementById(
|
||||
// "countStatus7"
|
||||
// ).innerText = `${data.data.count} Berkas`;
|
||||
// document.getElementById(
|
||||
// "totalStatus7"
|
||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
}
|
||||
initChartStatus20(){
|
||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=20`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
const seriesData = data.data.series;
|
||||
// document.getElementById(
|
||||
// "countStatus20"
|
||||
// ).innerText = `${data.data.count} Berkas`;
|
||||
// document.getElementById(
|
||||
// "totalStatus20"
|
||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
}
|
||||
initChartStatus24(){
|
||||
fetch(`${GlobalConfig.apiHost}/api/pbg-task-documents?status=24`, {
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document.querySelector("meta[name='api-token']").content}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
const seriesData = data.data.series;
|
||||
// document.getElementById(
|
||||
// "countStatus24"
|
||||
// ).innerText = `${data.data.count} Berkas`;
|
||||
// document.getElementById(
|
||||
// "totalStatus24"
|
||||
// ).innerText = `Rp.${addThousandSeparators(data.data.total)}`;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("error fetching chart dara : ", error);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class ArrowConnectorCircles {
|
||||
init(){
|
||||
// Memanggil fungsi saat halaman dimuat dan ketika layar diubah ukurannya
|
||||
document.addEventListener("resize", this.updateLine());
|
||||
document.addEventListener("load", this.updateLine());
|
||||
}
|
||||
|
||||
updateLine() {
|
||||
const circle1 = document.getElementById("chart-all-task-1").getBoundingClientRect();
|
||||
const circle2 = document.getElementById("chart-all-task-2").getBoundingClientRect();
|
||||
const line = document.getElementById("connector-line");
|
||||
|
||||
console.log(circle1);
|
||||
console.log(circle2);
|
||||
|
||||
line.setAttribute("x1", circle1.left + circle1.width / 2);
|
||||
line.setAttribute("y1", circle1.top + circle1.height / 2);
|
||||
line.setAttribute("x2", circle2.left + circle2.width / 2);
|
||||
line.setAttribute("y2", circle2.top + circle2.height / 2);
|
||||
initChartPotensiTataRuang() {
|
||||
document
|
||||
.querySelectorAll(".document-count.chart-potensi-tata-ruang")
|
||||
.forEach((element) => {
|
||||
element.innerText = "";
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".document-total.chart-potensi-tata-ruang")
|
||||
.forEach((element) => {
|
||||
element.innerText = `Rp.${addThousandSeparators(
|
||||
this.bigTotalTataRuang.toString()
|
||||
)}`;
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".small-percentage.chart-potensi-tata-ruang")
|
||||
.forEach((element) => {
|
||||
element.innerText = `${this.percentageResultTataRuang}%`;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", async function (e) {
|
||||
await new BigData().init();
|
||||
// new ArrowConnectorCircles().init();
|
||||
});
|
||||
|
||||
function resizeDashboard() {
|
||||
//Target Width
|
||||
let targetElement = document.getElementById("dashboard-fixed-wrapper");
|
||||
let targetWidth = targetElement.offsetWidth;
|
||||
//console.log("TARGET ",targetWidth);
|
||||
|
||||
//Real Object Width
|
||||
let dashboardElement = document.getElementById("dashboard-fixed-container");
|
||||
let dashboardWidth = 1110; //dashboardElement.offsetWidth;
|
||||
//console.log("CURRENT ",dashboardWidth);
|
||||
|
||||
if (targetWidth > dashboardWidth) {
|
||||
targetWidth = dashboardWidth;
|
||||
}
|
||||
|
||||
dashboardElement.style.transformOrigin = "left top";
|
||||
dashboardElement.style.transition = "transform 0.2s ease-in-out";
|
||||
dashboardElement.style.transform =
|
||||
"scale(" + (targetWidth / dashboardWidth).toFixed(2) + ")";
|
||||
//console.log("SCALE ", (targetWidth/dashboardWidth).toFixed(2));
|
||||
}
|
||||
|
||||
window.addEventListener("load", function () {
|
||||
resizeDashboard();
|
||||
});
|
||||
|
||||
window.addEventListener("resize", function () {
|
||||
resizeDashboard();
|
||||
});
|
||||
|
||||
107
resources/js/data-settings/index.js
Normal file
107
resources/js/data-settings/index.js
Normal file
@@ -0,0 +1,107 @@
|
||||
import { Grid } from "gridjs/dist/gridjs.umd.js";
|
||||
import gridjs from "gridjs/dist/gridjs.umd.js";
|
||||
import "gridjs/dist/gridjs.umd.js";
|
||||
import GlobalConfig from "../global-config.js";
|
||||
|
||||
class DataSettings {
|
||||
init() {
|
||||
this.getFetchApiData();
|
||||
}
|
||||
|
||||
getFetchApiData() {
|
||||
const table = new Grid({
|
||||
columns: [
|
||||
"ID",
|
||||
"Key",
|
||||
"Value",
|
||||
"Created",
|
||||
{
|
||||
name: "Actions",
|
||||
width: "120px",
|
||||
formatter: function (cell) {
|
||||
console.log("cell data", cell);
|
||||
return gridjs.html(`
|
||||
<div class="d-flex justify-items-end gap-10">
|
||||
<a href="/data-settings/${cell}/edit" class="btn btn-yellow me-2">Update</a>
|
||||
<button class="btn btn-red btn-delete btn-delete-data-settings" data-id="${cell}">Delete</button>
|
||||
</div>
|
||||
`);
|
||||
},
|
||||
},
|
||||
],
|
||||
search: {
|
||||
server: {
|
||||
url: (prev, keyword) => `${prev}?search=${keyword}`,
|
||||
},
|
||||
},
|
||||
pagination: {
|
||||
limit: 15,
|
||||
server: {
|
||||
url: (prev, page) =>
|
||||
`${prev}${prev.includes("?") ? "&" : "?"}page=${
|
||||
page + 1
|
||||
}`,
|
||||
},
|
||||
},
|
||||
sort: true,
|
||||
server: {
|
||||
url: `${GlobalConfig.apiHost}/api/api-data-settings`,
|
||||
headers: {
|
||||
Authorization: `Bearer ${document
|
||||
.querySelector('meta[name="api-token"]')
|
||||
.getAttribute("content")}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
then: (data) =>
|
||||
data.data.map((item) => [
|
||||
item.id,
|
||||
item.key,
|
||||
item.value,
|
||||
item.created_at,
|
||||
item.id,
|
||||
]),
|
||||
total: (data) => data.meta.total,
|
||||
},
|
||||
});
|
||||
table.render(document.getElementById("table-data-settings"));
|
||||
|
||||
document.addEventListener("click", this.handleDelete);
|
||||
}
|
||||
handleDelete(event) {
|
||||
if (event.target.classList.contains("btn-delete-data-settings")) {
|
||||
event.preventDefault();
|
||||
const id = event.target.getAttribute("data-id");
|
||||
|
||||
if (confirm("Are you sure you want to delete this item?")) {
|
||||
fetch(`/data-settings/${id}`, {
|
||||
method: "DELETE",
|
||||
headers: {
|
||||
"X-CSRF-TOKEN": document
|
||||
.querySelector('meta[name="csrf-token"]')
|
||||
.getAttribute("content"),
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => {
|
||||
if (response.ok) {
|
||||
alert("Item deleted successfully!");
|
||||
window.location.reload();
|
||||
} else {
|
||||
return response.json().then((error) => {
|
||||
throw new Error(
|
||||
error.message || "Failed to delete item."
|
||||
);
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error deleting item:", error);
|
||||
alert("Something went wrong. Please try again.");
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
document.addEventListener("DOMContentLoaded", function (e) {
|
||||
new DataSettings().init();
|
||||
});
|
||||
@@ -1,12 +1,24 @@
|
||||
const GlobalConfig = {
|
||||
apiHost: 'http://localhost:8000'
|
||||
};
|
||||
export default GlobalConfig = window.GlobalConfig;
|
||||
|
||||
export default GlobalConfig;
|
||||
export function addThousandSeparators(value, fractionDigits = 2) {
|
||||
if (!value) return null; // Handle empty or null values
|
||||
|
||||
export function addThousandSeparators(number, fractionDigits = 2) {
|
||||
return new Intl.NumberFormat('en-US', {
|
||||
minimumFractionDigits: fractionDigits,
|
||||
maximumFractionDigits: fractionDigits,
|
||||
}).format(number);
|
||||
}
|
||||
// Remove any non-numeric characters except commas and dots
|
||||
value = value.replace(/[^0-9,.]/g, "");
|
||||
|
||||
// If the value contains multiple dots, assume dots are thousand separators
|
||||
if ((value.match(/\./g) || []).length > 1) {
|
||||
value = value.replace(/\./g, "");
|
||||
}
|
||||
|
||||
// Convert to a proper decimal number
|
||||
let number = parseFloat(value.replace(",", "."));
|
||||
|
||||
if (isNaN(number)) return null; // Return null if conversion fails
|
||||
|
||||
// Format the number with thousand separators
|
||||
return new Intl.NumberFormat("en-US", {
|
||||
minimumFractionDigits: fractionDigits,
|
||||
maximumFractionDigits: fractionDigits,
|
||||
}).format(number);
|
||||
}
|
||||
|
||||
132
resources/js/pbg-task/create.js
Normal file
132
resources/js/pbg-task/create.js
Normal file
@@ -0,0 +1,132 @@
|
||||
import GlobalConfig from "../global-config.js";
|
||||
|
||||
class MultiFormCreatePBG {
|
||||
constructor() {
|
||||
this.currentStep = 1;
|
||||
this.totalSteps = 4;
|
||||
this.formData = {}; // Menyimpan data dari semua langkah
|
||||
}
|
||||
|
||||
init() {
|
||||
document
|
||||
.getElementById("nextStep")
|
||||
.addEventListener("click", () => this.nextStep());
|
||||
|
||||
document
|
||||
.getElementById("prevStep")
|
||||
.addEventListener("click", () => this.prevStep());
|
||||
}
|
||||
|
||||
nextStep() {
|
||||
if (!this.validateStep()) return;
|
||||
|
||||
this.saveStepData();
|
||||
|
||||
if (this.currentStep < this.totalSteps) {
|
||||
document
|
||||
.getElementById(`step${this.currentStep}`)
|
||||
.classList.add("d-none");
|
||||
|
||||
this.currentStep++;
|
||||
document
|
||||
.getElementById(`step${this.currentStep}`)
|
||||
.classList.remove("d-none");
|
||||
|
||||
document.getElementById(
|
||||
"stepTitle"
|
||||
).innerText = `Step ${this.currentStep}`;
|
||||
document.getElementById("prevStep").disabled = false;
|
||||
document.getElementById("nextStep").innerText =
|
||||
this.currentStep === this.totalSteps ? "Submit" : "Next →";
|
||||
} else {
|
||||
this.submitForm(); // Submit ke API jika sudah step terakhir
|
||||
}
|
||||
}
|
||||
|
||||
prevStep() {
|
||||
if (this.currentStep > 1) {
|
||||
document
|
||||
.getElementById(`step${this.currentStep}`)
|
||||
.classList.add("d-none");
|
||||
|
||||
this.currentStep--;
|
||||
document
|
||||
.getElementById(`step${this.currentStep}`)
|
||||
.classList.remove("d-none");
|
||||
|
||||
document.getElementById(
|
||||
"stepTitle"
|
||||
).innerText = `Step ${this.currentStep}`;
|
||||
document.getElementById("prevStep").disabled =
|
||||
this.currentStep === 1;
|
||||
document.getElementById("nextStep").innerText = "Next →";
|
||||
}
|
||||
}
|
||||
|
||||
saveStepData() {
|
||||
const stepForm = document.querySelector(`#step${this.currentStep}Form`);
|
||||
const formDataObj = new FormData(stepForm);
|
||||
|
||||
if (!this.formData) {
|
||||
this.formData = {};
|
||||
}
|
||||
|
||||
const stepKey = `step${this.currentStep}Form`;
|
||||
this.formData[stepKey] = {};
|
||||
|
||||
for (const [key, value] of formDataObj.entries()) {
|
||||
this.formData[stepKey][key] = value;
|
||||
}
|
||||
|
||||
console.log("form data", this.formData);
|
||||
}
|
||||
|
||||
validateStep() {
|
||||
const stepForm = document.querySelector(`#step${this.currentStep}Form`);
|
||||
const inputs = stepForm.querySelectorAll(
|
||||
"input[required], select[required]"
|
||||
);
|
||||
let isValid = true;
|
||||
|
||||
inputs.forEach((input) => {
|
||||
if (!input.value) {
|
||||
input.classList.add("is-invalid");
|
||||
isValid = false;
|
||||
} else {
|
||||
input.classList.remove("is-invalid");
|
||||
}
|
||||
});
|
||||
|
||||
return isValid;
|
||||
}
|
||||
|
||||
async submitForm() {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${GlobalConfig.apiHost}/api/api-pbg-task`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
Authorization: `Bearer ${
|
||||
document.querySelector("meta[name='api-token']")
|
||||
.content
|
||||
}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify(this.formData),
|
||||
}
|
||||
);
|
||||
|
||||
const result = await response.json();
|
||||
alert(result.message);
|
||||
window.location.href = "/pbg-task";
|
||||
} catch (error) {
|
||||
console.error("Error submitting form:", error);
|
||||
alert("Terjadi kesalahan saat mengirim data.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
new MultiFormCreatePBG().init();
|
||||
});
|
||||
81
resources/js/pbg-task/index.js
Normal file
81
resources/js/pbg-task/index.js
Normal file
@@ -0,0 +1,81 @@
|
||||
import { Grid } from "gridjs/dist/gridjs.umd.js";
|
||||
import "gridjs/dist/gridjs.umd.js";
|
||||
import gridjs from "gridjs/dist/gridjs.umd.js";
|
||||
import GlobalConfig from "../global-config";
|
||||
|
||||
class PbgTasks {
|
||||
init() {
|
||||
this.initTableRequestAssignment();
|
||||
}
|
||||
|
||||
initTableRequestAssignment() {
|
||||
new Grid({
|
||||
columns: [
|
||||
"ID",
|
||||
{ name: "Name", width: "15%" },
|
||||
{ name: "Condition", width: "7%" },
|
||||
"Registration Number",
|
||||
"Document Number",
|
||||
{ name: "Address", width: "30%" },
|
||||
"Status",
|
||||
"Function Type",
|
||||
"Consultation Type",
|
||||
{ name: "Due Date", width: "10%" },
|
||||
{
|
||||
name: "Action",
|
||||
formatter: function (cell) {
|
||||
return gridjs.html(`
|
||||
<div class="d-flex justify-items-end gap-10">
|
||||
<a href="/pbg-task/${cell}" class="btn btn-yellow">Detail</a
|
||||
</div>
|
||||
`);
|
||||
},
|
||||
},
|
||||
],
|
||||
search: {
|
||||
server: {
|
||||
url: (prev, keyword) => `${prev}?search=${keyword}`,
|
||||
},
|
||||
},
|
||||
pagination: {
|
||||
limit: 15,
|
||||
server: {
|
||||
url: (prev, page) =>
|
||||
`${prev}${prev.includes("?") ? "&" : "?"}page=${
|
||||
page + 1
|
||||
}`,
|
||||
},
|
||||
},
|
||||
sort: true,
|
||||
server: {
|
||||
url: `${GlobalConfig.apiHost}/api/request-assignments`,
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document
|
||||
.querySelector('meta[name="api-token"]')
|
||||
.getAttribute("content")}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
then: (data) =>
|
||||
data.data.map((item) => [
|
||||
item.id,
|
||||
item.name,
|
||||
item.condition,
|
||||
item.registration_number,
|
||||
item.document_number,
|
||||
item.address,
|
||||
item.status_name,
|
||||
item.function_type,
|
||||
item.consultation_type,
|
||||
item.due_date,
|
||||
item.id,
|
||||
]),
|
||||
total: (data) => data.meta.total,
|
||||
},
|
||||
}).render(document.getElementById("table-pbg-tasks"));
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function (e) {
|
||||
new PbgTasks().init();
|
||||
});
|
||||
@@ -19,7 +19,6 @@ class SyncronizeTask {
|
||||
name: "Actions",
|
||||
width: "120px",
|
||||
formatter: function (cell) {
|
||||
console.log("cell data", cell);
|
||||
return gridjs.html(`
|
||||
<div class="d-flex justify-items-end gap-10">
|
||||
<a href="/settings/general/${cell}/edit" class="btn btn-yellow me-2">Update</a>
|
||||
|
||||
@@ -7,6 +7,7 @@ class SyncronizeTask {
|
||||
init() {
|
||||
this.initTableImportDatasources();
|
||||
this.handleSubmitSync();
|
||||
this.handleSubmitSnycGoogleSheet();
|
||||
}
|
||||
initTableImportDatasources() {
|
||||
new Grid({
|
||||
@@ -48,68 +49,112 @@ class SyncronizeTask {
|
||||
}
|
||||
handleSubmitSync() {
|
||||
const button = document.getElementById("btn-sync-submit");
|
||||
|
||||
|
||||
// Check if the button should be enabled or disabled based on the status
|
||||
fetch(`${GlobalConfig.apiHost}/api/import-datasource/check-datasource`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document
|
||||
.querySelector('meta[name="api-token"]')
|
||||
.getAttribute("content")}`,
|
||||
"Content-Type": "application/json",
|
||||
fetch(
|
||||
`${GlobalConfig.apiHost}/api/import-datasource/check-datasource`,
|
||||
{
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document
|
||||
.querySelector('meta[name="api-token"]')
|
||||
.getAttribute("content")}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
console.log("data check button sync", data.can_execute);
|
||||
button.disabled = !data.can_execute;
|
||||
|
||||
// If the button is enabled, add click event to trigger sync
|
||||
if (!button.disabled) {
|
||||
button.addEventListener("click", function(e) {
|
||||
button.disabled = true; // Disable button to prevent multiple clicks
|
||||
button.textContent = "Syncing..."; // Change button text to show syncing
|
||||
|
||||
// Trigger the scraping API call
|
||||
fetch(`${GlobalConfig.apiHost}/api/scraping`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document
|
||||
.querySelector('meta[name="api-token"]')
|
||||
.getAttribute("content")}`,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
console.log("data sync button", data);
|
||||
alert("Synchronization executed successfully");
|
||||
window.location.reload();
|
||||
})
|
||||
.catch(err => {
|
||||
console.error("Fetch error:", err);
|
||||
alert("An error occurred during synchronization");
|
||||
})
|
||||
.finally(() => {
|
||||
button.disabled = false; // Re-enable the button after the request is complete
|
||||
button.textContent = "Sync Data"; // Reset button text
|
||||
)
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
console.log("data check button sync", data.can_execute);
|
||||
button.disabled = !data.can_execute;
|
||||
|
||||
// If the button is enabled, add click event to trigger sync
|
||||
if (!button.disabled) {
|
||||
button.addEventListener("click", function (e) {
|
||||
button.disabled = true; // Disable button to prevent multiple clicks
|
||||
button.textContent = "Syncing..."; // Change button text to show syncing
|
||||
|
||||
// Trigger the scraping API call
|
||||
fetch(`${GlobalConfig.apiHost}/api/scraping`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document
|
||||
.querySelector('meta[name="api-token"]')
|
||||
.getAttribute("content")}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error(
|
||||
"Network response was not ok"
|
||||
);
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
console.log("data sync button", data);
|
||||
alert("Synchronization executed successfully");
|
||||
window.location.reload();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("Fetch error:", err);
|
||||
alert(
|
||||
"An error occurred during synchronization"
|
||||
);
|
||||
})
|
||||
.finally(() => {
|
||||
button.disabled = false; // Re-enable the button after the request is complete
|
||||
button.textContent = "Sync Data"; // Reset button text
|
||||
});
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("Fetch error:", err);
|
||||
alert("An error occurred while checking the datasource");
|
||||
});
|
||||
}
|
||||
handleSubmitSnycGoogleSheet() {
|
||||
const button = document.getElementById("btn-sync-submit-google-sheet");
|
||||
button.addEventListener("click", function (e) {
|
||||
button.disabled = true; // Disable button to prevent multiple clicks
|
||||
button.textContent = "Syncing..."; // Change button text to show syncing
|
||||
|
||||
// Trigger the scraping API call
|
||||
fetch(`${GlobalConfig.apiHost}/api/sync-pbg-task-google-sheet`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: `Bearer ${document
|
||||
.querySelector('meta[name="api-token"]')
|
||||
.getAttribute("content")}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then((data) => {
|
||||
console.log("data sync button", data);
|
||||
alert("Synchronization executed successfully");
|
||||
window.location.reload();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("Fetch error:", err);
|
||||
alert("An error occurred during synchronization");
|
||||
})
|
||||
.finally(() => {
|
||||
button.disabled = false; // Re-enable the button after the request is complete
|
||||
button.textContent = "Sync Google Sheet"; // Reset button text
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
console.error("Fetch error:", err);
|
||||
alert("An error occurred while checking the datasource");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace [% namespace %];
|
||||
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
|
||||
|
||||
[% response_methods %]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_deleted %]);
|
||||
@@ -0,0 +1,4 @@
|
||||
return $this->successResponse(
|
||||
[% model_was_deleted %],
|
||||
$this->transform($[% model_name_singular_variable %])
|
||||
);
|
||||
@@ -0,0 +1 @@
|
||||
return new [% api_resource_collection_class %]($[% model_name_plural_variable %], [% models_were_retrieved %]);
|
||||
@@ -0,0 +1,26 @@
|
||||
$[% data_variable %] = $[% model_name_plural_variable %]->transform(function ($[% model_name_singular_variable %]) {
|
||||
return $this->transform($[% model_name_singular_variable %]);
|
||||
});
|
||||
|
||||
return $this->successResponse(
|
||||
[% models_were_retrieved %],
|
||||
$[% data_variable %],
|
||||
[
|
||||
'links' => [
|
||||
'first' => $[% model_name_plural_variable %]->url(1),
|
||||
'last' => $[% model_name_plural_variable %]->url($[% model_name_plural_variable %]->lastPage()),
|
||||
'prev' => $[% model_name_plural_variable %]->previousPageUrl(),
|
||||
'next' => $[% model_name_plural_variable %]->nextPageUrl(),
|
||||
],
|
||||
'meta' =>
|
||||
[
|
||||
'current_page' => $[% model_name_plural_variable %]->currentPage(),
|
||||
'from' => $[% model_name_plural_variable %]->firstItem(),
|
||||
'last_page' => $[% model_name_plural_variable %]->lastPage(),
|
||||
'path' => $[% model_name_plural_variable %]->resolveCurrentPath(),
|
||||
'per_page' => $[% model_name_plural_variable %]->perPage(),
|
||||
'to' => $[% model_name_plural_variable %]->lastItem(),
|
||||
'total' => $[% model_name_plural_variable %]->total(),
|
||||
],
|
||||
]
|
||||
);
|
||||
@@ -0,0 +1 @@
|
||||
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_retrieved %]);
|
||||
@@ -0,0 +1,4 @@
|
||||
return $this->successResponse(
|
||||
[% model_was_retrieved %],
|
||||
$this->transform($[% model_name_singular_variable %])
|
||||
);
|
||||
@@ -0,0 +1 @@
|
||||
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_added %]);
|
||||
@@ -0,0 +1,4 @@
|
||||
return $this->successResponse(
|
||||
[% model_was_added %],
|
||||
$this->transform($[% model_name_singular_variable %])
|
||||
);
|
||||
@@ -0,0 +1 @@
|
||||
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_updated %]);
|
||||
@@ -0,0 +1,4 @@
|
||||
return $this->successResponse(
|
||||
[% model_was_updated %],
|
||||
$this->transform($[% model_name_singular_variable %])
|
||||
);
|
||||
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Get an error response
|
||||
*
|
||||
* @param mix $message
|
||||
*
|
||||
* @return Illuminate\Http\Response
|
||||
*/
|
||||
protected function errorResponse($message)
|
||||
{
|
||||
return response()->json([
|
||||
'errors' => (array) $message,
|
||||
'success' => false,
|
||||
], 422);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
|
||||
/**
|
||||
* Gets a new validator instance with the defined rules.
|
||||
*
|
||||
* @param [% request_fullname %] $request
|
||||
*
|
||||
* @return Illuminate\Support\Facades\Validator
|
||||
*/
|
||||
protected function getValidator(Request $request)
|
||||
{
|
||||
$rules = [
|
||||
[% validation_rules %]
|
||||
];
|
||||
[% file_validation_snippet %]
|
||||
return Validator::make($request->all(), $rules);
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Get a success response
|
||||
*
|
||||
* @param mix $message
|
||||
* @param mix $data
|
||||
* @param array $meta
|
||||
*
|
||||
* @return Illuminate\Http\Response
|
||||
*/
|
||||
protected function successResponse($message, $data, array $meta = [])
|
||||
{
|
||||
return response()->json(
|
||||
array_merge([
|
||||
'data' => $data,
|
||||
'message' => $message,
|
||||
'success' => true,
|
||||
], $meta), 200);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Transform the giving [% model_name %] to public friendly array
|
||||
*
|
||||
* @param [% use_full_model_name %] $[% model_name_singular_variable %]
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function [% transform_method_name %]([% model_name_class %] $[% model_name_singular_variable %])
|
||||
{
|
||||
return [
|
||||
[% model_api_array %]
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
$validator = $this->getValidator($request);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->errorResponse($validator->errors()->all());
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
namespace [% namespace %];
|
||||
|
||||
[% use_command_placeholder %]
|
||||
use Exception;
|
||||
|
||||
class [% controller_name %] [% controller_extends %]
|
||||
{
|
||||
[% constructor %]
|
||||
/**
|
||||
* Display a listing of the assets.
|
||||
*
|
||||
* @return Illuminate\View\View
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$[% model_name_plural_variable %] = [% model_name_class %]::[% with_relations_for_index %]paginate([% models_per_page %]);
|
||||
|
||||
[% index_return_success %]
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a new [% model_name %] in the storage.
|
||||
*
|
||||
* @param [% request_fullname %] [% request_variable %]
|
||||
*
|
||||
* @return Illuminate\Http\Response
|
||||
*/
|
||||
public function store([% type_hinted_request_name %])
|
||||
{
|
||||
try {
|
||||
[% validator_request %]
|
||||
$[% data_variable %] = [% call_get_data %];
|
||||
[% on_store_setter %]
|
||||
$[% model_name_singular_variable %] = [% model_name_class %]::create($[% data_variable %]);
|
||||
|
||||
[% store_return_success %]
|
||||
} catch (Exception $exception) {
|
||||
return $this->errorResponse([% unexpected_error %]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified [% model_name %].
|
||||
*
|
||||
* @param int $id
|
||||
*
|
||||
* @return Illuminate\Http\Response
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$[% model_name_singular_variable %] = [% model_name_class %]::[% with_relations_for_show %]findOrFail($id);
|
||||
|
||||
[% show_return_success %]
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified [% model_name %] in the storage.
|
||||
*
|
||||
* @param int $id
|
||||
* @param [% request_fullname %] [% request_variable %]
|
||||
*
|
||||
* @return Illuminate\Http\Response
|
||||
*/
|
||||
public function update($id, [% type_hinted_request_name %])
|
||||
{
|
||||
try {
|
||||
[% validator_request %]
|
||||
$[% data_variable %] = [% call_get_data %];
|
||||
[% on_update_setter %]
|
||||
$[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id);
|
||||
$[% model_name_singular_variable %]->update($[% data_variable %]);
|
||||
|
||||
[% update_return_success %]
|
||||
} catch (Exception $exception) {
|
||||
return $this->errorResponse([% unexpected_error %]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified [% model_name %] from the storage.
|
||||
*
|
||||
* @param int $id
|
||||
*
|
||||
* @return Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
try {
|
||||
$[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id);
|
||||
$[% model_name_singular_variable %]->delete();
|
||||
|
||||
[% destroy_return_success %]
|
||||
} catch (Exception $exception) {
|
||||
return $this->errorResponse([% unexpected_error %]);
|
||||
}
|
||||
}
|
||||
[% get_validator_method %]
|
||||
[% get_data_method %]
|
||||
[% upload_method %]
|
||||
[% transform_method %]
|
||||
[% response_methods %]
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace [% namespace %];
|
||||
|
||||
[% use_command_placeholder %]
|
||||
|
||||
class [% controller_name %] [% controller_extends %]
|
||||
{
|
||||
[% constructor %]
|
||||
/**
|
||||
* Display the documentation which corresponds to the giving version.
|
||||
*
|
||||
* @return Illuminate\View\View
|
||||
*/
|
||||
public function index($version)
|
||||
{
|
||||
$viewName = sprintf('[% view_access_fullname %]index', $this->getVersion($version));
|
||||
|
||||
return view($viewName);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace [% namespace %];
|
||||
|
||||
[% use_command_placeholder %]
|
||||
|
||||
class [% controller_name %] [% controller_extends %]
|
||||
{
|
||||
[% constructor %]
|
||||
/**
|
||||
* Display the documentation's view.
|
||||
*
|
||||
* @return Illuminate\View\View
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('[% view_access_fullname %]index');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<span class="label label-danger" title="[% this_parameter_must_be_present_in_the_request %]">[% required_title %]</span>
|
||||
@@ -0,0 +1,11 @@
|
||||
<tr>
|
||||
<td>Authorization</td>
|
||||
<td>[% string_title %]</td>
|
||||
<td>
|
||||
<span class="label label-primary" title="[% this_parameter_is_an_http_header %]">[% header_title %]</span>
|
||||
</td>
|
||||
<td>[% access_token_with_bearer %]</td>
|
||||
@if(isset($showValidation) && $showValidation)
|
||||
<td></td>
|
||||
@endif
|
||||
</tr>
|
||||
@@ -0,0 +1,16 @@
|
||||
<h4 class="text-danger"><strong>401 - Unauthorized</strong></h4>
|
||||
<p class="text-muted">[% the_user_does_not_have_permission_to_access_the_requested_resource %]</p>
|
||||
<table class="table table-stripped">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>success</td>
|
||||
<td>[% boolean_title %]</td>
|
||||
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>error</td>
|
||||
<td>[% array_of_strings %]</td>
|
||||
<td>[% the_error_message %]</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -0,0 +1,16 @@
|
||||
<h4 class="text-danger"><strong>202 - Accepted</strong></h4>
|
||||
<p class="text-muted">[% the_requested_model_does_not_exists %]</p>
|
||||
<table class="table table-stripped">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>success</td>
|
||||
<td>[% boolean_title %]</td>
|
||||
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>error</td>
|
||||
<td>[% array_of_strings %]</td>
|
||||
<td>[% the_error_message %]</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user