package com.cloudhandson.vpdbackoffice.domain.masking; /** * Read-only comparison between the configured masking metadata and the * corresponding Oracle Data Redaction policy stored in the database. */ public record MaskingPolicyStatus( String owner, String objectName, String policyName, String enabled, int configuredColumnCount, int appliedColumnCount, int mismatchedColumnCount, int legacyVpdColumnPolicyCount ) { public String targetLabel() { return owner + "." + objectName; } public boolean policyEnabled() { return "YES".equalsIgnoreCase(enabled); } /** A policy with no configured active column is correct only while disabled. */ public boolean inactiveAsExpected() { return configuredColumnCount == 0 && !policyEnabled() && legacyVpdColumnPolicyCount == 0; } public boolean applied() { return configuredColumnCount > 0 && policyEnabled() && configuredColumnCount == appliedColumnCount && mismatchedColumnCount == 0 && legacyVpdColumnPolicyCount == 0; } public String statusLabel() { if (applied()) { return "적용됨"; } if (inactiveAsExpected()) { return "미적용"; } return "설정-DB 불일치"; } public String badgeClass() { if (applied()) { return "text-bg-success"; } if (inactiveAsExpected()) { return "text-bg-secondary"; } return "text-bg-danger"; } public String detail() { if (applied()) { return "활성 규칙과 DB 정책 컬럼이 일치합니다."; } if (legacyVpdColumnPolicyCount > 0) { return "기존 컬럼 NULL 정책(VPD CLS)이 활성입니다. ASO 설정과 별도로 값을 NULL 처리할 수 있습니다."; } if (inactiveAsExpected()) { return "활성 컬럼 기본 규칙이 없어 DB 정책을 중지 상태로 보관합니다."; } if (configuredColumnCount > 0 && !policyEnabled()) { return "활성 규칙이 있으나 DB 정책이 비활성입니다. 동기화가 필요합니다."; } if (configuredColumnCount == 0) { return "활성 규칙이 없는데 DB 정책이 활성입니다. 동기화가 필요합니다."; } return "설정 컬럼과 DB Redaction 컬럼이 다릅니다. 동기화가 필요합니다."; } }