main
Ilham Wara Nugroho 2026-02-12 16:16:43 +07:00
parent 27858b277d
commit 503e4c8e30
18 changed files with 334 additions and 75 deletions

View File

@ -5,6 +5,7 @@ namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Master\Instansi;
use App\Models\Master\Template;
use App\Models\Master\TabelData;
use App\Models\Dataset;
use App\Models\Dataset\DatasetTable45;
use App\Models\Dataset\DatasetTable47;
@ -19,24 +20,26 @@ class AjaxController extends Controller
$resource = json_decode($instansi->resource_data);
// dd($resource);
if(@$resource){
$data = Template::whereIn('MsTemplateId',$resource)->count();
// if(@$resource){
// $data = Template::whereIn('MsTemplateId',$resource)->count();
if(@$data != 0){
$data = Template::whereIn('MsTemplateId',$resource)->get();
}else{
$data = Template::all();
}
}else{
$data = Template::all();
}
// if(@$data != 0){
// $data = Template::whereIn('MsTemplateId',$resource)->get();
// }else{
// $data = Template::all();
// }
// }else{
// $data = Template::all();
// }
$data = TabelData::all();
foreach ($data as $key => $value) {
$filename = pathinfo($value->template_url, PATHINFO_FILENAME);
// $filename = pathinfo($value->template_url, PATHINFO_FILENAME);
$_data[$key]['id'] = encode_id($value->MsTemplateId);
$_data[$key]['name'] = $filename.' - '.$value->name;
$_data[$key]['excel'] = asset($value->template_url);
$_data[$key]['id'] = encode_id($value->MsTabelDataId);
$_data[$key]['name'] = 'Tabel '.$value->nomor_tabel.' - '.$value->name;
$_data[$key]['excel'] = url('opendata/dataset/generateTemplate/'.encode_id($value->MsTabelDataId));
}
return response()->json(['data' => $_data,'status' => true]);

View File

