diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9f11b75
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.idea/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bd48997..a7ab3fe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+## v2.3.0
+* Добавлена возможность выгрузки заказов вручную
+
## v2.2.11
* Добавлена валидация доменов pro и es в адресах retailCRM
diff --git a/VERSION b/VERSION
index 4c22129..cc6612c 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.2.11
\ No newline at end of file
+2.3.0
\ No newline at end of file
diff --git a/retailcrm/job/export.php b/retailcrm/job/export.php
index b45b00c..7f2c0da 100644
--- a/retailcrm/job/export.php
+++ b/retailcrm/job/export.php
@@ -29,130 +29,34 @@ if (!empty($apiUrl) && !empty($apiKey)) {
$orders = array();
$customers = array();
-$customerInstance = new Customer();
-$orderInstance = new Order();
-
-$customerRecords = $customerInstance->getCustomers();
-$orderRecords = $orderInstance->getOrdersWithInformations();
+$customerRecords = Customer::getCustomers();
+$orderRecords = Order::getOrdersWithInformations();
$delivery = json_decode(Configuration::get('RETAILCRM_API_DELIVERY'), true);
$payment = json_decode(Configuration::get('RETAILCRM_API_PAYMENT'), true);
$status = json_decode(Configuration::get('RETAILCRM_API_STATUS'), true);
foreach ($customerRecords as $record) {
- $customers[$record['id_customer']] = array(
- 'externalId' => $record['id_customer'],
- 'firstName' => $record['firstname'],
- 'lastname' => $record['lastname'],
- 'email' => $record['email']
- );
+ $customers[$record['id_customer']] = RetailCRM::buildCrmCustomer(new Customer($record['id_customer']));
}
unset($customerRecords);
foreach ($orderRecords as $record) {
- $object = new Order($record['id_order']);
+ $order = new Order();
- if (Module::getInstanceByName('advancedcheckout') === false) {
- $paymentType = $record['module'];
- } else {
- $paymentType = $record['payment'];
+ foreach ($record as $property => $value) {
+ $order->$property = $value;
}
- if ($record['current_state'] == 0) {
- $order_status = $statusExport;
- } else {
- $order_status = array_key_exists($record['current_state'], $status)
- ? $status[$record['current_state']]
- : $statusExport
- ;
- }
+ $order->id = $record['id_order'];
- $cart = new Cart($object->getCartIdStatic($record['id_order']));
- $addressCollection = $cart->getAddressCollection();
- $address = array_shift($addressCollection);
-
- if ($address instanceof Address) {
- $phone = is_null($address->phone)
- ? is_null($address->phone_mobile) ? '' : $address->phone_mobile
- : $address->phone
- ;
-
- $postcode = $address->postcode;
- $city = $address->city;
- $addres_line = sprintf("%s %s", $address->address1, $address->address2);
- }
-
- $order = array(
- 'externalId' => $record['id_order'],
- 'createdAt' => $record['date_add'],
- 'status' => $order_status,
- 'firstName' => $record['firstname'],
- 'lastName' => $record['lastname'],
- 'email' => $record['email'],
+ $orders[$record['id_order']] = RetailCRM::buildCrmOrder(
+ $order,
+ null,
+ null,
+ true
);
-
- if (isset($postcode)) {
- $order['delivery']['address']['index'] = $postcode;
- }
-
- if (isset($city)) {
- $order['delivery']['address']['city'] = $city;
- }
-
- if (isset($addres_line)) {
- $order['delivery']['address']['text'] = $addres_line;
- }
-
- if ($phone) {
- $order['phone'] = $phone;
- }
-
- if ($apiVersion != 5) {
- if (array_key_exists($paymentType, $payment)) {
- $order['paymentType'] = $payment[$paymentType];
- }
- } else {
- $order_payment = array(
- 'externalId' => $record['id_order'] .'#'. $record['reference'],
- 'amount' => $record['total_paid'],
- 'type' => $payment[$paymentType] ? $payment[$paymentType] : ''
- );
- $order['payments'][] = $order_payment;
- }
-
- if (array_key_exists($record['id_carrier'], $delivery)) {
- $order['delivery']['code'] = $delivery[$record['id_carrier']];
- }
-
- if (isset($record['total_shipping_tax_incl']) && (int) $record['total_shipping_tax_incl'] > 0) {
- $order['delivery']['cost'] = round($record['total_shipping_tax_incl'], 2);
- }
-
- $products = $object->getProducts();
-
- foreach ($products as $product) {
- if (isset($product['product_attribute_id']) && $product['product_attribute_id'] > 0) {
- $productId = $product['product_id'] . '#' . $product['product_attribute_id'];
- } else {
- $productId = $product['product_id'];
- }
- $item = array(
- 'offer' => array('externalId' => $productId),
- 'productName' => $product['product_name'],
- 'quantity' => $product['product_quantity'],
- 'initialPrice' => round($product['product_price'], 2),
- 'purchasePrice' => round($product['purchase_supplier_price'], 2)
- );
-
- $order['items'][] = $item;
- }
-
- if ($record['id_customer']) {
- $order['customer']['externalId'] = $record['id_customer'];
- }
-
- $orders[$record['id_order']] = $order;
}
unset($orderRecords);
diff --git a/retailcrm/lib/RetailcrmApiErrors.php b/retailcrm/lib/RetailcrmApiErrors.php
new file mode 100644
index 0000000..1f621d0
--- /dev/null
+++ b/retailcrm/lib/RetailcrmApiErrors.php
@@ -0,0 +1,77 @@
+isSuccessful()) {
error_log("[$date] @ [$method] " . $response->getErrorMsg() . "\n", 3, $this->log);
if (isset($response['errors'])) {
+ RetailcrmApiErrors::set($response['errors'], $response->getStatusCode());
$error = implode("\n", $response['errors']);
error_log($error . "\n", 3, $this->log);
}
diff --git a/retailcrm/public/css/retailcrm-upload.css b/retailcrm/public/css/retailcrm-upload.css
new file mode 100644
index 0000000..d9f17a6
--- /dev/null
+++ b/retailcrm/public/css/retailcrm-upload.css
@@ -0,0 +1,29 @@
+#retailcrm-loading-fade {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ background: #000;
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: 9999;
+ opacity: .5;
+ filter: alpha(opacity=50);
+}
+
+#retailcrm-loader {
+ width: 50px;
+ height: 50px;
+ border: 10px solid white;
+ animation: retailcrm-loader 2s linear infinite;
+ border-top: 10px solid #0c0c0c;
+ border-radius: 50%;
+}
+
+@keyframes retailcrm-loader {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
\ No newline at end of file
diff --git a/retailcrm/public/js/retailcrm-upload.js b/retailcrm/public/js/retailcrm-upload.js
new file mode 100644
index 0000000..895fd34
--- /dev/null
+++ b/retailcrm/public/js/retailcrm-upload.js
@@ -0,0 +1,66 @@
+$(function(){
+ function RetailcrmUploadForm() {
+ this.form = $('input[value="retailcrm_upload_form"]').parent().get(0);
+
+ if (typeof this.form === 'undefined') {
+ return false;
+ }
+
+ this.input = $(this.form).find('input[name="RETAILCRM_UPLOAD_ORDERS_ID"]').get(0);
+ this.submitButton = $(this.form).find('button[type="submit"]').get(0);
+ this.messageContainer = document.querySelector('#content > div.bootstrap + div.bootstrap');
+ this.submitAction = this.submitAction.bind(this);
+ this.partitionId = this.partitionId.bind(this);
+ this.setLoading = this.setLoading.bind(this);
+
+ $(this.submitButton).click(this.submitAction);
+ }
+
+ RetailcrmUploadForm.prototype.submitAction = function (event) {
+ event.preventDefault();
+ let ids = this.partitionId($(this.input).val().toString().replace(/\s+/g, ''));
+
+ if (ids.length === 0) {
+ return false;
+ }
+
+ this.setLoading(true);
+ $(this.form).submit();
+ }
+
+ RetailcrmUploadForm.prototype.setLoading = function (loading) {
+ let indicator = $('div#retailcrm-loading-fade');
+
+ if (indicator.length === 0) {
+ $('body').append(`
+
+ `.trim());
+ }
+
+ indicator.css('visibility', (loading ? 'visible' : 'hidden'));
+ }
+
+ RetailcrmUploadForm.prototype.partitionId = function (idList) {
+ if (idList === '') {
+ return [];
+ }
+
+ let itemsList = idList.split(',');
+ let ids = itemsList.filter(item => item.toString().indexOf('-') === -1);
+ let ranges = itemsList.filter(item => item.toString().indexOf('-') !== -1);
+ let resultRanges = [];
+
+ ranges.forEach(item => {
+ let rangeData = item.split('-');
+
+ resultRanges = [...resultRanges, ...[...Array(+rangeData[1] + 1)
+ .keys()].slice(+rangeData[0], +rangeData[1] + 1)];
+ });
+
+ return [...ids, ...resultRanges].map(item => +item).sort((a, b) => a - b);
+ }
+
+ new RetailcrmUploadForm();
+});
\ No newline at end of file
diff --git a/retailcrm/retailcrm.php b/retailcrm/retailcrm.php
index 2288d29..a57d6c9 100644
--- a/retailcrm/retailcrm.php
+++ b/retailcrm/retailcrm.php
@@ -38,7 +38,7 @@ class RetailCRM extends Module
{
$this->name = 'retailcrm';
$this->tab = 'export';
- $this->version = '2.2.11';
+ $this->version = '2.3.0';
$this->author = 'Retail Driver LCC';
$this->displayName = $this->l('RetailCRM');
$this->description = $this->l('Integration module for RetailCRM');
@@ -127,49 +127,55 @@ class RetailCRM extends Module
$version = Configuration::get('RETAILCRM_API_VERSION');
if (Tools::isSubmit('submit' . $this->name)) {
- $address = (string)(Tools::getValue('RETAILCRM_ADDRESS'));
- $token = (string)(Tools::getValue('RETAILCRM_API_TOKEN'));
- $version = (string)(Tools::getValue('RETAILCRM_API_VERSION'));
- $delivery = json_encode(Tools::getValue('RETAILCRM_API_DELIVERY'));
- $status = json_encode(Tools::getValue('RETAILCRM_API_STATUS'));
- $payment = json_encode(Tools::getValue('RETAILCRM_API_PAYMENT'));
- $deliveryDefault = json_encode(Tools::getValue('RETAILCRM_API_DELIVERY_DEFAULT'));
- $paymentDefault = json_encode(Tools::getValue('RETAILCRM_API_PAYMENT_DEFAULT'));
- $statusExport = (string)(Tools::getValue('RETAILCRM_STATUS_EXPORT'));
- $collectorActive = (Tools::getValue('RETAILCRM_DAEMON_COLLECTOR_ACTIVE_1'));
- $collectorKey = (string)(Tools::getValue('RETAILCRM_DAEMON_COLLECTOR_KEY'));
- $clientId = Configuration::get('RETAILCRM_CLIENT_ID');
+ $ordersIds = (string)(Tools::getValue('RETAILCRM_UPLOAD_ORDERS_ID'));
- $settings = array(
- 'address' => $address,
- 'token' => $token,
- 'version' => $version,
- 'clientId' => $clientId
- );
+ if (!empty($ordersIds)) {
+ $output .= $this->uploadOrders(static::partitionId($ordersIds));
+ } else {
+ $address = (string)(Tools::getValue('RETAILCRM_ADDRESS'));
+ $token = (string)(Tools::getValue('RETAILCRM_API_TOKEN'));
+ $version = (string)(Tools::getValue('RETAILCRM_API_VERSION'));
+ $delivery = json_encode(Tools::getValue('RETAILCRM_API_DELIVERY'));
+ $status = json_encode(Tools::getValue('RETAILCRM_API_STATUS'));
+ $payment = json_encode(Tools::getValue('RETAILCRM_API_PAYMENT'));
+ $deliveryDefault = json_encode(Tools::getValue('RETAILCRM_API_DELIVERY_DEFAULT'));
+ $paymentDefault = json_encode(Tools::getValue('RETAILCRM_API_PAYMENT_DEFAULT'));
+ $statusExport = (string)(Tools::getValue('RETAILCRM_STATUS_EXPORT'));
+ $collectorActive = (Tools::getValue('RETAILCRM_DAEMON_COLLECTOR_ACTIVE_1'));
+ $collectorKey = (string)(Tools::getValue('RETAILCRM_DAEMON_COLLECTOR_KEY'));
+ $clientId = Configuration::get('RETAILCRM_CLIENT_ID');
- $output .= $this->validateForm($settings, $output);
+ $settings = array(
+ 'address' => $address,
+ 'token' => $token,
+ 'version' => $version,
+ 'clientId' => $clientId
+ );
- if ($output === '') {
- Configuration::updateValue('RETAILCRM_ADDRESS', $address);
- Configuration::updateValue('RETAILCRM_API_TOKEN', $token);
- Configuration::updateValue('RETAILCRM_API_VERSION', $version);
- Configuration::updateValue('RETAILCRM_API_DELIVERY', $delivery);
- Configuration::updateValue('RETAILCRM_API_STATUS', $status);
- Configuration::updateValue('RETAILCRM_API_PAYMENT', $payment);
- Configuration::updateValue('RETAILCRM_API_DELIVERY_DEFAULT', $deliveryDefault);
- Configuration::updateValue('RETAILCRM_API_PAYMENT_DEFAULT', $paymentDefault);
- Configuration::updateValue('RETAILCRM_STATUS_EXPORT', $statusExport);
- Configuration::updateValue('RETAILCRM_DAEMON_COLLECTOR_ACTIVE', $collectorActive);
- Configuration::updateValue('RETAILCRM_DAEMON_COLLECTOR_KEY', $collectorKey);
+ $output .= $this->validateForm($settings, $output);
- $output .= $this->displayConfirmation($this->l('Settings updated'));
- }
+ if ($output === '') {
+ Configuration::updateValue('RETAILCRM_ADDRESS', $address);
+ Configuration::updateValue('RETAILCRM_API_TOKEN', $token);
+ Configuration::updateValue('RETAILCRM_API_VERSION', $version);
+ Configuration::updateValue('RETAILCRM_API_DELIVERY', $delivery);
+ Configuration::updateValue('RETAILCRM_API_STATUS', $status);
+ Configuration::updateValue('RETAILCRM_API_PAYMENT', $payment);
+ Configuration::updateValue('RETAILCRM_API_DELIVERY_DEFAULT', $deliveryDefault);
+ Configuration::updateValue('RETAILCRM_API_PAYMENT_DEFAULT', $paymentDefault);
+ Configuration::updateValue('RETAILCRM_STATUS_EXPORT', $statusExport);
+ Configuration::updateValue('RETAILCRM_DAEMON_COLLECTOR_ACTIVE', $collectorActive);
+ Configuration::updateValue('RETAILCRM_DAEMON_COLLECTOR_KEY', $collectorKey);
- if ($version == 5 && $this->isRegisteredInHook('actionPaymentCCAdd') == 0) {
- $this->registerHook('actionPaymentCCAdd');
- } elseif ($version == 4 && $this->isRegisteredInHook('actionPaymentCCAdd') == 1) {
- $hook_id = Hook::getIdByName('actionPaymentCCAdd');
- $this->unregisterHook($hook_id);
+ $output .= $this->displayConfirmation($this->l('Settings updated'));
+ }
+
+ if ($version == 5 && $this->isRegisteredInHook('actionPaymentCCAdd') == 0) {
+ $this->registerHook('actionPaymentCCAdd');
+ } elseif ($version == 4 && $this->isRegisteredInHook('actionPaymentCCAdd') == 1) {
+ $hook_id = Hook::getIdByName('actionPaymentCCAdd');
+ $this->unregisterHook($hook_id);
+ }
}
}
@@ -183,12 +189,309 @@ class RetailCRM extends Module
"$address/admin/settings#t-main"
);
+ $assetsBase =
+ Tools::getShopDomainSsl(true, true) .
+ __PS_BASE_URI__ .
+ 'modules/' .
+ $this->name .
+ '/public';
+ $this->context->controller->addCSS($assetsBase . '/css/retailcrm-upload.css');
+ $this->context->controller->addJS($assetsBase . '/js/retailcrm-upload.js');
$this->display(__FILE__, 'retailcrm.tpl');
- return $output . $this->displayForm();
+ return $output . $this->displaySettingsForm() . $this->displayUploadOrdersForm();
}
- public function displayForm()
+ public function uploadOrders($orderIds)
+ {
+ if (count($orderIds) > 10) {
+ return $this->displayConfirmation($this->l("Can't upload more than 10 orders per request"));
+ }
+
+ if (count($orderIds) < 1) {
+ return $this->displayConfirmation($this->l("At least one order ID should be specified"));
+ }
+
+ $apiUrl = Configuration::get('RETAILCRM_ADDRESS');
+ $apiKey = Configuration::get('RETAILCRM_API_TOKEN');
+ $apiVersion = Configuration::get('RETAILCRM_API_VERSION');
+
+ if (!empty($apiUrl) && !empty($apiKey)) {
+ if (!($this->api instanceof RetailcrmProxy)) {
+ $this->api = new RetailcrmProxy($apiUrl, $apiKey, _PS_ROOT_DIR_ . '/retailcrm.log', $apiVersion);
+ }
+ } else {
+ return $this->displayError($this->l("Can't upload orders - set API key and API URL first!"));
+ }
+
+ $orders = array();
+ $customers = array();
+ $isSuccessful = true;
+
+ foreach ($orderIds as $orderId) {
+ $object = new Order($orderId);
+ $customer = new Customer($object->id_customer);
+
+ array_push($customers, static::buildCrmCustomer($customer));
+ array_push($orders, static::buildCrmOrder($object, $customer, null, true));
+ }
+
+ foreach ($customers as $item) {
+ if ($this->api->customersGet($item['externalId']) === false) {
+ $this->api->customersCreate($item);
+ time_nanosleep(0, 50000000);
+ }
+ }
+
+ foreach ($orders as $item) {
+ if ($this->api->ordersGet($item['externalId']) === false) {
+ $response = $this->api->ordersCreate($item);
+ } else {
+ $response = $this->api->ordersEdit($item);
+ }
+
+ $isSuccessful = is_bool($response) ? $response : $response->isSuccessful();
+
+ time_nanosleep(0, 50000000);
+ }
+
+ if ($isSuccessful) {
+ return $this->displayConfirmation($this->l('All orders were uploaded successfully'));
+ } else {
+ $result = $this->displayWarning($this->l('Not all orders were uploaded successfully'));
+
+ foreach (RetailcrmApiErrors::getErrors() as $error) {
+ $result .= $this->displayError($error);
+ }
+
+ return $result;
+ }
+ }
+
+ /**
+ * Build array with order data for retailCRM from PrestaShop order data
+ *
+ * @param Order $order PrestaShop Order
+ * @param Customer $customer PrestaShop Customer
+ * @param Cart $orderCart Cart for provided order. Optional
+ * @param bool $isStatusExport Use status for export
+ * @param bool $preferCustomerAddress Use customer address even if delivery address is provided
+ *
+ * @return array retailCRM order data
+ */
+ public static function buildCrmOrder(
+ Order $order,
+ Customer $customer = null,
+ Cart $orderCart = null,
+ $isStatusExport = false,
+ $preferCustomerAddress = false
+ ) {
+ $apiVersion = Configuration::get('RETAILCRM_API_VERSION');
+ $statusExport = Configuration::get('RETAILCRM_STATUS_EXPORT');
+ $delivery = json_decode(Configuration::get('RETAILCRM_API_DELIVERY'), true);
+ $payment = json_decode(Configuration::get('RETAILCRM_API_PAYMENT'), true);
+ $status = json_decode(Configuration::get('RETAILCRM_API_STATUS'), true);
+
+ if (Module::getInstanceByName('advancedcheckout') === false) {
+ $paymentType = $order->module;
+ } else {
+ $paymentType = $order->payment;
+ }
+
+ if ($order->current_state == 0) {
+ $order_status = $statusExport;
+
+ if (!$isStatusExport) {
+ $order_status =
+ array_key_exists($order->current_state, $status)
+ ? $status[$order->current_state] : 'new';
+ }
+ } else {
+ $order_status = array_key_exists($order->current_state, $status)
+ ? $status[$order->current_state]
+ : $statusExport
+ ;
+ }
+
+ $phone = '';
+ $cart = $orderCart;
+
+ if (is_null($cart)) {
+ $cart = new Cart($order->getCartIdStatic($order->id));
+ }
+
+ if (is_null($customer)) {
+ $customer = new Customer($order->id_customer);
+ }
+
+ $crmOrder = array(
+ 'externalId' => $order->id,
+ 'createdAt' => $order->date_add,
+ 'status' => $order_status,
+ 'firstName' => $customer->firstname,
+ 'lastName' => $customer->lastname,
+ 'email' => $customer->email,
+ );
+
+ $addressCollection = $cart->getAddressCollection();
+ $address = new Address($order->id_address_delivery);
+
+ if (is_null($address->id) || $preferCustomerAddress === true) {
+ $address = array_filter(
+ $addressCollection,
+ function ($v) use ($customer) {
+ return $v->id_customer == $customer->id;
+ }
+ );
+ }
+
+ $address = static::addressParse($address);
+ $crmOrder = array_merge($crmOrder, $address['order']);
+
+ if ($phone) {
+ $crmOrder['phone'] = $phone;
+ }
+
+ if ($apiVersion != 5) {
+ if (array_key_exists($paymentType, $payment) && !empty($payment[$paymentType])) {
+ $crmOrder['paymentType'] = $payment[$paymentType];
+ }
+
+ $crmOrder['discount'] = round($order->total_discounts, 2);
+ } else {
+ $order_payment = array(
+ 'externalId' => $order->id .'#'. $order->reference,
+ 'amount' => round($order->total_paid, 2),
+ 'type' => $payment[$paymentType] ? $payment[$paymentType] : ''
+ );
+
+ $crmOrder['discountManualAmount'] = round($order->total_discounts, 2);
+ }
+
+ if (isset($order_payment)) {
+ $crmOrder['payments'][] = $order_payment;
+ } else {
+ $crmOrder['payments'] = array();
+ }
+
+ if (array_key_exists($order->id_carrier, $delivery) && !empty($delivery[$order->id_carrier])) {
+ $crmOrder['delivery']['code'] = $delivery[$order->id_carrier];
+ }
+
+ if (isset($order->total_shipping) && ((int) $order->total_shipping) > 0) {
+ $crmOrder['delivery']['cost'] = round($order->total_shipping, 2);
+ }
+
+ if (isset($order->total_shipping_tax_excl) && $order->total_shipping_tax_excl > 0) {
+ $crmOrder['delivery']['netCost'] = round($order->total_shipping_tax_excl, 2);
+ }
+
+ $comment = $order->getFirstMessage();
+
+ if ($comment !== false) {
+ $crmOrder['customerComment'] = $comment;
+ }
+
+ foreach ($order->getProducts() as $product) {
+ if (isset($product['product_attribute_id']) && $product['product_attribute_id'] > 0) {
+ $productId = $product['product_id'] . '#' . $product['product_attribute_id'];
+ } else {
+ $productId = $product['product_id'];
+ }
+
+ if (isset($product['attributes']) && $product['attributes']) {
+ $arProp = array();
+ $count = 0;
+ $arAttr = explode(",", $product['attributes']);
+
+ foreach ($arAttr as $valAttr) {
+ $arItem = explode(":", $valAttr);
+
+ if ($arItem[0] && $arItem[1]) {
+ $arProp[$count]['name'] = trim($arItem[0]);
+ $arProp[$count]['value'] = trim($arItem[1]);
+ }
+
+ $count++;
+ }
+ }
+
+ $item = array(
+ 'offer' => array('externalId' => $productId),
+ 'productName' => $product['product_name'],
+ 'quantity' => $product['product_quantity'],
+ 'initialPrice' => round($product['product_price'], 2),
+ /*'initialPrice' => !empty($item['rate'])
+ ? $item['price'] + ($item['price'] * $item['rate'] / 100)
+ : $item['price'],*/
+ 'purchasePrice' => round($product['purchase_supplier_price'], 2)
+ );
+
+ if (isset($arProp)) {
+ $item['properties'] = $arProp;
+ }
+
+ $crmOrder['items'][] = $item;
+ }
+
+ if ($order->id_customer) {
+ $crmOrder['customer']['externalId'] = $order->id_customer;
+ }
+
+ return $crmOrder;
+ }
+
+ /**
+ * Builds retailCRM customer data from PrestaShop customer data
+ *
+ * @param Customer $object
+ * @param array $address
+ *
+ * @return array
+ */
+ public static function buildCrmCustomer(Customer $object, $address = array())
+ {
+ return array_merge(
+ array(
+ 'externalId' => $object->id,
+ 'firstName' => $object->firstname,
+ 'lastName' => $object->lastname,
+ 'email' => $object->email,
+ 'createdAt' => $object->date_add,
+ 'birthday' => $object->birthday
+ ),
+ $address
+ );
+ }
+
+ /**
+ * Split a string to id
+ *
+ * @param string $ids string with id
+ *
+ * @return array|string
+ */
+ public static function partitionId($ids)
+ {
+ $ids = explode(',', $ids);
+
+ $ranges = [];
+
+ foreach ($ids as $idx => $uid) {
+ if (strpos($uid, '-')) {
+ $range = explode('-', $uid);
+ $ranges = array_merge($ranges, range($range[0], $range[1]));
+ unset($ids[$idx]);
+ }
+ }
+
+ $ids = implode(',', array_merge($ids, $ranges));
+ $ids = explode(',', $ids);
+
+ return $ids;
+ }
+
+ public function displaySettingsForm()
{
$this->displayConfirmation($this->l('Settings updated'));
@@ -329,7 +632,7 @@ class RetailCRM extends Module
}
/*
- * Diplay forms
+ * Display forms
*/
$helper = new HelperForm();
@@ -425,16 +728,71 @@ class RetailCRM extends Module
return $helper->generateForm($fields_form);
}
+ public function displayUploadOrdersForm()
+ {
+ $default_lang = $this->default_lang;
+ $fields_form = array();
+
+ if ($this->api) {
+ $fields_form[]['form'] = array(
+ 'legend' => array('title' => $this->l('Manual Order Upload')),
+ 'input' => array(
+ array(
+ 'type' => 'text',
+ 'label' => $this->l('Orders IDs'),
+ 'name' => 'RETAILCRM_UPLOAD_ORDERS_ID',
+ 'required' => false
+ )
+ ),
+ 'submit' => array(
+ 'title' => $this->l('Upload'),
+ 'class' => 'button'
+ )
+ );
+ }
+
+ $helper = new HelperForm();
+
+ $helper->module = $this;
+ $helper->name_controller = $this->name;
+ $helper->token = Tools::getAdminTokenLite('AdminModules');
+ $helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name;
+ $helper->id = "retailcrm_upload_form";
+
+ $helper->default_form_language = $default_lang;
+ $helper->allow_employee_form_lang = $default_lang;
+
+ $helper->title = $this->displayName;
+ $helper->show_toolbar = true;
+ $helper->toolbar_scroll = true;
+ $helper->submit_action = 'submit' . $this->name;
+ $helper->toolbar_btn = array(
+ 'save' =>
+ array(
+ 'desc' => $this->l('Save'),
+ 'href' => sprintf(
+ "%s&configure=%s&save%s&token=%s",
+ AdminController::$currentIndex,
+ $this->name,
+ $this->name,
+ Tools::getAdminTokenLite('AdminModules')
+ )
+ ),
+ 'back' => array(
+ 'href' => AdminController::$currentIndex . '&token=' . Tools::getAdminTokenLite('AdminModules'),
+ 'desc' => $this->l('Back to list')
+ )
+ );
+
+ $helper->fields_value['RETAILCRM_UPLOAD_ORDERS_ID'] = '';
+
+ return $helper->generateForm($fields_form);
+ }
+
public function hookActionCustomerAccountAdd($params)
{
$customer = $params['newCustomer'];
- $customerSend = array(
- 'externalId' => $customer->id,
- 'firstName' => $customer->firstname,
- 'lastName' => $customer->lastname,
- 'email' => $customer->email,
- 'createdAt' => $customer->date_add
- );
+ $customerSend = static::buildCrmCustomer($customer);
$this->api->customersCreate($customerSend);
@@ -446,13 +804,7 @@ class RetailCRM extends Module
{
$customer = $params['customer'];
- $customerSend = array(
- 'externalId' => $customer->id,
- 'firstName' => $customer->firstname,
- 'lastName' => $customer->lastname,
- 'email' => $customer->email,
- 'birthday' => $customer->birthday
- );
+ $customerSend = static::buildCrmCustomer($customer);
$addreses = $customer->getAddresses($this->default_lang);
$address = array_shift($addreses);
@@ -460,17 +812,17 @@ class RetailCRM extends Module
if (!empty($address)){
if (is_object($address)) {
- $address = $this->addressParse($address);
+ $address = static::addressParse($address);
} else {
$address = new Address($address['id_address']);
- $address = $this->addressParse($address);
+ $address = static::addressParse($address);
}
$customerSend = array_merge($customerSend, $address['customer']);
}
if (isset($params['cart'])){
- $address = $this->addressParse($params['cart']);
+ $address = static::addressParse($params['cart']);
$customerSend = array_merge($customerSend, $address['customer']);
}
@@ -556,7 +908,7 @@ class RetailCRM extends Module
return $order;
}
- private function addressParse($address)
+ private static function addressParse($address)
{
if ($address instanceof Address) {
$postcode = $address->postcode;
@@ -585,7 +937,7 @@ class RetailCRM extends Module
$customer['address']['countryIso'] = $countryIso;
}
- $phones = $this->getPhone($address);
+ $phones = static::getPhone($address);
$order = array_merge($order, $phones['order']);
$customer = array_merge($customer, $phones['customer']);
$addressArray = array('order' => $order, 'customer' => $customer);
@@ -593,7 +945,7 @@ class RetailCRM extends Module
return $addressArray;
}
- private function getPhone($address)
+ private static function getPhone($address)
{
if (!empty($address->phone_mobile)){
$order['phone'] = $address->phone_mobile;
@@ -622,131 +974,14 @@ class RetailCRM extends Module
$status = json_decode(Configuration::get('RETAILCRM_API_STATUS'), true);
if (isset($params['orderStatus'])) {
- $customer = array(
- 'externalId' => $params['customer']->id,
- 'lastName' => $params['customer']->lastname,
- 'firstName' => $params['customer']->firstname,
- 'email' => $params['customer']->email,
- 'createdAt' => $params['customer']->date_add
- );
-
- $order = array(
- 'externalId' => $params['order']->id,
- 'firstName' => $params['customer']->firstname,
- 'lastName' => $params['customer']->lastname,
- 'email' => $params['customer']->email,
- 'createdAt' => $params['order']->date_add,
- 'delivery' => array('cost' => $params['order']->total_shipping)
- );
-
- if ($this->apiVersion != 5) {
- $order['discount'] = $params['order']->total_discounts;
- } else {
- $order['discountManualAmount'] = $params['order']->total_discounts;
- }
-
$cart = $params['cart'];
$addressCollection = $cart->getAddressCollection();
$address = array_shift($addressCollection);
- $address = $this->addressParse($address);
+ $address = static::addressParse($address);
- $customer = array_merge($customer, $address['customer']);
- $order = array_merge($order, $address['order']);
- $comment = $params['order']->getFirstMessage();
- $order['delivery']['cost'] = $params['order']->total_shipping;
-
- if ($comment !== false) {
- $order['customerComment'] = $comment;
- }
-
- foreach ($cart->getProducts() as $item) {
- if (isset($item['id_product_attribute']) && $item['id_product_attribute'] > 0) {
- $productId = $item['id_product'] . '#' . $item['id_product_attribute'];
- } else {
- $productId = $item['id_product'];
- }
-
- if ($item['attributes']) {
- $arProp = array();
- $count = 0;
- $arAttr = explode(",", $item['attributes']);
-
- foreach ($arAttr as $valAttr) {
- $arItem = explode(":", $valAttr);
-
- if ($arItem[0] && $arItem[1]) {
- $arProp[$count]['name'] = trim($arItem[0]);
- $arProp[$count]['value'] = trim($arItem[1]);
- }
-
- $count++;
- }
- }
-
- $orderItem = array(
- 'initialPrice' => !empty($item['rate'])
- ? $item['price'] + ($item['price'] * $item['rate'] / 100)
- : $item['price'],
- 'quantity' => $item['quantity'],
- 'offer' => array('externalId' => $productId),
- 'productName' => $item['name']
- );
-
- if (isset($arProp)) {
- $orderItem['properties'] = $arProp;
- }
-
- $order['items'][] = $orderItem;
-
- unset($arAttr);
- unset($count);
- unset($arProp);
- }
-
- $deliveryCode = $params['order']->id_carrier;
-
- if (array_key_exists($deliveryCode, $delivery) && !empty($delivery[$deliveryCode])) {
- $order['delivery']['code'] = $delivery[$deliveryCode];
- }
-
- if (Module::getInstanceByName('advancedcheckout') === false) {
- $paymentCode = $params['order']->module;
- } else {
- $paymentCode = $params['order']->payment;
- }
-
- if ($this->apiVersion != 5) {
- if (array_key_exists($paymentCode, $payment) && !empty($payment[$paymentCode])) {
- $order['paymentType'] = $payment[$paymentCode];
- }
- } else {
- $paymentSend = array(
- 'externalId' => $params['order']->id .'#'. $params['order']->reference,
- 'amount' => $params['order']->total_paid,
- 'type' => $payment[$paymentCode] ? $payment[$paymentCode] : ''
- );
- }
-
- if (isset($paymentSend)) {
- $order['payments'][] = $paymentSend;
- }
-
- $statusCode = $params['orderStatus']->id;
-
- if (array_key_exists($statusCode, $status) && !empty($status[$statusCode])) {
- $order['status'] = $status[$statusCode];
- } else {
- $order['status'] = 'new';
- }
-
- $customerCheck = $this->api->customersGet($customer['externalId']);
-
- if ($customerCheck === false) {
- $this->api->customersCreate($customer);
- }
-
- $order['customer']['externalId'] = $customer['externalId'];
+ $customer = static::buildCrmCustomer($params['customer'], $address);
+ $order = static::buildCrmOrder($params['order'], $params['customer'], $params['cart'], false);
$this->api->ordersCreate($order);
diff --git a/retailcrm/translations/es.php b/retailcrm/translations/es.php
index 16d63e5..6db2eca 100644
--- a/retailcrm/translations/es.php
+++ b/retailcrm/translations/es.php
@@ -55,4 +55,10 @@ $_MODULE['<{retailcrm}prestashop>retailcrm_f0e1fc6f97d36cb80f29196e2662ffde'] =
$_MODULE['<{retailcrm}prestashop>retailcrm_7a1920d61156abc05a60135aefe8bc67'] = 'Por defecto';
$_MODULE['<{retailcrm}prestashop>retailcrm_cc18dd262eff97c4dd4b56f750896adb'] = 'Estado predeterminado';
$_MODULE['<{retailcrm}prestashop>retailcrm_a33b96f0ce0f1227132f1cb3cf1c9e88'] = 'Estado del pedido al exportar por lotes';
-$_MODULE['<{retailcrm}prestashop>retailcrm_1bd340aeb42a5ee0318784c2cffed8a9'] = 'La versión seleccionada de la API no está disponible';
\ No newline at end of file
+$_MODULE['<{retailcrm}prestashop>retailcrm_1bd340aeb42a5ee0318784c2cffed8a9'] = 'La versión seleccionada de la API no está disponible';
+$_MODULE['<{retailcrm}prestashop>retailcrm_c2784d9473fed62ae67fe8597011166a'] = 'Exportación manual de los pedidos';
+$_MODULE['<{retailcrm}prestashop>retailcrm_acfa058ec9e6e4745eddc0cae3f0f881'] = 'Identificador del pedido';
+$_MODULE['<{retailcrm}prestashop>retailcrm_91412465ea9169dfd901dd5e7c96dd99'] = 'Exportar';
+$_MODULE['<{retailcrm}prestashop>retailcrm_6bd461d1fc51b3294c6513cecc24758d'] = 'Los pedidos han sido cargados con éxito';
+$_MODULE['<{retailcrm}prestashop>retailcrm_3518f7b8d79f91da4c91772b4c46db94'] = 'No se han podido cargar algunos pedidos';
+$_MODULE['<{retailcrm}prestashop>retailcrm_9a7fc06b4b2359f1f26f75fbbe27a3e8'] = 'No todos los pedidos se han cargado con existo';
\ No newline at end of file
diff --git a/retailcrm/translations/ru.php b/retailcrm/translations/ru.php
index 9c20f00..1f0def2 100644
--- a/retailcrm/translations/ru.php
+++ b/retailcrm/translations/ru.php
@@ -56,3 +56,9 @@ $_MODULE['<{retailcrm}prestashop>retailcrm_7a1920d61156abc05a60135aefe8bc67'] =
$_MODULE['<{retailcrm}prestashop>retailcrm_cc18dd262eff97c4dd4b56f750896adb'] = 'Статус по умолчанию';
$_MODULE['<{retailcrm}prestashop>retailcrm_a33b96f0ce0f1227132f1cb3cf1c9e88'] = 'Статус заказа при пакетной выгрузке ';
$_MODULE['<{retailcrm}prestashop>retailcrm_1bd340aeb42a5ee0318784c2cffed8a9'] = 'Выбранная версия API недоступна';
+$_MODULE['<{retailcrm}prestashop>retailcrm_c2784d9473fed62ae67fe8597011166a'] = 'Ручная выгрузка заказов';
+$_MODULE['<{retailcrm}prestashop>retailcrm_acfa058ec9e6e4745eddc0cae3f0f881'] = 'Идентификаторы заказов';
+$_MODULE['<{retailcrm}prestashop>retailcrm_91412465ea9169dfd901dd5e7c96dd99'] = 'Выгрузить';
+$_MODULE['<{retailcrm}prestashop>retailcrm_6bd461d1fc51b3294c6513cecc24758d'] = 'Все заказы успешно загружены';
+$_MODULE['<{retailcrm}prestashop>retailcrm_3518f7b8d79f91da4c91772b4c46db94'] = 'Некоторые заказы не удалось загрузить';
+$_MODULE['<{retailcrm}prestashop>retailcrm_9a7fc06b4b2359f1f26f75fbbe27a3e8'] = 'Не все заказы загружены успешно';
\ No newline at end of file