Your IP : 216.73.217.95


Current Path : /home/rtorresani/www/app/code/Torresani/AggregateOrder/Observer/
Upload File :
Current File : //home/rtorresani/www/app/code/Torresani/AggregateOrder/Observer/OrderPlaceBefore.php

<?php

namespace Torresani\AggregateOrder\Observer;

use Magento\Framework\Event\ObserverInterface;
use Psr\Log\LoggerInterface;
use Magento\Sales\Model\Order;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Quote\Api\Data\CartItemInterfaceFactory;
use Magento\Sales\Model\Order\Item as OrderItem;
use Magento\Framework\MessageQueue\PublisherInterface;
use Torresani\MessageQueue\Api\MessageInterface;
use \Magento\Framework\App\DeploymentConfig;

use Magento\Quote\Api\CartItemRepositoryInterface;
use Magento\Quote\Model\Quote\Item\ToOrderItem;

class OrderPlaceBefore implements ObserverInterface
{
    protected $orderRepository;
    protected $logger;
    protected $orderAggregated;
    protected $quoteRepository;

    protected $cartItemRepository;
    protected $cartRepository;
    protected $toOrderItem;
    protected $orderFactory;
    protected $publisher;
    protected $message;
    private DeploymentConfig $deploymentConfig;


    protected $_productRepository;
    protected $formKey;

    public function __construct(
        \Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
        \Magento\Sales\Api\Data\OrderInterface $orderAggregated,
        \Magento\Quote\Api\Data\CartItemInterfaceFactory $cartItemFactory,
        \Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
        \Magento\Sales\Model\Order $orderFactory,
        PublisherInterface $publisher,
        DeploymentConfig $deploymentConfig,
        MessageInterface $message,
        LoggerInterface $logger,

        CartItemRepositoryInterface $cartItemRepository,
        CartRepositoryInterface $cartRepository,
        \Magento\Quote\Model\Quote\Item\ToOrderItem $toOrderItem,

        \Magento\Catalog\Model\ProductRepository $productRepository,
        \Magento\Checkout\Model\Cart $cart,
        \Magento\Framework\Data\Form\FormKey $formKey
    ) {
        $this->orderRepository = $orderRepository;
        $this->orderAggregated = $orderAggregated;
        $this->cartItemFactory = $cartItemFactory;
        $this->quoteRepository = $quoteRepository;
        $this->orderFactory = $orderFactory;
        $this->publisher = $publisher;
        $this->message = $message;
        $this->deploymentConfig = $deploymentConfig;
        $this->logger = $logger;

        $this->cartItemRepository = $cartItemRepository;
        $this->cartRepository = $cartRepository;
        $this->toOrderItem = $toOrderItem;

        $this->_productRepository = $productRepository;
        $this->formKey = $formKey;
    }

    /**
     * Execute observer
     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return void
     */
    public function execute(
        \Magento\Framework\Event\Observer $observer
    ) {
        $order = $observer->getEvent()->getOrder();
        $this->logger->info("######################" . $order->getShippingMethod());
        if ($order->getShippingMethod() === 'aggregateshipping_aggregateshipping') {
            $shippingDescription = $order->getShippingDescription();
            $pattern = '/numero (\w+)/';
            $this->logger->info("-----" . $shippingDescription);
            if (preg_match($pattern, $shippingDescription, $matches)) {
                $firstOrderNumber = $matches[1];
                $this->logger->info("====".$firstOrderNumber);
                $oldOrder = $this->orderAggregated->loadByIncrementId($firstOrderNumber);
                if ($oldOrder->getId()) {
                    $this->logger->info("##" . $oldOrder->getId());
                    $quoteId = $order->getQuoteId();
                    $quote = $this->quoteRepository->get($quoteId);
                    foreach ($oldOrder->getAllVisibleItems() as $item) {
                        $this->logger->info("##############################################################àUNO");
                        //$product = $item->getProduct();
                        $sku = $item->getSku();
                        //$this->logger->info("--" . $product . " [" . $sku . "]");
                        $this->logger->info("--" . " [" . $sku . "]");
                        $this->logger->info("====" . $item->getPrice());
                        $this->makeAddRequest($order, $quote, $sku, $item->getQtyOrdered());
                    }
                    $shippingprice = $oldOrder->getShippingAmount();
                    $order->setShippingAmount($shippingprice);
                    $order->setBaseShippingAmount($shippingprice);
                    $order->setGrandTotal($order->getGrandTotal() + $shippingprice);
                    $order->setBaseGrandTotal($order->getBaseGrandTotal() + $shippingprice);
                    $order->save();

                    $this->logger->info("##### TRY CANCEL");
                    if($oldOrder->canCancel()) {
                        $this->logger->info("##### EXECUTE CANCEL");
                        $oldOrder->cancel();
                        $oldOrder->save();
                        $this->sendMessageRabbitMQ($oldOrder);
                        $this->logger->info("##### DONE CANCEL");
                    }
                }
            }
        }
    }

