All Downloads are FREE. Search and download functionalities are using the official Maven repository.

au.org.consumerdatastandards.holder.service.banking.BankingScheduledPaymentService Maven / Gradle / Ivy

The newest version!
package au.org.consumerdatastandards.holder.service.banking;

import au.org.consumerdatastandards.holder.model.banking.BankingProductCategory;
import au.org.consumerdatastandards.holder.model.banking.BankingScheduledPayment;
import au.org.consumerdatastandards.holder.model.banking.BankingScheduledPaymentFrom;
import au.org.consumerdatastandards.holder.model.banking.ParamAccountOpenStatus;
import au.org.consumerdatastandards.holder.repository.banking.BankingScheduledPaymentRepositoryV1;
import au.org.consumerdatastandards.holder.repository.banking.BankingScheduledPaymentRepositoryV2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;

@Service
public class BankingScheduledPaymentService {

    private final static Logger LOGGER = LoggerFactory.getLogger(BankingScheduledPaymentService.class);

    private final BankingScheduledPaymentRepositoryV1 bankingScheduledPaymentRepositoryV1;
    private final BankingScheduledPaymentRepositoryV2 bankingScheduledPaymentRepositoryV2;

    @Autowired
    public BankingScheduledPaymentService(BankingScheduledPaymentRepositoryV1 bankingScheduledPaymentRepositoryV1,
            BankingScheduledPaymentRepositoryV2 bankingScheduledPaymentRepositoryV2) {
        this.bankingScheduledPaymentRepositoryV1 = bankingScheduledPaymentRepositoryV1;
        this.bankingScheduledPaymentRepositoryV2 = bankingScheduledPaymentRepositoryV2;
    }

    public Page getBankingScheduledPayments(String accountId, Pageable pageable, int version) {
        LOGGER.debug("Retrieving banking scheduled payments by account id {}", accountId);
        BankingScheduledPaymentFrom from = new BankingScheduledPaymentFrom().accountId(accountId);
        switch (version) {
            case 1:
                return bankingScheduledPaymentRepositoryV1.findByFrom(from, pageable).map(payment -> payment);
            case 2:
            default:
                return bankingScheduledPaymentRepositoryV2.findByFrom(from, pageable).map(payment -> payment);
        }
    }

    public Page getBankingScheduledPayments(List accountIds, Pageable pageable, int version) {
        LOGGER.debug("Retrieving banking scheduled payments by account ids {}", accountIds);
        switch (version) {
            case 1:
                return bankingScheduledPaymentRepositoryV1.findAll(
                        new BankingScheduledPaymentSpecification<>(accountIds), pageable).map(payment -> payment);
            case 2:
            default:
                return bankingScheduledPaymentRepositoryV2.findAll(
                        new BankingScheduledPaymentSpecification<>(accountIds), pageable).map(payment -> payment);
        }
    }

    public Page getBankingScheduledPayments(
        BankingProductCategory productCategory,
        ParamAccountOpenStatus openStatus,
        Boolean isOwned,
        Pageable pageable,
        int version
    ) {
        LOGGER.debug("Retrieving {} banking scheduled payments by product category {}, open status {}",
            isOwned != null && isOwned ? "owned" : "all", productCategory, openStatus);
        switch (version) {
            case 1:
                return bankingScheduledPaymentRepositoryV1.findAll(
                        new BankingScheduledPaymentSpecification<>(productCategory, openStatus, isOwned), pageable).map(payment -> payment);
            case 2:
            default:
                return bankingScheduledPaymentRepositoryV2.findAll(
                        new BankingScheduledPaymentSpecification<>(productCategory, openStatus, isOwned), pageable).map(payment -> payment);
        }
    }
}

class BankingScheduledPaymentSpecification implements Specification {
    private List accountIds;
    private BankingProductCategory productCategory;
    private ParamAccountOpenStatus openStatus;
    private Boolean isOwned;

    BankingScheduledPaymentSpecification(List accountIds) {
        this.accountIds = accountIds;
    }

    BankingScheduledPaymentSpecification(BankingProductCategory productCategory, ParamAccountOpenStatus openStatus, Boolean isOwned) {
        this.productCategory = productCategory;
        this.openStatus = openStatus;
        this.isOwned = isOwned;
    }

    @Override
    public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) {
        List predicates = new ArrayList<>();
        if (accountIds != null) {
            predicates.add(root.get("from").get("accountId").in(accountIds));
        }
        if (openStatus != null) {
            if (productCategory != null) {
                predicates.add(criteriaBuilder.equal(root.get("from").get("bankingAccount").get("productCategory"), productCategory));
            }
            if (!ParamAccountOpenStatus.ALL.equals(openStatus)) {
                predicates.add(criteriaBuilder.equal(root.get("from").get("bankingAccount").get("openStatus"), openStatus));
            }
            //TODO process isOwned when security context is set
        }
        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy