Added cli command to update since id to the latest value

This commit is contained in:
max-baranikov 2021-04-29 18:24:20 +03:00 committed by GitHub
parent ad9ce38131
commit 1c86091b56
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 191 additions and 50 deletions

View File

@ -374,6 +374,7 @@ class RetailcrmCli
'RetailcrmIcmlEvent', 'RetailcrmIcmlEvent',
'RetailcrmSyncEvent', 'RetailcrmSyncEvent',
'RetailcrmInventoriesEvent', 'RetailcrmInventoriesEvent',
'RetailcrmUpdateSinceIdEvent',
'RetailcrmExportEvent' 'RetailcrmExportEvent'
); );
} }

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* MIT License * MIT License
* *
@ -28,9 +29,9 @@
* versions in the future. If you wish to customize PrestaShop for your * versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information. * needs please refer to http://www.prestashop.com for more information.
* *
* @author DIGITAL RETAIL TECHNOLOGIES SL <mail@simlachat.com> * @author DIGITAL RETAIL TECHNOLOGIES SL <mail@simlachat.com>
* @copyright 2020 DIGITAL RETAIL TECHNOLOGIES SL * @copyright 2020 DIGITAL RETAIL TECHNOLOGIES SL
* @license https://opensource.org/licenses/MIT The MIT License * @license https://opensource.org/licenses/MIT The MIT License
* *
* Don't forget to prefix your containers with your own identifier * Don't forget to prefix your containers with your own identifier
* to avoid any conflicts with others containers. * to avoid any conflicts with others containers.
@ -166,7 +167,7 @@ class RetailcrmHistory
*/ */
public static function ordersHistory() public static function ordersHistory()
{ {
$default_currency = (int) Configuration::get('PS_CURRENCY_DEFAULT'); $default_currency = (int)Configuration::get('PS_CURRENCY_DEFAULT');
$lastSync = Configuration::get('RETAILCRM_LAST_ORDERS_SYNC'); $lastSync = Configuration::get('RETAILCRM_LAST_ORDERS_SYNC');
$lastDate = Configuration::get('RETAILCRM_LAST_SYNC'); $lastDate = Configuration::get('RETAILCRM_LAST_SYNC');
@ -418,9 +419,9 @@ class RetailcrmHistory
$cart->id_shop = Context::getContext()->shop->id; $cart->id_shop = Context::getContext()->shop->id;
$cart->id_shop_group = intval(Context::getContext()->shop->id_shop_group); $cart->id_shop_group = intval(Context::getContext()->shop->id_shop_group);
$cart->id_customer = $customer->id; $cart->id_customer = $customer->id;
$cart->id_address_delivery = (int) $address->id; $cart->id_address_delivery = (int)$address->id;
$cart->id_address_invoice = (int) $address->id; $cart->id_address_invoice = (int)$address->id;
$cart->id_carrier = (int) $deliveryType; $cart->id_carrier = (int)$deliveryType;
RetailcrmLogger::writeDebug( RetailcrmLogger::writeDebug(
__METHOD__, __METHOD__,
@ -444,10 +445,10 @@ class RetailcrmHistory
$productId = explode('#', $item['offer']['externalId']); $productId = explode('#', $item['offer']['externalId']);
$product = array(); $product = array();
$product['id_product'] = (int) $productId[0]; $product['id_product'] = (int)$productId[0];
$product['id_product_attribute'] = !empty($productId[1]) ? $productId[1] : 0; $product['id_product_attribute'] = !empty($productId[1]) ? $productId[1] : 0;
$product['quantity'] = $item['quantity']; $product['quantity'] = $item['quantity'];
$product['id_address_delivery'] = (int) $address->id; $product['id_address_delivery'] = (int)$address->id;
$products[] = $product; $products[] = $product;
} }
} }
@ -473,15 +474,15 @@ class RetailcrmHistory
$newOrder->id_shop = Context::getContext()->shop->id; $newOrder->id_shop = Context::getContext()->shop->id;
$newOrder->id_shop_group = intval(Context::getContext()->shop->id_shop_group); $newOrder->id_shop_group = intval(Context::getContext()->shop->id_shop_group);
$newOrder->reference = $newOrder->generateReference(); $newOrder->reference = $newOrder->generateReference();
$newOrder->id_address_delivery = (int) $address->id; $newOrder->id_address_delivery = (int)$address->id;
$newOrder->id_address_invoice = (int) $address->id; $newOrder->id_address_invoice = (int)$address->id;
$newOrder->id_cart = (int) $cart->id; $newOrder->id_cart = (int)$cart->id;
$newOrder->id_currency = $default_currency; $newOrder->id_currency = $default_currency;
$newOrder->id_lang = self::$default_lang; $newOrder->id_lang = self::$default_lang;
$newOrder->id_customer = (int) $customer->id; $newOrder->id_customer = (int)$customer->id;
if (isset($deliveryType)) { if (isset($deliveryType)) {
$newOrder->id_carrier = (int) $deliveryType; $newOrder->id_carrier = (int)$deliveryType;
} }
if (isset($paymentType)) { if (isset($paymentType)) {
@ -501,7 +502,7 @@ class RetailcrmHistory
$newOrder->conversion_rate = 1.000000; $newOrder->conversion_rate = 1.000000;
if (isset($orderStatus)) { if (isset($orderStatus)) {
$newOrder->current_state = (int) $orderStatus; $newOrder->current_state = (int)$orderStatus;
$newOrderHistoryRecord = new OrderHistory( $newOrderHistoryRecord = new OrderHistory(
null, null,
static::$default_lang, static::$default_lang,
@ -526,7 +527,7 @@ class RetailcrmHistory
$product_list = array(); $product_list = array();
foreach ($order['items'] as $item) { foreach ($order['items'] as $item) {
$product = new Product((int) $item['offer']['externalId'], false, self::$default_lang); $product = new Product((int)$item['offer']['externalId'], false, self::$default_lang);
$product_id = $item['offer']['externalId']; $product_id = $item['offer']['externalId'];
$product_attribute_id = 0; $product_attribute_id = 0;
@ -553,7 +554,7 @@ class RetailcrmHistory
null, null,
(int)$cart->id (int)$cart->id
); );
if ($product_attribute_id != 0) { if ($product_attribute_id != 0) {
$productName = htmlspecialchars( $productName = htmlspecialchars(
strip_tags(Product::getProductName($product_id, $product_attribute_id)) strip_tags(Product::getProductName($product_id, $product_attribute_id))
@ -722,7 +723,7 @@ class RetailcrmHistory
continue; continue;
} }
$orderToUpdate = new Order((int) $order['externalId']); $orderToUpdate = new Order((int)$order['externalId']);
self::handleCustomerDataChange($orderToUpdate, $order); self::handleCustomerDataChange($orderToUpdate, $order);
/* /*
@ -741,7 +742,7 @@ class RetailcrmHistory
$order['delivery']['address'] $order['delivery']['address']
); );
} else { } else {
$customerForAddress['address'] = $order['delivery']['address']; $customerForAddress['address'] = $order['delivery']['address'];
} }
$customerBuilder $customerBuilder
@ -749,7 +750,7 @@ class RetailcrmHistory
->build(); ->build();
$address = $customerBuilder->getData()->getCustomerAddress(); $address = $customerBuilder->getData()->getCustomerAddress();
if(!is_null($address)) { if (!is_null($address)) {
$address->id = $orderToUpdate->id_address_delivery; $address->id = $orderToUpdate->id_address_delivery;
$address->update(); $address->update();
@ -829,7 +830,7 @@ class RetailcrmHistory
$orderPayment->payment_method = $payType; $orderPayment->payment_method = $payType;
$orderPayment->order_reference = $orderToUpdate->reference; $orderPayment->order_reference = $orderToUpdate->reference;
if (isset($payment['amount'])){ if (isset($payment['amount'])) {
$orderPayment->amount = $payment['amount']; $orderPayment->amount = $payment['amount'];
} else { } else {
$orderPayment->amount = $orderToUpdate->total_paid; $orderPayment->amount = $orderToUpdate->total_paid;
@ -895,7 +896,7 @@ class RetailcrmHistory
) )
); );
$orderHistory->changeIdOrderState($statuses[$stype], $orderToUpdate->id,true); $orderHistory->changeIdOrderState($statuses[$stype], $orderToUpdate->id, true);
} }
} }
} }
@ -925,7 +926,7 @@ class RetailcrmHistory
&& $crmOrderResponse->isSuccessful() && $crmOrderResponse->isSuccessful()
&& $crmOrderResponse->offsetExists('order') && $crmOrderResponse->offsetExists('order')
) { ) {
return (array) $crmOrderResponse['order']; return (array)$crmOrderResponse['order'];
} }
return array(); return array();
@ -934,9 +935,9 @@ class RetailcrmHistory
/** /**
* Sets all needed data for customer switch to switcher state * Sets all needed data for customer switch to switcher state
* *
* @param array $crmCustomer * @param array $crmCustomer
* @param \RetailcrmCustomerSwitcherState $data * @param \RetailcrmCustomerSwitcherState $data
* @param bool $isContact * @param bool $isContact
*/ */
protected static function prepareChangeToIndividual($crmCustomer, $data, $isContact = false) protected static function prepareChangeToIndividual($crmCustomer, $data, $isContact = false)
{ {
@ -961,7 +962,7 @@ class RetailcrmHistory
* Handle customer data change (from individual to corporate, company change, etc) * Handle customer data change (from individual to corporate, company change, etc)
* *
* @param \Order $order * @param \Order $order
* @param array $historyOrder * @param array $historyOrder
* *
* @return bool True if customer change happened; false otherwise. * @return bool True if customer change happened; false otherwise.
*/ */
@ -1080,7 +1081,7 @@ class RetailcrmHistory
/** /**
* Updates items in order via history * Updates items in order via history
* *
* @param array $order * @param array $order
* @param Order|\OrderCore $orderToUpdate * @param Order|\OrderCore $orderToUpdate
* *
* @throws \PrestaShopDatabaseException * @throws \PrestaShopDatabaseException
@ -1130,7 +1131,7 @@ class RetailcrmHistory
$product_id == $orderItem['product_id'] && $product_id == $orderItem['product_id'] &&
$product_attribute_id == $orderItem['product_attribute_id'] $product_attribute_id == $orderItem['product_attribute_id']
) { ) {
$product = new Product((int) $product_id, false, self::$default_lang); $product = new Product((int)$product_id, false, self::$default_lang);
$tax = new TaxCore($product->id_tax_rules_group); $tax = new TaxCore($product->id_tax_rules_group);
if ($product_attribute_id != 0) { if ($product_attribute_id != 0) {
@ -1162,7 +1163,7 @@ class RetailcrmHistory
if (!isset($orderDetail->id_order) && !isset($orderDetail->id_shop)) { if (!isset($orderDetail->id_order) && !isset($orderDetail->id_shop)) {
$orderDetail->id_order = $orderToUpdate->id; $orderDetail->id_order = $orderToUpdate->id;
$orderDetail->id_shop = Context::getContext()->shop->id; $orderDetail->id_shop = Context::getContext()->shop->id;
$product = new Product((int) $product_id, false, self::$default_lang); $product = new Product((int)$product_id, false, self::$default_lang);
$productName = static::removeEdgeQuotes(htmlspecialchars(strip_tags( $productName = static::removeEdgeQuotes(htmlspecialchars(strip_tags(
!empty($item['offer']['displayName']) !empty($item['offer']['displayName'])
@ -1174,9 +1175,9 @@ class RetailcrmHistory
$orderDetail->product_price = isset($item['initialPrice']) $orderDetail->product_price = isset($item['initialPrice'])
? $item['initialPrice'] : $product->price; ? $item['initialPrice'] : $product->price;
$orderDetail->product_id = (int) $product_id; $orderDetail->product_id = (int)$product_id;
$orderDetail->product_attribute_id = (int) $product_attribute_id; $orderDetail->product_attribute_id = (int)$product_attribute_id;
$orderDetail->product_quantity = (int) $item['quantity']; $orderDetail->product_quantity = (int)$item['quantity'];
RetailcrmLogger::writeDebug( RetailcrmLogger::writeDebug(
__METHOD__, __METHOD__,
@ -1206,8 +1207,8 @@ class RetailcrmHistory
"id" => $key, "id" => $key,
"externalIds" => array( "externalIds" => array(
array( array(
'code' =>'prestashop', 'code' => 'prestashop',
'value' => $productId."_".$item['id_order_detail'], 'value' => $productId . "_" . $item['id_order_detail'],
) )
), ),
'initialPrice' => $item['unit_price_tax_incl'], 'initialPrice' => $item['unit_price_tax_incl'],
@ -1258,7 +1259,7 @@ class RetailcrmHistory
$product_id = $parsedExtId['product_id']; $product_id = $parsedExtId['product_id'];
$product_attribute_id = $parsedExtId['product_attribute_id']; $product_attribute_id = $parsedExtId['product_attribute_id'];
$product = new Product((int) $product_id, false, self::$default_lang); $product = new Product((int)$product_id, false, self::$default_lang);
$tax = new TaxCore($product->id_tax_rules_group); $tax = new TaxCore($product->id_tax_rules_group);
if ($product_attribute_id != 0) { if ($product_attribute_id != 0) {
@ -1291,10 +1292,10 @@ class RetailcrmHistory
$orderDetail->id_order = $orderToUpdate->id; $orderDetail->id_order = $orderToUpdate->id;
$orderDetail->id_order_invoice = $orderToUpdate->invoice_number; $orderDetail->id_order_invoice = $orderToUpdate->invoice_number;
$orderDetail->id_shop = Context::getContext()->shop->id; $orderDetail->id_shop = Context::getContext()->shop->id;
$orderDetail->product_id = (int) $product_id; $orderDetail->product_id = (int)$product_id;
$orderDetail->product_attribute_id = (int) $product_attribute_id; $orderDetail->product_attribute_id = (int)$product_attribute_id;
$orderDetail->product_quantity = (int) $newItem['quantity']; $orderDetail->product_quantity = (int)$newItem['quantity'];
$orderDetail->product_quantity_in_stock = (int) $newItem['quantity']; $orderDetail->product_quantity_in_stock = (int)$newItem['quantity'];
$orderDetail->product_price = $productPrice; $orderDetail->product_price = $productPrice;
$orderDetail->product_reference = implode('', array('\'', $product->reference, '\'')); $orderDetail->product_reference = implode('', array('\'', $product->reference, '\''));
$orderDetail->total_price_tax_excl = $productPrice * $newItem['quantity']; $orderDetail->total_price_tax_excl = $productPrice * $newItem['quantity'];
@ -1401,10 +1402,10 @@ class RetailcrmHistory
{ {
Db::getInstance()->execute(' Db::getInstance()->execute('
DELETE FROM ' . _DB_PREFIX_ . 'order_detail DELETE FROM ' . _DB_PREFIX_ . 'order_detail
WHERE id_order = ' . pSQL((int) $order_id) . ' WHERE id_order = ' . pSQL((int)$order_id) . '
AND product_id = ' . pSQL((int) $product_id) . ' AND product_id = ' . pSQL((int)$product_id) . '
AND product_attribute_id = ' . pSQL((int) $product_attribute_id) . ' AND product_attribute_id = ' . pSQL((int)$product_attribute_id) . '
AND id_order_detail = ' . pSQL((int) $id_order_detail) AND id_order_detail = ' . pSQL((int)$id_order_detail)
); );
} }
@ -1473,8 +1474,8 @@ class RetailcrmHistory
* - Changes from current API key are merged when it's not needed. * - Changes from current API key are merged when it's not needed.
* - Changes from CRM can overwrite more actual changes from CMS due to ignoring current API key changes. * - Changes from CRM can overwrite more actual changes from CMS due to ignoring current API key changes.
* *
* @param array $historyEntries Raw history from CRM * @param array $historyEntries Raw history from CRM
* @param string $recordType Entity field name, e.g. `customer` or `order`. * @param string $recordType Entity field name, e.g. `customer` or `order`.
* *
* @return array * @return array
*/ */
@ -1549,7 +1550,7 @@ class RetailcrmHistory
if (is_array($item) && count($item) > 0) { if (is_array($item) && count($item) > 0) {
$item = reset($item); $item = reset($item);
return (int) $item['id_customer']; return (int)$item['id_customer'];
} }
} }
@ -1655,7 +1656,7 @@ class RetailcrmHistory
* Sets product_name in OrderDetail through validation * Sets product_name in OrderDetail through validation
* *
* @param OrderDetail|\OrderDetailCore $object * @param OrderDetail|\OrderDetailCore $object
* @param string $name * @param string $name
* *
* @throws \PrestaShopException * @throws \PrestaShopException
*/ */
@ -1686,8 +1687,8 @@ class RetailcrmHistory
$upOrderItems['items'][] = array( $upOrderItems['items'][] = array(
"externalIds" => array( "externalIds" => array(
array( array(
'code' =>'prestashop', 'code' => 'prestashop',
'value' => $productId."_".$item['id_order_detail'], 'value' => $productId . "_" . $item['id_order_detail'],
) )
), ),
'initialPrice' => $item['unit_price_tax_incl'], 'initialPrice' => $item['unit_price_tax_incl'],
@ -1698,8 +1699,65 @@ class RetailcrmHistory
} }
unset($orderdb); unset($orderdb);
if(isset($upOrderItems['items'])) if (isset($upOrderItems['items']))
self::$api->ordersEdit($upOrderItems); self::$api->ordersEdit($upOrderItems);
} }
/**
* Updates sinceId for orders or customers to the latest value
*
* @param string $entity Can be either 'orders' or 'customers'
* @return bool
*/
public static function updateSinceId($entity)
{
if ($entity === 'orders') {
$key = 'RETAILCRM_LAST_ORDERS_SYNC';
$method = 'ordersHistory';
} elseif ($entity === 'customers') {
$key = 'RETAILCRM_LAST_CUSTOMERS_SYNC';
$method = 'customersHistory';
} else {
return false;
}
$currentSinceID = Configuration::get($key);
RetailcrmLogger::writeDebug(__METHOD__, "Current $entity sinceId: $currentSinceID");
$historyResponse = call_user_func_array(
array(self::$api, $method),
array(
array('sinceId' => $currentSinceID),
null,
20
)
);
if ($historyResponse instanceof RetailcrmApiResponse && $historyResponse->offsetExists('pagination')) {
$lastPage = $historyResponse['pagination']['totalPageCount'];
if ($lastPage > 1) {
$historyResponse = call_user_func_array(
array(self::$api, $method),
array(
array('sinceId' => $currentSinceID),
$lastPage,
20
)
);
}
if ($historyResponse instanceof RetailcrmApiResponse && $historyResponse->offsetExists('history') && !empty($historyResponse['history'])) {
$history = $historyResponse['history'];
$lastSinceId = end($history)['id'];
if ($currentSinceID !== strval($lastSinceId)) {
RetailcrmLogger::writeDebug(__METHOD__, "Updating to: $lastSinceId");
Configuration::updateValue($key, $lastSinceId);
}
}
}
return true;
}
} }

View File

@ -0,0 +1,82 @@
<?php
/**
* MIT License
*
* Copyright (c) 2020 DIGITAL RETAIL TECHNOLOGIES SL
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author DIGITAL RETAIL TECHNOLOGIES SL <mail@simlachat.com>
* @copyright 2020 DIGITAL RETAIL TECHNOLOGIES SL
* @license https://opensource.org/licenses/MIT The MIT License
*
* Don't forget to prefix your containers with your own identifier
* to avoid any conflicts with others containers.
*/
require_once(dirname(__FILE__) . '/../RetailcrmPrestashopLoader.php');
class RetailcrmUpdateSinceIdEvent extends RetailcrmAbstractEvent implements RetailcrmEventInterface
{
/**
* @inheritDoc
*/
public function execute()
{
if ($this->isRunning()) {
return false;
}
$this->setRunning();
$shops = $this->getShops();
foreach ($shops as $shop) {
RetailcrmTools::setShopContext(intval($shop['id_shop']));
$api = RetailcrmTools::getApiClient();
if (empty($api)) {
RetailcrmLogger::writeCaller(__METHOD__, 'Set api key & url first');
continue;
}
RetailcrmHistory::$api = $api;
RetailcrmHistory::updateSinceId('customers');
RetailcrmHistory::updateSinceId('orders');
}
return true;
}
/**
* @inheritDoc
*/
public function getName()
{
return 'RetailcrmUpdateSinceIdEvent';
}
}