    private function sendMessageRabbitMQ($order) {
        $topic = 'order';
//        $order = $this->orderFactory->loadByIncrementId($orderId);

        $action = "cancel";
        $activityRegister = "false";
        $activityErpinsert = "false";
        $activityWarehouse = "false";
        $activitySellerEmail = "false";
        $activityBooking = "false";
        $activityTransfer = "false";
        $activityPickinglist = "false";
        $activityShipmentshippypro = "false";
        $activityShipmentsurf = "false";
        $activityMail = "false";
        $activityPicking = "false";
        $activityPickup = "false";
        $activityClose = "false";
        $activityCancel = "true";

        $message = '{
                "action": "' . $action . '",
                "indaco": {
                    "instance_id": "' . $this->deploymentConfig->get('indaco/instance_id') . '"
                },
                "order": {
                    "entity_id": "' . $order->getId() . '",
                    "increment_id": "' . $order->getIncrementId() .'",
                    "datetime": "' . $order->getCreatedAt() . '",
                    "store": {
                        "storeview_id": "' . $order->getStore()->getId() . '",
                        "storeview_code": "' . $order->getStore()->getCode() . '",
                        "store_id": "' . $order->getStore()->getGroup()->getId() . '",
                        "store_code": "' . $order->getStore()->getGroup()->getCode() . '",
                        "website_id": "' . $order->getStore()->getWebsite()->getId() . '",
                        "website_code": "' . $order->getStore()->getWebsite()->getCode() . '"
                    }
                },
                "activity": {
                    "register": ' . $activityRegister . ',
                    "erpInsert": ' . $activityErpinsert . ',
                    "warehouse": ' . $activityWarehouse . ',
                    "sellerEmail": ' . $activitySellerEmail .',
                    "booking": ' . $activityBooking . ',
                    "transfer": ' . $activityTransfer . ',
                    "pickingList": ' . $activityPickinglist . ',
                    "shipmentShippyPro": ' . $activityShipmentshippypro . ',
                    "shipmentSurf": ' . $activityShipmentsurf . ',
                    "mail": ' . $activityMail . ',
                    "picking": ' . $activityPicking . ',
                    "pickup": ' . $activityPickup . ',
                    "close": ' . $activityClose . ',
                    "cancel": ' . $activityCancel . '
                }
            }';
        $message = preg_replace('/\s+/', '', $message);