@ -7,6 +7,7 @@ use App\Models\Dataset;
use App\Models\Master\Topik;
use App\Models\Master\Instansi;
use App\Models\Master\Template;
use App\Models\Master\TabelData;
use App\Models\Master\Group;
use App\Repositories\Eloquent\DatasetRepository;
@ -37,9 +38,9 @@ class HomeController extends Controller
// $data['dataset'] = Dataset::orderBy('DatasetId','DESC')->limit(10)->get();
$data['group'] = Group::where('MsGroupId','!=',1)->where('alias','!=','admin')->get();
if((session('group_id') == 1) || (session('group_alias') == 'admin')){
$data['resource'] = Template::with(['dataset'])->where('show_dashboard',1)->get();
$data['resource'] = TabelData::with(['dataset'])->get();
}else{
$data['resource'] = Template::with(['dataset'])->whereHas('dataset',function($query){
$data['resource'] = TabelData::with(['dataset'])->whereHas('dataset',function($query){
$query->where('instansi_id',auth()->user()->ms_instansi_id);
})->where('show_dashboard',1)->get();
}
@ -104,9 +105,9 @@ class HomeController extends Controller
public function gridResource(Request $request)
{
if((session('group_id') == 1) || (session('group_alias') == 'admin')){
$data = Template::with(['dataset'])->where('show_dashboard',1)->get();
$data = TabelData::with(['dataset'])->where('show_dashboard',1)->get();
}else{
$data = Template::with(['dataset'])->whereHas('dataset',function($query){
$data = TabelData::with(['dataset'])->whereHas('dataset',function($query){
$query->where('instansi_id',auth()->user()->ms_instansi_id);
})->where('show_dashboard',1)->get();
}
@ -198,14 +199,14 @@ class HomeController extends Controller
$data['id'] = decode_id($id);
$data['instansi_id'] = decode_id($instansi_id);
$data['dataset'] = Dataset::with(['template'])->where('instansi_id',decode_id($instansi_id))->where('template_id',decode_id($id))->first();
$data['template'] = Template::where('MsTemplateId',decode_id($id))->first();
$data['template'] = TabelData::where('MsTemplateId',decode_id($id))->first();
$data['title'] = 'Dashboard '.@$data['dataset']->template->name;
return view($this->template.'.resource_detail',$data);
}
function apiChart($templateId,$instansi_id){
$template = Template::where('MsTemplateId',decode_id($templateId))->first();
$template = TabelData::where('MsTemplateId',decode_id($templateId))->first();
$dataset = Dataset::with(['template'])->where('instansi_id',decode_id($instansi_id))->where('template_id',decode_id($templateId))->first();
$filename = pathinfo($template->template_url, PATHINFO_FILENAME);
$modelClass = "App\\Models\\Dataset\\Dataset" . ucfirst($filename);

View File

@ -11,8 +11,14 @@ use PhpOffice\PhpSpreadsheet\IOFactory;
use App\Models\Master\Instansi;
use App\Models\Master\Topik;
use App\Models\Master\Template;
use App\Models\Master\TabelData;
use App\Models\Master\TabelDataKolom;
use App\Models\Dataset;
use App\Models\TxDataset;
use App\Repositories\Eloquent\DatasetRepository;
use DB;
use Excel;
use App\Imports\Import;
class DatasetController extends Controller
{
@ -44,25 +50,51 @@ class DatasetController extends Controller
$id = $request->query('id');
$keyId = decode_id($id);
$item = Dataset::find($keyId); // atau pakai ->pluck(), ->find(), dll
//
$_data = [];
$data = TxDataset::where('dataset_id', $keyId)
->orderBy('row_id')
->orderBy('ms_tabel_data_kolom_id')
->get()
->groupBy('row_id');
$json = json_decode($item->data, true);
$limit = $request->input('limit', 10);
$offset = $request->input('offset', 0);
foreach ($data as $rowId => $rows) {
$rows = array_slice($json, $offset, $limit);
return response()->json([
'total' => count($json),
'rows' => $rows
]);
$rowData = [
'no' => $rowId
];
foreach ($rows as $cell) {
$rowData[$cell->ms_tabel_data_kolom_id] = $cell->value;
}
$_data[] = $rowData;
}
return response()->json($_data);
// $json = json_decode($item->data, true);
// $limit = $request->input('limit', 10);
// $offset = $request->input('offset', 0);
// $rows = array_slice($json, $offset, $limit);
// return response()->json([
// 'total' => count($json),
// 'rows' => $rows
// ]);
}
public function grid(Request $request)
{
if((session('group_id') == 1) || (session('group_alias') == 'admin')){
$data = Dataset::with(['template'])->orderBy('DatasetId','DESC')->get();
$data = Dataset::with(['tabelData'])->orderBy('DatasetId','DESC')->get();
}else{
$data = Dataset::with(['template'])->orderBy('DatasetId','DESC')->whereIn('instansi_id',[auth()->user()->ms_instansi_id])->get();
$data = Dataset::with(['tabelData'])->orderBy('DatasetId','DESC')->whereIn('instansi_id',[auth()->user()->ms_instansi_id])->get();
}
// $data = User::with(['group'])->orderBy('id','DESC')->get();
$_data = [];
@ -101,10 +133,10 @@ class DatasetController extends Controller
'id' => encode_id($row->id),
'name' => @$row->name,
'publik' => @$row->publik,
'tahun' => @$row->tahun,
'template' => @$row->template->name,
'created_at' => date('d-m-Y H:i:s',strtotime(@$row->created_at)),
'instansi' => @$row->instansi->name,
'tahun' => @$row->tahun,
'template' => @$row->tabelData->name,
'created_at' => date('d-m-Y H:i:s',strtotime(@$row->created_at)),
'instansi' => @$row->instansi->name,
'action' => @$action,
'status' => @$status,
];
@ -151,27 +183,76 @@ class DatasetController extends Controller
// ])->validate();
}
$template = Template::find(decode_id($request->template_id));
$filename = pathinfo($template->template_url, PATHINFO_FILENAME);
$modelClass = "App\\Models\\Dataset\\Dataset" . ucfirst($filename);
$importClass = "App\\Imports\\Dataset". ucfirst($filename)."Import";
// $template = Template::find(decode_id($request->template_id));
// $filename = pathinfo($tabelData->template_url, PATHINFO_FILENAME);
// $modelClass = "App\\Models\\Dataset\\Dataset" . ucfirst($filename);
// $importClass = "App\\Imports\\Dataset". ucfirst($filename)."Import";
DB::beginTransaction();
// dd($request->all());
try {
$insert = $this->repository->createDatasetTable($modelClass,$importClass,$request->file('file'),$request->all());
//INSERT DATASET;
$dataset = new Dataset;
$dataset->instansi_id = decode_id($request->instansi_id);
$dataset->ms_tabel_data_id = decode_id($request->template_id);
$dataset->tahun = $request->tahun;
$dataset->tahun_data = $request->tahun_data;
$dataset->name = $request->name;
$dataset->publik = 1;
$dataset->template_default = 1;
$dataset->data = null;
$dataset->file = null;
$dataset->deskripsi = $request->deskripsi;
$dataset->created_by = auth()->user()->id;
$dataset->save();
$tabelData = TabelData::find(decode_id($request->template_id));
$import = new Import;
Excel::import($import, $request->file('file'));
$data = $import->getData();
$count = 0;
// dd($data);
foreach ($data as $rowIndex => $row) {
$rowId = $row[str_replace(' ','_',strtolower($tabelData->name)).'_'.date('Y')-1];
unset($row[str_replace(' ','_',strtolower($tabelData->name)).'_'.date('Y')-1]);
$count++;
foreach ($row as $columnIndex => $value) {
TxDataset::updateOrCreate([
'dataset_id' => $dataset->DatasetId,
'row_id' => $rowIndex + 1, // nomor baris
'ms_tabel_data_kolom_id' => $columnIndex,
],[
'dataset_id' => $dataset->DatasetId,
'ms_tabel_data_id' => decode_id($request->template_id),
'row_id' => $rowIndex + 1,
'ms_tabel_data_kolom_id' => $columnIndex,
'value' => $value,
]);
}
}
DB::commit();
// $insert = $this->repository->createDatasetTable($modelClass,$importClass,$request->file('file'),$request->all());
// dd($insert);
return redirect()->back()->with([
'message' => 'Berhasil update data',
'type' => 'success',
]);
} catch (\Exception $e) {
DB::rollback();
dd($e->getMessage());
return redirect()->back()->with([
'message' => $e->getMessage(),
'type' => "error"
]);
if ($e->getMessage() === "Start row (2) is beyond highest row (1)") {
return redirect()->back()->with([
'message' => $e->getMessage(),
'type' => "error"
], 400);
}
}
} catch (Exception $e) {
DB::rollback();
return redirect()->back()->with([
'message' => $e->getMessage(),
'type' => "error"
@ -218,7 +299,7 @@ class DatasetController extends Controller
$data['topik'] = Topik::all();
$data['template'] = Template::all();
$data['tabel'] = TabelData::all();
return view($this->template.'.form',$data);
}
@ -235,9 +316,10 @@ class DatasetController extends Controller
$data['keyId'] = $id;
$data['item'] = Dataset::find($keyId);
$template = Template::find($data['item']->template_id);
$filename = pathinfo($template->template_url, PATHINFO_FILENAME);
$data['modelClass'] = "App\\Models\\Dataset\\Dataset" . ucfirst($filename);
$template = TabelData::find($data['item']->ms_tabel_data_id);
$data['tabel'] = TabelDataKolom::where('ms_tabel_data_id',$template->MsTabelDataId)->orderBy('order','ASC')->get();
// $filename = pathinfo($tabelData->template_url, PATHINFO_FILENAME);
// $data['modelClass'] = "App\\Models\\Dataset\\Dataset" . ucfirst($filename);
return view($this->template.'.view',$data);
}
@ -268,4 +350,31 @@ class DatasetController extends Controller
return response()->json(['success' => true,'message' => 'Berhasil update data','type' => 'success']);
}
function generateTemplate($id){
$keyId = decode_id($id);
$data['tabel'] = TabelData::find($keyId);
$data['kolom'] = TabelDataKolom::where('ms_tabel_data_id',$keyId)->orderBy('order','ASC')->get();
return view($this->template.'.template',$data);
}
function download($id){
$keyId = decode_id($id);
$data['dataset'] = Dataset::with(['tabelData'])->find($keyId);
$data['txdataset'] =TxDataset::where('dataset_id', $keyId)
->orderBy('row_id')
->orderBy('ms_tabel_data_kolom_id')
->get()
->groupBy('row_id');
$data['tabel'] = TabelDataKolom::where('ms_tabel_data_id',$data['dataset']->ms_tabel_data_id)->orderBy('order','ASC')->get();
// $data['tabel'] = TabelData::find($keyId);
// $data['kolom'] = TabelDataKolom::where('ms_tabel_data_id',$keyId)->orderBy('order','ASC')->get();
return view($this->template.'.download',$data);
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Imports;
use Maatwebsite\Excel\Concerns\ToArray;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithStartRow;
class Import implements ToArray, WithHeadingRow,WithStartRow
{
private $data;
public function array(array $row)
{
$this->data = $row;
}
public function startRow(): int
{
return 3;
}
public function getData(){
return $this->data;
}
}

View File

@ -21,7 +21,7 @@ class Dataset extends Model
return $this->belongsTo('App\Models\User','created_by');
}
function template() {
return $this->belongsTo('App\Models\Master\Template','template_id');
function tabelData() {
return $this->belongsTo('App\Models\Master\TabelData','ms_tabel_data_id');
}
}

View File

@ -10,6 +10,10 @@ class TabelData extends Model
use HasFactory;
protected $table = 'ms_tabel_data';
protected $primaryKey = 'MsTabelId';
protected $primaryKey = 'MsTabelDataId';
protected $guarded = [];
function dataset(){
return $this->hasMany(\App\Models\Dataset::class, 'ms_tabel_data_id');
}
}

View File

@ -0,0 +1,14 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class TxDataset extends Model
{
use HasFactory;
protected $table = 'tx_dataset';
protected $primaryKey = 'TxDatasetId';
protected $guarded = [];
}

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('dataset', function (Blueprint $table) {
// $table->integer('ms_tabel_data_id');
$table->dropColumn('template_id');
$table->integer('ms_tabel_data_id');
// $table->foreign('ms_tabel_data_id')->references('MsTabelDataId')->on('ms_tabel_data')->cascadeOnDelete();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('dataset', function (Blueprint $table) {
//
});
}
};

