diff --git a/ga-core/src/main/java/com/ga/core/mapper/settle/AgentDeductionMapper.java b/ga-core/src/main/java/com/ga/core/mapper/settle/AgentDeductionMapper.java new file mode 100644 index 0000000..3891c5a --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/mapper/settle/AgentDeductionMapper.java @@ -0,0 +1,28 @@ +package com.ga.core.mapper.settle; + +import com.ga.core.vo.settle.AgentDeductionResp; +import com.ga.core.vo.settle.AgentDeductionSearchParam; +import com.ga.core.vo.settle.AgentDeductionVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +@Mapper +public interface AgentDeductionMapper { + List selectList(AgentDeductionSearchParam param); + AgentDeductionResp selectDetailById(@Param("deductionId") Long deductionId); + AgentDeductionVO selectById(@Param("deductionId") Long deductionId); + + int insert(AgentDeductionVO vo); + int update(AgentDeductionVO vo); + int updateStatus(@Param("deductionId") Long deductionId, @Param("status") String status); + + /** 정산월 + 설계사의 PENDING 차감 합계 */ + BigDecimal sumPendingByAgent(@Param("agentId") Long agentId, + @Param("settleMonth") String settleMonth); + + /** 정산월 전체 PENDING 목록 (배치용) */ + List selectPendingByMonth(@Param("settleMonth") String settleMonth); +} diff --git a/ga-core/src/main/java/com/ga/core/mapper/settle/PaymentDeductionDetailMapper.java b/ga-core/src/main/java/com/ga/core/mapper/settle/PaymentDeductionDetailMapper.java new file mode 100644 index 0000000..dfc2adc --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/mapper/settle/PaymentDeductionDetailMapper.java @@ -0,0 +1,14 @@ +package com.ga.core.mapper.settle; + +import com.ga.core.vo.settle.PaymentDeductionDetailVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface PaymentDeductionDetailMapper { + List selectByPaymentId(@Param("paymentId") Long paymentId); + int insert(PaymentDeductionDetailVO vo); + int insertBatch(@Param("list") List list); +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionResp.java b/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionResp.java new file mode 100644 index 0000000..c9b2b8e --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionResp.java @@ -0,0 +1,21 @@ +package com.ga.core.vo.settle; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class AgentDeductionResp { + private Long deductionId; + private Long agentId; + private String agentName; + private String settleMonth; + private String deductionType; + private String deductionTypeName; + private BigDecimal amount; + private String description; + private String status; + private String statusName; + private LocalDateTime createdAt; +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionSaveReq.java b/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionSaveReq.java new file mode 100644 index 0000000..d4c42b0 --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionSaveReq.java @@ -0,0 +1,30 @@ +package com.ga.core.vo.settle; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.Size; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class AgentDeductionSaveReq { + + @NotNull(message = "설계사 ID는 필수입니다") + private Long agentId; + + @NotBlank(message = "정산월은 필수입니다") + @Size(min = 6, max = 6, message = "정산월은 6자리(YYYYMM)입니다") + private String settleMonth; + + @NotBlank(message = "차감유형은 필수입니다") + private String deductionType; + + @NotNull(message = "차감금액은 필수입니다") + @Positive(message = "차감금액은 양수여야 합니다") + private BigDecimal amount; + + @Size(max = 255) + private String description; +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionSearchParam.java b/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionSearchParam.java new file mode 100644 index 0000000..852420e --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionSearchParam.java @@ -0,0 +1,14 @@ +package com.ga.core.vo.settle; + +import com.ga.common.model.SearchParam; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class AgentDeductionSearchParam extends SearchParam { + private Long agentId; + private String settleMonth; + private String deductionType; + private String status; +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionVO.java b/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionVO.java new file mode 100644 index 0000000..1a0fcd1 --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/AgentDeductionVO.java @@ -0,0 +1,21 @@ +package com.ga.core.vo.settle; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class AgentDeductionVO { + private Long deductionId; + private Long agentId; + private String settleMonth; + private String deductionType; // DeductionType + private BigDecimal amount; + private String description; + private String status; // DeductionStatus + private LocalDateTime createdAt; + private Long createdBy; + private LocalDateTime updatedAt; + private Long updatedBy; +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/DeductionStatus.java b/ga-core/src/main/java/com/ga/core/vo/settle/DeductionStatus.java new file mode 100644 index 0000000..5f3f77e --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/DeductionStatus.java @@ -0,0 +1,15 @@ +package com.ga.core.vo.settle; + +/** + * 차감 상태 (common_code_group: DEDUCTION_STATUS, V24 기준) + * DB agent_deduction.status: PENDING / APPLIED / CANCELLED + */ +public enum DeductionStatus { + PENDING, // 대기 — 차감 등록 후 미적용 + APPLIED, // 적용됨 — 이체 시 차감 완료 + CANCELLED; // 취소 + + public String code() { + return this.name(); + } +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/DeductionType.java b/ga-core/src/main/java/com/ga/core/vo/settle/DeductionType.java new file mode 100644 index 0000000..2a42fd2 --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/DeductionType.java @@ -0,0 +1,18 @@ +package com.ga.core.vo.settle; + +/** + * 차감 유형 (common_code_group: DEDUCTION_TYPE, V24 기준) + */ +public enum DeductionType { + LOAN, // 대출잔액 + ADVANCE, // 가불금 + GUARANTEE, // 신원보증보험료 + DUES, // 협회비 + AD, // 광고비/판촉비 + CHARGEBACK_PENDING, // 미회수환수금 + OTHER; // 기타 + + public String code() { + return this.name(); + } +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/PaymentDeductionDetailVO.java b/ga-core/src/main/java/com/ga/core/vo/settle/PaymentDeductionDetailVO.java new file mode 100644 index 0000000..0e16b0d --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/PaymentDeductionDetailVO.java @@ -0,0 +1,16 @@ +package com.ga.core.vo.settle; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class PaymentDeductionDetailVO { + private Long detailId; + private Long paymentId; + private String deductionType; // DeductionType + private BigDecimal amount; + private String description; + private LocalDateTime appliedAt; +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/PaymentVO.java b/ga-core/src/main/java/com/ga/core/vo/settle/PaymentVO.java index 2a780e9..a82b599 100644 --- a/ga-core/src/main/java/com/ga/core/vo/settle/PaymentVO.java +++ b/ga-core/src/main/java/com/ga/core/vo/settle/PaymentVO.java @@ -22,6 +22,7 @@ public class PaymentVO { private BigDecimal localTaxAmount; // 지방소득세 private BigDecimal vatAmount; // 부가세 private BigDecimal netAmount; // 실수령액 (payAmount - 세금 합계) + private BigDecimal deductionAmount; // 공제 합계 private LocalDateTime createdAt; private LocalDateTime updatedAt; } diff --git a/ga-core/src/main/resources/mapper/settle/AgentDeductionMapper.xml b/ga-core/src/main/resources/mapper/settle/AgentDeductionMapper.xml new file mode 100644 index 0000000..05389ef --- /dev/null +++ b/ga-core/src/main/resources/mapper/settle/AgentDeductionMapper.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + d.deduction_id, + d.agent_id, + a.agent_name, + d.settle_month, + d.deduction_type, + (SELECT cc.code_name FROM common_code cc + WHERE cc.group_code = 'DEDUCTION_TYPE' AND cc.code = d.deduction_type) AS deduction_type_name, + d.amount, + d.description, + d.status, + (SELECT cc.code_name FROM common_code cc + WHERE cc.group_code = 'DEDUCTION_STATUS' AND cc.code = d.status) AS status_name, + d.created_at + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO agent_deduction (agent_id, settle_month, deduction_type, + amount, description, status, + created_at, created_by) + VALUES (#{agentId}, #{settleMonth}, #{deductionType}, + #{amount}, #{description}, COALESCE(#{status}, 'PENDING'), + NOW(), #{createdBy}) + + + + + + UPDATE agent_deduction + + deduction_type = #{deductionType}, + amount = #{amount}, + description = #{description}, + updated_at = NOW(), + updated_by = #{updatedBy} + + WHERE deduction_id = #{deductionId} + + + + + UPDATE agent_deduction + SET status = #{status}, updated_at = NOW() + WHERE deduction_id = #{deductionId} + + + diff --git a/ga-core/src/main/resources/mapper/settle/PaymentDeductionDetailMapper.xml b/ga-core/src/main/resources/mapper/settle/PaymentDeductionDetailMapper.xml new file mode 100644 index 0000000..0e92874 --- /dev/null +++ b/ga-core/src/main/resources/mapper/settle/PaymentDeductionDetailMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO payment_deduction_detail (payment_id, deduction_type, + amount, description, applied_at) + VALUES (#{paymentId}, #{deductionType}, + #{amount}, #{description}, COALESCE(#{appliedAt}, NOW())) + + + + + INSERT INTO payment_deduction_detail (payment_id, deduction_type, + amount, description, applied_at) + VALUES + + (#{d.paymentId}, #{d.deductionType}, + #{d.amount}, #{d.description}, COALESCE(#{d.appliedAt}, NOW())) + + + + diff --git a/ga-core/src/main/resources/mapper/settle/PaymentMapper.xml b/ga-core/src/main/resources/mapper/settle/PaymentMapper.xml index 0cac3e1..05e3d4a 100644 --- a/ga-core/src/main/resources/mapper/settle/PaymentMapper.xml +++ b/ga-core/src/main/resources/mapper/settle/PaymentMapper.xml @@ -18,6 +18,7 @@ +