• File: BasePaymentStatusModel.php
  • Full Path: /var/www/html/back/app/BaseClasses/BasePaymentStatusModel.php
  • File size: 6.76 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

declare(strict_types=1);

namespace App\BaseClasses;

use App\Domain\Payment\Enums\PaymentStatusEnum;
use App\Domain\Payment\Enums\PaymentTypeEnum;
use App\Domain\Payment\StatusModels\EmptyStatusModel;
use App\Domain\Payment\StatusModels\Issueance\IssueanceAgreeOneTwoStatusModel;
use App\Domain\Payment\StatusModels\Issueance\IssueanceAgreeTwoTwoStatusModel;
use App\Domain\Payment\StatusModels\Issueance\IssueanceApproveStatusModel;
use App\Domain\Payment\StatusModels\Issueance\IssueanceDraftStatusModel;
use App\Domain\Payment\StatusModels\Issueance\IssueanceFinalizeStatusModel;
use App\Domain\Payment\StatusModels\Issueance\IssueanceIssuedModel;
use App\Domain\Payment\StatusModels\Issueance\IssueanceIssueModel;
use App\Domain\Payment\StatusModels\Moving\MovingApproveOneTwoStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingApproveStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingApproveTwoTwoStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingDraftStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingFinalizeOneTwoStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingFinalizeStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingFinalizeTwoTwoStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingMovingStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingPayStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingReceivedStatusModel;
use App\Domain\Payment\StatusModels\Moving\MovingSentStatusModel;
use App\Domain\Payment\StatusModels\Payment\PaymentApproveOneTwoStatusModel;
use App\Domain\Payment\StatusModels\Payment\PaymentApproveStatusModel;
use App\Domain\Payment\StatusModels\Payment\PaymentApproveTwoTwoStatusModel;
use App\Domain\Payment\StatusModels\Payment\PaymentDraftStatusModel;
use App\Domain\Payment\StatusModels\Payment\PaymentFinalizeOneTwoStatusModel;
use App\Domain\Payment\StatusModels\Payment\PaymentFinalizeStatusModel;
use App\Domain\Payment\StatusModels\Payment\PaymentFinalizeTwoTwoStatusModel;
use App\Domain\Payment\StatusModels\Payment\PaymentPaidStatusModel;
use App\Domain\Payment\StatusModels\Payment\PayStatusModel;
use App\Domain\Payment\StatusModels\Payment\SentStatusModel;
use App\Domain\Payment\StatusModels\Reception\ReceptionDraftStatusModel;
use App\Domain\Payment\StatusModels\Reception\ReceptionReceivedStatusModel;

abstract class BasePaymentStatusModel
{
    public function __construct(public PaymentStatusEnum $status, PaymentTypeEnum $type)
    {
        /*_*/
    }

    abstract public function getNextStatus(): ?PaymentStatusEnum;
    abstract public function getPreviousStatus(): ?PaymentStatusEnum;
    abstract public function getRollBackStatus(): ?PaymentStatusEnum;

    public function canChangeStatus(PaymentStatusEnum $newStatus): bool
    {
        return in_array($newStatus, $this->getAvailableStatuses(), true);
    }


    /**
     * @return string[]
     */
    abstract public function getAvailableStatuses(): array;

