Covivo/mobicoop

View on GitHub
api/src/Incentive/Validator/SubscriptionValidator.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace App\Incentive\Validator;

use App\Incentive\Entity\LongDistanceSubscription;
use App\Incentive\Entity\ShortDistanceSubscription;
use App\Incentive\Entity\Subscription;
use App\Incentive\Entity\Subscription\SpecificFields;
use App\Service\DrivingLicenceService;
use App\Service\Phone\PhoneService;

abstract class SubscriptionValidator
{
    public const ALLOWED_PROPERTIES_TO_PATCH = [
        SpecificFields::DRIVING_LICENCE_NUMBER,
        SpecificFields::PHONE_NUMBER,
    ];

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function canSubscriptionBeRecommited($subscription): bool
    {
        return
            is_null($subscription->getStatus())
            && !static::isCommitmentJourneyEecCompliant($subscription);
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isCommitmentJourneyEecCompliant($subscription): bool
    {
        return
            !is_null($subscription->getCommitmentProofJourney())
            && $subscription->getCommitmentProofJourney()->isEECCompliant();
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isReadyToVerify($subscription): bool
    {
        return $subscription instanceof LongDistanceSubscription
            ? static::isLdReadyToVerify($subscription) : static::isSdReadyToVerify($subscription);
    }

    public static function isLdReadyToVerify(LongDistanceSubscription $subscription): bool
    {
        return
            !static::isValidated($subscription)
            && static::isPaymentProfileAvailable($subscription)
            && !$subscription->getJourneys()->isEmpty()
            && !is_null($subscription->getCommitmentProofJourney())
            && !is_null($subscription->getCommitmentProofJourney()->getCarpoolPayment())
            && CarpoolPaymentValidator::isEecCompliant($subscription->getCommitmentProofJourney()->getCarpoolPayment())
            && static::areTokensAvailable($subscription);
    }

    public static function isSdReadyToVerify(ShortDistanceSubscription $subscription): bool
    {
        return
            !static::isValidated($subscription)
            && static::isPaymentProfileAvailable($subscription)
            && !$subscription->getJourneys()->isEmpty()
            && !is_null($subscription->getCommitmentProofJourney())
            && !is_null($subscription->getCommitmentProofJourney()->getCarpoolProof())
            && CarpoolProofValidator::isEecCompliant($subscription->getCommitmentProofJourney()->getCarpoolProof())
            && static::areTokensAvailable($subscription);
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isPaymentProfileAvailable($subscription): bool
    {
        return
            !is_null($subscription->getUser())
            && $subscription->getUser()->hasBankingIdentityValidated();
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function areTokensAvailable($subscription): bool
    {
        return
            !is_null($subscription->getIncentiveProofTimestampToken())
            && !is_null($subscription->getIncentiveProofTimestampSigningTime())
            && !is_null($subscription->getCommitmentProofTimestampToken())
            && !is_null($subscription->getCommitmentProofTimestampSigningTime())
            && !is_null($subscription->getHonorCertificateProofTimestampToken())
            && !is_null($subscription->getHonorCertificateProofTimestampSigningTime());
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function hasExpired($subscription): bool
    {
        $now = new \DateTime('now');

        return
            !empty($subscription->getJourneys())
            && !is_null($subscription->getExpirationDate())
            && $subscription->getExpirationDate() < $now->sub(new \DateInterval('P'.$subscription->getValidityPeriodDuration().'M'));
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isAddressValid($subscription): bool
    {
        return
            static::isStreetAddressValid($subscription)
            && static::isPostalCodeValid($subscription)
            && static::isAddressLocalityValid($subscription);
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isStreetAddressValid($subscription): bool
    {
        return
            !is_null($subscription->getStreetAddress())
            && '' !== trim($subscription->getStreetAddress());
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isPostalCodeValid($subscription): bool
    {
        return preg_match('/^((1(A|B))|[0-9]{2})[0-9]{3}$/', $subscription->getPostalCode());
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isAddressLocalityValid($subscription): bool
    {
        return
            !is_null($subscription->getAddressLocality())
            && '' !== trim($subscription->getAddressLocality());
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isValidated($subscription): bool
    {
        return Subscription::STATUS_VALIDATED === $subscription->getStatus();
    }

    public static function canPropertyBePatched(string $property): bool
    {
        return in_array($property, static::ALLOWED_PROPERTIES_TO_PATCH);
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isDrivingLicenceNumberValid($subscription): bool
    {
        $validator = new DrivingLicenceService($subscription->getDrivingLicenceNumber());

        return $validator->isDrivingLicenceNumberValid();
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function isPhoneNumberValid($subscription): bool
    {
        $converter = new PhoneService($subscription->getTelephone());

        return preg_match('/^\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*(\d{1,2})$/', $converter->getInternationalPhoneNumber());
    }

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public static function hasBeenVerified($subscription): bool
    {
        return
            !is_null($subscription->getStatus())
            && (Subscription::STATUS_REJECTED === $subscription->getStatus() || Subscription::STATUS_VALIDATED === $subscription->getStatus());
    }
}