        $this->message->setMessage($message);
        $this->publisher->publish($topic, $this->message);

    }

    private function makeAddRequest($order, $quote, $sku, $qty = 1)
    {
        try {
            $product = $this->_productRepository->get($sku);
        } catch (\Magento\Framework\Exception\NoSuchEntityException $e){
            return;
        }

        $stockItem = $product->getExtensionAttributes()->getStockItem();
        $stockqty = $stockItem->getQty();
        $this->logger->info("QTY: " . $stockqty ." > " . $qty);
        if (1) {
            $params = array(
                'form_key' => $this->formKey->getFormKey(),
                'product' => $product->getId(), //product Id
                'qty' => $qty //quantity of product
            );
            $request = new \Magento\Framework\DataObject();
            $request->setData($params);
            $quote->addProduct($product, $request);
            $quote->collectTotals();
            //$this->_cart->save();

            foreach ($quote->getAllVisibleItems() as $item) {
                if ($product->getId() == $item->getProduct()->getId()) {
                    // collect item price
                    $item->save();
                    $existData = $order->getItemByQuoteItemId($item->getId());
                    $orderItem = $this->toOrderItem->convert($item);
                    if ($existData) {
                        $qty = $orderItem->getQtyOrdered();
                        $this->logger->info("ENTERENTER " . $orderItem->getQtyOrdered() . " - " . $orderItem->getQty());
                    }
                    $this->logger->info("NEWQTY: " . $qty);
                    $itemPrice = $product->getPrice();
                    $orderItem->setPrice($itemPrice);
                    $orderItem->setBasePrice($itemPrice);
                    $orderItem->setOriginalPrice($itemPrice);
                    $orderItem->setBaseOriginalPrice($itemPrice);
                    $orderItem->setPriceInclTax($itemPrice);
                    $orderItem->setBasePriceInclTax($itemPrice);
                    $orderItem->setRowTotal($itemPrice * $qty);
                    $orderItem->setBaseRowTotal($itemPrice * $qty);
                    $orderItem->setRowTotalInclTax($itemPrice * $qty);
                    $orderItem->setBaseRowTotalInclTax($itemPrice * $qty);

                    if ($existData) {
                        $existData->addData($orderItem->getData());
                    } else {
                        //add new product to
                        if ($item->getParentItem()) {
                            $item->setParentItem(
                                $order->getItemByQuoteItemId($item->getParentItem()->getId())
                            );
                        }

                        $order->addItem($orderItem);
                    }
                    $order->setBaseGrandTotal($order->getBaseGrandTotal() + ($itemPrice * $qty));
                    $order->setGrandTotal($order->getGrandTotal() + ($itemPrice * $qty));
                    $order->setBaseSubtotal($order->getBaseSubtotal() + ($itemPrice * $qty));
                    $order->setSubtotal($order->getSubtotal() + ($itemPrice * $qty));
                    $order->setBaseSubtotalInclTax($order->getBaseSubtotalInclTax() + ($itemPrice * $qty));
                    $order->setSubtotalInclTax($order->getSubtotalInclTax() + ($itemPrice * $qty));
                    $order->setTotalItemCount($order->getTotalItemCount() + $qty);
                    $order->setTotalQtyOrdered($order->getTotalQtyOrdered() + $qty);
                }
            }
            $quote->save();
        }
    }

    public function OLDexecute(\Magento\Framework\Event\Observer $observer)
    {
        try {

            $order = $observer->getEvent()->getOrder();
            if ($order->getShippingMethod() === 'aggregateshipping_aggregateshipping') {
                $this->logger->info("BIS");
                $shippingDescription = $order->getShippingDescription();
                $pattern = '/Order: (\w+)/';
                if (preg_match($pattern, $shippingDescription, $matches)) {
                    $this->logger->info("TRIS");
                    $firstOrderNumber = $matches[1];
                    $this->logger->info("PRIMA IF IN afterPlace." . $firstOrderNumber);
                    $oldOrder = $this->orderAggregated->loadByIncrementId($firstOrderNumber);
                    if ($oldOrder->getId()) {
                        $quote = $this->cartRepository->get($order->getQuoteId());
                        $quoteId = $order->getEntityId();
                        $this->logger->info("AAAA ".$quoteId);
                        $cart = $this->quote->create()->loadActive($quoteId);
                        foreach ($oldOrder->getAllVisibleItems() as $item) {
                            $this->logger->info("##############################################################àUNO");

                            $product = $item->getProduct();
                            $this->logger->info("DUE ".$product);
                            $orderItem = $this->createOrderItem($product, $item->getQty());
                            $this->logger->info("TRE");
                            $order->addItem($orderItem);
                            $this->logger->info("QUATT");


/*                            $product = $item->getProduct();
                            $this->logger->info("DUE");
                            $orderItem = $this->orderItemFactory->create();
                            $this->logger->info("TRE");
                            $orderItem->setProduct($product);
                            $this->logger->info("QUATTR");
                            $orderItem->setQtyOrdered($item->getQty());
                            $this->logger->info("CINQ");
                            $order->addItem($orderItem);
                            $this->logger->info("SEI");
                            /*
                            $this->logger->info("UNO");
                            $product = $item->getProduct();
                            $this->logger->info("DUE");
                            $quoteItem = $this->cartItemRepository->create();
                            $this->logger->info("TRE");
                            $quoteItem->setProduct($product);
                            $this->logger->info("QUATTRO");
                            $quoteItem->setQty(11); // Imposta la quantità desiderata
                            $this->logger->info("CINQUE");
                            $quoteItem->setQuoteId($quote->getId());
                            $this->logger->info("SEIO");
                            $this->cartItemRepository->save($quoteItem);
                            $this->logger->info("SETTE");
*/
                        }
                        $this->logger->info("BBB");

                        $quote->collectTotals();
                        $this->cartRepository->save($quote);

                        $orderItems = [];
                        $this->logger->info("CCC");
                        foreach ($quote->getAllItems() as $quoteItem) {
                            $this->logger->info("DDDDDDD");
                            $orderItems[] = $this->quoteToOrderItem->convert($quoteItem);
                        }

                        $order->setItems($orderItems);
                        $order->setSubtotal($quote->getSubtotal());
                        $order->setBaseSubtotal($quote->getBaseSubtotal());
                        $order->setGrandTotal($quote->getGrandTotal());
                        $order->setBaseGrandTotal($quote->getBaseGrandTotal());
                        $this->logger->info("EEEE");

                        $order->save();
                        $this->logger->info("FINE");
                    }
                }
            }
            /*
            $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
            $order = $observer->getEvent()->getOrder();
            if ($order->getShippingMethod() === 'aggregateshipping_aggregateshipping') {
                $shippingDescription = $order->getShippingDescription();
                $pattern = '/Order: (\w+)/';
                if (preg_match($pattern, $shippingDescription, $matches)) {
                    $firstOrderNumber = $matches[1];
                    $this->logger->info("PRIMA IF IN afterPlace." . $firstOrderNumber);
                    // ????
                    $oldOrder = $this->orderAggregated->loadByIncrementId($firstOrderNumber);
                    if ($oldOrder->getId()) {
                        // ????
                        $quote = $this->quoteRepository->get($order->getQuoteId());
                        foreach ($oldOrder->getAllVisibleItems() as $item) {
                            $product = $item->getProduct();

                            $objectManager->create(
                                'Magento\Quote\Model\Quote\Item'
                            )->setProduct($product)
                                ->setQuote($quote)
                                ->setQty(11)
                                ->save();
                            $quoteToOrder = $objectManager
                                ->create(
                                    'Magento\Quote\Model\Quote\Item\ToOrderItem'
                                );
                            /// E DOVE VA AGGIUNTA
                        }
                        $quote->collectTotals();
                        $quote->save();

                        $items = $quote->getAllItems();
                        foreach ($items as $quoteItem) {
                            $this->logger->info("##############################################################àUNO");
                            $orderItem = $quoteToOrder->convert($quoteItem);
                            $origOrderItemNew = $oldOrder->getItemByQuoteItemId($quoteItem->getId());
                            $this->logger->info("BIS");
                            if (!$orderItem) {
                                $this->logger->info("DUE");
                                $origOrderItemNew->addData($orderItem->getData());
                                if ($quoteItem->getParentItem()) {
                                    $this->logger->info("TRE");
                                    $orderItem->setParentItem(
                                        $oldOrder->getItemByQuoteItemId($orderItem->getParentItem()->getId())
                                    );
                                }
                                $this->logger->info("QUATTRO");
                                $order->addItem($orderItem);
                                $this->logger->info("CINQUE");
                            }
                        }
                        $this->logger->info("SEI");
                        $order->setSubtotal($quote->getSubtotal())
                            ->setBaseSubtotal($quote->getBaseSubtotal())
                            ->setGrandTotal($quote->getGrandTotal())
                            ->setBaseGrandTotal($quote->getBaseGrandTotal());
                        $this->logger->info("SETTE");
                        $order->save();
                        $this->logger->info("FINE");
                        die("K");
                    }
                }
            }
            */
            /*
            $order = $observer->getEvent()->getOrder();
            if ($order->getShippingMethod() === 'aggregateshipping_aggregateshipping') {
                $shippingDescription = $order->getShippingDescription();
                $pattern = '/Order: (\w+)/';
                if (preg_match($pattern, $shippingDescription, $matches)) {
                    $firstOrderNumber = $matches[1];
                    $this->logger->info("PRIMA IF IN afterPlace." . $firstOrderNumber);
                    $oldOrder = $this->orderAggregated->loadByIncrementId($firstOrderNumber);
                    $quote = $this->quoteRepository->get($oldOrder->getQuoteId());
                    if ($oldOrder) {
                        foreach ($order->getAllVisibleItems() as $item) {
                            $this->logger->info("UNO");
//                            $oldOrder->addProduct($item->getProduct(), $item->getQtyOrdered());
                            $quoteItem = $this->cartItemFactory->create();
                            $this->logger->info("DUE");
                            $quoteItem->setProduct($item->getProduct());
                            $this->logger->info("TRE");
                            $quoteItem->setCustomPrice('111');
                            $this->logger->info("QUATTRO");
                            $quoteItem->setOriginalCustomPrice('222');
                            $this->logger->info("CINQUE");
                            $quoteItem->getProduct()->setIsSuperMode(true);
                            $this->logger->info("SEI");
                            $quote->addItem($quoteItem);
                            $this->logger->info("SETTE");
                            $quote->collectTotals()->save();
                            $this->logger->info("OTTO");
                        }

                        $this->orderRepository->save($oldOrder);
                        $this->orderRepository->delete($order);
                        $this->logger->info("Il metodo afterPlace è stato eseguito con successo.");
                    }
                }
            }
            $this->logger->info("DOPO IF IN afterPlace.");
            */
        } catch (\Exception $e) {
            $this->logger->info($e->getMessage());
        }
    }
    protected function findSecondOrderToMerge($incrementId)
    {
        $searchCriteria = $this->searchCriteriaBuilder
            ->addFilter('increment_id', $incrementId)->create();
        $orderData = null;
        try {
            $order = $this->orderRepository->getList($searchCriteria);
            if ($order->getTotalCount()) {
                $orderData = $order->getItems();
            }
        } catch (Exception $exception) {
            $this->logger->critical($exception->getMessage());
        }
        return $orderData;
    }

    protected function createOrderItem($product, $qty)
    {
        $orderItem = new OrderItem();
        $orderItem->setProduct($product);
        $orderItem->setQtyOrdered($qty);
        // Imposta altri campi dell'oggetto Order\Item se necessario
        return $orderItem;
    }
}