diff --git a/ga-core/src/main/java/com/ga/core/mapper/settle/CommissionStatementMapper.java b/ga-core/src/main/java/com/ga/core/mapper/settle/CommissionStatementMapper.java new file mode 100644 index 0000000..7e5ddcd --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/mapper/settle/CommissionStatementMapper.java @@ -0,0 +1,30 @@ +package com.ga.core.mapper.settle; + +import com.ga.core.vo.settle.CommissionStatementResp; +import com.ga.core.vo.settle.CommissionStatementSearchParam; +import com.ga.core.vo.settle.CommissionStatementVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface CommissionStatementMapper { + + List selectList(CommissionStatementSearchParam param); + + CommissionStatementResp selectDetailById(@Param("statementId") Long statementId); + + CommissionStatementVO selectById(@Param("statementId") Long statementId); + + /** UNIQUE(agent_id, settle_month, statement_type) 조회 — 재발급 판단용 */ + CommissionStatementVO selectByAgentMonth(@Param("agentId") Long agentId, + @Param("settleMonth") String settleMonth, + @Param("statementType") String statementType); + + int insert(CommissionStatementVO vo); + + int update(CommissionStatementVO vo); + + int updateStatus(@Param("statementId") Long statementId, @Param("issueStatus") String issueStatus); +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementResp.java b/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementResp.java new file mode 100644 index 0000000..3e5aad8 --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementResp.java @@ -0,0 +1,30 @@ +package com.ga.core.vo.settle; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class CommissionStatementResp { + private Long statementId; + private Long agentId; + private String agentName; + private String settleMonth; + private String statementType; + private String statementTypeName; + + private BigDecimal grossAmount; + private BigDecimal incomeTaxAmount; + private BigDecimal localTaxAmount; + private BigDecimal vatAmount; + private BigDecimal deductionAmount; + private BigDecimal netAmount; + + private LocalDateTime issuedAt; + private String issuedBy; + private String filePath; + private String fileFormat; + private String issueStatus; + private String issueStatusName; +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementSaveReq.java b/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementSaveReq.java new file mode 100644 index 0000000..deee682 --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementSaveReq.java @@ -0,0 +1,23 @@ +package com.ga.core.vo.settle; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Data +public class CommissionStatementSaveReq { + + @NotNull(message = "설계사 ID는 필수입니다") + private Long agentId; + + @NotBlank(message = "정산월은 필수입니다") + @Size(min = 6, max = 6, message = "정산월은 6자리(YYYYMM)입니다") + private String settleMonth; + + @NotBlank(message = "명세서 유형은 필수입니다") + private String statementType; + + @Size(max = 10) + private String fileFormat; +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementSearchParam.java b/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementSearchParam.java new file mode 100644 index 0000000..6f0a6dd --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementSearchParam.java @@ -0,0 +1,16 @@ +package com.ga.core.vo.settle; + +import com.ga.common.model.SearchParam; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class CommissionStatementSearchParam extends SearchParam { + private Long agentId; + private String settleMonth; + private String statementType; + private String issueStatus; + private String fromDate; + private String toDate; +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementVO.java b/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementVO.java new file mode 100644 index 0000000..88d857f --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/CommissionStatementVO.java @@ -0,0 +1,35 @@ +package com.ga.core.vo.settle; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class CommissionStatementVO { + private Long statementId; + private Long agentId; + private String settleMonth; + private String statementType; + + // 발급 시점 스냅샷 (동결값) + private BigDecimal grossAmount; + private BigDecimal incomeTaxAmount; + private BigDecimal localTaxAmount; + private BigDecimal vatAmount; + private BigDecimal deductionAmount; + private BigDecimal netAmount; + + // 발급 정보 + private LocalDateTime issuedAt; + private String issuedBy; + private String filePath; + private String fileFormat; + private String issueStatus; + + // 감사 4종 + 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/StatementStatus.java b/ga-core/src/main/java/com/ga/core/vo/settle/StatementStatus.java new file mode 100644 index 0000000..10b5ef5 --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/StatementStatus.java @@ -0,0 +1,7 @@ +package com.ga.core.vo.settle; + +public enum StatementStatus { + GENERATED, SENT, DOWNLOADED, CANCELLED; + + public String code() { return this.name(); } +} diff --git a/ga-core/src/main/java/com/ga/core/vo/settle/StatementType.java b/ga-core/src/main/java/com/ga/core/vo/settle/StatementType.java new file mode 100644 index 0000000..fa2f46f --- /dev/null +++ b/ga-core/src/main/java/com/ga/core/vo/settle/StatementType.java @@ -0,0 +1,7 @@ +package com.ga.core.vo.settle; + +public enum StatementType { + MONTHLY, ANNUAL, PROOF; + + public String code() { return this.name(); } +} diff --git a/ga-core/src/main/resources/mapper/settle/CommissionStatementMapper.xml b/ga-core/src/main/resources/mapper/settle/CommissionStatementMapper.xml new file mode 100644 index 0000000..7a155f0 --- /dev/null +++ b/ga-core/src/main/resources/mapper/settle/CommissionStatementMapper.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s.statement_id, + s.agent_id, + a.agent_name, + s.settle_month, + s.statement_type, + (SELECT cc.code_name FROM common_code cc + WHERE cc.group_code = 'STATEMENT_TYPE' AND cc.code = s.statement_type) AS statement_type_name, + s.gross_amount, + s.income_tax_amount, + s.local_tax_amount, + s.vat_amount, + s.deduction_amount, + s.net_amount, + s.issued_at, + s.issued_by, + s.file_path, + s.file_format, + s.issue_status, + (SELECT cc.code_name FROM common_code cc + WHERE cc.group_code = 'STATEMENT_STATUS' AND cc.code = s.issue_status) AS issue_status_name + + + + + + + + + + + + + + + + + + + + INSERT INTO commission_statement ( + agent_id, settle_month, statement_type, + gross_amount, income_tax_amount, local_tax_amount, + vat_amount, deduction_amount, net_amount, + issued_at, issued_by, file_path, file_format, issue_status, + created_at, created_by + ) VALUES ( + #{agentId}, #{settleMonth}, #{statementType}, + #{grossAmount}, #{incomeTaxAmount}, #{localTaxAmount}, + COALESCE(#{vatAmount}, 0), COALESCE(#{deductionAmount}, 0), #{netAmount}, + #{issuedAt}, #{issuedBy}, #{filePath}, #{fileFormat}, + COALESCE(#{issueStatus}, 'GENERATED'), + NOW(), #{createdBy} + ) + + + + + + + UPDATE commission_statement + + gross_amount = #{grossAmount}, + income_tax_amount = #{incomeTaxAmount}, + local_tax_amount = #{localTaxAmount}, + vat_amount = #{vatAmount}, + deduction_amount = #{deductionAmount}, + net_amount = #{netAmount}, + issued_at = #{issuedAt}, + issued_by = #{issuedBy}, + file_path = #{filePath}, + file_format = #{fileFormat}, + issue_status = #{issueStatus}, + updated_at = NOW(), + updated_by = #{updatedBy} + + WHERE statement_id = #{statementId} + + + + + UPDATE commission_statement + SET issue_status = #{issueStatus}, updated_at = NOW() + WHERE statement_id = #{statementId} + + +