View File

@ -0,0 +1,35 @@
<?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('tx_dataset', function (Blueprint $table) {
$table->id('TxDatasetId');
$table->integer('dataset_id');
$table->integer('ms_tabel_data_id');
$table->integer('ms_tabel_data_kolom_id');
$table->text('value')->nullable();
$table->timestampsTz();
$table->foreign('dataset_id')->references('DatasetId')->on('dataset')->cascadeOnDelete();
$table->foreign('ms_tabel_data_id')->references('MsTabelDataId')->on('ms_tabel_data')->cascadeOnDelete();
$table->foreign('ms_tabel_data_kolom_id')->references('MsTabelDataKolomId')->on('ms_tabel_data_kolom')->cascadeOnDelete();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tx_dataset');
}
};

View File

@ -23,9 +23,9 @@ class DatabaseSeeder extends Seeder
],[
'name' => 'Administrator',
'username' => 'administrator',
'email' => 'admindikplhd@dlh.go.id',
'email' => 'adminSLHD@dlh.go.id',
'ms_group_id' => '1',
'password' => Hash::make('##Dikplhd2025'),
'password' => Hash::make('##SLHD2025'),
]);
}

View File

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<title>Register | DIKPLHD</title>
<title>Register | SLHD</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta content="coderthemes" name="author">

