feat(core): TaxType/VatType Enum + Agent/Payment 세무 필드 (도메인 P0-1-b)

V23 마이그레이션과 ga-core 동기화. 세금 계산 비즈니스 로직은 P0-1-c에서.

신규:
- vo/org/TaxType (BUSINESS_INCOME, OTHER_INCOME) — V23 CHECK 제약 근거
- vo/org/VatType (NONE, EXEMPT, TAXABLE) — V23 CHECK 제약 근거

AgentVO/AgentSaveReq/AgentResp 컬럼 추가:
- taxType (@NotBlank, default BUSINESS_INCOME)
- businessNo (@Size 20, 사업소득자만 필수 — 소프트 검증)
- vatType (@NotBlank, default NONE)
- AgentResp는 taxTypeName/vatTypeName 표시 필드 함께 노출

PaymentVO 컬럼 추가:
- incomeTaxAmount (원천소득세)
- localTaxAmount (지방소득세)
- vatAmount (부가세)
- netAmount (차감 후 실지급액)

Mapper XML:
- AgentMapper.xml — VOMap/agentJoinCols/insert/update 갱신, TAX_TYPE/VAT_TYPE
  코드명 스칼라 서브쿼리로 자동 매핑
- PaymentMapper.xml — VOMap에 세무 4개 컬럼 추가
This commit is contained in:
GA Pro
2026-05-12 23:56:14 +09:00
parent ad5d62ea07
commit 92f32175ad
8 changed files with 80 additions and 12 deletions
@@ -20,6 +20,11 @@ public class AgentResp {
private String gradeName;
private LocalDate joinDate;
private LocalDate leaveDate;
private String taxType;
private String taxTypeName;
private String businessNo;
private String vatType;
private String vatTypeName;
private Integer contractCount;
private BigDecimal totalCommission;
}
@@ -26,4 +26,13 @@ public class AgentSaveReq {
private String bankCode;
private String accountNo;
private LocalDate joinDate;
@NotBlank(message = "소득세 유형은 필수입니다")
private String taxType = "BUSINESS_INCOME"; // TaxType
@Size(max = 20)
private String businessNo; // 사업소득자 시 입력
@NotBlank(message = "부가세 유형은 필수입니다")
private String vatType = "NONE"; // VatType
}
@@ -20,6 +20,9 @@ public class AgentVO {
private String status;
private LocalDate joinDate;
private LocalDate leaveDate;
private String taxType; // TaxType: BUSINESS_INCOME / OTHER_INCOME
private String businessNo; // 사업자등록번호 (사업소득자)
private String vatType; // VatType: NONE / EXEMPT / TAXABLE
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
@@ -0,0 +1,14 @@
package com.ga.core.vo.org;
/**
* 소득세 유형 (common_code_group: TAX_TYPE, V23 기준)
* DB agent.tax_type CHECK: BUSINESS_INCOME / OTHER_INCOME
*/
public enum TaxType {
BUSINESS_INCOME, // 사업소득 — 원천징수 3.3%
OTHER_INCOME; // 기타소득 — 원천징수 8.8%
public String code() {
return this.name();
}
}
@@ -0,0 +1,15 @@
package com.ga.core.vo.org;
/**
* 부가세 유형 (common_code_group: VAT_TYPE, V23 기준)
* DB agent.vat_type CHECK: NONE / EXEMPT / TAXABLE
*/
public enum VatType {
NONE, // 미지정 — 부가세 처리 없음
EXEMPT, // 면세사업자 — 계산서 발행
TAXABLE; // 일반과세자 — 세금계산서 10%
public String code() {
return this.name();
}
}
@@ -18,6 +18,10 @@ public class PaymentVO {
private String payStatus; // PENDING / SENT / DONE / FAIL
private Long transferFileId;
private String failReason;
private BigDecimal incomeTaxAmount; // 원천세
private BigDecimal localTaxAmount; // 지방소득세
private BigDecimal vatAmount; // 부가세
private BigDecimal netAmount; // 실수령액 (payAmount - 세금 합계)
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
@@ -17,6 +17,9 @@
<result property="status" column="status"/>
<result property="joinDate" column="join_date"/>
<result property="leaveDate" column="leave_date"/>
<result property="taxType" column="tax_type"/>
<result property="businessNo" column="business_no"/>
<result property="vatType" column="vat_type"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
</resultMap>
@@ -32,7 +35,12 @@
(SELECT cc.code_name FROM common_code cc WHERE cc.group_code='AGENT_STATUS' AND cc.code=a.status) AS status_name,
a.org_id, o.org_name,
a.grade_id, g.grade_name,
a.join_date, a.leave_date
a.join_date, a.leave_date,
a.tax_type,
(SELECT cc.code_name FROM common_code cc WHERE cc.group_code='TAX_TYPE' AND cc.code=a.tax_type) AS tax_type_name,
a.business_no,
a.vat_type,
(SELECT cc.code_name FROM common_code cc WHERE cc.group_code='VAT_TYPE' AND cc.code=a.vat_type) AS vat_type_name
</sql>
<select id="selectDetailById" resultMap="AgentRespMap">
@@ -108,12 +116,15 @@
<insert id="insert" parameterType="com.ga.core.vo.org.AgentVO" useGeneratedKeys="true" keyProperty="agentId">
INSERT INTO agent (org_id, grade_id, agent_name, resident_no, license_no, phone, email,
bank_code, account_no, status, join_date, created_at)
bank_code, account_no, status, join_date,
tax_type, business_no, vat_type, created_at)
VALUES (#{orgId}, #{gradeId}, #{agentName},
#{residentNo,typeHandler=com.ga.common.mybatis.EncryptTypeHandler},
#{licenseNo}, #{phone}, #{email}, #{bankCode},
#{accountNo,typeHandler=com.ga.common.mybatis.EncryptTypeHandler},
COALESCE(#{status},'ACTIVE'), #{joinDate}, #{createdAt})
COALESCE(#{status},'ACTIVE'), #{joinDate},
COALESCE(#{taxType},'BUSINESS_INCOME'), #{businessNo}, COALESCE(#{vatType},'NONE'),
#{createdAt})
</insert>
<update id="update" parameterType="com.ga.core.vo.org.AgentVO">
@@ -130,6 +141,9 @@
status = #{status},
join_date = #{joinDate},
leave_date = #{leaveDate},
tax_type = #{taxType},
business_no = #{businessNo},
vat_type = #{vatType},
updated_at = #{updatedAt}
WHERE agent_id = #{agentId}
</update>
@@ -14,6 +14,10 @@
<result property="payStatus" column="pay_status"/>
<result property="transferFileId" column="transfer_file_id"/>
<result property="failReason" column="fail_reason"/>
<result property="incomeTaxAmount" column="income_tax_amount"/>
<result property="localTaxAmount" column="local_tax_amount"/>
<result property="vatAmount" column="vat_amount"/>
<result property="netAmount" column="net_amount"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
</resultMap>