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 @@
+