diff --git a/DB/DDL/vips/tb_car_ffnlg_trgt.sql b/DB/DDL/vips/tb_car_ffnlg_trgt.sql index 66951f4..2268d11 100644 --- a/DB/DDL/vips/tb_car_ffnlg_trgt.sql +++ b/DB/DDL/vips/tb_car_ffnlg_trgt.sql @@ -21,7 +21,7 @@ create table tb_car_ffnlg_trgt TASK_PRCS_STTS_CD varchar(2) null comment '업무 처리 상태 코드', TASK_PRCS_YMD varchar(8) null comment '업무 처리 일자', RMRK varchar(4000) null comment '비고', - RMRK_DTL varchar(4000) null comment '비고 상세', + RMRK_DTL TEXT null comment '비고 상세', CAR_BASS_MATTER_INQIRE_ID varchar(20) null comment '자동차 기본 사항 조회 ID', CAR_LEDGER_FRMBK_ID varchar(20) null comment '자동차 등록 원부 갑 ID', CAR_BSC_MTTR_INQ_FLNM varchar(75) null comment '자동차 기본 사항 조회 성명', @@ -39,3 +39,7 @@ create table tb_car_ffnlg_trgt ) comment '자동차 과태료 대상'; + + +ALTER TABLE tb_car_ffnlg_trgt +ADD COLUMN RMRK_DTL TEXT NULL COMMENT '비고 상세'; diff --git a/DB/DDL/vips/tb_car_ffnlg_trgt_incmp.sql b/DB/DDL/vips/tb_car_ffnlg_trgt_incmp.sql index c27b03e..b2cbfec 100644 --- a/DB/DDL/vips/tb_car_ffnlg_trgt_incmp.sql +++ b/DB/DDL/vips/tb_car_ffnlg_trgt_incmp.sql @@ -17,7 +17,7 @@ create table tb_car_ffnlg_trgt_incmp TASK_PRCS_STTS_CD varchar(2) null comment '업무 처리 상태 코드', TASK_PRCS_YMD varchar(8) null comment '업무 처리 일자', RMRK varchar(4000) null comment '비고', - RMRK_DTL varchar(4000) null comment '비고 상세', + RMRK_DTL TEXT null comment '비고 상세', CAR_BASS_MATTER_INQIRE_ID varchar(20) null comment '자동차 기본 사항 조회 ID', CAR_LEDGER_FRMBK_ID varchar(20) null comment '자동차 등록 원부 갑 ID', CAR_BSC_MTTR_INQ_FLNM varchar(75) null comment '자동차 기본 사항 조회 성명', @@ -35,3 +35,7 @@ create table tb_car_ffnlg_trgt_incmp ) comment '자동차 과태료 대상 미필'; + + +ALTER TABLE tb_car_ffnlg_trgt_incmp +ADD COLUMN RMRK_DTL TEXT NULL COMMENT '비고 상세'; \ No newline at end of file diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonRemarkBuilder.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonRemarkBuilder.java index 7479fde..a09b2f1 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonRemarkBuilder.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonRemarkBuilder.java @@ -112,15 +112,42 @@ public class ComparisonRemarkBuilder { public static String buildProductUseRemarkDetail(String vhclno, String inspYmd, String step1OwnerNm, String targetChgYmd, String step4OwnerNm) { StringBuilder sb = new StringBuilder(); - sb.append("[상품용 판정]\n"); + sb.append("[상품용 판정 - 지연]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); - sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n"); - sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); - sb.append("갑부 변경일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n"); - sb.append("변경일 기준 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); - sb.append("판정근거: 검사일 기준 소유자명에 '상품용' 포함되어 있고, "); - sb.append("갑부 상세에서 변경업무구분코드 '21'(변경등록) 레코드 확인됨"); - return truncateToMaxLength(sb.toString()); + sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("Step1) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → O\n\n"); + + sb.append("Step2) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 오늘일자\n"); + sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n"); + + sb.append("Step3) 자동차등록원부(갑) 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n"); + sb.append(" - 검색 조건:\n"); + sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n"); + sb.append(" · 변경일자(CHG_YMD) ≤ 검사종료일자\n"); + sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n"); + sb.append(" - 선택된 갑부 변경일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n"); + + sb.append("Step4) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 갑부 변경일자(").append(DateUtil.formatDateString(targetChgYmd)).append(")\n"); + sb.append(" - 변경일 기준 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step4 대표소유자 회원번호 → 일치\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. 검사일자 기준 소유자명에 '상품용' 포함\n"); + sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사종료일자 이내에 존재\n"); + sb.append("3. 갑부 변경일자 시점의 대표소유자 회원번호와 검사일자 기준 대표소유자 회원번호가 동일\n"); + sb.append("→ 상품용 판정 (처리상태: 02_상품용)\n"); + + return sb.toString(); } /** @@ -138,17 +165,53 @@ public class ComparisonRemarkBuilder { String step1OwnerNm, String targetChgYmd, String step4OwnerNm, long daysBetween) { StringBuilder sb = new StringBuilder(); - sb.append("[내사종결 - 명의이전 이전소유자 상품용 판정]\n"); + sb.append("[내사종결 - 명의이전 이전소유자 상품용 판정 - 지연]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n"); - sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); - sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n"); - sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append("31일 기준일: ").append(DateUtil.formatDateString( + DateUtil.parseDate(inspYmd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("Step1) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n"); + + sb.append("Step2) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 오늘일자\n"); + sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n"); + + sb.append("Step3) 자동차등록원부(갑) 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n"); + sb.append(" - 검색 조건:\n"); + sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n"); + sb.append(" · 변경일자(CHG_YMD) ≤ 검사일자\n"); + sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n"); + sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n"); + + sb.append("Step4) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 명의이전일자-1일(").append(DateUtil.formatDateString( + DateUtil.parseDate(targetChgYmd).minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(")\n"); + sb.append(" - 명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 명의이전 전 소유자명에 '상품용' 포함 → O\n\n"); + + sb.append("=== 일수 계산 ===\n"); sb.append("검사일~명의이전일 일수: ").append(daysBetween).append("일\n"); - sb.append("판정근거: 검사일 기준 소유자명에 '상품용' 미포함이나, "); - sb.append("갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드의 이전 소유자가 '상품용'이고, "); - sb.append("명의이전일이 검사일로부터 31일 이내임"); - return truncateToMaxLength(sb.toString()); + sb.append("기준일수: 31일\n"); + sb.append("조건 확인: ").append(daysBetween).append("일 ≤ 31일 → 이내\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. 검사일자 기준 소유자명에 '상품용' 미포함\n"); + sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사일자 이내에 존재\n"); + sb.append("3. 명의이전일자-1일 시점의 소유자명에 '상품용' 포함\n"); + sb.append("4. 명의이전일이 검사일로부터 31일 이내 (").append(daysBetween).append("일)\n"); + sb.append("→ 내사종결 - 명의이전 이전소유자 상품용 판정 (처리상태: 04_내사종결)\n"); + + return sb.toString(); } /** @@ -166,16 +229,53 @@ public class ComparisonRemarkBuilder { String step1OwnerNm, String targetChgYmd, String step4OwnerNm, long daysBetween) { StringBuilder sb = new StringBuilder(); - sb.append("[내사종결 - 명의이전 판정]\n"); + sb.append("[내사종결 - 명의이전 판정 - 지연]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n"); - sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); - sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n"); - sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append("31일 기준일: ").append(DateUtil.formatDateString( + DateUtil.parseDate(inspYmd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("Step1) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n"); + + sb.append("Step2) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 오늘일자\n"); + sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n"); + + sb.append("Step3) 자동차등록원부(갑) 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n"); + sb.append(" - 검색 조건:\n"); + sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n"); + sb.append(" · 변경일자(CHG_YMD) ≤ 검사일자\n"); + sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n"); + sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n"); + + sb.append("Step4) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 명의이전일자(").append(DateUtil.formatDateString(targetChgYmd)).append(")\n"); + sb.append(" - 명의이전 시점 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step4 대표소유자 회원번호 → 일치\n"); + sb.append(" - 명의이전 시점 소유자명에 '상품용' 포함 → X\n\n"); + + sb.append("=== 일수 계산 ===\n"); sb.append("검사일~명의이전일 일수: ").append(daysBetween).append("일\n"); - sb.append("판정근거: 검사일 기준 소유자와 명의이전 전 소유자가 동일하고, "); - sb.append("명의이전일이 검사일로부터 31일 이내임"); - return truncateToMaxLength(sb.toString()); + sb.append("기준일수: 31일\n"); + sb.append("조건 확인: ").append(daysBetween).append("일 ≤ 31일 → 이내\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. 검사일자 기준 소유자명에 '상품용' 미포함\n"); + sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사일자 이내에 존재\n"); + sb.append("3. 명의이전 시점의 대표소유자 회원번호와 검사일자 기준 대표소유자 회원번호가 동일 (소유자 변동 없음)\n"); + sb.append("4. 명의이전 시점 소유자명에 '상품용' 미포함\n"); + sb.append("5. 명의이전일이 검사일로부터 31일 이내 (").append(daysBetween).append("일)\n"); + sb.append("→ 내사종결 - 명의이전 판정 (처리상태: 04_내사종결)\n"); + + return sb.toString(); } /** @@ -193,17 +293,54 @@ public class ComparisonRemarkBuilder { String step1OwnerNm, String targetChgYmd, String step4OwnerNm, long daysBetween) { StringBuilder sb = new StringBuilder(); - sb.append("[날짜수정후부과 - 명의이전 이전소유자 상품용 판정]\n"); + sb.append("[날짜수정후부과 - 명의이전 이전소유자 상품용 판정 - 지연]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n"); - sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); - sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n"); - sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append("31일 기준일: ").append(DateUtil.formatDateString( + DateUtil.parseDate(inspYmd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("Step1) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n"); + + sb.append("Step2) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 오늘일자\n"); + sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n"); + + sb.append("Step3) 자동차등록원부(갑) 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n"); + sb.append(" - 검색 조건:\n"); + sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n"); + sb.append(" · 변경일자(CHG_YMD) ≤ 검사일자\n"); + sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n"); + sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n"); + + sb.append("Step4) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 명의이전일자-1일(").append(DateUtil.formatDateString( + DateUtil.parseDate(targetChgYmd).minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(")\n"); + sb.append(" - 명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 명의이전 전 소유자명에 '상품용' 포함 → O\n\n"); + + sb.append("=== 일수 계산 ===\n"); sb.append("검사일~명의이전일 일수: ").append(daysBetween).append("일\n"); - sb.append("판정근거: 검사일 기준 소유자명에 '상품용' 미포함이나, "); - sb.append("갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드의 이전 소유자가 '상품용'이고, "); - sb.append("명의이전일이 검사일로부터 31일 초과함 (부과일자 수정 필요)"); - return truncateToMaxLength(sb.toString()); + sb.append("기준일수: 31일\n"); + sb.append("조건 확인: ").append(daysBetween).append("일 > 31일 → 초과\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. 검사일자 기준 소유자명에 '상품용' 미포함\n"); + sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사일자 이내에 존재\n"); + sb.append("3. 명의이전일자-1일 시점의 소유자명에 '상품용' 포함\n"); + sb.append("4. 명의이전일이 검사일로부터 31일 초과 (").append(daysBetween).append("일)\n"); + sb.append("→ 날짜수정후부과 - 명의이전 이전소유자 상품용 판정 (처리상태: 05_날짜수정후부과)\n"); + sb.append("※ 부과일자를 명의이전일자로 수정하여 재부과 필요\n"); + + return sb.toString(); } /** @@ -211,26 +348,74 @@ public class ComparisonRemarkBuilder { * * @param vhclno 차량번호 * @param inspYmd 검사일자 + * @param vldPrdExpryYmd 유효기간만료일 + * @param inspEndYmd 검사종료일자 * @param step1OwnerNm Step1 소유자명 * @param targetChgYmd 갑부 명의이전 일자 * @param step4OwnerNm Step4 소유자명 (명의이전 전 소유자) * @param daysBetween 검사일과 명의이전일 간 일수차이 * @return 비고 상세 문자열 */ - public static String buildOwnerLevyOver31RemarkDetail(String vhclno, String inspYmd, - String step1OwnerNm, String targetChgYmd, + public static String buildOwnerLevyOver31RemarkDetail(String vhclno, String inspYmd, String vldPrdExpryYmd, + String inspEndYmd, String step1OwnerNm, String targetChgYmd, String step4OwnerNm, long daysBetween) { StringBuilder sb = new StringBuilder(); - sb.append("[날짜수정후부과 - 명의이전 판정]\n"); + sb.append("[날짜수정후부과 - 명의이전 판정 - 지연]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n"); - sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); - sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n"); - sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append("유효기간만료일: ").append(DateUtil.formatDateString(vldPrdExpryYmd)).append("\n"); + sb.append("유효기간만료일 - 90일: ").append(DateUtil.formatDateString( + DateUtil.parseDate(vldPrdExpryYmd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n"); + sb.append("검사종료일자: ").append(DateUtil.formatDateString(inspEndYmd)).append("\n"); + sb.append("31일 기준일: ").append(DateUtil.formatDateString( + DateUtil.parseDate(inspYmd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("Step1) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n"); + + sb.append("Step2) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 오늘일자\n"); + sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n"); + + sb.append("Step3) 자동차등록원부(갑) 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n"); + sb.append(" - 검색 조건:\n"); + sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n"); + sb.append(" · 유효기간만료일-90일 ≤ 변경일자(CHG_YMD) ≤ 검사종료일자\n"); + sb.append(" · 범위: ").append(DateUtil.formatDateString( + DateUtil.parseDate(vldPrdExpryYmd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(" ~ ").append(DateUtil.formatDateString(inspEndYmd)).append("\n"); + sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n"); + sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n"); + + sb.append("Step4) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 명의이전일자(").append(DateUtil.formatDateString(targetChgYmd)).append(")\n"); + sb.append(" - 명의이전 시점 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step4 대표소유자 회원번호 → 일치\n"); + sb.append(" - 명의이전 시점 소유자명에 '상품용' 포함 → X\n\n"); + + sb.append("=== 일수 계산 ===\n"); sb.append("검사일~명의이전일 일수: ").append(daysBetween).append("일\n"); - sb.append("판정근거: 검사일 기준 소유자와 명의이전 전 소유자가 동일하고, "); - sb.append("명의이전일이 검사일로부터 31일 초과함 (부과일자 수정 필요)"); - return truncateToMaxLength(sb.toString()); + sb.append("기준일수: 31일\n"); + sb.append("조건 확인: ").append(daysBetween).append("일 > 31일 → 초과\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. 검사일자 기준 소유자명에 '상품용' 미포함\n"); + sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사기간(유효기간만료일-90일 ~ 검사종료일자) 내에 존재\n"); + sb.append("3. 명의이전 시점의 대표소유자 회원번호와 검사일자 기준 대표소유자 회원번호가 동일 (소유자 변동 없음)\n"); + sb.append("4. 명의이전 시점 소유자명에 '상품용' 미포함\n"); + sb.append("5. 명의이전일이 검사일로부터 31일 초과 (").append(daysBetween).append("일)\n"); + sb.append("→ 날짜수정후부과 - 명의이전 판정 (처리상태: 05_날짜수정후부과)\n"); + sb.append("※ 부과일자를 명의이전일자로 수정하여 재부과 필요\n"); + + return sb.toString(); } /** @@ -248,16 +433,35 @@ public class ComparisonRemarkBuilder { String ownerNm, String usgsrhldStdgCd, String sggNm, String userOrgCd) { StringBuilder sb = new StringBuilder(); - sb.append("[이첩 판정 - 검사일 사용본거지]\n"); + sb.append("[이첩 판정 - 검사일 사용본거지 (이첩-1) - 지연]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n"); - sb.append("소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n"); - sb.append("사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n"); - sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n"); - sb.append("현재 사용자 조직코드: ").append(StringUtil.nvl(userOrgCd)).append("\n"); - sb.append("판정근거: DAYCNT가 115일 이하이고, "); - sb.append("검사일 기준 사용본거지법정동코드 앞 4자리가 현재 사용자 조직코드 앞 4자리와 불일치하여 이첩 대상임"); - return truncateToMaxLength(sb.toString()); + sb.append("DAYCNT: 115일 이하\n"); + sb.append("부과기준일: 검사일자 (DAYCNT ≤ 115이므로)\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 부과기준일(검사일자)(").append(DateUtil.formatDateString(inspYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n"); + sb.append(" - 사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n\n"); + + sb.append("=== 법정동코드 비교 ===\n"); + String legalDong4 = usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 4 ? usgsrhldStdgCd.substring(0, 4) : ""; + String userOrg4 = userOrgCd != null && userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : ""; + sb.append("사용본거지법정동코드 앞 4자리: ").append(legalDong4).append("\n"); + sb.append("현재 사용자 조직코드 앞 4자리: ").append(userOrg4).append("\n"); + sb.append("코드 불일치 → 이첩 대상\n"); + sb.append("시군구코드: ").append(usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 5 ? usgsrhldStdgCd.substring(0, 5) : "").append("\n"); + sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. DAYCNT ≤ 115일이므로 부과기준일 = 검사일자\n"); + sb.append("2. 검사일자 기준 사용본거지법정동코드 앞 4자리와 현재 사용자 조직코드 앞 4자리가 불일치\n"); + sb.append("→ 이첩 판정 - 검사일 사용본거지 (처리상태: 03_이첩)\n"); + + return sb.toString(); } /** @@ -276,17 +480,39 @@ public class ComparisonRemarkBuilder { String ownerNm, String usgsrhldStdgCd, String sggNm, String userOrgCd, String daycnt) { StringBuilder sb = new StringBuilder(); - sb.append("[이첩 판정 - 115일 도래지]\n"); + sb.append("[이첩 판정 - 115일 도래지 (이첩-2) - 지연]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사종료일자: ").append(DateUtil.formatDateString(inspEndYmd)).append("\n"); - sb.append("소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n"); - sb.append("DAYCNT: ").append(StringUtil.nvl(daycnt)).append("일\n"); - sb.append("사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n"); - sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n"); - sb.append("현재 사용자 조직코드: ").append(StringUtil.nvl(userOrgCd)).append("\n"); - sb.append("판정근거: DAYCNT가 115일 초과이고, "); - sb.append("검사종료일+115일 기준 사용본거지법정동코드 앞 4자리가 현재 사용자 조직코드 앞 4자리와 불일치하여 이첩 대상임"); - return truncateToMaxLength(sb.toString()); + sb.append("DAYCNT: ").append(StringUtil.nvl(daycnt)).append("일 (115일 초과)\n"); + sb.append("부과기준일 계산: 검사종료일자 + 115일 = ").append(DateUtil.formatDateString( + DateUtil.parseDate(inspEndYmd).plusDays(115).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 부과기준일(검사종료일자+115일)(").append(DateUtil.formatDateString( + DateUtil.parseDate(inspEndYmd).plusDays(115).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n"); + sb.append(" - 사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n\n"); + + sb.append("=== 법정동코드 비교 ===\n"); + String legalDong4 = usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 4 ? usgsrhldStdgCd.substring(0, 4) : ""; + String userOrg4 = userOrgCd != null && userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : ""; + sb.append("사용본거지법정동코드 앞 4자리: ").append(legalDong4).append("\n"); + sb.append("현재 사용자 조직코드 앞 4자리: ").append(userOrg4).append("\n"); + sb.append("코드 불일치 → 이첩 대상\n"); + sb.append("시군구코드: ").append(usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 5 ? usgsrhldStdgCd.substring(0, 5) : "").append("\n"); + sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. DAYCNT > 115일(").append(StringUtil.nvl(daycnt)).append("일)이므로 부과기준일 = 검사종료일자 + 115일\n"); + sb.append("2. 부과기준일 기준 사용본거지법정동코드 앞 4자리와 현재 사용자 조직코드 앞 4자리가 불일치\n"); + sb.append("→ 이첩 판정 - 115일 도래지 (처리상태: 03_이첩)\n"); + + return sb.toString(); } /** diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/delay_checker/OwnerLevyOver31Checker.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/delay_checker/OwnerLevyOver31Checker.java index 7ad9b7d..7863467 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/delay_checker/OwnerLevyOver31Checker.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/delay_checker/OwnerLevyOver31Checker.java @@ -213,7 +213,7 @@ public class OwnerLevyOver31Checker extends AbstractComparisonChecker { // ========== 비고 생성 ========== String rmrk = ComparisonRemarkBuilder.buildOwnerChangeRemark(targetRecord, sggNm, ownerNm); String rmrkDtl = ComparisonRemarkBuilder.buildOwnerLevyOver31RemarkDetail( - vhclno, inspYmd, step1OwnerName, targetChgYmd, step4OwnerName, daysBetween); + vhclno, inspYmd, vldPrdExpryYmd, inspEndYmd, step1OwnerName, targetChgYmd, step4OwnerName, daysBetween); // ========== DB 업데이트 ========== existingData.setCarBassMatterInqireId(step1Response.getGeneratedId()); diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/ComparisonOmRemarkBuilder.java b/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/ComparisonOmRemarkBuilder.java index a641d8c..5cc576a 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/ComparisonOmRemarkBuilder.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/ComparisonOmRemarkBuilder.java @@ -88,16 +88,48 @@ public class ComparisonOmRemarkBuilder { String levyCrtrYmd, String step1OwnerNm, String targetChgYmd, String step4OwnerNm) { StringBuilder sb = new StringBuilder(); - sb.append("[상품용 판정 - 미필]\n"); + sb.append("[상품용 판정 - 미필]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사유효기간 종료일: ").append(DateUtil.formatDateString(inspVldPrdEnd)).append("\n"); - sb.append("부과기준일자(+146일): ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n"); - sb.append("부과일자 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); - sb.append("갑부 변경일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n"); - sb.append("변경일 기준 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); - sb.append("판정근거: 부과일자 기준 소유자명에 '상품용' 포함되어 있고, "); - sb.append("갑부 상세에서 변경업무구분코드 '21'(변경등록) 레코드 확인됨"); - return truncateToMaxLength(sb.toString()); + sb.append("부과기준일자 계산: 검사유효기간 종료일 + 146일 = ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n"); + sb.append("검사유효기간 종료일 + 31일 기준일: ").append(DateUtil.formatDateString( + DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("Step1) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 부과일자(").append(DateUtil.formatDateString(levyCrtrYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → O\n\n"); + + sb.append("Step2) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 오늘일자\n"); + sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n"); + + sb.append("Step3) 자동차등록원부(갑) 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n"); + sb.append(" - 검색 조건:\n"); + sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n"); + sb.append(" · 변경일자(CHG_YMD) ≤ 검사유효기간 종료일+31일 (").append(DateUtil.formatDateString( + DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(")\n"); + sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n"); + sb.append(" - 선택된 갑부 변경일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n"); + + sb.append("Step4) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 갑부 변경일자(").append(DateUtil.formatDateString(targetChgYmd)).append(")\n"); + sb.append(" - 변경일 기준 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step4 대표소유자 회원번호 → 일치\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. 부과일자(검사유효기간 종료일+146일) 기준 소유자명에 '상품용' 포함\n"); + sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사유효기간 종료일+31일 이내에 존재\n"); + sb.append("3. 갑부 변경일자 시점의 대표소유자 회원번호와 부과일자 기준 대표소유자 회원번호가 동일\n"); + sb.append("→ 상품용 판정 (처리상태: 02_상품용)\n"); + + return sb.toString(); } /** @@ -115,16 +147,50 @@ public class ComparisonOmRemarkBuilder { String levyCrtrYmd, String step1OwnerNm, String targetChgYmd, String step4OwnerNm) { StringBuilder sb = new StringBuilder(); - sb.append("[명의이전 이전소유자 상품용 판정 - 미필]\n"); + sb.append("[명의이전 이전소유자 상품용 판정 - 미필]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사유효기간 종료일: ").append(DateUtil.formatDateString(inspVldPrdEnd)).append("\n"); - sb.append("부과기준일자(+146일): ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n"); - sb.append("부과일자 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); - sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n"); - sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); - sb.append("판정근거: 부과일자 기준 소유자명에 '상품용' 미포함이나, "); - sb.append("갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드의 이전 소유자가 '상품용'임"); - return truncateToMaxLength(sb.toString()); + sb.append("부과기준일자 계산: 검사유효기간 종료일 + 146일 = ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n"); + sb.append("검사유효기간 종료일 + 31일 기준일: ").append(DateUtil.formatDateString( + DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("Step1) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 부과일자(").append(DateUtil.formatDateString(levyCrtrYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n"); + + sb.append("Step2) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 오늘일자\n"); + sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n"); + + sb.append("Step3) 자동차등록원부(갑) 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n"); + sb.append(" - 검색 조건:\n"); + sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n"); + sb.append(" · 변경일자(CHG_YMD) > 검사유효기간 종료일+31일 (").append(DateUtil.formatDateString( + DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(")\n"); + sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n"); + sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n"); + + sb.append("Step4) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 명의이전일자-1일(").append(DateUtil.formatDateString( + DateUtil.parseDate(targetChgYmd).minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(")\n"); + sb.append(" - 명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 명의이전 전 소유자명에 '상품용' 포함 → O\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. 부과일자(검사유효기간 종료일+146일) 기준 소유자명에 '상품용' 미포함\n"); + sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사유효기간 종료일+31일 이후에 존재\n"); + sb.append("3. 명의이전일자-1일 시점의 소유자명에 '상품용' 포함\n"); + sb.append("→ 명의이전 이전소유자 상품용 판정 (처리상태: 01_접수)\n"); + + return sb.toString(); } /** @@ -142,16 +208,52 @@ public class ComparisonOmRemarkBuilder { String levyCrtrYmd, String step1OwnerNm, String targetChgYmd, String step4OwnerNm) { StringBuilder sb = new StringBuilder(); - sb.append("[미수검명의이전 판정 - 미필]\n"); + sb.append("[미수검명의이전 판정 - 미필]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사유효기간 종료일: ").append(DateUtil.formatDateString(inspVldPrdEnd)).append("\n"); - sb.append("부과기준일자(+146일): ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n"); - sb.append("부과일자 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); - sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n"); - sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); - sb.append("판정근거: 부과일자 기준 소유자와 명의이전 전 소유자가 동일하고, "); - sb.append("명의이전이 검사유효기간 종료일 이후에 발생함 (미수검 상태에서 명의이전)"); - return truncateToMaxLength(sb.toString()); + sb.append("부과기준일자 계산: 검사유효기간 종료일 + 146일 = ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n"); + sb.append("검사유효기간 종료일 + 31일 기준일: ").append(DateUtil.formatDateString( + DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("Step1) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 부과일자(").append(DateUtil.formatDateString(levyCrtrYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n"); + + sb.append("Step2) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 오늘일자\n"); + sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n"); + + sb.append("Step3) 자동차등록원부(갑) 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n"); + sb.append(" - 검색 조건:\n"); + sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n"); + sb.append(" · 변경일자(CHG_YMD) > 검사유효기간 종료일+31일 (").append(DateUtil.formatDateString( + DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(")\n"); + sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n"); + sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n"); + + sb.append("Step4) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 명의이전일자-1일(").append(DateUtil.formatDateString( + DateUtil.parseDate(targetChgYmd).minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(")\n"); + sb.append(" - 명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n"); + sb.append(" - 조건 확인: 부과일자 기준 소유자 = 명의이전 전 소유자 → 동일\n"); + sb.append(" - 명의이전 전 소유자명에 '상품용' 포함 → X\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. 부과일자(검사유효기간 종료일+146일) 기준 소유자명에 '상품용' 미포함\n"); + sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사유효기간 종료일+31일 이후에 존재\n"); + sb.append("3. 명의이전 전 소유자명과 부과일자 기준 소유자명이 동일 (미수검 상태에서 명의이전 발생)\n"); + sb.append("4. 명의이전 전 소유자명에 '상품용' 미포함\n"); + sb.append("→ 미수검명의이전 판정 (처리상태: 01_접수)\n"); + + return sb.toString(); } /** @@ -170,17 +272,49 @@ public class ComparisonOmRemarkBuilder { String levyCrtrYmd, String ownerNm, String usgsrhldStdgCd, String sggNm, String userOrgCd) { StringBuilder sb = new StringBuilder(); - sb.append("[이첩 판정 - 미필]\n"); + sb.append("[이첩 판정 - 미필]\n\n"); + + sb.append("=== 기본 정보 ===\n"); sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n"); sb.append("검사유효기간 종료일: ").append(DateUtil.formatDateString(inspVldPrdEnd)).append("\n"); - sb.append("부과기준일자(+146일): ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n"); - sb.append("소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n"); - sb.append("사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n"); - sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n"); - sb.append("현재 사용자 조직코드: ").append(StringUtil.nvl(userOrgCd)).append("\n"); - sb.append("판정근거: 부과기준일자 기준 사용본거지법정동코드 앞 4자리가 "); - sb.append("현재 사용자 조직코드 앞 4자리와 불일치하여 이첩 대상임"); - return truncateToMaxLength(sb.toString()); + sb.append("부과기준일자 계산: 검사유효기간 종료일 + 146일 = ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n"); + sb.append("검사유효기간 종료일 - 90일: ").append(DateUtil.formatDateString( + DateUtil.parseDate(inspVldPrdEnd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append("\n\n"); + + sb.append("=== API 호출 및 비교 과정 ===\n"); + sb.append("Step1) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차량번호 + 부과일자(").append(DateUtil.formatDateString(levyCrtrYmd)).append(")\n"); + sb.append(" - 소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n"); + sb.append(" - 사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n"); + sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n"); + + sb.append("Step2) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 검사유효기간 종료일-90일(").append(DateUtil.formatDateString( + DateUtil.parseDate(inspVldPrdEnd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")) + )).append(")\n"); + sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step2 대표소유자 회원번호 → 동일\n\n"); + + sb.append("Step3) 자동차기본정보 조회\n"); + sb.append(" - 조회 기준: 차대번호 + 오늘일자\n"); + sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step3 대표소유자 회원번호 → 동일\n\n"); + + sb.append("=== 법정동코드 비교 ===\n"); + String legalDong4 = usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 4 ? usgsrhldStdgCd.substring(0, 4) : ""; + String userOrg4 = userOrgCd != null && userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : ""; + sb.append("사용본거지법정동코드 앞 4자리: ").append(legalDong4).append("\n"); + sb.append("현재 사용자 조직코드 앞 4자리: ").append(userOrg4).append("\n"); + sb.append("코드 불일치 → 이첩 대상\n"); + sb.append("시군구코드: ").append(usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 5 ? usgsrhldStdgCd.substring(0, 5) : "").append("\n"); + sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n\n"); + + sb.append("=== 판정 근거 ===\n"); + sb.append("1. 부과일자(검사유효기간 종료일+146일) 기준 소유자명에 '상품용' 미포함\n"); + sb.append("2. 부과일자/검사유효기간 종료일-90일/오늘일자 세 시점의 대표소유자 회원번호 모두 동일 (소유자 변동 없음)\n"); + sb.append("3. 사용본거지법정동코드 앞 4자리와 현재 사용자 조직코드 앞 4자리가 불일치\n"); + sb.append("→ 이첩 판정 (처리상태: 03_이첩, 115일 도래지)\n"); + + return sb.toString(); } /**