View File

@ -8,7 +8,7 @@
<img src="{{asset('assets/logo-dlh.png')}}" class="" alt="Light logo" width="35">
</div>
<div class="flex text-menu flex-col gap-1">
<h6 class="text-lg bold">DIKPLHD</h6>
<h6 class="text-lg bold">SLHD</h6>
<h6 class="text-xs">Dinas Lingkungan Hidup</h6>
</div>
</div>

View File

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<title>{{@$title}} | DIKPLHD</title>
<title>{{@$title}} | SLHD</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="apple-touch-icon" sizes="180x180" href="{{asset('assets/logo-dinas.ico')}}">

View File

@ -0,0 +1,25 @@
<?php
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=Data {$dataset->tabelData->name}.xls");
header("Pragma: no-cache");
?>
<table border="1" width="100%">
<tr style="text-align: center; font-weight:bold; vertical-align:middle;">
<td colspan="{{ count($tabel)+1 }}">{{ $dataset->tabelData->name }} - {{$dataset->tahun - 1}}</td>
</tr>
<tr style="vertical-align:middle;">
<td style="background:#ddd;" width="3%">No</td>
@foreach ($tabel as $dataKolom)
<td style="background:#ddd;">{{$dataKolom->name}}</td>
@endforeach
</tr>
@foreach ($txdataset as $rowId => $rows)
<tr>
<td>{{$rowId}}</td>
@foreach ($rows as $cell)
<td>{{$cell->value;}}</td>
@endforeach
</tr>
@endforeach
</table>

View File

