khalyomede/systempay

View on GitHub
src/Systempay/AuthorizationResult.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace Khalyomede\Systempay;

/**
 * This class helps normalizing error process accros different payment providers.
 *
 * For example, credit card providers and Elavon providers will have differents code for fraud, so this class helps to identify this kind of error no matter the payment provider.
 *
 * @see https://paiement.systempay.fr/doc/fr-FR/form-payment/standard-payment/vads-auth-result.html for more information.
 * @todo Implement Elavon Europe error codes
 * @todo Implement Amex Global error codes
 * @todo Implement GICC error codes
 */
class AuthorizationResult
{
    const CB_SUCCESS = "00";
    const CB_CONTACT_CARD_ISSUER = "02";
    const CB_INVALID_ACCEPTOR = "03";
    const CB_KEEP_CARD = "04";
    const CB_KEEP_CARD_WITH_SPECIAL_CONDITIONS = "07";
    const CB_DO_NOT_HONOR = "05";
    const CB_APPROVE_AFTER_IDENTIFICATION = "08";
    const CB_INVALID_TRANSACTION = "12";
    const CB_INVALID_AMOUNT = "13";
    const CB_INVALID_CARD_HOLDER_NUMBER = "14";
    const CB_UNKNOWN_CARD_ISSUER = "15";
    const CB_SHOPPER_CANCELED = "17";
    const CB_REPEAT_TRANSACTION_LATER = "19";
    const CB_RESPONSE_ERROR = "20";
    const CB_UNSUPPORTED_FILE_UPDATE = "24";
    const CB_RECORD_NOT_FOUND_IN_FILE = "25";
    const CB_DUPLICATED_RECORD = "26";
    const CB_ERROR_IN_EDIT_LIST_FILE = "27";
    const CB_FORBIDDEN_FILE_ACCESS = "28";
    const CB_UPDATE_NOT_POSSIBLE = "29";
    const CB_FORMAT_ERROR = "30";
    const CB_UNKNOWN_ACQUIRER_ORGANIZATION = "31";
    const CB_FRAUDULENT_EXPIRED_CARD_VALIDITY_DATE = "33";
    const CB_SUSPECTED_FRAUD = "34";
    const CB_EXPIRED_CARD_VALIDITY_DATE = "38";
    const CB_CARD_LOST = "41";
    const CB_STOLEN_CARD = "43";
    const CB_UNSUFFICIENT_CREDIT = "51";
    const CB_FRAUDULENT_EXPIRED_CARD_VALIDITY_DATE_2 = "54";
    const CB_WRONG_PIN = "55";
    const CB_UNKNOWN = "56";
    const CB_FRAUDULENT_TRANSACTION_NOT_PERMITTED_TO_SHOPPER = "57";
    const CB_TRANSACTION_NOT_PERMITTED_TO_SHOPPER = "58";
    const CB_SUSPECTED_FRAUD_2 = "59";
    const CB_CONTACT_CARD_ACQUIRER = "60";
    const CB_OUT_OF_LIMIT_WITHDRAWAL_AMOUNT = "61";
    const CB_SECURITY_RULES_NOT_RESPECTED = "63";
    const CB_NO_RESPONSE = "68";
    const CB_PIN_ATTEMPTS_EXCEEDED = "75";
    const CB_HOLDER_IN_OPPOSITION = "76";
    const CB_SYSTEM_SHUTDOWN = "90";
    const CB_CARD_ISSUER_UNREACHABLE = "91";
    const CB_DUPLICATED_TRANSACTION = "94";
    const CB_SYSTEM_MALFUNCTION = "96";
    const CB_GLOBAL_MONITORING_TIMEOUT_DEADLINE = "97";
    const CB_UNREACHABLE_SERVER = "98";
    const CB_INITIATOR_DOMAIN_INCIDENT = "99";

    /**
     * @var string
     */
    private $result;

    public function __construct(string $result)
    {
        $this->result = $result;
    }
    
    public function requiresToContactCardIssuer(): bool
    {
        return in_array($this->result, [
            self::CB_CONTACT_CARD_ISSUER,
        ]);
    }
    
    public function detectsSuccess(): bool
    {
        return in_array($this->result, [
            self::CB_SUCCESS,
        ]);
    }
    
    public function detectsInvalidAcceptor(): bool
    {
        return in_array($this->result, [
            self::CB_INVALID_ACCEPTOR,
        ]);
    }
    
    public function detectsInvalidTransaction(): bool
    {
        return in_array($this->result, [
            self::CB_INVALID_TRANSACTION,
        ]);
    }
    
    public function detectsInvalidAmount(): bool
    {
        return in_array($this->result, [
            self::CB_INVALID_AMOUNT,
        ]);
    }
    
