526 lines
19 KiB
PHP
526 lines
19 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Web\Ekosistem;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Illuminate\View\View;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
use App\Models\Ekosistem\TabelBasisData;
|
|
use App\Models\Ekosistem\KolomBasisData;
|
|
use App\Models\Ekosistem\ValueBasisData;
|
|
use App\Models\Ekosistem\RingkasanBasisData;
|
|
use App\Models\Core\Program;
|
|
|
|
class ValueBasisDataController extends Controller
|
|
{
|
|
public function index(Request $request, string $tabelId): View
|
|
{
|
|
if (!Gate::any(['super_admin', 'admin'])) {
|
|
abort(403);
|
|
}
|
|
|
|
$perPage = $request->query('per_page', 10);
|
|
$search = strtolower($request->query('search', ''));
|
|
|
|
$program = null;
|
|
$programList = Program::get();
|
|
if (app()->has('SystemProgram')) {
|
|
$program = app('SystemProgram');
|
|
} else {
|
|
if ($request->has('program_id') && $request->query('program_id')) {
|
|
$programId = $request->query('program_id');
|
|
$program = Program::find($programId);
|
|
if (!$program) {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
}
|
|
}
|
|
|
|
$tabel = TabelBasisData::find($tabelId);
|
|
if (!$tabel) {
|
|
abort(404, 'Data tabel tidak ditemukan.');
|
|
}
|
|
$kolom = KolomBasisData::where('tabel_id', $tabelId)->get();
|
|
if ($kolom->isEmpty()) {
|
|
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
|
|
}
|
|
|
|
$selects = [];
|
|
foreach ($kolom as $k) {
|
|
if ($k->tipe == 'boolean') {
|
|
$selects[] = "
|
|
MAX(
|
|
CASE
|
|
WHEN kolom_id = {$k->id}
|
|
THEN CASE
|
|
WHEN value_boolean = true THEN 'Ya'
|
|
WHEN value_boolean = false THEN 'Tidak'
|
|
ELSE NULL
|
|
END
|
|
ELSE NULL
|
|
END
|
|
) AS \"{$k->kolom}\"
|
|
";
|
|
} elseif ($k->tipe == 'foreign_key') {
|
|
$selects[] = "
|
|
MAX(
|
|
CASE
|
|
WHEN kolom_id = {$k->id}
|
|
THEN (select {$k->relasi_kolom_label} from {$k->relasi_tabel} where {$k->relasi_kolom_id} = value_relasi)
|
|
ELSE NULL
|
|
END
|
|
) AS \"{$k->kolom}\"
|
|
";
|
|
} elseif ($k->tipe == 'enum') {
|
|
$selects[] = "
|
|
MAX(
|
|
CASE
|
|
WHEN kolom_id = {$k->id}
|
|
THEN (
|
|
SELECT elem->>'label'
|
|
FROM ekosistem_basis_data_kolom k,
|
|
jsonb_array_elements(k.enum_opsi::jsonb) AS elem
|
|
WHERE k.id = kolom_id
|
|
AND elem->>'value' = value_enum
|
|
LIMIT 1
|
|
)
|
|
ELSE NULL
|
|
END
|
|
) AS \"{$k->kolom}\"
|
|
";
|
|
} else {
|
|
$selects[] = "
|
|
MAX(
|
|
CASE
|
|
WHEN kolom_id = {$k->id}
|
|
THEN value_{$k->tipe}
|
|
ELSE NULL
|
|
END
|
|
) AS \"{$k->kolom}\"
|
|
";
|
|
}
|
|
}
|
|
|
|
$base = ValueBasisData::query()
|
|
->join('core_program', 'core_program.id', '=', 'ekosistem_basis_data_value.program_id')
|
|
->where('tabel_id', $tabelId)
|
|
->when($program, function ($query) use ($program) {
|
|
$query->where('program_id', $program->id);
|
|
})
|
|
->selectRaw("
|
|
core_program.id AS program_id,
|
|
core_program.nama AS program_nama,
|
|
tabel_id,
|
|
value_id,
|
|
" . implode(",\n", $selects) . "
|
|
")
|
|
->groupBy('core_program.id', 'core_program.nama', 'tabel_id', 'value_id')
|
|
->orderBy('value_id', 'asc');
|
|
|
|
$values = DB::query()->fromSub($base, 'pivot')
|
|
->when($search, function ($query) use ($search, $kolom) {
|
|
$query->where(function ($q) use ($search, $kolom) {
|
|
foreach ($kolom as $k) {
|
|
if ($k->tipe == 'text' || $k->tipe == 'varchar') {
|
|
$q->orWhereRaw("lower({$k->kolom}) LIKE ?", ["%$search%"]);
|
|
}
|
|
}
|
|
});
|
|
})
|
|
->paginate($perPage);
|
|
|
|
$ringkasan = RingkasanBasisData::where('tabel_id', $tabelId)->get();
|
|
$baseSql = $base->toSql();
|
|
if ($ringkasan->isNotEmpty()) {
|
|
foreach ($ringkasan as $r) {
|
|
$q = str_replace($tabel->tabel, "(" . $baseSql . ") as " . $tabel->tabel, $r->query_ringkasan);
|
|
$result_q = DB::select($q, $base->getBindings());
|
|
if (!empty($result_q)) {
|
|
$row = (array) $result_q[0]; // object → array
|
|
$r->nilai = array_values($row)[0] ?? 0; // ambil value pertama
|
|
} else {
|
|
$r->nilai = 0;
|
|
}
|
|
$r->hasil_ringkasan = $result_q;
|
|
}
|
|
}
|
|
|
|
return view('ekosistem.value-basis-data.index', compact('programList', 'program', 'tabel', 'kolom', 'values', 'ringkasan'));
|
|
}
|
|
|
|
public function create(Request $request, string $tabelId): View
|
|
{
|
|
if (!Gate::any(['super_admin', 'admin'])) {
|
|
abort(403);
|
|
}
|
|
|
|
$tabel = TabelBasisData::find($tabelId);
|
|
if (!$tabel) {
|
|
abort(404, 'Data tabel tidak ditemukan.');
|
|
}
|
|
$kolom = KolomBasisData::where('tabel_id', $tabelId)->get();
|
|
if ($kolom->isEmpty()) {
|
|
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
|
|
}
|
|
|
|
$program = null;
|
|
if (app()->has('SystemProgram')) {
|
|
$program = app('SystemProgram');
|
|
} else {
|
|
if ($request->has('program_id') && $request->query('program_id')) {
|
|
$programId = $request->query('program_id');
|
|
$program = Program::find($programId);
|
|
}
|
|
}
|
|
if (!$program) {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
|
|
$list_relasi = [];
|
|
foreach ($kolom as $k) {
|
|
if ($k->tipe == 'foreign_key') {
|
|
$relasi['kolom_id'] = $k->id;
|
|
try {
|
|
$options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at');
|
|
$relasi['options'] = $options_kolom->get();
|
|
$relasi['sql'] = $options_kolom->toSql();
|
|
} catch (\Throwable $th) {
|
|
$relasi['options'] = [];
|
|
}
|
|
$list_relasi[] = $relasi;
|
|
}
|
|
}
|
|
$list_relasi = collect($list_relasi);
|
|
// dd($kolom->where('tipe', 'enum')->first()?->enum_opsi);
|
|
|
|
return view('ekosistem.value-basis-data.add', compact('tabel', 'kolom', 'program', 'list_relasi'));
|
|
}
|
|
|
|
public function store(Request $request, string $tabelId): RedirectResponse
|
|
{
|
|
if (!Gate::any(['super_admin', 'admin'])) {
|
|
abort(403);
|
|
}
|
|
|
|
$tabel = TabelBasisData::find($tabelId);
|
|
if (!$tabel) {
|
|
abort(404, 'Data tabel tidak ditemukan.');
|
|
}
|
|
$kolom = KolomBasisData::where('tabel_id', $tabelId)->get();
|
|
if ($kolom->isEmpty()) {
|
|
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
|
|
}
|
|
if (app()->has('SystemProgram')) {
|
|
$program = app('SystemProgram');
|
|
} else {
|
|
if ($request->has('program_id') && $request->query('program_id')) {
|
|
$programId = $request->query('program_id');
|
|
$program = Program::find($programId);
|
|
if (!$program) {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
} else {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
}
|
|
|
|
$validationRules = [];
|
|
foreach ($kolom as $k) {
|
|
if ($k->validasi && is_array($k->validasi)) {
|
|
$validationRules[$k->kolom] = $k->validasi;
|
|
} else {
|
|
$validationRules[$k->kolom] = ['nullable'];
|
|
}
|
|
}
|
|
$validated = $request->validate($validationRules);
|
|
|
|
DB::transaction(function () use ($program, $tabelId, $validated, $kolom) {
|
|
$maxId = ValueBasisData::where('tabel_id', $tabelId)
|
|
->where('program_id', $program->id)
|
|
->whereNotNull('value_id')
|
|
->max('value_id');
|
|
foreach ($kolom as $k) {
|
|
$values = [
|
|
'program_id' => $program->id,
|
|
'tabel_id' => (int)$tabelId,
|
|
'kolom_id' => $k->id,
|
|
'value_id' => ($maxId ?? 0) + 1,
|
|
'created_by' => auth()->id(),
|
|
'updated_by' => auth()->id(),
|
|
];
|
|
if ($k->tipe == 'foreign_key') {
|
|
$values['value_relasi'] = $validated[$k->kolom] ?? null;
|
|
} else {
|
|
$values['value_' . $k->tipe] = $validated[$k->kolom] ?? null;
|
|
}
|
|
|
|
ValueBasisData::create($values);
|
|
}
|
|
});
|
|
|
|
return redirect()->route('tabel.data.index', [$tabelId, 'program_id' => $program->id])->with('success', 'Data berhasil ditambahkan.');
|
|
}
|
|
|
|
/**
|
|
* Display the specified resource.
|
|
*/
|
|
public function show(Request $request, string $tabelId, string $id): View
|
|
{
|
|
if (!Gate::any(['super_admin', 'admin'])) {
|
|
abort(403);
|
|
}
|
|
|
|
$tabel = TabelBasisData::find($tabelId);
|
|
if (!$tabel) {
|
|
abort(404, 'Data tabel tidak ditemukan.');
|
|
}
|
|
$kolom = KolomBasisData::where('tabel_id', $tabelId)->get();
|
|
if ($kolom->isEmpty()) {
|
|
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
|
|
}
|
|
|
|
if (app()->has('SystemProgram')) {
|
|
$program = app('SystemProgram');
|
|
} else {
|
|
if ($request->has('program_id') && $request->query('program_id')) {
|
|
$programId = $request->query('program_id');
|
|
$program = Program::find($programId);
|
|
if (!$program) {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
} else {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
}
|
|
|
|
$values = ValueBasisData::query()
|
|
->where('tabel_id', $tabelId)
|
|
->where('value_id', $id)
|
|
->where('program_id', $program->id)
|
|
->get();
|
|
if ($values->isEmpty()) {
|
|
abort(404, 'Data tidak ditemukan.');
|
|
}
|
|
|
|
foreach ($values as $v) {
|
|
$k = $kolom->where('id', $v->kolom_id)->first();
|
|
if ($k->tipe == 'foreign_key') {
|
|
$v->value_relasi_label = DB::table($k->relasi_tabel)->where($k->relasi_kolom_id, $v->value_relasi)->value($k->relasi_kolom_label);
|
|
} else if ($k->tipe == 'enum') {
|
|
$opsi = collect($k->enum_opsi);
|
|
$found = $opsi->first(function ($item) use ($v) {
|
|
return (string) $item['value'] === (string) $v->value_enum;
|
|
});
|
|
$v->value_enum_label = $found['label'] ?? null;
|
|
}
|
|
}
|
|
|
|
$value_id = $id;
|
|
|
|
return view('ekosistem.value-basis-data.view', compact('tabel', 'kolom', 'program', 'values', 'value_id'));
|
|
}
|
|
|
|
public function edit(Request $request, string $tabelId, string $id): View
|
|
{
|
|
if (!Gate::any(['super_admin', 'admin'])) {
|
|
abort(403);
|
|
}
|
|
|
|
$tabel = TabelBasisData::find($tabelId);
|
|
if (!$tabel) {
|
|
abort(404, 'Data tabel tidak ditemukan.');
|
|
}
|
|
$kolom = KolomBasisData::where('tabel_id', $tabelId)->get();
|
|
if ($kolom->isEmpty()) {
|
|
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
|
|
}
|
|
|
|
if (app()->has('SystemProgram')) {
|
|
$program = app('SystemProgram');
|
|
} else {
|
|
if ($request->has('program_id') && $request->query('program_id')) {
|
|
$programId = $request->query('program_id');
|
|
$program = Program::find($programId);
|
|
if (!$program) {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
} else {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
}
|
|
|
|
$values = ValueBasisData::query()
|
|
->where('tabel_id', $tabelId)
|
|
->where('value_id', $id)
|
|
->where('program_id', $program->id)
|
|
->get();
|
|
if ($values->isEmpty()) {
|
|
abort(404, 'Data tidak ditemukan.');
|
|
}
|
|
|
|
$value_id = $id;
|
|
|
|
$list_relasi = [];
|
|
foreach ($kolom as $k) {
|
|
if ($k->tipe == 'foreign_key') {
|
|
$relasi['kolom_id'] = $k->id;
|
|
try {
|
|
$options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at');
|
|
$relasi['options'] = $options_kolom->get();
|
|
$relasi['sql'] = $options_kolom->toSql();
|
|
} catch (\Throwable $th) {
|
|
$relasi['options'] = [];
|
|
}
|
|
$list_relasi[] = $relasi;
|
|
}
|
|
}
|
|
$list_relasi = collect($list_relasi);
|
|
|
|
return view('ekosistem.value-basis-data.edit', compact('tabel', 'kolom', 'program', 'values', 'value_id', 'list_relasi'));
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*/
|
|
public function update(Request $request, string $tabelId, string $id): RedirectResponse
|
|
{
|
|
if (!Gate::any(['super_admin', 'admin'])) {
|
|
abort(403);
|
|
}
|
|
|
|
$tabel = TabelBasisData::find($tabelId);
|
|
if (!$tabel) {
|
|
abort(404, 'Data tabel tidak ditemukan.');
|
|
}
|
|
$kolom = KolomBasisData::where('tabel_id', $tabelId)->get();
|
|
if ($kolom->isEmpty()) {
|
|
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
|
|
}
|
|
if (app()->has('SystemProgram')) {
|
|
$program = app('SystemProgram');
|
|
} else {
|
|
if ($request->has('program_id') && $request->query('program_id')) {
|
|
$programId = $request->query('program_id');
|
|
$program = Program::find($programId);
|
|
if (!$program) {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
} else {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
}
|
|
|
|
$values = ValueBasisData::query()
|
|
->where('tabel_id', $tabelId)
|
|
->where('value_id', $id)
|
|
->where('program_id', $program->id)
|
|
->get();
|
|
if ($values->isEmpty()) {
|
|
abort(404, 'Data tidak ditemukan.');
|
|
}
|
|
|
|
$validationRules = [];
|
|
foreach ($kolom as $k) {
|
|
if ($k->validasi && is_array($k->validasi)) {
|
|
$validationRules[$k->kolom] = $k->validasi;
|
|
} else {
|
|
$validationRules[$k->kolom] = ['nullable'];
|
|
}
|
|
}
|
|
$validated = $request->validate($validationRules);
|
|
|
|
DB::transaction(function () use ($program, $tabelId, $validated, $kolom, $id, $values) {
|
|
foreach ($validated as $kol => $val) {
|
|
$k = $kolom->where('kolom', $kol)->first();
|
|
if (!$k) {
|
|
continue;
|
|
}
|
|
$v = $values->where('kolom_id', $k->id)->first();
|
|
if (!$v) {
|
|
$vals = [
|
|
'program_id' => $program->id,
|
|
'tabel_id' => (int)$tabelId,
|
|
'kolom_id' => $k->id,
|
|
'value_id' => $id,
|
|
'created_by' => auth()->id(),
|
|
'updated_by' => auth()->id(),
|
|
];
|
|
if ($k->tipe == 'foreign_key') {
|
|
$vals['value_relasi'] = $validated[$k->kolom] ?? null;
|
|
} else {
|
|
$vals['value_' . $k->tipe] = $validated[$k->kolom] ?? null;
|
|
}
|
|
ValueBasisData::create($vals);
|
|
} else {
|
|
$v->update([
|
|
'value_' . ($k->tipe == 'foreign_key' ? 'relasi' : $k->tipe) => $val,
|
|
'updated_by' => auth()->id(),
|
|
]);
|
|
}
|
|
}
|
|
// foreach ($values as $v) {
|
|
// $k = $kolom->where('id', $v->kolom_id)->first();
|
|
// $v->update([
|
|
// 'value_' . $k->tipe => $validated[$k->kolom] ?? null,
|
|
// 'updated_by' => auth()->id(),
|
|
// ]);
|
|
// }
|
|
});
|
|
|
|
return redirect()->route('tabel.data.index', [$tabelId, 'program_id' => $program->id])->with('success', 'Data berhasil diperbarui.');
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*/
|
|
public function destroy(Request $request, string $tabelId, string $id): RedirectResponse
|
|
{
|
|
if (!Gate::any(['super_admin', 'admin'])) {
|
|
abort(403);
|
|
}
|
|
|
|
$tabel = TabelBasisData::find($tabelId);
|
|
if (!$tabel) {
|
|
abort(404, 'Data tabel tidak ditemukan.');
|
|
}
|
|
$kolom = KolomBasisData::where('tabel_id', $tabelId)->get();
|
|
if ($kolom->isEmpty()) {
|
|
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
|
|
}
|
|
if (app()->has('SystemProgram')) {
|
|
$program = app('SystemProgram');
|
|
} else {
|
|
if ($request->has('program_id') && $request->query('program_id')) {
|
|
$programId = $request->query('program_id');
|
|
$program = Program::find($programId);
|
|
if (!$program) {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
} else {
|
|
abort(400, 'Program tidak ditemukan.');
|
|
}
|
|
}
|
|
|
|
$values = ValueBasisData::query()
|
|
->where('tabel_id', $tabelId)
|
|
->where('value_id', $id)
|
|
->where('program_id', $program->id)
|
|
->get();
|
|
if ($values->isEmpty()) {
|
|
abort(404, 'Data tidak ditemukan.');
|
|
}
|
|
|
|
ValueBasisData::query()
|
|
->where('tabel_id', $tabelId)
|
|
->where('value_id', $id)
|
|
->where('program_id', $program->id)
|
|
->delete();
|
|
|
|
return redirect()->route('tabel.data.index', [$tabelId, 'program_id' => $program->id])->with('success', 'Data berhasil dihapus.');
|
|
}
|
|
}
|