Compare commits

..

No commits in common. "master" and "v4.1.4" have entirely different histories.

47 changed files with 626 additions and 1034 deletions

View file

@ -2,7 +2,7 @@ FROM php:7.1-apache
RUN apt-get update RUN apt-get update
RUN apt-get install -y netcat zlib1g-dev libpq-dev git libicu-dev libxml2-dev libpng-dev libjpeg-dev libmcrypt-dev libxslt-dev libfreetype6-dev unzip \ RUN apt-get install -y netcat zlib1g-dev libpq-dev git libicu-dev libxml2-dev libpng-dev libjpeg-dev libmcrypt-dev libxslt-dev libfreetype6-dev \
&& docker-php-ext-configure intl \ && docker-php-ext-configure intl \
&& docker-php-ext-install intl \ && docker-php-ext-install intl \
&& docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \

View file

@ -14,5 +14,5 @@ OC_EMAIL=you@example.com
SERVER_PORT=8080 SERVER_PORT=8080
SERVER_URL=http://localhost SERVER_URL=http://localhost
TEST_SUITE=3 TEST_SUITE=3.0
OPENCART=3.0.2.0 OPENCART=3.0.2.0

View file

@ -26,78 +26,133 @@ jobs:
strategy: strategy:
matrix: matrix:
include: include:
- php-version: '7.3' - php-version: '7.0'
test-suite: '3' test-suite: '2.3'
oc: '2.3.0.0'
coverage: 1
- php-version: '7.0'
test-suite: '2.3'
oc: '2.3.0.1'
- php-version: '7.0'
test-suite: '2.3'
oc: '2.3.0.2'
- php-version: '7.1'
test-suite: '2.3'
oc: '2.3.0.0'
- php-version: '7.1'
test-suite: '2.3'
oc: '2.3.0.1'
- php-version: '7.1'
test-suite: '2.3'
oc: '2.3.0.2'
- php-version: '7.0'
test-suite: '3.0'
oc: '3.0.0.0'
- php-version: '7.0'
test-suite: '3.0'
oc: '3.0.0.2'
- php-version: '7.0'
test-suite: '3.0'
oc: '3.0.1.0'
- php-version: '7.0'
test-suite: '3.0'
oc: '3.0.1.1' oc: '3.0.1.1'
- php-version: '7.3' - php-version: '7.0'
test-suite: '3' test-suite: '3.0'
oc: '3.0.1.2' oc: '3.0.1.2'
- php-version: '7.3' - php-version: '7.0'
test-suite: '3' test-suite: '3.0'
oc: '3.0.2.0' oc: '3.0.2.0'
- php-version: '7.3' - php-version: '7.0'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.0' oc: '3.0.3.0'
- php-version: '7.3' - php-version: '7.0'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.1' oc: '3.0.3.1'
- php-version: '7.3' - php-version: '7.0'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.2'
- php-version: '7.1'
test-suite: '3.0'
oc: '3.0.0.0'
- php-version: '7.1'
test-suite: '3.0'
oc: '3.0.0.2'
- php-version: '7.1'
test-suite: '3.0'
oc: '3.0.1.0'
- php-version: '7.1'
test-suite: '3.0'
oc: '3.0.1.1'
- php-version: '7.1'
test-suite: '3.0'
oc: '3.0.1.2'
- php-version: '7.1'
test-suite: '3.0'
oc: '3.0.2.0'
- php-version: '7.1'
test-suite: '3.0'
oc: '3.0.3.0'
- php-version: '7.1'
test-suite: '3.0'
oc: '3.0.3.1'
- php-version: '7.1'
test-suite: '3.0'
oc: '3.0.3.2'
- php-version: '7.2'
test-suite: '3.0'
oc: '3.0.0.0'
- php-version: '7.2'
test-suite: '3.0'
oc: '3.0.0.2'
- php-version: '7.2'
test-suite: '3.0'
oc: '3.0.1.0'
- php-version: '7.2'
test-suite: '3.0'
oc: '3.0.1.1'
- php-version: '7.2'
test-suite: '3.0'
oc: '3.0.1.2'
- php-version: '7.2'
test-suite: '3.0'
oc: '3.0.2.0'
- php-version: '7.2'
test-suite: '3.0'
oc: '3.0.3.0'
- php-version: '7.2'
test-suite: '3.0'
oc: '3.0.3.1'
- php-version: '7.2'
test-suite: '3.0'
oc: '3.0.3.2' oc: '3.0.3.2'
- php-version: '7.3' - php-version: '7.3'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.3' oc: '3.0.0.0'
- php-version: '7.3' - php-version: '7.3'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.4' oc: '3.0.0.2'
- php-version: '7.3' - php-version: '7.3'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.5' oc: '3.0.1.0'
- php-version: '7.3' - php-version: '7.3'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.6'
- php-version: '7.3'
test-suite: '3'
oc: '3.0.3.7'
- php-version: '7.3'
test-suite: '3'
oc: '3.0.3.8'
- php-version: '7.4'
test-suite: '3'
oc: '3.0.1.1' oc: '3.0.1.1'
- php-version: '7.4' - php-version: '7.3'
test-suite: '3' test-suite: '3.0'
oc: '3.0.1.2' oc: '3.0.1.2'
- php-version: '7.4' - php-version: '7.3'
test-suite: '3' test-suite: '3.0'
oc: '3.0.2.0' oc: '3.0.2.0'
- php-version: '7.4' - php-version: '7.3'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.0' oc: '3.0.3.0'
- php-version: '7.4' - php-version: '7.3'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.1' oc: '3.0.3.1'
- php-version: '7.4' - php-version: '7.3'
test-suite: '3' test-suite: '3.0'
oc: '3.0.3.2' oc: '3.0.3.2'
- php-version: '7.4'
test-suite: '3'
oc: '3.0.3.3'
- php-version: '7.4'
test-suite: '3'
oc: '3.0.3.4'
- php-version: '7.4'
test-suite: '3'
oc: '3.0.3.5'
- php-version: '7.4'
test-suite: '3'
oc: '3.0.3.6'
- php-version: '7.4'
test-suite: '3'
oc: '3.0.3.7'
- php-version: '7.4'
test-suite: '3'
oc: '3.0.3.8'
services: services:
mysql: mysql:
image: mysql:5.7 image: mysql:5.7
@ -165,7 +220,7 @@ jobs:
export LAST_TAG=`git describe --abbrev=0 --tags` export LAST_TAG=`git describe --abbrev=0 --tags`
export VERSION=`cat VERSION` export VERSION=`cat VERSION`
export ARCHIVE_NAME=retailcrm-$VERSION.ocmod.zip export ARCHIVE_NAME=retailcrm-$VERSION.ocmod.zip
export ARCHIVE_PATH="/tmp/$ARCHIVE_NAME" export ARCHIVE_PATH=/tmp
export RELEASE_TAG=v$VERSION export RELEASE_TAG=v$VERSION
export LAST_COMMIT=`git log --oneline --format=%B -n 1 HEAD | head -n 1` export LAST_COMMIT=`git log --oneline --format=%B -n 1 HEAD | head -n 1`
echo RELEASE_TAG=$RELEASE_TAG >> $GITHUB_ENV echo RELEASE_TAG=$RELEASE_TAG >> $GITHUB_ENV

View file

@ -1,54 +1,3 @@
## v4.1.19
* Added option to round order amount
## v4.1.18
* Fixed constant with version of module.
## v4.1.17
* Added additional parameters to GET requests.
## v4.1.16
* Support for services in ICML
## v4.1.15
* Display module version
## v4.1.14
* Added currency validation when configuring the module
## v4.1.13
* Changed the logic of customer subscriptions to promotional newsletters
## v4.1.12
* Added escaping for db query in method for getting zone
## v4.1.11
* Fixed the transfer of the weight offers
## v4.1.10
* Types of deliveries and payments are displayed only active status and available stores
## v4.1.9
* Optimization of the history processing algorithm
## v4.1.8
* Fixed customer externalId when creating a customer and sending it to RetailCRM
## v4.1.7
* Fixed notices in ICML generation and while setting delivery type
* Fixed incorrect data check before setting payment data
* Some other minor improvements
## v4.1.6
* Fix for typo in the history routine
* Fix for incorrect protocol in the ICML product image links
## v4.1.5
* Send discount details into the system
* Prefix for payment external ID (to ensure that it's unique)
* Make payment sum optional
* Weight calculation based on product options
## v.4.1.4 ## v.4.1.4
* Create payment only when the payment type is specified * Create payment only when the payment type is specified
* Checking the availability of promotional price for the product when uploading the order * Checking the availability of promotional price for the product when uploading the order

View file

@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015-2021 RetailDriver LLC Copyright (c) 2015-2020 RetailDriver LLC
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View file

@ -17,8 +17,9 @@ delete_archive:
before_script: before_script:
mkdir coverage mkdir coverage
composer require --dev beyondit/opencart-test-suite:~$(TEST_SUITE) composer require --dev beyondit/opencart-test-suite ~$(TEST_SUITE)
composer opencart:install composer require --dev opencart/opencart $(OPENCART)
composer setup
bin/robo --load-from tests/RoboFile.php project:deploy bin/robo --load-from tests/RoboFile.php project:deploy
(php -S localhost:80 -t www &) 2> /dev/null > /dev/null (php -S localhost:80 -t www &) 2> /dev/null > /dev/null
sleep 2 sleep 2
@ -31,7 +32,8 @@ robo_deploy:
run: run:
composer require --dev beyondit/opencart-test-suite ~$(TEST_SUITE) composer require --dev beyondit/opencart-test-suite ~$(TEST_SUITE)
composer opencart:install composer require --dev opencart/opencart $(OPENCART)
composer setup
bin/robo --load-from tests/RoboFile.php project:deploy bin/robo --load-from tests/RoboFile.php project:deploy
run_test: run run_test: run
@ -46,4 +48,4 @@ phpcs-config:
bin/phpcs --config-set installed_paths vendor/phpcompatibility/php-compatibility bin/phpcs --config-set installed_paths vendor/phpcompatibility/php-compatibility
phpcomp: phpcs-config phpcomp: phpcs-config
@bin/phpcs -s -p ./src --standard=PHPCompatibility --runtime-set testVersion 7.3-7.4 @bin/phpcs -s -p ./src --standard=PHPCompatibility --runtime-set testVersion 5.4-7.3

View file

@ -6,7 +6,7 @@
Opencart module Opencart module
=============== ===============
This module allows to integrate CMS Opencart >= 2.3 with [RetailCRM](https://retailcrm.pro). Module allows integrate CMS Opencart >= 2.3 with [RetailCRM](https://retailcrm.pro)
### Previous versions: ### Previous versions:
@ -16,59 +16,51 @@ This module allows to integrate CMS Opencart >= 2.3 with [RetailCRM](https://ret
#### Features: #### Features:
* Export orders to RetailCRM & receive changes from RetailCRM. * Export orders to RetailCRM & fetch changes back
* Export product catalog to the [ICML](https://help.retailcrm.pro/Developers/ICML) format. * Export product catalog into [ICML](https://help.retailcrm.pro/Developers/ICML) format
#### Install #### Install
**Note:** `/path/to/your/site` is just a placeholder. You should replace it with the actual path to your site root in the examples below. The module won't work if you'll use those examples without changing the path placeholder. Copy files to the site root
Copy module files to the site root (replace `/path/to/your/site` with the actual path to your site):
``` ```
unzip master.zip unzip master.zip
cp -r opencart-module/src/* /path/to/your/site cp -r opencart-module/src/* /path/to/site/root
``` ```
#### Setup #### Setup
* Go to Admin -> Extensions -> Modules -> RetailCRM * Go to Admin -> Extensions -> Modules -> RetailCRM
* Fill you API URL & API key * Fill you api url & api key
* Specify directories matching * Specify directories matching
#### Migrating to 4.* from early modules versions #### Migrating to 4.* from early modules versions
It's necessary to remove the `/path/to/your/site/system/library/retailcrm` before copying current module into your site. Before you copy the files of module you will to remove the directory `path/to/opencart/system/library/retailcrm`
#### Getting changes in orders #### Getting changes in orders
Add to cron (replace `/path/to/your/site` with the actual path to your site): Add to cron:
``` ```
*/5 * * * * /usr/bin/php /path/to/your/site/system/library/retailcrm/cron/history.php >> /path/to/your/site/system/storage/logs/cronjob_history.log 2>&1 */5 * * * * /usr/bin/php /path/to/opencart/system/library/retailcrm/cron/history.php >> /path/to/opencart/system/storage/logs/cronjob_history.log 2>&1
``` ```
#### Setting product catalog export #### Setting product catalog export
Add to cron (replace `/path/to/your/site` with the actual path to your site): Add to cron:
``` ```
* */4 * * * /usr/bin/php /path/to/your/site/system/library/retailcrm/cron/icml.php >> /path/to/your/site/system/storage/logs/cronjob_icml.log 2>&1 * */4 * * * /usr/bin/php /path/to/opencart/system/library/retailcrm/cron/icml.php >> /path/to/opencart/system/storage/logs/cronjob_icml.log 2>&1
``` ```
Your export file should be available by following url: Your export file will be available by following url
``` ```
http://youropencartsite.com/retailcrm.xml http://youropencartsite.com/retailcrm.xml
``` ```
Replace `youropencartsite.com` with your site domain and `http` with your site scheme.
#### Export existing orders and customers #### Export existing orders and customers
Run this command (replace `/path/to/your/site` with the actual path to your site): You want to run this command onecly:
```sh /usr/bin/php /path/to/opencart/system/library/retailcrm/cron/export.php
/usr/bin/php /path/to/your/site/system/library/retailcrm/cron/export.php
```
You should run this command only once.

View file

@ -1 +1 @@
4.1.19 4.1.4

View file

@ -25,7 +25,7 @@
"@test-catalog", "@test-catalog",
"@test-system" "@test-system"
], ],
"opencart:install" : "bin/robo --load-from tests/RoboFile.php opencart:install" "setup" : "bin/robo --load-from tests/RoboFile.php opencart:setup"
}, },
"require": { "require": {
"ext-json": "*" "ext-json": "*"
@ -33,6 +33,7 @@
"require-dev": { "require-dev": {
"consolidation/robo": "~1.0", "consolidation/robo": "~1.0",
"phpcompatibility/php-compatibility": "^9.3", "phpcompatibility/php-compatibility": "^9.3",
"beyondit/opencart-test-suite": "~3.0" "beyondit/opencart-test-suite": "~3.0",
"opencart/opencart": "3.0.2.0"
} }
} }

View file

@ -1,6 +0,0 @@
### Обновление версии модуля
Для обновления версии модуля необходимо обновить следующие файлы:
* VERSION
* CHANGELOG.md
* src/upload/admin/controller/extension/module/retailcrm.php

View file

