Perubahan yang dilakukan: **Controller LaporanClosingBalanceController:** - Membuat controller baru untuk laporan closing balance dengan method index(), dataForDatatables(), export(), dan show(). - Menggunakan model AccountBalance dengan field actual_balance dan cleared_balance. - Implementasi filter nomor rekening dan rentang tanggal. - Menambahkan DB transaction dan rollback untuk keamanan data. - Logging dan error handling komprehensif untuk proses data dan export. **View laporan-closing-balance/index.blade.php:** - Form filter dengan input nomor rekening dan rentang tanggal (default 30 hari terakhir). - Implementasi DataTables dengan kolom: Nomor Rekening, Periode, Saldo Cleared, Saldo Aktual, Tanggal Update, dan Action. - Tombol Filter, Reset, dan Export CSV. - JavaScript untuk format currency IDR, format tanggal, dan dynamic export URL. - Menggunakan TailwindCSS dan KTDataTable untuk desain yang responsive. **View laporan-closing-balance/show.blade.php:** - Halaman detail per record dengan visual saldo yang menarik (color-coded cards). - Menampilkan Saldo Cleared, Saldo Aktual, dan Selisih Saldo secara otomatis. - Informasi rekening dan periode disertai fitur copy ke clipboard. - Tombol aksi: Kembali, Export, dan Print (dengan print style khusus). - Responsive untuk berbagai ukuran layar. **Routing dan Navigasi:** - Menambahkan routing resource dengan prefix 'laporan-closing-balance' di web.php. - Tambahan route untuk datatables, export, dan show dengan middleware auth. - Breadcrumb dinamis untuk index dan show, menampilkan nomor rekening dan periode. **Penyesuaian Model:** - Menggunakan relasi Account di model AccountBalance melalui account_number. - Menyesuaikan field dari opening_balance ke cleared_balance sesuai skema. - Tetap mempertahankan actual_balance untuk saldo akhir. **Fitur Keamanan dan Performance:** - Input validation dan sanitization untuk semua request. - Pagination dan filter query untuk efisiensi dan mencegah memory overflow. - Error logging dengan context untuk debugging lebih mudah. **User Experience:** - Interface user-friendly dengan feedback visual dan loading state. - Export CSV untuk kebutuhan analisis lebih lanjut. - Print-friendly layout untuk kebutuhan cetak data. - Clipboard integration untuk kemudahan salin data. Tujuan perubahan: - Menyediakan fitur monitoring dan analisis closing balance secara komprehensif di modul Webstatement. - Mempermudah user dalam melihat detail saldo akhir dengan filtering, export, dan cetak yang optimal.
132 lines
7.1 KiB
PHP
132 lines
7.1 KiB
PHP
<?php
|
|
|
|
use Illuminate\Support\Facades\Route;
|
|
use Modules\Webstatement\Http\Controllers\{
|
|
PeriodeStatementController,
|
|
PrintStatementController,
|
|
SyncLogsController,
|
|
JenisKartuController,
|
|
KartuAtmController,
|
|
CustomerController,
|
|
EmailBlastController,
|
|
WebstatementController,
|
|
DebugStatementController,
|
|
EmailStatementLogController,
|
|
AtmTransactionReportController,
|
|
LaporanClosingBalanceController
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Web Routes
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Here is where you can register web routes for your application. These
|
|
| routes are loaded by the RouteServiceProvider within a group which
|
|
| contains the "web" middleware group. Now create something great!
|
|
|
|
|
*/
|
|
|
|
Route::middleware(['auth'])->group(function () {
|
|
//Route::get('/', [WebstatementController::class, 'index'])->name('webstatement.index');
|
|
|
|
// Customer routes
|
|
|
|
Route::get('datatables', [CustomerController::class, 'dataForDatatables'])->name('customer.datatables');
|
|
Route::get('export', [CustomerController::class, 'export'])->name('customer.export');
|
|
Route::post('delete-multiple', [CustomerController::class, 'deleteMultiple'])->name('deleteMultiple');
|
|
Route::resource('customer', CustomerController::class);
|
|
|
|
|
|
Route::prefix('jenis-kartu')->name('jenis-kartu.')->group(function () {
|
|
Route::get('datatables', [JenisKartuController::class, 'dataForDatatables'])->name('datatables');
|
|
Route::get('export', [JenisKartuController::class, 'export'])->name('export');
|
|
Route::post('delete-multiple', [JenisKartuController::class, 'deleteMultiple'])->name('deleteMultiple');
|
|
});
|
|
Route::resource('jenis-kartu', JenisKartuController::class);
|
|
|
|
Route::prefix('kartu-atm')->name('kartu-atm.')->group(function () {
|
|
Route::get('datatables', [KartuAtmController::class, 'dataForDatatables'])->name('datatables');
|
|
});
|
|
Route::resource('kartu-atm', KartuAtmController::class)->only('index');
|
|
|
|
Route::prefix('sync-logs')->name('sync-logs.')->group(function () {
|
|
Route::get('datatables', [SyncLogsController::class, 'dataForDatatables'])->name('datatables');
|
|
Route::get('/download/{id}', [SyncLogsController::class, 'downloadFile'])->name('download');
|
|
|
|
});
|
|
Route::resource('sync-logs', SyncLogsController::class);
|
|
|
|
Route::prefix('emailblast')->group(function () {
|
|
Route::get('/', [EmailBlastController::class, 'index'])->name('emailblast.index');
|
|
Route::get('/create', [EmailBlastController::class, 'create'])->name('emailblast.create');
|
|
Route::post('/', [EmailBlastController::class, 'store'])->name('emailblast.store');
|
|
Route::get('/{id}/view', [EmailBlastController::class, 'view'])->name('emailblast.view');
|
|
Route::get('/datatables', [EmailBlastController::class, 'datatables'])->name('emailblast.datatables');
|
|
});
|
|
|
|
// Periode Statement Routes
|
|
Route::group(['prefix' => 'periode-statements', 'as' => 'periode-statements.', 'middleware' => ['auth']], function () {
|
|
Route::get('/datatables', [PeriodeStatementController::class, 'dataForDatatables'])->name('datatables');
|
|
Route::get('/export', [PeriodeStatementController::class, 'export'])->name('export');
|
|
|
|
// Process, complete, and fail routes
|
|
Route::get('/{periodeStatement}/process', 'PeriodeStatementController@process')->name('process');
|
|
Route::get('/{periodeStatement}/complete', 'PeriodeStatementController@complete')->name('complete');
|
|
Route::post('/{periodeStatement}/fail', 'PeriodeStatementController@fail')->name('fail');
|
|
|
|
// Authorization routes
|
|
Route::get('/pending-authorization', 'PeriodeStatementController@pendingAuthorization')->name('pending-authorization');
|
|
Route::get('/{periodeStatement}/authorize', 'PeriodeStatementController@showAuthorize')->name('show-authorize');
|
|
Route::post('/{periodeStatement}/authorize', 'PeriodeStatementController@authorize')->name('authorize');
|
|
});
|
|
|
|
Route::resource('periode-statements', PeriodeStatementController::class);
|
|
|
|
Route::group(['prefix' => 'statements', 'as' => 'statements.', 'middleware' => ['auth']], function () {
|
|
Route::get('/datatables', [PrintStatementController::class, 'dataForDatatables'])->name('datatables');
|
|
Route::get('/{statement}/download', [PrintStatementController::class, 'download'])->name('download');
|
|
Route::post('/{statement}/authorize', [PrintStatementController::class, 'authorize'])->name('authorize');
|
|
Route::get('/{statement}/send-email', [PrintStatementController::class, 'sendEmail'])->name('send-email');
|
|
});
|
|
|
|
Route::resource('statements', PrintStatementController::class);
|
|
|
|
|
|
// ATM Transaction Report Routes
|
|
Route::group(['prefix' => 'atm-reports', 'as' => 'atm-reports.', 'middleware' => ['auth']], function () {
|
|
Route::get('/datatables', [AtmTransactionReportController::class, 'dataForDatatables'])->name('datatables');
|
|
Route::get('/{atmReport}/download', [AtmTransactionReportController::class, 'download'])->name('download');
|
|
Route::post('/{atmReport}/authorize', [AtmTransactionReportController::class, 'authorize'])->name('authorize');
|
|
Route::get('/{atmReport}/send-email', [AtmTransactionReportController::class, 'sendEmail'])->name('send-email');
|
|
Route::post('/{atmReport}/retry', [AtmTransactionReportController::class, 'retry'])->name('retry');
|
|
});
|
|
|
|
Route::resource('atm-reports', AtmTransactionReportController::class);
|
|
|
|
// Email Statement Log Routes
|
|
Route::group(['prefix' => 'email-statement-logs', 'as' => 'email-statement-logs.', 'middleware' => ['auth']], function () {
|
|
Route::get('/datatables', [EmailStatementLogController::class, 'dataForDatatables'])->name('datatables');
|
|
Route::post('/{id}/resend-email', [EmailStatementLogController::class, 'resendEmail'])->name('resend-email');
|
|
});
|
|
Route::resource('email-statement-logs', EmailStatementLogController::class)->only(['index', 'show']);
|
|
|
|
// Laporan Closing Balance Routes
|
|
Route::group(['prefix' => 'laporan-closing-balance', 'as' => 'laporan-closing-balance.', 'middleware' => ['auth']], function () {
|
|
Route::get('/datatables', [LaporanClosingBalanceController::class, 'dataForDatatables'])->name('datatables');
|
|
Route::get('/export', [LaporanClosingBalanceController::class, 'export'])->name('export');
|
|
Route::get('/{accountNumber}/{period}', [LaporanClosingBalanceController::class, 'show'])->name('show');
|
|
});
|
|
Route::resource('laporan-closing-balance', LaporanClosingBalanceController::class)->only(['index']);
|
|
});
|
|
|
|
Route::get('/stmt-export-csv', [WebstatementController::class, 'index'])->name('webstatement.index');
|
|
|
|
Route::prefix('debug')->group(function () {
|
|
Route::get('/test-statement',[WebstatementController::class,'printStatementRekening'])->name('webstatement.test');
|
|
Route::post('/statement', [DebugStatementController::class, 'debugStatement'])->name('debug.statement');
|
|
Route::get('/statements', [DebugStatementController::class, 'listStatements'])->name('debug.statements.list');
|
|
});
|