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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -14,11 +14,14 @@
|
||||
<result property="email" column="email"/>
|
||||
<result property="bankCode" column="bank_code"/>
|
||||
<result property="accountNo" column="account_no" typeHandler="com.ga.common.mybatis.EncryptTypeHandler"/>
|
||||
<result property="status" column="status"/>
|
||||
<result property="joinDate" column="join_date"/>
|
||||
<result property="leaveDate" column="leave_date"/>
|
||||
<result property="createdAt" column="created_at"/>
|
||||
<result property="updatedAt" column="updated_at"/>
|
||||
<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>
|
||||
|
||||
<resultMap id="AgentRespMap" type="com.ga.core.vo.org.AgentResp"/>
|
||||
@@ -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>
|
||||
|
||||
@@ -12,10 +12,14 @@
|
||||
<result property="accountNo" column="account_no" typeHandler="com.ga.common.mybatis.EncryptTypeHandler"/>
|
||||
<result property="payDate" column="pay_date"/>
|
||||
<result property="payStatus" column="pay_status"/>
|
||||
<result property="transferFileId" column="transfer_file_id"/>
|
||||
<result property="failReason" column="fail_reason"/>
|
||||
<result property="createdAt" column="created_at"/>
|
||||
<result property="updatedAt" column="updated_at"/>
|
||||
<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>
|
||||
|
||||
<resultMap id="RespMap" type="com.ga.core.vo.settle.PaymentResp"/>
|
||||
|
||||
Reference in New Issue
Block a user