    public function detectsInvalidCardHolderNumber(): bool
    {
        return in_array($this->result, [
            self::CB_INVALID_CARD_HOLDER_NUMBER,
        ]);
    }
    
    public function detectsShopperCanceled(): bool
    {
        return in_array($this->result, [
            self::CB_SHOPPER_CANCELED,
        ]);
    }
    
    public function detectsResponseError(): bool
    {
        return in_array($this->result, [
            self::CB_RESPONSE_ERROR,
            self::CB_UNSUPPORTED_FILE_UPDATE,
            self::CB_ERROR_IN_EDIT_LIST_FILE,
            self::CB_FORBIDDEN_FILE_ACCESS,
            self::CB_RECORD_NOT_FOUND_IN_FILE,
            self::CB_UPDATE_NOT_POSSIBLE,
            self::CB_FORMAT_ERROR,
            self::CB_DUPLICATED_RECORD,
            self::CB_NO_RESPONSE,
            self::CB_SYSTEM_SHUTDOWN,
            self::CB_CARD_ISSUER_UNREACHABLE,
            self::CB_DUPLICATED_RECORD,
            self::CB_SYSTEM_MALFUNCTION,
            self::CB_GLOBAL_MONITORING_TIMEOUT_DEADLINE,
            self::CB_UNREACHABLE_SERVER,
            self::CB_INITIATOR_DOMAIN_INCIDENT,
        ]);
    }
    
    public function detectsExpiredCard(): bool
    {
        return in_array($this->result, [
            self::CB_FRAUDULENT_EXPIRED_CARD_VALIDITY_DATE,
            self::CB_EXPIRED_CARD_VALIDITY_DATE,
        ]);
    }
    
    public function detectsUnsufficientProvision(): bool
    {
        return in_array($this->result, [
            self::CB_UNSUFFICIENT_CREDIT,
            self::CB_OUT_OF_LIMIT_WITHDRAWAL_AMOUNT,
        ]);
    }
    
    public function detectsWrongPin(): bool
    {
        return in_array($this->result, [
            self::CB_WRONG_PIN,
        ]);
    }
    
    public function detectsTransactionNotPermitted(): bool
    {
        return in_array($this->result, [
            self::CB_TRANSACTION_NOT_PERMITTED_TO_SHOPPER,
        ]);
    }
    
    public function detectsPinAttemptsExceeded(): bool
    {
        return in_array($this->result, [
            self::CB_PIN_ATTEMPTS_EXCEEDED,
        ]);
    }
    
    public function requiresToKeepTheCard(): bool
    {
        return in_array($this->result, [
            self::CB_KEEP_CARD,
            self::CB_KEEP_CARD_WITH_SPECIAL_CONDITIONS,
        ]);
    }
    
    public function requiresToNotHonor(): bool
    {
        return in_array($this->result, [
            self::CB_DO_NOT_HONOR,
        ]);
    }
    
    public function requiresToApproveAfterIdentification(): bool
    {
        return in_array($this->result, [
            self::CB_KEEP_CARD_WITH_SPECIAL_CONDITIONS,
        ]);
    }
    
    public function requiresToRepeatTransactionLater(): bool
    {
        return in_array($this->result, [
            self::CB_REPEAT_TRANSACTION_LATER,
        ]);
    }
    
    public function requiresToContactAcquirer(): bool
    {
        return in_array($this->result, [
            self::CB_CONTACT_CARD_ACQUIRER,
        ]);
    }
    
    public function isFraudulentResult(): bool
    {
        return in_array($this->result, [
            self::CB_INVALID_ACCEPTOR,
            self::CB_KEEP_CARD,
            self::CB_KEEP_CARD_WITH_SPECIAL_CONDITIONS,
            self::CB_DO_NOT_HONOR,
            self::CB_INVALID_TRANSACTION,
            self::CB_INVALID_AMOUNT,
            self::CB_INVALID_CARD_HOLDER_NUMBER,
            self::CB_UNKNOWN_CARD_ISSUER,
            self::CB_UNKNOWN_ACQUIRER_ORGANIZATION,
            self::CB_FRAUDULENT_EXPIRED_CARD_VALIDITY_DATE,
            self::CB_SUSPECTED_FRAUD,
            self::CB_SUSPECTED_FRAUD_2,
            self::CB_CARD_LOST,
            self::CB_STOLEN_CARD,
            self::CB_FRAUDULENT_EXPIRED_CARD_VALIDITY_DATE_2,
            self::CB_UNKNOWN,
            self::CB_FRAUDULENT_TRANSACTION_NOT_PERMITTED_TO_SHOPPER,
            self::CB_SECURITY_RULES_NOT_RESPECTED,
            self::CB_HOLDER_IN_OPPOSITION,
        ]);
    }
}