diff --git a/resources/views/informasi/potensi/create.blade.php b/resources/views/informasi/potensi/create.blade.php
index 10094ea7e..dc17a07ba 100644
--- a/resources/views/informasi/potensi/create.blade.php
+++ b/resources/views/informasi/potensi/create.blade.php
@@ -21,7 +21,7 @@
{!! html()->form('POST', route('informasi.potensi.store'))->acceptsFiles()->id('form-potensi')->class(
'form-horizontal
- form-label-left',
+ form-label-left',
)->open() !!}
@if (count($errors) > 0)
diff --git a/resources/views/informasi/prosedur/create.blade.php b/resources/views/informasi/prosedur/create.blade.php
index fcf9cadf9..f622a4ab5 100644
--- a/resources/views/informasi/prosedur/create.blade.php
+++ b/resources/views/informasi/prosedur/create.blade.php
@@ -21,7 +21,7 @@
{!! html()->form('POST', route('informasi.prosedur.store'))->acceptsFiles()->id('form-prosedur')->class(
'form-horizontal
- form-label-left',
+ form-label-left',
)->open() !!}
@if (count($errors) > 0)
diff --git a/resources/views/informasi/regulasi/create.blade.php b/resources/views/informasi/regulasi/create.blade.php
index 37654c12c..9fe41ef5a 100644
--- a/resources/views/informasi/regulasi/create.blade.php
+++ b/resources/views/informasi/regulasi/create.blade.php
@@ -19,7 +19,7 @@
{!! html()->form('POST', route('informasi.regulasi.store'))->id('form-regulasi')->class(
'form-horizontal
- form-label-left',
+ form-label-left',
)->acceptsFiles()->open() !!}
diff --git a/resources/views/informasi/sinergi_program/create.blade.php b/resources/views/informasi/sinergi_program/create.blade.php
index 9d38c6886..3b588df62 100644
--- a/resources/views/informasi/sinergi_program/create.blade.php
+++ b/resources/views/informasi/sinergi_program/create.blade.php
@@ -19,7 +19,7 @@
{!! html()->form('POST', route('informasi.sinergi-program.store'))->acceptsFiles()->id('form-sinergi-program')->class(
'form-horizontal
- form-label-left',
+ form-label-left',
)->open() !!}
diff --git a/resources/views/informasi/sinergi_program/edit.blade.php b/resources/views/informasi/sinergi_program/edit.blade.php
index 13b94aa68..e3df6c182 100644
--- a/resources/views/informasi/sinergi_program/edit.blade.php
+++ b/resources/views/informasi/sinergi_program/edit.blade.php
@@ -32,7 +32,7 @@
{!! html()->form('PUT', route('informasi.sinergi-program.update', $sinergi->id))->id('form-sinergi-program')->class(
'form-horizontal
- form-label-left',
+ form-label-left',
)->acceptsFiles()->open() !!}
diff --git a/resources/views/pesan/masuk/index.blade.php b/resources/views/pesan/masuk/index.blade.php
index 86e144b3f..0d07f7542 100644
--- a/resources/views/pesan/masuk/index.blade.php
+++ b/resources/views/pesan/masuk/index.blade.php
@@ -46,7 +46,7 @@
{!! html()->form('POST', route('pesan.arsip.multiple'))->class(
'form-group
- inline',
+ inline',
)->id('form-multiple-arsip-pesan')->open() !!}
{!! html()->hidden('array_id')->id('array_multiple_id_arsip') !!}
@@ -54,7 +54,7 @@
{!! html()->form('POST', route('pesan.read.multiple'))->class(
'form-group
- inline',
+ inline',
)->id('form-multiple-read-pesan')->open() !!}
{!! html()->hidden('array_id')->id('array_multiple_id') !!}
@@ -88,7 +88,8 @@
- {{ $pesan->custom_date }} |
+ {{ $pesan->custom_date }}
+
@endforeach
diff --git a/resources/views/pesan/read_pesan.blade.php b/resources/views/pesan/read_pesan.blade.php
index 840e2f9f8..5cf60842c 100644
--- a/resources/views/pesan/read_pesan.blade.php
+++ b/resources/views/pesan/read_pesan.blade.php
@@ -28,7 +28,7 @@
@if ($pesan->diarsipkan === 0)
{!! html()->form('POST', route('pesan.arsip.post'))->class(
'form-group
- inline',
+ inline',
)->id('form-arisp-pesan')->open() !!}
{!! html()->hidden('id', $pesan->id) !!}
@@ -77,11 +77,11 @@
diff --git a/resources/views/setting/aplikasi/form.blade.php b/resources/views/setting/aplikasi/form.blade.php
index 169cc7aa9..e28632195 100644
--- a/resources/views/setting/aplikasi/form.blade.php
+++ b/resources/views/setting/aplikasi/form.blade.php
@@ -28,7 +28,7 @@
{!! html()->select('value', [
'OpenStreetMap' => 'OpenStreetMap',
'OpenStreetMap H.O.T.' => 'OpenStreetMap
- H.O.T.',
+ H.O.T.',
'Mapbox Streets' => 'Mapbox Streets',
'Mapbox Satellite' => 'Mapbox Satellite',
'Mapbox Satellite-Streets' => 'Mapbox Satellite-Streets',
diff --git a/resources/views/setting/slide/form.blade.php b/resources/views/setting/slide/form.blade.php
index 51e89ca4d..9b9d7a8e1 100644
--- a/resources/views/setting/slide/form.blade.php
+++ b/resources/views/setting/slide/form.blade.php
@@ -9,7 +9,7 @@
{!! html()->textarea('deskripsi')->class('textarea')->style(
'width: 100%; height: 200px; font-size: 14px;
- line-height: 18px; border: 1px solid #dddddd; padding: 10px;',
+ line-height: 18px; border: 1px solid #dddddd; padding: 10px;',
)->placeholder('deskripsi')->value(old('deskripsi', isset($slide) ? $slide->deskripsi : '')) !!}
diff --git a/routes/web.php b/routes/web.php
index f16e6e8cb..f63aa7787 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -711,7 +711,7 @@
// Anggaran Realisasi
Route::group(['prefix' => 'anggaran-realisasi', 'middleware' => ['action_permission:access.data.anggaran_realisasi']], function () {
Route::get('/', ['as' => 'data.anggaran-realisasi.index', 'uses' => 'AnggaranRealisasiController@index']);
- Route::get('getdata', ['as' => 'data.anggaran-realisasi.getdata', 'uses' => 'AnggaranRealisasiController@getDataAnggaran']);
+ Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.anggaran-realisasi.getdata', 'uses' => 'AnggaranRealisasiController@getDataAnggaran']);
Route::get('edit/{id}', ['as' => 'data.anggaran-realisasi.edit', 'uses' => 'AnggaranRealisasiController@edit']);
Route::put('update/{id}', ['as' => 'data.anggaran-realisasi.update', 'uses' => 'AnggaranRealisasiController@update']);
Route::delete('destroy/{id}', ['as' => 'data.anggaran-realisasi.destroy', 'uses' => 'AnggaranRealisasiController@destroy']);
@@ -723,7 +723,7 @@
// Anggaran Desa
Route::group(['prefix' => 'anggaran-desa', 'middleware' => ['action_permission:access.data.anggaran_desa']], function () {
Route::get('/', ['as' => 'data.anggaran-desa.index', 'uses' => 'AnggaranDesaController@index']);
- Route::get('getdata', ['as' => 'data.anggaran-desa.getdata', 'uses' => 'AnggaranDesaController@getDataAnggaran']);
+ Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.anggaran-desa.getdata', 'uses' => 'AnggaranDesaController@getDataAnggaran']);
Route::delete('destroy/{id}', ['as' => 'data.anggaran-desa.destroy', 'uses' => 'AnggaranDesaController@destroy']);
Route::get('import', ['as' => 'data.anggaran-desa.import', 'uses' => 'AnggaranDesaController@import']);
Route::post('do_import', ['as' => 'data.anggaran-desa.do_import', 'uses' => 'AnggaranDesaController@do_import']);
@@ -733,7 +733,7 @@
// Laporan Apbdes
Route::group(['prefix' => 'laporan-apbdes', 'middleware' => ['action_permission:access.data.laporan_apbdes']], function () {
Route::get('/', ['as' => 'data.laporan-apbdes.index', 'uses' => 'LaporanApbdesController@index']);
- Route::get('getdata', ['as' => 'data.laporan-apbdes.getdata', 'uses' => 'LaporanApbdesController@getApbdes']);
+ Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.laporan-apbdes.getdata', 'uses' => 'LaporanApbdesController@getApbdes']);
Route::delete('destroy/{id}', ['as' => 'data.laporan-apbdes.destroy', 'uses' => 'LaporanApbdesController@destroy']);
Route::get('download{id}', ['as' => 'data.laporan-apbdes.download', 'uses' => 'LaporanApbdesController@download']);
Route::get('import', ['as' => 'data.laporan-apbdes.import', 'uses' => 'LaporanApbdesController@import']);
diff --git a/tests/Feature/Data/FinansialDataTablesPostTest.php b/tests/Feature/Data/FinansialDataTablesPostTest.php
new file mode 100644
index 000000000..ac2a87d14
--- /dev/null
+++ b/tests/Feature/Data/FinansialDataTablesPostTest.php
@@ -0,0 +1,310 @@
+ 'XMLHttpRequest'];
+
+function finansialDatatablePostPayload(array $extra = []): array
+{
+ return array_merge([
+ 'draw' => 1,
+ 'start' => 0,
+ 'length' => 10,
+ 'search' => ['value' => '', 'regex' => 'false'],
+ 'columns[0][data]' => 'aksi',
+ 'columns[0][name]' => 'aksi',
+ 'columns[0][searchable]' => 'false',
+ 'columns[0][orderable]' => 'false',
+ 'columns[0][search][value]' => '',
+ 'order[0][column]' => '1',
+ 'order[0][dir]' => 'asc',
+ ], $extra);
+}
+
+beforeEach(function () {
+ $this->withoutMiddleware([
+ Authenticate::class,
+ RoleMiddleware::class,
+ PermissionMiddleware::class,
+ CompleteProfile::class,
+ GlobalShareMiddleware::class,
+ ]);
+
+ SettingAplikasi::updateOrCreate(
+ ['key' => 'sinkronisasi_database_gabungan'],
+ ['value' => '0']
+ );
+});
+
+// =============================================================================
+// 1. ANGGARAN DAN REALISASI
+// =============================================================================
+describe('DataTables Anggaran dan Realisasi via POST', function () {
+
+ test('endpoint getdata menerima POST dan mengembalikan struktur DataTables', function () {
+ AnggaranRealisasi::create([
+ 'bulan' => 1,
+ 'tahun' => date('Y'),
+ 'total_anggaran' => 100000000,
+ 'total_belanja' => 80000000,
+ 'belanja_pegawai' => 30000000,
+ 'belanja_barang_jasa' => 30000000,
+ 'belanja_modal' => 20000000,
+ 'belanja_tidak_langsung' => 0,
+ ]);
+
+ $response = $this->postJson(
+ route('data.anggaran-realisasi.getdata'),
+ finansialDatatablePostPayload(),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure([
+ 'draw',
+ 'recordsTotal',
+ 'recordsFiltered',
+ 'data',
+ ]);
+ });
+
+ test('POST ke getdata mengembalikan kolom yang diharapkan', function () {
+ AnggaranRealisasi::create([
+ 'bulan' => 2,
+ 'tahun' => date('Y'),
+ 'total_anggaran' => 200000000,
+ 'total_belanja' => 150000000,
+ 'belanja_pegawai' => 50000000,
+ 'belanja_barang_jasa' => 50000000,
+ 'belanja_modal' => 50000000,
+ 'belanja_tidak_langsung' => 0,
+ ]);
+
+ $response = $this->postJson(
+ route('data.anggaran-realisasi.getdata'),
+ finansialDatatablePostPayload(),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $data = $response->json('data');
+ $this->assertNotEmpty($data);
+
+ $firstRow = $data[0];
+ $this->assertArrayHasKey('total_anggaran', $firstRow);
+ $this->assertArrayHasKey('total_belanja', $firstRow);
+ $this->assertArrayHasKey('bulan', $firstRow);
+ $this->assertArrayHasKey('aksi', $firstRow);
+ });
+
+ test('GET pada getdata masih berfungsi (backward-compatible)', function () {
+ $response = $this->getJson(
+ route('data.anggaran-realisasi.getdata'),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure(['draw', 'recordsTotal', 'recordsFiltered', 'data']);
+ });
+});
+
+// =============================================================================
+// 2. APBDES
+// =============================================================================
+describe('DataTables APBDes via POST', function () {
+
+ test('endpoint getdata menerima POST dan mengembalikan struktur DataTables', function () {
+ $desa = DataDesa::factory()->create(['desa_id' => '3301010099100']);
+ AnggaranDesa::create([
+ 'desa_id' => $desa->desa_id,
+ 'no_akun' => '1.1.1',
+ 'nama_akun' => 'Pendapatan Asli Desa',
+ 'jumlah' => 50000000,
+ 'bulan' => 1,
+ 'tahun' => date('Y'),
+ ]);
+
+ $response = $this->postJson(
+ route('data.anggaran-desa.getdata'),
+ finansialDatatablePostPayload(),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure([
+ 'draw',
+ 'recordsTotal',
+ 'recordsFiltered',
+ 'data',
+ ]);
+ });
+
+ test('POST ke getdata mengembalikan kolom yang diharapkan', function () {
+ $desa = DataDesa::factory()->create(['desa_id' => '3301010099101']);
+ AnggaranDesa::create([
+ 'desa_id' => $desa->desa_id,
+ 'no_akun' => '1.1.2',
+ 'nama_akun' => 'Dana Desa',
+ 'jumlah' => 75000000,
+ 'bulan' => 1,
+ 'tahun' => date('Y'),
+ ]);
+
+ $response = $this->postJson(
+ route('data.anggaran-desa.getdata'),
+ finansialDatatablePostPayload(),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $data = $response->json('data');
+ $this->assertNotEmpty($data);
+
+ $firstRow = $data[0];
+ $this->assertArrayHasKey('nama_akun', $firstRow);
+ $this->assertArrayHasKey('jumlah', $firstRow);
+ $this->assertArrayHasKey('bulan', $firstRow);
+ $this->assertArrayHasKey('aksi', $firstRow);
+ });
+
+ test('POST dengan filter desa_id memfilter data dengan benar', function () {
+ $desa1 = DataDesa::factory()->create(['desa_id' => '3301010099102']);
+ $desa2 = DataDesa::factory()->create(['desa_id' => '3301010099103']);
+
+ AnggaranDesa::create(['desa_id' => $desa1->desa_id, 'no_akun' => '1.1.1', 'nama_akun' => 'PAD', 'jumlah' => 100000, 'bulan' => 1, 'tahun' => date('Y')]);
+ AnggaranDesa::create(['desa_id' => $desa2->desa_id, 'no_akun' => '1.1.2', 'nama_akun' => 'DD', 'jumlah' => 200000, 'bulan' => 1, 'tahun' => date('Y')]);
+
+ $response = $this->postJson(
+ route('data.anggaran-desa.getdata'),
+ finansialDatatablePostPayload(['desa' => $desa1->desa_id]),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $data = $response->json('data');
+ foreach ($data as $row) {
+ $this->assertEquals($desa1->nama, $row['desa']['nama']);
+ }
+ });
+
+ test('GET pada getdata masih berfungsi (backward-compatible)', function () {
+ $response = $this->getJson(
+ route('data.anggaran-desa.getdata'),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure(['draw', 'recordsTotal', 'recordsFiltered', 'data']);
+ });
+});
+
+// =============================================================================
+// 3. LAPORAN APBDES
+// =============================================================================
+describe('DataTables Laporan APBDes via POST', function () {
+
+ test('endpoint getdata menerima POST dan mengembalikan struktur DataTables', function () {
+ $desa = DataDesa::factory()->create(['desa_id' => '3301010099104']);
+ LaporanApbdes::create([
+ 'desa_id' => $desa->desa_id,
+ 'judul' => 'Laporan APBDes Test',
+ 'tahun' => date('Y'),
+ 'semester' => 1,
+ 'nama_file' => 'laporan-test.pdf',
+ ]);
+
+ $response = $this->postJson(
+ route('data.laporan-apbdes.getdata'),
+ finansialDatatablePostPayload(),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure([
+ 'draw',
+ 'recordsTotal',
+ 'recordsFiltered',
+ 'data',
+ ]);
+ });
+
+ test('POST ke getdata mengembalikan kolom yang diharapkan', function () {
+ $desa = DataDesa::factory()->create(['desa_id' => '3301010099105']);
+ LaporanApbdes::create([
+ 'desa_id' => $desa->desa_id,
+ 'judul' => 'Laporan APBDes Kolom Test',
+ 'tahun' => date('Y'),
+ 'semester' => 1,
+ 'nama_file' => 'laporan-kolom-test.pdf',
+ ]);
+
+ $response = $this->postJson(
+ route('data.laporan-apbdes.getdata'),
+ finansialDatatablePostPayload(),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $data = $response->json('data');
+ $this->assertNotEmpty($data);
+
+ $firstRow = $data[0];
+ $this->assertArrayHasKey('judul', $firstRow);
+ $this->assertArrayHasKey('nama_desa', $firstRow);
+ $this->assertArrayHasKey('tahun', $firstRow);
+ $this->assertArrayHasKey('semester', $firstRow);
+ $this->assertArrayHasKey('aksi', $firstRow);
+ });
+
+ test('POST dengan filter desa_id memfilter data dengan benar', function () {
+ $desa1 = DataDesa::factory()->create(['desa_id' => '3301010099106']);
+ $desa2 = DataDesa::factory()->create(['desa_id' => '3301010099107']);
+
+ LaporanApbdes::create(['desa_id' => $desa1->desa_id, 'judul' => 'Laporan Desa 1', 'tahun' => date('Y'), 'semester' => 1, 'nama_file' => 'f1.pdf']);
+ LaporanApbdes::create(['desa_id' => $desa2->desa_id, 'judul' => 'Laporan Desa 2', 'tahun' => date('Y'), 'semester' => 1, 'nama_file' => 'f2.pdf']);
+
+ $response = $this->postJson(
+ route('data.laporan-apbdes.getdata'),
+ finansialDatatablePostPayload(['desa' => $desa1->desa_id]),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $data = $response->json('data');
+ foreach ($data as $row) {
+ $this->assertEquals($desa1->nama, $row['nama_desa']);
+ }
+ });
+
+ test('GET pada getdata masih berfungsi (backward-compatible)', function () {
+ $response = $this->getJson(
+ route('data.laporan-apbdes.getdata'),
+ FINANSIAL_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure(['draw', 'recordsTotal', 'recordsFiltered', 'data']);
+ });
+});