EligibilityAndEntitlementDecisionFactory.java

package uk.gov.dhsc.htbhf.claimant.service;

import org.springframework.stereotype.Component;
import uk.gov.dhsc.htbhf.claimant.entitlement.PaymentCycleVoucherEntitlement;
import uk.gov.dhsc.htbhf.claimant.model.eligibility.EligibilityAndEntitlementDecision;
import uk.gov.dhsc.htbhf.dwp.model.IdentityAndEligibilityResponse;
import uk.gov.dhsc.htbhf.eligibility.model.CombinedIdentityAndEligibilityResponse;
import uk.gov.dhsc.htbhf.eligibility.model.EligibilityStatus;

import static uk.gov.dhsc.htbhf.claimant.service.EligibilityOutcomeToEligibilityStatusConverter.fromEligibilityOutcome;

/**
 * Responsible for building {@link uk.gov.dhsc.htbhf.claimant.model.eligibility.EligibilityAndEntitlementDecision}s based
 * on the provided response object from DWP API call.
 */
@Component
public class EligibilityAndEntitlementDecisionFactory {

    /**
     * Builds a decision based on the given data. This will also store the existing claim id on the decision
     * which is indicative of an ineligible claim as there is already a matching live claim in the database.
     * We only return and store a voucher entitlement if the Claimant is ELIGIBLE which is determined from the {@link IdentityAndEligibilityResponse}
     *
     * @param identityAndEligibilityResponse    The response from DWP.
     * @param entitlement                       The already calculated entitlement.
     * @param duplicateHouseholdIdentifierFound Has a duplicate household identifier been found or not
     * @return The built decision.
     */
    public EligibilityAndEntitlementDecision buildDecision(CombinedIdentityAndEligibilityResponse identityAndEligibilityResponse,
                                                           PaymentCycleVoucherEntitlement entitlement,
                                                           boolean duplicateHouseholdIdentifierFound) {
        EligibilityStatus eligibilityStatus = determineEligibilityStatus(identityAndEligibilityResponse, entitlement, duplicateHouseholdIdentifierFound);
        PaymentCycleVoucherEntitlement voucherEntitlement = determinePaymentCycleVoucherEntitlementFromStatus(entitlement, eligibilityStatus);
        return EligibilityAndEntitlementDecision.builder()
                .eligibilityStatus(eligibilityStatus)
                .identityAndEligibilityResponse(identityAndEligibilityResponse)
                .voucherEntitlement(voucherEntitlement)
                .dwpHouseholdIdentifier(identityAndEligibilityResponse.getDwpHouseholdIdentifier())
                .hmrcHouseholdIdentifier(identityAndEligibilityResponse.getHmrcHouseholdIdentifier()).build();
    }

    private PaymentCycleVoucherEntitlement determinePaymentCycleVoucherEntitlementFromStatus(PaymentCycleVoucherEntitlement entitlement,
                                                                                             EligibilityStatus eligibilityStatus) {
        return (eligibilityStatus == EligibilityStatus.ELIGIBLE) ? entitlement : null;
    }

    private EligibilityStatus determineEligibilityStatus(CombinedIdentityAndEligibilityResponse response,
                                                         PaymentCycleVoucherEntitlement voucherEntitlement,
                                                         boolean duplicateHouseholdIdentifierFound) {
        if (response.isEligible() && voucherEntitlement.getTotalVoucherEntitlement() == 0) {
            return EligibilityStatus.INELIGIBLE;
        } else if (duplicateHouseholdIdentifierFound) {
            return EligibilityStatus.DUPLICATE;
        }
        return fromEligibilityOutcome(response.getEligibilityStatus());
    }

}