| Current Path : /home/rtorresani/www/app/code/Torresani/AggregateOrder/Observer/ |
| 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;
}
}