fix: preserve issuance request number and denominations

agent/payment-training-progress
chenyuan 4 weeks ago
parent 432081d8ce
commit 4739757d61

@ -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<DenominationItem> 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);

@ -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 {

@ -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"),

@ -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);
}
}

Loading…
Cancel
Save