parent
7ad9ae7886
commit
b5b6419ca4
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
/nbproject/private/
|
/nbproject/private/
|
||||||
|
/vendor/
|
||||||
|
36
.travis.yml
Normal file
36
.travis.yml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
language: php
|
||||||
|
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
php:
|
||||||
|
- 5.4
|
||||||
|
- 5.5
|
||||||
|
- 5.6
|
||||||
|
- 7.0
|
||||||
|
- 7.1
|
||||||
|
|
||||||
|
env:
|
||||||
|
- WP_VERSION=latest WP_MULTISITE=0
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
include:
|
||||||
|
- php: 5.3
|
||||||
|
dist: precise
|
||||||
|
- php: 7.2
|
||||||
|
env: WP_VERSION=latest WP_MULTISITE=0 RUN_PHPCS=1
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- bash tests/bin/install.sh wc_retailcrm_test root '' localhost $WP_VERSION
|
||||||
|
|
||||||
|
script:
|
||||||
|
- bash tests/bin/script.sh
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
skip_cleanup: true
|
||||||
|
provider: script
|
||||||
|
script: make
|
||||||
|
on:
|
||||||
|
php: 7.1
|
||||||
|
branch: master
|
||||||
|
condition: "$DEPLOY = true"
|
19
CHANGELOG.md
19
CHANGELOG.md
@ -1,27 +1,32 @@
|
|||||||
## 2018-03-22 v.2.1.4
|
## 2018-04-26 v3.0.0
|
||||||
|
* Добавлены тесты
|
||||||
|
* Произведен рефакторинг кода
|
||||||
|
* Добавлены хуки
|
||||||
|
|
||||||
|
## 2018-03-22 v2.1.4
|
||||||
* Исправлена ошибка при активированном модуле без настроек
|
* Исправлена ошибка при активированном модуле без настроек
|
||||||
* Добавлен фильтр при формировании массива заказа
|
* Добавлен фильтр при формировании массива заказа
|
||||||
* Исправлена генерация icml с неполной картинкой товара
|
* Исправлена генерация icml с неполной картинкой товара
|
||||||
|
|
||||||
## 2018-03-22 v.2.1.3
|
## 2018-03-22 v2.1.3
|
||||||
* Исправлена ошибка на php5.3
|
* Исправлена ошибка на php5.3
|
||||||
|
|
||||||
## 2018-03-21 v.2.1.2
|
## 2018-03-21 v2.1.2
|
||||||
* Добавлена локализация плагина
|
* Добавлена локализация плагина
|
||||||
* Добавлена интеграция с UA
|
* Добавлена интеграция с UA
|
||||||
|
|
||||||
## 2018-03-12 v.2.1.1
|
## 2018-03-12 v2.1.1
|
||||||
* Исправлена ошибка редактирования информации о клиенте
|
* Исправлена ошибка редактирования информации о клиенте
|
||||||
|
|
||||||
## 2018-02-26 v.2.1.0
|
## 2018-02-26 v2.1.0
|
||||||
* Переработана механика генерации icml каталога товаров
|
* Переработана механика генерации icml каталога товаров
|
||||||
* В icml каталог добавлена выгрузка налоговой ставки
|
* В icml каталог добавлена выгрузка налоговой ставки
|
||||||
* Исправлен пересчет итогов после изменения количества товара в RetailCRM
|
* Исправлен пересчет итогов после изменения количества товара в RetailCRM
|
||||||
|
|
||||||
## 2018-02-19 v.2.0.6
|
## 2018-02-19 v2.0.6
|
||||||
* Исправлено возникновение Warning на PHP 7.2 при генерации каталога товаров
|
* Исправлено возникновение Warning на PHP 7.2 при генерации каталога товаров
|
||||||
* Добавлена настройка выгрузки заказов из RetailCRM с определенными способами оформления
|
* Добавлена настройка выгрузки заказов из RetailCRM с определенными способами оформления
|
||||||
* Выгрузка изменений из RetailCRM осуществляется по sinceId
|
* Выгрузка изменений из RetailCRM осуществляется по sinceId
|
||||||
|
|
||||||
## 2018-02-02 v.2.0.5
|
## 2018-02-02 v2.0.5
|
||||||
* Исправлен неверный подсчет скидки на товары
|
* Исправлен неверный подсчет скидки на товары
|
19
Makefile
Normal file
19
Makefile
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
FILE = $(TRAVIS_BUILD_DIR)/VERSION
|
||||||
|
VERSION = `cat $(FILE)`
|
||||||
|
|
||||||
|
all: svn_clone prepare svn_commit remove_dir
|
||||||
|
|
||||||
|
svn_clone:
|
||||||
|
mkdir /tmp/svn_plugin_dir
|
||||||
|
svn co $(SVNREPOURL) /tmp/svn_plugin_dir --username $(USERNAME) --password $(PASSWORD) --no-auth-cache
|
||||||
|
|
||||||
|
prepare: /tmp/svn_plugin_dir
|
||||||
|
svn copy /tmp/svn_plugin_dir/trunk /tmp/svn_plugin_dir/tags/$(VERSION) --username $(USERNAME) --password $(PASSWORD) --no-auth-cache
|
||||||
|
rm -rf /tmp/svn_plugin_dir/trunk/*
|
||||||
|
cp -R $(TRAVIS_BUILD_DIR)/src/* /tmp/svn_plugin_dir/trunk
|
||||||
|
|
||||||
|
svn_commit: /tmp/svn_plugin_dir/tags
|
||||||
|
svn ci /tmp/svn_plugin_dir -m $(VERSION) --username $(USERNAME) --password $(PASSWORD) --no-auth-cache
|
||||||
|
|
||||||
|
remove_dir:
|
||||||
|
rm -rf /tmp/svn_plugin_dir
|
16
composer.json
Normal file
16
composer.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "retailcrm/woocommerce-retailcrm",
|
||||||
|
"description": "Integration plugin for WooCommerce & RetailCRM",
|
||||||
|
"type": "wordpress-plugin",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "RetailDriver LLC",
|
||||||
|
"email": "integration@retailcrm.ru"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"minimum-stability": "dev",
|
||||||
|
"require": {},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "6.*"
|
||||||
|
}
|
||||||
|
}
|
1481
composer.lock
generated
Normal file
1481
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
29
phpunit.xml.dist
Normal file
29
phpunit.xml.dist
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit
|
||||||
|
bootstrap="tests/phpunit/bootstrap.php"
|
||||||
|
backupGlobals="false"
|
||||||
|
colors="true"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
verbose="true"
|
||||||
|
processIsolation="false"
|
||||||
|
stopOnFailure="false"
|
||||||
|
syntaxCheck="true"
|
||||||
|
>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="Retailcrm WooCommerce Test Suite">
|
||||||
|
<directory suffix=".php">tests/phpunit</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
<filter>
|
||||||
|
<whitelist addUncoveredFilesFromWhitelist="true">
|
||||||
|
<directory suffix=".php">src/include</directory>
|
||||||
|
<exclude>
|
||||||
|
<directory suffix=".php">src/include/api</directory>
|
||||||
|
<file>src/retailcrm.php</file>
|
||||||
|
<file>src/uninstall.php</file>
|
||||||
|
</exclude>
|
||||||
|
</whitelist>
|
||||||
|
</filter>
|
||||||
|
</phpunit>
|
803
src/include/class-wc-retailcrm-base.php
Normal file
803
src/include/class-wc-retailcrm-base.php
Normal file
@ -0,0 +1,803 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* RetailCRM Integration.
|
||||||
|
*
|
||||||
|
* @package WC_Retailcrm_Base
|
||||||
|
* @category Integration
|
||||||
|
* @author RetailCRM
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!class_exists('WC_Retailcrm_Base')) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class WC_Retailcrm_Base
|
||||||
|
*/
|
||||||
|
class WC_Retailcrm_Base extends WC_Integration {
|
||||||
|
|
||||||
|
public static $option_key;
|
||||||
|
|
||||||
|
protected $api_url;
|
||||||
|
protected $api_key;
|
||||||
|
|
||||||
|
private $apiClient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init and hook in the integration.
|
||||||
|
* @param $retailcrm (default = false)
|
||||||
|
*/
|
||||||
|
public function __construct($retailcrm = false) {
|
||||||
|
//global $woocommerce;
|
||||||
|
|
||||||
|
if ( ! class_exists( 'WC_Retailcrm_Proxy' ) ) {
|
||||||
|
include_once( __DIR__ . '/api/class-wc-retailcrm-proxy.php' );
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->id = 'integration-retailcrm';
|
||||||
|
$this->method_title = __('RetailCRM', 'retailcrm');
|
||||||
|
$this->method_description = __('Integration with eComlogic managament system.', 'retailcrm');
|
||||||
|
|
||||||
|
if ($retailcrm === false) {
|
||||||
|
$this->apiClient = $this->getApiClient();
|
||||||
|
} else {
|
||||||
|
$this->apiClient = $retailcrm;
|
||||||
|
}
|
||||||
|
|
||||||
|
self::$option_key = $this->get_option_key();
|
||||||
|
// Load the settings.
|
||||||
|
$this->init_form_fields();
|
||||||
|
$this->init_settings();
|
||||||
|
|
||||||
|
// Actions.
|
||||||
|
add_action('woocommerce_update_options_integration_' . $this->id, array($this, 'process_admin_options'));
|
||||||
|
|
||||||
|
add_filter('cron_schedules', array($this, 'filter_cron_schedules'), 10, 1);
|
||||||
|
add_action('woocommerce_checkout_order_processed', array($this, 'retailcrm_process_order'), 10, 1);
|
||||||
|
add_action('retailcrm_history', array($this, 'retailcrm_history_get'));
|
||||||
|
add_action('retailcrm_icml', array($this, 'generate_icml'));
|
||||||
|
add_action('retailcrm_inventories', array($this, 'load_stocks'));
|
||||||
|
add_action('init', array($this, 'register_load_inventories'));
|
||||||
|
add_action('init', array($this, 'register_icml_generation'));
|
||||||
|
add_action('init', array($this, 'register_retailcrm_history'));
|
||||||
|
add_action('wp_ajax_do_upload', array($this, 'upload_to_crm'));
|
||||||
|
add_action('wp_ajax_generate_icml', array($this, 'generate_icml'));
|
||||||
|
add_action('admin_print_footer_scripts', array($this, 'ajax_upload'), 99);
|
||||||
|
add_action('admin_print_footer_scripts', array($this, 'ajax_generate_icml'), 99);
|
||||||
|
add_action('woocommerce_created_customer', array($this, 'create_customer'), 10, 1);
|
||||||
|
add_action('woocommerce_update_customer', array($this, 'update_customer'), 10, 1);
|
||||||
|
add_action('woocommerce_update_order', array($this, 'update_order'), 11, 1);
|
||||||
|
add_action('wp_print_scripts', array($this, 'initialize_analytics'), 98);
|
||||||
|
add_action('wp_print_footer_scripts', array($this, 'send_analytics'), 99);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check custom file
|
||||||
|
*
|
||||||
|
* @param string $file
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function checkCustomFile($file) {
|
||||||
|
if (file_exists( WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-' . $file . '.php' )) {
|
||||||
|
return WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-' . $file . '.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'class-wc-retailcrm-' . $file . '.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function filter_cron_schedules($schedules) {
|
||||||
|
return array_merge(
|
||||||
|
$schedules,
|
||||||
|
array(
|
||||||
|
'five_minutes' => array(
|
||||||
|
'interval' => 300, // seconds
|
||||||
|
'display' => __('Every 5 minutes')
|
||||||
|
),
|
||||||
|
'three_hours' => array(
|
||||||
|
'interval' => 10800, // seconds
|
||||||
|
'display' => __('Every 3 hours')
|
||||||
|
),
|
||||||
|
'fiveteen_minutes' => array(
|
||||||
|
'interval' => 900, // seconds
|
||||||
|
'display' => __('Every 15 minutes')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generate_icml() {
|
||||||
|
if (!class_exists('WC_Retailcrm_Icml')) {
|
||||||
|
require_once (self::checkCustomFile('icml'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$retailcrm_icml = new WC_Retailcrm_Icml();
|
||||||
|
$retailcrm_icml->generate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get history
|
||||||
|
*/
|
||||||
|
public function retailcrm_history_get() {
|
||||||
|
if (!class_exists('WC_Retailcrm_History')) {
|
||||||
|
include_once(self::checkCustomFile('history'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$retailcrm_history = new WC_Retailcrm_History($this->apiClient);
|
||||||
|
$retailcrm_history->getHistory();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $order_id
|
||||||
|
*/
|
||||||
|
public function retailcrm_process_order($order_id) {
|
||||||
|
if (!class_exists('WC_Retailcrm_Orders')) {
|
||||||
|
include_once(self::checkCustomFile('orders'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$retailcm_order = new WC_Retailcrm_Orders($this->apiClient);
|
||||||
|
$retailcm_order->orderCreate($order_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load stock from retailCRM
|
||||||
|
*/
|
||||||
|
public function load_stocks() {
|
||||||
|
if (!class_exists('WC_Retailcrm_Inventories')) {
|
||||||
|
include_once(self::checkCustomFile('inventories'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$inventories = new WC_Retailcrm_Inventories($this->apiClient);
|
||||||
|
$inventories->updateQuantity();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register_load_inventories() {
|
||||||
|
if ( !wp_next_scheduled( 'retailcrm_inventories' ) ) {
|
||||||
|
// Schedule the event
|
||||||
|
wp_schedule_event( time(), 'fiveteen_minutes', 'retailcrm_inventories' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register_icml_generation() {
|
||||||
|
// Make sure this event hasn't been scheduled
|
||||||
|
if ( !wp_next_scheduled( 'retailcrm_icml' ) ) {
|
||||||
|
// Schedule the event
|
||||||
|
wp_schedule_event( time(), 'three_hours', 'retailcrm_icml' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register_retailcrm_history() {
|
||||||
|
// Make sure this event hasn't been scheduled
|
||||||
|
if ( !wp_next_scheduled( 'retailcrm_history' ) ) {
|
||||||
|
// Schedule the event
|
||||||
|
wp_schedule_event( time(), 'five_minutes', 'retailcrm_history' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upload archive customers and order to retailCRM
|
||||||
|
*/
|
||||||
|
public function upload_to_crm() {
|
||||||
|
if (!class_exists('WC_Retailcrm_Orders')) {
|
||||||
|
include_once(self::checkCustomFile('orders'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!class_exists('WC_Retailcrm_Customers')) {
|
||||||
|
include_once(self::checkCustomFile('customers'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$options = array_filter(get_option(self::$option_key));
|
||||||
|
|
||||||
|
$retailcrm_customers = new WC_Retailcrm_Customers($this->apiClient);
|
||||||
|
$retailcrm_orders = new WC_Retailcrm_Orders($this->apiClient);
|
||||||
|
|
||||||
|
$retailcrm_customers->customersUpload();
|
||||||
|
$retailcrm_orders->ordersUpload();
|
||||||
|
|
||||||
|
$options['uploads'] = 'yes';
|
||||||
|
update_option('woocommerce_integration-retailcrm_settings', $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function ajax_upload() {
|
||||||
|
$ajax_url = admin_url('admin-ajax.php');
|
||||||
|
?>
|
||||||
|
<script type="text/javascript" >
|
||||||
|
jQuery('#uploads-retailcrm').bind('click', function() {
|
||||||
|
jQuery.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: '<?php echo $ajax_url; ?>?action=do_upload',
|
||||||
|
success: function (response) {
|
||||||
|
alert('<?php echo __('Customers and orders were unloaded', 'retailcrm'); ?>');
|
||||||
|
console.log('AJAX response : ',response);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
|
||||||
|
public function ajax_generate_icml() {
|
||||||
|
$ajax_url = admin_url('admin-ajax.php');
|
||||||
|
?>
|
||||||
|
<script type="text/javascript" >
|
||||||
|
jQuery('#icml-retailcrm').bind('click', function() {
|
||||||
|
jQuery.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: '<?php echo $ajax_url; ?>?action=generate_icml',
|
||||||
|
success: function (response) {
|
||||||
|
alert('<?php echo __('Catalog were generated', 'retailcrm'); ?>');
|
||||||
|
console.log('AJAX response : ', response);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create customer in retailCRM
|
||||||
|
* @param int $customer_id
|
||||||
|
*/
|
||||||
|
public function create_customer($customer_id) {
|
||||||
|
if (!class_exists( 'WC_Retailcrm_Customers')) {
|
||||||
|
include_once(self::checkCustomFile('customers'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$retailcrm_customer = new WC_Retailcrm_Customers($this->apiClient);
|
||||||
|
$retailcrm_customer->createCustomer($customer_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Edit customer in retailCRM
|
||||||
|
* @param int $customer_id
|
||||||
|
*/
|
||||||
|
public function update_customer($customer_id) {
|
||||||
|
if (!class_exists('WC_Retailcrm_Customers')) {
|
||||||
|
include_once(self::checkCustomFile('customers'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$retailcrm_customer = new WC_Retailcrm_Customers($this->apiClient);
|
||||||
|
$retailcrm_customer->updateCustomer($customer_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Edit order in retailCRM
|
||||||
|
* @param int $order_id
|
||||||
|
*/
|
||||||
|
public function update_order($order_id) {
|
||||||
|
if (!class_exists('WC_Retailcrm_Orders')) {
|
||||||
|
include_once(self::checkCustomFile('orders'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$retailcrm_order = new WC_Retailcrm_Orders($this->apiClient);
|
||||||
|
$retailcrm_order->updateOrder($order_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init google analytics code
|
||||||
|
*/
|
||||||
|
public function initialize_analytics() {
|
||||||
|
if (!class_exists('WC_Retailcrm_Google_Analytics')) {
|
||||||
|
include_once(self::checkCustomFile('ga'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->get_option('ua') && $this->get_option('ua_code')) {
|
||||||
|
$retailcrm_analytics = WC_Retailcrm_Google_Analytics::getInstance($this->settings);
|
||||||
|
echo $retailcrm_analytics->initialize_analytics();
|
||||||
|
} else {
|
||||||
|
echo '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Google analytics send code
|
||||||
|
*/
|
||||||
|
public function send_analytics() {
|
||||||
|
if (!class_exists('WC_Retailcrm_Google_Analytics')) {
|
||||||
|
include_once(self::checkCustomFile('ga'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->get_option('ua') && $this->get_option('ua_code')) {
|
||||||
|
$retailcrm_analytics = WC_Retailcrm_Google_Analytics::getInstance($this->settings);
|
||||||
|
echo $retailcrm_analytics->send_analytics();
|
||||||
|
} else {
|
||||||
|
echo '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize integration settings form fields.
|
||||||
|
*/
|
||||||
|
public function init_form_fields() {
|
||||||
|
|
||||||
|
$this->form_fields = array(
|
||||||
|
array( 'title' => __( 'General Options', 'retailcrm' ), 'type' => 'title', 'desc' => '', 'id' => 'general_options' ),
|
||||||
|
|
||||||
|
'api_url' => array(
|
||||||
|
'title' => __( 'API URL', 'retailcrm' ),
|
||||||
|
'type' => 'text',
|
||||||
|
'description' => __( 'Enter with your API URL (https://yourdomain.ecomlogic.com).', 'retailcrm' ),
|
||||||
|
'desc_tip' => true,
|
||||||
|
'default' => ''
|
||||||
|
),
|
||||||
|
'api_key' => array(
|
||||||
|
'title' => __( 'API Key', 'retailcrm' ),
|
||||||
|
'type' => 'text',
|
||||||
|
'description' => __( 'Enter with your API Key. You can find this in eComlogic admin interface.', 'retailcrm' ),
|
||||||
|
'desc_tip' => true,
|
||||||
|
'default' => ''
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$api_version_list = array(
|
||||||
|
'v4' => 'v4',
|
||||||
|
'v5' => 'v5'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __( 'API settings', 'retailcrm' ),
|
||||||
|
'type' => 'title',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'api_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields['api_version'] = array(
|
||||||
|
'title' => __( 'API version', 'retailcrm' ),
|
||||||
|
'description' => __( 'Select the API version you want to use', 'retailcrm' ),
|
||||||
|
'css' => 'min-width:50px;',
|
||||||
|
'class' => 'select',
|
||||||
|
'type' => 'select',
|
||||||
|
'options' => $api_version_list,
|
||||||
|
'desc_tip' => true,
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __( 'Catalog settings', 'retailcrm' ),
|
||||||
|
'type' => 'title',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'catalog_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach (get_post_statuses() as $status_key => $status_value) {
|
||||||
|
$this->form_fields['p_' . $status_key] = array(
|
||||||
|
'title' => $status_value,
|
||||||
|
'label' => ' ',
|
||||||
|
'description' => '',
|
||||||
|
'class' => 'checkbox',
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'desc_tip' => true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->apiClient) {
|
||||||
|
if (isset($_GET['page']) && $_GET['page'] == 'wc-settings'
|
||||||
|
&& isset($_GET['tab']) && $_GET['tab'] == 'integration'
|
||||||
|
) {
|
||||||
|
add_action('admin_print_footer_scripts', array($this, 'show_blocks'), 99);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Order methods options
|
||||||
|
*/
|
||||||
|
$order_methods_option = array();
|
||||||
|
$order_methods_list = $this->apiClient->orderMethodsList();
|
||||||
|
|
||||||
|
if ($order_methods_list->isSuccessful()) {
|
||||||
|
foreach ($order_methods_list['orderMethods'] as $order_method) {
|
||||||
|
if ($order_method['active'] == false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$order_methods_option[$order_method['code']] = $order_method['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __('Order methods', 'retailcrm'),
|
||||||
|
'type' => 'heading',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'order_methods_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields['order_methods'] = array(
|
||||||
|
'label' => ' ',
|
||||||
|
'title' => __('Ordering methods available for downloading from eComlogic', 'retailcrm'),
|
||||||
|
'class' => '',
|
||||||
|
'type' => 'multiselect',
|
||||||
|
'description' => __('Select the order methods that will be uploaded from eComlogic to site', 'retailcrm'),
|
||||||
|
'options' => $order_methods_option,
|
||||||
|
'select_buttons' => true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shipping options
|
||||||
|
*/
|
||||||
|
$shipping_option_list = array();
|
||||||
|
$retailcrm_shipping_list = $this->apiClient->deliveryTypesList();
|
||||||
|
|
||||||
|
if ($retailcrm_shipping_list->isSuccessful()) {
|
||||||
|
foreach ($retailcrm_shipping_list['deliveryTypes'] as $retailcrm_shipping_type) {
|
||||||
|
$shipping_option_list[$retailcrm_shipping_type['code']] = $retailcrm_shipping_type['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$wc_shipping_list = get_wc_shipping_methods();
|
||||||
|
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __('Shipping methods', 'retailcrm'),
|
||||||
|
'type' => 'heading',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'shipping_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($wc_shipping_list as $shipping_code => $shipping) {
|
||||||
|
if (isset($shipping['enabled']) && $shipping['enabled'] == 'yes') {
|
||||||
|
$this->form_fields[$shipping_code] = array(
|
||||||
|
'title' => __($shipping['title'], 'woocommerce'),
|
||||||
|
'description' => __($shipping['description'], 'woocommerce'),
|
||||||
|
'css' => 'min-width:350px;',
|
||||||
|
'class' => 'select',
|
||||||
|
'type' => 'select',
|
||||||
|
'options' => $shipping_option_list,
|
||||||
|
'desc_tip' => true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Payment options
|
||||||
|
*/
|
||||||
|
$payment_option_list = array();
|
||||||
|
$retailcrm_payment_list = $this->apiClient->paymentTypesList();
|
||||||
|
|
||||||
|
if ($retailcrm_payment_list->isSuccessful()) {
|
||||||
|
foreach ($retailcrm_payment_list['paymentTypes'] as $retailcrm_payment_type) {
|
||||||
|
$payment_option_list[$retailcrm_payment_type['code']] = $retailcrm_payment_type['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$wc_payment = WC_Payment_Gateways::instance();
|
||||||
|
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __('Payment methods', 'retailcrm'),
|
||||||
|
'type' => 'heading',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'payment_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($wc_payment->get_available_payment_gateways() as $payment) {
|
||||||
|
if (isset($payment->enabled) && $payment->enabled == 'yes') {
|
||||||
|
$this->form_fields[$payment->id] = array(
|
||||||
|
'title' => __($payment->method_title, 'woocommerce'),
|
||||||
|
'description' => __($payment->method_description, 'woocommerce'),
|
||||||
|
'css' => 'min-width:350px;',
|
||||||
|
'class' => 'select',
|
||||||
|
'type' => 'select',
|
||||||
|
'options' => $payment_option_list,
|
||||||
|
'desc_tip' => true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Statuses options
|
||||||
|
*/
|
||||||
|
$statuses_option_list = array();
|
||||||
|
$retailcrm_statuses_list = $this->apiClient->statusesList();
|
||||||
|
|
||||||
|
if ($retailcrm_statuses_list->isSuccessful()) {
|
||||||
|
foreach ($retailcrm_statuses_list['statuses'] as $retailcrm_status) {
|
||||||
|
$statuses_option_list[$retailcrm_status['code']] = $retailcrm_status['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$wc_statuses = wc_get_order_statuses();
|
||||||
|
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __('Statuses', 'retailcrm'),
|
||||||
|
'type' => 'heading',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'statuses_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($wc_statuses as $idx => $name) {
|
||||||
|
$uid = str_replace('wc-', '', $idx);
|
||||||
|
$this->form_fields[$uid] = array(
|
||||||
|
'title' => __($name, 'woocommerce'),
|
||||||
|
'css' => 'min-width:350px;',
|
||||||
|
'class' => 'select',
|
||||||
|
'type' => 'select',
|
||||||
|
'options' => $statuses_option_list,
|
||||||
|
'desc_tip' => true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inventories options
|
||||||
|
*/
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __('Inventories settings', 'retailcrm'),
|
||||||
|
'type' => 'heading',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'invent_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields['sync'] = array(
|
||||||
|
'label' => __('Sync inventories', 'retailcrm'),
|
||||||
|
'title' => __('Inventories', 'retailcrm'),
|
||||||
|
'class' => 'checkbox',
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'description' => __('Check this checkbox if you want to unload the rest of the products from CRM to site.', 'retailcrm')
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UA options
|
||||||
|
*/
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __('UA settings', 'retailcrm'),
|
||||||
|
'type' => 'heading',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'invent_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields['ua'] = array(
|
||||||
|
'label' => __('Activate UA', 'retailcrm'),
|
||||||
|
'title' => __('UA', 'retailcrm'),
|
||||||
|
'class' => 'checkbox',
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'description' => __('Check this checkbox if you want to unload information to UA.', 'retailcrm')
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields['ua_code'] = array(
|
||||||
|
'title' => __('UA code', 'retailcrm'),
|
||||||
|
'class' => 'input',
|
||||||
|
'type' => 'input'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields['ua_custom'] = array(
|
||||||
|
'title' => __('Custom parameter', 'retailcrm'),
|
||||||
|
'class' => 'input',
|
||||||
|
'type' => 'input'
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uploads options
|
||||||
|
*/
|
||||||
|
$options = array_filter(get_option(self::$option_key));
|
||||||
|
|
||||||
|
if (!isset($options['uploads'])) {
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __('Uploads settings', 'retailcrm'),
|
||||||
|
'type' => 'heading',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'upload_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields['upload-button'] = array(
|
||||||
|
'label' => __('Upload', 'retailcrm'),
|
||||||
|
'title' => __('Upload all customers and orders', 'retailcrm' ),
|
||||||
|
'type' => 'button',
|
||||||
|
'description' => __('Batch unloading of existing customers and orders.', 'retailcrm' ),
|
||||||
|
'desc_tip' => true,
|
||||||
|
'id' => 'uploads-retailcrm'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate icml file
|
||||||
|
*/
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'title' => __( 'Generate ICML catalog', 'retailcrm' ),
|
||||||
|
'type' => 'title',
|
||||||
|
'description' => '',
|
||||||
|
'id' => 'icml_options'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->form_fields[] = array(
|
||||||
|
'label' => __('Generate', 'retailcrm'),
|
||||||
|
'title' => __('Generate ICML', 'retailcrm'),
|
||||||
|
'type' => 'button',
|
||||||
|
'description' => __('This functionality allows you to generate a catalog of products for downloading to CRM.', 'retailcrm'),
|
||||||
|
'desc_tip' => true,
|
||||||
|
'id' => 'icml-retailcrm'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate html button
|
||||||
|
*
|
||||||
|
* @param string $key
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function generate_button_html( $key, $data ) {
|
||||||
|
$field = $this->plugin_id . $this->id . '_' . $key;
|
||||||
|
$defaults = array(
|
||||||
|
'class' => 'button-secondary',
|
||||||
|
'css' => '',
|
||||||
|
'custom_attributes' => array(),
|
||||||
|
'desc_tip' => false,
|
||||||
|
'description' => '',
|
||||||
|
'title' => '',
|
||||||
|
);
|
||||||
|
|
||||||
|
$data = wp_parse_args( $data, $defaults );
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
?>
|
||||||
|
<tr valign="top">
|
||||||
|
<th scope="row" class="titledesc">
|
||||||
|
<label for="<?php echo esc_attr( $field ); ?>"><?php echo wp_kses_post( $data['title'] ); ?></label>
|
||||||
|
<?php echo $this->get_tooltip_html( $data ); ?>
|
||||||
|
</th>
|
||||||
|
<td class="forminp">
|
||||||
|
<fieldset>
|
||||||
|
<legend class="screen-reader-text"><span><?php echo wp_kses_post( $data['label'] ); ?></span></legend>
|
||||||
|
<button id="<?php echo $data['id']; ?>" class="<?php echo esc_attr( $data['class'] ); ?>" type="button" name="<?php echo esc_attr( $field ); ?>" id="<?php echo esc_attr( $field ); ?>" style="<?php echo esc_attr( $data['css'] ); ?>" <?php echo $this->get_custom_attribute_html( $data ); ?>><?php echo wp_kses_post( $data['label'] ); ?></button>
|
||||||
|
<?php echo $this->get_description_html( $data ); ?>
|
||||||
|
</fieldset>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
return ob_get_clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate html title block settings
|
||||||
|
*
|
||||||
|
* @param string $key
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function generate_heading_html($key, $data) {
|
||||||
|
$field_key = $this->get_field_key( $key );
|
||||||
|
$defaults = array(
|
||||||
|
'title' => '',
|
||||||
|
'class' => '',
|
||||||
|
);
|
||||||
|
|
||||||
|
$data = wp_parse_args( $data, $defaults );
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
?>
|
||||||
|
</table>
|
||||||
|
<h2 class="wc-settings-sub-title retailcrm_hidden <?php echo esc_attr( $data['class'] ); ?>" id="<?php echo esc_attr( $field_key ); ?>"><?php echo wp_kses_post( $data['title'] ); ?> <span style="opacity:0.5;float: right;">⬇</span></h2>
|
||||||
|
<?php if ( ! empty( $data['description'] ) ) : ?>
|
||||||
|
<p><?php echo wp_kses_post( $data['description'] ); ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<table class="form-table" style="display: none;">
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return ob_get_clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate API version
|
||||||
|
*
|
||||||
|
* @param string $key
|
||||||
|
* @param string $value
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function validate_api_version_field($key, $value) {
|
||||||
|
$post = $this->get_post_data();
|
||||||
|
|
||||||
|
$versionMap = array(
|
||||||
|
'v4' => '4.0',
|
||||||
|
'v5' => '5.0'
|
||||||
|
);
|
||||||
|
|
||||||
|
$api = new WC_Retailcrm_Proxy(
|
||||||
|
$post[$this->plugin_id . $this->id . '_api_url'],
|
||||||
|
$post[$this->plugin_id . $this->id . '_api_key']
|
||||||
|
);
|
||||||
|
|
||||||
|
$response = $api->apiVersions();
|
||||||
|
|
||||||
|
if ($response && $response->isSuccessful()) {
|
||||||
|
if (!in_array($versionMap[$value], $response['versions'])) {
|
||||||
|
WC_Admin_Settings::add_error( esc_html__( 'The selected version of the API is unavailable', 'retailcrm' ) );
|
||||||
|
$value = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate API url
|
||||||
|
*
|
||||||
|
* @param string $key
|
||||||
|
* @param string $value
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function validate_api_url_field($key, $value) {
|
||||||
|
$post = $this->get_post_data();
|
||||||
|
$api = new WC_Retailcrm_Proxy(
|
||||||
|
$value,
|
||||||
|
$post[$this->plugin_id . $this->id . '_api_key']
|
||||||
|
);
|
||||||
|
|
||||||
|
$response = $api->apiVersions();
|
||||||
|
|
||||||
|
if ($response == null) {
|
||||||
|
WC_Admin_Settings::add_error(esc_html__( 'Enter the correct CRM address', 'retailcrm'));
|
||||||
|
$value = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate API key
|
||||||
|
*
|
||||||
|
* @param string $key
|
||||||
|
* @param string $value
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function validate_api_key_field( $key, $value ) {
|
||||||
|
$post = $this->get_post_data();
|
||||||
|
$api = new WC_Retailcrm_Proxy(
|
||||||
|
$post[$this->plugin_id . $this->id . '_api_url'],
|
||||||
|
$value
|
||||||
|
);
|
||||||
|
|
||||||
|
$response = $api->apiVersions();
|
||||||
|
|
||||||
|
if (!is_object($response)) {
|
||||||
|
$value = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$response->isSuccessful()) {
|
||||||
|
WC_Admin_Settings::add_error( esc_html__( 'Enter the correct API key', 'retailcrm' ) );
|
||||||
|
$value = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scritp show|hide block settings
|
||||||
|
*/
|
||||||
|
function show_blocks() {
|
||||||
|
?>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery('h2.retailcrm_hidden').hover().css({
|
||||||
|
'cursor':'pointer',
|
||||||
|
'width':'300px'
|
||||||
|
});
|
||||||
|
jQuery('h2.retailcrm_hidden').toggle(
|
||||||
|
function() {
|
||||||
|
jQuery(this).next('table.form-table').show(100);
|
||||||
|
jQuery(this).find('span').html('⬆');
|
||||||
|
},
|
||||||
|
function() {
|
||||||
|
jQuery(this).next('table.form-table').hide(100);
|
||||||
|
jQuery(this).find('span').html('⬇');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get retailcrm api client
|
||||||
|
*
|
||||||
|
* @return bool|WC_Retailcrm_Proxy
|
||||||
|
*/
|
||||||
|
public function getApiClient() {
|
||||||
|
if ($this->get_option('api_url') && $this->get_option('api_key')) {
|
||||||
|
return new WC_Retailcrm_Proxy(
|
||||||
|
$this->get_option('api_url'),
|
||||||
|
$this->get_option('api_key'),
|
||||||
|
$this->get_option('api_version')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
168
src/include/class-wc-retailcrm-customers.php
Normal file
168
src/include/class-wc-retailcrm-customers.php
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* RetailCRM Integration.
|
||||||
|
*
|
||||||
|
* @package WC_Retailcrm_Customers
|
||||||
|
* @category Integration
|
||||||
|
* @author RetailCRM
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!class_exists('WC_Retailcrm_Customers')) :
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class WC_Retailcrm_Customers
|
||||||
|
*/
|
||||||
|
class WC_Retailcrm_Customers {
|
||||||
|
|
||||||
|
const CUSTOMER_ROLE = 'customer';
|
||||||
|
|
||||||
|
protected $retailcrm;
|
||||||
|
protected $retailcrm_settings;
|
||||||
|
|
||||||
|
private $customer = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WC_Retailcrm_Customers constructor.
|
||||||
|
*
|
||||||
|
* @param $retailcrm
|
||||||
|
*/
|
||||||
|
public function __construct($retailcrm = false)
|
||||||
|
{
|
||||||
|
$this->retailcrm_settings = get_option(WC_Retailcrm_Base::$option_key);
|
||||||
|
$this->retailcrm = $retailcrm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upload customers to CRM
|
||||||
|
*
|
||||||
|
* @return array $data
|
||||||
|
*/
|
||||||
|
public function customersUpload()
|
||||||
|
{
|
||||||
|
if (!$this->retailcrm) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$users = get_users();
|
||||||
|
$data_customers = array();
|
||||||
|
|
||||||
|
foreach ($users as $user) {
|
||||||
|
if (!\in_array(self::CUSTOMER_ROLE, $user->roles)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$customer = $this->wcCustomerGet($user->ID);
|
||||||
|
$this->processCustomer($customer);
|
||||||
|
$data_customers[] = $this->customer;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = \array_chunk($data_customers, 50);
|
||||||
|
|
||||||
|
foreach ($data as $array_customers) {
|
||||||
|
$this->retailcrm->customersUpload($array_customers);
|
||||||
|
time_nanosleep(0, 250000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create customer in CRM
|
||||||
|
*
|
||||||
|
* @param int $customer_id
|
||||||
|
*
|
||||||
|
* @return WC_Customer $customer
|
||||||
|
*/
|
||||||
|
public function createCustomer($customer_id)
|
||||||
|
{
|
||||||
|
if (!$this->retailcrm) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$customer = $this->wcCustomerGet($customer_id);
|
||||||
|
|
||||||
|
if ($customer->get_role() == self::CUSTOMER_ROLE) {
|
||||||
|
$this->processCustomer($customer);
|
||||||
|
$this->retailcrm->customersCreate($this->customer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $customer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Edit customer in CRM
|
||||||
|
*
|
||||||
|
* @param int $customer_id
|
||||||
|
*
|
||||||
|
* @return WC_Customer $customer
|
||||||
|
*/
|
||||||
|
public function updateCustomer($customer_id)
|
||||||
|
{
|
||||||
|
if (!$this->retailcrm) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$customer = $this->wcCustomerGet($customer_id);
|
||||||
|
|
||||||
|
if ($customer->get_role() == self::CUSTOMER_ROLE){
|
||||||
|
$this->processCustomer($customer);
|
||||||
|
$this->retailcrm->customersEdit($this->customer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $customer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process customer
|
||||||
|
*
|
||||||
|
* @param WC_Customer $customer
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function processCustomer($customer)
|
||||||
|
{
|
||||||
|
$createdAt = $customer->get_date_created();
|
||||||
|
$firstName = $customer->get_first_name();
|
||||||
|
$data_customer = array(
|
||||||
|
'createdAt' => $createdAt->date('Y-m-d H:i:s'),
|
||||||
|
'externalId' => $customer->get_id(),
|
||||||
|
'firstName' => $firstName ? $firstName : $customer->get_username(),
|
||||||
|
'lastName' => $customer->get_last_name(),
|
||||||
|
'email' => $customer->get_email(),
|
||||||
|
'address' => array(
|
||||||
|
'index' => $customer->get_billing_postcode(),
|
||||||
|
'countryIso' => $customer->get_billing_country(),
|
||||||
|
'region' => $customer->get_billing_state(),
|
||||||
|
'city' => $customer->get_billing_city(),
|
||||||
|
'text' => $customer->get_billing_address_1() . ',' . $customer->get_billing_address_2()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($customer->get_billing_phone()) {
|
||||||
|
$data_customer['phones'][] = array(
|
||||||
|
'number' => $customer->get_billing_phone()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->customer = apply_filters('retailcrm_process_customer', $data_customer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $customer_id
|
||||||
|
*
|
||||||
|
* @return WC_Customer
|
||||||
|
*/
|
||||||
|
public function wcCustomerGet($customer_id)
|
||||||
|
{
|
||||||
|
return new WC_Customer($customer_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getCustomer()
|
||||||
|
{
|
||||||
|
return $this->customer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endif;
|
115
src/include/class-wc-retailcrm-ga.php
Normal file
115
src/include/class-wc-retailcrm-ga.php
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (!class_exists('WC_Retailcrm_Google_Analytics')) {
|
||||||
|
|
||||||
|
class WC_Retailcrm_Google_Analytics {
|
||||||
|
private static $instance;
|
||||||
|
private $options;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return WC_Retailcrm_Google_Analytics
|
||||||
|
*/
|
||||||
|
public static function getInstance($options = array())
|
||||||
|
{
|
||||||
|
if (self::$instance === null) {
|
||||||
|
self::$instance = new self($options);
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WC_Retailcrm_Google_Analytics constructor.
|
||||||
|
*
|
||||||
|
* @param array $options
|
||||||
|
*/
|
||||||
|
private function __construct($options = array())
|
||||||
|
{
|
||||||
|
$this->options = $options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function initialize_analytics() {
|
||||||
|
return apply_filters('retailcrm_initialize_analytics' ,"
|
||||||
|
<script>
|
||||||
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
|
|
||||||
|
ga('create', '" . $this->options['ua_code'] . "', 'auto');
|
||||||
|
|
||||||
|
function getRetailCrmCookie(name) {
|
||||||
|
var matches = document.cookie.match(new RegExp(
|
||||||
|
'(?:^|; )' + name + '=([^;]*)'
|
||||||
|
));
|
||||||
|
return matches ? decodeURIComponent(matches[1]) : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
ga('set', 'dimension" . $this->options['ua_custom'] ."', getRetailCrmCookie('_ga'));
|
||||||
|
ga('send', 'pageview');
|
||||||
|
</script>
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function send_analytics() {
|
||||||
|
$js = '';
|
||||||
|
$order_id = wc_get_order_id_by_order_key($_GET['key']);
|
||||||
|
$order = wc_get_order($order_id);
|
||||||
|
|
||||||
|
foreach ($order->get_items() as $item) {
|
||||||
|
$uid = ($item['variation_id'] > 0) ? $item['variation_id'] : $item['product_id'];
|
||||||
|
$_product = wc_get_product($uid);
|
||||||
|
|
||||||
|
if ($_product) {
|
||||||
|
$order_item = array(
|
||||||
|
'id' => $uid,
|
||||||
|
'name' => $item['name'],
|
||||||
|
'price' => (float)$_product->get_price(),
|
||||||
|
'quantity' => $item['qty'],
|
||||||
|
);
|
||||||
|
|
||||||
|
$order_items[] = $order_item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = parse_url(get_site_url());
|
||||||
|
$domain = $url['host'];
|
||||||
|
|
||||||
|
$js .= "
|
||||||
|
<script type=\"text/javascript\">
|
||||||
|
ga('require', 'ecommerce', 'ecommerce.js');
|
||||||
|
ga('ecommerce:addTransaction', {
|
||||||
|
'id':" . $order->get_id() . ",
|
||||||
|
'affiliation':" . $domain . ",
|
||||||
|
'revenue':" . $order->get_total() . ",
|
||||||
|
'shipping':" . $order->get_total_tax() . ",
|
||||||
|
'tax':" . $order->get_shipping_total() . "
|
||||||
|
});
|
||||||
|
";
|
||||||
|
|
||||||
|
foreach ($order_items as $item) {
|
||||||
|
$js .= "
|
||||||
|
ga('ecommerce:addItem', {
|
||||||
|
'id':" . $order->get_id() . ",
|
||||||
|
'sku':" . $item['id'] . ",
|
||||||
|
'name': '" . $item['name'] . "',
|
||||||
|
'price': " . $item['price'] . ",
|
||||||
|
'quantity': " . $item['quantity'] . "
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
ga('ecommerce:send');
|
||||||
|
</script>
|
||||||
|
";
|
||||||
|
}
|
||||||
|
|
||||||
|
return apply_filters('retailcrm_send_analytics', $js);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,29 +18,23 @@ if ( ! class_exists( 'WC_Retailcrm_History' ) ) :
|
|||||||
protected $startDateCustomers;
|
protected $startDateCustomers;
|
||||||
protected $startDate;
|
protected $startDate;
|
||||||
protected $retailcrm_settings;
|
protected $retailcrm_settings;
|
||||||
|
protected $retailcrm;
|
||||||
protected $order_methods = array();
|
protected $order_methods = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor WC_Retailcrm_History
|
* WC_Retailcrm_History constructor.
|
||||||
|
* @param bool $retailcrm
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct($retailcrm = false)
|
||||||
{
|
{
|
||||||
$this->retailcrm_settings = get_option( 'woocommerce_integration-retailcrm_settings' );
|
$this->retailcrm_settings = get_option(WC_Retailcrm_Base::$option_key);
|
||||||
|
|
||||||
if (isset($this->retailcrm_settings['order_methods'])) {
|
if (isset($this->retailcrm_settings['order_methods'])) {
|
||||||
$this->order_methods = $this->retailcrm_settings['order_methods'];
|
$this->order_methods = $this->retailcrm_settings['order_methods'];
|
||||||
unset($this->retailcrm_settings['order_methods']);
|
unset($this->retailcrm_settings['order_methods']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Proxy' ) ) {
|
$this->retailcrm = $retailcrm;
|
||||||
include_once( WP_PLUGIN_DIR . '/woo-retailcrm/include/api/class-wc-retailcrm-proxy.php' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->retailcrm = new WC_Retailcrm_Proxy(
|
|
||||||
$this->retailcrm_settings['api_url'],
|
|
||||||
$this->retailcrm_settings['api_key'],
|
|
||||||
$this->retailcrm_settings['api_version']
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->startDate = new DateTime(date('Y-m-d H:i:s', strtotime('-1 days', strtotime(date('Y-m-d H:i:s')))));
|
$this->startDate = new DateTime(date('Y-m-d H:i:s', strtotime('-1 days', strtotime(date('Y-m-d H:i:s')))));
|
||||||
$this->startDateOrders = $this->startDate;
|
$this->startDateOrders = $this->startDate;
|
@ -544,7 +544,7 @@ if ( ! class_exists( 'WC_Retailcrm_Icml' ) ) :
|
|||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
private function checkPostStatuses() {
|
private function checkPostStatuses() {
|
||||||
$options = get_option( 'woocommerce_integration-retailcrm_settings' );
|
$options = get_option(WC_Retailcrm_Base::$option_key);
|
||||||
$status_args = array();
|
$status_args = array();
|
||||||
|
|
||||||
foreach (get_post_statuses() as $key => $value) {
|
foreach (get_post_statuses() as $key => $value) {
|
89
src/include/class-wc-retailcrm-inventories.php
Normal file
89
src/include/class-wc-retailcrm-inventories.php
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* RetailCRM Integration.
|
||||||
|
*
|
||||||
|
* @package WC_Retailcrm_Inventories
|
||||||
|
* @category Integration
|
||||||
|
* @author RetailCRM
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!class_exists('WC_Retailcrm_Inventories')) :
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class WC_Retailcrm_Inventories
|
||||||
|
*/
|
||||||
|
class WC_Retailcrm_Inventories
|
||||||
|
{
|
||||||
|
protected $retailcrm;
|
||||||
|
protected $retailcrm_settings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WC_Retailcrm_Inventories constructor.
|
||||||
|
* @param bool $retailcrm
|
||||||
|
*/
|
||||||
|
public function __construct($retailcrm = false)
|
||||||
|
{
|
||||||
|
$this->retailcrm_settings = get_option(WC_Retailcrm_Base::$option_key);
|
||||||
|
$this->retailcrm = $retailcrm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load stock from retailCRM
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function load_stocks()
|
||||||
|
{
|
||||||
|
$success = array();
|
||||||
|
|
||||||
|
if (!$this->retailcrm) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$page = 1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
$result = $this->retailcrm->storeInventories(array(), $page, 250);
|
||||||
|
|
||||||
|
if (!$result->isSuccessful()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$totalPageCount = $result['pagination']['totalPageCount'];
|
||||||
|
$page++;
|
||||||
|
|
||||||
|
foreach ($result['offers'] as $offer) {
|
||||||
|
if (isset($offer['externalId'])) {
|
||||||
|
$product = wc_get_product($offer['externalId']);
|
||||||
|
|
||||||
|
if ($product instanceof WC_Product) {
|
||||||
|
if ($product->get_type() == 'variable') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$product->set_manage_stock(true);
|
||||||
|
$product->set_stock_quantity($offer['quantity']);
|
||||||
|
$success[] = $product->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while ($page <= $totalPageCount);
|
||||||
|
|
||||||
|
return $success;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update stock quantity in WooCommerce
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function updateQuantity()
|
||||||
|
{
|
||||||
|
if ($this->retailcrm_settings['sync'] == 'yes') {
|
||||||
|
return $this->load_stocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endif;
|
@ -17,26 +17,26 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) :
|
|||||||
protected $retailcrm_settings;
|
protected $retailcrm_settings;
|
||||||
protected $retailcrm;
|
protected $retailcrm;
|
||||||
|
|
||||||
public function __construct()
|
private $order = array();
|
||||||
|
private $payment = array();
|
||||||
|
|
||||||
|
public function __construct($retailcrm = false)
|
||||||
{
|
{
|
||||||
$this->retailcrm_settings = get_option( 'woocommerce_integration-retailcrm_settings' );
|
$this->retailcrm_settings = get_option(WC_Retailcrm_Base::$option_key);
|
||||||
|
$this->retailcrm = $retailcrm;
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Proxy' ) ) {
|
|
||||||
include_once( WP_PLUGIN_DIR . '/woo-retailcrm/include/api/class-wc-retailcrm-proxy.php' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->retailcrm = new WC_Retailcrm_Proxy(
|
|
||||||
$this->retailcrm_settings['api_url'],
|
|
||||||
$this->retailcrm_settings['api_key'],
|
|
||||||
$this->retailcrm_settings['api_version']
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Upload orders to CRM
|
* Upload orders to CRM
|
||||||
|
*
|
||||||
|
* @return array $uploadOrders | null
|
||||||
*/
|
*/
|
||||||
public function ordersUpload()
|
public function ordersUpload()
|
||||||
{
|
{
|
||||||
|
if (!$this->retailcrm) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
$orders = get_posts(array(
|
$orders = get_posts(array(
|
||||||
'numberposts' => -1,
|
'numberposts' => -1,
|
||||||
'post_type' => wc_get_order_types('view-orders'),
|
'post_type' => wc_get_order_types('view-orders'),
|
||||||
@ -46,35 +46,41 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) :
|
|||||||
$orders_data = array();
|
$orders_data = array();
|
||||||
|
|
||||||
foreach ($orders as $data_order) {
|
foreach ($orders as $data_order) {
|
||||||
$order_data = $this->processOrder($data_order->ID);
|
$order = wc_get_order($data_order->ID);
|
||||||
|
$this->processOrder($order);
|
||||||
$order = new WC_Order($data_order->ID);
|
|
||||||
$customer = $order->get_user();
|
$customer = $order->get_user();
|
||||||
|
|
||||||
if ($customer != false) {
|
if ($customer != false) {
|
||||||
$order_data['customer']['externalId'] = $customer->get('ID');
|
$this->order['customer']['externalId'] = $customer->get('ID');
|
||||||
}
|
}
|
||||||
|
|
||||||
$orders_data[] = $order_data;
|
$orders_data[] = $this->order;
|
||||||
}
|
}
|
||||||
|
|
||||||
$uploadOrders = array_chunk($orders_data, 50);
|
$uploadOrders = array_chunk($orders_data, 50);
|
||||||
|
|
||||||
foreach ($uploadOrders as $uploadOrder) {
|
foreach ($uploadOrders as $uploadOrder) {
|
||||||
$this->retailcrm->ordersUpload($uploadOrder);
|
$this->retailcrm->ordersUpload($uploadOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $uploadOrders;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create order
|
* Create order
|
||||||
*
|
*
|
||||||
* @param $order_id
|
* @param $order_id
|
||||||
|
*
|
||||||
|
* @return WC_Order $order | null
|
||||||
*/
|
*/
|
||||||
public function orderCreate($order_id)
|
public function orderCreate($order_id)
|
||||||
{
|
{
|
||||||
$order_data = $this->processOrder($order_id);
|
if (!$this->retailcrm) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
$order = new WC_Order($order_id);
|
$order = wc_get_order($order_id);
|
||||||
|
$this->processOrder($order);
|
||||||
$customer = $order->get_user();
|
$customer = $order->get_user();
|
||||||
|
|
||||||
if ($customer != false) {
|
if ($customer != false) {
|
||||||
@ -83,199 +89,106 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) :
|
|||||||
if (!$search->isSuccessful()) {
|
if (!$search->isSuccessful()) {
|
||||||
$customer_data = array(
|
$customer_data = array(
|
||||||
'externalId' => $customer->get('ID'),
|
'externalId' => $customer->get('ID'),
|
||||||
'firstName' => $order_data['firstName'],
|
'firstName' => $this->order['firstName'],
|
||||||
'lastName' => $order_data['lastName'],
|
'lastName' => $this->order['lastName'],
|
||||||
'email' => $order_data['email']
|
'email' => $this->order['email']
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->retailcrm->customersCreate($customer_data);
|
$this->retailcrm->customersCreate($customer_data);
|
||||||
} else {
|
} else {
|
||||||
$order_data['customer']['externalId'] = $search['customer']['externalId'];
|
$this->order['customer']['externalId'] = $search['customer']['externalId'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->retailcrm->ordersCreate($order_data);
|
$this->retailcrm->ordersCreate($this->order);
|
||||||
|
|
||||||
|
return $order;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update shipping address
|
* Edit order in CRM
|
||||||
*
|
*
|
||||||
* @param $order_id, $address
|
* @param int $order_id
|
||||||
*/
|
|
||||||
public function orderUpdateShippingAddress($order_id, $address) {
|
|
||||||
$address['externalId'] = $order_id;
|
|
||||||
|
|
||||||
$this->retailcrm->ordersEdit($address);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update order status
|
|
||||||
*
|
*
|
||||||
* @param $order_id
|
* @return WC_Order $order | null
|
||||||
*/
|
*/
|
||||||
public function orderUpdateStatus($order_id) {
|
public function updateOrder($order_id)
|
||||||
$order = new WC_Order( $order_id );
|
{
|
||||||
|
if (!$this->retailcrm) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
$order_data = array(
|
$order = wc_get_order($order_id);
|
||||||
'externalId' => $order_id,
|
$this->processOrder($order, true);
|
||||||
'status' => $this->retailcrm_settings[$order->get_status()]
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->retailcrm->ordersEdit($order_data);
|
if ($this->retailcrm_settings['api_version'] == 'v4') {
|
||||||
|
$this->order['paymentType'] = $this->retailcrm_settings[$order->get_payment_method()];
|
||||||
|
}
|
||||||
|
|
||||||
|
$response = $this->retailcrm->ordersEdit($this->order);
|
||||||
|
|
||||||
|
if ($response->isSuccessful() && $this->retailcrm_settings['api_version'] == 'v5') {
|
||||||
|
$this->payment = $this->orderUpdatePaymentType($order);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $order;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update order payment type
|
* Update order payment type
|
||||||
*
|
*
|
||||||
* @param $order_id
|
* @param WC_Order $order
|
||||||
*
|
*
|
||||||
* @return null
|
* @return null | array $payment
|
||||||
*/
|
*/
|
||||||
public function orderUpdatePaymentType($order_id, $payment_method) {
|
protected function orderUpdatePaymentType($order)
|
||||||
|
{
|
||||||
if (!isset($this->retailcrm_settings[$payment_method])) {
|
if (!isset($this->retailcrm_settings[$order->get_payment_method()])) {
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->retailcrm_settings['api_version'] != 'v5') {
|
$response = $this->retailcrm->ordersGet($order->get_id());
|
||||||
$order_data = array(
|
|
||||||
'externalId' => $order_id,
|
|
||||||
'paymentType' => $this->retailcrm_settings[$payment_method]
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->retailcrm->ordersEdit($order_data);
|
if ($response->isSuccessful()) {
|
||||||
} else {
|
$retailcrmOrder = $response['order'];
|
||||||
$response = $this->retailcrm->ordersGet($order_id);
|
|
||||||
|
|
||||||
if ($response->isSuccessful()) {
|
foreach ($retailcrmOrder['payments'] as $payment_data) {
|
||||||
$order = $response['order'];
|
if ($payment_data['externalId'] == $order->get_id()) {
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($order['payments'] as $payment_data) {
|
|
||||||
if ($payment_data['externalId'] == $order_id) {
|
|
||||||
$payment = $payment_data;
|
$payment = $payment_data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$order = new WC_Order($order_id);
|
|
||||||
|
|
||||||
if (isset($payment) && $payment['type'] != $this->retailcrm_settings[$order->payment_method]) {
|
|
||||||
$response = $this->retailcrm->ordersPaymentDelete($payment['id']);
|
|
||||||
|
|
||||||
if ($response->isSuccessful()) {
|
|
||||||
$this->createPayment($order, $order_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update order payment
|
|
||||||
*
|
|
||||||
* @param $order_id
|
|
||||||
*/
|
|
||||||
public function orderUpdatePayment($order_id) {
|
|
||||||
|
|
||||||
if ($this->retailcrm_settings['api_version'] != 'v5') {
|
|
||||||
$order_data = array(
|
|
||||||
'externalId' => $order_id,
|
|
||||||
'paymentStatus' => 'paid'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->retailcrm->ordersEdit($order_data);
|
|
||||||
} else {
|
|
||||||
$payment = array(
|
|
||||||
'externalId' => $order_id,
|
|
||||||
'status' => 'paid'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->retailcrm->ordersPaymentsEdit($payment);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
if (isset($payment) && $payment['type'] != $this->retailcrm_settings[$order->get_payment_method()]) {
|
||||||
|
$response = $this->retailcrm->ordersPaymentDelete($payment['id']);
|
||||||
|
|
||||||
/**
|
if ($response->isSuccessful()) {
|
||||||
* Update order items
|
$payment = $this->createPayment($order);
|
||||||
*
|
|
||||||
* @param $order_id, $data
|
|
||||||
*/
|
|
||||||
public function orderUpdateItems($order_id, $data) {
|
|
||||||
$order = new WC_Order( $order_id );
|
|
||||||
|
|
||||||
$order_data['externalId'] = $order_id;
|
return $payment;
|
||||||
$shipping_method = end($data['shipping_method']);
|
|
||||||
$shipping_cost = end($data['shipping_cost']);
|
|
||||||
$products = $order->get_items();
|
|
||||||
$items = array();
|
|
||||||
|
|
||||||
foreach ($products as $order_item_id => $product) {
|
|
||||||
if ($product['variation_id'] > 0) {
|
|
||||||
$offer_id = $product['variation_id'];
|
|
||||||
} else {
|
|
||||||
$offer_id = $product['product_id'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$_product = wc_get_product($offer_id);
|
|
||||||
|
|
||||||
if ($this->retailcrm_settings['api_version'] != 'v3') {
|
|
||||||
$items[] = array(
|
|
||||||
'offer' => array('externalId' => $offer_id),
|
|
||||||
'productName' => $product['name'],
|
|
||||||
'initialPrice' => (float)$_product->get_price(),
|
|
||||||
'quantity' => $product['qty']
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$items[] = array(
|
|
||||||
'productId' => $offer_id,
|
|
||||||
'productName' => $product['name'],
|
|
||||||
'initialPrice' => (float)$_product->get_price(),
|
|
||||||
'quantity' => $product['qty']
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$order_data['items'] = $items;
|
return null;
|
||||||
|
|
||||||
if (!empty($shipping_method) && !empty($this->retailcrm_settings[$shipping_method])) {
|
|
||||||
$order_data['delivery']['code'] = $this->retailcrm_settings[$shipping_method];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($shipping_cost)) {
|
|
||||||
$shipping_cost = str_replace(',', '.', $shipping_cost);
|
|
||||||
$order_data['delivery']['cost'] = $shipping_cost;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->retailcrm->ordersEdit($order_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get order data depending on woocommerce version
|
* Get order data
|
||||||
*
|
*
|
||||||
* @param int $order_id
|
* @param WC_Order $order
|
||||||
*
|
*
|
||||||
* @return arr
|
* @return array $order_data_arr
|
||||||
*/
|
*/
|
||||||
public function getOrderData($order_id) {
|
protected function getOrderData($order) {
|
||||||
$order = new WC_Order( $order_id );
|
|
||||||
$order_data_arr = array();
|
$order_data_arr = array();
|
||||||
|
$order_info = $order->get_data();
|
||||||
|
|
||||||
if (version_compare(get_option('woocommerce_db_version'), '3.0', '<' )) {
|
$order_data_arr['id'] = $order_info['id'];
|
||||||
$order_data_arr['id'] = $order->id;
|
$order_data_arr['payment_method'] = $order->get_payment_method();
|
||||||
$order_data_arr['date'] = $order->order_date;
|
$order_data_arr['date'] = $order_info['date_created']->date('Y-m-d H:i:s');
|
||||||
$order_data_arr['payment_method'] = $order->payment_method;
|
$order_data_arr['discount_total'] = $order_info['discount_total'];
|
||||||
$order_data_arr['discount_total'] = $order->data['discount_total'];
|
$order_data_arr['discount_tax'] = $order_info['discount_tax'];
|
||||||
$order_data_arr['discount_tax'] = $order->data['discount_tax'];
|
$order_data_arr['customer_comment'] = $order->get_customer_note();
|
||||||
$order_data_arr['customer_comment'] = $order->data['customerComment'];
|
|
||||||
} else {
|
|
||||||
$order_info = $order->get_data();
|
|
||||||
|
|
||||||
$order_data_arr['id'] = $order_info['id'];
|
|
||||||
$order_data_arr['payment_method'] = $order->get_payment_method();
|
|
||||||
$order_data_arr['date'] = $order_info['date_created']->date('Y-m-d H:i:s');
|
|
||||||
$order_data_arr['discount_total'] = $order_info['discount_total'];
|
|
||||||
$order_data_arr['discount_tax'] = $order_info['discount_tax'];
|
|
||||||
$order_data_arr['customer_comment'] = $order->get_customer_note();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $order_data_arr;
|
return $order_data_arr;
|
||||||
}
|
}
|
||||||
@ -283,19 +196,18 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) :
|
|||||||
/**
|
/**
|
||||||
* process to combine order data
|
* process to combine order data
|
||||||
*
|
*
|
||||||
* @param int $order_id
|
* @param WC_Order $order
|
||||||
* @param boolean $update
|
* @param boolean $update
|
||||||
*
|
*
|
||||||
* @return array $order_data
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function processOrder($order_id, $update = false)
|
protected function processOrder($order, $update = false)
|
||||||
{
|
{
|
||||||
if ( !$order_id ){
|
if (!$order instanceof WC_Order) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$order = new WC_Order( $order_id );
|
$order_data_info = $this->getOrderData($order);
|
||||||
$order_data_info = $this->getOrderData($order_id);
|
|
||||||
$order_data = array();
|
$order_data = array();
|
||||||
|
|
||||||
$order_data['externalId'] = $order_data_info['id'];
|
$order_data['externalId'] = $order_data_info['id'];
|
||||||
@ -303,13 +215,16 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) :
|
|||||||
$order_data['createdAt'] = trim($order_data_info['date']);
|
$order_data['createdAt'] = trim($order_data_info['date']);
|
||||||
$order_data['customerComment'] = $order_data_info['customer_comment'];
|
$order_data['customerComment'] = $order_data_info['customer_comment'];
|
||||||
|
|
||||||
if ( !empty( $order_data_info['payment_method'] ) && !empty($this->retailcrm_settings[$order_data_info['payment_method']]) && $this->retailcrm_settings['api_version'] != 'v5') {
|
if (!empty($order_data_info['payment_method'])
|
||||||
|
&& !empty($this->retailcrm_settings[$order_data_info['payment_method']])
|
||||||
|
&& $this->retailcrm_settings['api_version'] != 'v5'
|
||||||
|
) {
|
||||||
$order_data['paymentType'] = $this->retailcrm_settings[$order_data_info['payment_method']];
|
$order_data['paymentType'] = $this->retailcrm_settings[$order_data_info['payment_method']];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($order->get_items( 'shipping' )) {
|
if ($order->get_items('shipping')) {
|
||||||
$shippings = $order->get_items( 'shipping' );
|
$shippings = $order->get_items( 'shipping' );
|
||||||
$shipping = end($shippings);
|
$shipping = reset($shippings);
|
||||||
$shipping_code = explode(':', $shipping['method_id']);
|
$shipping_code = explode(':', $shipping['method_id']);
|
||||||
|
|
||||||
if (isset($this->retailcrm_settings[$shipping['method_id']])) {
|
if (isset($this->retailcrm_settings[$shipping['method_id']])) {
|
||||||
@ -405,11 +320,11 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) :
|
|||||||
if ($this->retailcrm_settings['api_version'] == 'v5') {
|
if ($this->retailcrm_settings['api_version'] == 'v5') {
|
||||||
$payment = array(
|
$payment = array(
|
||||||
'amount' => $order->get_total(),
|
'amount' => $order->get_total(),
|
||||||
'externalId' => $order_id
|
'externalId' => $order->get_id()
|
||||||
);
|
);
|
||||||
|
|
||||||
$payment['order'] = array(
|
$payment['order'] = array(
|
||||||
'externalId' => $order_id
|
'externalId' => $order->get_id()
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!empty($order_data_info['payment_method']) && !empty($this->retailcrm_settings[$order_data_info['payment_method']])) {
|
if (!empty($order_data_info['payment_method']) && !empty($this->retailcrm_settings[$order_data_info['payment_method']])) {
|
||||||
@ -427,12 +342,10 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) :
|
|||||||
|
|
||||||
if (!$update) {
|
if (!$update) {
|
||||||
$order_data['payments'][] = $payment;
|
$order_data['payments'][] = $payment;
|
||||||
} else {
|
|
||||||
$this->editPayment($payment);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return apply_filters('retailcrm_process_order', $order_data);
|
$this->order = apply_filters('retailcrm_process_order', $order_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -441,21 +354,21 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) :
|
|||||||
* @param WC_Order $order
|
* @param WC_Order $order
|
||||||
* @param int $order_id
|
* @param int $order_id
|
||||||
*
|
*
|
||||||
* @return void
|
* @return array $payment
|
||||||
*/
|
*/
|
||||||
protected function createPayment($order, $order_id)
|
protected function createPayment($order)
|
||||||
{
|
{
|
||||||
$payment = array(
|
$payment = array(
|
||||||
'amount' => $order->get_total(),
|
'amount' => $order->get_total(),
|
||||||
'externalId' => $order_id
|
'externalId' => $order->get_id()
|
||||||
);
|
);
|
||||||
|
|
||||||
$payment['order'] = array(
|
$payment['order'] = array(
|
||||||
'externalId' => $order_id
|
'externalId' => $order->get_id()
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!empty($order->payment_method) && !empty($this->retailcrm_settings[$order->payment_method])) {
|
if (isset($this->retailcrm_settings[$order->get_payment_method()])) {
|
||||||
$payment['type'] = $this->retailcrm_settings[$order->payment_method];
|
$payment['type'] = $this->retailcrm_settings[$order->get_payment_method()];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($order->is_paid()) {
|
if ($order->is_paid()) {
|
||||||
@ -468,38 +381,24 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->retailcrm->ordersPaymentCreate($payment);
|
$this->retailcrm->ordersPaymentCreate($payment);
|
||||||
|
|
||||||
|
return $payment;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Edit payment in CRM
|
* @return array
|
||||||
*
|
|
||||||
* @param array $payment
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
protected function editPayment($payment)
|
public function getOrder()
|
||||||
{
|
{
|
||||||
$this->retailcrm->ordersPaymentEdit($payment);
|
return $this->order;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Edit order in CRM
|
* @return array
|
||||||
*
|
|
||||||
* @param int $order_id
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
public function updateOrder($order_id)
|
public function getPayment()
|
||||||
{
|
{
|
||||||
$order = $this->processOrder($order_id, true);
|
return $this->payment;
|
||||||
|
|
||||||
$response = $this->retailcrm->ordersEdit($order);
|
|
||||||
|
|
||||||
$orderWc = new WC_Order($order_id);
|
|
||||||
|
|
||||||
if ($response->isSuccessful()) {
|
|
||||||
$this->orderUpdatePaymentType($order_id, $orderWc->get_payment_method());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
endif;
|
endif;
|
55
src/include/class-wc-retailcrm-plugin.php
Normal file
55
src/include/class-wc-retailcrm-plugin.php
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class WC_Retailcrm_Plugin {
|
||||||
|
|
||||||
|
public $file;
|
||||||
|
|
||||||
|
private static $instance = null;
|
||||||
|
|
||||||
|
public static function getInstance($file) {
|
||||||
|
if (self::$instance === null) {
|
||||||
|
self::$instance = new self($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function __construct($file) {
|
||||||
|
$this->file = $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register_activation_hook() {
|
||||||
|
register_activation_hook($this->file, array($this, 'activate'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register_deactivation_hook() {
|
||||||
|
register_deactivation_hook($this->file, array($this, 'deactivate'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function activate() {
|
||||||
|
if (!class_exists('WC_Retailcrm_Icml')) {
|
||||||
|
require_once (dirname(__FILE__) . '/class-wc-retailcrm-icml.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!class_exists('WC_Retailcrm_Base')) {
|
||||||
|
require_once (dirname(__FILE__) . '/class-wc-retailcrm-base.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$retailcrm_icml = new WC_Retailcrm_Icml();
|
||||||
|
$retailcrm_icml->generate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deactivate() {
|
||||||
|
if ( wp_next_scheduled ( 'retailcrm_icml' )) {
|
||||||
|
wp_clear_scheduled_hook('retailcrm_icml');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( wp_next_scheduled ( 'retailcrm_history' )) {
|
||||||
|
wp_clear_scheduled_hook('retailcrm_history');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( wp_next_scheduled ( 'retailcrm_inventories' )) {
|
||||||
|
wp_clear_scheduled_hook('retailcrm_inventories');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
174
src/readme.txt
Normal file
174
src/readme.txt
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
=== Woocommerce RetailCRM ===
|
||||||
|
Contributors: retailCRM
|
||||||
|
Donate link: http://retailcrm.ru/
|
||||||
|
Tags: Интеграция, Retailcrm
|
||||||
|
Requires PHP: 5.3
|
||||||
|
Requires at least: 4.7
|
||||||
|
Tested up to: 4.9.5
|
||||||
|
Stable tag: 4.9
|
||||||
|
License: GPLv1 or later
|
||||||
|
License URI: http://www.gnu.org/licenses/gpl-1.0.html
|
||||||
|
|
||||||
|
== Description ==
|
||||||
|
|
||||||
|
= Возможности плагина =
|
||||||
|
|
||||||
|
Плагин для интеграции Woocommerce и Retailcrm. Плагин позволяет сгенерировать каталог товаров для выгрузки в Retailcrm, настроить двусторонний обмен заказами Woocommerce и Retailcrm, отправлять и принимать изменения по заказам, выгружать остатки из Retailcrm в магазин. При включении функции выгрузки остатков каждые 15 минут остатки по товарам будут выгружаться в магазин (настройка имеет смысл при включении ручного редактирования остатков в Retailcrm, остатки из магазина выгружаются вместе с каталогом товаров каждые 4 часа). Внимание!!! При включении выгрузки остатков плагин включит управление остатками для товаров. Товары, отсутствующие на складе будут скрыты на сайте для посетителей.
|
||||||
|
|
||||||
|
= Выгрузка изменений из Retailcrm =
|
||||||
|
|
||||||
|
Каждые 5 минут плагин подгружает изменения из Retailcrm в Woocommerce.
|
||||||
|
|
||||||
|
= Кастомизация =
|
||||||
|
|
||||||
|
Вы можете вносить изменения в базовые классы плагина, разместив копию класса из дериктории include в директории wp-content/retailcrm-custom.
|
||||||
|
|
||||||
|
== Installation ==
|
||||||
|
|
||||||
|
= Активация и настройка =
|
||||||
|
|
||||||
|
После активации плагина необходимо открыть настройки Woocommerce, выбрать вкладку "Интеграция" и в настройках RetailCRM указать адрес CRM (например https://example.retailcrm.ru) и API-ключ, сгенерированный в CRM (инструкция по добавлению ключа в CRM - http://www.retailcrm.ru/docs/Users/ApiKeys), выбрать желаемую версию API (API v5 доступна только c версии Retailcrm 6.0 и выше)
|
||||||
|
|
||||||
|
== Frequently Asked Questions ==
|
||||||
|
|
||||||
|
= Нет списка справочников для настройки соответствия =
|
||||||
|
|
||||||
|
Проверьте, что для созданного API-ключа доступны все методы
|
||||||
|
|
||||||
|
= Заказы не попадают в Retailcrm =
|
||||||
|
|
||||||
|
API-ключ должен быть для отдельного магазина
|
||||||
|
|
||||||
|
== Screenshots ==
|
||||||
|
|
||||||
|
1. Введите адрес CRM, API-ключ и выберите версию API, нажмите на кнопку сохраниения настроек. Если после сохранения не появилось никаких других настроек, обновите страницу.
|
||||||
|
2. В появившихся списках справочников настройте соответствие способов доставки и оплаты, а так же статусов заказов. Отметьте галочку "Выгружать остатки", если хотите выгружать остатки из Retailcrm в магазин (подробнее смотрите в описании).
|
||||||
|
|
||||||
|
== Changelog ==
|
||||||
|
|
||||||
|
= 3.0.0 =
|
||||||
|
* Произведен рефакторинг кода
|
||||||
|
|
||||||
|
= 2.1.4 =
|
||||||
|
* Исправлена ошибка при активированном модуле без настроек
|
||||||
|
* Добавлен фильтр при формировании массива заказа
|
||||||
|
* Исправлена генерация icml с неполной картинкой товара
|
||||||
|
|
||||||
|
= 2.1.3 =
|
||||||
|
* Исправлена ошибка на php5.3
|
||||||
|
|
||||||
|
= 2.1.2 =
|
||||||
|
* Добавлена локализация плагина
|
||||||
|
* Добавлена интеграция с UA
|
||||||
|
|
||||||
|
= 2.1.1 =
|
||||||
|
* Исправлена ошибка с редактированием клиента
|
||||||
|
|
||||||
|
= 2.1.0 =
|
||||||
|
* Переработана механика генерации icml каталога товаров
|
||||||
|
* В icml каталог добавлена выгрузка налоговой ставки
|
||||||
|
* Исправлен пересчет итогов после изменения количества товара в RetailCRM
|
||||||
|
|
||||||
|
= 2.0.6 =
|
||||||
|
* Исправлено возникновение Warning на PHP 7.2 при генерации каталога товаров
|
||||||
|
* Добавлена настройка выгрузки заказов из RetailCRM с определенными способами оформления
|
||||||
|
* Выгрузка изменений из RetailCRM осуществляется по sinceId
|
||||||
|
|
||||||
|
= 2.0.5 =
|
||||||
|
* Исправлен неверный подсчет скидки на товары
|
||||||
|
|
||||||
|
= 2.0.4 =
|
||||||
|
* Улучшена механика пакетной выгрузки клиентов и заказов
|
||||||
|
* Добавлена возможность выгрузки заказов с товарами, которые уже удалены с сайта
|
||||||
|
|
||||||
|
= 2.0.3 =
|
||||||
|
* Изменен механизм рассчета стоимости товара в заказе
|
||||||
|
* Улучшена передача информации об изменениях в заказе
|
||||||
|
* Устранены мелкие баги
|
||||||
|
|
||||||
|
= 2.0.2 =
|
||||||
|
* Изменен механизм передачи скидок в CRM
|
||||||
|
|
||||||
|
= 2.0.1 =
|
||||||
|
* Добавлена выгрузка размеров товаров
|
||||||
|
* Улучшена выгрузка веса товаров
|
||||||
|
* Улучшена механика выгрузки заказов из CRM
|
||||||
|
|
||||||
|
= 2.0.0 =
|
||||||
|
* Улучшен поиск типов доставок на сайте
|
||||||
|
* Добавлена кнопка генерации icml каталога в настройках плагина
|
||||||
|
* Переработан механизм выгрузки заказов из CRM
|
||||||
|
* Улучшена генерация каталога, добавлена выгрузка размеров
|
||||||
|
|
||||||
|
= 1.2.3 =
|
||||||
|
* Добален опциональный выбор статусов товаров, выгружаемых в каталоге
|
||||||
|
* Улучшен механизм формирования цены товара в заказе (с учетом скидок и налогов)
|
||||||
|
|
||||||
|
= 1.2.2 =
|
||||||
|
* Исправлены ошибки
|
||||||
|
|
||||||
|
= 1.2.1 =
|
||||||
|
* Доработана система кастомизации.
|
||||||
|
|
||||||
|
= 1.2.0 =
|
||||||
|
* Улучшена возможность кастомизации плагина.
|
||||||
|
* Добавлена возможность кастомизации обработки остатков, клиентов и истории.
|
||||||
|
|
||||||
|
= 1.1 =
|
||||||
|
* Добавлена возможность выбора версии API.
|
||||||
|
* Исправелены ошибки.
|
||||||
|
|
||||||
|
== Upgrade Notice ==
|
||||||
|
|
||||||
|
= 3.0.0 =
|
||||||
|
* Произведен рефакторинг кода
|
||||||
|
|
||||||
|
= 2.1.4 =
|
||||||
|
Исправлена ошибка при активированном модуле без настроек
|
||||||
|
Добавлен фильтр при формировании массива заказа
|
||||||
|
Исправлена генерация icml с неполной картинкой товара
|
||||||
|
|
||||||
|
= 2.1.3 =
|
||||||
|
Исправлена ошибка на php5.3
|
||||||
|
|
||||||
|
= 2.1.2 =
|
||||||
|
Добавлена локализация плагина
|
||||||
|
Добавлена интеграция с UA
|
||||||
|
|
||||||
|
= 2.1.1 =
|
||||||
|
Исправлена ошибка с редактированием клиента
|
||||||
|
|
||||||
|
= 2.1.0 =
|
||||||
|
Переработана механика генерации icml каталога товаров
|
||||||
|
В icml каталог добавлена выгрузка налоговой ставки
|
||||||
|
Исправлен пересчет итогов после изменения количества товара в RetailCRM
|
||||||
|
|
||||||
|
= 2.0.6 =
|
||||||
|
Исправлено возникновение Warning на PHP 7.2 при генерации каталога товаров
|
||||||
|
Добавлена настройка выгрузки заказов из RetailCRM с определенными способами оформления
|
||||||
|
|
||||||
|
= 2.0.4 =
|
||||||
|
Улучшена механика пакетной выгрузки клиентов и заказов
|
||||||
|
Добавлена возможность выгрузки заказов с товарами, которые уже удалены с сайта
|
||||||
|
|
||||||
|
= 2.0.3 =
|
||||||
|
Изменен механизм рассчета стоимости товара в заказе
|
||||||
|
Улучшена передача информации об изменениях в заказе
|
||||||
|
Устранены мелкие баги
|
||||||
|
|
||||||
|
= 2.0.2 =
|
||||||
|
Изменен механизм передачи скидок в CRM
|
||||||
|
|
||||||
|
= 2.0.1 =
|
||||||
|
Добавлена выгрузка размеров товаров
|
||||||
|
Улучшена выгрузка веса товаров
|
||||||
|
Улучшена механика выгрузки заказов из CRM
|
||||||
|
|
||||||
|
= 2.0.0 =
|
||||||
|
Улучшен поиск типов доставок на сайте
|
||||||
|
Добавлена кнопка генерации icml каталога в настройках плагина
|
||||||
|
Переработан механизм выгрузки заказов из CRM
|
||||||
|
Улучшена генерация каталога, добавлена выгрузка размеров
|
||||||
|
|
||||||
|
= 1.2.3 =
|
||||||
|
Исправлены ошибки, доработан функционал
|
76
src/retailcrm.php
Normal file
76
src/retailcrm.php
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Version: 3.0.0
|
||||||
|
* WC requires at least: 3.0
|
||||||
|
* WC tested up to: 3.3
|
||||||
|
* Plugin Name: WooCommerce RetailCRM
|
||||||
|
* Plugin URI: https://wordpress.org/plugins/woo-retailcrm/
|
||||||
|
* Description: Integration plugin for WooCommerce & RetailCRM
|
||||||
|
* Author: RetailDriver LLC
|
||||||
|
* Author URI: http://retailcrm.ru/
|
||||||
|
* Text Domain: retailcrm
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
|
exit; // Exit if accessed directly
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!class_exists( 'WC_Integration_Retailcrm')) :
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class WC_Integration_Retailcrm
|
||||||
|
*/
|
||||||
|
class WC_Integration_Retailcrm {
|
||||||
|
|
||||||
|
private static $instance;
|
||||||
|
|
||||||
|
public static function get_instance() {
|
||||||
|
if (null === self::$instance) {
|
||||||
|
self::$instance = new self();
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the plugin.
|
||||||
|
*/
|
||||||
|
public function __construct() {
|
||||||
|
add_action('plugins_loaded', array($this, 'load_plugin_textdomain'));
|
||||||
|
|
||||||
|
if ( class_exists( 'WC_Integration' ) ) {
|
||||||
|
require_once( dirname( __FILE__ ) . '/include/class-wc-retailcrm-base.php' );
|
||||||
|
require_once( dirname( __FILE__ ) . '/include/functions.php' );
|
||||||
|
add_filter('woocommerce_integrations', array( $this, 'add_integration'));
|
||||||
|
} else {
|
||||||
|
// throw an admin error if you like
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function load_plugin_textdomain() {
|
||||||
|
load_plugin_textdomain('retailcrm', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new integration to WooCommerce.
|
||||||
|
*
|
||||||
|
* @param $integrations
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function add_integration( $integrations ) {
|
||||||
|
$integrations[] = 'WC_Retailcrm_Base';
|
||||||
|
return $integrations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!class_exists('WC_Retailcrm_Plugin')) {
|
||||||
|
require_once (dirname(__FILE__) . '/include/class-wc-retailcrm-plugin.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$plugin = WC_Retailcrm_Plugin::getInstance(__FILE__);
|
||||||
|
$plugin->register_activation_hook();
|
||||||
|
$plugin->register_deactivation_hook();
|
||||||
|
|
||||||
|
add_action( 'plugins_loaded', array( 'WC_Integration_Retailcrm', 'get_instance' ), 0 );
|
||||||
|
endif;
|
@ -15,7 +15,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @link https://wordpress.org/plugins/woo-retailcrm/
|
* @link https://wordpress.org/plugins/woo-retailcrm/
|
||||||
* @since 2.1.4
|
* @version 3.0.0
|
||||||
*
|
*
|
||||||
* @package RetailCRM
|
* @package RetailCRM
|
||||||
*/
|
*/
|
137
tests/bin/install.sh
Executable file
137
tests/bin/install.sh
Executable file
@ -0,0 +1,137 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# See https://raw.githubusercontent.com/wp-cli/scaffold-command/master/templates/install-wp-tests.sh
|
||||||
|
|
||||||
|
if [ $# -lt 3 ]; then
|
||||||
|
echo "usage: $0 <db-name> <db-user> <db-pass> [db-host] [wp-version] [skip-database-creation]"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DB_NAME=$1
|
||||||
|
DB_USER=$2
|
||||||
|
DB_PASS=$3
|
||||||
|
DB_HOST=${4-localhost}
|
||||||
|
WP_VERSION=${5-latest}
|
||||||
|
SKIP_DB_CREATE=${6-false}
|
||||||
|
|
||||||
|
WP_TESTS_DIR=${WP_TESTS_DIR-/tmp/wordpress-tests-lib}
|
||||||
|
WP_CORE_DIR=${WP_CORE_DIR-/tmp/wordpress/}
|
||||||
|
|
||||||
|
download() {
|
||||||
|
if [ `which curl` ]; then
|
||||||
|
curl -s "$1" > "$2";
|
||||||
|
elif [ `which wget` ]; then
|
||||||
|
wget -nv -O "$2" "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $WP_VERSION =~ [0-9]+\.[0-9]+(\.[0-9]+)? ]]; then
|
||||||
|
WP_TESTS_TAG="tags/$WP_VERSION"
|
||||||
|
elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
|
||||||
|
WP_TESTS_TAG="trunk"
|
||||||
|
else
|
||||||
|
# http serves a single offer, whereas https serves multiple. we only want one
|
||||||
|
download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json
|
||||||
|
grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json
|
||||||
|
LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//')
|
||||||
|
if [[ -z "$LATEST_VERSION" ]]; then
|
||||||
|
echo "Latest WordPress version could not be found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
WP_TESTS_TAG="tags/$LATEST_VERSION"
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
install_wp() {
|
||||||
|
|
||||||
|
if [ -d $WP_CORE_DIR ]; then
|
||||||
|
return;
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p $WP_CORE_DIR
|
||||||
|
|
||||||
|
if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
|
||||||
|
mkdir -p /tmp/wordpress-nightly
|
||||||
|
download https://wordpress.org/nightly-builds/wordpress-latest.zip /tmp/wordpress-nightly/wordpress-nightly.zip
|
||||||
|
unzip -q /tmp/wordpress-nightly/wordpress-nightly.zip -d /tmp/wordpress-nightly/
|
||||||
|
mv /tmp/wordpress-nightly/wordpress/* $WP_CORE_DIR
|
||||||
|
else
|
||||||
|
if [ $WP_VERSION == 'latest' ]; then
|
||||||
|
local ARCHIVE_NAME='latest'
|
||||||
|
else
|
||||||
|
local ARCHIVE_NAME="wordpress-$WP_VERSION"
|
||||||
|
fi
|
||||||
|
download https://wordpress.org/${ARCHIVE_NAME}.tar.gz /tmp/wordpress.tar.gz
|
||||||
|
tar --strip-components=1 -zxmf /tmp/wordpress.tar.gz -C $WP_CORE_DIR
|
||||||
|
fi
|
||||||
|
|
||||||
|
download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php
|
||||||
|
}
|
||||||
|
|
||||||
|
install_woocommerce() {
|
||||||
|
cd /tmp
|
||||||
|
git clone https://github.com/woocommerce/woocommerce.git
|
||||||
|
cd woocommerce
|
||||||
|
git checkout master
|
||||||
|
cd -
|
||||||
|
}
|
||||||
|
|
||||||
|
install_test_suite() {
|
||||||
|
# portable in-place argument for both GNU sed and Mac OSX sed
|
||||||
|
if [[ $(uname -s) == 'Darwin' ]]; then
|
||||||
|
local ioption='-i .bak'
|
||||||
|
else
|
||||||
|
local ioption='-i'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# set up testing suite if it doesn't yet exist
|
||||||
|
if [ ! -d $WP_TESTS_DIR ]; then
|
||||||
|
# set up testing suite
|
||||||
|
mkdir -p $WP_TESTS_DIR
|
||||||
|
svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes
|
||||||
|
svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f wp-tests-config.php ]; then
|
||||||
|
download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
# remove all forward slashes in the end
|
||||||
|
WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::")
|
||||||
|
sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
install_db() {
|
||||||
|
|
||||||
|
if [ ${SKIP_DB_CREATE} = "true" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# parse DB_HOST for port or socket references
|
||||||
|
local PARTS=(${DB_HOST//\:/ })
|
||||||
|
local DB_HOSTNAME=${PARTS[0]};
|
||||||
|
local DB_SOCK_OR_PORT=${PARTS[1]};
|
||||||
|
local EXTRA=""
|
||||||
|
|
||||||
|
if ! [ -z $DB_HOSTNAME ] ; then
|
||||||
|
if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then
|
||||||
|
EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
|
||||||
|
elif ! [ -z $DB_SOCK_OR_PORT ] ; then
|
||||||
|
EXTRA=" --socket=$DB_SOCK_OR_PORT"
|
||||||
|
elif ! [ -z $DB_HOSTNAME ] ; then
|
||||||
|
EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# create database
|
||||||
|
mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA
|
||||||
|
}
|
||||||
|
|
||||||
|
install_wp
|
||||||
|
install_test_suite
|
||||||
|
install_woocommerce
|
||||||
|
install_db
|
8
tests/bin/script.sh
Normal file
8
tests/bin/script.sh
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [[ ${RUN_PHPCS} == 1 ]]; then
|
||||||
|
composer install
|
||||||
|
vendor/phpunit/phpunit/phpunit -c phpunit.xml.dist
|
||||||
|
else
|
||||||
|
phpunit -c phpunit.xml.dist
|
||||||
|
fi
|
13
tests/helpers/class-wc-retailcrm-response-helper.php
Normal file
13
tests/helpers/class-wc-retailcrm-response-helper.php
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (!class_exists('WC_Retailcrm_Response')) {
|
||||||
|
require_once dirname(__FILE__) . '/../../src/include/api/class-wc-retailcrm-response.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
class WC_Retailcrm_Response_Helper extends WC_Retailcrm_Response
|
||||||
|
{
|
||||||
|
public function setResponse($response)
|
||||||
|
{
|
||||||
|
$this->response = $response;
|
||||||
|
}
|
||||||
|
}
|
45
tests/helpers/class-wc-retailcrm-test-case-helper.php
Normal file
45
tests/helpers/class-wc-retailcrm-test-case-helper.php
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class WC_Retailcrm_Test_Case_Helper extends WC_Unit_Test_Case
|
||||||
|
{
|
||||||
|
protected function setOptions($apiVesrion)
|
||||||
|
{
|
||||||
|
$options = array(
|
||||||
|
'api_url' => 'https://example.retailcrm.ru',
|
||||||
|
'api_key' => 'dhsHJGYdjkHHJKJSGjhasjhgajsgJGHsg',
|
||||||
|
'api_version' => $apiVesrion,
|
||||||
|
'p_draft' => 'no',
|
||||||
|
'p_pending' => 'no',
|
||||||
|
'p_private' => 'no',
|
||||||
|
'p_publish' => 'no',
|
||||||
|
'order_methods' => '',
|
||||||
|
'flat_rate' => 'delivery',
|
||||||
|
'flat_rate:1' => 'delivery1',
|
||||||
|
'free_shipping:7' => 'delivery2',
|
||||||
|
'flat_rate:8' => 'delivery3',
|
||||||
|
'local_pickup:9' => 'delivery4',
|
||||||
|
'flat_rate_shipping' => 'delivery5',
|
||||||
|
'bacs' => 'payment1',
|
||||||
|
'cheque' => 'payment2',
|
||||||
|
'cod' => 'payment3',
|
||||||
|
'paypal' => 'payment4',
|
||||||
|
'ppec_paypal' => 'payment5',
|
||||||
|
'pending' => 'status1',
|
||||||
|
'processing' => 'status2',
|
||||||
|
'on-hold' => 'status3',
|
||||||
|
'completed' => 'status4',
|
||||||
|
'cancelled' => 'status5',
|
||||||
|
'refunded' => 'status6',
|
||||||
|
'failed' => 'status7',
|
||||||
|
'sync' => 'no',
|
||||||
|
'ua' => 'no',
|
||||||
|
'ua_code' => '',
|
||||||
|
'ua_custom' => '',
|
||||||
|
'upload-button' => ''
|
||||||
|
);
|
||||||
|
|
||||||
|
update_option(WC_Retailcrm_Base::$option_key, $options);
|
||||||
|
|
||||||
|
return $options;
|
||||||
|
}
|
||||||
|
}
|
27
tests/phpunit/bootstrap.php
Normal file
27
tests/phpunit/bootstrap.php
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$_tests_dir = getenv('WP_TESTS_DIR');
|
||||||
|
|
||||||
|
if (!$_tests_dir) {
|
||||||
|
$_tests_dir = '/tmp/wordpress-tests-lib';
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once $_tests_dir . '/includes/functions.php';
|
||||||
|
|
||||||
|
function _manually_load_plugin() {
|
||||||
|
$plugin_dir = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/';
|
||||||
|
|
||||||
|
require $plugin_dir . 'woocommerce-retailcrm/src/include/class-wc-retailcrm-orders.php';
|
||||||
|
require $plugin_dir . 'woocommerce-retailcrm/src/include/class-wc-retailcrm-customers.php';
|
||||||
|
require $plugin_dir . 'woocommerce-retailcrm/src/include/class-wc-retailcrm-inventories.php';
|
||||||
|
require $plugin_dir . 'woocommerce-retailcrm/src/retailcrm.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
tests_add_filter('muplugins_loaded', '_manually_load_plugin');
|
||||||
|
|
||||||
|
require '/tmp/woocommerce/tests/bootstrap.php';
|
||||||
|
|
||||||
|
$plugin_dir = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/';
|
||||||
|
// helpers
|
||||||
|
require $plugin_dir . 'woocommerce-retailcrm/tests/helpers/class-wc-retailcrm-response-helper.php';
|
||||||
|
require $plugin_dir . 'woocommerce-retailcrm/tests/helpers/class-wc-retailcrm-test-case-helper.php';
|
221
tests/phpunit/test-wc-retailcrm-base.php
Normal file
221
tests/phpunit/test-wc-retailcrm-base.php
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class WC_Retailcrm_Base_Test extends WC_Retailcrm_Test_Case_Helper
|
||||||
|
{
|
||||||
|
protected $apiMock;
|
||||||
|
protected $responseMockOrderMethods;
|
||||||
|
protected $responseMockDeliveryTypes;
|
||||||
|
protected $responseMockPaymentTypes;
|
||||||
|
protected $responseMockStatuses;
|
||||||
|
|
||||||
|
private $unit;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
$this->apiMock = $this->getMockBuilder('\WC_Retailcrm_Proxy')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'orderMethodsList',
|
||||||
|
'deliveryTypesList',
|
||||||
|
'paymentTypesList',
|
||||||
|
'statusesList'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->setMockOrderMethods();
|
||||||
|
$this->setMockDeliveryTypes();
|
||||||
|
$this->setMockPaymentTypes();
|
||||||
|
$this->setMockStatuses();
|
||||||
|
|
||||||
|
$_GET['page'] = 'wc-settings';
|
||||||
|
$_GET['tab'] = 'integration';
|
||||||
|
|
||||||
|
$this->setOptions('v5');
|
||||||
|
$this->unit = new \WC_Retailcrm_Base($this->apiMock);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_retailcrm_check_custom_file()
|
||||||
|
{
|
||||||
|
$file = \WC_Retailcrm_Base::checkCustomFile('ga');
|
||||||
|
$this->assertInternalType('string', $file);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_retailcrm_form_fields()
|
||||||
|
{
|
||||||
|
$this->assertInternalType('array', $this->unit->form_fields);
|
||||||
|
$this->assertArrayHasKey('api_url', $this->unit->form_fields);
|
||||||
|
$this->assertArrayHasKey('api_key', $this->unit->form_fields);
|
||||||
|
$this->assertArrayHasKey('api_version', $this->unit->form_fields);
|
||||||
|
|
||||||
|
foreach (get_post_statuses() as $key => $status) {
|
||||||
|
$this->assertArrayHasKey('p_' . $key, $this->unit->form_fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->assertArrayHasKey('order_methods', $this->unit->form_fields);
|
||||||
|
|
||||||
|
foreach (get_wc_shipping_methods() as $code => $value) {
|
||||||
|
if (isset($value['enabled']) && $value['enabled'] == 'yes') {
|
||||||
|
$this->assertArrayHasKey($code, $this->unit->form_fields);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$wc_payment = WC_Payment_Gateways::instance();
|
||||||
|
|
||||||
|
foreach ($wc_payment->get_available_payment_gateways() as $payment) {
|
||||||
|
if (isset($payment->enabled) && $payment->enabled == 'yes') {
|
||||||
|
$this->assertArrayHasKey($payment->id, $this->unit->form_fields);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (wc_get_order_statuses() as $idx => $name ) {
|
||||||
|
$uid = str_replace('wc-', '', $idx);
|
||||||
|
$this->assertArrayHasKey($uid, $this->unit->form_fields);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getResponseOrderMethods()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'success' => true,
|
||||||
|
'orderMethods' => array(
|
||||||
|
array(
|
||||||
|
'name' => 'orderMethod1',
|
||||||
|
'code' => 'orderMethod1',
|
||||||
|
'active' => true
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'orderMethod2',
|
||||||
|
'code' => 'orderMethod2',
|
||||||
|
'active' => true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getResponseDeliveryTypes()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'success' => true,
|
||||||
|
'deliveryTypes' => array(
|
||||||
|
array(
|
||||||
|
'name' => 'delivery1',
|
||||||
|
'code' => 'delivery1'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'delivery2',
|
||||||
|
'code' => 'delivery2'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getResponsePaymentTypes()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'success' => true,
|
||||||
|
'paymentTypes' => array(
|
||||||
|
array(
|
||||||
|
'name' => 'payment1',
|
||||||
|
'code' => 'payment1'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'payment2',
|
||||||
|
'code' => 'payment2'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getResponseStatuses()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'success' => true,
|
||||||
|
'statuses' => array(
|
||||||
|
array(
|
||||||
|
'name' => 'status1',
|
||||||
|
'code' => 'status1'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'status2',
|
||||||
|
'code' => 'status2'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setMockOrderMethods()
|
||||||
|
{
|
||||||
|
$this->responseMockOrderMethods = $this->getMockBuilder('\WC_Retailcrm_Response_Helper')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'isSuccessful'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->responseMockOrderMethods->expects($this->any())
|
||||||
|
->method('isSuccessful')
|
||||||
|
->willReturn(true);
|
||||||
|
|
||||||
|
$this->responseMockOrderMethods->setResponse($this->getResponseOrderMethods());
|
||||||
|
$this->apiMock->expects($this->any())
|
||||||
|
->method('orderMethodsList')
|
||||||
|
->willReturn($this->responseMockOrderMethods);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setMockDeliveryTypes()
|
||||||
|
{
|
||||||
|
$this->responseMockDeliveryTypes = $this->getMockBuilder('\WC_Retailcrm_Response_Helper')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'isSuccessful'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->responseMockDeliveryTypes->expects($this->any())
|
||||||
|
->method('isSuccessful')
|
||||||
|
->willReturn(true);
|
||||||
|
|
||||||
|
$this->responseMockDeliveryTypes->setResponse($this->getResponseDeliveryTypes());
|
||||||
|
$this->apiMock->expects($this->any())
|
||||||
|
->method('deliveryTypesList')
|
||||||
|
->willReturn($this->responseMockDeliveryTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setMockPaymentTypes()
|
||||||
|
{
|
||||||
|
$this->responseMockPaymentTypes = $this->getMockBuilder('\WC_Retailcrm_Response_Helper')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'isSuccessful'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->responseMockPaymentTypes->expects($this->any())
|
||||||
|
->method('isSuccessful')
|
||||||
|
->willReturn(true);
|
||||||
|
|
||||||
|
$this->responseMockPaymentTypes->setResponse($this->getResponsePaymentTypes());
|
||||||
|
$this->apiMock->expects($this->any())
|
||||||
|
->method('paymentTypesList')
|
||||||
|
->willReturn($this->responseMockPaymentTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setMockStatuses()
|
||||||
|
{
|
||||||
|
$this->responseMockStatuses = $this->getMockBuilder('\WC_Retailcrm_Response_Helper')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'isSuccessful'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->responseMockStatuses->expects($this->any())
|
||||||
|
->method('isSuccessful')
|
||||||
|
->willReturn(true);
|
||||||
|
|
||||||
|
$this->responseMockStatuses->setResponse($this->getResponseStatuses());
|
||||||
|
$this->apiMock->expects($this->any())
|
||||||
|
->method('statusesList')
|
||||||
|
->willReturn($this->responseMockStatuses);
|
||||||
|
}
|
||||||
|
}
|
132
tests/phpunit/test-wc-retailcrm-customers.php
Normal file
132
tests/phpunit/test-wc-retailcrm-customers.php
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class WC_Retailcrm_Customers_Test extends WC_Retailcrm_Test_Case_Helper
|
||||||
|
{
|
||||||
|
protected $apiMock;
|
||||||
|
protected $responseMock;
|
||||||
|
protected $customer;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
$this->responseMock = $this->getMockBuilder('\WC_Retailcrm_Response')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'isSuccessful'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->apiMock = $this->getMockBuilder('\WC_Retailcrm_Proxy')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'ordersGet',
|
||||||
|
'ordersUpload',
|
||||||
|
'ordersCreate',
|
||||||
|
'ordersEdit',
|
||||||
|
'customersGet',
|
||||||
|
'customersUpload',
|
||||||
|
'customersCreate',
|
||||||
|
'customersEdit'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->customer = new WC_Customer();
|
||||||
|
$this->customer->set_email(uniqid(md5(date('Y-m-d H:i:s'))) . '@mail.com');
|
||||||
|
$this->customer->set_password('password');
|
||||||
|
$this->customer->set_role(WC_Retailcrm_Customers::CUSTOMER_ROLE);
|
||||||
|
$this->customer->set_billing_phone('89000000000');
|
||||||
|
$this->customer->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param retailcrm
|
||||||
|
* @dataProvider dataProviderApiClient
|
||||||
|
*/
|
||||||
|
public function test_wc_customer_get($retailcrm)
|
||||||
|
{
|
||||||
|
$wc_customer = new WC_Customer($this->customer->get_id());
|
||||||
|
$retailcrm_customer = new WC_Retailcrm_Customers($retailcrm);
|
||||||
|
$this->assertEquals($wc_customer, $retailcrm_customer->wcCustomerGet($this->customer->get_id()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param retailcrm
|
||||||
|
* @dataProvider dataProviderApiClient
|
||||||
|
*/
|
||||||
|
public function test_customers_upload($retailcrm)
|
||||||
|
{
|
||||||
|
$retailcrm_customer = new WC_Retailcrm_Customers($retailcrm);
|
||||||
|
$data = $retailcrm_customer->customersUpload();
|
||||||
|
|
||||||
|
if ($retailcrm) {
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertInternalType('array', $data[0]);
|
||||||
|
$this->assertArrayHasKey('externalId', $data[0][0]);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(null, $data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $retailcrm
|
||||||
|
* @dataProvider dataProviderApiClient
|
||||||
|
*/
|
||||||
|
public function test_create_customer($retailcrm)
|
||||||
|
{
|
||||||
|
$retailcrm_customer = new WC_Retailcrm_Customers($retailcrm);
|
||||||
|
$customer = $retailcrm_customer->createCustomer($this->customer->get_id());
|
||||||
|
$customer_send = $retailcrm_customer->getCustomer();
|
||||||
|
|
||||||
|
if ($retailcrm) {
|
||||||
|
$this->assertArrayHasKey('externalId', $customer_send);
|
||||||
|
$this->assertArrayHasKey('firstName', $customer_send);
|
||||||
|
$this->assertArrayHasKey('createdAt', $customer_send);
|
||||||
|
$this->assertArrayHasKey('email', $customer_send);
|
||||||
|
$this->assertNotEmpty($customer_send['externalId']);
|
||||||
|
$this->assertNotEmpty($customer_send['firstName']);
|
||||||
|
$this->assertNotEmpty($customer_send['email']);
|
||||||
|
$this->assertInstanceOf('WC_Customer', $customer);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(null, $customer);
|
||||||
|
$this->assertEquals(array(), $customer_send);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $retailcrm
|
||||||
|
* @dataProvider dataProviderApiClient
|
||||||
|
*/
|
||||||
|
public function test_update_customer($retailcrm)
|
||||||
|
{
|
||||||
|
$retailcrm_customer = new WC_Retailcrm_Customers($retailcrm);
|
||||||
|
$customer = $retailcrm_customer->updateCustomer($this->customer->get_id());
|
||||||
|
$customer_send = $retailcrm_customer->getCustomer();
|
||||||
|
|
||||||
|
if ($retailcrm) {
|
||||||
|
$this->assertArrayHasKey('externalId', $customer_send);
|
||||||
|
$this->assertArrayHasKey('firstName', $customer_send);
|
||||||
|
$this->assertArrayHasKey('createdAt', $customer_send);
|
||||||
|
$this->assertArrayHasKey('email', $customer_send);
|
||||||
|
$this->assertNotEmpty($customer_send['externalId']);
|
||||||
|
$this->assertNotEmpty($customer_send['firstName']);
|
||||||
|
$this->assertNotEmpty($customer_send['email']);
|
||||||
|
$this->assertInstanceOf('WC_Customer', $customer);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(null, $customer);
|
||||||
|
$this->assertEquals(array(), $customer_send);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dataProviderApiClient()
|
||||||
|
{
|
||||||
|
$this->setUp();
|
||||||
|
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'retailcrm' => $this->apiMock
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'retailcrm' => false
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
123
tests/phpunit/test-wc-retailcrm-inventories.php
Normal file
123
tests/phpunit/test-wc-retailcrm-inventories.php
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class WC_Retailcrm_Inventories_Test extends WC_Retailcrm_Test_Case_Helper
|
||||||
|
{
|
||||||
|
protected $apiMock;
|
||||||
|
protected $responseMock;
|
||||||
|
protected $offer;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
$this->responseMock = $this->getMockBuilder('\WC_Retailcrm_Response_Helper')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'isSuccessful'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->apiMock = $this->getMockBuilder('\WC_Retailcrm_Proxy')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'storeInventories'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
parent::setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $retailcrm
|
||||||
|
* @param $response
|
||||||
|
*
|
||||||
|
* @dataProvider dataProviderLoadStocks
|
||||||
|
*/
|
||||||
|
public function test_load_stocks($retailcrm, $response)
|
||||||
|
{
|
||||||
|
$offer = WC_Helper_Product::create_simple_product();
|
||||||
|
$offer->save();
|
||||||
|
|
||||||
|
if ($response['success'] == true) {
|
||||||
|
$response['offers'][0]['externalId'] = $offer->get_id();
|
||||||
|
$this->responseMock->expects($this->any())
|
||||||
|
->method('isSuccessful')
|
||||||
|
->willReturn(true);
|
||||||
|
} elseif ($response['success'] == false) {
|
||||||
|
$this->responseMock->expects($this->any())
|
||||||
|
->method('isSuccessful')
|
||||||
|
->willReturn(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->responseMock->setResponse($response);
|
||||||
|
|
||||||
|
if ($retailcrm) {
|
||||||
|
$retailcrm->expects($this->any())
|
||||||
|
->method('storeInventories')
|
||||||
|
->willReturn($this->responseMock);
|
||||||
|
}
|
||||||
|
|
||||||
|
$retailcrm_inventories = new WC_Retailcrm_Inventories($retailcrm);
|
||||||
|
$result = $retailcrm_inventories->load_stocks();
|
||||||
|
|
||||||
|
if ($retailcrm && $response['success'] == true) {
|
||||||
|
$product = new WC_Product_Simple($result[0]);
|
||||||
|
$this->assertInstanceOf('WC_Product', $product);
|
||||||
|
$this->assertEquals(10, $product->get_stock_quantity());
|
||||||
|
$this->assertContains($product->get_id(), $result);
|
||||||
|
$this->assertInternalType('array', $result);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(null, $result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getResponseData()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'true' => array(
|
||||||
|
'success' => true,
|
||||||
|
'pagination' => array(
|
||||||
|
'limit' => 250,
|
||||||
|
'totalCount' => 1,
|
||||||
|
'currentPage' => 1,
|
||||||
|
'totalPageCount' => 1
|
||||||
|
),
|
||||||
|
'offers' => array(
|
||||||
|
array(
|
||||||
|
'id' => 1,
|
||||||
|
'xmlId' => 'xmlId',
|
||||||
|
'quantity' => 10
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
'false' => array(
|
||||||
|
'success' => false,
|
||||||
|
'errorMsg' => 'Forbidden'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dataProviderLoadStocks()
|
||||||
|
{
|
||||||
|
$this->setUp();
|
||||||
|
|
||||||
|
$response = $this->getResponseData();
|
||||||
|
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'retailcrm' => $this->apiMock,
|
||||||
|
'response' => $response['true']
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'retailcrm' => false,
|
||||||
|
'response' => $response['true']
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'retailcrm' => $this->apiMock,
|
||||||
|
'response' => $response['false']
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'retailcrm' => false,
|
||||||
|
'response' => $response['false']
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
285
tests/phpunit/test-wc-retailcrm-orders.php
Normal file
285
tests/phpunit/test-wc-retailcrm-orders.php
Normal file
@ -0,0 +1,285 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class WC_Retailcrm_Orders_Test extends WC_Retailcrm_Test_Case_Helper
|
||||||
|
{
|
||||||
|
protected $apiMock;
|
||||||
|
protected $responseMock;
|
||||||
|
protected $order;
|
||||||
|
protected $options;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
$this->apiMock = $this->getMockBuilder('\WC_Retailcrm_Proxy')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'ordersGet',
|
||||||
|
'ordersUpload',
|
||||||
|
'ordersCreate',
|
||||||
|
'ordersEdit',
|
||||||
|
'customersGet',
|
||||||
|
'customersCreate',
|
||||||
|
'ordersPaymentCreate',
|
||||||
|
'ordersPaymentDelete'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
parent::setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $retailcrm
|
||||||
|
* @param $apiVersion
|
||||||
|
* @dataProvider dataProviderRetailcrm
|
||||||
|
*/
|
||||||
|
public function test_order_upload($retailcrm, $apiVersion)
|
||||||
|
{
|
||||||
|
$this->options = $this->setOptions($apiVersion);
|
||||||
|
$retailcrm_orders = new WC_Retailcrm_Orders($retailcrm);
|
||||||
|
$upload_orders = $retailcrm_orders->ordersUpload();
|
||||||
|
|
||||||
|
if ($retailcrm) {
|
||||||
|
$this->assertInternalType('array', $upload_orders);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(null, $upload_orders);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $retailcrm
|
||||||
|
* @param $apiVersion
|
||||||
|
* @dataProvider dataProviderRetailcrm
|
||||||
|
*/
|
||||||
|
public function test_order_create($retailcrm, $apiVersion)
|
||||||
|
{
|
||||||
|
$this->createTestOrder();
|
||||||
|
$this->options = $this->setOptions($apiVersion);
|
||||||
|
$retailcrm_orders = new WC_Retailcrm_Orders($retailcrm);
|
||||||
|
$order = $retailcrm_orders->orderCreate($this->order->get_id());
|
||||||
|
$order_send = $retailcrm_orders->getOrder();
|
||||||
|
|
||||||
|
if ($retailcrm) {
|
||||||
|
$this->assertInstanceOf('WC_Order', $order);
|
||||||
|
$this->assertInternalType('array', $order_send);
|
||||||
|
$this->assertArrayHasKey('status', $order_send);
|
||||||
|
$this->assertArrayHasKey('externalId', $order_send);
|
||||||
|
$this->assertArrayHasKey('firstName', $order_send);
|
||||||
|
$this->assertArrayHasKey('lastName', $order_send);
|
||||||
|
$this->assertArrayHasKey('email', $order_send);
|
||||||
|
$this->assertArrayHasKey('delivery', $order_send);
|
||||||
|
$this->assertArrayHasKey('code', $order_send['delivery']);
|
||||||
|
$this->assertArrayHasKey('address', $order_send['delivery']);
|
||||||
|
$this->assertArrayHasKey('index', $order_send['delivery']['address']);
|
||||||
|
$this->assertArrayHasKey('city', $order_send['delivery']['address']);
|
||||||
|
$this->assertEquals($this->order->get_id(), $order_send['externalId']);
|
||||||
|
$this->assertEquals('status1', $order_send['status']);
|
||||||
|
$this->assertEquals('Jeroen', $order_send['firstName']);
|
||||||
|
$this->assertEquals('Sormani', $order_send['lastName']);
|
||||||
|
$this->assertEquals('admin@example.org', $order_send['email']);
|
||||||
|
$this->assertEquals('US', $order_send['countryIso']);
|
||||||
|
$this->assertEquals('123456', $order_send['delivery']['address']['index']);
|
||||||
|
$this->assertEquals('WooCity', $order_send['delivery']['address']['city']);
|
||||||
|
$this->assertEquals('delivery5', $order_send['delivery']['code']);
|
||||||
|
|
||||||
|
if ($apiVersion == 'v4') {
|
||||||
|
$this->assertArrayHasKey('paymentType', $order_send);
|
||||||
|
$this->assertEquals('payment1', $order_send['paymentType']);
|
||||||
|
} elseif ($apiVersion == 'v5') {
|
||||||
|
$this->assertArrayHasKey('payments', $order_send);
|
||||||
|
$this->assertInternalType('array', $order_send['payments']);
|
||||||
|
$this->assertArrayHasKey('type', $order_send['payments'][0]);
|
||||||
|
$this->assertEquals('payment1', $order_send['payments'][0]['type']);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(null, $order);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $isSuccessful
|
||||||
|
* @param $retailcrm
|
||||||
|
* @param $apiVersion
|
||||||
|
* @dataProvider dataProviderUpdateOrder
|
||||||
|
*/
|
||||||
|
public function test_update_order($isSuccessful, $retailcrm, $apiVersion)
|
||||||
|
{
|
||||||
|
$this->createTestOrder();
|
||||||
|
$this->options = $this->setOptions($apiVersion);
|
||||||
|
|
||||||
|
if ($retailcrm && $apiVersion == 'v5') {
|
||||||
|
$responseMock = $this->getMockBuilder('\WC_Retailcrm_Response_Helper')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods(array(
|
||||||
|
'isSuccessful'
|
||||||
|
))
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$responseMock->expects($this->any())
|
||||||
|
->method('isSuccessful')
|
||||||
|
->willReturn($isSuccessful);
|
||||||
|
|
||||||
|
$retailcrm->expects($this->any())
|
||||||
|
->method('ordersEdit')
|
||||||
|
->willReturn($responseMock);
|
||||||
|
|
||||||
|
$retailcrm->expects($this->any())
|
||||||
|
->method('ordersPaymentDelete')
|
||||||
|
->willReturn($responseMock);
|
||||||
|
|
||||||
|
$response = $this->getResponseData($this->order->get_id());
|
||||||
|
$responseMock->setResponse($response);
|
||||||
|
|
||||||
|
$retailcrm->expects($this->any())
|
||||||
|
->method('ordersGet')
|
||||||
|
->willReturn($responseMock);
|
||||||
|
}
|
||||||
|
|
||||||
|
$retailcrm_orders = new WC_Retailcrm_Orders($retailcrm);
|
||||||
|
$order = $retailcrm_orders->updateOrder($this->order->get_id());
|
||||||
|
$order_send = $retailcrm_orders->getOrder();
|
||||||
|
|
||||||
|
if ($retailcrm) {
|
||||||
|
$this->assertInstanceOf('WC_Order', $order);
|
||||||
|
$this->assertInternalType('array', $order_send);
|
||||||
|
$this->assertArrayHasKey('status', $order_send);
|
||||||
|
$this->assertArrayHasKey('externalId', $order_send);
|
||||||
|
$this->assertArrayHasKey('firstName', $order_send);
|
||||||
|
$this->assertArrayHasKey('lastName', $order_send);
|
||||||
|
$this->assertArrayHasKey('email', $order_send);
|
||||||
|
$this->assertArrayHasKey('delivery', $order_send);
|
||||||
|
$this->assertArrayHasKey('code', $order_send['delivery']);
|
||||||
|
$this->assertArrayHasKey('address', $order_send['delivery']);
|
||||||
|
$this->assertArrayHasKey('index', $order_send['delivery']['address']);
|
||||||
|
$this->assertArrayHasKey('city', $order_send['delivery']['address']);
|
||||||
|
$this->assertEquals($this->order->get_id(), $order_send['externalId']);
|
||||||
|
$this->assertEquals('status1', $order_send['status']);
|
||||||
|
$this->assertEquals('Jeroen', $order_send['firstName']);
|
||||||
|
$this->assertEquals('Sormani', $order_send['lastName']);
|
||||||
|
$this->assertEquals('admin@example.org', $order_send['email']);
|
||||||
|
$this->assertEquals('US', $order_send['countryIso']);
|
||||||
|
$this->assertEquals('123456', $order_send['delivery']['address']['index']);
|
||||||
|
$this->assertEquals('WooCity', $order_send['delivery']['address']['city']);
|
||||||
|
$this->assertEquals('delivery5', $order_send['delivery']['code']);
|
||||||
|
|
||||||
|
if ($apiVersion == 'v4') {
|
||||||
|
$this->assertArrayHasKey('paymentType', $order_send);
|
||||||
|
$this->assertEquals('payment1', $order_send['paymentType']);
|
||||||
|
} elseif ($apiVersion == 'v5') {
|
||||||
|
$payment = $retailcrm_orders->getPayment();
|
||||||
|
$this->assertInternalType('array', $payment);
|
||||||
|
|
||||||
|
if (!empty($payment)) {
|
||||||
|
$this->assertArrayHasKey('type', $payment);
|
||||||
|
$this->assertArrayHasKey('amount', $payment);
|
||||||
|
$this->assertArrayHasKey('order', $payment);
|
||||||
|
$this->assertEquals('payment1', $payment['type']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(null, $order);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dataProviderUpdateOrder()
|
||||||
|
{
|
||||||
|
$this->setUp();
|
||||||
|
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'is_successful' => true,
|
||||||
|
'retailcrm' => $this->apiMock,
|
||||||
|
'api_version' => 'v5'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'is_successful' => true,
|
||||||
|
'retailcrm' => false,
|
||||||
|
'api_version' => 'v5'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'is_successful' => false,
|
||||||
|
'retailcrm' => false,
|
||||||
|
'api_version' => 'v5'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'is_successful' => false,
|
||||||
|
'retailcrm' => $this->apiMock,
|
||||||
|
'api_version' => 'v5'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'is_successful' => false,
|
||||||
|
'retailcrm' => $this->apiMock,
|
||||||
|
'api_version' => 'v4'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'is_successful' => true,
|
||||||
|
'retailcrm' => $this->apiMock,
|
||||||
|
'api_version' => 'v4'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'is_successful' => false,
|
||||||
|
'retailcrm' => false,
|
||||||
|
'api_version' => 'v4'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'is_successful' => true,
|
||||||
|
'retailcrm' => false,
|
||||||
|
'api_version' => 'v4'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dataProviderRetailcrm()
|
||||||
|
{
|
||||||
|
$this->setUp();
|
||||||
|
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'retailcrm' => $this->apiMock,
|
||||||
|
'api_version' => 'v4'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'retailcrm' => false,
|
||||||
|
'api_version' => 'v4'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'retailcrm' => $this->apiMock,
|
||||||
|
'api_version' => 'v5'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'retailcrm' => false,
|
||||||
|
'api_version' => 'v5'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createTestOrder()
|
||||||
|
{
|
||||||
|
$this->order = WC_Helper_Order::create_order(0);
|
||||||
|
// var_dump($this->order);
|
||||||
|
// $this->order = new WC_Order();
|
||||||
|
// $this->order->set_payment_method('bacs');
|
||||||
|
// $this->order->set_billing_first_name('testFirstName');
|
||||||
|
// $this->order->set_billing_last_name('testLastName');
|
||||||
|
// $this->order->set_billing_country('RU');
|
||||||
|
// $this->order->set_billing_address_1('testAddress1');
|
||||||
|
// $this->order->set_billing_city('testCity');
|
||||||
|
// $this->order->set_billing_postcode('111111');
|
||||||
|
// $this->order->set_billing_email('test@mail.com');
|
||||||
|
// $this->order->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getResponseData($externalId)
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'success' => true,
|
||||||
|
'order' => array(
|
||||||
|
'payments' => array(
|
||||||
|
array(
|
||||||
|
'id' => 1,
|
||||||
|
'externalId' => $externalId,
|
||||||
|
'type' => 'payment2'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,527 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* RetailCRM Integration.
|
|
||||||
*
|
|
||||||
* @package WC_Retailcrm_Base
|
|
||||||
* @category Integration
|
|
||||||
* @author RetailCRM
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Base' ) ) :
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class WC_Retailcrm_Base
|
|
||||||
*/
|
|
||||||
class WC_Retailcrm_Base extends WC_Integration {
|
|
||||||
|
|
||||||
protected $api_url;
|
|
||||||
protected $api_key;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Init and hook in the integration.
|
|
||||||
*/
|
|
||||||
public function __construct() {
|
|
||||||
//global $woocommerce;
|
|
||||||
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Proxy' ) ) {
|
|
||||||
include_once( __DIR__ . '/api/class-wc-retailcrm-proxy.php' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->id = 'integration-retailcrm';
|
|
||||||
$this->method_title = __('RetailCRM', 'retailcrm');
|
|
||||||
$this->method_description = __('Integration with eComlogic managament system.', 'retailcrm');
|
|
||||||
|
|
||||||
// Load the settings.
|
|
||||||
|
|
||||||
$this->init_form_fields();
|
|
||||||
$this->init_settings();
|
|
||||||
|
|
||||||
// Actions.
|
|
||||||
add_action( 'woocommerce_update_options_integration_' . $this->id, array( $this, 'process_admin_options' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize integration settings form fields.
|
|
||||||
*/
|
|
||||||
public function init_form_fields() {
|
|
||||||
|
|
||||||
$this->form_fields = array(
|
|
||||||
array( 'title' => __( 'General Options', 'retailcrm' ), 'type' => 'title', 'desc' => '', 'id' => 'general_options' ),
|
|
||||||
|
|
||||||
'api_url' => array(
|
|
||||||
'title' => __( 'API URL', 'retailcrm' ),
|
|
||||||
'type' => 'text',
|
|
||||||
'description' => __( 'Enter with your API URL (https://yourdomain.ecomlogic.com).', 'retailcrm' ),
|
|
||||||
'desc_tip' => true,
|
|
||||||
'default' => ''
|
|
||||||
),
|
|
||||||
'api_key' => array(
|
|
||||||
'title' => __( 'API Key', 'retailcrm' ),
|
|
||||||
'type' => 'text',
|
|
||||||
'description' => __( 'Enter with your API Key. You can find this in eComlogic admin interface.', 'retailcrm' ),
|
|
||||||
'desc_tip' => true,
|
|
||||||
'default' => ''
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$api_version_list = array('v4' => 'v4','v5' => 'v5');
|
|
||||||
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __( 'API settings', 'retailcrm' ),
|
|
||||||
'type' => 'title',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'api_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->form_fields['api_version'] = array(
|
|
||||||
'title' => __( 'API version', 'retailcrm' ),
|
|
||||||
'description' => __( 'Select the API version you want to use', 'retailcrm' ),
|
|
||||||
'css' => 'min-width:50px;',
|
|
||||||
'class' => 'select',
|
|
||||||
'type' => 'select',
|
|
||||||
'options' => $api_version_list,
|
|
||||||
'desc_tip' => true,
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __( 'Catalog settings', 'retailcrm' ),
|
|
||||||
'type' => 'title',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'catalog_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach (get_post_statuses() as $status_key => $status_value) {
|
|
||||||
$this->form_fields['p_' . $status_key] = array(
|
|
||||||
'title' => $status_value,
|
|
||||||
'label' => ' ',
|
|
||||||
'description' => '',
|
|
||||||
'class' => 'checkbox',
|
|
||||||
'type' => 'checkbox',
|
|
||||||
'desc_tip' => true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->get_option( 'api_url' ) != '' && $this->get_option( 'api_key' ) != '') {
|
|
||||||
if (isset($_GET['page']) && $_GET['page'] == 'wc-settings' && isset($_GET['tab']) && $_GET['tab'] == 'integration') {
|
|
||||||
add_action('admin_print_footer_scripts', array($this, 'show_blocks'), 99);
|
|
||||||
|
|
||||||
$retailcrm = new WC_Retailcrm_Proxy(
|
|
||||||
$this->get_option( 'api_url' ),
|
|
||||||
$this->get_option( 'api_key' ),
|
|
||||||
$this->get_option( 'api_version')
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Order methods options
|
|
||||||
*/
|
|
||||||
$order_methods_option = array();
|
|
||||||
$order_methods_list = $retailcrm->orderMethodsList();
|
|
||||||
|
|
||||||
if ($order_methods_list->isSuccessful()) {
|
|
||||||
foreach ($order_methods_list['orderMethods'] as $order_method) {
|
|
||||||
if ($order_method['active'] == false) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$order_methods_option[$order_method['code']] = $order_method['name'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __('Order methods', 'retailcrm'),
|
|
||||||
'type' => 'heading',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'order_methods_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->form_fields['order_methods'] = array(
|
|
||||||
'label' => ' ',
|
|
||||||
'title' => __('Ordering methods available for downloading from eComlogic', 'retailcrm'),
|
|
||||||
'class' => '',
|
|
||||||
'type' => 'multiselect',
|
|
||||||
'description' => __('Select the order methods that will be uploaded from eComlogic to site', 'retailcrm'),
|
|
||||||
'options' => $order_methods_option,
|
|
||||||
'select_buttons' => true
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shipping options
|
|
||||||
*/
|
|
||||||
$shipping_option_list = array();
|
|
||||||
$retailcrm_shipping_list = $retailcrm->deliveryTypesList();
|
|
||||||
|
|
||||||
if ($retailcrm_shipping_list->isSuccessful()) {
|
|
||||||
foreach ($retailcrm_shipping_list['deliveryTypes'] as $retailcrm_shipping_type) {
|
|
||||||
$shipping_option_list[$retailcrm_shipping_type['code']] = $retailcrm_shipping_type['name'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$wc_shipping_list = get_wc_shipping_methods();
|
|
||||||
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __('Shipping methods', 'retailcrm'),
|
|
||||||
'type' => 'heading',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'shipping_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ( $wc_shipping_list as $shipping_code => $shipping ) {
|
|
||||||
if ( isset( $shipping['enabled'] ) && $shipping['enabled'] == 'yes' ) {
|
|
||||||
$this->form_fields[$shipping_code] = array(
|
|
||||||
'title' => __($shipping['title'], 'woocommerce'),
|
|
||||||
'description' => __($shipping['description'], 'woocommerce'),
|
|
||||||
'css' => 'min-width:350px;',
|
|
||||||
'class' => 'select',
|
|
||||||
'type' => 'select',
|
|
||||||
'options' => $shipping_option_list,
|
|
||||||
'desc_tip' => true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Payment options
|
|
||||||
*/
|
|
||||||
$payment_option_list = array();
|
|
||||||
$retailcrm_payment_list = $retailcrm->paymentTypesList();
|
|
||||||
|
|
||||||
if ($retailcrm_payment_list->isSuccessful()) {
|
|
||||||
foreach ($retailcrm_payment_list['paymentTypes'] as $retailcrm_payment_type) {
|
|
||||||
$payment_option_list[$retailcrm_payment_type['code']] = $retailcrm_payment_type['name'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$wc_payment = new WC_Payment_Gateways();
|
|
||||||
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __('Payment methods', 'retailcrm'),
|
|
||||||
'type' => 'heading',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'payment_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ( $wc_payment->payment_gateways as $payment ) {
|
|
||||||
if ( isset( $payment->enabled ) && $payment->enabled == 'yes' ) {
|
|
||||||
$key = $payment->id;
|
|
||||||
$name = $key;
|
|
||||||
$this->form_fields[$name] = array(
|
|
||||||
'title' => __($payment->method_title, 'woocommerce'),
|
|
||||||
'description' => __($payment->method_description, 'woocommerce'),
|
|
||||||
'css' => 'min-width:350px;',
|
|
||||||
'class' => 'select',
|
|
||||||
'type' => 'select',
|
|
||||||
'options' => $payment_option_list,
|
|
||||||
'desc_tip' => true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Statuses options
|
|
||||||
*/
|
|
||||||
$statuses_option_list = array();
|
|
||||||
$retailcrm_statuses_list = $retailcrm->statusesList();
|
|
||||||
|
|
||||||
if ($retailcrm_statuses_list->isSuccessful()) {
|
|
||||||
foreach ($retailcrm_statuses_list['statuses'] as $retailcrm_status) {
|
|
||||||
$statuses_option_list[$retailcrm_status['code']] = $retailcrm_status['name'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$wc_statuses = wc_get_order_statuses();
|
|
||||||
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __('Statuses', 'retailcrm'),
|
|
||||||
'type' => 'heading',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'statuses_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ( $wc_statuses as $idx => $name ) {
|
|
||||||
$uid = str_replace('wc-', '', $idx);
|
|
||||||
$this->form_fields[$uid] = array(
|
|
||||||
'title' => __($name, 'woocommerce'),
|
|
||||||
'css' => 'min-width:350px;',
|
|
||||||
'class' => 'select',
|
|
||||||
'type' => 'select',
|
|
||||||
'options' => $statuses_option_list,
|
|
||||||
'desc_tip' => true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inventories options
|
|
||||||
*/
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __('Inventories settings', 'retailcrm'),
|
|
||||||
'type' => 'heading',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'invent_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->form_fields['sync'] = array(
|
|
||||||
'label' => __('Sync inventories', 'retailcrm'),
|
|
||||||
'title' => __('Inventories', 'retailcrm'),
|
|
||||||
'class' => 'checkbox',
|
|
||||||
'type' => 'checkbox',
|
|
||||||
'description' => __('Check this checkbox if you want to unload the rest of the products from CRM to site.', 'retailcrm')
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* UA options
|
|
||||||
*/
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __('UA settings', 'retailcrm'),
|
|
||||||
'type' => 'heading',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'invent_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->form_fields['ua'] = array(
|
|
||||||
'label' => __('Activate UA', 'retailcrm'),
|
|
||||||
'title' => __('UA', 'retailcrm'),
|
|
||||||
'class' => 'checkbox',
|
|
||||||
'type' => 'checkbox',
|
|
||||||
'description' => __('Check this checkbox if you want to unload information to UA.', 'retailcrm')
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->form_fields['ua_code'] = array(
|
|
||||||
'title' => __('UA code', 'retailcrm'),
|
|
||||||
'class' => 'input',
|
|
||||||
'type' => 'input'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->form_fields['ua_custom'] = array(
|
|
||||||
'title' => __('Custom parameter', 'retailcrm'),
|
|
||||||
'class' => 'input',
|
|
||||||
'type' => 'input'
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Uploads options
|
|
||||||
*/
|
|
||||||
$options = array_filter(get_option( 'woocommerce_integration-retailcrm_settings' ));
|
|
||||||
|
|
||||||
if (!isset($options['uploads'])) {
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __('Uploads settings', 'retailcrm'),
|
|
||||||
'type' => 'heading',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'upload_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->form_fields['upload-button'] = array(
|
|
||||||
'label' => __('Upload', 'retailcrm'),
|
|
||||||
'title' => __('Upload all customers and orders', 'retailcrm' ),
|
|
||||||
'type' => 'button',
|
|
||||||
'description' => __('Batch unloading of existing customers and orders.', 'retailcrm' ),
|
|
||||||
'desc_tip' => true,
|
|
||||||
'id' => 'uploads-retailcrm'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Generate icml file
|
|
||||||
*/
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'title' => __( 'Generate ICML catalog', 'retailcrm' ),
|
|
||||||
'type' => 'title',
|
|
||||||
'description' => '',
|
|
||||||
'id' => 'icml_options'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->form_fields[] = array(
|
|
||||||
'label' => __('Generate', 'retailcrm'),
|
|
||||||
'title' => __('Generate ICML', 'retailcrm'),
|
|
||||||
'type' => 'button',
|
|
||||||
'description' => __('This functionality allows you to generate a catalog of products for downloading to CRM.', 'retailcrm'),
|
|
||||||
'desc_tip' => true,
|
|
||||||
'id' => 'icml-retailcrm'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate html button
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param array $data
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function generate_button_html( $key, $data ) {
|
|
||||||
$field = $this->plugin_id . $this->id . '_' . $key;
|
|
||||||
$defaults = array(
|
|
||||||
'class' => 'button-secondary',
|
|
||||||
'css' => '',
|
|
||||||
'custom_attributes' => array(),
|
|
||||||
'desc_tip' => false,
|
|
||||||
'description' => '',
|
|
||||||
'title' => '',
|
|
||||||
);
|
|
||||||
|
|
||||||
$data = wp_parse_args( $data, $defaults );
|
|
||||||
|
|
||||||
ob_start();
|
|
||||||
?>
|
|
||||||
<tr valign="top">
|
|
||||||
<th scope="row" class="titledesc">
|
|
||||||
<label for="<?php echo esc_attr( $field ); ?>"><?php echo wp_kses_post( $data['title'] ); ?></label>
|
|
||||||
<?php echo $this->get_tooltip_html( $data ); ?>
|
|
||||||
</th>
|
|
||||||
<td class="forminp">
|
|
||||||
<fieldset>
|
|
||||||
<legend class="screen-reader-text"><span><?php echo wp_kses_post( $data['label'] ); ?></span></legend>
|
|
||||||
<button id="<?php echo $data['id']; ?>" class="<?php echo esc_attr( $data['class'] ); ?>" type="button" name="<?php echo esc_attr( $field ); ?>" id="<?php echo esc_attr( $field ); ?>" style="<?php echo esc_attr( $data['css'] ); ?>" <?php echo $this->get_custom_attribute_html( $data ); ?>><?php echo wp_kses_post( $data['label'] ); ?></button>
|
|
||||||
<?php echo $this->get_description_html( $data ); ?>
|
|
||||||
</fieldset>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<?php
|
|
||||||
return ob_get_clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate html title block settings
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param array $data
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function generate_heading_html($key, $data) {
|
|
||||||
$field_key = $this->get_field_key( $key );
|
|
||||||
$defaults = array(
|
|
||||||
'title' => '',
|
|
||||||
'class' => '',
|
|
||||||
);
|
|
||||||
|
|
||||||
$data = wp_parse_args( $data, $defaults );
|
|
||||||
|
|
||||||
ob_start();
|
|
||||||
?>
|
|
||||||
</table>
|
|
||||||
<h2 class="wc-settings-sub-title retailcrm_hidden <?php echo esc_attr( $data['class'] ); ?>" id="<?php echo esc_attr( $field_key ); ?>"><?php echo wp_kses_post( $data['title'] ); ?> <span style="opacity:0.5;float: right;">⬇</span></h2>
|
|
||||||
<?php if ( ! empty( $data['description'] ) ) : ?>
|
|
||||||
<p><?php echo wp_kses_post( $data['description'] ); ?></p>
|
|
||||||
<?php endif; ?>
|
|
||||||
<table class="form-table" style="display: none;">
|
|
||||||
<?php
|
|
||||||
|
|
||||||
return ob_get_clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate API version
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param string $value
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function validate_api_version_field( $key, $value ) {
|
|
||||||
$post = $this->get_post_data();
|
|
||||||
|
|
||||||
$versionMap = array(
|
|
||||||
'v4' => '4.0',
|
|
||||||
'v5' => '5.0'
|
|
||||||
);
|
|
||||||
|
|
||||||
$api = new WC_Retailcrm_Proxy(
|
|
||||||
$post[$this->plugin_id . $this->id . '_api_url'],
|
|
||||||
$post[$this->plugin_id . $this->id . '_api_key']
|
|
||||||
);
|
|
||||||
|
|
||||||
$response = $api->apiVersions();
|
|
||||||
|
|
||||||
if ($response && $response->isSuccessful()) {
|
|
||||||
if (!in_array($versionMap[$value], $response['versions'])) {
|
|
||||||
WC_Admin_Settings::add_error( esc_html__( 'The selected version of the API is unavailable', 'retailcrm' ) );
|
|
||||||
$value = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate API url
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param string $value
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function validate_api_url_field( $key, $value ) {
|
|
||||||
$post = $this->get_post_data();
|
|
||||||
$api = new WC_Retailcrm_Proxy(
|
|
||||||
$value,
|
|
||||||
$post[$this->plugin_id . $this->id . '_api_key']
|
|
||||||
);
|
|
||||||
|
|
||||||
$response = $api->apiVersions();
|
|
||||||
|
|
||||||
if ($response == NULL) {
|
|
||||||
WC_Admin_Settings::add_error( esc_html__( 'Enter the correct CRM address', 'retailcrm' ) );
|
|
||||||
$value = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate API key
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param string $value
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function validate_api_key_field( $key, $value ) {
|
|
||||||
$post = $this->get_post_data();
|
|
||||||
$api = new WC_Retailcrm_Proxy(
|
|
||||||
$post[$this->plugin_id . $this->id . '_api_url'],
|
|
||||||
$value
|
|
||||||
);
|
|
||||||
|
|
||||||
$response = $api->apiVersions();
|
|
||||||
|
|
||||||
if (!is_object($response)) {
|
|
||||||
$value = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$response->isSuccessful()) {
|
|
||||||
WC_Admin_Settings::add_error( esc_html__( 'Enter the correct API key', 'retailcrm' ) );
|
|
||||||
$value = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Scritp show|hide block settings
|
|
||||||
*/
|
|
||||||
function show_blocks() {
|
|
||||||
?>
|
|
||||||
<script type="text/javascript">
|
|
||||||
jQuery('h2.retailcrm_hidden').hover().css({
|
|
||||||
'cursor':'pointer',
|
|
||||||
'width':'300px'
|
|
||||||
});
|
|
||||||
jQuery('h2.retailcrm_hidden').toggle(
|
|
||||||
function() {
|
|
||||||
jQuery(this).next('table.form-table').show(100);
|
|
||||||
jQuery(this).find('span').html('⬆');
|
|
||||||
},
|
|
||||||
function() {
|
|
||||||
jQuery(this).next('table.form-table').hide(100);
|
|
||||||
jQuery(this).find('span').html('⬇');
|
|
||||||
}
|
|
||||||
);
|
|
||||||
</script>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
endif;
|
|
@ -1,151 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* RetailCRM Integration.
|
|
||||||
*
|
|
||||||
* @package WC_Retailcrm_Customers
|
|
||||||
* @category Integration
|
|
||||||
* @author RetailCRM
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Customers' ) ) :
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class WC_Retailcrm_Customers
|
|
||||||
*/
|
|
||||||
class WC_Retailcrm_Customers
|
|
||||||
{
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->retailcrm_settings = get_option( 'woocommerce_integration-retailcrm_settings' );
|
|
||||||
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Proxy' ) ) {
|
|
||||||
include_once( WP_PLUGIN_DIR . '/woo-retailcrm/include/api/class-wc-retailcrm-proxy.php' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->retailcrm = new WC_Retailcrm_Proxy(
|
|
||||||
$this->retailcrm_settings['api_url'],
|
|
||||||
$this->retailcrm_settings['api_key'],
|
|
||||||
$this->retailcrm_settings['api_version']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Upload customers to CRM
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function customersUpload()
|
|
||||||
{
|
|
||||||
$users = get_users();
|
|
||||||
$data_customers = array();
|
|
||||||
|
|
||||||
foreach ($users as $user) {
|
|
||||||
if (!in_array('customer', $user->roles)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$customer = new WC_Customer($user->ID);
|
|
||||||
$firstName = $customer->get_first_name();
|
|
||||||
$data_customer = array(
|
|
||||||
'createdAt' => $user->data->user_registered,
|
|
||||||
'externalId' => $user->ID,
|
|
||||||
'firstName' => $firstName ? $firstName : $customer->get_username(),
|
|
||||||
'lastName' => $customer->get_last_name(),
|
|
||||||
'email' => $user->data->user_email,
|
|
||||||
'address' => array(
|
|
||||||
'index' => $customer->get_billing_postcode(),
|
|
||||||
'countryIso' => $customer->get_billing_country(),
|
|
||||||
'region' => $customer->get_billing_state(),
|
|
||||||
'city' => $customer->get_billing_city(),
|
|
||||||
'text' => $customer->get_billing_address_1() . ',' . $customer->get_billing_address_2()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($customer->get_billing_phone()) {
|
|
||||||
$data_customer['phones'][] = array(
|
|
||||||
'number' => $customer->get_billing_phone()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$data_customers[] = $data_customer;
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = array_chunk($data_customers, 50);
|
|
||||||
|
|
||||||
foreach ($data as $array_customers) {
|
|
||||||
$this->retailcrm->customersUpload($array_customers);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create customer in CRM
|
|
||||||
*
|
|
||||||
* @param int $customer_id
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function createCustomer($customer_id)
|
|
||||||
{
|
|
||||||
$customer = new WC_Customer($customer_id);
|
|
||||||
|
|
||||||
if ($customer->get_role() == 'customer'){
|
|
||||||
$data_customer = $this->processCustomer($customer);
|
|
||||||
|
|
||||||
$this->retailcrm->customersCreate($data_customer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Edit customer in CRM
|
|
||||||
*
|
|
||||||
* @param int $customer_id
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function updateCustomer($customer_id)
|
|
||||||
{
|
|
||||||
$customer = new WC_Customer($customer_id);
|
|
||||||
|
|
||||||
if ($customer->get_role() == 'customer'){
|
|
||||||
$data_customer = $this->processCustomer($customer);
|
|
||||||
|
|
||||||
$this->retailcrm->customersEdit($data_customer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Process customer
|
|
||||||
*
|
|
||||||
* @param object $customer
|
|
||||||
*
|
|
||||||
* @return array $data_customer
|
|
||||||
*/
|
|
||||||
protected function processCustomer($customer)
|
|
||||||
{
|
|
||||||
$createdAt = $customer->get_date_created();
|
|
||||||
$firstName = $customer->get_first_name();
|
|
||||||
$data_customer = array(
|
|
||||||
'createdAt' => $createdAt->date('Y-m-d H:i:s'),
|
|
||||||
'externalId' => $customer->get_id(),
|
|
||||||
'firstName' => $firstName ? $firstName : $customer->get_username(),
|
|
||||||
'lastName' => $customer->get_last_name(),
|
|
||||||
'email' => $customer->get_email(),
|
|
||||||
'address' => array(
|
|
||||||
'index' => $customer->get_billing_postcode(),
|
|
||||||
'countryIso' => $customer->get_billing_country(),
|
|
||||||
'region' => $customer->get_billing_state(),
|
|
||||||
'city' => $customer->get_billing_city(),
|
|
||||||
'text' => $customer->get_billing_address_1() . ',' . $customer->get_billing_address_2()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($customer->get_billing_phone()) {
|
|
||||||
$data_customer['phones'][] = array(
|
|
||||||
'number' => $customer->get_billing_phone()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $data_customer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endif;
|
|
@ -1,70 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* RetailCRM Integration.
|
|
||||||
*
|
|
||||||
* @package WC_Retailcrm_Inventories
|
|
||||||
* @category Integration
|
|
||||||
* @author RetailCRM
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Inventories' ) ) :
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class WC_Retailcrm_Inventories
|
|
||||||
*/
|
|
||||||
class WC_Retailcrm_Inventories
|
|
||||||
{
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->retailcrm_settings = get_option( 'woocommerce_integration-retailcrm_settings' );
|
|
||||||
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Proxy' ) ) {
|
|
||||||
include_once( WP_PLUGIN_DIR . '/woo-retailcrm/include/api/class-wc-retailcrm-proxy.php' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->retailcrm = new WC_Retailcrm_Proxy(
|
|
||||||
$this->retailcrm_settings['api_url'],
|
|
||||||
$this->retailcrm_settings['api_key'],
|
|
||||||
$this->retailcrm_settings['api_version']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function load_stocks()
|
|
||||||
{
|
|
||||||
$page = 1;
|
|
||||||
|
|
||||||
do {
|
|
||||||
$result = $this->retailcrm->storeInventories(array(), $page, 250);
|
|
||||||
$totalPageCount = $result['pagination']['totalPageCount'];
|
|
||||||
$page++;
|
|
||||||
|
|
||||||
foreach ($result['offers'] as $offer) {
|
|
||||||
if (isset($offer['externalId'])) {
|
|
||||||
$product = wc_get_product($offer['externalId']);
|
|
||||||
|
|
||||||
if ($product != false) {
|
|
||||||
if ($product->get_type() == 'variable') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
update_post_meta($offer['externalId'], '_manage_stock', 'yes');
|
|
||||||
$product->set_stock_quantity($offer['quantity']);
|
|
||||||
$product->save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} while ($page <= $totalPageCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function updateQuantity()
|
|
||||||
{
|
|
||||||
$options = array_filter(get_option( 'woocommerce_integration-retailcrm_settings' ));
|
|
||||||
|
|
||||||
if ($options['sync'] == 'yes') {
|
|
||||||
$this->load_stocks();
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endif;
|
|
@ -1,475 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Version: 2.1.4
|
|
||||||
* Plugin Name: WooCommerce RetailCRM
|
|
||||||
* Plugin URI: https://wordpress.org/plugins/woo-retailcrm/
|
|
||||||
* Description: Integration plugin for WooCommerce & RetailCRM
|
|
||||||
* Author: RetailDriver LLC
|
|
||||||
* Author URI: http://retailcrm.ru/
|
|
||||||
* Text Domain: retailcrm
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( ! defined( 'ABSPATH' ) ) {
|
|
||||||
exit; // Exit if accessed directly
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!class_exists( 'WC_Integration_Retailcrm')) :
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class WC_Integration_Retailcrm
|
|
||||||
*/
|
|
||||||
class WC_Integration_Retailcrm {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct the plugin.
|
|
||||||
*/
|
|
||||||
public function __construct() {
|
|
||||||
add_action( 'plugins_loaded', array( $this, 'init' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the plugin.
|
|
||||||
*/
|
|
||||||
public function init() {
|
|
||||||
if ( class_exists( 'WC_Integration' ) ) {
|
|
||||||
include_once 'include/class-wc-retailcrm-base.php';
|
|
||||||
include_once 'include/functions.php';
|
|
||||||
add_filter( 'woocommerce_integrations', array( $this, 'add_integration' ) );
|
|
||||||
} else {
|
|
||||||
// throw an admin error if you like
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a new integration to WooCommerce.
|
|
||||||
*
|
|
||||||
* @param $integrations
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function add_integration( $integrations ) {
|
|
||||||
$integrations[] = 'WC_Retailcrm_Base';
|
|
||||||
return $integrations;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
$WC_Integration_Retailcrm = new WC_Integration_Retailcrm( __FILE__ );
|
|
||||||
endif;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check icml custom class
|
|
||||||
*/
|
|
||||||
function check_custom_icml()
|
|
||||||
{
|
|
||||||
if (file_exists( WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-icml.php' )) {
|
|
||||||
$file = WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-icml.php';
|
|
||||||
} else {
|
|
||||||
$file = __DIR__ . '/include/class-wc-retailcrm-icml.php';
|
|
||||||
}
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check orders custom class
|
|
||||||
*/
|
|
||||||
function check_custom_orders()
|
|
||||||
{
|
|
||||||
if (file_exists( WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-orders.php' )) {
|
|
||||||
$file = WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-orders.php';
|
|
||||||
} else {
|
|
||||||
$file = __DIR__ . '/include/class-wc-retailcrm-orders.php';
|
|
||||||
}
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check customers custom class
|
|
||||||
*/
|
|
||||||
function check_custom_customers()
|
|
||||||
{
|
|
||||||
if (file_exists( WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-customers.php' )) {
|
|
||||||
$file = WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-customers.php';
|
|
||||||
} else {
|
|
||||||
$file = __DIR__ . '/include/class-wc-retailcrm-customers.php';
|
|
||||||
}
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check inventories custom class
|
|
||||||
*/
|
|
||||||
function check_custom_inventories()
|
|
||||||
{
|
|
||||||
if (file_exists( WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-inventories.php' )) {
|
|
||||||
$file = WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-inventories.php';
|
|
||||||
} else {
|
|
||||||
$file = __DIR__ . '/include/class-wc-retailcrm-inventories.php';
|
|
||||||
}
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check history custom class
|
|
||||||
*/
|
|
||||||
function check_custom_history()
|
|
||||||
{
|
|
||||||
if (file_exists( WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-history.php' )) {
|
|
||||||
$file = WP_CONTENT_DIR . '/retailcrm-custom/class-wc-retailcrm-history.php';
|
|
||||||
} else {
|
|
||||||
$file = __DIR__ . '/include/class-wc-retailcrm-history.php';
|
|
||||||
}
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Activation action
|
|
||||||
*/
|
|
||||||
function retailcrm_install()
|
|
||||||
{
|
|
||||||
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option( 'active_plugins')))) {
|
|
||||||
generate_icml();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deactivation action
|
|
||||||
*/
|
|
||||||
function retailcrm_deactivation()
|
|
||||||
{
|
|
||||||
if ( wp_next_scheduled ( 'retailcrm_icml' )) {
|
|
||||||
wp_clear_scheduled_hook('retailcrm_icml');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load stocks from CRM
|
|
||||||
*/
|
|
||||||
function load_stocks()
|
|
||||||
{
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Inventories' ) ) {
|
|
||||||
include_once( check_custom_inventories() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$inventories = new WC_Retailcrm_Inventories();
|
|
||||||
$inventories->updateQuantity();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate ICML file
|
|
||||||
*/
|
|
||||||
function generate_icml()
|
|
||||||
{
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Icml' ) ) {
|
|
||||||
include_once( check_custom_icml() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$icml = new WC_Retailcrm_Icml();
|
|
||||||
$icml->generate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create order
|
|
||||||
*
|
|
||||||
* @param $order_id
|
|
||||||
*/
|
|
||||||
function retailcrm_process_order($order_id)
|
|
||||||
{
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) {
|
|
||||||
include_once( check_custom_orders() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$order_class = new WC_Retailcrm_Orders();
|
|
||||||
$order_class->orderCreate($order_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update order status
|
|
||||||
*
|
|
||||||
* @param $order_id
|
|
||||||
*/
|
|
||||||
function retailcrm_update_order_status($order_id)
|
|
||||||
{
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) {
|
|
||||||
include_once( check_custom_orders() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$order_class = new WC_Retailcrm_Orders();
|
|
||||||
$order_class->orderUpdateStatus($order_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update order payment
|
|
||||||
*
|
|
||||||
* @param $order_id
|
|
||||||
*/
|
|
||||||
function retailcrm_update_order_payment($order_id)
|
|
||||||
{
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) {
|
|
||||||
include_once( check_custom_orders() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$order_class = new WC_Retailcrm_Orders();
|
|
||||||
$order_class->orderUpdatePayment($order_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update order items
|
|
||||||
*
|
|
||||||
* @param $order_id, $data
|
|
||||||
*/
|
|
||||||
function retailcrm_update_order_items($order_id, $data)
|
|
||||||
{
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) {
|
|
||||||
include_once( check_custom_orders() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$order_class = new WC_Retailcrm_Orders();
|
|
||||||
$order_class->orderUpdateItems($order_id, $data);
|
|
||||||
}
|
|
||||||
|
|
||||||
function retailcrm_history_get()
|
|
||||||
{
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_History' ) ) {
|
|
||||||
include_once( check_custom_history() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$history_class = new WC_Retailcrm_History();
|
|
||||||
$history_class->getHistory();
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_customer($customer_id) {
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Customers' ) ) {
|
|
||||||
include_once( check_custom_customers() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$customer_class = new WC_Retailcrm_Customers();
|
|
||||||
$customer_class->createCustomer($customer_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_customer($customer_id) {
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Customers' ) ) {
|
|
||||||
include_once( check_custom_customers() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$customer_class = new WC_Retailcrm_Customers();
|
|
||||||
$customer_class->updateCustomer($customer_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
function register_icml_generation() {
|
|
||||||
// Make sure this event hasn't been scheduled
|
|
||||||
if( !wp_next_scheduled( 'retailcrm_icml' ) ) {
|
|
||||||
// Schedule the event
|
|
||||||
wp_schedule_event( time(), 'three_hours', 'retailcrm_icml' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function register_retailcrm_history() {
|
|
||||||
// Make sure this event hasn't been scheduled
|
|
||||||
if( !wp_next_scheduled( 'retailcrm_history' ) ) {
|
|
||||||
// Schedule the event
|
|
||||||
wp_schedule_event( time(), 'five_minutes', 'retailcrm_history' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_inventories() {
|
|
||||||
if( !wp_next_scheduled( 'retailcrm_inventories' ) ) {
|
|
||||||
// Schedule the event
|
|
||||||
wp_schedule_event( time(), 'fiveteen_minutes', 'retailcrm_inventories' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function filter_cron_schedules($param) {
|
|
||||||
return array(
|
|
||||||
'five_minutes' => array(
|
|
||||||
'interval' => 300, // seconds
|
|
||||||
'display' => __('Every 5 minutes')
|
|
||||||
),
|
|
||||||
'three_hours' => array(
|
|
||||||
'interval' => 10800, // seconds
|
|
||||||
'display' => __('Every 3 hours')
|
|
||||||
),
|
|
||||||
'fiveteen_minutes' => array(
|
|
||||||
'interval' => 900, // seconds
|
|
||||||
'display' => __('Every 15 minutes')
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function upload_to_crm() {
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) {
|
|
||||||
include_once( check_custom_orders() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Customers' ) ) {
|
|
||||||
include_once( check_custom_customers() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$options = array_filter(get_option( 'woocommerce_integration-retailcrm_settings' ));
|
|
||||||
|
|
||||||
$orders = new WC_Retailcrm_Orders();
|
|
||||||
$customers = new WC_Retailcrm_Customers();
|
|
||||||
$customers->customersUpload();
|
|
||||||
$orders->ordersUpload();
|
|
||||||
|
|
||||||
$options['uploads'] = 'yes';
|
|
||||||
update_option('woocommerce_integration-retailcrm_settings', $options);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ajax_upload() {
|
|
||||||
$ajax_url = admin_url('admin-ajax.php');
|
|
||||||
?>
|
|
||||||
<script type="text/javascript" >
|
|
||||||
jQuery('#uploads-retailcrm').bind('click', function() {
|
|
||||||
jQuery.ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: '<?php echo $ajax_url; ?>?action=do_upload',
|
|
||||||
success: function (response) {
|
|
||||||
alert('<?php echo __('Customers and orders were unloaded', 'retailcrm'); ?>');
|
|
||||||
console.log('AJAX response : ',response);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
function ajax_generate_icml() {
|
|
||||||
$ajax_url = admin_url('admin-ajax.php');
|
|
||||||
?>
|
|
||||||
<script type="text/javascript" >
|
|
||||||
jQuery('#icml-retailcrm').bind('click', function() {
|
|
||||||
jQuery.ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: '<?php echo $ajax_url; ?>?action=generate_icml',
|
|
||||||
success: function (response) {
|
|
||||||
alert('<?php echo __('Catalog were generated', 'retailcrm'); ?>');
|
|
||||||
console.log('AJAX response : ',response);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_order($order_id) {
|
|
||||||
if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) {
|
|
||||||
include_once( check_custom_orders() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$order_class = new WC_Retailcrm_Orders();
|
|
||||||
$order_class->updateOrder($order_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
function initialize_analytics() {
|
|
||||||
$options = get_option('woocommerce_integration-retailcrm_settings');
|
|
||||||
|
|
||||||
if ($options && is_array($options)) {
|
|
||||||
$options = array_filter($options);
|
|
||||||
|
|
||||||
if (isset($options['ua']) && $options['ua'] == 'yes') {
|
|
||||||
?>
|
|
||||||
<script>
|
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
|
||||||
|
|
||||||
ga('create', '<?php echo $options['ua_code']; ?>', 'auto');
|
|
||||||
|
|
||||||
function getRetailCrmCookie(name) {
|
|
||||||
var matches = document.cookie.match(new RegExp(
|
|
||||||
'(?:^|; )' + name + '=([^;]*)'
|
|
||||||
));
|
|
||||||
return matches ? decodeURIComponent(matches[1]) : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
ga('set', 'dimension<?php echo $options['ua_custom']; ?>', getRetailCrmCookie('_ga'));
|
|
||||||
ga('send', 'pageview');
|
|
||||||
</script>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function send_analytics() {
|
|
||||||
$options = get_option('woocommerce_integration-retailcrm_settings');
|
|
||||||
|
|
||||||
if ($options && is_array($options)) {
|
|
||||||
$options = array_filter($options);
|
|
||||||
|
|
||||||
if (isset($_GET['key']) && isset($options['ua']) && $options['ua'] == 'yes') {
|
|
||||||
$orderid = wc_get_order_id_by_order_key($_GET['key']);
|
|
||||||
$order = new WC_Order($orderid);
|
|
||||||
foreach ($order->get_items() as $item) {
|
|
||||||
$uid = ($item['variation_id'] > 0) ? $item['variation_id'] : $item['product_id'] ;
|
|
||||||
$_product = wc_get_product($uid);
|
|
||||||
if ($_product) {
|
|
||||||
$order_item = array(
|
|
||||||
'id' => $uid,
|
|
||||||
'name' => $item['name'],
|
|
||||||
'price' => (float)$_product->get_price(),
|
|
||||||
'quantity' => $item['qty'],
|
|
||||||
);
|
|
||||||
|
|
||||||
$order_items[] = $order_item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$url = parse_url(get_site_url());
|
|
||||||
$domain = $url['host'];
|
|
||||||
?>
|
|
||||||
<script type="text/javascript">
|
|
||||||
ga('require', 'ecommerce', 'ecommerce.js');
|
|
||||||
ga('ecommerce:addTransaction', {
|
|
||||||
'id': <?php echo $order->get_id(); ?>,
|
|
||||||
'affiliation': '<?php echo $domain; ?>',
|
|
||||||
'revenue': <?php echo $order->get_total(); ?>,
|
|
||||||
'shipping': <?php echo $order->get_total_tax(); ?>,
|
|
||||||
'tax': <?php echo $order->get_shipping_total(); ?>
|
|
||||||
});
|
|
||||||
<?php
|
|
||||||
foreach ($order_items as $item) {?>
|
|
||||||
ga('ecommerce:addItem', {
|
|
||||||
'id': <?php echo $order->get_id(); ?>,
|
|
||||||
'sku': <?php echo $item['id']; ?>,
|
|
||||||
'name': '<?php echo $item['name']; ?>',
|
|
||||||
'price': <?php echo $item['price']; ?>,
|
|
||||||
'quantity': <?php echo $item['quantity']; ?>
|
|
||||||
});
|
|
||||||
<?php
|
|
||||||
}?>
|
|
||||||
ga('ecommerce:send');
|
|
||||||
</script>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function retailcrm_load_plugin_textdomain() {
|
|
||||||
load_plugin_textdomain('retailcrm', FALSE, basename( dirname( __FILE__ ) ) . '/languages/');
|
|
||||||
}
|
|
||||||
|
|
||||||
register_activation_hook( __FILE__, 'retailcrm_install' );
|
|
||||||
register_deactivation_hook( __FILE__, 'retailcrm_deactivation' );
|
|
||||||
|
|
||||||
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option( 'active_plugins')))) {
|
|
||||||
add_action('plugins_loaded', 'retailcrm_load_plugin_textdomain');
|
|
||||||
add_filter('cron_schedules', 'filter_cron_schedules', 10, 1);
|
|
||||||
add_action('woocommerce_checkout_order_processed', 'retailcrm_process_order', 10, 1);
|
|
||||||
add_action('retailcrm_history', 'retailcrm_history_get');
|
|
||||||
add_action('retailcrm_icml', 'generate_icml');
|
|
||||||
add_action('retailcrm_inventories', 'load_stocks');
|
|
||||||
add_action('init', 'check_inventories');
|
|
||||||
add_action('init', 'register_icml_generation');
|
|
||||||
add_action('init', 'register_retailcrm_history');
|
|
||||||
add_action('wp_ajax_do_upload', 'upload_to_crm');
|
|
||||||
add_action('wp_ajax_generate_icml', 'generate_icml');
|
|
||||||
add_action('admin_print_footer_scripts', 'ajax_upload', 99);
|
|
||||||
add_action('admin_print_footer_scripts', 'ajax_generate_icml', 99);
|
|
||||||
add_action('woocommerce_created_customer', 'create_customer', 10, 1);
|
|
||||||
add_action('woocommerce_update_customer', 'update_customer', 10, 1);
|
|
||||||
add_action('woocommerce_update_order', 'update_order', 11, 1);
|
|
||||||
add_action('wp_print_scripts', 'initialize_analytics', 98);
|
|
||||||
add_action('wp_print_footer_scripts', 'send_analytics', 99);
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user