@ -1,10 +1,8 @@
<?php <?php
use retailcrm\Retailcrm;
class ControllerExtensionModuleRetailcrm extends Controller class ControllerExtensionModuleRetailcrm extends Controller
{ {
private $_error = []; private $_error = array();
protected $log, $statuses, $payments, $deliveryTypes, $retailcrmApiClient, $moduleTitle, $tokenTitle; protected $log, $statuses, $payments, $deliveryTypes, $retailcrmApiClient, $moduleTitle, $tokenTitle;
public $children, $template; public $children, $template;
@ -27,10 +25,10 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->model_setting_setting->editSetting( $this->model_setting_setting->editSetting(
$this->moduleTitle, $this->moduleTitle,
[ array(
$this->moduleTitle . '_status' => 1, $this->moduleTitle . '_status' => 1,
$this->moduleTitle . '_country' => [$this->config->get('config_country_id')] $this->moduleTitle . '_country' => array($this->config->get('config_country_id'))
] )
); );
$this->addEvents(); $this->addEvents();
@ -61,7 +59,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->uninstall_collector(); $this->uninstall_collector();
$this->model_setting_setting->editSetting( $this->model_setting_setting->editSetting(
$this->moduleTitle, $this->moduleTitle,
[$this->moduleTitle . '_status' => 0] array($this->moduleTitle . '_status' => 0)
); );
} }
@ -81,7 +79,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->loadModels(); $this->loadModels();
$this->load->model('setting/setting'); $this->load->model('setting/setting');
$this->{'model_' . $this->modelExtension}->install('analytics', 'daemon_collector'); $this->{'model_' . $this->modelExtension}->install('analytics', 'daemon_collector');
$this->model_setting_setting->editSetting($collector, [$collector . '_status' => 1]); $this->model_setting_setting->editSetting($collector, array($collector . '_status' => 1));
} }
/** /**
@ -94,7 +92,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
$collector = $this->getCollectorTitle(); $collector = $this->getCollectorTitle();
$this->loadModels(); $this->loadModels();
$this->load->model('setting/setting'); $this->load->model('setting/setting');
$this->model_setting_setting->editSetting($collector, [$collector . '_status' => 0]); $this->model_setting_setting->editSetting($collector, array($collector . '_status' => 0));
$this->{'model_' . $this->modelExtension}->uninstall('analytics', 'daemon_collector'); $this->{'model_' . $this->modelExtension}->uninstall('analytics', 'daemon_collector');
} }
@ -109,7 +107,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->loadModels(); $this->loadModels();
$this->load->model('setting/setting'); $this->load->model('setting/setting');
$this->{'model_' . $this->modelExtension}->install('analytics', 'online_consultant'); $this->{'model_' . $this->modelExtension}->install('analytics', 'online_consultant');
$this->model_setting_setting->editSetting($consultant, [$consultant . '_status' => 1]); $this->model_setting_setting->editSetting($consultant, array($consultant . '_status' => 1));
} }
/** /**
@ -122,7 +120,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
$consultant = $this->getConsultantTitle(); $consultant = $this->getConsultantTitle();
$this->loadModels(); $this->loadModels();
$this->load->model('setting/setting'); $this->load->model('setting/setting');
$this->model_setting_setting->editSetting($consultant, [$consultant . '_status' => 0]); $this->model_setting_setting->editSetting($consultant, array($consultant . '_status' => 0));
$this->{'model_' . $this->modelExtension}->uninstall('analytics', 'online_consultant'); $this->{'model_' . $this->modelExtension}->uninstall('analytics', 'online_consultant');
} }
@ -188,21 +186,42 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->request->post $this->request->post
); );
if ( if (!isset($history_setting['retailcrm_history_orders']) && !isset($history_setting['retailcrm_history_customers'])) {
!isset($history_setting['retailcrm_history_orders'])
&& !isset($history_setting['retailcrm_history_customers'])
) {
$api = $this->retailcrm->getApiClient( $api = $this->retailcrm->getApiClient(
$this->request->post[$this->moduleTitle . '_url'], $this->request->post[$this->moduleTitle . '_url'],
$this->request->post[$this->moduleTitle . '_apikey'] $this->request->post[$this->moduleTitle . '_apikey']
); );
$ordersHistory = $api->ordersHistory();
if ($ordersHistory && $ordersHistory->isSuccessful() && !empty($ordersHistory['history'])) {
$ordersHistory = $api->ordersHistory(array(), $ordersHistory['pagination']['totalPageCount']);
if ($ordersHistory && $ordersHistory->isSuccessful()) {
$ordersHistoryArr = $ordersHistory['history'];
$lastChangeOrders = end($ordersHistoryArr);
$sinceIdOrders = $lastChangeOrders['id'];
}
}
$customersHistory = $api->customersHistory();
if ($customersHistory && $customersHistory->isSuccessful() && !empty($customersHistory['history'])) {
$customersHistory = $api->customersHistory(array(), $customersHistory['pagination']['totalPageCount']);
if ($customersHistory && $customersHistory->isSuccessful()) {
$customersHistoryArr = $customersHistory['history'];
$lastChangeCustomers = end($customersHistoryArr);
$sinceIdCustomers = $lastChangeCustomers['id'];
}
}
$this->model_setting_setting->editSetting( $this->model_setting_setting->editSetting(
'retailcrm_history', 'retailcrm_history',
[ array(
'retailcrm_history_orders' => $this->getHistorySinceId($api, 'ordersHistory'), 'retailcrm_history_orders' => isset($sinceIdOrders) ? $sinceIdOrders : 1,
'retailcrm_history_customers' => $this->getHistorySinceId($api, 'customersHistory'), 'retailcrm_history_customers' => isset($sinceIdCustomers) ? $sinceIdCustomers : 1
] )
); );
} }
@ -223,12 +242,12 @@ class ControllerExtensionModuleRetailcrm extends Controller
if ($result === true) { if ($result === true) {
$this->model_setting_setting->editSetting( $this->model_setting_setting->editSetting(
'retailcrm_setting', 'retailcrm_setting',
[ array(
'retailcrm_setting_active_in_crm' => true, 'retailcrm_setting_active_in_crm' => true,
'retailcrm_setting_client_id' => $clientId, 'retailcrm_setting_client_id' => $clientId,
'retailcrm_setting_url' => $this->request->post[$this->moduleTitle . '_url'], 'retailcrm_setting_url' => $this->request->post[$this->moduleTitle . '_url'],
'retailcrm_setting_key' => $this->request->post[$this->moduleTitle . '_apikey'] 'retailcrm_setting_key' => $this->request->post[$this->moduleTitle . '_apikey']
] )
); );
} }
} }
@ -242,7 +261,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->response->redirect($redirect); $this->response->redirect($redirect);
} }
$text_strings = [ $text_strings = array(
'heading_title', 'heading_title',
'text_enabled', 'text_enabled',
'text_disabled', 'text_disabled',
@ -301,11 +320,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
'special_price', 'special_price',
'order_number', 'order_number',
'text_order_number', 'text_order_number',
'summ_around', 'text_currency',
'text_summ_around',
'icml_settings',
'icml_service_enabled_label',
'icml_service_description',
'text_currency_label', 'text_currency_label',
'status_changes', 'status_changes',
'text_status_changes', 'text_status_changes',
@ -313,44 +328,35 @@ class ControllerExtensionModuleRetailcrm extends Controller
'text_lenght_label', 'text_lenght_label',
'corporate_enabled_label', 'corporate_enabled_label',
'entry_code', 'entry_code',
'entry_status', 'entry_status'
'text_retailcrm_discount', );
'text_retailcrm_label_discount',
'default_retailcrm_label_discount',
'sum_payment',
'text_sum_payment',
];
$_data = &$data; $_data = &$data;
$_data['module_version'] = Retailcrm::VERSION_MODULE;
foreach ($text_strings as $text) { foreach ($text_strings as $text) {
$_data[$text] = $this->language->get($text); $_data[$text] = $this->language->get($text);
} }
$_data['currencies'] = $this->model_localisation_currency->getCurrencies(0); $_data['currencies'] = $this->model_localisation_currency->getCurrencies(0);
$_data['retailcrm_errors'] = []; $_data['retailcrm_errors'] = array();
$_data['saved_settings'] = $this->model_setting_setting $_data['saved_settings'] = $this->model_setting_setting
->getSetting($this->moduleTitle); ->getSetting($this->moduleTitle);
$url = $_data['saved_settings'][$this->moduleTitle . '_url'] ?? null; $url = isset($_data['saved_settings'][$this->moduleTitle . '_url'])
$key = $_data['saved_settings'][$this->moduleTitle . '_apikey'] ?? null; ? $_data['saved_settings'][$this->moduleTitle . '_url']
: null;
$key = isset($_data['saved_settings'][$this->moduleTitle . '_apikey'])
? $_data['saved_settings'][$this->moduleTitle . '_apikey']
: null;
if (!empty($url) && !empty($key)) { if (!empty($url) && !empty($key)) {
$this->validate($url, $key);
$site = $this->model_extension_retailcrm_references->getApiSite(); $_data['delivery'] = $this->model_extension_retailcrm_references
$_data['delivery'] = $this->getAvailableTypes( ->getDeliveryTypes();
$site,
$this->model_extension_retailcrm_references->getDeliveryTypes()
);
$_data['payments'] = $this->getAvailableTypes(
$site,
$this->model_extension_retailcrm_references->getPaymentTypes()
);
$_data['statuses'] = $this->model_extension_retailcrm_references $_data['statuses'] = $this->model_extension_retailcrm_references
->getOrderStatuses(); ->getOrderStatuses();
$_data['payments'] = $this->model_extension_retailcrm_references
->getPaymentTypes();
$_data['customFields'] = $this->model_extension_retailcrm_references $_data['customFields'] = $this->model_extension_retailcrm_references
->getCustomFields(); ->getCustomFields();
@ -360,7 +366,9 @@ class ControllerExtensionModuleRetailcrm extends Controller
$_data['customerGroups'] = $this->model_customer_customer_group->getCustomerGroups(); $_data['customerGroups'] = $this->model_customer_customer_group->getCustomerGroups();
} }
$config_data = [$this->moduleTitle . '_status']; $config_data = array(
$this->moduleTitle . '_status'
);
foreach ($config_data as $conf) { foreach ($config_data as $conf) {
if (isset($this->request->post[$conf])) { if (isset($this->request->post[$conf])) {
@ -370,35 +378,40 @@ class ControllerExtensionModuleRetailcrm extends Controller
} }
} }
$_data['error_warning'] = $this->_error['warning'] ?? ''; if (isset($this->_error['warning'])) {
$_data['breadcrumbs'] = []; $_data['error_warning'] = $this->_error['warning'];
} else {
$_data['error_warning'] = '';
}
$_data['breadcrumbs'][] = [ $_data['breadcrumbs'] = array();
$_data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'), 'text' => $this->language->get('text_home'),
'href' => $this->url->link( 'href' => $this->url->link(
'common/dashboard', 'common/dashboard',
$this->tokenTitle . '=' . $this->session->data[$this->tokenTitle], 'SSL' $this->tokenTitle . '=' . $this->session->data[$this->tokenTitle], 'SSL'
), ),
'separator' => false 'separator' => false
]; );
$_data['breadcrumbs'][] = [ $_data['breadcrumbs'][] = array(
'text' => $this->language->get('text_module'), 'text' => $this->language->get('text_module'),
'href' => $this->url->link( 'href' => $this->url->link(
'extension/extension', 'extension/extension',
$this->tokenTitle . '=' . $this->session->data[$this->tokenTitle], 'SSL' $this->tokenTitle . '=' . $this->session->data[$this->tokenTitle], 'SSL'
), ),
'separator' => ' :: ' 'separator' => ' :: '
]; );
$_data['breadcrumbs'][] = [ $_data['breadcrumbs'][] = array(
'text' => $this->language->get('retailcrm_title'), 'text' => $this->language->get('retailcrm_title'),
'href' => $this->url->link( 'href' => $this->url->link(
'extension/module/retailcrm', 'extension/module/retailcrm',
$this->tokenTitle . '=' . $this->session->data[$this->tokenTitle], 'SSL' $this->tokenTitle . '=' . $this->session->data[$this->tokenTitle], 'SSL'
), ),
'separator' => ' :: ' 'separator' => ' :: '
]; );
$_data['action'] = $this->url->link( $_data['action'] = $this->url->link(
'extension/module/retailcrm', 'extension/module/retailcrm',
@ -410,7 +423,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->tokenTitle . '=' . $this->session->data[$this->tokenTitle], 'SSL' $this->tokenTitle . '=' . $this->session->data[$this->tokenTitle], 'SSL'
); );
$_data['modules'] = []; $_data['modules'] = array();
if (isset($this->request->post['retailcrm_module'])) { if (isset($this->request->post['retailcrm_module'])) {
$_data['modules'] = $this->request->post['retailcrm_module']; $_data['modules'] = $this->request->post['retailcrm_module'];
@ -434,11 +447,11 @@ class ControllerExtensionModuleRetailcrm extends Controller
$_data['export_file'] = true; $_data['export_file'] = true;
} }
$collectorFields = [ $collectorFields = array(
'name' => $this->language->get('field_name'), 'name' => $this->language->get('field_name'),
'email' => $this->language->get('field_email'), 'email' => $this->language->get('field_email'),
'phone' => $this->language->get('field_phone') 'phone' => $this->language->get('field_phone')
]; );
$_data['collectorFields'] = $collectorFields; $_data['collectorFields'] = $collectorFields;
@ -557,12 +570,20 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->response->setOutput( $this->response->setOutput(
json_encode( json_encode(
['status_code' => $response->getStatusCode(), 'error_msg' => $error], array(
JSON_THROW_ON_ERROR 'status_code' => $response->getStatusCode(),
'error_msg' => $error
)
) )
); );
} else { } else {
$this->response->setOutput(json_encode(['status_code' => $response->getStatusCode()])); $this->response->setOutput(
json_encode(
array(
'status_code' => $response->getStatusCode()
)
)
);
} }
} }
} }
@ -582,7 +603,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->model_extension_retailcrm_customer->uploadToCrm($customers, $this->retailcrm->getApiClient()); $this->model_extension_retailcrm_customer->uploadToCrm($customers, $this->retailcrm->getApiClient());
$orders = $this->model_sale_order->getOrders(); $orders = $this->model_sale_order->getOrders();
$fullOrders = []; $fullOrders = array();
foreach ($orders as $order) { foreach ($orders as $order) {
$fullOrder = $this->model_sale_order->getOrder($order['order_id']); $fullOrder = $this->model_sale_order->getOrder($order['order_id']);
@ -625,57 +646,39 @@ class ControllerExtensionModuleRetailcrm extends Controller
* *
* @return bool * @return bool
*/ */
private function validate($apiUrl = null, $apiKey = null) private function validate()
{ {
$warningMessage = ''; if (!empty($this->request->post[$this->moduleTitle . '_url']) && !empty($this->request->post[$this->moduleTitle . '_apikey'])) {
$apiClient = $this->retailcrm->getApiClient(
$apiUrl = $this->request->post[$this->moduleTitle . '_url'] ?? $apiUrl; $this->request->post[$this->moduleTitle . '_url'],
$apiKey = $this->request->post[$this->moduleTitle . '_apikey'] ?? $apiKey; $this->request->post[$this->moduleTitle . '_apikey']
try {
if ( !empty($apiUrl) && !empty($apiKey)) {
$apiClient = $this->retailcrm->getApiClient($apiUrl, $apiKey);
$response = $apiClient->sitesList();
if (empty($response['sites']) || !$response->isSuccessful()) {
$warningMessage = 'text_error_api_key';
} elseif (count($response['sites']) > 1) {
$warningMessage = 'text_error_api_key_site';
} else {
$site = current($response['sites']);
if ($this->config->get('config_currency') !== $site['currency']) {
$warningMessage = 'text_error_api_key_currency';
}
}
if (!$this->user->hasPermission('modify', 'extension/module/retailcrm')) {
$this->_error['warning'] = $this->language->get('error_permission');
}
if (isset($this->request->post[$this->moduleTitle . '_collector']['custom']) &&
$this->request->post[$this->moduleTitle . '_collector']['custom_form'] == 1) {
$customField = $this->request->post[$this->moduleTitle . '_collector']['custom'];
if (empty($customField['name']) && empty($customField['email']) && empty($customField['phone'])) {
$this->_error['fields'] = $this->language->get('text_error_collector_fields');
}
}
} else {
$warningMessage = 'text_error_api_empty';
}
} catch (Throwable $exception) {
$warningMessage = sprintf(
'An error has occurred! In file: %s, on line: %s. Error message: %s',
$exception->getFile(), $exception->getLine(), $exception->getMessage()
); );
} }
if ('' !== $warningMessage) { $response = $apiClient->apiVersions();
$this->_error['warning'] = $this->language->get($warningMessage);
if (!$response || !$response->isSuccessful()) {
$this->_error['warning'] = $this->language->get('text_error_api');
} }
return empty($this->_error); if (!$this->user->hasPermission('modify', 'extension/module/retailcrm')) {
$this->_error['warning'] = $this->language->get('error_permission');
}
if (isset($this->request->post[$this->moduleTitle . '_collector']['custom']) &&
$this->request->post[$this->moduleTitle . '_collector']['custom_form'] == 1) {
$customField = $this->request->post[$this->moduleTitle . '_collector']['custom'];
if (empty($customField['name']) && empty($customField['email']) && empty($customField['phone'])) {
$this->_error['fields'] = $this->language->get('text_error_collector_fields');
}
}
if (!$this->_error) {
return true;
} else {
return false;
}
} }
/** /**
@ -831,13 +834,6 @@ class ControllerExtensionModuleRetailcrm extends Controller
'extension/module/retailcrm/customer_edit' 'extension/module/retailcrm/customer_edit'
); );
$this->{'model_' . $this->modelEvent}
->addEvent(
$this->moduleTitle,
'catalog/model/account/customer/editNewsletter/after',
'extension/module/retailcrm/customer_edit_newsletter'
);
$this->{'model_' . $this->modelEvent} $this->{'model_' . $this->modelEvent}
->addEvent( ->addEvent(
$this->moduleTitle, $this->moduleTitle,
@ -911,15 +907,15 @@ class ControllerExtensionModuleRetailcrm extends Controller
$name = 'Opencart'; $name = 'Opencart';
$accountUrl = $scheme . $this->request->server['HTTP_HOST'] . '/admin'; $accountUrl = $scheme . $this->request->server['HTTP_HOST'] . '/admin';
$configuration = [ $configuration = array(
'clientId' => $clientId, 'clientId' => $clientId,
'code' => $integrationCode . '-' . $clientId, 'code' => $integrationCode . '-' . $clientId,
'integrationCode' => $integrationCode, 'integrationCode' => $integrationCode,
'active' => $active, 'active' => $active,
'name' => $name, 'name' => $name,
'logo' => $logo, 'logo' => $logo,
'accountUrl' => $accountUrl, 'accountUrl' => $accountUrl
]; );
$response = $apiClient->integrationModulesEdit($configuration); $response = $apiClient->integrationModulesEdit($configuration);
@ -933,57 +929,4 @@ class ControllerExtensionModuleRetailcrm extends Controller
return false; return false;
} }
private function getHistorySinceId($api, $method)
{
$lastSinceId = 0;
$startDate = new DateTime('-1 days');
$historyResponse = $api->$method(['startDate' => $startDate->format('Y-m-d H:i:s')]);
if (
!$historyResponse instanceof ApiResponse
|| !$historyResponse->isSuccessful()
|| empty($historyResponse['history'])
|| empty($historyResponse['pagination'])
) {
return $lastSinceId;
}
$startPage = $historyResponse['pagination']['currentPage'];
$lastPage = $historyResponse['pagination']['totalPageCount'];
for ($startPage; $startPage <= $lastPage; ++$startPage) {
if ($historyResponse instanceof ApiResponse && !empty($historyResponse['history'])) {
$history = $historyResponse['history'];
$lastSinceId = end($history)['id'];
$historyResponse = $api->$method(['sinceId' => $lastSinceId]);
}
}
return $lastSinceId;
}
private function getAvailableTypes($availableSite, $types)
{
$result['opencart'] = $types['opencart'];
$result['retailcrm'] = [];
if (empty($availableSite)) {
return $result;
}
foreach ($types['retailcrm'] as $codeKey => $type) {
if ($type['active'] !== true) {
continue;
}
if (!empty($type['sites']) && !in_array($availableSite['code'], $type['sites'])) {
continue;
}
$result['retailcrm'][$codeKey] = $type;
}
return $result;
}
} }

View file

@ -50,11 +50,8 @@ $_['text_payment'] = 'Payment';
$_['text_shipping'] = 'Delivery'; $_['text_shipping'] = 'Delivery';
$_['text_orders_custom_fields'] = 'Custom fields of orders'; $_['text_orders_custom_fields'] = 'Custom fields of orders';
$_['text_customers_custom_fields'] = 'Custom fields of customers'; $_['text_customers_custom_fields'] = 'Custom fields of customers';
$_['text_error_collector_fields'] = 'Fill in the names of fields of Demon Collector form'; $_['text_error_collector_fields']= 'Fill in the names of fields of Demon Collector form';
$_['text_error_api_empty'] = 'The "RetailCRM URL" and "RetailCRM API key" fields cannot be empty, enter the correct value'; $_['text_error_api'] = 'The selected API version is not available.';
$_['text_error_api_key'] = 'Invalid API key';
$_['text_error_api_key_site'] = 'API key with one-shop access required';
$_['text_error_api_key_currency'] = 'The currency of the site differs from the currency of the store in CRM. For the integration to work correctly, the currencies in CRM and CMS must match';
$_['text_error_custom_field'] = 'Create custom fields on a customer page in Opencart and RetailCRM in order to set up their transfer'; $_['text_error_custom_field'] = 'Create custom fields on a customer page in Opencart and RetailCRM in order to set up their transfer';
$_['text_error_cf_opencart'] = 'There are no custom fields in Opencart'; $_['text_error_cf_opencart'] = 'There are no custom fields in Opencart';
$_['text_error_cf_retailcrm'] = 'There are no custom fields in RetailCRM'; $_['text_error_cf_retailcrm'] = 'There are no custom fields in RetailCRM';
@ -72,27 +69,16 @@ $_['retailcrm_missing_status'] = 'Status of lost orders';
$_['order_number'] = 'Order number'; $_['order_number'] = 'Order number';
$_['text_order_number'] = 'Upload the order number to RetailCRM'; $_['text_order_number'] = 'Upload the order number to RetailCRM';
$_['summ_around'] = 'Around total summ'; $_['text_currency'] = 'Currency setting';
$_['text_summ_around'] = 'Around the order total summ'; $_['text_currency_label'] = 'Currency in ICML';
$_['icml_settings'] = 'ICML settings';
$_['icml_service_enabled_label'] = 'Upload services in ICML';
$_['icml_service_description'] = 'When the option is enabled, all products for which delivery is disabled will be considered as services and uploaded to CRM as services';
$_['text_currency_label'] = 'Currency of goods';
$_['text_lenght'] = 'Setting of the unit of measurement'; $_['text_lenght'] = 'Setting of the unit of measurement';
$_['text_lenght_label'] = 'Unit of measurement of goods'; $_['text_lenght_label'] = 'Unit of measurement in ICML';
$_['status_changes'] = 'History of changes'; $_['status_changes'] = 'History of changes';
$_['text_status_changes'] = 'Record changes to the order history of Opencart'; $_['text_status_changes'] = 'Record changes to the order history of Opencart';
$_['column_total'] = 'Total'; $_['column_total'] = 'Total';
$_['product_summ'] = 'Sum'; $_['product_summ'] = 'Sum';
$_['text_retailcrm_discount'] = 'RetailCRM discount';
$_['text_retailcrm_label_discount'] = 'Label of RetailCRM discount in section total of order';
$_['default_retailcrm_label_discount'] = 'Discount in RetailCRM';
$_['sum_payment'] = 'Sum payment';
$_['text_sum_payment'] = 'Do not upload the sum payment to RetailCRM';
$_['article'] = 'Article'; $_['article'] = 'Article';
$_['color'] = 'Color'; $_['color'] = 'Color';
$_['weight'] = 'Weight'; $_['weight'] = 'Weight';

View file

@ -51,10 +51,7 @@ $_['text_shipping'] = 'Envío';
$_['text_orders_custom_fields'] = 'Los campos de pedidos personalizados'; $_['text_orders_custom_fields'] = 'Los campos de pedidos personalizados';
$_['text_customers_custom_fields'] = 'Los campos de clientes personalizados'; $_['text_customers_custom_fields'] = 'Los campos de clientes personalizados';
$_['text_error_collector_fields']= 'Rellene los nombres de los campos del formulario Daemon Collector'; $_['text_error_collector_fields']= 'Rellene los nombres de los campos del formulario Daemon Collector';
$_['text_error_api_empty'] = 'Los campos "URL de RetailCRM" y "Clave de API de RetailCRM" no pueden estar vacíos, ingrese el valor correcto'; $_['text_error_api'] = 'La versión seleccionada de la API no está disponible.';
$_['text_error_api_key'] = 'Clave API del CRM no válida';
$_['text_error_api_key_site'] = 'Se requiere clave API con acceso a una tienda';
$_['text_error_api_key_currency'] = 'La moneda del sitio web es distinto a la tienda del CRM. Para el funcionamiento correcto de la integración, las monedas del CMS y CRM deben coincid';
$_['text_error_custom_field'] = 'Cree campos personalizados en la ficha del cliente en Opencart y RetailCRM para configurar sus transmisión.'; $_['text_error_custom_field'] = 'Cree campos personalizados en la ficha del cliente en Opencart y RetailCRM para configurar sus transmisión.';
$_['text_error_cf_opencart'] = 'Faltan campos personalizados en Opencart'; $_['text_error_cf_opencart'] = 'Faltan campos personalizados en Opencart';
$_['text_error_cf_retailcrm'] = 'Faltan campos personalizados en RetailCRM'; $_['text_error_cf_retailcrm'] = 'Faltan campos personalizados en RetailCRM';
@ -72,28 +69,16 @@ $_['retailcrm_missing_status'] = 'Estado de pedidos perdidos';
$_['order_number'] = 'Número de pedido'; $_['order_number'] = 'Número de pedido';
$_['text_order_number'] = 'Transferir número de pedido a RetailCRM'; $_['text_order_number'] = 'Transferir número de pedido a RetailCRM';
$_['summ_around'] = 'Redondeo del costo del pedido'; $_['text_currency'] = 'Ajustes de moneda';
$_['text_summ_around'] = 'Redondear los costos del pedido a RetailCRM'; $_['text_currency_label'] = 'Moneda en ICML';
$_['icml_settings'] = 'Ajustes de ICML';
$_['icml_service_enabled_label'] = 'Subir servicios de ICML';
$_['icml_service_description'] = 'Si habilita la opción, todos los productos para los que la entrega está desactivada se tratarán como servicios y se cargarán en CRM como servicios';
$_['text_currency_label'] = 'Moneda de bienes';
$_['text_lenght'] = 'Ajustar unidad de medida'; $_['text_lenght'] = 'Ajustar unidad de medida';
$_['text_lenght_label'] = 'Unidad de medida de bienes'; $_['text_lenght_label'] = 'Unidad de medida en ICML';
$_['status_changes'] = 'Historial de cambios'; $_['status_changes'] = 'Historial de cambios';
$_['text_status_changes'] = 'Registrar los cambios en el historial de pedidos de Opencart'; $_['text_status_changes'] = 'Registrar los cambios en el historial de pedidos de Opencart';
$_['column_total'] = 'Total'; $_['column_total'] = 'Total';
$_['product_summ'] = 'Importe'; $_['product_summ'] = 'Importe';
$_['text_retailcrm_discount'] = 'RetailCRM descuento';
$_['text_retailcrm_label_discount'] = 'Etiqueta de descuento de RetailCRM en la sección total del pedido';
$_['default_retailcrm_label_discount'] = 'Descuento en RetailCRM';
$_['sum_payment'] = 'Suma de pago';
$_['text_sum_payment'] = 'No transferir suma de pago a RetailCRM';
$_['article'] = 'Artículo'; $_['article'] = 'Artículo';
$_['color'] = 'Color'; $_['color'] = 'Color';
$_['weight'] = 'Peso'; $_['weight'] = 'Peso';

View file

@ -50,11 +50,8 @@ $_['text_payment'] = 'Оплата';
$_['text_shipping'] = 'Доставка'; $_['text_shipping'] = 'Доставка';
$_['text_orders_custom_fields'] = 'Кастомные поля заказов'; $_['text_orders_custom_fields'] = 'Кастомные поля заказов';
$_['text_customers_custom_fields'] = 'Кастомные поля клиентов'; $_['text_customers_custom_fields'] = 'Кастомные поля клиентов';
$_['text_error_collector_fields'] = 'Заполните названия полей формы Демон Collector'; $_['text_error_collector_fields']= 'Заполните названия полей формы Демон Collector';
$_['text_error_api_empty'] = 'Поля "URL RetailCRM" и "Ключ API RetailCRM" не могут быть пустыми, введите корректное значение'; $_['text_error_api'] = 'Недоступна выбранная версия API.';
$_['text_error_api_key'] = 'Неверный API ключ';
$_['text_error_api_key_site'] = 'Требуется API ключ с доступом к одному магазину';
$_['text_error_api_key_currency'] = 'Валюта сайта отличается от валюты магазина в CRM. Для корректной работы интеграции, валюты в CRM и CMS должны совпадать';
$_['text_error_custom_field'] = 'Создайте пользовательские поля в карточке клиента в Opencart и RetailCRM, чтобы настроить их передачу'; $_['text_error_custom_field'] = 'Создайте пользовательские поля в карточке клиента в Opencart и RetailCRM, чтобы настроить их передачу';
$_['text_error_cf_opencart'] = 'Отсутствуют пользовательские поля в Opencart'; $_['text_error_cf_opencart'] = 'Отсутствуют пользовательские поля в Opencart';
$_['text_error_cf_retailcrm'] = 'Отсутствуют пользовательские поля в RetailCRM'; $_['text_error_cf_retailcrm'] = 'Отсутствуют пользовательские поля в RetailCRM';
@ -72,27 +69,16 @@ $_['retailcrm_missing_status'] = 'Статус пропавших заказо
$_['order_number'] = 'Номер заказа'; $_['order_number'] = 'Номер заказа';
$_['text_order_number'] = 'Передавать номер заказа в RetailCRM'; $_['text_order_number'] = 'Передавать номер заказа в RetailCRM';
$_['summ_around'] = 'Округление суммы заказа'; $_['text_currency'] = 'Настройка валюты';
$_['text_summ_around'] = 'Округлять сумму заказа'; $_['text_currency_label'] = 'Валюта в ICML';
$_['icml_settings'] = 'Настройки ICML';
$_['icml_service_enabled_label'] = 'Выгружать услуги в ICML';
$_['icml_service_description'] = 'При включении опции все товары, для которых отключена доставка, будут рассматриваться как услуги и загружаться в CRM как услуги';
$_['text_currency_label'] = 'Валюта товаров';
$_['text_lenght'] = 'Настройка единицы измерения'; $_['text_lenght'] = 'Настройка единицы измерения';
$_['text_lenght_label'] = 'Единица измерения товаров'; $_['text_lenght_label'] = 'Единица измерения в ICML';
$_['status_changes'] = 'История изменений'; $_['status_changes'] = 'История изменений';
$_['text_status_changes'] = 'Фиксировать изменения в истории заказа Opencart'; $_['text_status_changes'] = 'Фиксировать изменения в истории заказа Opencart';
$_['column_total'] = 'Итого'; $_['column_total'] = 'Итого';
$_['product_summ'] = 'Сумма'; $_['product_summ'] = 'Сумма';
$_['text_retailcrm_discount'] = 'Скидка RetailCRM';
$_['text_retailcrm_label_discount'] = 'Подпись для скидки, установленной в RetailCRM, в итоговой секции заказа';
$_['default_retailcrm_label_discount'] = 'Скидка в RetailCRM';
$_['sum_payment'] = 'Сумма платежа';
$_['text_sum_payment'] = 'Не передавать сумму платежа в RetailCRM';
$_['article'] = 'Артикул'; $_['article'] = 'Артикул';
$_['color'] = 'Цвет'; $_['color'] = 'Цвет';
$_['weight'] = 'Вес'; $_['weight'] = 'Вес';

View file

@ -72,10 +72,15 @@ class ModelExtensionRetailcrmHistory extends Model {
return false; return false;
} }
$sinceIdOrders = $history['retailcrm_history_orders'] ?? 0; $sinceIdOrders = $history['retailcrm_history_orders'] ? $history['retailcrm_history_orders'] : null;
$sinceIdCustomers = $history['retailcrm_history_customers'] ?? 0; $sinceIdCustomers = $history['retailcrm_history_customers'] ? $history['retailcrm_history_customers'] : null;
$packsOrders = $retailcrmApiClient->ordersHistory(['sinceId' => $sinceIdOrders]);
$packsCustomers = $retailcrmApiClient->customersHistory(['sinceId' => $sinceIdCustomers]); $packsOrders = $retailcrmApiClient->ordersHistory(array(
'sinceId' => $sinceIdOrders ? $sinceIdOrders : 0
), 1, 100);
$packsCustomers = $retailcrmApiClient->customersHistory(array(
'sinceId' => $sinceIdCustomers ? $sinceIdCustomers : 0
), 1, 100);
if (!$packsOrders->isSuccessful() && count($packsOrders->history) <= 0 if (!$packsOrders->isSuccessful() && count($packsOrders->history) <= 0
&& !$packsCustomers->isSuccessful() && count($packsCustomers->history) <= 0 && !$packsCustomers->isSuccessful() && count($packsCustomers->history) <= 0
@ -83,28 +88,30 @@ class ModelExtensionRetailcrmHistory extends Model {
return false; return false;
} }
$orders = RetailcrmHistoryHelper::assemblyOrder($packsOrders->history);
$customers = RetailcrmHistoryHelper::assemblyCustomer($packsCustomers->history);
$ordersHistory = $packsOrders->history; $ordersHistory = $packsOrders->history;
$customersHistory = $packsCustomers->history; $customersHistory = $packsCustomers->history;
$lastChangeOrders = $ordersHistory ? end($ordersHistory) : null; $lastChangeOrders = $ordersHistory ? end($ordersHistory) : null;
$lastChangeCustomers = $customersHistory ? end($customersHistory) : null; $lastChangeCustomers = $customersHistory ? end($customersHistory) : null;
if ($lastChangeOrders !== null && $lastChangeCustomers !== null) { if ($lastChangeOrders !== null) {
$this->model_setting_setting->editSetting( $sinceIdOrders = $lastChangeOrders['id'];
'retailcrm_history', }
[
'retailcrm_history_orders' => $lastChangeOrders['id'], if ($lastChangeCustomers !== null) {
'retailcrm_history_customers' => $lastChangeCustomers['id'] $sinceIdCustomers = $lastChangeCustomers['id'];
]
);
} }
$orders = RetailcrmHistoryHelper::assemblyOrder($ordersHistory);
$customers = RetailcrmHistoryHelper::assemblyCustomer($customersHistory);
$newOrders = [];
$updatedOrders = [];
$this->settings = $settings; $this->settings = $settings;
$this->status = array_flip($settings[$this->moduleTitle . '_status']); $this->status = array_flip($settings[$this->moduleTitle . '_status']);
$updatedOrders = array();
$newOrders = array();
foreach ($orders as $order) { foreach ($orders as $order) {
if (isset($order['deleted'])) { if (isset($order['deleted'])) {
continue; continue;
@ -119,7 +126,7 @@ class ModelExtensionRetailcrmHistory extends Model {
unset($orders); unset($orders);
$updateCustomers = []; $updateCustomers = array();
foreach ($customers as $customer) { foreach ($customers as $customer) {
if (isset($customer['deleted'])) { if (isset($customer['deleted'])) {
@ -134,27 +141,34 @@ class ModelExtensionRetailcrmHistory extends Model {
unset($customers); unset($customers);
if (!empty($updateCustomers)) { if (!empty($updateCustomers)) {
$customers = $retailcrmApiClient->customersList(['ids' => $updateCustomers]); $customers = $retailcrmApiClient->customersList(array('ids' => $updateCustomers));
if ($customers) { if ($customers) {
$this->updateCustomers($customers['customers']); $this->updateCustomers($customers['customers']);
} }
} }
if (!empty($newOrders)) { if (!empty($newOrders)) {
$orders = $retailcrmApiClient->ordersList(['ids' => $newOrders]); $orders = $retailcrmApiClient->ordersList(array('ids' => $newOrders));
if ($orders) { if ($orders) {
$this->createResult = $this->createOrders($orders['orders'], $retailcrmApiClient); $this->createResult = $this->createOrders($orders['orders'], $retailcrmApiClient);
} }
} }
if (!empty($updatedOrders)) { if (!empty($updatedOrders)) {
$orders = $retailcrmApiClient->ordersList(['ids' => $updatedOrders]); $orders = $retailcrmApiClient->ordersList(array('ids' => $updatedOrders));
if ($orders) { if ($orders) {
$this->updateOrders($orders['orders'], $retailcrmApiClient); $this->updateOrders($orders['orders'], $retailcrmApiClient);
} }
} }
$this->model_setting_setting->editSetting(
'retailcrm_history',
array(
'retailcrm_history_orders' => $sinceIdOrders,
'retailcrm_history_customers' => $sinceIdCustomers
)
);
if (!empty($this->createResult['customers'])) { if (!empty($this->createResult['customers'])) {
$retailcrmApiClient->customersFixExternalIds($this->createResult['customers']); $retailcrmApiClient->customersFixExternalIds($this->createResult['customers']);
} }

View file

@ -15,14 +15,13 @@ class ModelExtensionRetailcrmIcml extends Model
/** /**
* Constructor * Constructor
* *
* @param Registry $registry * @param Registry $registry
*/ */
public function __construct($registry) public function __construct($registry)
{ {
parent::__construct($registry); parent::__construct($registry);
$this->load->library('retailcrm/retailcrm'); $this->load->library('retailcrm/retailcrm');
$this->load->model('localisation/weight_class');
} }
public function generateICML() public function generateICML()
@ -78,7 +77,7 @@ class ModelExtensionRetailcrmIcml extends Model
*/ */
private function addCategories() private function addCategories()
{ {
$categories = $this->model_catalog_category->getCategories([]); $categories = $this->model_catalog_category->getCategories(array());
foreach ($categories as $category) { foreach ($categories as $category) {
$category = $this->model_catalog_category->getCategory($category['category_id']); $category = $this->model_catalog_category->getCategory($category['category_id']);
@ -103,18 +102,11 @@ class ModelExtensionRetailcrmIcml extends Model
} }
private function addOffers() { private function addOffers() {
$offerManufacturers = []; $offerManufacturers = array();
$servicesForIcml = $this->retailcrm->useServicesForIcml();
$currencyForIcml = $this->retailcrm->getCurrencyForIcml(); $currencyForIcml = $this->retailcrm->getCurrencyForIcml();
$defaultCurrency = $this->getDefaultCurrency(); $defaultCurrency = $this->getDefaultCurrency();
$settingLenght = $this->retailcrm->getLenghtForIcml(); $settingLenght = $this->retailcrm->getLenghtForIcml();
$leghtsArray = $this->model_localisation_length_class->getLengthClasses(); $leghtsArray = $this->model_localisation_length_class->getLengthClasses();
$weightClassesMas = $this->model_localisation_weight_class->getWeightClasses();
$weightClasses = [];
foreach ($weightClassesMas as $weightClass) {
$weightClasses[$weightClass['weight_class_id']]['value'] = $weightClass['value'];
}
foreach ($leghtsArray as $lenght) { foreach ($leghtsArray as $lenght) {
if ($lenght['value'] == 1) { if ($lenght['value'] == 1) {
@ -123,20 +115,20 @@ class ModelExtensionRetailcrmIcml extends Model
} }
$manufacturers = $this->model_catalog_manufacturer $manufacturers = $this->model_catalog_manufacturer
->getManufacturers([]); ->getManufacturers(array());
foreach ($manufacturers as $manufacturer) { foreach ($manufacturers as $manufacturer) {
$offerManufacturers[$manufacturer['manufacturer_id']] = $manufacturer['name']; $offerManufacturers[$manufacturer['manufacturer_id']] = $manufacturer['name'];
} }
$products = $this->model_catalog_product->getProducts([]); $products = $this->model_catalog_product->getProducts(array());
foreach ($products as $product) { foreach ($products as $product) {
$offers = $this->retailcrm->getOffers($product); $offers = $this->retailcrm->getOffers($product);
foreach ($offers as $optionsString => $optionsValues) { foreach ($offers as $optionsString => $optionsValues) {
$optionsString = explode('_', $optionsString); $optionsString = explode('_', $optionsString);
$options = []; $options = array();
foreach($optionsString as $optionString) { foreach($optionsString as $optionString) {
$option = explode('-', $optionString); $option = explode('-', $optionString);
@ -151,43 +143,35 @@ class ModelExtensionRetailcrmIcml extends Model
'value_id' => $option[1], 'value_id' => $option[1],
'option_id' => $optionIds[1] 'option_id' => $optionIds[1]
); );
} }
} }
} }
ksort($options); ksort($options);
$offerId = []; $offerId = array();
foreach($options as $optionKey => $optionData) { foreach($options as $optionKey => $optionData) {
$offerId[] = $optionKey.'-'.$optionData['value_id']; $offerId[] = $optionKey.'-'.$optionData['value_id'];
} }
$offerId = implode('_', $offerId); $offerId = implode('_', $offerId);
$catalog = $this->eOffers->appendChild($this->dd->createElement('offer')); $e = $this->eOffers->appendChild($this->dd->createElement('offer'));
if (!empty($offerId)) { if (!empty($offerId)) {
$catalog->setAttribute('id', $product['product_id'] . '#' . $offerId); $e->setAttribute('id', $product['product_id'] . '#' . $offerId);
$catalog->setAttribute('productId', $product['product_id']); $e->setAttribute('productId', $product['product_id']);
$catalog->setAttribute('quantity', $optionsValues['qty']); $e->setAttribute('quantity', $optionsValues['qty']);
} else { } else {
$catalog->setAttribute('id', $product['product_id']); $e->setAttribute('id', $product['product_id']);
$catalog->setAttribute('productId', $product['product_id']); $e->setAttribute('productId', $product['product_id']);
$catalog->setAttribute('quantity', $product['quantity']); $e->setAttribute('quantity', $product['quantity']);
} }
/**
* Set type for offers
*/
$useServices = $servicesForIcml && isset($product['shipping']) && $product['shipping'] == 0;
$catalog->setAttribute('type', $useServices ? 'service' : 'product');
/** /**
* Offer activity * Offer activity
*/ */
$activity = $product['status'] == 1 ? 'Y' : 'N'; $activity = $product['status'] == 1 ? 'Y' : 'N';
$catalog->appendChild( $e->appendChild(
$this->dd->createElement('productActivity') $this->dd->createElement('productActivity')
)->appendChild( )->appendChild(
$this->dd->createTextNode($activity) $this->dd->createTextNode($activity)
@ -199,7 +183,7 @@ class ModelExtensionRetailcrmIcml extends Model
->getProductCategories($product['product_id']); ->getProductCategories($product['product_id']);
if (!empty($categories)) { if (!empty($categories)) {
foreach ($categories as $category) { foreach ($categories as $category) {
$catalog->appendChild($this->dd->createElement('categoryId')) $e->appendChild($this->dd->createElement('categoryId'))
->appendChild( ->appendChild(
$this->dd->createTextNode($category) $this->dd->createTextNode($category)
); );
@ -208,18 +192,18 @@ class ModelExtensionRetailcrmIcml extends Model
/** /**
* Name & price * Name & price
*/ */
$catalog->appendChild($this->dd->createElement('productName')) $e->appendChild($this->dd->createElement('productName'))
->appendChild($this->dd->createTextNode($product['name'])); ->appendChild($this->dd->createTextNode($product['name']));
if (!empty($options)) { if (!empty($options)) {
$optionsString = []; $optionsString = array();
foreach($options as $option) { foreach($options as $option) {
$optionsString[] = $option['name'].': '.$option['value']; $optionsString[] = $option['name'].': '.$option['value'];
} }
$optionsString = ' ('.implode(', ', $optionsString).')'; $optionsString = ' ('.implode(', ', $optionsString).')';
$catalog->appendChild($this->dd->createElement('name')) $e->appendChild($this->dd->createElement('name'))
->appendChild($this->dd->createTextNode($product['name'].$optionsString)); ->appendChild($this->dd->createTextNode($product['name'].$optionsString));
} else { } else {
$catalog->appendChild($this->dd->createElement('name')) $e->appendChild($this->dd->createElement('name'))
->appendChild($this->dd->createTextNode($product['name'])); ->appendChild($this->dd->createTextNode($product['name']));
} }
@ -233,13 +217,13 @@ class ModelExtensionRetailcrmIcml extends Model
$price = $product['price'] + $optionsValues['price']; $price = $product['price'] + $optionsValues['price'];
} }
$catalog->appendChild($this->dd->createElement('price')) $e->appendChild($this->dd->createElement('price'))
->appendChild($this->dd->createTextNode($price)); ->appendChild($this->dd->createTextNode($price));
/** /**
* Vendor * Vendor
*/ */
if ($product['manufacturer_id'] != 0) { if ($product['manufacturer_id'] != 0) {
$catalog->appendChild($this->dd->createElement('vendor')) $e->appendChild($this->dd->createElement('vendor'))
->appendChild( ->appendChild(
$this->dd->createTextNode( $this->dd->createTextNode(
$offerManufacturers[$product['manufacturer_id']] $offerManufacturers[$product['manufacturer_id']]
@ -280,7 +264,7 @@ class ModelExtensionRetailcrmIcml extends Model
$productHeight $productHeight
); );
$catalog->appendChild($this->dd->createElement('dimensions')) $e->appendChild($this->dd->createElement('dimensions'))
->appendChild($this->dd->createTextNode($dimensions)); ->appendChild($this->dd->createTextNode($dimensions));
} }
@ -289,24 +273,26 @@ class ModelExtensionRetailcrmIcml extends Model
*/ */
if ($product['image']) { if ($product['image']) {
$image = $this->generateImage($product['image']); $image = $this->generateImage($product['image']);
$catalog->appendChild($this->dd->createElement('picture')) $e->appendChild($this->dd->createElement('picture'))
->appendChild($this->dd->createTextNode($image)); ->appendChild($this->dd->createTextNode($image));
} }
/** /**
* Url * Url
*/ */
$this->url = new Url(HTTP_CATALOG, HTTPS_CATALOG); $this->url = new Url(
$catalog->appendChild($this->dd->createElement('url')) HTTP_CATALOG,
$this->config->get('config_secure')
? HTTP_CATALOG
: HTTPS_CATALOG
);
$e->appendChild($this->dd->createElement('url'))
->appendChild( ->appendChild(
$this->dd->createTextNode( $this->dd->createTextNode(
$this->url->link( $this->url->link(
'product/product&product_id=' . $product['product_id'], 'product/product&product_id=' . $product['product_id']
'',
(bool) $this->config->get('config_secure')
) )
) )
); );
// Options // Options
if (!empty($options)) { if (!empty($options)) {
foreach($options as $optionKey => $optionData) { foreach($options as $optionKey => $optionData) {
@ -314,7 +300,7 @@ class ModelExtensionRetailcrmIcml extends Model
$param->setAttribute('code', $optionData['option_id']); $param->setAttribute('code', $optionData['option_id']);
$param->setAttribute('name', $optionData['name']); $param->setAttribute('name', $optionData['name']);
$param->appendChild($this->dd->createTextNode($optionData['value'])); $param->appendChild($this->dd->createTextNode($optionData['value']));
$catalog->appendChild($param); $e->appendChild($param);
} }
} }
if ($product['sku']) { if ($product['sku']) {
@ -322,24 +308,18 @@ class ModelExtensionRetailcrmIcml extends Model
$sku->setAttribute('code', 'article'); $sku->setAttribute('code', 'article');
$sku->setAttribute('name', $this->language->get('article')); $sku->setAttribute('name', $this->language->get('article'));
$sku->appendChild($this->dd->createTextNode($product['sku'])); $sku->appendChild($this->dd->createTextNode($product['sku']));
$catalog->appendChild($sku); $e->appendChild($sku);
} }
if ($product['weight'] != '') { if ($product['weight'] != '') {
$weight = $this->dd->createElement('weight'); $weight = $this->dd->createElement('param');
$coeffWeight = 1; $weight->setAttribute('code', 'weight');
$weight->setAttribute('name', $this->language->get('weight'));
if (!empty($weightClasses[$product['weight_class_id']]['value'])) { $weightValue = (isset($product['weight_class']))
$coeffWeight = $weightClasses[$product['weight_class_id']]['value']; ? round($product['weight'], 3) . ' ' . $product['weight_class']
} : round($product['weight'], 3)
$weightValue = !empty($optionsValues['weight'])
? $product['weight'] + $optionsValues['weight']
: $product['weight']
; ;
$weightValue = round($weightValue / $coeffWeight, 6);
$weight->appendChild($this->dd->createTextNode($weightValue)); $weight->appendChild($this->dd->createTextNode($weightValue));
$catalog->appendChild($weight); $e->appendChild($weight);
} }
} }
} }
@ -352,7 +332,7 @@ class ModelExtensionRetailcrmIcml extends Model
private function generateImage($image) private function generateImage($image)
{ {
$this->load->model('tool/image'); $this->load->model('tool/image');
$currentTheme = $this->config->get('config_theme'); $currentTheme = $this->config->get('config_theme');
$width = $this->config->get($currentTheme . '_image_related_width') ? $this->config->get($currentTheme . '_image_related_width') : 200; $width = $this->config->get($currentTheme . '_image_related_width') ? $this->config->get($currentTheme . '_image_related_width') : 200;
$height = $this->config->get($currentTheme . '_image_related_height') ? $this->config->get($currentTheme . '_image_related_height') : 200; $height = $this->config->get($currentTheme . '_image_related_height') ? $this->config->get($currentTheme . '_image_related_height') : 200;

View file

@ -158,22 +158,6 @@ class ModelExtensionRetailcrmReferences extends Model
return (!$response->isSuccessful()) ? array() : $response->deliveryTypes; return (!$response->isSuccessful()) ? array() : $response->deliveryTypes;
} }
/**
* Get RetailCRM available sites list
*/
public function getApiSite()
{
$response = $this->retailcrmApiClient->sitesList();
if (!$response || !$response->isSuccessful()) {
return [];
}
$sites = $response->sites;
return end($sites);
}
/** /**
* Get RetailCRM order statuses * Get RetailCRM order statuses
* *

View file

@ -1,11 +1,5 @@
.retailcrm_unit {margin-bottom: 10px;} .retailcrm_unit {margin-bottom: 10px;}
.retailcrm_disable_border {border: none !important;}
.retailcrm_unit input {width: 30%;} .retailcrm_unit input {width: 30%;}
.checkbox input{width: auto;} .checkbox input{width: auto;}
.retailcrm_unit input[type=checkbox] {width: 13px;} .retailcrm_unit input[type=checkbox] {width: 13px;}
.retailcrm_unit select {max-width: 500px;} .retailcrm_unit select {max-width: 500px;}
.question-mark {
cursor: help;
position: relative;
}

View file

@ -97,22 +97,7 @@
</div> </div>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend><?php echo $icml_settings; ?></legend> <legend><?php echo $text_currency; ?></legend>
<div class="form-group retailcrm_unit">
<label class="col-sm-2 control-label question-mark" for="retailcrm_icml_service_enabled" title="When the option is enabled, all products for which delivery is disabled will be considered as services and uploaded to CRM as services"><?php echo $icml_service_enabled_label; ?></label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="retailcrm_icml_service_enabled value="1"
<?php if(isset($saved_settings['retailcrm_icml_service_enabled']) && $saved_settings['retailcrm_icml_service_enabled'] == 1): echo 'checked'; endif;?>/>
<?php echo $text_yes; ?>
</label>
<label class="radio-inline">
<input type="radio" name="retailcrm_icml_service_enabled" value="0"
<?php if(!isset($saved_settings['retailcrm_icml_service_enabled']) || $saved_settings['retailcrm_icml_service_enabled'] == 0): echo 'checked'; endif;?>/>
<?php echo $text_no; ?>
</label>
</div>
</div
<div class="form-group retailcrm_unit"> <div class="form-group retailcrm_unit">
<label class="col-sm-2 control-label"><?php echo $text_currency; ?></label> <label class="col-sm-2 control-label"><?php echo $text_currency; ?></label>
<div class="col-md-4 col-sm-10"> <div class="col-md-4 col-sm-10">
@ -127,6 +112,9 @@
</select> </select>
</div> </div>
</div> </div>
</fieldset>
<fieldset>
<legend><?php echo $text_lenght; ?></legend>
<div class="form-group retailcrm_unit"> <div class="form-group retailcrm_unit">
<label class="col-sm-2 control-label"><?php echo $text_lenght_label; ?></label> <label class="col-sm-2 control-label"><?php echo $text_lenght_label; ?></label>
<div class="col-md-4 col-sm-10"> <div class="col-md-4 col-sm-10">
@ -225,55 +213,6 @@
</div> </div>
</div> </div>
</fieldset> </fieldset>
<fieldset>
<legend><?php echo $summ_around; ?></legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="retailcrm_summ_around"><?php echo $text_summ_around; ?></label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="retailcrm_summ_around" value="1" <?php if (isset($saved_settings['retailcrm_summ_around']) &&
$saved_settings['retailcrm_summ_around'] == 1) :
echo 'checked'; endif; ?> />
<?php echo $text_yes; ?>
</label>
<label class="radio-inline">
<input type="radio" name="retailcrm_summ_around" value="0" <?php if (!isset($saved_settings['retailcrm_summ_around']) ||
$saved_settings['retailcrm_summ_around'] == 0) :
echo 'checked'; endif; ?> />
<?php echo $text_no; ?>
</label>
</div>
</div>
</fieldset>
<fieldset>
<legend><?php echo $text_retailcrm_discount; ?></legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="label_discount"><?php echo $text_retailcrm_label_discount ?></label>
<div class="col-lg-4 col-md-6 col-sm-10">
<input name="retailcrm_label_discount" id="label_discount" class="form-control" value="<?php if (isset($saved_settings['retailcrm_label_discount'])): echo $saved_settings['retailcrm_label_discount']; else: echo $default_retailcrm_label_discount; endif ;?>">
</div>
</div>
</fieldset>
<fieldset>
<legend><?php echo $sum_payment; ?></legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="retailcrm_sum_payment"><?php echo $text_sum_payment?></label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="retailcrm_sum_payment" value="1" <?php if (isset($saved_settings['retailcrm_sum_payment']) &&
$saved_settings['retailcrm_sum_payment'] == 1) :
echo 'checked'; endif;?> />
<?php echo $text_yes; ?>
</label>
<label class="radio-inline">
<input type="radio" name="retailcrm_sum_payment" value="0" <?php if (!isset($saved_settings['retailcrm_sum_payment']) ||
$saved_settings['retailcrm_sum_payment'] == 0) :
echo 'checked'; endif;?> />
<?php echo $text_no; ?>
</label>
</div>
</div>
</fieldset>
</div> </div>
<div class="tab-pane" id="tab-references"> <div class="tab-pane" id="tab-references">
<fieldset> <fieldset>

View file

@ -9,7 +9,7 @@
<button type="button" id="icml" data-toggle="tooltip" title="{{ text_button_catalog }}" class="btn btn-success"><i class="fa fa-file-text-o"></i></button> <button type="button" id="icml" data-toggle="tooltip" title="{{ text_button_catalog }}" class="btn btn-success"><i class="fa fa-file-text-o"></i></button>
<button type="submit" form="form-module" data-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa fa-save"></i></button> <button type="submit" form="form-module" data-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa fa-save"></i></button>
<a href="{{ cancel }}" data-toggle="tooltip" title="{{ button_cancel }}" class="btn btn-default"><i class="fa fa-reply"></i></a></div> <a href="{{ cancel }}" data-toggle="tooltip" title="{{ button_cancel }}" class="btn btn-default"><i class="fa fa-reply"></i></a></div>
<h1>{{ heading_title }} {{ module_version }}</h1> <h1>{{ heading_title }}</h1>
<ul class="breadcrumb"> <ul class="breadcrumb">
{% for breadcrumb in breadcrumbs %} {% for breadcrumb in breadcrumbs %}
<li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li> <li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
@ -55,7 +55,7 @@
<input class="form-control" id="retailcrm_url" type="text" name="module_retailcrm_url" value="{% if saved_settings.module_retailcrm_url is defined %}{{ saved_settings.module_retailcrm_url }}{% endif %}"> <input class="form-control" id="retailcrm_url" type="text" name="module_retailcrm_url" value="{% if saved_settings.module_retailcrm_url is defined %}{{ saved_settings.module_retailcrm_url }}{% endif %}">
</div> </div>
</div> </div>
<div class="form-group retailcrm_unit retailcrm_disable_border"> <div class="form-group retailcrm_unit">
<label class="col-sm-2 control-label" for="retailcrm_apikey">{{ retailcrm_apikey }}</label> <label class="col-sm-2 control-label" for="retailcrm_apikey">{{ retailcrm_apikey }}</label>
<div class="col-lg-4 col-md-6 col-sm-10"> <div class="col-lg-4 col-md-6 col-sm-10">
<input class="form-control" id="retailcrm_apikey" type="text" name="module_retailcrm_apikey" value="{% if saved_settings.module_retailcrm_apikey is defined %}{{ saved_settings.module_retailcrm_apikey }}{% endif %}"> <input class="form-control" id="retailcrm_apikey" type="text" name="module_retailcrm_apikey" value="{% if saved_settings.module_retailcrm_apikey is defined %}{{ saved_settings.module_retailcrm_apikey }}{% endif %}">
@ -100,27 +100,8 @@
</div> </div>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{{ icml_settings }}</legend> <legend>{{ text_currency }}</legend>
<div class="form-group retailcrm_unit retailcrm_disable_border"> <div class="form-group retailcrm_unit">
<label class="col-sm-2 control-label question-mark" for="module_retailcrm_icml_service_enabled" title="{{ icml_service_description }}">{{ icml_service_enabled_label }}</label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="module_retailcrm_icml_service_enabled" value="1"
{% if saved_settings.module_retailcrm_icml_service_enabled is defined and saved_settings.module_retailcrm_icml_service_enabled == 1 %}
checked
{% endif %} />
{{ text_yes }}
</label>
<label class="radio-inline">
<input type="radio" name="module_retailcrm_icml_service_enabled" value="0"
{% if saved_settings.module_retailcrm_icml_service_enabled is not defined or saved_settings.module_retailcrm_icml_service_enabled == 0 %}
checked
{% endif %} />
{{ text_no }}
</label>
</div>
</div>
<div class="form-group retailcrm_unit retailcrm_disable_border">
<label class="col-sm-2 control-label">{{ text_currency_label }}</label> <label class="col-sm-2 control-label">{{ text_currency_label }}</label>
<div class="col-md-4 col-sm-10"> <div class="col-md-4 col-sm-10">
<select id="module_retailcrm_currency" name="module_retailcrm_currency" class="form-control"> <select id="module_retailcrm_currency" name="module_retailcrm_currency" class="form-control">
@ -134,14 +115,17 @@
</select> </select>
</div> </div>
</div> </div>
<div class="form-group retailcrm_unit retailcrm_disable_border"> </fieldset>
<fieldset>
<legend>{{ text_lenght }}</legend>
<div class="form-group retailcrm_unit">
<label class="col-sm-2 control-label">{{ text_lenght_label }}</label> <label class="col-sm-2 control-label">{{ text_lenght_label }}</label>
<div class="col-md-4 col-sm-10"> <div class="col-md-4 col-sm-10">
<select id="module_retailcrm_lenght" name="module_retailcrm_lenght" class="form-control"> <select id="module_retailcrm_lenght" name="module_retailcrm_lenght" class="form-control">
{% for lenght in lenghts %} {% for lenght in lenghts %}
<option value="{{ lenght.length_class_id }}" {% if saved_settings.module_retailcrm_lenght is defined and saved_settings.module_retailcrm_lenght == lenght.length_class_id %} selected="selected" {% endif %}> <option value="{{ lenght.length_class_id }}" {% if saved_settings.module_retailcrm_lenght is defined and saved_settings.module_retailcrm_lenght == lenght.length_class_id %} selected="selected" {% endif %}>
{{ lenght.title }} {{ lenght.title }}
</option> </option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
@ -236,59 +220,6 @@
</div> </div>
</div> </div>
</fieldset> </fieldset>
<fieldset>
<legend>{{ summ_around }}</legend>
<div class="form-group">
<label class="col-sm-2 control-label" class="col-sm-2 control-label" for="module_retailcrm_summ_around">{{ text_summ_around }}</label>
<div class="col-sm-10">
<label class="control-label" class="radio-inline">
<input type="radio" name="module_retailcrm_summ_around" value="1"
{% if saved_settings.module_retailcrm_summ_around is defined and saved_settings.module_retailcrm_summ_around == 1 %}
checked
{% endif %} />
{{ text_yes }}
</label>
<label class="control-label" class="radio-inline">
<input type="radio" name="module_retailcrm_summ_around" value="0"
{% if saved_settings.module_retailcrm_summ_around is not defined or saved_settings.module_retailcrm_summ_around == 0 %}
checked
{% endif %} />
{{ text_no }}
</label>
</div>
</div>
</fieldset>
<fieldset>
<legend>{{ text_retailcrm_discount }}</legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="label_discount">{{ text_retailcrm_label_discount }}</label>
<div class="col-lg-4 col-md-6 col-sm-10">
<input name="module_retailcrm_label_discount" id="label_discount" class="form-control" value="{% if saved_settings.module_retailcrm_label_discount is defined %}{{ saved_settings.module_retailcrm_label_discount }}{% else %}{{ default_retailcrm_label_discount }}{% endif %}">
</div>
</div>
</fieldset>
<fieldset>
<legend>{{ sum_payment }}</legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="module_retailcrm_sum_payment">{{ text_sum_payment }}</label>
<div class="col-sm-10">
<label class="control-label radio-inline">
<input type="radio" name="module_retailcrm_sum_payment" value="1"
{% if saved_settings.module_retailcrm_sum_payment is defined and saved_settings.module_retailcrm_sum_payment == 1 %}
checked
{% endif %} >
{{ text_yes }}
</label>
<label class="control-label radio-inline">
<input type="radio" name="module_retailcrm_sum_payment" value="0"
{% if saved_settings.module_retailcrm_sum_payment is not defined or saved_settings.module_retailcrm_sum_payment == 0 %}
checked
{% endif %} >
{{ text_no }}
</label>
</div>
</div>
</fieldset>
</div> </div>
<div class="tab-pane" id="tab-references"> <div class="tab-pane" id="tab-references">
<fieldset> <fieldset>

View file

@ -77,8 +77,8 @@ class ControllerApiRetailcrm extends Controller
$address = array( $address = array(
'country_id' => $country_id, 'country_id' => $country_id,
'zone_id' => $zone['zone_id'], 'zone_id' => $zone['zone_id'],
'iso_code_2' => $country['iso_code_2'] ?? '', 'iso_code_2' => $country['iso_code_2'],
'iso_code_3' => $country['iso_code_3'] ?? '', 'iso_code_3' => $country['iso_code_3'],
'zone_code' => $zone['code'], 'zone_code' => $zone['code'],
'postcode' => '', 'postcode' => '',
'city' => '' 'city' => ''

View file

@ -138,20 +138,6 @@ class ControllerExtensionModuleRetailcrm extends Controller {
} }
} }
public function customer_edit_newsletter($parameter1, $parameter2, $parameter3)
{
$customerId = $this->customer->getId();
$customer = $this->model_account_customer->getCustomer($customerId);
if (file_exists(DIR_APPLICATION . 'model/extension/retailcrm/custom/customer.php')) {
$this->load->model('extension/retailcrm/custom/customer');
$this->model_extension_retailcrm_custom_customer->changeInCrm($customer, $this->retailcrmApiClient);
} else {
$customer_manager = $this->retailcrm->getCustomerManager();
$customer_manager->editCustomerNewsLetter($customer);
}
}
/** /**
* Update customer on event * Update customer on event
* *

View file

@ -136,12 +136,6 @@ class ModelExtensionRetailcrmOrder extends Model {
$order['number'] = $order_data['order_id']; $order['number'] = $order_data['order_id'];
} }
if (isset($this->settings[$this->moduleTitle . '_summ_around'])
&& $this->settings[$this->moduleTitle . '_summ_around'] == 1
) {
$order['applyRound'] = true;
}
$order['externalId'] = $order_id; $order['externalId'] = $order_id;
$order['firstName'] = $order_data['shipping_firstname']; $order['firstName'] = $order_data['shipping_firstname'];
$order['lastName'] = $order_data['shipping_lastname']; $order['lastName'] = $order_data['shipping_lastname'];
@ -271,41 +265,34 @@ class ModelExtensionRetailcrmOrder extends Model {
if (isset($properties)) $item['properties'] = $properties; if (isset($properties)) $item['properties'] = $properties;
$order['items'][] = $item; $order['items'][] = $item;
}
if (isset($order_data['order_status_id']) && $order_data['order_status_id'] > 0) {
if (isset($order_data['order_status_id']) && $order_data['order_status_id'] > 0) { $order['status'] = $this->settings[$this->moduleTitle . '_status'][$order_data['order_status_id']];
$order['status'] = $this->settings[$this->moduleTitle . '_status'][$order_data['order_status_id']]; } elseif (isset($order_data['order_status_id']) && $order_data['order_status_id'] == 0) {
} elseif (isset($order_data['order_status_id']) && $order_data['order_status_id'] == 0) { $order['status'] = $this->settings[$this->moduleTitle . '_missing_status'];
$order['status'] = $this->settings[$this->moduleTitle . '_missing_status']; }
}
if (isset($this->settings[$this->moduleTitle . '_custom_field']) && $order_data['custom_field']) { if (isset($this->settings[$this->moduleTitle . '_custom_field']) && $order_data['custom_field']) {
$customFields = $order_data['custom_field']; $customFields = $order_data['custom_field'];
foreach ($customFields as $key => $value) { foreach ($customFields as $key => $value) {
if (isset($this->settings[$this->moduleTitle . '_custom_field']['o_' . $key])) { if (isset($this->settings[$this->moduleTitle . '_custom_field']['o_' . $key])) {
$customFieldsToCrm[$this->settings[$this->moduleTitle . '_custom_field']['o_' . $key]] = $value; $customFieldsToCrm[$this->settings[$this->moduleTitle . '_custom_field']['o_' . $key]] = $value;
}
}
if (isset($customFieldsToCrm)) {
$order['customFields'] = $customFieldsToCrm;
} }
} }
if (isset($customFieldsToCrm)) {
$order['customFields'] = $customFieldsToCrm;
}
} }
$payment = array( $payment = array(
'externalId' => $order_id, 'externalId' => $order_id,
'type' => $payment_code, 'type' => $payment_code,
'amount' => $totals['total'] 'amount' => $totals['total']
); );
if (isset($this->settings[$this->moduleTitle . '_sum_payment']) &&
$this->settings[$this->moduleTitle . '_sum_payment'] == 1
) {
unset($payment['amount']);
}
if (!$create) { if (!$create) {
$payment['order'] = array( $payment['order'] = array(
'externalId' => $order_id 'externalId' => $order_id
@ -426,7 +413,6 @@ class ModelExtensionRetailcrmOrder extends Model {
'lastName' => $data['lastname'], 'lastName' => $data['lastname'],
'email' => $data['email'], 'email' => $data['email'],
'createdAt' => $data['date_added'], 'createdAt' => $data['date_added'],
'externalId' => $data['customer_id'],
'address' => array( 'address' => array(
'countryIso' => $data['payment_iso_code_2'], 'countryIso' => $data['payment_iso_code_2'],
'index' => $data['payment_postcode'], 'index' => $data['payment_postcode'],

View file

@ -1,11 +0,0 @@
<?php
/**
* Class ModelExtensionTotalRetailcrmDiscount
*
* This class is unused in this module but used inside opencart as stub in file "catalog/model/checkout/order.php"
* in method addOrderHistory()
*/
class ModelExtensionTotalRetailcrmDiscount extends Model
{
}

View file

@ -31,7 +31,7 @@ class OpencartApiClient {
$cookies = array(); $cookies = array();
foreach ($cookieFile as $line) { foreach ($cookieFile as $line) {
if (empty($line) OR $line[0] == '#') { if (empty($line) OR $line{0} == '#') {
continue; continue;
} }

View file

@ -584,18 +584,30 @@ class RetailcrmApiClient5
/** /**
* Get orders history * Get orders history
*
* @param array $filter * @param array $filter
* @param int|null $limit * @param null $page
* @param null $limit
* *
* @return ApiResponse * @return ApiResponse
*/ */
public function ordersHistory(array $filter = [], ?int $limit = 100) public function ordersHistory(array $filter = array(), $page = null, $limit = null)
{ {
$parameters = array();
if (count($filter)) {
$parameters['filter'] = $filter;
}
if (null !== $page) {
$parameters['page'] = (int) $page;
}
if (null !== $limit) {
$parameters['limit'] = (int) $limit;
}
return $this->client->makeRequest( return $this->client->makeRequest(
'/orders/history', '/orders/history',
RetailcrmHttpClient::METHOD_GET, RetailcrmHttpClient::METHOD_GET,
['filter' => $filter, 'limit' => $limit] $parameters
); );
} }
@ -896,18 +908,30 @@ class RetailcrmApiClient5
/** /**
* Get customers history * Get customers history
*
* @param array $filter * @param array $filter
* @param int|null $limit * @param null $page
* @param null $limit
* *
* @return ApiResponse * @return ApiResponse
*/ */
public function customersHistory(array $filter = [], ?int $limit = 100) public function customersHistory(array $filter = array(), $page = null, $limit = null)
{ {
$parameters = array();
if (count($filter)) {
$parameters['filter'] = $filter;
}
if (null !== $page) {
$parameters['page'] = (int) $page;
}
if (null !== $limit) {
$parameters['limit'] = (int) $limit;
}
return $this->client->makeRequest( return $this->client->makeRequest(
'/customers/history', '/customers/history',
RetailcrmHttpClient::METHOD_GET, RetailcrmHttpClient::METHOD_GET,
['filter' => $filter, 'limit' => $limit] $parameters
); );
} }
@ -1084,17 +1108,34 @@ class RetailcrmApiClient5
/** /**
* Get orders assembly history * Get orders assembly history
* *
* @param array $filter * @param array $filter (default: array())
* @param int|null $limit * @param int $page (default: null)
* @param int $limit (default: null)
*
* @throws \InvalidArgumentException
* @throws \RetailCrm\Exception\CurlException
* @throws \RetailCrm\Exception\InvalidJsonException
* *
* @return ApiResponse * @return ApiResponse
*/ */
public function ordersPacksHistory(array $filter = [], ?int $limit = 100) public function ordersPacksHistory(array $filter = array(), $page = null, $limit = null)
{ {
$parameters = array();
if (count($filter)) {
$parameters['filter'] = $filter;
}
if (null !== $page) {
$parameters['page'] = (int) $page;
}
if (null !== $limit) {
$parameters['limit'] = (int) $limit;
}
return $this->client->makeRequest( return $this->client->makeRequest(
'/orders/packs/history', '/orders/packs/history',
RetailcrmHttpClient::METHOD_GET, RetailcrmHttpClient::METHOD_GET,
['filter' => $filter, 'limit' => $limit] $parameters
); );
} }
@ -2411,18 +2452,30 @@ class RetailcrmApiClient5
/** /**
* Get corporate customers history * Get corporate customers history
*
* @param array $filter * @param array $filter
* @param int|null $limit * @param null $page
* @param null $limit
* *
* @return ApiResponse * @return \ApiResponse
*/ */
public function customersCorporateHistory(array $filter = [], ?int $limit = 100) public function customersCorporateHistory(array $filter = [], $page = null, $limit = null)
{ {
$parameters = [];
if (count($filter)) {
$parameters['filter'] = $filter;
}
if (null !== $page) {
$parameters['page'] = (int) $page;
}
if (null !== $limit) {
$parameters['limit'] = (int) $limit;
}
return $this->client->makeRequest( return $this->client->makeRequest(
'/customers-corporate/history', '/customers-corporate/history',
RetailcrmHttpClient::METHOD_GET, RetailcrmHttpClient::METHOD_GET,
['filter' => $filter, 'limit' => $limit] $parameters
); );
} }

View file

@ -1,7 +1,5 @@
<?php <?php
use retailcrm\Retailcrm;
class RetailcrmHttpClient class RetailcrmHttpClient
{ {
const METHOD_GET = 'GET'; const METHOD_GET = 'GET';
@ -48,9 +46,9 @@ class RetailcrmHttpClient
public function makeRequest( public function makeRequest(
$path, $path,
$method, $method,
array $parameters = [] array $parameters = array()
) { ) {
$allowedMethods = [self::METHOD_GET, self::METHOD_POST]; $allowedMethods = array(self::METHOD_GET, self::METHOD_POST);
if (!in_array($method, $allowedMethods, false)) { if (!in_array($method, $allowedMethods, false)) {
throw new \InvalidArgumentException( throw new \InvalidArgumentException(
@ -62,16 +60,7 @@ class RetailcrmHttpClient
); );
} }
$parameters = array_merge($this->defaultParameters, $parameters);
$parameters = self::METHOD_GET === $method
? array_merge($this->defaultParameters, $parameters, [
'cms_source' => 'OpenCart',
'cms_version' => VERSION,
'php_version' => function_exists('phpversion') ? phpversion() : '',
'module_version' => Retailcrm::VERSION_MODULE,
])
: $parameters = array_merge($this->defaultParameters, $parameters);
$url = $this->url . $path; $url = $this->url . $path;

View file

@ -6,7 +6,7 @@
* @method ordersCreate($order, $site = null) * @method ordersCreate($order, $site = null)
* @method ordersEdit($order, $by = 'externalId', $site = null) * @method ordersEdit($order, $by = 'externalId', $site = null)
* @method ordersGet($order, $by = 'externalId', $site = null) * @method ordersGet($order, $by = 'externalId', $site = null)
* @method ordersList(array $filter = [], $page = null, $limit = null) * @method ordersList($filter, $page, $limit)
* @method customersCreate($customer, $site = null) * @method customersCreate($customer, $site = null)
* @method customersEdit($customer, $by = 'externalId', $site = null) * @method customersEdit($customer, $by = 'externalId', $site = null)
* @method customersList(array $filter = [], $page = null, $limit = null) * @method customersList(array $filter = [], $page = null, $limit = null)
@ -27,16 +27,16 @@ class RetailcrmProxy {
public function __construct($url, $key) { public function __construct($url, $key) {
$this->api = new RetailcrmApiClient5($url, $key); $this->api = new RetailcrmApiClient5($url, $key);
$this->log = new \Log('retailcrm.log'); $this->log = new \Log('retailcrm.log');
} }
public function __call($method, $arguments) { public function __call($method, $arguments) {
try { try {
$response = call_user_func_array([$this->api, $method], $arguments); $response = call_user_func_array(array($this->api, $method), $arguments);
if (!$response->isSuccessful()) { if (!$response->isSuccessful()) {
$this->log->write(sprintf("[%s] %s", $method, $response->getErrorMsg())); $this->log->write(sprintf("[%s] %s", $method, $response->getErrorMsg()));
if (isset($response['errors'])) { if (isset($response['errors'])) {
$error = implode("\n", $response['errors']); $error = implode("\n", $response['errors']);
$this->log->write($error . "\n"); $this->log->write($error . "\n");

View file

@ -38,14 +38,10 @@ class Customer {
} }
$customer_data['firstname'] = $customer['firstName']; $customer_data['firstname'] = $customer['firstName'];
$customer_data['lastname'] = $customer['lastName'] ?? ''; $customer_data['lastname'] = isset($customer['lastName']) ? $customer['lastName'] : '';
$customer_data['email'] = $customer['email']; $customer_data['email'] = $customer['email'];
$customer_data['telephone'] = $customer['phones'] ? $customer['phones'][0]['number'] : ''; $customer_data['telephone'] = $customer['phones'] ? $customer['phones'][0]['number'] : '';
if (!empty($customer['emailMarketingUnsubscribedAt'])) {
$customer_data['newsletter'] = 0;
}
$customer_data['affiliate'] = false; $customer_data['affiliate'] = false;
} }
@ -113,7 +109,7 @@ class Customer {
} }
} }
$customer_data['custom_field'] = $custom_fields ?? []; $customer_data['custom_field'] = isset($custom_fields) ? $custom_fields : '';
} }
} }
} }

View file

@ -5,7 +5,6 @@ namespace retailcrm\history;
use retailcrm\repository\DataRepository; use retailcrm\repository\DataRepository;
use retailcrm\repository\OrderRepository; use retailcrm\repository\OrderRepository;
use retailcrm\repository\ProductsRepository; use retailcrm\repository\ProductsRepository;
use retailcrm\Retailcrm;
use retailcrm\service\SettingsManager; use retailcrm\service\SettingsManager;
class Order { class Order {
@ -209,7 +208,7 @@ class Order {
$shipping = explode('.', $data['shipping_code']); $shipping = explode('.', $data['shipping_code']);
$shippingModule = $shipping[0]; $shippingModule = $shipping[0];
if (isset($this->oc_delivery[$shippingModule][$data['shipping_code']]['title'])) { if (isset($this->ocDelivery[$shippingModule][$data['shipping_code']]['title'])) {
$data['shipping_method'] = $this->oc_delivery[$shippingModule][$data['shipping_code']]['title']; $data['shipping_method'] = $this->oc_delivery[$shippingModule][$data['shipping_code']]['title'];
} else { } else {
$data['shipping_method'] = $this->oc_delivery[$shippingModule]['title']; $data['shipping_method'] = $this->oc_delivery[$shippingModule]['title'];
@ -286,15 +285,6 @@ class Order {
$subtotal_settings = $this->settings_manager->getSettingByKey($this->data_repository->totalTitles() . 'sub_total'); $subtotal_settings = $this->settings_manager->getSettingByKey($this->data_repository->totalTitles() . 'sub_total');
$total_settings = $this->settings_manager->getSettingByKey($this->data_repository->totalTitles() . 'total'); $total_settings = $this->settings_manager->getSettingByKey($this->data_repository->totalTitles() . 'total');
$shipping_settings = $this->settings_manager->getSettingByKey($this->data_repository->totalTitles() . 'shipping'); $shipping_settings = $this->settings_manager->getSettingByKey($this->data_repository->totalTitles() . 'shipping');
$retailcrm_label_discount = $this->settings_manager->getSetting('label_discount')
?: $this->data_repository->getLanguage('default_retailcrm_label_discount');
$totalDiscount = 0;
foreach ($order['items'] as $item) {
if ($item['discountTotal'] !== 0) {
$totalDiscount += $item['discountTotal'] * $item['quantity'];
}
}
$data['total'] = $order['totalSumm']; $data['total'] = $order['totalSumm'];
$data['order_total'] = array( $data['order_total'] = array(
@ -324,41 +314,15 @@ class Order {
) )
); );
//TODO подкорректировать логику добавления скидки из RetailCRM
//Если заказ создали со скидкой в RetailCRM, то добавить скидку
if (!empty($totalDiscount)) {
$data['order_total'][] = array(
'order_total_id' => '',
'code' => Retailcrm::RETAILCRM_DISCOUNT,
'title' => $retailcrm_label_discount,
'value' => -$totalDiscount,
'sort_order' => Retailcrm::RETAILCRM_DISCOUNT_SORT_ORDER,
);
}
if (!empty($order['externalId'])) { if (!empty($order['externalId'])) {
$orderTotals = $this->order_repository->getOrderTotals($order['externalId']); $orderTotals = $this->order_repository->getOrderTotals($order['externalId']);
foreach ($orderTotals as $orderTotal) { foreach ($orderTotals as $orderTotal) {
if ($orderTotal['code'] == 'coupon' if ($orderTotal['code'] == 'coupon'
|| $orderTotal['code'] == 'reward' || $orderTotal['code'] == 'reward'
|| $orderTotal['code'] == 'voucher'
) { ) {
$data['order_total'][] = $orderTotal; $data['order_total'][] = $orderTotal;
$totalDiscount -= abs($orderTotal['value']);
} }
} }
//TODO подкорректировать логику добавления скидки из RetailCRM
$keyRetailCrmDiscount = array_search(Retailcrm::RETAILCRM_DISCOUNT, array_map(function ($item) {
return $item['code'];
}, $data['order_total']));
if ($totalDiscount > 0 && false !== $keyRetailCrmDiscount) {
$data['order_total'][$keyRetailCrmDiscount]['value'] = -$totalDiscount;
} elseif ($totalDiscount <= 0 && false !== $keyRetailCrmDiscount) {
unset($data['order_total'][$keyRetailCrmDiscount]);
}
} }
} }

View file

@ -124,7 +124,6 @@ class DataRepository extends \retailcrm\Base {
* @return array * @return array
*/ */
public function getZoneByName($name) { public function getZoneByName($name) {
$name = $this->db->escape($name);
$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "zone` WHERE name = '" . $name . "'"); $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "zone` WHERE name = '" . $name . "'");
return $query->row; return $query->row;

View file

@ -12,7 +12,7 @@ class CustomerManager {
} }
public function createCustomer($customer_data, $address) { public function createCustomer($customer_data, $address) {
$customer = $this->prepareCustomer($customer_data, $address, !empty($customer_data['newsletter'])); $customer = $this->prepareCustomer($customer_data, $address);
$this->api->customersCreate($customer); $this->api->customersCreate($customer);
} }
@ -23,22 +23,13 @@ class CustomerManager {
$this->api->customersEdit($customer); $this->api->customersEdit($customer);
} }
public function editCustomerNewsLetter($customer_data) {
$this->api->customersEdit(
[
'externalId' => $customer_data['customer_id'],
'subscribed' => !empty($customer_data['newsletter']),
]
);
}
public function uploadCustomers($customers) { public function uploadCustomers($customers) {
$this->api->customersUpload($customers); $this->api->customersUpload($customers);
} }
public function prepareCustomer($customer_data, $address, $isSubscribed = null) { public function prepareCustomer($customer_data, $address) {
return $this->customer_converter return $this->customer_converter
->initCustomerData($customer_data, $address, $isSubscribed) ->initCustomerData($customer_data, $address)
->setCustomerData() ->setCustomerData()
->setAddress() ->setAddress()
->setCustomFields() ->setCustomFields()

View file

@ -39,10 +39,7 @@ class OrderManager {
public function createOrder($order_data, $order_products, $order_totals) { public function createOrder($order_data, $order_products, $order_totals) {
$order = $this->prepareOrder($order_data, $order_products, $order_totals); $order = $this->prepareOrder($order_data, $order_products, $order_totals);
if (!isset($order['customer']) if (!isset($order['customer'])) {
|| (isset($order['customer']['externalId'])
&& !$this->checkExistCustomer($order['customer']['externalId']))
) {
$customer = $this->customer_manager->getCustomerForOrder($order_data); $customer = $this->customer_manager->getCustomerForOrder($order_data);
if (!empty($customer)) { if (!empty($customer)) {
$order['customer'] = $customer; $order['customer'] = $customer;
@ -155,7 +152,7 @@ class OrderManager {
} }
foreach ($order_info['payments'] as $payment_data) { foreach ($order_info['payments'] as $payment_data) {
if (isset($payment_data['externalId'])) { if (isset($payment_data['externalId']) && $payment_data['externalId'] == $orderId) {
$payment = $payment_data; $payment = $payment_data;
} }
} }
@ -170,15 +167,4 @@ class OrderManager {
$this->api->ordersPaymentEdit($order_payment); $this->api->ordersPaymentEdit($order_payment);
} }
} }
/**
* @param string $customerExternalId Customer's external id
*
* @return bool
*/
private function checkExistCustomer($customerExternalId) {
$result = $this->api->customersGet($customerExternalId);
return $result && $result->isSuccessful() && $result->offsetExists('customer');
}
} }

View file

@ -4,9 +4,9 @@ namespace retailcrm\service;
class RetailcrmCustomerConverter { class RetailcrmCustomerConverter {
protected $data; protected $data;
protected $customer_data = []; protected $customer_data = array();
protected $address = []; protected $address = array();
protected $isSubscribed;
protected $settingsManager; protected $settingsManager;
public function __construct( public function __construct(
@ -19,11 +19,10 @@ class RetailcrmCustomerConverter {
return $this->data; return $this->data;
} }
public function initCustomerData($customer_data, $address, $isSubscribed) { public function initCustomerData($customer_data, $address) {
$this->data = []; $this->data = array();
$this->customer_data = $customer_data; $this->customer_data = $customer_data;
$this->address = $address; $this->address = $address;
$this->isSubscribed = $isSubscribed;
return $this; return $this;
} }
@ -35,12 +34,12 @@ class RetailcrmCustomerConverter {
$this->data['email'] = $this->customer_data['email']; $this->data['email'] = $this->customer_data['email'];
$this->data['createdAt'] = $this->customer_data['date_added']; $this->data['createdAt'] = $this->customer_data['date_added'];
if ($this->isSubscribed !== null) {
$this->data['subscribed'] = $this->isSubscribed;
}
if (!empty($this->customer_data['telephone'])) { if (!empty($this->customer_data['telephone'])) {
$this->data['phones'] = [['number' => $this->customer_data['telephone']]]; $this->data['phones'] = array(
array(
'number' => $this->customer_data['telephone']
)
);
} }
return $this; return $this;
@ -48,13 +47,13 @@ class RetailcrmCustomerConverter {
public function setAddress() { public function setAddress() {
if (!empty($this->address)) { if (!empty($this->address)) {
$this->data['address'] = [ $this->data['address'] = array(
'index' => $this->address['postcode'], 'index' => $this->address['postcode'],
'countryIso' => $this->address['iso_code_2'], 'countryIso' => $this->address['iso_code_2'],
'region' => $this->address['zone'], 'region' => $this->address['zone'],
'city' => $this->address['city'], 'city' => $this->address['city'],
'text' => $this->address['address_1'] . ' ' . $this->address['address_2'] 'text' => $this->address['address_1'] . ' ' . $this->address['address_2']
]; );
} }
return $this; return $this;

View file

@ -43,14 +43,12 @@ class RetailcrmOrderConverter {
$this->data['countryIso'] = $this->order_data['shipping_iso_code_2']; $this->data['countryIso'] = $this->order_data['shipping_iso_code_2'];
} }
if ($this->settingsManager->getSetting('order_number') == 1) { if ($this->settingsManager->getSetting('order_number')
&& $this->settingsManager->getSetting('order_number') == 1
) {
$this->data['number'] = $this->order_data['order_id']; $this->data['number'] = $this->order_data['order_id'];
} }
if ($this->settingsManager->getSetting('summ_around') == 1) {
$this->data['applyRound'] = true;
}
$this->data['externalId'] = $this->order_data['order_id']; $this->data['externalId'] = $this->order_data['order_id'];
$this->data['firstName'] = $this->order_data['shipping_firstname']; $this->data['firstName'] = $this->order_data['shipping_firstname'];
$this->data['lastName'] = $this->order_data['shipping_lastname']; $this->data['lastName'] = $this->order_data['shipping_lastname'];
@ -81,7 +79,6 @@ class RetailcrmOrderConverter {
$totalCoupon = $this->getTotal('coupon'); $totalCoupon = $this->getTotal('coupon');
$totalReward = $this->getTotal('reward'); $totalReward = $this->getTotal('reward');
$totalVoucher = $this->getTotal('voucher'); $totalVoucher = $this->getTotal('voucher');
$retailcrmDiscount = $this->getTotal(\retailcrm\Retailcrm::RETAILCRM_DISCOUNT);
if (!empty($totalCoupon)) { if (!empty($totalCoupon)) {
$discount += abs($totalCoupon); $discount += abs($totalCoupon);
@ -95,12 +92,10 @@ class RetailcrmOrderConverter {
$discount += abs($totalVoucher); $discount += abs($totalVoucher);
} }
if (!empty($retailcrmDiscount)) { if ($discount > 0) {
$discount += abs($retailcrmDiscount); $this->data['discountManualAmount'] = $discount;
} }
$this->data['discountManualAmount'] = $discount;
return $this; return $this;
} }
@ -111,15 +106,10 @@ class RetailcrmOrderConverter {
} }
$payment = array( $payment = array(
'externalId' => uniqid($this->order_data['order_id'] . "-"), 'externalId' => sprintf("opencart_%d", $this->order_data['order_id']),
'amount' => $this->getTotal('total') 'amount' => $this->getTotal('total')
); );
if ($this->settingsManager->getSetting('sum_payment') &&
$this->settingsManager->getSetting('sum_payment') == 1) {
unset($payment['amount']);
}
if (!empty($payment_type)) { if (!empty($payment_type)) {
$payment['type'] = $payment_type; $payment['type'] = $payment_type;
} }

View file

@ -14,7 +14,6 @@
<field id="cumulative_discount" group="customer">cumulativeDiscount</field> <field id="cumulative_discount" group="customer">cumulativeDiscount</field>
<field id="personal_discount" group="customer">personalDiscount</field> <field id="personal_discount" group="customer">personalDiscount</field>
<field id="discount_card_number" group="customer">discountCardNumber</field> <field id="discount_card_number" group="customer">discountCardNumber</field>
<field id="email_marketing_unsubscribed_at" group="customer">emailMarketingUnsubscribedAt</field>
<field id="address.index" group="customerAddress">index</field> <field id="address.index" group="customerAddress">index</field>
<field id="address.country" group="customerAddress">country</field> <field id="address.country" group="customerAddress">country</field>

View file

@ -10,21 +10,14 @@ use retailcrm\factory\OrderConverterFactory;
use retailcrm\factory\CustomerConverterFactory; use retailcrm\factory\CustomerConverterFactory;
use retailcrm\service\SettingsManager; use retailcrm\service\SettingsManager;
require_once DIR_SYSTEM . 'library/retailcrm/bootstrap.php'; require_once 'bootstrap.php';
class Retailcrm { class Retailcrm {
const RETAILCRM_DISCOUNT = 'retailcrm_discount';
const RETAILCRM_DISCOUNT_SORT_ORDER = 8;
const VERSION_MODULE = '4.1.19';
protected $registry; protected $registry;
/** @var bool */ /** @var bool */
public static $history_run = false; public static $history_run = false;
public function __construct(\Registry $registry) { public function __construct(\Registry $registry) {
$this->registry = $registry; $this->registry = $registry;
@ -151,8 +144,7 @@ class Retailcrm {
foreach($requiredOption['product_option_value'] as $optionValue) { foreach($requiredOption['product_option_value'] as $optionValue) {
$offers[$requiredOption['product_option_id'].':'.$requiredOption['option_id'].'-'.$optionValue['option_value_id']] = array( $offers[$requiredOption['product_option_id'].':'.$requiredOption['option_id'].'-'.$optionValue['option_value_id']] = array(
'price' => (float)$this->getOptionPrice($optionValue), 'price' => (float)$this->getOptionPrice($optionValue),
'qty' => $optionValue['quantity'], 'qty' => $optionValue['quantity']
'weight' => round($this->getWeightOption($optionValue), 3)
); );
} }
} else { } else {
@ -162,8 +154,7 @@ class Retailcrm {
$offers[$optionKey.'_'.$requiredOption['product_option_id'].':'.$requiredOption['option_id'].'-'.$optionValue['option_value_id']] = array( $offers[$optionKey.'_'.$requiredOption['product_option_id'].':'.$requiredOption['option_id'].'-'.$optionValue['option_value_id']] = array(
'price' => $optionAttr['price'] + (float)$this->getOptionPrice($optionValue), 'price' => $optionAttr['price'] + (float)$this->getOptionPrice($optionValue),
'qty' => ($optionAttr['qty'] > $optionValue['quantity']) ? 'qty' => ($optionAttr['qty'] > $optionValue['quantity']) ?
$optionValue['quantity'] : $optionAttr['qty'], $optionValue['quantity'] : $optionAttr['qty']
'weight' => round($optionAttr['weight'] + $this->getWeightOption($optionValue), 3)
); );
} }
} }
@ -176,8 +167,7 @@ class Retailcrm {
foreach($notRequiredOption['product_option_value'] as $optionValue) { foreach($notRequiredOption['product_option_value'] as $optionValue) {
$offers[$notRequiredOption['product_option_id'].':'.$notRequiredOption['option_id'].'-'.$optionValue['option_value_id']] = array( $offers[$notRequiredOption['product_option_id'].':'.$notRequiredOption['option_id'].'-'.$optionValue['option_value_id']] = array(
'price' => (float)$this->getOptionPrice($optionValue), 'price' => (float)$this->getOptionPrice($optionValue),
'qty' => $optionValue['quantity'], 'qty' => $optionValue['quantity']
'weight' => round($this->getWeightOption($optionValue), 3)
); );
} }
} else { } else {
@ -186,8 +176,7 @@ class Retailcrm {
$offers[$optionKey.'_'.$notRequiredOption['product_option_id'].':'.$notRequiredOption['option_id'].'-'.$optionValue['option_value_id']] = array( $offers[$optionKey.'_'.$notRequiredOption['product_option_id'].':'.$notRequiredOption['option_id'].'-'.$optionValue['option_value_id']] = array(
'price' => $optionAttr['price'] + (float)$this->getOptionPrice($optionValue), 'price' => $optionAttr['price'] + (float)$this->getOptionPrice($optionValue),
'qty' => ($optionAttr['qty'] > $optionValue['quantity']) ? 'qty' => ($optionAttr['qty'] > $optionValue['quantity']) ?
$optionValue['quantity'] : $optionAttr['qty'], $optionValue['quantity'] : $optionAttr['qty']
'weight' => round($optionAttr['weight'] + $this->getWeightOption($optionValue), 3)
); );
} }
} }
@ -201,19 +190,6 @@ class Retailcrm {
return $offers; return $offers;
} }
/**
* @param array $option
*
* @return float
*/
private function getWeightOption($option) {
if ($option['weight_prefix'] === '-') {
return $option['weight'] * -1;
}
return $option['weight'];
}
/** /**
* @param array $optionValue * @param array $optionValue
* @return float|int|mixed * @return float|int|mixed
@ -243,15 +219,6 @@ class Retailcrm {
return false; return false;
} }
public function useServicesForIcml()
{
$this->load->model('setting/setting');
$setting = $this->model_setting_setting->getSetting($this->getModuleTitle());
return $setting['module_retailcrm_icml_service_enabled'] ?? false;
}
/** /**
* @return mixed * @return mixed
*/ */

54
tests/2.3/TestCase.php Normal file
View file

@ -0,0 +1,54 @@
<?php
class TestCase extends OpenCartTest {
public function setUp() {
parent::setUp();
$this->load->library('retailcrm/retailcrm');
$this->setSetting(
$this->retailcrm->getModuleTitle(),
array(
$this->retailcrm->getModuleTitle() . '_apiversion' => 'v5',
$this->retailcrm->getModuleTitle() . '_order_number' => 1,
$this->retailcrm->getModuleTitle() . '_status' => array(
1 => 'new'
),
$this->retailcrm->getModuleTitle() . '_delivery' => array(
'flat.flat' => 'flat'
),
$this->retailcrm->getModuleTitle() . '_payment' => array(
'cod' => 'cod'
),
$this->retailcrm->getModuleTitle() . '_special_1' => 'special1',
$this->retailcrm->getModuleTitle() . '_special_2' => 'special2',
$this->retailcrm->getModuleTitle() . '_special_3' => 'special3',
$this->retailcrm->getModuleTitle() . '_collector' => array(
'site_key' => 'RC-XXXXXXXXXX-X',
'custom_form' => 1,
'custom' => array(
'name' => 'Name',
'email' => 'Email',
'phone' => 'Phone',
),
'form_capture' => 1,
'period' => 1
)
)
);
}
protected function setSetting($code, $data, $store_id = 0) {
$this->db->query("DELETE FROM `" . DB_PREFIX . "setting` WHERE store_id = '" . (int)$store_id . "' AND `code` = '" . $this->db->escape($code) . "'");
foreach ($data as $key => $value) {
if (substr($key, 0, strlen($code)) == $code) {
if (!is_array($value)) {
$this->db->query("INSERT INTO " . DB_PREFIX . "setting SET store_id = '" . (int)$store_id . "', `code` = '" . $this->db->escape($code) . "', `key` = '" . $this->db->escape($key) . "', `value` = '" . $this->db->escape($value) . "'");
} else {
$this->db->query("INSERT INTO " . DB_PREFIX . "setting SET store_id = '" . (int)$store_id . "', `code` = '" . $this->db->escape($code) . "', `key` = '" . $this->db->escape($key) . "', `value` = '" . $this->db->escape(json_encode($value, true)) . "', serialized = '1'");
}
}
}
}
}

View file

@ -7,16 +7,6 @@ class RoboFile extends \Robo\Tasks
use \Robo\Task\Development\loadTasks; use \Robo\Task\Development\loadTasks;
use \Robo\Common\TaskIO; use \Robo\Common\TaskIO;
const OPENCART_DOWNLOAD_URL = [
'3.0.1.2' => 'https://github.com/opencart/opencart/releases/download/3.0.1.2/3.0.1.2-opencart.zip',
'3.0.2.0' => 'https://github.com/opencart/opencart/releases/download/3.0.2.0/3.0.2.0-OpenCart.zip',
'3.0.3.4' => 'https://github.com/opencart/opencart/releases/download/3.0.3.4/opencart-3.0.3.4-core-pre.zip'
];
const OPENCART_ROOT_DIR = [
'3.0.3.4' => 'opencart-3.0.3.4/upload'
];
/** /**
* @var array * @var array
*/ */
@ -77,21 +67,19 @@ class RoboFile extends \Robo\Tasks
} }
} }
public function opencartInstall() public function opencartSetup()
{ {
$startUp = 'admin/controller/startup/test_startup.php'; $startUp = getenv('TEST_SUITE') === '2.3'
$startUpTo = 'admin/controller/startup/test_startup.php'; ? 'catalog/controller/startup/test_startup.php'
$version = getenv('OPENCART'); : 'admin/controller/startup/test_startup.php';
$ocZip = sprintf('/tmp/opencart-%s.zip', $version); $startUpTo = getenv('TEST_SUITE') === '2.3'
? 'catalog/controller/startup/test_startup.php'
: 'admin/controller/startup/test_startup.php';
$this->taskDeleteDir($this->root_dir . 'www')->run(); $this->taskDeleteDir($this->root_dir . 'www')->run();
file_put_contents($ocZip, file_get_contents($this->getOpencartDownloadUrl($version)));
$this->_exec(sprintf('unzip %s -d /tmp/opencart', $ocZip));
$this->taskFileSystemStack() $this->taskFileSystemStack()
->mirror( ->mirror(
$this->getOpencartRootDir($version), $this->root_dir . 'vendor/opencart/opencart/upload',
$this->root_dir . 'www' $this->root_dir . 'www'
) )
->copy( ->copy(
@ -105,31 +93,13 @@ class RoboFile extends \Robo\Tasks
->chmod($this->root_dir . 'www', 0777, 0000, true) ->chmod($this->root_dir . 'www', 0777, 0000, true)
->run(); ->run();
if (getenv('TEST_SUITE') === '3') { if (getenv('TEST_SUITE') === '3.0') {
$this->taskFileSystemStack()->copy( $this->taskFileSystemStack()->copy(
$this->root_dir . 'vendor/beyondit/opencart-test-suite/src/upload/system/library/session/test.php', $this->root_dir . 'vendor/beyondit/opencart-test-suite/src/upload/system/library/session/test.php',
$this->root_dir . 'www/system/library/session/test.php' $this->root_dir . 'www/system/library/session/test.php'
)->run(); )->run();
} }
// Openbay was removed in 3.0.3.6
// Unfortunately, those configs from test suite still require it.
if (
'3.0.3.4' === getenv('OPENCART') ||
version_compare(getenv('OPENCART'), '3.0.3.6', '>=')
) {
$testConfigFile = $this->root_dir . 'www/system/config/test-config.php';
$testStartupFile = $this->root_dir . 'www/' . $startUpTo;
$testConfig = file_get_contents($testConfigFile);
$testStartup = file_get_contents($testStartupFile);
$testConfig = str_ireplace("'openbay'", '', $testConfig);
$testStartup = str_ireplace('$this->registry->set(\'openbay\', new Openbay($this->registry));', '', $testStartup);
file_put_contents($testConfigFile, $testConfig);
file_put_contents($testStartupFile, $testStartup);
}
// Create new database, drop if exists already // Create new database, drop if exists already
try { try {
$conn = new PDO("mysql:host=".$this->opencart_config['db_hostname'], $this->opencart_config['db_username'], $this->opencart_config['db_password']); $conn = new PDO("mysql:host=".$this->opencart_config['db_hostname'], $this->opencart_config['db_username'], $this->opencart_config['db_password']);
@ -222,31 +192,13 @@ EOF;
$zip->close(); $zip->close();
} }
private function getOpencartDownloadUrl(string $version): string
{
if (version_compare($version, '3.0.1.1', '<=')) {
return sprintf('https://github.com/opencart/opencart/releases/download/%s/%s-compiled.zip', $version, $version);
}
if (array_key_exists($version, self::OPENCART_DOWNLOAD_URL)) {
return self::OPENCART_DOWNLOAD_URL[$version];
}
return sprintf('https://github.com/opencart/opencart/releases/download/%s/opencart-%s.zip', $version, $version);
}
private function getOpencartRootDir(string $version): string
{
if (array_key_exists($version, self::OPENCART_ROOT_DIR)) {
return '/tmp/opencart/' . self::OPENCART_ROOT_DIR[$version];
}
return '/tmp/opencart/upload';
}
private function restoreSampleData($conn) private function restoreSampleData($conn)
{ {
$sql = file_get_contents($this->root_dir . 'tests/opencart_sample_data_3.sql'); if (getenv('TEST_SUITE') === '2.3') {
$sql = file_get_contents($this->root_dir . 'tests/opencart_sample_data.sql');
} else {
$sql = file_get_contents($this->root_dir . 'tests/opencart_sample_data_3.sql');
}
$conn->exec("USE " . $this->opencart_config['db_database']); $conn->exec("USE " . $this->opencart_config['db_database']);

View file

@ -41,63 +41,4 @@ class ControllerRetailcrmAdminTest extends TestCase
$response = $this->dispatchAction('extension/module/retailcrm/uninstall_collector'); $response = $this->dispatchAction('extension/module/retailcrm/uninstall_collector');
$this->assertRegExp('/Connection settings/', $response->getOutput()); $this->assertRegExp('/Connection settings/', $response->getOutput());
} }
public function testGetAvailableTypes()
{
$data = $this->getDataForTestAvailableTypes();
$sites = end($data['site']);
$types = $data['types'];
$retailCrm = new ControllerExtensionModuleRetailcrm(self::$registry);
$class = new ReflectionClass($retailCrm);
$method = $class->getMethod('getAvailableTypes');
$method->setAccessible(true);
$result = $method->invokeArgs($retailCrm, [$sites, $types]);
$this->assertNotEmpty($result['opencart']);
$this->assertNotEmpty($result['retailcrm']);
$this->assertCount(2, $result['retailcrm']);
$this->assertNotEmpty($result['retailcrm']['test1']['code']);
$this->assertNotEmpty($result['retailcrm']['test4']['code']);
}
private function getDataForTestAvailableTypes(): array
{
return [
'site' => [
'opencart' => [
'code' => 'opencart',
'name' => 'OpenCart'
]
],
'types' => [
'opencart' => [
'test'
],
'retailcrm' => [
'test1' => [
'active' => true,
'sites' => [],
'code' => 'test1'
],
'test2' => [
'active' => false,
'sites' => [],
'code' => 'test2'
],
'test3' => [
'active' => true,
'sites' => ['otherSite'],
'code' => 'test3'
],
'test4' => [
'active' => true,
'sites' => ['cms1', 'cms2', 'opencart'],
'code' => 'test4'
]
]
]
];
}
} }

View file

@ -10,7 +10,12 @@ class ModelRetailcrmEventAdminTest extends TestCase
{ {
parent::setUp(); parent::setUp();
$eventModel = $this->loadModel('setting/event'); if (getenv('TEST_SUITE') === '3.0') {
$eventModel = $this->loadModel('setting/event');
} else {
$eventModel = $this->loadModel('extension/event');
}
$eventModel->addEvent(self::CODE, 'test', 'test'); $eventModel->addEvent(self::CODE, 'test', 'test');
} }

View file

@ -0,0 +1,58 @@
TRUNCATE TABLE `oc_customer`;
INSERT INTO `oc_customer` (`customer_id`, `customer_group_id`, `store_id`, `language_id`, `firstname`, `lastname`, `email`, `telephone`, `fax`, `password`, `salt`, `cart`, `wishlist`, `newsletter`, `address_id`, `custom_field`, `ip`, `status`, `approved`, `safe`, `token`, `code`, `date_added`) VALUES ('1', '1', '0', '1', 'Test', 'Test', 'test@mail.ru', '+7 (000) 000-00-00', '', 'ed3798da75d6cdd695e99e87a60d587a10aa95ff', '51TalnrgH', '', '', '0', '1', '', '172.21.0.1', '1', '1', '0', '', '', '2018-06-07 13:50:08');
TRUNCATE TABLE `oc_address`;
INSERT INTO `oc_address` (`address_id`, `customer_id`, `firstname`, `lastname`, `company`, `address_1`, `address_2`, `city`, `postcode`, `country_id`, `zone_id`, `custom_field`) values (1, 1, 'Test', 'Test', '', 'Address 1', '', 'City', '111111', '176', '99', '');
TRUNCATE TABLE `oc_customer_activity`;
TRUNCATE TABLE `oc_customer_group`;
INSERT INTO `oc_customer_group` (`customer_group_id`, `approval`, `sort_order`) VALUES ('1', '0', '1');
INSERT INTO `oc_customer_group` (`customer_group_id`, `approval`, `sort_order`) VALUES ('2', '0', '1');
INSERT INTO `oc_customer_group` (`customer_group_id`, `approval`, `sort_order`) VALUES ('3', '0', '0');
TRUNCATE TABLE `oc_customer_group_description`;
INSERT INTO `oc_customer_group_description` (`customer_group_id`, `language_id`, `name`, `description`) VALUES ('1', '1', 'Default', 'test');
INSERT INTO `oc_customer_group_description` (`customer_group_id`, `language_id`, `name`, `description`) VALUES ('2', '1', 'Test2', 'test2');
INSERT INTO `oc_customer_group_description` (`customer_group_id`, `language_id`, `name`, `description`) VALUES ('3', '1', 'test3', 'test3');
TRUNCATE TABLE `oc_customer_history`;
TRUNCATE TABLE `oc_customer_ip`;
INSERT INTO `oc_customer_ip` (`customer_ip_id`, `customer_id`, `ip`, `date_added`) VALUES ('4', '1', '172.21.0.1', '2018-06-07 13:50:29');
TRUNCATE TABLE `oc_customer_login`;
TRUNCATE TABLE `oc_customer_online`;
TRUNCATE TABLE `oc_customer_reward`;
TRUNCATE TABLE `oc_customer_search`;
TRUNCATE TABLE `oc_customer_transaction`;
TRUNCATE TABLE `oc_customer_wishlist`;
TRUNCATE TABLE `oc_order`;
INSERT INTO `oc_order` (`order_id`, `invoice_no`, `invoice_prefix`, `store_id`, `store_name`, `store_url`, `customer_id`, `customer_group_id`, `firstname`, `lastname`, `email`, `telephone`, `fax`, `custom_field`, `payment_firstname`, `payment_lastname`, `payment_company`, `payment_address_1`, `payment_address_2`, `payment_city`, `payment_postcode`, `payment_country`, `payment_country_id`, `payment_zone`, `payment_zone_id`, `payment_address_format`, `payment_custom_field`, `payment_method`, `payment_code`, `shipping_firstname`, `shipping_lastname`, `shipping_company`, `shipping_address_1`, `shipping_address_2`, `shipping_city`, `shipping_postcode`, `shipping_country`, `shipping_country_id`, `shipping_zone`, `shipping_zone_id`, `shipping_address_format`, `shipping_custom_field`, `shipping_method`, `shipping_code`, `comment`, `total`, `order_status_id`, `affiliate_id`, `commission`, `marketing_id`, `tracking`, `language_id`, `currency_id`, `currency_code`, `currency_value`, `ip`, `forwarded_ip`, `user_agent`, `accept_language`, `date_added`, `date_modified`) VALUES ('1', '0', 'INV-2016-00', '0', 'Opencart', 'http://localhost:8000/', '1', '1', 'Test', 'Test', 'test@mail.ru', '+7 (000) 000-00-00', '', '', 'Test', 'Test', '', 'Address', 'Address 2', 'Test', '111111', 'Russian Federation', '176', 'Rostov-na-Donu', '99', '', '[]', 'Cash on delivery', 'cod', 'Test', 'Test', '', 'Address', 'Address 2', 'Test', '111111', 'Russian Federation', '176', 'Rostov-na-Donu', '99', '', '[]', 'Flat Rate', 'flat.flat', 'test comment', '106.0000', '1', '0', '0.0000', '0', '', '1', '1', 'USD', '1.00000000', '172.21.0.1', '', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36', 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7', '2018-06-07 13:51:10', '2018-06-07 13:51:23');
INSERT INTO `oc_order` (`order_id`, `invoice_no`, `invoice_prefix`, `store_id`, `store_name`, `store_url`, `customer_id`, `customer_group_id`, `firstname`, `lastname`, `email`, `telephone`, `fax`, `custom_field`, `payment_firstname`, `payment_lastname`, `payment_company`, `payment_address_1`, `payment_address_2`, `payment_city`, `payment_postcode`, `payment_country`, `payment_country_id`, `payment_zone`, `payment_zone_id`, `payment_address_format`, `payment_custom_field`, `payment_method`, `payment_code`, `shipping_firstname`, `shipping_lastname`, `shipping_company`, `shipping_address_1`, `shipping_address_2`, `shipping_city`, `shipping_postcode`, `shipping_country`, `shipping_country_id`, `shipping_zone`, `shipping_zone_id`, `shipping_address_format`, `shipping_custom_field`, `shipping_method`, `shipping_code`, `comment`, `total`, `order_status_id`, `affiliate_id`, `commission`, `marketing_id`, `tracking`, `language_id`, `currency_id`, `currency_code`, `currency_value`, `ip`, `forwarded_ip`, `user_agent`, `accept_language`, `date_added`, `date_modified`) VALUES ('2', '0', 'INV-2016-00', '0', 'Opencart', 'http://localhost:8000/', '0', '1', 'Test', 'Test', 'test@mail.ru', '+7 (000) 000-00-00', '', '[]', 'Test', 'Test', '', 'Address', 'Address 2', 'Test', '111111', 'Russian Federation', '176', 'Rostov-na-Donu', '99', '', '[]', 'Cash on delivery', 'cod', 'Test', 'Test', '', 'Address', 'Address 2', 'Test', '111111', 'Russian Federation', '176', 'Rostov-na-Donu', '99', '', '[]', 'Flat Rate', 'flat.flat', 'test comment', '85.0000', '1', '0', '0.0000', '0', '', '1', '1', 'USD', '1.00000000', '172.21.0.1', '', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36', 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7', '2018-06-07 13:53:50', '2018-06-07 13:54:00');
TRUNCATE TABLE `oc_order_history`;
INSERT INTO `oc_order_history` (`order_history_id`, `order_id`, `order_status_id`, `notify`, `comment`, `date_added`) VALUES ('19', '2', '1', '0', '', '2018-06-07 13:54:00');
INSERT INTO `oc_order_history` (`order_history_id`, `order_id`, `order_status_id`, `notify`, `comment`, `date_added`) VALUES ('18', '1', '1', '0', '', '2018-06-07 13:51:23');
TRUNCATE TABLE `oc_order_option`;
INSERT INTO `oc_order_option` (`order_option_id`, `order_id`, `order_product_id`, `product_option_id`, `product_option_value_id`, `name`, `value`, `type`) VALUES ('15', '2', '55', '226', '15', 'Select', 'Red', 'select');
TRUNCATE TABLE `oc_order_product`;
INSERT INTO `oc_order_product` (`order_product_id`, `order_id`, `product_id`, `name`, `model`, `quantity`, `price`, `total`, `tax`, `reward`) VALUES ('54', '1', '40', 'iPhone', 'product 11', '1', '101.0000', '101.0000', '18.0000', '20');
INSERT INTO `oc_order_product` (`order_product_id`, `order_id`, `product_id`, `name`, `model`, `quantity`, `price`, `total`, `tax`, `reward`) VALUES ('55', '2', '30', 'Canon EOS 5D', 'Product 3', '1', '80.0000', '80.0000', '18.0000', '200');
TRUNCATE TABLE `oc_order_recurring`;
TRUNCATE TABLE `oc_order_recurring_transaction`;
TRUNCATE TABLE `oc_order_total`;
INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('162', '1', 'shipping', 'Flat Rate', '5.0000', '3');
INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('161', '1', 'sub_total', 'Sub-Total', '101.0000', '1');
INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('164', '2', 'sub_total', 'Sub-Total', '80.0000', '1');
INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('165', '2', 'shipping', 'Flat Rate', '5.0000', '3');
INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('163', '1', 'total', 'Total', '106.0000', '9');
INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('166', '2', 'total', 'Total', '85.0000', '9');
INSERT INTO `oc_product_special` (`product_id`, `customer_group_id`, `priority`, `price`,`date_start`, `date_end`) values ('42', '2', '1', '110.000', CURDATE(), ADDDATE(CURDATE(),INTERVAL 10 DAY));
INSERT INTO `oc_product_special` (`product_id`, `customer_group_id`, `priority`, `price`,`date_start`, `date_end`) values ('40', '1', '1', '50.000', CURDATE(), ADDDATE(CURDATE(),INTERVAL 10 DAY));
TRUNCATE TABLE `oc_order_voucher`;

View file

@ -3,7 +3,6 @@
require_once __DIR__ . '/../' . getenv('TEST_SUITE') . '/TestCase.php'; require_once __DIR__ . '/../' . getenv('TEST_SUITE') . '/TestCase.php';
class RetailcrmTest extends TestCase { class RetailcrmTest extends TestCase {
public function testGetOrderManager() { public function testGetOrderManager() {
$retailcrm = new retailcrm\Retailcrm(static::$registry); $retailcrm = new retailcrm\Retailcrm(static::$registry);
@ -16,26 +15,4 @@ class RetailcrmTest extends TestCase {
$this->assertInstanceOf(\retailcrm\service\OrderManager::class, $manager); $this->assertInstanceOf(\retailcrm\service\OrderManager::class, $manager);
} }
public function testGetWeightOption() {
$retailCrm = new \retailcrm\Retailcrm(self::$registry);
$reflection = new ReflectionClass($retailCrm);
$reflectionMethod = $reflection->getMethod('getWeightOption');
$reflectionMethod->setAccessible('true');
$result = $reflectionMethod->invokeArgs(
$retailCrm,
[['weight_prefix' => '+', 'weight' => 5]]
);
$this->assertEquals(5, $result);
$result = $reflectionMethod->invokeArgs(
$retailCrm,
[['weight_prefix' => '-', 'weight' => 5]]
);
$this->assertEquals(-5, $result);;
}
} }

View file

@ -19,8 +19,6 @@ class DataRepositoryAdminTest extends TestCase {
$this->assertNotEmpty($zone); $this->assertNotEmpty($zone);
$this->assertNotEmpty($zone['zone_id']); $this->assertNotEmpty($zone['zone_id']);
$repository->getZoneByName('Rostov-na-Do\'nu');
} }
public function testGetCurrencyByCode() { public function testGetCurrencyByCode() {

View file

@ -10,32 +10,11 @@ class OrderManagerTest extends TestCase {
public function testCreateOrderWithCustomer() { public function testCreateOrderWithCustomer() {
$proxy = $this->getMockBuilder(\RetailcrmProxy::class) $proxy = $this->getMockBuilder(\RetailcrmProxy::class)
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['ordersCreate','customersGet']) ->setMethods(['ordersCreate'])
->getMock(); ->getMock();
$proxy->expects($this->once())->method('ordersCreate'); $proxy->expects($this->once())->method('ordersCreate');
$proxy->expects($this->once())
->method('customersGet')
->willReturn(new \RetailcrmApiResponse(
200,
json_encode(
[
'success' => true,
'pagination' => [
'limit'=> 20,
'totalCount' => 0,
'currentPage' => 1,
'totalPageCount' => 0
],
'customer' => [
'id' => 1,
'externalId' => 1
]
]
)
));
$order_manager = $this->getOrderManager($proxy); $order_manager = $this->getOrderManager($proxy);
$orderCheckoutModel = $this->loadModel('checkout/order'); $orderCheckoutModel = $this->loadModel('checkout/order');

View file

@ -11,7 +11,7 @@ class RetailcrmCustomerConverterTest extends TestCase {
$customer_data = $model->getCustomer(1); $customer_data = $model->getCustomer(1);
$customer = $converter $customer = $converter
->initCustomerData($customer_data, [], true) ->initCustomerData($customer_data, array())
->setCustomerData() ->setCustomerData()
->getCustomer(); ->getCustomer();
@ -20,24 +20,23 @@ class RetailcrmCustomerConverterTest extends TestCase {
$this->assertEquals($customer_data['lastname'], $customer['lastName']); $this->assertEquals($customer_data['lastname'], $customer['lastName']);
$this->assertEquals($customer_data['email'], $customer['email']); $this->assertEquals($customer_data['email'], $customer['email']);
$this->assertEquals($customer_data['date_added'], $customer['createdAt']); $this->assertEquals($customer_data['date_added'], $customer['createdAt']);
$this->assertTrue($customer['subscribed']);
} }
public function testSetAddress() { public function testSetAddress() {
$converter = \retailcrm\factory\CustomerConverterFactory::create(static::$registry); $converter = \retailcrm\factory\CustomerConverterFactory::create(static::$registry);
$model = $this->loadModel('account/customer'); $model = $this->loadModel('account/customer');
$customer_data = $model->getCustomer(static::CUSTOMER_ID); $customer_data = $model->getCustomer(static::CUSTOMER_ID);
$address = [ $address = array(
'postcode' => '111111', 'postcode' => '111111',
'iso_code_2' => 'EN', 'iso_code_2' => 'EN',
'zone' => 'Zone', 'zone' => 'Zone',
'city' => 'City', 'city' => 'City',
'address_1' => 'Address', 'address_1' => 'Address',
'address_2' => '' 'address_2' => ''
]; );
$customer = $converter $customer = $converter
->initCustomerData($customer_data, $address, null) ->initCustomerData($customer_data, $address)
->setAddress() ->setAddress()
->getCustomer(); ->getCustomer();