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 String gradeName;
|
||||||
private LocalDate joinDate;
|
private LocalDate joinDate;
|
||||||
private LocalDate leaveDate;
|
private LocalDate leaveDate;
|
||||||
|
private String taxType;
|
||||||
|
private String taxTypeName;
|
||||||
|
private String businessNo;
|
||||||
|
private String vatType;
|
||||||
|
private String vatTypeName;
|
||||||
private Integer contractCount;
|
private Integer contractCount;
|
||||||
private BigDecimal totalCommission;
|
private BigDecimal totalCommission;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,4 +26,13 @@ public class AgentSaveReq {
|
|||||||
private String bankCode;
|
private String bankCode;
|
||||||
private String accountNo;
|
private String accountNo;
|
||||||
private LocalDate joinDate;
|
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 String status;
|
||||||
private LocalDate joinDate;
|
private LocalDate joinDate;
|
||||||
private LocalDate leaveDate;
|
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 createdAt;
|
||||||
private LocalDateTime updatedAt;
|
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 String payStatus; // PENDING / SENT / DONE / FAIL
|
||||||
private Long transferFileId;
|
private Long transferFileId;
|
||||||
private String failReason;
|
private String failReason;
|
||||||
|
private BigDecimal incomeTaxAmount; // 원천세
|
||||||
|
private BigDecimal localTaxAmount; // 지방소득세
|
||||||
|
private BigDecimal vatAmount; // 부가세
|
||||||
|
private BigDecimal netAmount; // 실수령액 (payAmount - 세금 합계)
|
||||||
private LocalDateTime createdAt;
|
private LocalDateTime createdAt;
|
||||||
private LocalDateTime updatedAt;
|
private LocalDateTime updatedAt;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
<result property="status" column="status"/>
|
<result property="status" column="status"/>
|
||||||
<result property="joinDate" column="join_date"/>
|
<result property="joinDate" column="join_date"/>
|
||||||
<result property="leaveDate" column="leave_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="createdAt" column="created_at"/>
|
||||||
<result property="updatedAt" column="updated_at"/>
|
<result property="updatedAt" column="updated_at"/>
|
||||||
</resultMap>
|
</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,
|
(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.org_id, o.org_name,
|
||||||
a.grade_id, g.grade_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>
|
</sql>
|
||||||
|
|
||||||
<select id="selectDetailById" resultMap="AgentRespMap">
|
<select id="selectDetailById" resultMap="AgentRespMap">
|
||||||
@@ -108,12 +116,15 @@
|
|||||||
|
|
||||||
<insert id="insert" parameterType="com.ga.core.vo.org.AgentVO" useGeneratedKeys="true" keyProperty="agentId">
|
<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,
|
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},
|
VALUES (#{orgId}, #{gradeId}, #{agentName},
|
||||||
#{residentNo,typeHandler=com.ga.common.mybatis.EncryptTypeHandler},
|
#{residentNo,typeHandler=com.ga.common.mybatis.EncryptTypeHandler},
|
||||||
#{licenseNo}, #{phone}, #{email}, #{bankCode},
|
#{licenseNo}, #{phone}, #{email}, #{bankCode},
|
||||||
#{accountNo,typeHandler=com.ga.common.mybatis.EncryptTypeHandler},
|
#{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>
|
</insert>
|
||||||
|
|
||||||
<update id="update" parameterType="com.ga.core.vo.org.AgentVO">
|
<update id="update" parameterType="com.ga.core.vo.org.AgentVO">
|
||||||
@@ -130,6 +141,9 @@
|
|||||||
status = #{status},
|
status = #{status},
|
||||||
join_date = #{joinDate},
|
join_date = #{joinDate},
|
||||||
leave_date = #{leaveDate},
|
leave_date = #{leaveDate},
|
||||||
|
tax_type = #{taxType},
|
||||||
|
business_no = #{businessNo},
|
||||||
|
vat_type = #{vatType},
|
||||||
updated_at = #{updatedAt}
|
updated_at = #{updatedAt}
|
||||||
WHERE agent_id = #{agentId}
|
WHERE agent_id = #{agentId}
|
||||||
</update>
|
</update>
|
||||||
|
|||||||
@@ -14,6 +14,10 @@
|
|||||||
<result property="payStatus" column="pay_status"/>
|
<result property="payStatus" column="pay_status"/>
|
||||||
<result property="transferFileId" column="transfer_file_id"/>
|
<result property="transferFileId" column="transfer_file_id"/>
|
||||||
<result property="failReason" column="fail_reason"/>
|
<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="createdAt" column="created_at"/>
|
||||||
<result property="updatedAt" column="updated_at"/>
|
<result property="updatedAt" column="updated_at"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|||||||
Reference in New Issue
Block a user