FINERACT-1926 AssetOwnerTransferDetails added
This commit is contained in:
+24
-4
@@ -21,6 +21,7 @@ package org.apache.fineract.investor.cob.loan;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.fineract.cob.loan.LoanCOBBusinessStep;
|
import org.apache.fineract.cob.loan.LoanCOBBusinessStep;
|
||||||
@@ -28,6 +29,7 @@ import org.apache.fineract.infrastructure.core.service.DateUtils;
|
|||||||
import org.apache.fineract.investor.data.ExternalTransferStatus;
|
import org.apache.fineract.investor.data.ExternalTransferStatus;
|
||||||
import org.apache.fineract.investor.data.ExternalTransferSubStatus;
|
import org.apache.fineract.investor.data.ExternalTransferSubStatus;
|
||||||
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransfer;
|
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransfer;
|
||||||
|
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransferDetails;
|
||||||
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransferLoanMapping;
|
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransferLoanMapping;
|
||||||
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransferLoanMappingRepository;
|
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransferLoanMappingRepository;
|
||||||
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransferRepository;
|
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransferRepository;
|
||||||
@@ -89,7 +91,7 @@ public class LoanAccountOwnerTransferBusinessStep implements LoanCOBBusinessStep
|
|||||||
final ExternalAssetOwnerTransfer buybackExternalAssetOwnerTransfer) {
|
final ExternalAssetOwnerTransfer buybackExternalAssetOwnerTransfer) {
|
||||||
ExternalAssetOwnerTransfer activeExternalAssetOwnerTransfer = externalAssetOwnerTransferRepository
|
ExternalAssetOwnerTransfer activeExternalAssetOwnerTransfer = externalAssetOwnerTransferRepository
|
||||||
.findOne((root, query, criteriaBuilder) -> criteriaBuilder.and(criteriaBuilder.equal(root.get("loanId"), loan.getId()),
|
.findOne((root, query, criteriaBuilder) -> criteriaBuilder.and(criteriaBuilder.equal(root.get("loanId"), loan.getId()),
|
||||||
criteriaBuilder.equal(root.get("ownerId"), buybackExternalAssetOwnerTransfer.getOwnerId()),
|
criteriaBuilder.equal(root.get("owner"), buybackExternalAssetOwnerTransfer.getOwner()),
|
||||||
criteriaBuilder.equal(root.get("status"), ExternalTransferStatus.ACTIVE),
|
criteriaBuilder.equal(root.get("status"), ExternalTransferStatus.ACTIVE),
|
||||||
criteriaBuilder.equal(root.get("effectiveDateTo"), FUTURE_DATE_9999_12_31)))
|
criteriaBuilder.equal(root.get("effectiveDateTo"), FUTURE_DATE_9999_12_31)))
|
||||||
.orElseThrow();
|
.orElseThrow();
|
||||||
@@ -102,11 +104,12 @@ public class LoanAccountOwnerTransferBusinessStep implements LoanCOBBusinessStep
|
|||||||
ExternalAssetOwnerTransfer buybackExternalAssetOwnerTransfer, ExternalAssetOwnerTransfer activeExternalAssetOwnerTransfer) {
|
ExternalAssetOwnerTransfer buybackExternalAssetOwnerTransfer, ExternalAssetOwnerTransfer activeExternalAssetOwnerTransfer) {
|
||||||
activeExternalAssetOwnerTransfer.setEffectiveDateTo(settlementDate);
|
activeExternalAssetOwnerTransfer.setEffectiveDateTo(settlementDate);
|
||||||
buybackExternalAssetOwnerTransfer.setEffectiveDateTo(buybackExternalAssetOwnerTransfer.getEffectiveDateFrom());
|
buybackExternalAssetOwnerTransfer.setEffectiveDateTo(buybackExternalAssetOwnerTransfer.getEffectiveDateFrom());
|
||||||
|
buybackExternalAssetOwnerTransfer
|
||||||
|
.setExternalAssetOwnerTransferDetails(createAssetOwnerTransferDetails(loan, buybackExternalAssetOwnerTransfer));
|
||||||
externalAssetOwnerTransferRepository.save(activeExternalAssetOwnerTransfer);
|
externalAssetOwnerTransferRepository.save(activeExternalAssetOwnerTransfer);
|
||||||
buybackExternalAssetOwnerTransfer = externalAssetOwnerTransferRepository.save(buybackExternalAssetOwnerTransfer);
|
buybackExternalAssetOwnerTransfer = externalAssetOwnerTransferRepository.save(buybackExternalAssetOwnerTransfer);
|
||||||
externalAssetOwnerTransferLoanMappingRepository.deleteByLoanIdAndOwnerTransfer(loan.getId(), activeExternalAssetOwnerTransfer);
|
externalAssetOwnerTransferLoanMappingRepository.deleteByLoanIdAndOwnerTransfer(loan.getId(), activeExternalAssetOwnerTransfer);
|
||||||
// TODO: create asset ownership accounting entries
|
// TODO: create asset ownership accounting entries
|
||||||
// TODO: create asset ownership transaction entries
|
|
||||||
return buybackExternalAssetOwnerTransfer;
|
return buybackExternalAssetOwnerTransfer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,8 +119,9 @@ public class LoanAccountOwnerTransferBusinessStep implements LoanCOBBusinessStep
|
|||||||
if (isTransferable(loan)) {
|
if (isTransferable(loan)) {
|
||||||
newExternalAssetOwnerTransfer = createActiveEntry(settlementDate, externalAssetOwnerTransfer);
|
newExternalAssetOwnerTransfer = createActiveEntry(settlementDate, externalAssetOwnerTransfer);
|
||||||
createActiveMapping(loan.getId(), newExternalAssetOwnerTransfer);
|
createActiveMapping(loan.getId(), newExternalAssetOwnerTransfer);
|
||||||
|
newExternalAssetOwnerTransfer
|
||||||
|
.setExternalAssetOwnerTransferDetails(createAssetOwnerTransferDetails(loan, newExternalAssetOwnerTransfer));
|
||||||
// TODO: create asset ownership accounting entries
|
// TODO: create asset ownership accounting entries
|
||||||
// TODO: create asset ownership transaction entries
|
|
||||||
} else {
|
} else {
|
||||||
ExternalTransferSubStatus subStatus = ExternalTransferSubStatus.BALANCE_ZERO;
|
ExternalTransferSubStatus subStatus = ExternalTransferSubStatus.BALANCE_ZERO;
|
||||||
if (loan.getTotalOverpaid().compareTo(BigDecimal.ZERO) > 0) {
|
if (loan.getTotalOverpaid().compareTo(BigDecimal.ZERO) > 0) {
|
||||||
@@ -129,6 +133,23 @@ public class LoanAccountOwnerTransferBusinessStep implements LoanCOBBusinessStep
|
|||||||
return newExternalAssetOwnerTransfer;
|
return newExternalAssetOwnerTransfer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ExternalAssetOwnerTransferDetails createAssetOwnerTransferDetails(Loan loan,
|
||||||
|
ExternalAssetOwnerTransfer externalAssetOwnerTransfer) {
|
||||||
|
ExternalAssetOwnerTransferDetails details = new ExternalAssetOwnerTransferDetails();
|
||||||
|
details.setExternalAssetOwnerTransfer(externalAssetOwnerTransfer);
|
||||||
|
details.setTotalOutstanding(Objects.requireNonNullElse(loan.getLoanSummary().getTotalOutstanding(), BigDecimal.ZERO));
|
||||||
|
details.setTotalPrincipalOutstanding(
|
||||||
|
Objects.requireNonNullElse(loan.getLoanSummary().getTotalPrincipalOutstanding(), BigDecimal.ZERO));
|
||||||
|
details.setTotalInterestOutstanding(
|
||||||
|
Objects.requireNonNullElse(loan.getLoanSummary().getTotalInterestOutstanding(), BigDecimal.ZERO));
|
||||||
|
details.setTotalFeeChargesOutstanding(
|
||||||
|
Objects.requireNonNullElse(loan.getLoanSummary().getTotalFeeChargesOutstanding(), BigDecimal.ZERO));
|
||||||
|
details.setTotalPenaltyChargesOutstanding(
|
||||||
|
Objects.requireNonNullElse(loan.getLoanSummary().getTotalPenaltyChargesOutstanding(), BigDecimal.ZERO));
|
||||||
|
details.setTotalOverpaid(Objects.requireNonNullElse(loan.getTotalOverpaid(), BigDecimal.ZERO));
|
||||||
|
return details;
|
||||||
|
}
|
||||||
|
|
||||||
private void createActiveMapping(Long loanId, ExternalAssetOwnerTransfer externalAssetOwnerTransfer) {
|
private void createActiveMapping(Long loanId, ExternalAssetOwnerTransfer externalAssetOwnerTransfer) {
|
||||||
ExternalAssetOwnerTransferLoanMapping externalAssetOwnerTransferLoanMapping = new ExternalAssetOwnerTransferLoanMapping();
|
ExternalAssetOwnerTransferLoanMapping externalAssetOwnerTransferLoanMapping = new ExternalAssetOwnerTransferLoanMapping();
|
||||||
externalAssetOwnerTransferLoanMapping.setLoanId(loanId);
|
externalAssetOwnerTransferLoanMapping.setLoanId(loanId);
|
||||||
@@ -157,7 +178,6 @@ public class LoanAccountOwnerTransferBusinessStep implements LoanCOBBusinessStep
|
|||||||
final ExternalTransferSubStatus subStatus, final LocalDate effectiveDateFrom, final LocalDate effectiveDateTo) {
|
final ExternalTransferSubStatus subStatus, final LocalDate effectiveDateFrom, final LocalDate effectiveDateTo) {
|
||||||
ExternalAssetOwnerTransfer newExternalAssetOwnerTransfer = new ExternalAssetOwnerTransfer();
|
ExternalAssetOwnerTransfer newExternalAssetOwnerTransfer = new ExternalAssetOwnerTransfer();
|
||||||
newExternalAssetOwnerTransfer.setOwner(externalAssetOwnerTransfer.getOwner());
|
newExternalAssetOwnerTransfer.setOwner(externalAssetOwnerTransfer.getOwner());
|
||||||
newExternalAssetOwnerTransfer.setOwnerId(externalAssetOwnerTransfer.getOwnerId());
|
|
||||||
newExternalAssetOwnerTransfer.setExternalId(externalAssetOwnerTransfer.getExternalId());
|
newExternalAssetOwnerTransfer.setExternalId(externalAssetOwnerTransfer.getExternalId());
|
||||||
newExternalAssetOwnerTransfer.setStatus(status);
|
newExternalAssetOwnerTransfer.setStatus(status);
|
||||||
newExternalAssetOwnerTransfer.setSubStatus(subStatus);
|
newExternalAssetOwnerTransfer.setSubStatus(subStatus);
|
||||||
|
|||||||
+1
@@ -27,6 +27,7 @@ public class ExternalTransferData {
|
|||||||
private Long transferId;
|
private Long transferId;
|
||||||
private ExternalTransferOwnerData owner;
|
private ExternalTransferOwnerData owner;
|
||||||
private ExternalTransferLoanMappingData loan;
|
private ExternalTransferLoanMappingData loan;
|
||||||
|
private ExternalTransferDataDetails details;
|
||||||
private String transferExternalId;
|
private String transferExternalId;
|
||||||
private String purchasePriceRatio;
|
private String purchasePriceRatio;
|
||||||
private LocalDate settlementDate;
|
private LocalDate settlementDate;
|
||||||
|
|||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.fineract.investor.data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ExternalTransferDataDetails {
|
||||||
|
|
||||||
|
private Long detailsId;
|
||||||
|
private BigDecimal totalOutstanding;
|
||||||
|
private BigDecimal totalPrincipalOutstanding;
|
||||||
|
private BigDecimal totalInterestOutstanding;
|
||||||
|
private BigDecimal totalFeeChargesOutstanding;
|
||||||
|
private BigDecimal totalPenaltyChargesOutstanding;
|
||||||
|
private BigDecimal totalOverpaid;
|
||||||
|
}
|
||||||
+6
-4
@@ -18,12 +18,14 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.fineract.investor.domain;
|
package org.apache.fineract.investor.domain;
|
||||||
|
|
||||||
|
import jakarta.persistence.CascadeType;
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.EnumType;
|
import jakarta.persistence.EnumType;
|
||||||
import jakarta.persistence.Enumerated;
|
import jakarta.persistence.Enumerated;
|
||||||
import jakarta.persistence.JoinColumn;
|
import jakarta.persistence.JoinColumn;
|
||||||
import jakarta.persistence.ManyToOne;
|
import jakarta.persistence.ManyToOne;
|
||||||
|
import jakarta.persistence.OneToOne;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -41,13 +43,13 @@ import org.apache.fineract.investor.data.ExternalTransferSubStatus;
|
|||||||
@Entity
|
@Entity
|
||||||
public class ExternalAssetOwnerTransfer extends AbstractAuditableWithUTCDateTimeCustom {
|
public class ExternalAssetOwnerTransfer extends AbstractAuditableWithUTCDateTimeCustom {
|
||||||
|
|
||||||
@Column(name = "owner_id", nullable = false)
|
|
||||||
private Long ownerId;
|
|
||||||
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "owner_id", insertable = false, updatable = false, nullable = false)
|
@JoinColumn(name = "owner_id", nullable = false)
|
||||||
private ExternalAssetOwner owner;
|
private ExternalAssetOwner owner;
|
||||||
|
|
||||||
|
@OneToOne(mappedBy = "externalAssetOwnerTransfer", cascade = CascadeType.ALL)
|
||||||
|
private ExternalAssetOwnerTransferDetails externalAssetOwnerTransferDetails;
|
||||||
|
|
||||||
@Column(name = "external_id", length = 100, nullable = false)
|
@Column(name = "external_id", length = 100, nullable = false)
|
||||||
private ExternalId externalId;
|
private ExternalId externalId;
|
||||||
|
|
||||||
|
|||||||
+61
@@ -0,0 +1,61 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.fineract.investor.domain;
|
||||||
|
|
||||||
|
import jakarta.persistence.CascadeType;
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.JoinColumn;
|
||||||
|
import jakarta.persistence.OneToOne;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Table(name = "m_external_asset_owner_transfer_details")
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Entity
|
||||||
|
public class ExternalAssetOwnerTransferDetails extends AbstractAuditableWithUTCDateTimeCustom {
|
||||||
|
|
||||||
|
@OneToOne(cascade = CascadeType.ALL)
|
||||||
|
@JoinColumn(name = "asset_owner_transfer_id", referencedColumnName = "id")
|
||||||
|
private ExternalAssetOwnerTransfer externalAssetOwnerTransfer;
|
||||||
|
|
||||||
|
@Column(name = "total_outstanding_derived", scale = 6, precision = 19, nullable = false)
|
||||||
|
private BigDecimal totalOutstanding;
|
||||||
|
|
||||||
|
@Column(name = "principal_outstanding_derived", scale = 6, precision = 19, nullable = false)
|
||||||
|
private BigDecimal totalPrincipalOutstanding;
|
||||||
|
|
||||||
|
@Column(name = "interest_outstanding_derived", scale = 6, precision = 19, nullable = false)
|
||||||
|
private BigDecimal totalInterestOutstanding;
|
||||||
|
|
||||||
|
@Column(name = "fee_charges_outstanding_derived", scale = 6, precision = 19, nullable = false)
|
||||||
|
private BigDecimal totalFeeChargesOutstanding;
|
||||||
|
|
||||||
|
@Column(name = "penalty_charges_outstanding_derived", scale = 6, precision = 19, nullable = false)
|
||||||
|
private BigDecimal totalPenaltyChargesOutstanding;
|
||||||
|
|
||||||
|
@Column(name = "total_overpaid_derived", scale = 6, precision = 19, nullable = false)
|
||||||
|
private BigDecimal totalOverpaid;
|
||||||
|
}
|
||||||
+6
@@ -20,9 +20,11 @@ package org.apache.fineract.investor.service;
|
|||||||
|
|
||||||
import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
|
import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
|
||||||
import org.apache.fineract.investor.data.ExternalTransferData;
|
import org.apache.fineract.investor.data.ExternalTransferData;
|
||||||
|
import org.apache.fineract.investor.data.ExternalTransferDataDetails;
|
||||||
import org.apache.fineract.investor.data.ExternalTransferOwnerData;
|
import org.apache.fineract.investor.data.ExternalTransferOwnerData;
|
||||||
import org.apache.fineract.investor.domain.ExternalAssetOwner;
|
import org.apache.fineract.investor.domain.ExternalAssetOwner;
|
||||||
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransfer;
|
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransfer;
|
||||||
|
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransferDetails;
|
||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.Mapping;
|
import org.mapstruct.Mapping;
|
||||||
|
|
||||||
@@ -39,8 +41,12 @@ public interface ExternalAssetOwnersTransferMapper {
|
|||||||
@Mapping(target = "purchasePriceRatio", source = "purchasePriceRatio")
|
@Mapping(target = "purchasePriceRatio", source = "purchasePriceRatio")
|
||||||
@Mapping(target = "settlementDate", source = "settlementDate")
|
@Mapping(target = "settlementDate", source = "settlementDate")
|
||||||
@Mapping(target = "status", source = "status")
|
@Mapping(target = "status", source = "status")
|
||||||
|
@Mapping(target = "details", source = "externalAssetOwnerTransferDetails")
|
||||||
ExternalTransferData mapTransfer(ExternalAssetOwnerTransfer source);
|
ExternalTransferData mapTransfer(ExternalAssetOwnerTransfer source);
|
||||||
|
|
||||||
ExternalTransferOwnerData mapOwner(ExternalAssetOwner source);
|
ExternalTransferOwnerData mapOwner(ExternalAssetOwner source);
|
||||||
|
|
||||||
|
@Mapping(target = "detailsId", source = "id")
|
||||||
|
ExternalTransferDataDetails mapDetails(ExternalAssetOwnerTransferDetails details);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -144,7 +144,7 @@ public class ExternalAssetOwnersWriteServiceImpl implements ExternalAssetOwnersW
|
|||||||
|
|
||||||
ExternalAssetOwnerTransfer externalAssetOwnerTransfer = new ExternalAssetOwnerTransfer();
|
ExternalAssetOwnerTransfer externalAssetOwnerTransfer = new ExternalAssetOwnerTransfer();
|
||||||
externalAssetOwnerTransfer.setExternalId(externalId);
|
externalAssetOwnerTransfer.setExternalId(externalId);
|
||||||
externalAssetOwnerTransfer.setOwnerId(effectiveTransfer.getOwnerId());
|
externalAssetOwnerTransfer.setOwner(effectiveTransfer.getOwner());
|
||||||
externalAssetOwnerTransfer.setStatus(ExternalTransferStatus.BUYBACK);
|
externalAssetOwnerTransfer.setStatus(ExternalTransferStatus.BUYBACK);
|
||||||
externalAssetOwnerTransfer.setLoanId(effectiveTransfer.getLoanId());
|
externalAssetOwnerTransfer.setLoanId(effectiveTransfer.getLoanId());
|
||||||
externalAssetOwnerTransfer.setExternalLoanId(effectiveTransfer.getExternalLoanId());
|
externalAssetOwnerTransfer.setExternalLoanId(effectiveTransfer.getExternalLoanId());
|
||||||
@@ -218,7 +218,6 @@ public class ExternalAssetOwnersWriteServiceImpl implements ExternalAssetOwnersW
|
|||||||
final JsonElement json = fromApiJsonHelper.parse(apiRequestBodyAsJson);
|
final JsonElement json = fromApiJsonHelper.parse(apiRequestBodyAsJson);
|
||||||
|
|
||||||
ExternalAssetOwner owner = getOwner(json);
|
ExternalAssetOwner owner = getOwner(json);
|
||||||
externalAssetOwnerTransfer.setOwnerId(owner.getId());
|
|
||||||
externalAssetOwnerTransfer.setOwner(owner);
|
externalAssetOwnerTransfer.setOwner(owner);
|
||||||
externalAssetOwnerTransfer.setExternalId(getTransferExternalIdFromJson(json));
|
externalAssetOwnerTransfer.setExternalId(getTransferExternalIdFromJson(json));
|
||||||
externalAssetOwnerTransfer.setStatus(ExternalTransferStatus.PENDING);
|
externalAssetOwnerTransfer.setStatus(ExternalTransferStatus.PENDING);
|
||||||
|
|||||||
+1
@@ -28,4 +28,5 @@
|
|||||||
<include relativeToChangelogFile="true" file="parts/0004_change_purchase_price_ratio_type.xml"/>
|
<include relativeToChangelogFile="true" file="parts/0004_change_purchase_price_ratio_type.xml"/>
|
||||||
<include relativeToChangelogFile="true" file="parts/0005_add_sale_and_buyback_command.xml"/>
|
<include relativeToChangelogFile="true" file="parts/0005_add_sale_and_buyback_command.xml"/>
|
||||||
<include relativeToChangelogFile="true" file="parts/0006_asset_schemas.xml"/>
|
<include relativeToChangelogFile="true" file="parts/0006_asset_schemas.xml"/>
|
||||||
|
<include relativeToChangelogFile="true" file="parts/0007_add_external_asset_owner_transfer_details.xml"/>
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
|
|||||||
+118
@@ -0,0 +1,118 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
|
||||||
|
|
||||||
|
<!-- Create the m_external_asset_owner_transfer_details table -->
|
||||||
|
<changeSet author="fineract" id="1" context="postgresql">
|
||||||
|
<createTable tableName="m_external_asset_owner_transfer_details">
|
||||||
|
|
||||||
|
<column autoIncrement="true" name="id" type="BIGINT" remarks="Internal ID">
|
||||||
|
<constraints nullable="false" primaryKey="true"/>
|
||||||
|
</column>
|
||||||
|
|
||||||
|
<column name="asset_owner_transfer_id" type="BIGINT" remarks="Id of asset owner transfer">
|
||||||
|
<constraints nullable="false" unique="true"
|
||||||
|
uniqueConstraintName="UQ_external_asset_owner_transfer_id"/>
|
||||||
|
</column>
|
||||||
|
|
||||||
|
<column name="total_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="principal_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="interest_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="fee_charges_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="penalty_charges_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="total_overpaid_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
|
||||||
|
<column name="created_by" type="BIGINT" />
|
||||||
|
<column name="created_on_utc" type="TIMESTAMP WITH TIME ZONE" />
|
||||||
|
<column name="last_modified_by" type="BIGINT" />
|
||||||
|
<column name="last_modified_on_utc" type="TIMESTAMP WITH TIME ZONE" />
|
||||||
|
</createTable>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
<changeSet author="fineract" id="1" context="mysql">
|
||||||
|
<createTable tableName="m_external_asset_owner_transfer_details">
|
||||||
|
|
||||||
|
<column autoIncrement="true" name="id" type="BIGINT" remarks="Internal ID">
|
||||||
|
<constraints nullable="false" primaryKey="true"/>
|
||||||
|
</column>
|
||||||
|
|
||||||
|
<column name="asset_owner_transfer_id" type="BIGINT" remarks="Id of asset owner transfer">
|
||||||
|
<constraints nullable="false" unique="true"
|
||||||
|
uniqueConstraintName="UQ_external_asset_owner_transfer_id"/>
|
||||||
|
</column>
|
||||||
|
|
||||||
|
<column name="total_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="principal_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="interest_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="fee_charges_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="penalty_charges_outstanding_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="total_overpaid_derived" type="DECIMAL(19, 6)">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
|
||||||
|
<column name="created_by" type="BIGINT" />
|
||||||
|
<column name="created_on_utc" type="DATETIME" />
|
||||||
|
<column name="last_modified_by" type="BIGINT" />
|
||||||
|
<column name="last_modified_on_utc" type="DATETIME" />
|
||||||
|
</createTable>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
<changeSet author="fineract" id="2">
|
||||||
|
<addForeignKeyConstraint baseColumnNames="created_by"
|
||||||
|
baseTableName="m_external_asset_owner_transfer_details"
|
||||||
|
constraintName="FK_external_asset_owner_transfer_details_created_by" deferrable="false"
|
||||||
|
initiallyDeferred="false"
|
||||||
|
onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
|
||||||
|
referencedTableName="m_appuser" validate="true"/>
|
||||||
|
<addForeignKeyConstraint baseColumnNames="last_modified_by"
|
||||||
|
baseTableName="m_external_asset_owner_transfer_details"
|
||||||
|
constraintName="FK_external_asset_owner_transfer_details_modified_by" deferrable="false"
|
||||||
|
initiallyDeferred="false"
|
||||||
|
onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
|
||||||
|
referencedTableName="m_appuser" validate="true"/>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
||||||
+2
@@ -167,6 +167,8 @@ public class LoanAccountOwnerTransferBusinessStepTest {
|
|||||||
// given
|
// given
|
||||||
final Loan loanForProcessing = Mockito.mock(Loan.class);
|
final Loan loanForProcessing = Mockito.mock(Loan.class);
|
||||||
when(loanForProcessing.getId()).thenReturn(1L);
|
when(loanForProcessing.getId()).thenReturn(1L);
|
||||||
|
LoanSummary loanSummary = Mockito.mock(LoanSummary.class);
|
||||||
|
when(loanForProcessing.getLoanSummary()).thenReturn(loanSummary);
|
||||||
ExternalAssetOwnerTransfer firstResponseItem = Mockito.mock(ExternalAssetOwnerTransfer.class);
|
ExternalAssetOwnerTransfer firstResponseItem = Mockito.mock(ExternalAssetOwnerTransfer.class);
|
||||||
ExternalAssetOwnerTransfer secondResponseItem = Mockito.mock(ExternalAssetOwnerTransfer.class);
|
ExternalAssetOwnerTransfer secondResponseItem = Mockito.mock(ExternalAssetOwnerTransfer.class);
|
||||||
when(firstResponseItem.getStatus()).thenReturn(ExternalTransferStatus.BUYBACK);
|
when(firstResponseItem.getStatus()).thenReturn(ExternalTransferStatus.BUYBACK);
|
||||||
|
|||||||
+4
-8
@@ -3213,7 +3213,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (loanTransaction.isRecoveryRepayment()
|
if (loanTransaction.isRecoveryRepayment()
|
||||||
&& loanTransaction.getAmount(loanCurrency()).getAmount().compareTo(getSummary().getTotalWrittenOff()) > 0) {
|
&& loanTransaction.getAmount(loanCurrency()).getAmount().compareTo(getLoanSummary().getTotalWrittenOff()) > 0) {
|
||||||
final String errorMessage = "The transaction amount cannot greater than the remaining written off amount.";
|
final String errorMessage = "The transaction amount cannot greater than the remaining written off amount.";
|
||||||
throw new InvalidLoanStateTransitionException("transaction", "cannot.be.greater.than.total.written.off", errorMessage);
|
throw new InvalidLoanStateTransitionException("transaction", "cannot.be.greater.than.total.written.off", errorMessage);
|
||||||
}
|
}
|
||||||
@@ -3884,13 +3884,13 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
|||||||
addLoanTransaction(mapEntry.getValue());
|
addLoanTransaction(mapEntry.getValue());
|
||||||
}
|
}
|
||||||
updateLoanSummaryDerivedFields();
|
updateLoanSummaryDerivedFields();
|
||||||
LoanTransaction loanTransaction = findlatestTransaction();
|
LoanTransaction loanTransaction = getLatestTransaction();
|
||||||
doPostLoanTransactionChecks(loanTransaction.getTransactionDate(), loanLifecycleStateMachine);
|
doPostLoanTransactionChecks(loanTransaction.getTransactionDate(), loanLifecycleStateMachine);
|
||||||
}
|
}
|
||||||
return changedTransactionDetail;
|
return changedTransactionDetail;
|
||||||
}
|
}
|
||||||
|
|
||||||
private LoanTransaction findlatestTransaction() {
|
public LoanTransaction getLatestTransaction() {
|
||||||
LoanTransaction transaction = null;
|
LoanTransaction transaction = null;
|
||||||
for (LoanTransaction loanTransaction : this.loanTransactions) {
|
for (LoanTransaction loanTransaction : this.loanTransactions) {
|
||||||
if (!loanTransaction.isReversed()
|
if (!loanTransaction.isReversed()
|
||||||
@@ -4472,10 +4472,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
|||||||
return this.loanOfficer;
|
return this.loanOfficer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LoanSummary getSummary() {
|
|
||||||
return this.summary;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<LoanCollateral> getCollateral() {
|
public Set<LoanCollateral> getCollateral() {
|
||||||
return this.collateral;
|
return this.collateral;
|
||||||
}
|
}
|
||||||
@@ -6511,7 +6507,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
|||||||
|
|
||||||
public LoanRepaymentScheduleInstallment fetchLoanForeclosureDetail(final LocalDate closureDate) {
|
public LoanRepaymentScheduleInstallment fetchLoanForeclosureDetail(final LocalDate closureDate) {
|
||||||
Money[] receivables = retriveIncomeOutstandingTillDate(closureDate);
|
Money[] receivables = retriveIncomeOutstandingTillDate(closureDate);
|
||||||
Money totalPrincipal = Money.of(getCurrency(), this.getSummary().getTotalPrincipalOutstanding());
|
Money totalPrincipal = Money.of(getCurrency(), this.getLoanSummary().getTotalPrincipalOutstanding());
|
||||||
totalPrincipal = totalPrincipal.minus(receivables[3]);
|
totalPrincipal = totalPrincipal.minus(receivables[3]);
|
||||||
final Set<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
|
final Set<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
|
||||||
final LocalDate currentDate = DateUtils.getBusinessLocalDate();
|
final LocalDate currentDate = DateUtils.getBusinessLocalDate();
|
||||||
|
|||||||
+9
-9
@@ -249,25 +249,25 @@ public class LoanTransaction extends AbstractAuditableWithUTCDateTimeCustom {
|
|||||||
public static LoanTransaction initiateTransfer(final Office office, final Loan loan, final LocalDate transferDate,
|
public static LoanTransaction initiateTransfer(final Office office, final Loan loan, final LocalDate transferDate,
|
||||||
final ExternalId externalId) {
|
final ExternalId externalId) {
|
||||||
return new LoanTransaction(loan, office, LoanTransactionType.INITIATE_TRANSFER.getValue(), transferDate,
|
return new LoanTransaction(loan, office, LoanTransactionType.INITIATE_TRANSFER.getValue(), transferDate,
|
||||||
loan.getSummary().getTotalOutstanding(), loan.getSummary().getTotalPrincipalOutstanding(),
|
loan.getLoanSummary().getTotalOutstanding(), loan.getLoanSummary().getTotalPrincipalOutstanding(),
|
||||||
loan.getSummary().getTotalInterestOutstanding(), loan.getSummary().getTotalFeeChargesOutstanding(),
|
loan.getLoanSummary().getTotalInterestOutstanding(), loan.getLoanSummary().getTotalFeeChargesOutstanding(),
|
||||||
loan.getSummary().getTotalPenaltyChargesOutstanding(), null, false, null, externalId);
|
loan.getLoanSummary().getTotalPenaltyChargesOutstanding(), null, false, null, externalId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoanTransaction approveTransfer(final Office office, final Loan loan, final LocalDate transferDate,
|
public static LoanTransaction approveTransfer(final Office office, final Loan loan, final LocalDate transferDate,
|
||||||
final ExternalId externalId) {
|
final ExternalId externalId) {
|
||||||
return new LoanTransaction(loan, office, LoanTransactionType.APPROVE_TRANSFER.getValue(), transferDate,
|
return new LoanTransaction(loan, office, LoanTransactionType.APPROVE_TRANSFER.getValue(), transferDate,
|
||||||
loan.getSummary().getTotalOutstanding(), loan.getSummary().getTotalPrincipalOutstanding(),
|
loan.getLoanSummary().getTotalOutstanding(), loan.getLoanSummary().getTotalPrincipalOutstanding(),
|
||||||
loan.getSummary().getTotalInterestOutstanding(), loan.getSummary().getTotalFeeChargesOutstanding(),
|
loan.getLoanSummary().getTotalInterestOutstanding(), loan.getLoanSummary().getTotalFeeChargesOutstanding(),
|
||||||
loan.getSummary().getTotalPenaltyChargesOutstanding(), null, false, null, externalId);
|
loan.getLoanSummary().getTotalPenaltyChargesOutstanding(), null, false, null, externalId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoanTransaction withdrawTransfer(final Office office, final Loan loan, final LocalDate transferDate,
|
public static LoanTransaction withdrawTransfer(final Office office, final Loan loan, final LocalDate transferDate,
|
||||||
final ExternalId externalId) {
|
final ExternalId externalId) {
|
||||||
return new LoanTransaction(loan, office, LoanTransactionType.WITHDRAW_TRANSFER.getValue(), transferDate,
|
return new LoanTransaction(loan, office, LoanTransactionType.WITHDRAW_TRANSFER.getValue(), transferDate,
|
||||||
loan.getSummary().getTotalOutstanding(), loan.getSummary().getTotalPrincipalOutstanding(),
|
loan.getLoanSummary().getTotalOutstanding(), loan.getLoanSummary().getTotalPrincipalOutstanding(),
|
||||||
loan.getSummary().getTotalInterestOutstanding(), loan.getSummary().getTotalFeeChargesOutstanding(),
|
loan.getLoanSummary().getTotalInterestOutstanding(), loan.getLoanSummary().getTotalFeeChargesOutstanding(),
|
||||||
loan.getSummary().getTotalPenaltyChargesOutstanding(), null, false, null, externalId);
|
loan.getLoanSummary().getTotalPenaltyChargesOutstanding(), null, false, null, externalId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoanTransaction refund(final Office office, final Money amount, final PaymentDetail paymentDetail,
|
public static LoanTransaction refund(final Office office, final Money amount, final PaymentDetail paymentDetail,
|
||||||
|
|||||||
@@ -71,6 +71,7 @@
|
|||||||
<class>org.apache.fineract.investor.domain.ExternalAssetOwner</class>
|
<class>org.apache.fineract.investor.domain.ExternalAssetOwner</class>
|
||||||
<class>org.apache.fineract.investor.domain.ExternalAssetOwnerTransfer</class>
|
<class>org.apache.fineract.investor.domain.ExternalAssetOwnerTransfer</class>
|
||||||
<class>org.apache.fineract.investor.domain.ExternalAssetOwnerTransferLoanMapping</class>
|
<class>org.apache.fineract.investor.domain.ExternalAssetOwnerTransferLoanMapping</class>
|
||||||
|
<class>org.apache.fineract.investor.domain.ExternalAssetOwnerTransferDetails</class>
|
||||||
<!-- Fineract loan module -->
|
<!-- Fineract loan module -->
|
||||||
<class>org.apache.fineract.portfolio.collateral.domain.LoanCollateral</class>
|
<class>org.apache.fineract.portfolio.collateral.domain.LoanCollateral</class>
|
||||||
<class>org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagement</class>
|
<class>org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagement</class>
|
||||||
|
|||||||
+33
@@ -19,6 +19,8 @@
|
|||||||
package org.apache.fineract.integrationtests.investor.externalassetowner;
|
package org.apache.fineract.integrationtests.investor.externalassetowner;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
@@ -124,6 +126,13 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
JsonPath.from(loanDetails).get("netDisbursalAmount").toString());
|
JsonPath.from(loanDetails).get("netDisbursalAmount").toString());
|
||||||
LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
|
LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
|
||||||
|
|
||||||
|
// Add Charge Penalty
|
||||||
|
Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec,
|
||||||
|
ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "10", true));
|
||||||
|
Integer penalty1LoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanID,
|
||||||
|
LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty), "02 March 2020", "10"));
|
||||||
|
assertNotNull(penalty1LoanChargeId);
|
||||||
|
|
||||||
String transferExternalId = UUID.randomUUID().toString();
|
String transferExternalId = UUID.randomUUID().toString();
|
||||||
PostInitiateTransferResponse saleResponse = externalAssetOwnerHelper.initiateTransferByLoanId(loanID.longValue(), "sale",
|
PostInitiateTransferResponse saleResponse = externalAssetOwnerHelper.initiateTransferByLoanId(loanID.longValue(), "sale",
|
||||||
new PostInitiateTransferRequest().settlementDate("2020-03-02").dateFormat("yyyy-MM-dd").locale("en")
|
new PostInitiateTransferRequest().settlementDate("2020-03-02").dateFormat("yyyy-MM-dd").locale("en")
|
||||||
@@ -154,12 +163,14 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
externalTransferData = retrieveResponse.getContent().get(1);
|
externalTransferData = retrieveResponse.getContent().get(1);
|
||||||
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
||||||
assertEquals(ExternalTransferData.StatusEnum.ACTIVE, externalTransferData.getStatus());
|
assertEquals(ExternalTransferData.StatusEnum.ACTIVE, externalTransferData.getStatus());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
||||||
|
validateExternalTransferDataDetailsWithPenalty(externalTransferData);
|
||||||
|
|
||||||
String buybackTransferExternalId = "36efeb06-d835-48a1-99eb-09bd1d348c1e";
|
String buybackTransferExternalId = "36efeb06-d835-48a1-99eb-09bd1d348c1e";
|
||||||
PostInitiateTransferResponse buybackResponse = externalAssetOwnerHelper.initiateTransferByLoanId(loanID.longValue(), "buyback",
|
PostInitiateTransferResponse buybackResponse = externalAssetOwnerHelper.initiateTransferByLoanId(loanID.longValue(), "buyback",
|
||||||
@@ -177,18 +188,21 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
externalTransferData = retrieveResponse.getContent().get(1);
|
externalTransferData = retrieveResponse.getContent().get(1);
|
||||||
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
||||||
assertEquals(ExternalTransferData.StatusEnum.ACTIVE, externalTransferData.getStatus());
|
assertEquals(ExternalTransferData.StatusEnum.ACTIVE, externalTransferData.getStatus());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
||||||
|
validateExternalTransferDataDetailsWithPenalty(externalTransferData);
|
||||||
externalTransferData = retrieveResponse.getContent().get(2);
|
externalTransferData = retrieveResponse.getContent().get(2);
|
||||||
assertEquals(buybackTransferExternalId, externalTransferData.getTransferExternalId());
|
assertEquals(buybackTransferExternalId, externalTransferData.getTransferExternalId());
|
||||||
assertEquals(ExternalTransferData.StatusEnum.BUYBACK, externalTransferData.getStatus());
|
assertEquals(ExternalTransferData.StatusEnum.BUYBACK, externalTransferData.getStatus());
|
||||||
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
|
|
||||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 4));
|
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 4));
|
||||||
|
|
||||||
@@ -202,18 +216,21 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
externalTransferData = retrieveResponse.getContent().get(1);
|
externalTransferData = retrieveResponse.getContent().get(1);
|
||||||
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
||||||
assertEquals(ExternalTransferData.StatusEnum.ACTIVE, externalTransferData.getStatus());
|
assertEquals(ExternalTransferData.StatusEnum.ACTIVE, externalTransferData.getStatus());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveTo());
|
||||||
|
validateExternalTransferDataDetailsWithPenalty(externalTransferData);
|
||||||
externalTransferData = retrieveResponse.getContent().get(2);
|
externalTransferData = retrieveResponse.getContent().get(2);
|
||||||
assertEquals(buybackTransferExternalId, externalTransferData.getTransferExternalId());
|
assertEquals(buybackTransferExternalId, externalTransferData.getTransferExternalId());
|
||||||
assertEquals(ExternalTransferData.StatusEnum.BUYBACK, externalTransferData.getStatus());
|
assertEquals(ExternalTransferData.StatusEnum.BUYBACK, externalTransferData.getStatus());
|
||||||
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(2020, 3, 3), externalTransferData.getEffectiveTo());
|
||||||
|
validateExternalTransferDataDetailsWithPenalty(externalTransferData);
|
||||||
} finally {
|
} finally {
|
||||||
requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
|
requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
|
||||||
requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
|
requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
|
||||||
@@ -223,6 +240,16 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void validateExternalTransferDataDetailsWithPenalty(ExternalTransferData externalTransferData) {
|
||||||
|
assertNotNull(externalTransferData.getDetails());
|
||||||
|
assertEquals(new BigDecimal("15767.420000"), externalTransferData.getDetails().getTotalOutstanding());
|
||||||
|
assertEquals(new BigDecimal("15000.000000"), externalTransferData.getDetails().getTotalPrincipalOutstanding());
|
||||||
|
assertEquals(new BigDecimal("757.420000"), externalTransferData.getDetails().getTotalInterestOutstanding());
|
||||||
|
assertEquals(new BigDecimal("10.000000"), externalTransferData.getDetails().getTotalPenaltyChargesOutstanding());
|
||||||
|
assertEquals(new BigDecimal("0.000000"), externalTransferData.getDetails().getTotalFeeChargesOutstanding());
|
||||||
|
assertEquals(new BigDecimal("0.000000"), externalTransferData.getDetails().getTotalOverpaid());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void saleIsNotAllowedWhenTransferIsAlreadyPending() {
|
public void saleIsNotAllowedWhenTransferIsAlreadyPending() {
|
||||||
try {
|
try {
|
||||||
@@ -386,12 +413,14 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
externalTransferData = retrieveResponse.getContent().get(1);
|
externalTransferData = retrieveResponse.getContent().get(1);
|
||||||
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
||||||
assertEquals(ExternalTransferData.StatusEnum.BUYBACK, externalTransferData.getStatus());
|
assertEquals(ExternalTransferData.StatusEnum.BUYBACK, externalTransferData.getStatus());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(9999, 12, 31), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
|
|
||||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 3));
|
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 3));
|
||||||
final String jobName = "Loan COB";
|
final String jobName = "Loan COB";
|
||||||
@@ -405,24 +434,28 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
externalTransferData = retrieveResponse.getContent().get(1);
|
externalTransferData = retrieveResponse.getContent().get(1);
|
||||||
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
||||||
assertEquals(ExternalTransferData.StatusEnum.BUYBACK, externalTransferData.getStatus());
|
assertEquals(ExternalTransferData.StatusEnum.BUYBACK, externalTransferData.getStatus());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
externalTransferData = retrieveResponse.getContent().get(2);
|
externalTransferData = retrieveResponse.getContent().get(2);
|
||||||
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
||||||
assertEquals(ExternalTransferData.StatusEnum.CANCELLED, externalTransferData.getStatus());
|
assertEquals(ExternalTransferData.StatusEnum.CANCELLED, externalTransferData.getStatus());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
externalTransferData = retrieveResponse.getContent().get(3);
|
externalTransferData = retrieveResponse.getContent().get(3);
|
||||||
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
assertEquals(transferExternalId, externalTransferData.getTransferExternalId());
|
||||||
assertEquals(ExternalTransferData.StatusEnum.CANCELLED, externalTransferData.getStatus());
|
assertEquals(ExternalTransferData.StatusEnum.CANCELLED, externalTransferData.getStatus());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getSettlementDate());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveFrom());
|
||||||
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
assertEquals(LocalDate.of(2020, 3, 2), externalTransferData.getEffectiveTo());
|
||||||
|
assertNull(externalTransferData.getDetails());
|
||||||
} finally {
|
} finally {
|
||||||
requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
|
requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
|
||||||
requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
|
requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
|
||||||
|
|||||||
Reference in New Issue
Block a user