src/AdminSections/PaymentRequests/PaymentsRequestsVoter.php line 12

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace PPAdmin\AdminSections\PaymentRequests;
  3. use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\Administrator;
  4. use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\Common\DefaultEntity;
  5. use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\PaymentRequest;
  6. use PlnaPenezenka\PPSDKBundle\Doctrine\Entity\Web;
  7. use PlnaPenezenka\PPSDKBundle\Enums\PaymentRequestStates;
  8. use PPAdmin\AdminSections\AdminSectionsList;
  9. use PPAdmin\Security\AbstractAdminGridSectionVoter;
  10. class PaymentsRequestsVoter extends AbstractAdminGridSectionVoter
  11. {
  12.     const SECTION_PERMISSION_REVERT_STATUS '.revert-status';
  13.     const SECTION_PERMISSION_APPROVE '.approve';
  14.     public static function getSectionIdentifier(): string
  15.     {
  16.         return AdminSectionsList::PAYMENT_REQUESTS;
  17.     }
  18.     function getSupportedPermissionsNames(bool $only_configurable false): array
  19.     {
  20.         $names parent::getSupportedPermissionsNames($only_configurable);
  21.         if($only_configurable){
  22.             unset($names[static::getPermission(self::SECTION_PERMISSION_CREATE)]);
  23.             unset($names[static::getPermission(self::SECTION_PERMISSION_REVERT_STATUS)]);
  24.             unset($names[static::getPermission(self::SECTION_PERMISSION_APPROVE)]);
  25.         }
  26.         return $names;
  27.     }
  28.     protected function voteOnSectionPermission(Administrator $adminstring $section_permission$subject null): bool
  29.     {
  30.         return match ($section_permission){
  31.             self::SECTION_PERMISSION_REVERT_STATUS => $subject instanceof PaymentRequest && $this->canRevertStatus($admin$subject),
  32.             self::SECTION_PERMISSION_APPROVE => $subject instanceof PaymentRequest && $this->canApprove($admin$subject),
  33.             default => parent::voteOnSectionPermission($admin$section_permission$subject)
  34.         };
  35.     }
  36.     function canCreateSectionRecords(Administrator $adminWeb $web): bool
  37.     {
  38.         return false;
  39.     }
  40.     function canEditRecord(Administrator $adminDefaultEntity $record): bool
  41.     {
  42.         /** @var $record PaymentRequest */
  43.         if(!parent::canEditRecord($admin$record)){
  44.             return false;
  45.         }
  46.         return $record->status === PaymentRequestStates::STATUS_NEW;
  47.     }
  48.     function canApprove(Administrator $adminPaymentRequest $request): bool
  49.     {
  50.         return
  51.             $this->canEditRecord($admin$request) &&
  52.             $request->status === PaymentRequestStates::STATUS_NEW &&
  53.             $request->getTotalUserCommissionInUserCurrency() > 0.0
  54.         ;
  55.     }
  56.     function canRevertStatus(Administrator $adminPaymentRequest $request): bool
  57.     {
  58.         if(!$this->canViewSectionRecord($admin$request)){
  59.             return false;
  60.         }
  61.         if(in_array(
  62.             $request->status,
  63.             [
  64.                 PaymentRequestStates::STATUS_NEW,  // nothing to revert
  65.                 PaymentRequestStates::STATUS_PAYMENT_IN_PROGRESS// cannot revert during payment
  66.                 PaymentRequestStates::STATUS_PAYMENT_FINISHED// cannot revert paid payment
  67.             ]
  68.         )){
  69.             return false;
  70.         }
  71.         // payment will be executed in less than 15 seconds - do not allow to change status
  72.         if(
  73.             $request->status === PaymentRequestStates::STATUS_PAYMENT_SCHEDULED &&
  74.             $request->payment_scheduled_to_when < new \DateTime('+15 seconds')
  75.         ){
  76.             return false;
  77.         }
  78.         // by admins wish they want to be able to revert scheduled, failed and paid requests
  79.         return true;
  80.     }
  81.     function canDeleteRecord(Administrator $adminDefaultEntity $record): bool
  82.     {
  83.         if(!parent::canDeleteRecord($admin$record)){
  84.             return false;
  85.         }
  86.         // only not paid and not in payment process
  87.         /** @var $record PaymentRequest */
  88.         return in_array(
  89.             $record->status,
  90.             [
  91.                 PaymentRequestStates::STATUS_NEW,
  92.                 PaymentRequestStates::STATUS_REJECTED,
  93.                 PaymentRequestStates::STATUS_PAYMENT_FAILED,
  94.             ]
  95.         );
  96.     }
  97. }