Fix manual salary top-up settlement

This commit is contained in:
hy001 2026-05-25 14:23:17 +08:00
parent 7e70b3809c
commit f837d75d42
2 changed files with 113 additions and 9 deletions

View File

@ -134,7 +134,8 @@ public class TeamManualSalaryPaymentClientServiceImpl implements
billBelong, row.getSysOrigin());
for (PolicyPayment policyPayment : row.getPayments()) {
if (Boolean.TRUE.equals(teamSalaryPaymentService.checkRepeatPayment(payment.getId(),
if (policyPayment.getSalary().compareTo(BigDecimal.ZERO) <= 0
&& Boolean.TRUE.equals(teamSalaryPaymentService.checkRepeatPayment(payment.getId(),
row.getUserId(), row.getRegion(), policyPayment.getLevel(),
policyPayment.getAnchor()))) {
continue;
@ -501,32 +502,32 @@ public class TeamManualSalaryPaymentClientServiceImpl implements
.setScale(2, RoundingMode.DOWN);
BigDecimal agentMissing = agentExpected.subtract(paymentSummary.getAgentIssuedSalary())
.setScale(2, RoundingMode.DOWN);
boolean memberSettled = isRoleSettled(cyclePayments, userId, region, billTarget.getLevel(),
Boolean.TRUE, memberExpected);
boolean agentSettled = isRoleSettled(cyclePayments, userId, region, billTarget.getLevel(),
Boolean.FALSE, agentExpected);
boolean memberHasSettlementRecord = hasPaidPolicy(cyclePayments, userId, region,
billTarget.getLevel(), Boolean.TRUE);
boolean agentHasSettlementRecord = hasPaidPolicy(cyclePayments, userId, region,
billTarget.getLevel(), Boolean.FALSE);
List<PolicyPayment> payments = new ArrayList<>();
if (remainingPayable.compareTo(BigDecimal.ZERO) <= 0) {
if (!memberSettled && memberExpected.compareTo(BigDecimal.ZERO) > 0) {
if (!memberHasSettlementRecord && memberExpected.compareTo(BigDecimal.ZERO) > 0) {
payments.add(new PolicyPayment(policy, billTarget.getLevel(),
BigDecimal.ZERO.setScale(2, RoundingMode.DOWN), Boolean.TRUE));
}
if (!agentSettled && agentExpected.compareTo(BigDecimal.ZERO) > 0) {
if (!agentHasSettlementRecord && agentExpected.compareTo(BigDecimal.ZERO) > 0) {
payments.add(new PolicyPayment(policy, billTarget.getLevel(),
BigDecimal.ZERO.setScale(2, RoundingMode.DOWN), Boolean.FALSE));
}
return payments;
}
if (!memberSettled && memberMissing.compareTo(BigDecimal.ZERO) > 0) {
if (memberMissing.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal issueSalary = memberMissing.min(remainingPayable).setScale(2, RoundingMode.DOWN);
if (issueSalary.compareTo(BigDecimal.ZERO) > 0) {
payments.add(new PolicyPayment(policy, billTarget.getLevel(), issueSalary, Boolean.TRUE));
remainingPayable = remainingPayable.subtract(issueSalary).setScale(2, RoundingMode.DOWN);
}
}
if (!agentSettled && agentMissing.compareTo(BigDecimal.ZERO) > 0
if (agentMissing.compareTo(BigDecimal.ZERO) > 0
&& remainingPayable.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal issueSalary = agentMissing.min(remainingPayable).setScale(2, RoundingMode.DOWN);
if (issueSalary.compareTo(BigDecimal.ZERO) > 0) {

View File

@ -0,0 +1,103 @@
package com.red.circle.other.app.inner.service.team.impl;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.red.circle.other.infra.database.mongo.dto.team.TeamBillMemberTarget;
import com.red.circle.other.infra.database.mongo.dto.team.TeamSalaryPaymentDetails;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamSalaryPayment;
import java.lang.reflect.Constructor;
import java.math.BigDecimal;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
class TeamManualSalaryPaymentClientServiceImplTest {
@Test
void buildSettlementPaymentsShouldTopUpWhenCurrentLevelRecordExistsButSalaryIsInsufficient()
throws Exception {
TeamManualSalaryPaymentClientServiceImpl service =
new TeamManualSalaryPaymentClientServiceImpl(
null, null, null, null, null, null, null, null);
Long userId = 2054591808909930498L;
String region = "2046067717605224449";
TeamBillMemberTarget billTarget = new TeamBillMemberTarget()
.setLevel(6)
.setMemberSalary(new BigDecimal("35.00"))
.setOwnSalary(new BigDecimal("8.75"));
TeamSalaryPayment currentPayment = new TeamSalaryPayment()
.setSalarySendDetails(List.of(new TeamSalaryPaymentDetails()
.setTeamMemberId(userId)
.setTeamRegionId(region)
.setPolicyLevel(6)
.setAnchor(Boolean.TRUE)
.setSalary(new BigDecimal("3.00"))
.setRecycled(Boolean.FALSE)));
Object paymentSummary = paymentSummary(
new BigDecimal("31.50"),
new BigDecimal("22.00"),
new BigDecimal("9.50"));
List<?> payments = ReflectionTestUtils.invokeMethod(service, "buildSettlementPayments",
null, billTarget, List.of(currentPayment), userId, region, paymentSummary,
new BigDecimal("12.25"), false);
assertEquals(1, payments.size());
Object payment = payments.get(0);
assertEquals(6, ReflectionTestUtils.getField(payment, "level"));
assertEquals(Boolean.TRUE, ReflectionTestUtils.getField(payment, "anchor"));
assertEquals(new BigDecimal("12.25"), ReflectionTestUtils.getField(payment, "salary"));
}
@Test
void buildSettlementPaymentsShouldSettleZeroWhenPayableSalaryIsNegative() throws Exception {
TeamManualSalaryPaymentClientServiceImpl service =
new TeamManualSalaryPaymentClientServiceImpl(
null, null, null, null, null, null, null, null);
Long userId = 1008071L;
String region = "2046067717605224449";
TeamBillMemberTarget billTarget = new TeamBillMemberTarget()
.setLevel(6)
.setMemberSalary(new BigDecimal("35.00"))
.setOwnSalary(new BigDecimal("8.75"));
Object paymentSummary = paymentSummary(
new BigDecimal("45.00"),
new BigDecimal("36.00"),
new BigDecimal("9.00"));
List<?> payments = ReflectionTestUtils.invokeMethod(service, "buildSettlementPayments",
null, billTarget, List.of(), userId, region, paymentSummary,
new BigDecimal("-1.25"), false);
assertEquals(2, payments.size());
assertEquals(BigDecimal.ZERO.setScale(2), ReflectionTestUtils.getField(payments.get(0),
"salary"));
assertEquals(BigDecimal.ZERO.setScale(2), ReflectionTestUtils.getField(payments.get(1),
"salary"));
}
private Object paymentSummary(BigDecimal totalIssuedSalary, BigDecimal memberIssuedSalary,
BigDecimal agentIssuedSalary) throws Exception {
Class<?> summaryClass = Class.forName(
"com.red.circle.other.app.inner.service.team.impl."
+ "TeamManualSalaryPaymentClientServiceImpl$PaymentSummary");
Constructor<?> constructor = summaryClass.getDeclaredConstructor(
BigDecimal.class,
BigDecimal.class,
BigDecimal.class,
BigDecimal.class,
BigDecimal.class,
BigDecimal.class);
constructor.setAccessible(true);
return constructor.newInstance(
totalIssuedSalary,
memberIssuedSalary,
agentIssuedSalary,
BigDecimal.ZERO.setScale(2),
BigDecimal.ZERO.setScale(2),
BigDecimal.ZERO.setScale(2));
}
}