feat:DB 트리거 감사 로그 관리 화면 구현

- TriggerAuditLog 모델 (casts, accessors, scopes)
- TriggerAuditController (목록/상세/이력/롤백 미리보기/롤백 실행)
- index: 대시보드 통계 + 필터 + 목록 + 파티션 현황
- show: old/new diff 뷰 (변경 컬럼 하이라이트)
- history: 레코드별 변경 타임라인
- rollback-preview: SQL 미리보기 + 확인 후 실행
- 라우트 5개 등록, 메뉴 시더 (시스템 관리 > DB 변경 추적)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-09 08:55:18 +09:00
parent 5ca9317880
commit 0316c63d3c
8 changed files with 848 additions and 8 deletions

View File

@@ -2,13 +2,15 @@
use App\Http\Controllers\Api\BusinessCardOcrController;
use App\Http\Controllers\ApiLogController;
use App\Http\Controllers\AppVersionController;
use App\Http\Controllers\ArchivedRecordController;
use App\Http\Controllers\AuditLogController;
use App\Http\Controllers\AppVersionController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\BoardController;
use App\Http\Controllers\CategoryController;
use App\Http\Controllers\CategorySyncController;
use App\Http\Controllers\CommonCodeController;
use App\Http\Controllers\CommonCodeSyncController;
use App\Http\Controllers\CustomerCenterController;
use App\Http\Controllers\DailyLogController;
use App\Http\Controllers\DepartmentController;
@@ -18,13 +20,9 @@
use App\Http\Controllers\DocumentTemplateController;
use App\Http\Controllers\FcmController;
use App\Http\Controllers\ItemFieldController;
use App\Http\Controllers\Lab\AIController;
use App\Http\Controllers\Lab\ManagementController;
use App\Http\Controllers\Lab\StrategyController;
use App\Http\Controllers\MenuController;
use App\Http\Controllers\MenuSyncController;
use App\Http\Controllers\CommonCodeSyncController;
use App\Http\Controllers\CategorySyncController;
use App\Http\Controllers\PermissionController;
use App\Http\Controllers\PostController;
use App\Http\Controllers\ProfileController;
@@ -33,12 +31,13 @@
use App\Http\Controllers\RoleController;
use App\Http\Controllers\RolePermissionController;
use App\Http\Controllers\Sales\SalesProductController;
use App\Http\Controllers\Stats\StatDashboardController;
use App\Http\Controllers\System\AiConfigController;
use App\Http\Controllers\System\HolidayController;
use App\Http\Controllers\Stats\StatDashboardController;
use App\Http\Controllers\System\SystemAlertController;
use App\Http\Controllers\TenantController;
use App\Http\Controllers\TenantSettingController;
use App\Http\Controllers\TriggerAuditController;
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;
@@ -92,7 +91,7 @@
*/
// GET /logout 요청 시 로그인 페이지로 리다이렉트
Route::get('/logout', fn() => redirect()->route('login'));
Route::get('/logout', fn () => redirect()->route('login'));
Route::middleware(['auth', 'hq.member', 'password.changed'])->group(function () {
Route::post('/logout', [LoginController::class, 'logout'])->name('logout');
@@ -273,6 +272,15 @@
Route::get('/{id}', [AuditLogController::class, 'show'])->name('show');
});
// 트리거 감사 로그 (DB 레벨 변경 추적)
Route::prefix('trigger-audit')->name('trigger-audit.')->group(function () {
Route::get('/', [TriggerAuditController::class, 'index'])->name('index');
Route::get('/{id}', [TriggerAuditController::class, 'show'])->name('show')->whereNumber('id');
Route::get('/{id}/rollback-preview', [TriggerAuditController::class, 'rollbackPreview'])->name('rollback-preview')->whereNumber('id');
Route::post('/{id}/rollback', [TriggerAuditController::class, 'rollbackExecute'])->name('rollback-execute')->whereNumber('id');
Route::get('/{tableName}/{rowId}/history', [TriggerAuditController::class, 'recordHistory'])->name('history');
});
// 프로젝트 관리 (Blade 화면만)
Route::prefix('project-management')->name('pm.')->group(function () {
// 대시보드
@@ -456,6 +464,7 @@
if (request()->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', route('finance.account-transactions'));
}
return redirect()->route('finance.account-transactions');
})->name('index');
Route::get('/accounts', [\App\Http\Controllers\Barobill\EaccountController::class, 'accounts'])->name('accounts');
@@ -486,6 +495,7 @@
if (request()->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', route('finance.card-transactions'));
}
return redirect()->route('finance.card-transactions');
})->name('index');
Route::get('/cards', [\App\Http\Controllers\Barobill\EcardController::class, 'cards'])->name('cards');
@@ -782,6 +792,7 @@
if (request()->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', route('finance.journal-entries'));
}
return view('finance.journal-entries');
})->name('journal-entries');
@@ -909,7 +920,7 @@
});
// 기존 sales-commission URL 리다이렉트 (호환성)
Route::get('/sales-commission', fn() => redirect()->route('finance.sales-commissions.index'))->name('sales-commission');
Route::get('/sales-commission', fn () => redirect()->route('finance.sales-commissions.index'))->name('sales-commission');
Route::get('/consulting-fee', function () {
if (request()->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', route('finance.consulting-fee'));