diff --git a/app/Http/Controllers/AjaxController.php b/app/Http/Controllers/AjaxController.php index 89272f7..3972412 100644 --- a/app/Http/Controllers/AjaxController.php +++ b/app/Http/Controllers/AjaxController.php @@ -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]); diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 5ab1ee7..a4f288b 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -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); diff --git a/app/Http/Controllers/Opendata/DatasetController.php b/app/Http/Controllers/Opendata/DatasetController.php index 34baf2a..5541c43 100644 --- a/app/Http/Controllers/Opendata/DatasetController.php +++ b/app/Http/Controllers/Opendata/DatasetController.php @@ -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); + } } diff --git a/app/Imports/Import.php b/app/Imports/Import.php new file mode 100644 index 0000000..1ac4a36 --- /dev/null +++ b/app/Imports/Import.php @@ -0,0 +1,27 @@ +data = $row; + } + + public function startRow(): int + { + return 3; + } + + public function getData(){ + + return $this->data; + } +} diff --git a/app/Models/Dataset.php b/app/Models/Dataset.php index b59a58d..443c69f 100644 --- a/app/Models/Dataset.php +++ b/app/Models/Dataset.php @@ -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'); } } diff --git a/app/Models/Master/TabelData.php b/app/Models/Master/TabelData.php index 9415d03..1298145 100644 --- a/app/Models/Master/TabelData.php +++ b/app/Models/Master/TabelData.php @@ -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'); + } } diff --git a/app/Models/TxDataset.php b/app/Models/TxDataset.php new file mode 100644 index 0000000..dc06d05 --- /dev/null +++ b/app/Models/TxDataset.php @@ -0,0 +1,14 @@ +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) { + // + }); + } +}; diff --git a/database/migrations/2026_02_12_073206_create_tx_datasets_table.php b/database/migrations/2026_02_12_073206_create_tx_datasets_table.php new file mode 100644 index 0000000..9878704 --- /dev/null +++ b/database/migrations/2026_02_12_073206_create_tx_datasets_table.php @@ -0,0 +1,35 @@ +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'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 9778b86..7e3a8a5 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -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'), ]); } diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index 1905f14..570e555 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -3,7 +3,7 @@ - Register | DIKPLHD + Register | SLHD diff --git a/resources/views/include/sidebar.blade.php b/resources/views/include/sidebar.blade.php index 9a51c9d..55bc836 100644 --- a/resources/views/include/sidebar.blade.php +++ b/resources/views/include/sidebar.blade.php @@ -8,7 +8,7 @@ Light logo
-
DIKPLHD
+
SLHD
Dinas Lingkungan Hidup
diff --git a/resources/views/layouts/master.blade.php b/resources/views/layouts/master.blade.php index 73af902..bc3c6c5 100644 --- a/resources/views/layouts/master.blade.php +++ b/resources/views/layouts/master.blade.php @@ -3,7 +3,7 @@ - {{@$title}} | DIKPLHD + {{@$title}} | SLHD diff --git a/resources/views/modules/opendata/dataset/download.blade.php b/resources/views/modules/opendata/dataset/download.blade.php new file mode 100644 index 0000000..4516228 --- /dev/null +++ b/resources/views/modules/opendata/dataset/download.blade.php @@ -0,0 +1,25 @@ +tabelData->name}.xls"); + header("Pragma: no-cache"); + ?> + + + + + + + + @foreach ($tabel as $dataKolom) + + @endforeach + + @foreach ($txdataset as $rowId => $rows) + + + @foreach ($rows as $cell) + + @endforeach + + @endforeach +
{{ $dataset->tabelData->name }} - {{$dataset->tahun - 1}}
No{{$dataKolom->name}}
{{$rowId}}{{$cell->value;}}
\ No newline at end of file diff --git a/resources/views/modules/opendata/dataset/form.blade.php b/resources/views/modules/opendata/dataset/form.blade.php index 9bd4674..4454a0d 100644 --- a/resources/views/modules/opendata/dataset/form.blade.php +++ b/resources/views/modules/opendata/dataset/form.blade.php @@ -32,13 +32,6 @@
@error('template_id') {{$message}} @@ -81,7 +74,7 @@ @enderror
- +