<?php declare(strict_types=1);
namespace PPAdmin\AdminSections\PaymentRequests;
use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\Administrator;
use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\Common\DefaultEntity;
use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\PaymentRequest;
use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\Web;
use PlnaPenezenka\PPSDKBundle\Enums\PaymentRequestStates;
use PPAdmin\AdminSections\AdminSectionsList;
use PPAdmin\Security\AbstractAdminGridSectionVoter;
class PaymentsRequestsVoter extends AbstractAdminGridSectionVoter
{
const SECTION_PERMISSION_REVERT_STATUS = '.revert-status';
const SECTION_PERMISSION_APPROVE = '.approve';
public static function getSectionIdentifier(): string
{
return AdminSectionsList::PAYMENT_REQUESTS;
}
function getSupportedPermissionsNames(bool $only_configurable = false): array
{
$names = parent::getSupportedPermissionsNames($only_configurable);
if($only_configurable){
unset($names[static::getPermission(self::SECTION_PERMISSION_CREATE)]);
unset($names[static::getPermission(self::SECTION_PERMISSION_REVERT_STATUS)]);
unset($names[static::getPermission(self::SECTION_PERMISSION_APPROVE)]);
}
return $names;
}
protected function voteOnSectionPermission(Administrator $admin, string $section_permission, $subject = null): bool
{
return match ($section_permission){
self::SECTION_PERMISSION_REVERT_STATUS => $subject instanceof PaymentRequest && $this->canRevertStatus($admin, $subject),
self::SECTION_PERMISSION_APPROVE => $subject instanceof PaymentRequest && $this->canApprove($admin, $subject),
default => parent::voteOnSectionPermission($admin, $section_permission, $subject)
};
}
function canCreateSectionRecords(Administrator $admin, Web $web): bool
{
return false;
}
function canEditRecord(Administrator $admin, DefaultEntity $record): bool
{
/** @var $record PaymentRequest */
if(!parent::canEditRecord($admin, $record)){
return false;
}
return $record->status === PaymentRequestStates::STATUS_NEW;
}
function canApprove(Administrator $admin, PaymentRequest $request): bool
{
return
$this->canEditRecord($admin, $request) &&
$request->status === PaymentRequestStates::STATUS_NEW &&
$request->getTotalUserCommissionInUserCurrency() > 0.0
;
}
function canRevertStatus(Administrator $admin, PaymentRequest $request): bool
{
if(!$this->canViewSectionRecord($admin, $request)){
return false;
}
if(in_array(
$request->status,
[
PaymentRequestStates::STATUS_NEW, // nothing to revert
PaymentRequestStates::STATUS_PAYMENT_IN_PROGRESS, // cannot revert during payment
PaymentRequestStates::STATUS_PAYMENT_FINISHED, // cannot revert paid payment
]
)){
return false;
}
// payment will be executed in less than 15 seconds - do not allow to change status
if(
$request->status === PaymentRequestStates::STATUS_PAYMENT_SCHEDULED &&
$request->payment_scheduled_to_when < new \DateTime('+15 seconds')
){
return false;
}
// by admins wish they want to be able to revert scheduled, failed and paid requests
return true;
}
function canDeleteRecord(Administrator $admin, DefaultEntity $record): bool
{
if(!parent::canDeleteRecord($admin, $record)){
return false;
}
// only not paid and not in payment process
/** @var $record PaymentRequest */
return in_array(
$record->status,
[
PaymentRequestStates::STATUS_NEW,
PaymentRequestStates::STATUS_REJECTED,
PaymentRequestStates::STATUS_PAYMENT_FAILED,
]
);
}
}