src/EventListener/DataObject/PlanEventListener.php line 66

Open in your IDE?
  1. <?php
  2. namespace App\EventListener\DataObject;
  3. use App\Helper as AppHelper;
  4. use Pimcore\Event\DataObjectEvents;
  5. use Pimcore\Event\Model\DataObjectEvent;
  6. use Pimcore\Model\DataObject;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. class PlanEventListener implements EventSubscriberInterface
  9. {
  10.     private $allowPayPalUpdate false;
  11.     /**
  12.      * @inheritDoc
  13.      */
  14.     public static function getSubscribedEvents()
  15.     {
  16.         return [
  17.             DataObjectEvents::POST_UPDATE => 'onPostUpdate',
  18.             DataObjectEvents::PRE_UPDATE => 'onPreUpdate'
  19.         ];
  20.     }
  21.     private function createPlanOnPayPal(DataObject\Plan $plan)
  22.     {
  23.         $frequencyData $plan->fetchFrequencyAndInterval();
  24.         $frequencyInterval $frequencyData['frequencyInterval'];
  25.         $frequency $frequencyData['frequency'];
  26.         $totalPrice $plan->fetchTotalPrice();
  27.         $data = [
  28.             'product_id' => AppHelper\PayPal::getProductId(),
  29.             'name' => $plan->getTitle(),
  30.             'description' => $plan->getTitle() . ' @ ' $plan->getPrice() . ' USD',
  31.             'status' => 'ACTIVE',
  32.             'billing_cycles' => [
  33.                 [
  34.                     'frequency' => [
  35.                         'interval_unit' => strtoupper($frequency),
  36.                         'interval_count' => $frequencyInterval
  37.                     ],
  38.                     'tenure_type' => 'REGULAR',
  39.                     'sequence' => 1,
  40.                     'total_cycles' => 0,
  41.                     'pricing_scheme' => [
  42.                         'fixed_price' => [
  43.                             'value' => $totalPrice,
  44.                             'currency_code' => 'USD'
  45.                         ]
  46.                     ]
  47.                 ]
  48.             ],
  49.             'payment_preferences' => [
  50.                 'auto_bill_outstanding' => true,
  51.                 'setup_fee_failure_action' => 'CANCEL',
  52.                 'payment_failure_threshold' => 3
  53.             ]
  54.         ];
  55.         return AppHelper\PayPal::createPlan($data);
  56.     }
  57.     public function onPreUpdate(DataObjectEvent $event)
  58.     {
  59.         $plan $event->getObject();
  60.         if (!$plan instanceof DataObject\Plan) {
  61.             return;
  62.         }
  63.         $this->allowPayPalUpdate $plan->getUpdateOnPayPal();
  64.         $plan->setUpdateOnPayPal(false); //always false
  65.     }
  66.     public function onPostUpdate(DataObjectEvent $event)
  67.     {
  68.         $plan $event->getObject();
  69.         if (!$plan instanceof DataObject\Plan) {
  70.             return;
  71.         }
  72.         $this->createOrUpdatePayPalPlan($plan);
  73.     }
  74.     /**
  75.      * @param \Pimcore\Model\DataObject\Plan $plan
  76.      *
  77.      */
  78.     private function createOrUpdatePayPalPlan(DataObject\Plan $plan)
  79.     {
  80.         if (!$plan->getPublished() || !$this->allowPayPalUpdate) {
  81.             return;
  82.         }
  83.         if ($plan->getPaypalPlanId()) {
  84.             return;
  85.         }
  86.         $payPalPlan =  $this->createPlanOnPayPal($plan);
  87.         $plan->setPaypalPlanId($payPalPlan->id);
  88.         $plan->setLastUpdatedOnPayPal(new \Carbon\Carbon());
  89.         $plan->setUpdateOnPayPal(false);
  90.         $plan->save();
  91.         return $payPalPlan;
  92.     }
  93. }