From 4739757d61e6008ad8bac078a388b145529b4e5a Mon Sep 17 00:00:00 2001 From: chenyuan Date: Mon, 3 Aug 2026 21:53:52 +0800 Subject: [PATCH] fix: preserve issuance request number and denominations --- .../domain/model/IssuanceRequest.java | 9 ++--- .../repository/IssuanceRequestRepository.java | 1 - .../domain/model/IssuanceRequestTest.java | 4 +++ .../MybatisIssuanceRequestRepositoryTest.java | 34 +++++++++++++++++-- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/yau/digitalrmb/issuance/domain/model/IssuanceRequest.java b/src/main/java/com/yau/digitalrmb/issuance/domain/model/IssuanceRequest.java index 2c722d9..7b1d5d9 100644 --- a/src/main/java/com/yau/digitalrmb/issuance/domain/model/IssuanceRequest.java +++ b/src/main/java/com/yau/digitalrmb/issuance/domain/model/IssuanceRequest.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Locale; import java.util.Objects; import java.util.Set; @@ -41,10 +40,10 @@ public class IssuanceRequest { this.centralBankReceiveStatus = CentralBankReceiveStatus.NOT_RECEIVED; } - public static IssuanceRequest create(IssuanceApplicationId id, String bankCode, String organizationId, + public static IssuanceRequest create(IssuanceApplicationId id, String requestNo, String bankCode, String organizationId, BigDecimal totalAmount, String currency, List denominations) { - return new IssuanceRequest(id, requestNoFor(id), bankCode, organizationId, totalAmount, currency, denominations); + return new IssuanceRequest(id, requestNo, bankCode, organizationId, totalAmount, currency, denominations); } public static IssuanceRequest rehydrate(IssuanceApplicationId id, String requestNo, String bankCode, String organizationId, @@ -194,10 +193,6 @@ public class IssuanceRequest { this.denominations = Collections.unmodifiableList(copiedDenominations); } - private static String requestNoFor(IssuanceApplicationId id) { - return "ISSUE_REQ_" + id.value().toString().replace("-", "").toUpperCase(Locale.ROOT); - } - private BigDecimal normalizeAmount(BigDecimal totalAmount) { BigDecimal amount = Objects.requireNonNull(totalAmount, "totalAmount must not be null") .setScale(2, RoundingMode.UNNECESSARY); diff --git a/src/main/java/com/yau/digitalrmb/issuance/domain/repository/IssuanceRequestRepository.java b/src/main/java/com/yau/digitalrmb/issuance/domain/repository/IssuanceRequestRepository.java index dca2d31..000f93d 100644 --- a/src/main/java/com/yau/digitalrmb/issuance/domain/repository/IssuanceRequestRepository.java +++ b/src/main/java/com/yau/digitalrmb/issuance/domain/repository/IssuanceRequestRepository.java @@ -4,7 +4,6 @@ import com.yau.digitalrmb.issuance.domain.model.IssuanceApplicationId; import com.yau.digitalrmb.issuance.domain.model.IssuanceBankInventory; import com.yau.digitalrmb.issuance.domain.model.IssuanceRequest; -import java.math.BigDecimal; import java.util.Optional; public interface IssuanceRequestRepository { diff --git a/src/test/java/com/yau/digitalrmb/issuance/domain/model/IssuanceRequestTest.java b/src/test/java/com/yau/digitalrmb/issuance/domain/model/IssuanceRequestTest.java index fa4c223..2f7512f 100644 --- a/src/test/java/com/yau/digitalrmb/issuance/domain/model/IssuanceRequestTest.java +++ b/src/test/java/com/yau/digitalrmb/issuance/domain/model/IssuanceRequestTest.java @@ -16,11 +16,13 @@ class IssuanceRequestTest { private static final IssuanceApplicationId REQUEST_ID = new IssuanceApplicationId(UUID.fromString("b7f572a0-1e8d-4e3c-8e42-44b5994f0429")); + private static final String REQUEST_NO = "ISSUE_REQ_B7F572A01E8D4E3C8E4244B5994F0429"; @Test void rejectsDenominationsWhoseTotalDoesNotMatchRequestAmount() { assertThatThrownBy(() -> IssuanceRequest.create( REQUEST_ID, + REQUEST_NO, "BKCHCNBJ00001", "ORG_3A4B5C6D7E8F", new BigDecimal("50000.00"), @@ -41,6 +43,7 @@ class IssuanceRequestTest { void rejectsDuplicateDenominationsThatCannotBeStoredAsDistinctRows() { assertThatThrownBy(() -> IssuanceRequest.create( REQUEST_ID, + REQUEST_NO, "BKCHCNBJ00001", "ORG_3A4B5C6D7E8F", new BigDecimal("500.00"), @@ -162,6 +165,7 @@ class IssuanceRequestTest { private IssuanceRequest draftRequest() { return IssuanceRequest.create( REQUEST_ID, + REQUEST_NO, "BKCHCNBJ00001", "ORG_3A4B5C6D7E8F", new BigDecimal("50000.00"), diff --git a/src/test/java/com/yau/digitalrmb/issuance/infrastructure/persistence/MybatisIssuanceRequestRepositoryTest.java b/src/test/java/com/yau/digitalrmb/issuance/infrastructure/persistence/MybatisIssuanceRequestRepositoryTest.java index 51e683c..0f33f1a 100644 --- a/src/test/java/com/yau/digitalrmb/issuance/infrastructure/persistence/MybatisIssuanceRequestRepositoryTest.java +++ b/src/test/java/com/yau/digitalrmb/issuance/infrastructure/persistence/MybatisIssuanceRequestRepositoryTest.java @@ -7,6 +7,8 @@ import com.yau.digitalrmb.issuance.domain.model.IssuanceApplicationId; import com.yau.digitalrmb.issuance.domain.model.IssuanceRequest; import com.yau.digitalrmb.issuance.domain.model.IssuanceRequestStatus; import com.yau.digitalrmb.issuance.domain.repository.IssuanceRequestRepository; +import com.yau.digitalrmb.issuance.infrastructure.persistence.entity.IssuanceBankInventoryEntity; +import com.yau.digitalrmb.issuance.infrastructure.persistence.mapper.IssuanceBankInventoryMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -15,6 +17,7 @@ import org.springframework.test.context.ActiveProfiles; import java.math.BigDecimal; import java.time.Instant; import java.util.Arrays; +import java.util.Locale; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -26,6 +29,9 @@ class MybatisIssuanceRequestRepositoryTest { @Autowired private IssuanceRequestRepository repository; + @Autowired + private IssuanceBankInventoryMapper inventoryMapper; + @Test void savesAndRestoresTheRequestWithItsDenominationsAndCentralBankStatus() { IssuanceRequest sentRequest = sentRequest(); @@ -35,7 +41,7 @@ class MybatisIssuanceRequestRepositoryTest { IssuanceRequest restored = repository.findById(sentRequest.getId()) .orElseThrow(() -> new AssertionError("saved request was not restored")); - assertThat(restored.getRequestNo()).isEqualTo(sentRequest.getRequestNo()); + assertThat(restored.getRequestNo()).isEqualTo("ISSUE_REQ_123456781234123412341234567890AB"); assertThat(restored.getBankCode()).isEqualTo("BKCHCNBJ00001"); assertThat(restored.getOrganizationId()).isEqualTo("ORG_3A4B5C6D7E8F"); assertThat(restored.getTotalAmount()).isEqualByComparingTo("50000.00"); @@ -63,9 +69,25 @@ class MybatisIssuanceRequestRepositoryTest { assertThat(inventory.getSuggestedSupplementAmount()).isEqualByComparingTo("50000.00"); } + @Test + void clampsSuggestedAmountToZeroWhenBalanceExceedsThreshold() { + IssuanceBankInventoryEntity inventory = new IssuanceBankInventoryEntity(); + inventory.setBankCode("BKCLAMP00001"); + inventory.setCurrentBalance(new BigDecimal("60000000.00")); + inventory.setWarningThreshold(new BigDecimal("50000000.00")); + inventory.setUpdatedAt(java.time.LocalDateTime.now()); + inventoryMapper.insert(inventory); + + IssuanceBankInventory restored = repository.findInventoryByBankCode("BKCLAMP00001") + .orElseThrow(() -> new AssertionError("inventory was not restored")); + + assertThat(restored.getSuggestedSupplementAmount()).isEqualByComparingTo("0.00"); + } + @Test void savingChangedDraftReplacesRatherThanAccumulatesDenominations() { - IssuanceRequest request = IssuanceRequest.create(new IssuanceApplicationId(UUID.randomUUID()), + UUID id = UUID.randomUUID(); + IssuanceRequest request = IssuanceRequest.create(new IssuanceApplicationId(id), requestNo(id), "BKCHCNBJ00001", "ORG_3A4B5C6D7E8F", new BigDecimal("50000.00"), "DC", Arrays.asList(new DenominationItem(100, 400), new DenominationItem(50, 200))); repository.save(request); @@ -79,7 +101,9 @@ class MybatisIssuanceRequestRepositoryTest { } private IssuanceRequest sentRequest() { - IssuanceRequest request = IssuanceRequest.create(new IssuanceApplicationId(UUID.randomUUID()), + UUID id = UUID.fromString("12345678-1234-1234-1234-1234567890ab"); + IssuanceRequest request = IssuanceRequest.create(new IssuanceApplicationId(id), + "ISSUE_REQ_123456781234123412341234567890AB", "BKCHCNBJ00001", "ORG_3A4B5C6D7E8F", new BigDecimal("50000.00"), "DC", Arrays.asList(new DenominationItem(100, 400), new DenominationItem(50, 200))); request.prepareMessage("20260801103218", "ISSUE|BKCHCNBJ00001|ORG_3A4B5C6D7E8F|50000.00"); @@ -89,4 +113,8 @@ class MybatisIssuanceRequestRepositoryTest { request.sendToCentralBank(Instant.parse("2026-08-03T12:00:00Z")); return request; } + + private String requestNo(UUID id) { + return "ISSUE_REQ_" + id.toString().replace("-", "").toUpperCase(Locale.ROOT); + } }