@ -32,13 +32,6 @@
<div class="">
<label class="mb-3 required">Resource Data</label>
<select name="template_id" required class="form-input template_id select2 @error('template_id') is-invalid @enderror" id="template_id">
{{-- <option value="">-</option> --}}
{{-- @foreach($template as $dataTemplate)
<?php
// $filename = pathinfo($dataTemplate->template_url, PATHINFO_FILENAME);
?>
<option {{@$item->template_id == $dataTemplate->MsTemplateId ? 'selected' : ''}} data-template="{{asset($dataTemplate->template_url)}}" value="{{encode_id($dataTemplate->MsTemplateId)}}">{{ $filename }} - {{$dataTemplate->name}}</option>
@endforeach --}}
</select>
@error('template_id')
<span class="invalid-feedback" style="display: block!important;"><strong>{{$message}}</strong></span>
@ -81,7 +74,7 @@
@enderror
</div>
<div class="mb-3">
<label class="mb-3">Tahun Sistem DIKPLHD</label>
<label class="mb-3">Tahun Sistem SLHD</label>
<select name="tahun" class="form-input" id="">
{{-- <option value="{{@$item->tahun ? @$item->tahun : (date('Y'))}}">{{@$item->tahun ? @$item->tahun : (date('Y'))}}</option> --}}
@for($i = (date('Y')-5); date('Y') >= $i ; $i++)

View File

@ -0,0 +1,18 @@
<?php
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=Template {$tabel->name}.xls");
header("Pragma: no-cache");
//dd($records);
?>
<table border="1" width="100%">
<tr style="text-align: center; font-weight:bold; vertical-align:middle;">
<td colspan="{{ count($kolom)+1 }}">{{ $tabel->name }} - {{date('Y')-1}}</td>
</tr>
<tr style="vertical-align:middle;">
<td style="background:#ddd;" width="3%">No</td>
@foreach ($kolom as $dataKolom)
<td style="background:#ddd;">{{$dataKolom->name}}</td>
@endforeach
</tr>
</table>

View File

@ -26,7 +26,7 @@
</div>
<div class="flex flex-col">
<div class="text-sm"><b>Resource Data</b></div>
<div class="text-xs">{{$item->template->name}}</div>
<div class="text-xs">{{$item->tabelData->name}}</div>
</div>
</div>
<div class="flex flex-between gap-3 bg-secondary/10 items-center p-2 rounded">
@ -47,7 +47,7 @@
<b>File</b>
</div>
<div>
<a href="{{asset('uploads/'.@$item->file)}}" class="p-1 bg-primary rounded text-white text-xs"><i class="ri-download-line"></i>&nbsp;Download File</a>
<a href="{{url('opendata/dataset/download/'.encode_id(@$item->DatasetId))}}" class="p-1 bg-primary rounded text-white text-xs"><i class="ri-download-line"></i>&nbsp;Download File</a>
</div>
</div>
</div>
@ -56,7 +56,7 @@
<i class="ri-database-2-line text-primary text-xl"></i>
</div>
<div class="flex flex-col">
<div class="text-sm"><b>Tahun Sistem DIKPLHD</b></div>
<div class="text-sm"><b>Tahun Sistem SLHD</b></div>
<div class="text-xs">{{$item->tahun}}</div>
</div>
</div>
@ -81,9 +81,6 @@
<div class="text-xs">{{$item->deskripsi}}</div>
</div>
</div>
<?php
$data = json_decode($item->data);
?>
<div style="overflow-x:auto;">
@ -96,17 +93,16 @@
>
<thead>
<tr class="bg-primary-light text-primary">
@if (!empty($data))
@foreach ($data[0] as $k => $key)
<th data-field="{{$k}}" class="gridjs-td gridjs-th text-xs">{{ ucwords(str_replace('_', ' ', $k)) }}</th>
@endforeach
@endif
<th data-field="no" class="gridjs-td gridjs-th text-xs">No</th>
@foreach ($tabel as $k => $key)
<th data-field="{{$key->order}}" class="gridjs-td gridjs-th text-xs">{{ $key->name }}</th>
@endforeach
</tr>
</thead>
</table>
</div>
{!! $modelClass::legend() !!}
{{-- {!! $modelClass::legend() !!} --}}
</div>
</div>
</div>

View File

@ -40,6 +40,8 @@ Route::name('opendata.')->prefix('opendata')->group(function () {
Route::get('view/{id?}',[DatasetController::class,'view'])->name('view');
Route::get('delete/{id?}',[DatasetController::class,'delete'])->name('delete');
Route::get('aktif/{id?}',[DatasetController::class,'aktif'])->name('aktif');
Route::get('generateTemplate/{id?}',[DatasetController::class,'generateTemplate'])->name('generateTemplate');
Route::get('download/{id?}',[DatasetController::class,'download'])->name('download');
});
Route::name('dataset-tambahan.')->prefix('dataset-tambahan')->group(function () {