diff --git a/202/build.xml b/202/build.xml index 7f70723b..280530d0 100644 --- a/202/build.xml +++ b/202/build.xml @@ -5,7 +5,7 @@ - + diff --git a/classes/ShoppingfeedTaskOrder.php b/classes/ShoppingfeedTaskOrder.php index 31a66de0..e012cab3 100644 --- a/classes/ShoppingfeedTaskOrder.php +++ b/classes/ShoppingfeedTaskOrder.php @@ -27,6 +27,8 @@ class ShoppingfeedTaskOrder extends ObjectModel { const ACTION_SYNC_STATUS = 'SYNC_STATUS'; + const ACTION_UPLOAD_INVOICE = 'UPLOAD_INVOICE'; + // As in, "check the ticket related to the Order Status synchronization" const ACTION_CHECK_TICKET_SYNC_STATUS = 'CHECK_TICKET_SYNC_STATUS'; @@ -60,7 +62,11 @@ class ShoppingfeedTaskOrder extends ObjectModel 'validate' => 'isGenericName', 'required' => true, 'unique' => true, - 'values' => [self::ACTION_SYNC_STATUS, self::ACTION_CHECK_TICKET_SYNC_STATUS], + 'values' => [ + self::ACTION_SYNC_STATUS, + self::ACTION_CHECK_TICKET_SYNC_STATUS, + self::ACTION_UPLOAD_INVOICE, + ], ], 'id_order' => [ 'type' => ObjectModel::TYPE_INT, diff --git a/classes/actions/ShoppingfeedOrderSyncActions.php b/classes/actions/ShoppingfeedOrderSyncActions.php index 5b265071..2eaac026 100644 --- a/classes/actions/ShoppingfeedOrderSyncActions.php +++ b/classes/actions/ShoppingfeedOrderSyncActions.php @@ -386,6 +386,78 @@ public function prepareTaskOrdersSyncStatus() return true; } + public function prepareTaskOrdersSyncInvoice() + { + if (empty($this->conveyor['id_shop'])) { + ProcessLoggerHandler::logError( + $this->l('No ID Shop found.', 'ShoppingfeedOrderSyncActions'), + 'Order' + ); + + return false; + } + if (empty($this->conveyor['taskOrders'])) { + ProcessLoggerHandler::logInfo( + $this->l('No Task Orders to prepare.', 'ShoppingfeedOrderSyncActions'), + 'Order' + ); + + return false; + } + + $taskOrders = $this->conveyor['taskOrders']; + $this->conveyor['preparedTaskOrders'] = []; + + foreach ($taskOrders as $taskOrder) { + /** @var $taskOrder ShoppingfeedTaskOrder */ + $logPrefix = self::getLogPrefix($taskOrder->id_order); + $order = new Order($taskOrder->id_order); + $sfOrder = ShoppingfeedOrder::getByIdOrder($taskOrder->id_order); + + if (!Validate::isLoadedObject($order)) { + ProcessLoggerHandler::logError( + $logPrefix . ' ' . + $this->l('Order could not be loaded.', 'ShoppingfeedOrderSyncActions'), + 'Order', + $taskOrder->id_order + ); + Registry::increment('syncStatusErrors'); + continue; + } + + if (empty($sfOrder->id_internal_shoppingfeed)) { + ProcessLoggerHandler::logError( + $logPrefix . ' ' . + $this->l('No SF Order id set.', 'ShoppingfeedOrderSyncActions'), + 'Order', + $taskOrder->id_order + ); + Registry::increment('syncStatusErrors'); + continue; + } + + foreach ($order->getInvoicesCollection() as $invoice) { + $pdf = new PDF($invoice, PDF::TEMPLATE_INVOICE, Context::getContext()->smarty); + $file = _PS_MODULE_DIR_ . 'shoppingfeed/views/tmp/' . $invoice->id . '.pdf'; + $isInvoiceExist = file_put_contents($file, $pdf->render(false)); + + if ($isInvoiceExist) { + $this->conveyor['preparedTaskOrders'][Shoppingfeed::ORDER_OPERATION_UPLOAD_DOCUMENTS][] = [ + 'id_internal_shoppingfeed' => $sfOrder->id_internal_shoppingfeed, + 'taskOrder' => $taskOrder, + 'file' => $file, + 'operation' => Shoppingfeed::ORDER_OPERATION_UPLOAD_DOCUMENTS, + 'payload' => [ + 'uri' => $file, + ], + ]; + } + } + } + + return true; + } + protected function initCarrierFinder() { return new CarrierFinder(); @@ -460,6 +532,71 @@ public function sendTaskOrdersSyncStatus() return true; } + public function sendTaskOrdersSyncInvoice() + { + if (empty($this->conveyor['id_shop'])) { + ProcessLoggerHandler::logError( + $this->l('No ID Shop found.', 'ShoppingfeedOrderSyncActions'), + 'Order' + ); + + return false; + } + + if (empty($this->conveyor['preparedTaskOrders'])) { + ProcessLoggerHandler::logError( + $this->l('No prepared Task Orders found.', 'ShoppingfeedOrderSyncActions'), + 'Order' + ); + + return false; + } + + $shoppingfeedApi = ShoppingfeedApi::getInstanceByToken($this->conveyor['id_token']); + if ($shoppingfeedApi == false) { + ProcessLoggerHandler::logError( + $this->l('Could not retrieve Shopping Feed API.', 'ShoppingfeedOrderSyncActions'), + 'Order' + ); + + return false; + } + + foreach ($this->conveyor['preparedTaskOrders'] as $preparedTaskOrders) { + $result = $shoppingfeedApi->updateMainStoreOrdersStatus($preparedTaskOrders, $this->conveyor['shoppingfeed_store_id']); + + if (!$result) { + continue; + } + + $batchId = current($result->getBatchIds()); + if (empty($batchId) === true) { + continue; + } + + foreach ($preparedTaskOrders as $preparedTaskOrder) { + $taskOrder = $preparedTaskOrder['taskOrder']; + $taskOrder->batch_id = $batchId; + $taskOrder->action = ShoppingfeedTaskOrder::ACTION_CHECK_TICKET_SYNC_STATUS; + $taskOrder->save(); + + ProcessLoggerHandler::logSuccess( + static::getLogPrefix($taskOrder->id_order) . ' ' . $this->l('Ticket created to upload an order invoice', 'ShoppingfeedOrderSyncActions'), + 'Order', + $taskOrder->id_order + ); + + $this->conveyor['successfulTaskOrders'][] = $taskOrder; + unlink($preparedTaskOrder['file']); + } + } + if (empty($this->conveyor['successfulTaskOrders'])) { + return false; + } + + return true; + } + public function prepareTaskOrdersCheckTicketsSyncStatus() { if (empty($this->conveyor['taskOrders'])) { diff --git a/controllers/front/syncOrder.php b/controllers/front/syncOrder.php index 6f89cb35..39ea8c31 100644 --- a/controllers/front/syncOrder.php +++ b/controllers/front/syncOrder.php @@ -200,6 +200,65 @@ public function syncOrderStatus() $this->processMonitor->getProcessObjectModelId() ); } + // Start upload invoices + ProcessLoggerHandler::logInfo( + $logPrefix . ' ' . $this->module->l('Process start : Order invoice sync', 'syncOrder'), + $this->processMonitor->getProcessObjectModelName(), + $this->processMonitor->getProcessObjectModelId() + ); + + $failedSyncStatusTaskOrders = []; + $successfulSyncTaskOrders = []; + try { + Registry::set('syncStatusErrors', 0); + + /** @var ShoppingfeedHandler $orderStatusHandler */ + $orderStatusHandler = new ActionsHandler(); + $orderStatusHandler->setConveyor([ + 'id_shop' => $token['id_shop'], + 'id_token' => $token['id_shoppingfeed_token'], + 'order_action' => ShoppingfeedTaskOrder::ACTION_UPLOAD_INVOICE, + 'shoppingfeed_store_id' => $token['shoppingfeed_store_id'], + ]); + $orderStatusHandler->addActions( + 'getTaskOrders', + 'prepareTaskOrdersSyncInvoice', + 'sendTaskOrdersSyncInvoice' + ); + + if ($orderStatusHandler->process('ShoppingfeedOrderSync')) { + $processData = $orderStatusHandler->getConveyor(); + $failedSyncStatusTaskOrders = isset($processData['failedTaskOrders']) ? $processData['failedTaskOrders'] : []; + $successfulSyncTaskOrders = isset($processData['successfulTaskOrders']) ? $processData['successfulTaskOrders'] : []; + + ProcessLoggerHandler::logSuccess( + sprintf( + $logPrefix . ' ' . $this->module->l('%d tickets created; %d tickets not created; %d errors', 'syncOrder'), + count($successfulSyncTaskOrders), + count($failedSyncStatusTaskOrders), + Registry::get('syncStatusErrors') + ), + $this->processMonitor->getProcessObjectModelName(), + $this->processMonitor->getProcessObjectModelId() + ); + } + + ProcessLoggerHandler::logInfo( + $logPrefix . ' ' . $this->module->l('Process finished : Order invoice sync', 'syncOrder'), + $this->processMonitor->getProcessObjectModelName(), + $this->processMonitor->getProcessObjectModelId() + ); + } catch (Throwable $e) { + ProcessLoggerHandler::logError( + sprintf( + $logPrefix . ' ' . $this->module->l('Error : %s', 'syncOrder'), + $e->getMessage() . ' ' . $e->getFile() . ':' . $e->getLine() + ), + $this->processMonitor->getProcessObjectModelName(), + $this->processMonitor->getProcessObjectModelId() + ); + } + // End upload invoices // Send mail try { diff --git a/shoppingfeed.php b/shoppingfeed.php index 7b4a363a..9eda8a2b 100644 --- a/shoppingfeed.php +++ b/shoppingfeed.php @@ -1246,6 +1246,41 @@ public function hookActionValidateOrder($params) \ShoppingfeedClasslib\Extensions\ProcessLogger\ProcessLoggerHandler::closeLogger(); } + protected function addOrderTask($id_order, $action) + { + $logPrefix = ShoppingfeedOrderSyncActions::getLogPrefix($id_order); + try { + \ShoppingfeedClasslib\Extensions\ProcessLogger\ProcessLoggerHandler::logInfo( + sprintf( + $logPrefix . ' ' . + $this->l('Process started Order %s ', 'ShoppingfeedOrderActions'), + $id_order + ), + 'Order', + $id_order + ); + $handler = new \ShoppingfeedClasslib\Actions\ActionsHandler(); + $handler + ->setConveyor([ + 'id_order' => $id_order, + 'order_action' => $action, + ]) + ->addActions('saveTaskOrder') + ->process('shoppingfeedOrderSync'); + } catch (Exception $e) { + \ShoppingfeedClasslib\Extensions\ProcessLogger\ProcessLoggerHandler::logInfo( + sprintf( + $logPrefix . ' ' . $this->l('Order %s not registered for synchronization: %s', 'ShoppingfeedOrderActions'), + $id_order, + $e->getMessage() . ' ' . $e->getFile() . ':' . $e->getLine() + ), + 'Order', + $id_order + ); + } + \ShoppingfeedClasslib\Extensions\ProcessLogger\ProcessLoggerHandler::closeLogger(); + } + /** * Saves an order for status synchronization * @@ -1265,53 +1300,24 @@ public function hookActionOrderStatusPostUpdate($params) } $order = new Order($params['id_order']); - - // Check if the new status calls for an update with Shopping Feed + /** @var OrderState $newOrderStatus */ $newOrderStatus = $params['newOrderStatus']; $shipped_status = json_decode(Configuration::get(Shoppingfeed::SHIPPED_ORDERS, null, null, $order->id_shop)); $cancelled_status = json_decode(Configuration::get(Shoppingfeed::CANCELLED_ORDERS, null, null, $order->id_shop)); $refunded_status = json_decode(Configuration::get(Shoppingfeed::REFUNDED_ORDERS, null, null, $order->id_shop)); $delivered_status = json_decode(Configuration::get(Shoppingfeed::DELIVERED_ORDERS, null, null, $order->id_shop)); - if (!in_array($newOrderStatus->id, $shipped_status) - && !in_array($newOrderStatus->id, $cancelled_status) - && !in_array($newOrderStatus->id, $refunded_status) - && !in_array($newOrderStatus->id, $delivered_status) + + if (in_array($newOrderStatus->id, $shipped_status) + || in_array($newOrderStatus->id, $cancelled_status) + || in_array($newOrderStatus->id, $refunded_status) + || in_array($newOrderStatus->id, $delivered_status) ) { - return; + $this->addOrderTask($shoppingFeedOrder->id_order, ShoppingfeedTaskOrder::ACTION_SYNC_STATUS); } - $logPrefix = ShoppingfeedOrderSyncActions::getLogPrefix($shoppingFeedOrder->id_order); - try { - \ShoppingfeedClasslib\Extensions\ProcessLogger\ProcessLoggerHandler::logInfo( - sprintf( - $logPrefix . ' ' . - $this->l('Process started Order %s ', 'ShoppingfeedOrderActions'), - $shoppingFeedOrder->id_order - ), - 'Order', - $shoppingFeedOrder->id_order - ); - $handler = new \ShoppingfeedClasslib\Actions\ActionsHandler(); - $handler - ->setConveyor([ - 'id_order' => $params['id_order'], - 'order_action' => ShoppingfeedTaskOrder::ACTION_SYNC_STATUS, - ]) - ->addActions('saveTaskOrder') - ->process('shoppingfeedOrderSync'); - } catch (Exception $e) { - \ShoppingfeedClasslib\Extensions\ProcessLogger\ProcessLoggerHandler::logInfo( - sprintf( - $logPrefix . ' ' . $this->l('Order %s not registered for synchronization: %s', 'ShoppingfeedOrderActions'), - $params['id_order'], - $e->getMessage() . ' ' . $e->getFile() . ':' . $e->getLine() - ), - 'Order', - $params['id_order'] - ); + if ($newOrderStatus->invoice) { + $this->addOrderTask($shoppingFeedOrder->id_order, ShoppingfeedTaskOrder::ACTION_UPLOAD_INVOICE); } - - \ShoppingfeedClasslib\Extensions\ProcessLogger\ProcessLoggerHandler::closeLogger(); } /** diff --git a/src/OrderInvoiceSync/Hub.php b/src/OrderInvoiceSync/Hub.php index e7474705..b77dd026 100644 --- a/src/OrderInvoiceSync/Hub.php +++ b/src/OrderInvoiceSync/Hub.php @@ -137,4 +137,4 @@ protected function update() json_encode($settings) ); } -} \ No newline at end of file +} diff --git a/src/OrderInvoiceSync/Marketplace.php b/src/OrderInvoiceSync/Marketplace.php index b7d82efe..50de24e9 100644 --- a/src/OrderInvoiceSync/Marketplace.php +++ b/src/OrderInvoiceSync/Marketplace.php @@ -29,4 +29,4 @@ public function isEnabled() { return $this->isEnabled; } -} \ No newline at end of file +} diff --git a/upgrade/install-2.0.0.php b/upgrade/install-2.0.0.php new file mode 100644 index 00000000..2826c49a --- /dev/null +++ b/upgrade/install-2.0.0.php @@ -0,0 +1,31 @@ + + * @copyright Since 2019 Shopping Feed + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License (AFL 3.0) + */ + +use ShoppingfeedClasslib\Install\ModuleInstaller; + +function upgrade_module_2_0_0($module) +{ + /** + * @var Shoppingfeed $module + */ + $installer = new ModuleInstaller($module); + $installer->installObjectModel(ShoppingfeedToken::class); + + return true; +} diff --git a/views/tmp/index.php b/views/tmp/index.php new file mode 100644 index 00000000..88355f61 --- /dev/null +++ b/views/tmp/index.php @@ -0,0 +1,11 @@ +