    /**
     * @throws \Exception
     */
    public static function getModelFromStatus(?PaymentStatusEnum $status, ?PaymentTypeEnum $type): BasePaymentStatusModel
    {
        $models = [
            PaymentTypeEnum::PAYMENT_TYPE_PAYMENT->value => [
                PaymentStatusEnum::STATUS_DRAFT->value => PaymentDraftStatusModel::class,
                PaymentStatusEnum::STATUS_FINALIZE->value => PaymentFinalizeStatusModel::class,
                PaymentStatusEnum::STATUS_FINALIZE_ONE_TWO->value => PaymentFinalizeOneTwoStatusModel::class,
                PaymentStatusEnum::STATUS_FINALIZE_TWO_TWO->value => PaymentFinalizeTwoTwoStatusModel::class,
                PaymentStatusEnum::STATUS_APPROVE->value => PaymentApproveStatusModel::class,
                PaymentStatusEnum::STATUS_AGREE_ONE_TWO->value => PaymentApproveOneTwoStatusModel::class,
                PaymentStatusEnum::STATUS_AGREE_TWO_TWO->value => PaymentApproveTwoTwoStatusModel::class,
                PaymentStatusEnum::STATUS_SENT->value => SentStatusModel::class,
                PaymentStatusEnum::STATUS_PAY->value => PayStatusModel::class,
                PaymentStatusEnum::STATUS_PAID->value => PaymentPaidStatusModel::class,
            ],
            PaymentTypeEnum::PAYMENT_TYPE_RECEPTION->value => [
                PaymentStatusEnum::STATUS_DRAFT->value => ReceptionDraftStatusModel::class,
                PaymentStatusEnum::STATUS_RECEIVED->value => ReceptionReceivedStatusModel::class
            ],
            PaymentTypeEnum::PAYMENT_TYPE_ISSUEANCE->value => [
                PaymentStatusEnum::STATUS_DRAFT->value => IssueanceDraftStatusModel::class,
                PaymentStatusEnum::STATUS_APPROVE->value => IssueanceApproveStatusModel::class,
                PaymentStatusEnum::STATUS_FINALIZE->value => IssueanceFinalizeStatusModel::class,
                PaymentStatusEnum::STATUS_AGREE_ONE_TWO->value => IssueanceAgreeOneTwoStatusModel::class,
                PaymentStatusEnum::STATUS_FINALIZE_ONE_TWO->value => IssueanceAgreeOneTwoStatusModel::class,
                PaymentStatusEnum::STATUS_FINALIZE_TWO_TWO->value => IssueanceAgreeTwoTwoStatusModel::class,
                PaymentStatusEnum::STATUS_AGREE_TWO_TWO->value => IssueanceAgreeTwoTwoStatusModel::class,
                PaymentStatusEnum::STATUS_ISSUE->value => IssueanceIssueModel::class,
                PaymentStatusEnum::STATUS_ISSUED->value => IssueanceIssuedModel::class,
            ],
            PaymentTypeEnum::PAYMENT_TYPE_MOVING->value => [
                PaymentStatusEnum::STATUS_DRAFT->value => MovingDraftStatusModel::class,
                PaymentStatusEnum::STATUS_APPROVE->value => MovingApproveStatusModel::class,
                PaymentStatusEnum::STATUS_FINALIZE->value => MovingFinalizeStatusModel::class,
                PaymentStatusEnum::STATUS_AGREE_ONE_TWO->value => MovingApproveOneTwoStatusModel::class,
                PaymentStatusEnum::STATUS_AGREE_TWO_TWO->value => MovingApproveTwoTwoStatusModel::class,
                PaymentStatusEnum::STATUS_FINALIZE_ONE_TWO->value => MovingFinalizeOneTwoStatusModel::class,
                PaymentStatusEnum::STATUS_FINALIZE_TWO_TWO->value => MovingFinalizeTwoTwoStatusModel::class,
                PaymentStatusEnum::STATUS_PAY->value => MovingPayStatusModel::class,
                PaymentStatusEnum::STATUS_SENT->value => MovingSentStatusModel::class,
                PaymentStatusEnum::STATUS_MOVING->value => MovingMovingStatusModel::class,
                PaymentStatusEnum::STATUS_RECEIVED->value => MovingReceivedStatusModel::class,
            ],
        ];
        if ($type && $status) {
            $class = $models[$type->value][$status->value] ?? null;
            if ($class) {
                return new $class($status, $type);
            }
        }

        return new EmptyStatusModel(PaymentStatusEnum::STATUS_PAID, PaymentTypeEnum::PAYMENT_TYPE_PAYMENT);
    }
}