Fix manual salary top-up settlement
This commit is contained in:
parent
7e70b3809c
commit
f837d75d42
@ -134,7 +134,8 @@ public class TeamManualSalaryPaymentClientServiceImpl implements
|
|||||||
billBelong, row.getSysOrigin());
|
billBelong, row.getSysOrigin());
|
||||||
|
|
||||||
for (PolicyPayment policyPayment : row.getPayments()) {
|
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(),
|
row.getUserId(), row.getRegion(), policyPayment.getLevel(),
|
||||||
policyPayment.getAnchor()))) {
|
policyPayment.getAnchor()))) {
|
||||||
continue;
|
continue;
|
||||||
@ -501,32 +502,32 @@ public class TeamManualSalaryPaymentClientServiceImpl implements
|
|||||||
.setScale(2, RoundingMode.DOWN);
|
.setScale(2, RoundingMode.DOWN);
|
||||||
BigDecimal agentMissing = agentExpected.subtract(paymentSummary.getAgentIssuedSalary())
|
BigDecimal agentMissing = agentExpected.subtract(paymentSummary.getAgentIssuedSalary())
|
||||||
.setScale(2, RoundingMode.DOWN);
|
.setScale(2, RoundingMode.DOWN);
|
||||||
boolean memberSettled = isRoleSettled(cyclePayments, userId, region, billTarget.getLevel(),
|
boolean memberHasSettlementRecord = hasPaidPolicy(cyclePayments, userId, region,
|
||||||
Boolean.TRUE, memberExpected);
|
billTarget.getLevel(), Boolean.TRUE);
|
||||||
boolean agentSettled = isRoleSettled(cyclePayments, userId, region, billTarget.getLevel(),
|
boolean agentHasSettlementRecord = hasPaidPolicy(cyclePayments, userId, region,
|
||||||
Boolean.FALSE, agentExpected);
|
billTarget.getLevel(), Boolean.FALSE);
|
||||||
|
|
||||||
List<PolicyPayment> payments = new ArrayList<>();
|
List<PolicyPayment> payments = new ArrayList<>();
|
||||||
if (remainingPayable.compareTo(BigDecimal.ZERO) <= 0) {
|
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(),
|
payments.add(new PolicyPayment(policy, billTarget.getLevel(),
|
||||||
BigDecimal.ZERO.setScale(2, RoundingMode.DOWN), Boolean.TRUE));
|
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(),
|
payments.add(new PolicyPayment(policy, billTarget.getLevel(),
|
||||||
BigDecimal.ZERO.setScale(2, RoundingMode.DOWN), Boolean.FALSE));
|
BigDecimal.ZERO.setScale(2, RoundingMode.DOWN), Boolean.FALSE));
|
||||||
}
|
}
|
||||||
return payments;
|
return payments;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!memberSettled && memberMissing.compareTo(BigDecimal.ZERO) > 0) {
|
if (memberMissing.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
BigDecimal issueSalary = memberMissing.min(remainingPayable).setScale(2, RoundingMode.DOWN);
|
BigDecimal issueSalary = memberMissing.min(remainingPayable).setScale(2, RoundingMode.DOWN);
|
||||||
if (issueSalary.compareTo(BigDecimal.ZERO) > 0) {
|
if (issueSalary.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
payments.add(new PolicyPayment(policy, billTarget.getLevel(), issueSalary, Boolean.TRUE));
|
payments.add(new PolicyPayment(policy, billTarget.getLevel(), issueSalary, Boolean.TRUE));
|
||||||
remainingPayable = remainingPayable.subtract(issueSalary).setScale(2, RoundingMode.DOWN);
|
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) {
|
&& remainingPayable.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
BigDecimal issueSalary = agentMissing.min(remainingPayable).setScale(2, RoundingMode.DOWN);
|
BigDecimal issueSalary = agentMissing.min(remainingPayable).setScale(2, RoundingMode.DOWN);
|
||||||
if (issueSalary.compareTo(BigDecimal.ZERO) > 0) {
|
if (issueSalary.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
|
|||||||
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user