<?php declare(strict_types=1);
namespace PPAdmin\AdminSections\Transactions;
use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\Administrator;
use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\Common\DefaultEntity;
use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\Transaction;
use PPAdmin\AdminSections\AdminSectionsList;
use PPAdmin\Security\AbstractAdminGridSectionVoter;
class TransactionsVoter extends AbstractAdminGridSectionVoter
{
const SECTION_PERMISSION_CONFIRM_TRANSACTION = '.confirm-transaction';
const SECTION_PERMISSION_REVERT_TRANSACTION_CONFIRM = '.revert-transaction-confirm';
const SECTION_PERMISSION_ABORT_TRANSACTION = '.abort-transaction';
const SECTION_PERMISSION_REVERT_TRANSACTION_ABORT = '.revert-transaction-abort';
public static function getSectionIdentifier(): string
{
return AdminSectionsList::TRANSACTIONS;
}
function canDeleteRecord(Administrator $admin, DefaultEntity $record): bool
{
if(!parent::canDeleteRecord($admin, $record)){
return false;
}
/** @var $record Transaction */
if(!$record->created_by_admin || $record->confirmed){
// only human-created may be deleted before confirmed
return false;
}
return true;
}
protected function voteOnSectionPermission(Administrator $admin, string $section_permission, $subject = null): bool
{
return match($section_permission) {
self::SECTION_PERMISSION_CONFIRM_TRANSACTION => $this->canConfirmTransaction($admin, $subject),
self::SECTION_PERMISSION_REVERT_TRANSACTION_CONFIRM => $this->canRevertTransactionConfirm($admin, $subject),
self::SECTION_PERMISSION_ABORT_TRANSACTION => $this->canAbortTransaction($admin, $subject),
self::SECTION_PERMISSION_REVERT_TRANSACTION_ABORT => $this->canRevertTransactionAbort($admin, $subject),
default => parent::voteOnSectionPermission($admin, $section_permission, $subject)
};
}
function canEditRecord(Administrator $admin, DefaultEntity $record): bool
{
/** @var Transaction $record */
if(!parent::canEditRecord($admin, $record)){
return false;
}
return !$record->confirmed && !$record->aborted && !$record->paid;
}
function canConfirmTransaction(Administrator $admin, Transaction $transaction): bool
{
return parent::canEditRecord($admin, $transaction) && !$transaction->confirmed && !$transaction->aborted;
}
function canRevertTransactionConfirm(Administrator $admin, Transaction $transaction): bool
{
return parent::canEditRecord($admin, $transaction) && $transaction->confirmed && !$transaction->paid;
}
function canAbortTransaction(Administrator $admin, Transaction $transaction): bool
{
return parent::canEditRecord($admin, $transaction) && !$transaction->confirmed && !$transaction->aborted;
}
function canRevertTransactionAbort(Administrator $admin, Transaction $transaction): bool
{
return parent::canEditRecord($admin, $transaction) && $transaction->aborted;
}
}