Persisting segment association for charge definitions.
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/domain/ChargeDefinition.java b/api/src/main/java/io/mifos/portfolio/api/v1/domain/ChargeDefinition.java
index efa69f8..3890867 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/domain/ChargeDefinition.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/domain/ChargeDefinition.java
@@ -16,7 +16,6 @@
package io.mifos.portfolio.api.v1.domain;
import io.mifos.core.lang.validation.constraints.ValidIdentifier;
-import io.mifos.core.lang.validation.constraints.ValidIdentifiers;
import io.mifos.portfolio.api.v1.validation.ValidChargeDefinition;
import io.mifos.portfolio.api.v1.validation.ValidChargeReference;
import io.mifos.portfolio.api.v1.validation.ValidPaymentCycleUnit;
@@ -26,7 +25,6 @@
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.temporal.ChronoUnit;
-import java.util.List;
import java.util.Objects;
/**
@@ -84,8 +82,11 @@
@ValidIdentifier(optional = true)
private String forSegmentSet;
- @ValidIdentifiers(optional = true)
- private List<String> forSegments;
+ @ValidIdentifier(optional = true)
+ private String fromSegment;
+
+ @ValidIdentifier(optional = true)
+ private String toSegment;
public ChargeDefinition() {
}
@@ -203,12 +204,20 @@
this.forSegmentSet = forSegmentSet;
}
- public List<String> getForSegments() {
- return forSegments;
+ public String getFromSegment() {
+ return fromSegment;
}
- public void setForSegments(List<String> forSegments) {
- this.forSegments = forSegments;
+ public void setFromSegment(String fromSegment) {
+ this.fromSegment = fromSegment;
+ }
+
+ public String getToSegment() {
+ return toSegment;
+ }
+
+ public void setToSegment(String toSegment) {
+ this.toSegment = toSegment;
}
@Override
@@ -230,12 +239,13 @@
Objects.equals(toAccountDesignator, that.toAccountDesignator) &&
forCycleSizeUnit == that.forCycleSizeUnit &&
Objects.equals(forSegmentSet, that.forSegmentSet) &&
- Objects.equals(forSegments, that.forSegments);
+ Objects.equals(fromSegment, that.fromSegment) &&
+ Objects.equals(toSegment, that.toSegment);
}
@Override
public int hashCode() {
- return Objects.hash(identifier, name, description, accrueAction, chargeAction, amount, chargeMethod, proportionalTo, fromAccountDesignator, accrualAccountDesignator, toAccountDesignator, forCycleSizeUnit, readOnly, forSegmentSet, forSegments);
+ return Objects.hash(identifier, name, description, accrueAction, chargeAction, amount, chargeMethod, proportionalTo, fromAccountDesignator, accrualAccountDesignator, toAccountDesignator, forCycleSizeUnit, readOnly, forSegmentSet, fromSegment, toSegment);
}
@Override
@@ -255,7 +265,8 @@
", forCycleSizeUnit=" + forCycleSizeUnit +
", readOnly=" + readOnly +
", forSegmentSet='" + forSegmentSet + '\'' +
- ", forSegments=" + forSegments +
+ ", fromSegment='" + fromSegment + '\'' +
+ ", toSegment='" + toSegment + '\'' +
'}';
}
}
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidChargeDefinition.java b/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidChargeDefinition.java
index 4735798..fcdf02a 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidChargeDefinition.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidChargeDefinition.java
@@ -43,17 +43,14 @@
value.getProportionalTo() == null)
return false;
if (value.getChargeMethod() == ChargeDefinition.ChargeMethod.FIXED &&
- value.getProportionalTo() != null)
- return false;
+ value.getProportionalTo() != null &&
+ value.getForSegmentSet() == null) //Even if the charge is a fixed charge, we need a proportional to for segment sets.
+ return false;
if (value.getForSegmentSet() == null &&
- value.getForSegments() != null)
+ (value.getFromSegment() != null || value.getToSegment() != null))
return false;
if (value.getForSegmentSet() != null &&
- value.getForSegments() == null)
- return false;
- if (value.getForSegmentSet() != null &&
- value.getForSegments() != null &&
- value.getForSegments().size() == 0)
+ (value.getFromSegment() == null || value.getToSegment() == null))
return false;
return true;
diff --git a/api/src/test/java/io/mifos/portfolio/api/v1/domain/ChargeDefinitionTest.java b/api/src/test/java/io/mifos/portfolio/api/v1/domain/ChargeDefinitionTest.java
index e8df923..8f9ad7e 100644
--- a/api/src/test/java/io/mifos/portfolio/api/v1/domain/ChargeDefinitionTest.java
+++ b/api/src/test/java/io/mifos/portfolio/api/v1/domain/ChargeDefinitionTest.java
@@ -24,9 +24,7 @@
import java.math.BigDecimal;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
/**
* @author Myrle Krantz
@@ -100,11 +98,20 @@
.adjustment(x -> x.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED))
.valid(false));
ret.add(new ValidationTestCase<ChargeDefinition>("missingProportionalToIdentifierOnFixedCharge")
- .adjustment(x -> {
- x.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
- x.setProportionalTo(null);
- })
- .valid(true));
+ .adjustment(x -> {
+ x.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+ x.setProportionalTo(null);
+ })
+ .valid(true));
+ ret.add(new ValidationTestCase<ChargeDefinition>("fixed charge proportional so that segment set can be set.")
+ .adjustment(x -> {
+ x.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+ x.setProportionalTo("something");
+ x.setForSegmentSet("xyz");
+ x.setFromSegment("abc");
+ x.setToSegment("def");
+ })
+ .valid(true));
ret.add(new ValidationTestCase<ChargeDefinition>("proportionalToRunningBalance")
.adjustment(x -> x.setProportionalTo("{runningbalance}"))
.valid(true));
@@ -114,20 +121,23 @@
ret.add(new ValidationTestCase<ChargeDefinition>("segment set set but not list")
.adjustment(x -> x.setForSegmentSet("xyz"))
.valid(false));
- ret.add(new ValidationTestCase<ChargeDefinition>("segment list set but not set")
- .adjustment(x -> x.setForSegments(Arrays.asList("mno", "xyz")))
+ ret.add(new ValidationTestCase<ChargeDefinition>("from segment set but not set")
+ .adjustment(x -> x.setFromSegment("abc"))
.valid(false));
- ret.add(new ValidationTestCase<ChargeDefinition>("empty segment list")
- .adjustment(x -> { x.setForSegmentSet("xyz"); x.setForSegments(Collections.emptyList());})
+ ret.add(new ValidationTestCase<ChargeDefinition>("to segment set but not set")
+ .adjustment(x -> x.setFromSegment("def"))
.valid(false));
ret.add(new ValidationTestCase<ChargeDefinition>("valid segment references")
- .adjustment(x -> { x.setForSegmentSet("xyz"); x.setForSegments(Collections.singletonList("abc"));})
+ .adjustment(x -> { x.setForSegmentSet("xyz"); x.setFromSegment("abc"); x.setToSegment("def");})
.valid(true));
ret.add(new ValidationTestCase<ChargeDefinition>("invalid segment set identifier")
- .adjustment(x -> { x.setForSegmentSet("//"); x.setForSegments(Collections.singletonList("abc"));})
+ .adjustment(x -> { x.setForSegmentSet("//"); x.setFromSegment("abc"); x.setToSegment("def");})
.valid(false));
- ret.add(new ValidationTestCase<ChargeDefinition>("invalid segment list set identifier")
- .adjustment(x -> { x.setForSegmentSet("xyz"); x.setForSegments(Collections.singletonList("//"));})
+ ret.add(new ValidationTestCase<ChargeDefinition>("invalid from segment identifier")
+ .adjustment(x -> { x.setForSegmentSet("xyz"); x.setFromSegment("//"); x.setToSegment("def");})
+ .valid(false));
+ ret.add(new ValidationTestCase<ChargeDefinition>("invalid to segment identifier")
+ .adjustment(x -> { x.setForSegmentSet("xyz"); x.setFromSegment("abc"); x.setToSegment("//");})
.valid(false));
return ret;
}
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java b/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
index 4ab454a..a49d578 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
@@ -24,13 +24,13 @@
import io.mifos.individuallending.api.v1.domain.caseinstance.CaseParameters;
import io.mifos.individuallending.api.v1.domain.product.AccountDesignators;
import io.mifos.individuallending.api.v1.domain.product.ChargeIdentifiers;
+import io.mifos.individuallending.api.v1.domain.product.ChargeProportionalDesignator;
import io.mifos.individuallending.api.v1.domain.workflow.Action;
import io.mifos.individuallending.api.v1.events.IndividualLoanCommandEvent;
import io.mifos.individuallending.api.v1.events.IndividualLoanEventConstants;
-import io.mifos.portfolio.api.v1.domain.Case;
-import io.mifos.portfolio.api.v1.domain.CostComponent;
-import io.mifos.portfolio.api.v1.domain.Product;
-import io.mifos.portfolio.api.v1.domain.TaskDefinition;
+import io.mifos.portfolio.api.v1.domain.*;
+import io.mifos.portfolio.api.v1.events.BalanceSegmentSetEvent;
+import io.mifos.portfolio.api.v1.events.ChargeDefinitionEvent;
import io.mifos.portfolio.api.v1.events.EventConstants;
import io.mifos.rhythm.spi.v1.client.BeatListener;
import io.mifos.rhythm.spi.v1.domain.BeatPublish;
@@ -56,7 +56,12 @@
public class TestAccountingInteractionInLoanWorkflow extends AbstractPortfolioTest {
private static final BigDecimal PROCESSING_FEE_AMOUNT = BigDecimal.valueOf(10_0000, MINOR_CURRENCY_UNIT_DIGITS);
private static final BigDecimal LOAN_ORIGINATION_FEE_AMOUNT = BigDecimal.valueOf(100_0000, MINOR_CURRENCY_UNIT_DIGITS);
- private static final BigDecimal DISBURSEMENT_FEE_AMOUNT = BigDecimal.valueOf(1_0000, MINOR_CURRENCY_UNIT_DIGITS);
+ private static final BigDecimal DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT = BigDecimal.valueOf(10_0000, MINOR_CURRENCY_UNIT_DIGITS);
+ private static final BigDecimal DISBURSEMENT_FEE_UPPER_RANGE_AMOUNT = BigDecimal.valueOf(1_0000, MINOR_CURRENCY_UNIT_DIGITS);
+ private static final String DISBURSEMENT_RANGES = "disbursement_ranges";
+ private static final String DISBURSEMENT_LOWER_RANGE = "smaller";
+ private static final String DISBURSEMENT_UPPER_RANGE = "larger";
+ private static final String UPPER_RANGE_DISBURSEMENT_FEE_ID = ChargeIdentifiers.DISBURSEMENT_FEE_ID + "2";
private BeatListener portfolioBeatListener;
@@ -110,13 +115,17 @@
step8Close();
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void workflowWithNegativePaymentSize() throws InterruptedException {
step1CreateProduct();
step2CreateCase();
step3OpenCase();
step4ApproveCase();
- step5Disburse(BigDecimal.valueOf(-2).setScale(MINOR_CURRENCY_UNIT_DIGITS, BigDecimal.ROUND_HALF_EVEN));
+ try {
+ step5Disburse(BigDecimal.valueOf(-2).setScale(MINOR_CURRENCY_UNIT_DIGITS, BigDecimal.ROUND_HALF_EVEN));
+ Assert.fail("Expected an IllegalArgumentException.");
+ }
+ catch (IllegalArgumentException ignored) { }
}
//Create product and set charges to fixed fees.
@@ -124,9 +133,48 @@
logger.info("step1CreateProduct");
product = createProduct();
+ final BalanceSegmentSet balanceSegmentSet = new BalanceSegmentSet();
+ balanceSegmentSet.setIdentifier(DISBURSEMENT_RANGES);
+ balanceSegmentSet.setSegmentIdentifiers(Arrays.asList(DISBURSEMENT_LOWER_RANGE, DISBURSEMENT_UPPER_RANGE));
+ balanceSegmentSet.setSegments(Arrays.asList(BigDecimal.ZERO, BigDecimal.valueOf(1_000_0000, 4)));
+ portfolioManager.createBalanceSegmentSet(product.getIdentifier(), balanceSegmentSet);
+ Assert.assertTrue(this.eventRecorder.wait(EventConstants.POST_BALANCE_SEGMENT_SET, new BalanceSegmentSetEvent(product.getIdentifier(), balanceSegmentSet.getIdentifier())));
+
setFeeToFixedValue(product.getIdentifier(), ChargeIdentifiers.PROCESSING_FEE_ID, PROCESSING_FEE_AMOUNT);
setFeeToFixedValue(product.getIdentifier(), ChargeIdentifiers.LOAN_ORIGINATION_FEE_ID, LOAN_ORIGINATION_FEE_AMOUNT);
- setFeeToFixedValue(product.getIdentifier(), ChargeIdentifiers.DISBURSEMENT_FEE_ID, DISBURSEMENT_FEE_AMOUNT);
+
+ final ChargeDefinition lowerRangeDisbursementFeeChargeDefinition
+ = portfolioManager.getChargeDefinition(product.getIdentifier(), ChargeIdentifiers.DISBURSEMENT_FEE_ID);
+ lowerRangeDisbursementFeeChargeDefinition.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+ lowerRangeDisbursementFeeChargeDefinition.setAmount(DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT);
+ lowerRangeDisbursementFeeChargeDefinition.setProportionalTo(ChargeProportionalDesignator.PRINCIPAL_ADJUSTMENT_DESIGNATOR.name());
+ lowerRangeDisbursementFeeChargeDefinition.setForSegmentSet(DISBURSEMENT_RANGES);
+ lowerRangeDisbursementFeeChargeDefinition.setFromSegment(DISBURSEMENT_LOWER_RANGE);
+ lowerRangeDisbursementFeeChargeDefinition.setToSegment(DISBURSEMENT_LOWER_RANGE);
+
+ portfolioManager.changeChargeDefinition(product.getIdentifier(), ChargeIdentifiers.DISBURSEMENT_FEE_ID, lowerRangeDisbursementFeeChargeDefinition);
+ Assert.assertTrue(this.eventRecorder.wait(EventConstants.PUT_CHARGE_DEFINITION,
+ new ChargeDefinitionEvent(product.getIdentifier(), ChargeIdentifiers.DISBURSEMENT_FEE_ID)));
+
+ final ChargeDefinition upperRangeDisbursementFeeChargeDefinition = new ChargeDefinition();
+ upperRangeDisbursementFeeChargeDefinition.setIdentifier(UPPER_RANGE_DISBURSEMENT_FEE_ID);
+ upperRangeDisbursementFeeChargeDefinition.setName(UPPER_RANGE_DISBURSEMENT_FEE_ID);
+ upperRangeDisbursementFeeChargeDefinition.setDescription(lowerRangeDisbursementFeeChargeDefinition.getDescription());
+ upperRangeDisbursementFeeChargeDefinition.setFromAccountDesignator(lowerRangeDisbursementFeeChargeDefinition.getFromAccountDesignator());
+ upperRangeDisbursementFeeChargeDefinition.setToAccountDesignator(lowerRangeDisbursementFeeChargeDefinition.getToAccountDesignator());
+ upperRangeDisbursementFeeChargeDefinition.setAccrualAccountDesignator(lowerRangeDisbursementFeeChargeDefinition.getAccrualAccountDesignator());
+ upperRangeDisbursementFeeChargeDefinition.setAccrueAction(lowerRangeDisbursementFeeChargeDefinition.getAccrueAction());
+ upperRangeDisbursementFeeChargeDefinition.setChargeAction(lowerRangeDisbursementFeeChargeDefinition.getChargeAction());
+ upperRangeDisbursementFeeChargeDefinition.setChargeMethod(ChargeDefinition.ChargeMethod.PROPORTIONAL);
+ upperRangeDisbursementFeeChargeDefinition.setAmount(DISBURSEMENT_FEE_UPPER_RANGE_AMOUNT);
+ upperRangeDisbursementFeeChargeDefinition.setProportionalTo(ChargeProportionalDesignator.PRINCIPAL_ADJUSTMENT_DESIGNATOR.name());
+ upperRangeDisbursementFeeChargeDefinition.setForSegmentSet(DISBURSEMENT_RANGES);
+ upperRangeDisbursementFeeChargeDefinition.setFromSegment(DISBURSEMENT_UPPER_RANGE);
+ upperRangeDisbursementFeeChargeDefinition.setToSegment(DISBURSEMENT_UPPER_RANGE);
+
+ portfolioManager.createChargeDefinition(product.getIdentifier(), upperRangeDisbursementFeeChargeDefinition);
+ Assert.assertTrue(this.eventRecorder.wait(EventConstants.POST_CHARGE_DEFINITION,
+ new ChargeDefinitionEvent(product.getIdentifier(), UPPER_RANGE_DISBURSEMENT_FEE_ID)));
taskDefinition = createTaskDefinition(product);
@@ -237,7 +285,8 @@
customerCase.getIdentifier(),
Action.DISBURSE,
Collections.singleton(AccountDesignators.ENTRY),
- amount, new CostComponent(ChargeIdentifiers.DISBURSEMENT_FEE_ID, DISBURSEMENT_FEE_AMOUNT),
+ amount, new CostComponent(ChargeIdentifiers.DISBURSEMENT_FEE_ID, DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT),
+ new CostComponent(UPPER_RANGE_DISBURSEMENT_FEE_ID, BigDecimal.ZERO.setScale(MINOR_CURRENCY_UNIT_DIGITS, BigDecimal.ROUND_HALF_EVEN)),
new CostComponent(ChargeIdentifiers.DISBURSE_PAYMENT_ID, amount));
checkStateTransfer(
product.getIdentifier(),
@@ -254,12 +303,12 @@
final Set<Debtor> debtors = new HashSet<>();
debtors.add(new Debtor(pendingDisbursalAccountIdentifier, amount.toPlainString()));
debtors.add(new Debtor(AccountingFixture.LOANS_PAYABLE_ACCOUNT_IDENTIFIER, amount.toPlainString()));
- debtors.add(new Debtor(AccountingFixture.TELLER_ONE_ACCOUNT_IDENTIFIER, DISBURSEMENT_FEE_AMOUNT.toPlainString()));
+ debtors.add(new Debtor(AccountingFixture.TELLER_ONE_ACCOUNT_IDENTIFIER, DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT.toPlainString()));
final Set<Creditor> creditors = new HashSet<>();
creditors.add(new Creditor(customerLoanAccountIdentifier, amount.toPlainString()));
creditors.add(new Creditor(AccountingFixture.TELLER_ONE_ACCOUNT_IDENTIFIER, amount.toPlainString()));
- creditors.add(new Creditor(AccountingFixture.DISBURSEMENT_FEE_INCOME_ACCOUNT_IDENTIFIER, DISBURSEMENT_FEE_AMOUNT.toPlainString()));
+ creditors.add(new Creditor(AccountingFixture.DISBURSEMENT_FEE_INCOME_ACCOUNT_IDENTIFIER, DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT.toPlainString()));
AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors, product.getIdentifier(), customerCase.getIdentifier(), Action.DISBURSE);
expectedCurrentBalance = expectedCurrentBalance.add(amount);
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestBalanceSegmentSets.java b/component-test/src/main/java/io/mifos/portfolio/TestBalanceSegmentSets.java
index e4852e6..197b3d5 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestBalanceSegmentSets.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestBalanceSegmentSets.java
@@ -31,7 +31,7 @@
*/
public class TestBalanceSegmentSets extends AbstractPortfolioTest {
@Test
- public void test() throws InterruptedException {
+ public void testBalanceSegmentSetManagement() throws InterruptedException {
final Product product = createProduct();
final BalanceSegmentSet balanceSegmentSet = new BalanceSegmentSet();
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/BalanceSegmentSetCommandHandler.java b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/BalanceSegmentSetCommandHandler.java
index dd8a7a3..ae83771 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/BalanceSegmentSetCommandHandler.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/BalanceSegmentSetCommandHandler.java
@@ -26,8 +26,8 @@
import io.mifos.portfolio.service.internal.command.CreateBalanceSegmentSetCommand;
import io.mifos.portfolio.service.internal.command.DeleteBalanceSegmentSetCommand;
import io.mifos.portfolio.service.internal.mapper.BalanceSegmentSetMapper;
-import io.mifos.portfolio.service.internal.repository.BalanceSegmentSetEntity;
-import io.mifos.portfolio.service.internal.repository.BalanceSegmentSetRepository;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentEntity;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentRepository;
import io.mifos.portfolio.service.internal.repository.ProductEntity;
import io.mifos.portfolio.service.internal.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
@@ -41,14 +41,14 @@
*/
@Aggregate
public class BalanceSegmentSetCommandHandler {
- private final BalanceSegmentSetRepository balanceSegmentSetRepository;
+ private final BalanceSegmentRepository balanceSegmentRepository;
private final ProductRepository productRepository;
@Autowired
public BalanceSegmentSetCommandHandler(
- final BalanceSegmentSetRepository balanceSegmentSetRepository,
+ final BalanceSegmentRepository balanceSegmentRepository,
final ProductRepository productRepository) {
- this.balanceSegmentSetRepository = balanceSegmentSetRepository;
+ this.balanceSegmentRepository = balanceSegmentRepository;
this.productRepository = productRepository;
}
@@ -59,10 +59,10 @@
final ProductEntity product = productRepository.findByIdentifier(createBalanceSegmentSetCommand.getProductIdentifier())
.orElseThrow(() -> ServiceException.notFound("Product with identifier ''{0}'' doesn''t exist.", createBalanceSegmentSetCommand.getProductIdentifier()));
- final List<BalanceSegmentSetEntity> balanceSegmentSetEntities = BalanceSegmentSetMapper.map(
+ final List<BalanceSegmentEntity> balanceSegmentSetEntities = BalanceSegmentSetMapper.map(
createBalanceSegmentSetCommand.getInstance(), product);
- balanceSegmentSetRepository.save(balanceSegmentSetEntities);
+ balanceSegmentRepository.save(balanceSegmentSetEntities);
return new BalanceSegmentSetEvent(
createBalanceSegmentSetCommand.getProductIdentifier(),
@@ -76,7 +76,7 @@
final ProductEntity product = productRepository.findByIdentifier(changeBalanceSegmentSetCommand.getProductIdentifier())
.orElseThrow(() -> ServiceException.notFound("Product with identifier ''{0}'' doesn''t exist.", changeBalanceSegmentSetCommand.getProductIdentifier()));
- final List<BalanceSegmentSetEntity> balanceSegmentSets = balanceSegmentSetRepository.findByProductIdentifierAndSegmentSetIdentifier(
+ final List<BalanceSegmentEntity> balanceSegmentSets = balanceSegmentRepository.findByProductIdentifierAndSegmentSetIdentifier(
changeBalanceSegmentSetCommand.getProductIdentifier(),
changeBalanceSegmentSetCommand.getInstance().getIdentifier())
.collect(Collectors.toList());
@@ -85,12 +85,12 @@
changeBalanceSegmentSetCommand.getProductIdentifier(),
changeBalanceSegmentSetCommand.getInstance().getIdentifier());
- balanceSegmentSetRepository.deleteInBatch(balanceSegmentSets);
+ balanceSegmentRepository.deleteInBatch(balanceSegmentSets);
- final List<BalanceSegmentSetEntity> balanceSegmentSetEntities = BalanceSegmentSetMapper.map(
+ final List<BalanceSegmentEntity> balanceSegmentSetEntities = BalanceSegmentSetMapper.map(
changeBalanceSegmentSetCommand.getInstance(), product);
- balanceSegmentSetRepository.save(balanceSegmentSetEntities);
+ balanceSegmentRepository.save(balanceSegmentSetEntities);
return new BalanceSegmentSetEvent(
changeBalanceSegmentSetCommand.getProductIdentifier(),
@@ -101,7 +101,7 @@
@CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
@EventEmitter(selectorName = EventConstants.SELECTOR_NAME, selectorValue = EventConstants.DELETE_BALANCE_SEGMENT_SET)
public BalanceSegmentSetEvent process(final DeleteBalanceSegmentSetCommand deleteBalanceSegmentSetCommand) {
- final List<BalanceSegmentSetEntity> balanceSegmentSets = balanceSegmentSetRepository.findByProductIdentifierAndSegmentSetIdentifier(
+ final List<BalanceSegmentEntity> balanceSegmentSets = balanceSegmentRepository.findByProductIdentifierAndSegmentSetIdentifier(
deleteBalanceSegmentSetCommand.getProductIdentifier(),
deleteBalanceSegmentSetCommand.getBalanceSegmentSetIdentifier())
.collect(Collectors.toList());
@@ -110,7 +110,7 @@
deleteBalanceSegmentSetCommand.getProductIdentifier(),
deleteBalanceSegmentSetCommand.getBalanceSegmentSetIdentifier());
- balanceSegmentSetRepository.deleteInBatch(balanceSegmentSets);
+ balanceSegmentRepository.deleteInBatch(balanceSegmentSets);
return new BalanceSegmentSetEvent(
deleteBalanceSegmentSetCommand.getProductIdentifier(),
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandler.java b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandler.java
index 61b7db9..6cfb5a1 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandler.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandler.java
@@ -15,7 +15,11 @@
*/
package io.mifos.portfolio.service.internal.command.handler;
+import io.mifos.core.command.annotation.Aggregate;
+import io.mifos.core.command.annotation.CommandHandler;
import io.mifos.core.command.annotation.CommandLogLevel;
+import io.mifos.core.command.annotation.EventEmitter;
+import io.mifos.core.lang.ServiceException;
import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
import io.mifos.portfolio.api.v1.events.ChargeDefinitionEvent;
import io.mifos.portfolio.api.v1.events.EventConstants;
@@ -23,17 +27,12 @@
import io.mifos.portfolio.service.internal.command.CreateChargeDefinitionCommand;
import io.mifos.portfolio.service.internal.command.DeleteProductChargeDefinitionCommand;
import io.mifos.portfolio.service.internal.mapper.ChargeDefinitionMapper;
-import io.mifos.portfolio.service.internal.repository.ChargeDefinitionEntity;
-import io.mifos.portfolio.service.internal.repository.ChargeDefinitionRepository;
-import io.mifos.portfolio.service.internal.repository.ProductEntity;
-import io.mifos.portfolio.service.internal.repository.ProductRepository;
-import io.mifos.core.command.annotation.Aggregate;
-import io.mifos.core.command.annotation.CommandHandler;
-import io.mifos.core.command.annotation.EventEmitter;
-import io.mifos.core.lang.ServiceException;
+import io.mifos.portfolio.service.internal.repository.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
+import java.util.Optional;
+
/**
* @author Myrle Krantz
*/
@@ -41,13 +40,16 @@
public class ChargeDefinitionCommandHandler {
private final ProductRepository productRepository;
private final ChargeDefinitionRepository chargeDefinitionRepository;
+ private final BalanceSegmentRepository balanceSegmentRepository;
@Autowired
public ChargeDefinitionCommandHandler(
- final ProductRepository productRepository,
- final ChargeDefinitionRepository chargeDefinitionRepository) {
+ final ProductRepository productRepository,
+ final ChargeDefinitionRepository chargeDefinitionRepository,
+ final BalanceSegmentRepository balanceSegmentRepository) {
this.productRepository = productRepository;
this.chargeDefinitionRepository = chargeDefinitionRepository;
+ this.balanceSegmentRepository = balanceSegmentRepository;
}
@SuppressWarnings("unused")
@@ -62,8 +64,10 @@
= productRepository.findByIdentifier(productIdentifier)
.orElseThrow(() -> ServiceException.badRequest("The given product identifier does not refer to a product {0}", productIdentifier));
+ final SegmentRange segmentRange = getSegmentRange(chargeDefinition, productIdentifier);
+
final ChargeDefinitionEntity chargeDefinitionEntity =
- ChargeDefinitionMapper.map(productEntity, chargeDefinition);
+ ChargeDefinitionMapper.map(productEntity, chargeDefinition, segmentRange.fromSegment, segmentRange.toSegment);
chargeDefinitionRepository.save(chargeDefinitionEntity);
return new ChargeDefinitionEvent(
@@ -83,8 +87,10 @@
= chargeDefinitionRepository.findByProductIdAndChargeDefinitionIdentifier(productIdentifier, chargeDefinition.getIdentifier())
.orElseThrow(() -> ServiceException.internalError("task definition not found."));
+ final SegmentRange segmentRange = getSegmentRange(chargeDefinition, productIdentifier);
+
final ChargeDefinitionEntity chargeDefinitionEntity =
- ChargeDefinitionMapper.map(existingChargeDefinition.getProduct(), chargeDefinition);
+ ChargeDefinitionMapper.map(existingChargeDefinition.getProduct(), chargeDefinition, segmentRange.fromSegment, segmentRange.toSegment);
chargeDefinitionEntity.setId(existingChargeDefinition.getId());
chargeDefinitionEntity.setId(existingChargeDefinition.getId());
chargeDefinitionRepository.save(chargeDefinitionEntity);
@@ -112,4 +118,34 @@
command.getChargeDefinitionIdentifier());
}
+ static class SegmentRange {
+ final BalanceSegmentEntity fromSegment;
+ final BalanceSegmentEntity toSegment;
+
+ SegmentRange(final BalanceSegmentEntity fromSegment, final BalanceSegmentEntity toSegment) {
+ this.fromSegment = fromSegment;
+ this.toSegment = toSegment;
+ }
+ }
+
+ private SegmentRange getSegmentRange(final ChargeDefinition chargeDefinition, final String productIdentifier) {
+ if (chargeDefinition.getForSegmentSet() != null) {
+ final Optional<BalanceSegmentEntity> fromSegmentOptional =
+ balanceSegmentRepository.findByProductIdentifierAndSegmentSetIdentifierAndSegmentIdentifier(
+ productIdentifier,
+ chargeDefinition.getForSegmentSet(),
+ chargeDefinition.getFromSegment());
+ final Optional<BalanceSegmentEntity> toSegmentOptional =
+ balanceSegmentRepository.findByProductIdentifierAndSegmentSetIdentifierAndSegmentIdentifier(
+ productIdentifier,
+ chargeDefinition.getForSegmentSet(),
+ chargeDefinition.getFromSegment());
+
+ if (fromSegmentOptional.isPresent() && toSegmentOptional.isPresent()) {
+ return new SegmentRange(fromSegmentOptional.get(), toSegmentOptional.get());
+ }
+ }
+
+ return new SegmentRange(null, null);
+ }
}
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ProductCommandHandler.java b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ProductCommandHandler.java
index 6693e03..c075416 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ProductCommandHandler.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ProductCommandHandler.java
@@ -85,7 +85,7 @@
private void createChargeDefinition(final ProductEntity productEntity, final ChargeDefinition chargeDefinition) {
final ChargeDefinitionEntity chargeDefinitionEntity =
- ChargeDefinitionMapper.map(productEntity, chargeDefinition);
+ ChargeDefinitionMapper.map(productEntity, chargeDefinition, null, null);
chargeDefinitionRepository.save(chargeDefinitionEntity);
}
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/BalanceSegmentSetMapper.java b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/BalanceSegmentSetMapper.java
index c42dfd0..63ba34f 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/BalanceSegmentSetMapper.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/BalanceSegmentSetMapper.java
@@ -16,7 +16,7 @@
package io.mifos.portfolio.service.internal.mapper;
import io.mifos.portfolio.api.v1.domain.BalanceSegmentSet;
-import io.mifos.portfolio.service.internal.repository.BalanceSegmentSetEntity;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentEntity;
import io.mifos.portfolio.service.internal.repository.ProductEntity;
import java.util.ArrayList;
@@ -30,11 +30,11 @@
* @author Myrle Krantz
*/
public class BalanceSegmentSetMapper {
- public static List<BalanceSegmentSetEntity> map(final BalanceSegmentSet instance, final ProductEntity product) {
+ public static List<BalanceSegmentEntity> map(final BalanceSegmentSet instance, final ProductEntity product) {
return
Stream.iterate(0, i -> i+1).limit(instance.getSegmentIdentifiers().size())
.map(i -> {
- final BalanceSegmentSetEntity ret = new BalanceSegmentSetEntity();
+ final BalanceSegmentEntity ret = new BalanceSegmentEntity();
ret.setProduct(product);
ret.setSegmentSetIdentifier(instance.getIdentifier());
ret.setSegmentIdentifier(instance.getSegmentIdentifiers().get(i));
@@ -44,11 +44,11 @@
.collect(Collectors.toList());
}
- public static Optional<BalanceSegmentSet> map(final Stream<BalanceSegmentSetEntity> instances) {
+ public static Optional<BalanceSegmentSet> map(final Stream<BalanceSegmentEntity> instances) {
final BalanceSegmentSet ret = new BalanceSegmentSet();
ret.setSegments(new ArrayList<>());
ret.setSegmentIdentifiers(new ArrayList<>());
- instances.sorted(Comparator.comparing(BalanceSegmentSetEntity::getLowerBound))
+ instances.sorted(Comparator.comparing(BalanceSegmentEntity::getLowerBound))
.forEach(seg -> {
ret.setIdentifier(seg.getSegmentSetIdentifier());
ret.getSegments().add(seg.getLowerBound());
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ChargeDefinitionMapper.java b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ChargeDefinitionMapper.java
index 91958f5..f99d272 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ChargeDefinitionMapper.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ChargeDefinitionMapper.java
@@ -17,9 +17,11 @@
import io.mifos.individuallending.api.v1.domain.product.ChargeProportionalDesignator;
import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentEntity;
import io.mifos.portfolio.service.internal.repository.ChargeDefinitionEntity;
import io.mifos.portfolio.service.internal.repository.ProductEntity;
+import javax.annotation.Nullable;
import java.util.Optional;
import static io.mifos.individuallending.api.v1.domain.product.ChargeIdentifiers.*;
@@ -28,7 +30,11 @@
* @author Myrle Krantz
*/
public class ChargeDefinitionMapper {
- public static ChargeDefinitionEntity map(final ProductEntity productEntity, final ChargeDefinition chargeDefinition) {
+ public static ChargeDefinitionEntity map(
+ final ProductEntity productEntity,
+ final ChargeDefinition chargeDefinition,
+ @Nullable final BalanceSegmentEntity fromSegment,
+ @Nullable final BalanceSegmentEntity toSegment) {
final ChargeDefinitionEntity ret = new ChargeDefinitionEntity();
@@ -46,6 +52,11 @@
ret.setAccrualAccountDesignator(chargeDefinition.getAccrualAccountDesignator());
ret.setToAccountDesignator(chargeDefinition.getToAccountDesignator());
ret.setReadOnly(chargeDefinition.isReadOnly());
+ if (fromSegment != null && toSegment != null) {
+ ret.setSegmentSet(fromSegment.getSegmentSetIdentifier());
+ ret.setFromSegment(fromSegment.getSegmentIdentifier());
+ ret.setToSegment(toSegment.getSegmentIdentifier());
+ }
return ret;
}
@@ -66,6 +77,11 @@
ret.setAccrualAccountDesignator(from.getAccrualAccountDesignator());
ret.setToAccountDesignator(from.getToAccountDesignator());
ret.setReadOnly(Optional.ofNullable(from.getReadOnly()).orElseGet(() -> readOnlyLegacyMapper(from.getIdentifier())));
+ if (from.getSegmentSet() != null && from.getFromSegment() != null && from.getToSegment() != null) {
+ ret.setForSegmentSet(from.getSegmentSet());
+ ret.setFromSegment(from.getFromSegment());
+ ret.setToSegment(from.getToSegment());
+ }
return ret;
}
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetEntity.java b/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentEntity.java
similarity index 94%
rename from service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetEntity.java
rename to service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentEntity.java
index ee8c5c2..b2d7e8b 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetEntity.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentEntity.java
@@ -24,7 +24,7 @@
*/
@Entity
@Table(name = "bastet_p_balance_segs")
-public class BalanceSegmentSetEntity {
+public class BalanceSegmentEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@@ -43,7 +43,7 @@
@Column(name = "lower_bound")
private BigDecimal lowerBound;
- public BalanceSegmentSetEntity() {
+ public BalanceSegmentEntity() {
}
public Long getId() {
@@ -90,7 +90,7 @@
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
- BalanceSegmentSetEntity that = (BalanceSegmentSetEntity) o;
+ BalanceSegmentEntity that = (BalanceSegmentEntity) o;
return Objects.equals(product, that.product) &&
Objects.equals(segmentSetIdentifier, that.segmentSetIdentifier) &&
Objects.equals(segmentIdentifier, that.segmentIdentifier);
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetRepository.java b/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentRepository.java
similarity index 65%
rename from service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetRepository.java
rename to service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentRepository.java
index 9aac27d..0a4f903 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetRepository.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentRepository.java
@@ -18,12 +18,15 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
+import java.util.Optional;
import java.util.stream.Stream;
/**
* @author Myrle Krantz
*/
@Repository
-public interface BalanceSegmentSetRepository extends JpaRepository<BalanceSegmentSetEntity, Long> {
- Stream<BalanceSegmentSetEntity> findByProductIdentifierAndSegmentSetIdentifier(String productIdentifier, String segmentSetIdentifier);
+public interface BalanceSegmentRepository extends JpaRepository<BalanceSegmentEntity, Long> {
+ Stream<BalanceSegmentEntity> findByProductIdentifierAndSegmentSetIdentifier(String productIdentifier, String segmentSetIdentifier);
+
+ Optional<BalanceSegmentEntity> findByProductIdentifierAndSegmentSetIdentifierAndSegmentIdentifier(String productIdentifier, String segmentSetIdentifier, String segmentIdentifier);
}
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/repository/ChargeDefinitionEntity.java b/service/src/main/java/io/mifos/portfolio/service/internal/repository/ChargeDefinitionEntity.java
index 423c871..11e154e 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/repository/ChargeDefinitionEntity.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/repository/ChargeDefinitionEntity.java
@@ -79,6 +79,15 @@
@Column(name = "read_only")
private Boolean readOnly;
+ @Column(name = "segment_set")
+ private String segmentSet;
+
+ @Column(name = "from_segment")
+ private String fromSegment;
+
+ @Column(name = "to_segment")
+ private String toSegment;
+
public ChargeDefinitionEntity() {
}
@@ -202,6 +211,30 @@
this.readOnly = readOnly;
}
+ public String getSegmentSet() {
+ return segmentSet;
+ }
+
+ public void setSegmentSet(String segmentSet) {
+ this.segmentSet = segmentSet;
+ }
+
+ public String getFromSegment() {
+ return fromSegment;
+ }
+
+ public void setFromSegment(String fromSegment) {
+ this.fromSegment = fromSegment;
+ }
+
+ public String getToSegment() {
+ return toSegment;
+ }
+
+ public void setToSegment(String toSegment) {
+ this.toSegment = toSegment;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/service/BalanceSegmentSetService.java b/service/src/main/java/io/mifos/portfolio/service/internal/service/BalanceSegmentSetService.java
index 451a57e..ee558a6 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/service/BalanceSegmentSetService.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/service/BalanceSegmentSetService.java
@@ -17,7 +17,7 @@
import io.mifos.portfolio.api.v1.domain.BalanceSegmentSet;
import io.mifos.portfolio.service.internal.mapper.BalanceSegmentSetMapper;
-import io.mifos.portfolio.service.internal.repository.BalanceSegmentSetRepository;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -28,18 +28,18 @@
*/
@Service
public class BalanceSegmentSetService {
- private final BalanceSegmentSetRepository balanceSegmentSetRepository;
+ private final BalanceSegmentRepository balanceSegmentRepository;
@Autowired
public BalanceSegmentSetService(
- final BalanceSegmentSetRepository balanceSegmentSetRepository) {
- this.balanceSegmentSetRepository = balanceSegmentSetRepository;
+ final BalanceSegmentRepository balanceSegmentRepository) {
+ this.balanceSegmentRepository = balanceSegmentRepository;
}
public boolean existsByIdentifier(final String productIdentifier, final String balanceSegmentSetIdentifier)
{
//TODO: replace with existsBy once we've upgraded to spring data 1.11 or later.
- return balanceSegmentSetRepository
+ return balanceSegmentRepository
.findByProductIdentifierAndSegmentSetIdentifier(productIdentifier, balanceSegmentSetIdentifier)
.findAny().isPresent();
}
@@ -47,7 +47,7 @@
public Optional<BalanceSegmentSet> findByIdentifier(
final String productIdentifier,
final String balanceSegmentSetIdentifier) {
- return BalanceSegmentSetMapper.map(balanceSegmentSetRepository
+ return BalanceSegmentSetMapper.map(balanceSegmentRepository
.findByProductIdentifierAndSegmentSetIdentifier(productIdentifier, balanceSegmentSetIdentifier));
}
}
diff --git a/service/src/main/resources/db/migrations/mariadb/V7__balance_segment_sets.sql b/service/src/main/resources/db/migrations/mariadb/V7__balance_segment_sets.sql
index 2cd41a5..a9a9399 100644
--- a/service/src/main/resources/db/migrations/mariadb/V7__balance_segment_sets.sql
+++ b/service/src/main/resources/db/migrations/mariadb/V7__balance_segment_sets.sql
@@ -23,4 +23,8 @@
CONSTRAINT bastet_p_balance_segs_pk PRIMARY KEY (id),
CONSTRAINT bastet_p_balance_segs_uq UNIQUE (product_id, seg_set_identifier, segment_identifier),
CONSTRAINT bastet_p_balance_segs_fk FOREIGN KEY (product_id) REFERENCES bastet_products (id)
-);
\ No newline at end of file
+);
+
+ALTER TABLE bastet_p_chrg_defs ADD COLUMN segment_set VARCHAR(32) NULL DEFAULT NULL;
+ALTER TABLE bastet_p_chrg_defs ADD COLUMN from_segment VARCHAR(32) NULL DEFAULT NULL;
+ALTER TABLE bastet_p_chrg_defs ADD COLUMN to_segment VARCHAR(32) NULL DEFAULT NULL;
\ No newline at end of file
diff --git a/service/src/test/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandlerTest.java b/service/src/test/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandlerTest.java
index 7b419c0..ecd74d2 100644
--- a/service/src/test/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandlerTest.java
+++ b/service/src/test/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandlerTest.java
@@ -16,6 +16,7 @@
package io.mifos.portfolio.service.internal.command.handler;
import io.mifos.portfolio.service.internal.command.DeleteProductChargeDefinitionCommand;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentRepository;
import io.mifos.portfolio.service.internal.repository.ChargeDefinitionRepository;
import io.mifos.core.lang.ServiceException;
import org.junit.Assert;
@@ -37,7 +38,9 @@
.when(chargeDefinitionRepositoryMock)
.findByProductIdAndChargeDefinitionIdentifier(productIdentifier, chargeDefinitionIdentifier);
- final ChargeDefinitionCommandHandler testSubject = new ChargeDefinitionCommandHandler(null, chargeDefinitionRepositoryMock);
+ final BalanceSegmentRepository balanceSegmentRepository = Mockito.mock(BalanceSegmentRepository.class);
+
+ final ChargeDefinitionCommandHandler testSubject = new ChargeDefinitionCommandHandler(null, chargeDefinitionRepositoryMock, balanceSegmentRepository);
try {
testSubject.process(new DeleteProductChargeDefinitionCommand(productIdentifier, chargeDefinitionIdentifier));