<?php
namespace App\EventListener\DataObject;
use App\Helper as AppHelper;
use Pimcore\Event\DataObjectEvents;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class PlanEventListener implements EventSubscriberInterface
{
private $allowPayPalUpdate = false;
/**
* @inheritDoc
*/
public static function getSubscribedEvents()
{
return [
DataObjectEvents::POST_UPDATE => 'onPostUpdate',
DataObjectEvents::PRE_UPDATE => 'onPreUpdate'
];
}
private function createPlanOnPayPal(DataObject\Plan $plan)
{
$frequencyData = $plan->fetchFrequencyAndInterval();
$frequencyInterval = $frequencyData['frequencyInterval'];
$frequency = $frequencyData['frequency'];
$totalPrice = $plan->fetchTotalPrice();
$data = [
'product_id' => AppHelper\PayPal::getProductId(),
'name' => $plan->getTitle(),
'description' => $plan->getTitle() . ' @ ' . $plan->getPrice() . ' USD',
'status' => 'ACTIVE',
'billing_cycles' => [
[
'frequency' => [
'interval_unit' => strtoupper($frequency),
'interval_count' => $frequencyInterval
],
'tenure_type' => 'REGULAR',
'sequence' => 1,
'total_cycles' => 0,
'pricing_scheme' => [
'fixed_price' => [
'value' => $totalPrice,
'currency_code' => 'USD'
]
]
]
],
'payment_preferences' => [
'auto_bill_outstanding' => true,
'setup_fee_failure_action' => 'CANCEL',
'payment_failure_threshold' => 3
]
];
return AppHelper\PayPal::createPlan($data);
}
public function onPreUpdate(DataObjectEvent $event)
{
$plan = $event->getObject();
if (!$plan instanceof DataObject\Plan) {
return;
}
$this->allowPayPalUpdate = $plan->getUpdateOnPayPal();
$plan->setUpdateOnPayPal(false); //always false
}
public function onPostUpdate(DataObjectEvent $event)
{
$plan = $event->getObject();
if (!$plan instanceof DataObject\Plan) {
return;
}
$this->createOrUpdatePayPalPlan($plan);
}
/**
* @param \Pimcore\Model\DataObject\Plan $plan
*
*/
private function createOrUpdatePayPalPlan(DataObject\Plan $plan)
{
if (!$plan->getPublished() || !$this->allowPayPalUpdate) {
return;
}
if ($plan->getPaypalPlanId()) {
return;
}
$payPalPlan = $this->createPlanOnPayPal($plan);
$plan->setPaypalPlanId($payPalPlan->id);
$plan->setLastUpdatedOnPayPal(new \Carbon\Carbon());
$plan->setUpdateOnPayPal(false);
$plan->save();
return $payPalPlan;
}
}