/var/www/html/back/app/BaseClasses/BasePaymentStatusModel.php
<?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);
}
}