<?php
namespace App\EventSubscriber;
use App\Ecommerce\Model\Order;
use net\authorize\api\contract\v1\OrderType;
use Pimcore\Event\DataObjectEvents;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\OnlineShopOrder\Listing as OnlineShopOrderListing;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UpdateOrderNumber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
DataObjectEvents::PRE_ADD => [
['updateOrderNumber', 10]
],
DataObjectEvents::PRE_UPDATE => [
['updateOrderNumber', 10]
]
];
}
public function updateOrderNumber(DataObjectEvent $event)
{
$object = $event->getObject();
if (!$object || $object->getType() !== DataObject::OBJECT_TYPE_OBJECT) {
return;
}
if (!$object instanceof Order || !$object->getPublished() || $object->getOrderState() != Order::ORDER_STATE_COMMITTED) {
return;
}
if (!in_array($object->getOrderType(), $this->getAllowedTypes())) {
return;
}
if (!$this->isRecentlyCompleted($object)) {
return;
}
$sql = "SELECT ordernumber FROM object_EF_OSO WHERE ordernumber REGEXP '^[0-9]*$' ORDER BY cast(ordernumber as unsigned) DESC";
$stmt = \Pimcore\Db::get()->prepare($sql);
$stmt->execute();
$result = $stmt->fetch(1);
$orderNumber = intval($result->ordernumber) + 1;
$object->setOrderNumber($orderNumber);
}
protected function isRecentlyCompleted(Order $order)
{
$origin = Order::getById($order->getId(), true);
if (!$origin) {
return true;
}
if ($origin->getOrderState() == $order->getOrderState() && $origin->getPublished() == $order->getPublished()) {
return false;
}
if (!intVal($order->getOrderNumber())) {
return true;
}
return false;
}
protected function getAllowedTypes()
{
return [
Order::ORDER_TYPE_ORDER,
Order::ORDER_TYPE_QUOUTE_REQUEST,
Order::ORDER_TYPE_QUOUTE_SAVED
];
}
}