├── .docker
└── Dockerfile
├── .env-dist
├── .github
└── workflows
│ └── woo.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── Makefile
├── README.md
├── VERSION
├── composer.json
├── composer.lock
├── doc
├── 1.Setup
│ ├── Abandoned carts settings.md
│ ├── Catalog settings.md
│ ├── Cron tasks.md
│ ├── Custom fields settings.md
│ ├── Debug information.md
│ ├── Delivery methods.md
│ ├── Generating ICML catalog.md
│ ├── Loading data from CRM.md
│ ├── Loading orders.md
│ ├── Main Settings.md
│ ├── Methods order registration.md
│ ├── Order statuses.md
│ ├── Payment methods.md
│ ├── Setting WhatsApp.md
│ ├── Setting stock.md
│ ├── Settings order number.md
│ ├── Settings.md
│ ├── Updating data in CRM.md
│ ├── User roles.md
│ └── Сorporate сlients.md
├── 2. Workflow
│ ├── Client Registration.md
│ ├── Address.md
│ └── Order statuses.md
├── 3. Customization
│ └── Filters.md
├── 4. Known issues
│ └── Issues.md
├── FAQ
│ └── FAQ.md
└── README.md
├── docker-compose.yml
├── phpunit.xml.dist
├── resources
└── pot
│ ├── retailcrm-es_ES.pot
│ └── retailcrm-ru_RU.pot
├── src
├── assets
│ ├── css
│ │ ├── debug-info.css
│ │ ├── debug-info.min.css
│ │ ├── meta-fields.css
│ │ ├── meta-fields.min.css
│ │ ├── progress-bar.css
│ │ ├── progress-bar.min.css
│ │ ├── retailcrm-loyalty-style.css
│ │ ├── whatsapp-icon.css
│ │ └── whatsapp-icon.min.css
│ ├── default
│ │ └── default_meta_fields.txt
│ └── js
│ │ ├── retailcrm-cron-info.js
│ │ ├── retailcrm-export.js
│ │ ├── retailcrm-loyalty-actions.js
│ │ ├── retailcrm-loyalty-cart.js
│ │ ├── retailcrm-loyalty.js
│ │ ├── retailcrm-meta-fields.js
│ │ ├── retailcrm-module-settings.js
│ │ ├── retailcrm-tracker-interface.js
│ │ └── retailcrm-tracker.js
├── config
│ └── objects.xml
├── include
│ ├── abstracts
│ │ ├── class-wc-retailcrm-abstract-builder.php
│ │ ├── class-wc-retailcrm-abstracts-address.php
│ │ ├── class-wc-retailcrm-abstracts-data.php
│ │ └── class-wc-retailcrm-abstracts-settings.php
│ ├── api
│ │ ├── class-wc-retailcrm-client-v5.php
│ │ ├── class-wc-retailcrm-exception-curl.php
│ │ ├── class-wc-retailcrm-exception-json.php
│ │ ├── class-wc-retailcrm-proxy.php
│ │ ├── class-wc-retailcrm-request.php
│ │ ├── class-wc-retailcrm-response.php
│ │ └── index.php
│ ├── class-wc-retailcrm-base.php
│ ├── class-wc-retailcrm-cart.php
│ ├── class-wc-retailcrm-customers.php
│ ├── class-wc-retailcrm-daemon-collector.php
│ ├── class-wc-retailcrm-ga.php
│ ├── class-wc-retailcrm-history.php
│ ├── class-wc-retailcrm-icml.php
│ ├── class-wc-retailcrm-inventories.php
│ ├── class-wc-retailcrm-loyalty.php
│ ├── class-wc-retailcrm-orders.php
│ ├── class-wc-retailcrm-plugin.php
│ ├── class-wc-retailcrm-upload-discount-price.php
│ ├── class-wc-retailcrm-uploader.php
│ ├── components
│ │ ├── class-wc-retailcrm-customer-switcher.php
│ │ ├── class-wc-retailcrm-history-assembler.php
│ │ ├── class-wc-retailcrm-logger.php
│ │ └── class-wc-retailcrm-loyalty-form.php
│ ├── customer
│ │ ├── class-wc-retailcrm-customer-address.php
│ │ ├── class-wc-retailcrm-customer-corporate-address.php
│ │ └── woocommerce
│ │ │ └── class-wc-retailcrm-wc-customer-builder.php
│ ├── functions.php
│ ├── icml
│ │ └── class-wc-retailcrm-icml-writer.php
│ ├── index.php
│ ├── interfaces
│ │ └── class-wc-retailcrm-builder-interface.php
│ ├── models
│ │ ├── class-wc-retailcrm-customer-switcher-result.php
│ │ └── class-wc-retailcrm-customer-switcher-state.php
│ ├── order
│ │ ├── class-wc-retailcrm-order-address.php
│ │ ├── class-wc-retailcrm-order-item.php
│ │ ├── class-wc-retailcrm-order-payment.php
│ │ └── class-wc-retailcrm-order.php
│ └── validators
│ │ ├── class-wc-retailcrm-validator-exception.php
│ │ ├── loyalty-validator
│ │ ├── class-wc-retailcrm-loyalty-constraint.php
│ │ └── class-wc-retailcrm-loyalty-validator.php
│ │ └── url-validator
│ │ ├── class-wc-retailcrm-url-constraint.php
│ │ └── class-wc-retailcrm-url-validator.php
├── index.php
├── languages
│ ├── index.php
│ ├── retailcrm-es_ES.l10n.php
│ ├── retailcrm-es_ES.mo
│ ├── retailcrm-ru_RU.l10n.php
│ └── retailcrm-ru_RU.mo
├── readme.txt
├── retailcrm.php
└── uninstall.php
└── tests
├── abstracts
└── test-wc-retailcrm-abstract-builder.php
├── bin
└── install.sh
├── bootstrap.php
├── customer
├── test-wc-retailcrm-customer-address.php
├── test-wc-retailcrm-customer-corporate-address.php
└── woocommerce
│ └── test-wc-retailcrm-wc-customer-builder.php
├── datasets
├── data-base-retailcrm.php
├── data-cart-retailcrm.php
├── data-customers-retailcrm.php
├── data-history-retailcrm.php
├── data-inventories-retailcrm.php
├── data-loyalty-retailcrm.php
└── data-upload-price-retailcrm.php
├── helpers
├── class-wc-retailcrm-log-handler-stdout.php
├── class-wc-retailcrm-response-helper.php
└── class-wc-retailcrm-test-case-helper.php
├── loyalty
└── test-wc-retailcrm-client-v5.php
├── models
├── test-wc-retailcrm-customer-switcher-result.php
└── test-wc-retailcrm-customer-switcher-state.php
├── order
├── test-wc-retailcrm-order-address.php
├── test-wc-retailcrm-order-item.php
├── test-wc-retailcrm-order-payment.php
└── test-wc-retailcrm-order.php
├── test-wc-retailcrm-base.php
├── test-wc-retailcrm-cart.php
├── test-wc-retailcrm-customers.php
├── test-wc-retailcrm-daemon-collector.php
├── test-wc-retailcrm-ga.php
├── test-wc-retailcrm-history.php
├── test-wc-retailcrm-icml.php
├── test-wc-retailcrm-inventories.php
├── test-wc-retailcrm-loyalty.php
├── test-wc-retailcrm-orders.php
├── test-wc-retailcrm-plugin.php
├── test-wc-retailcrm-upload-discount-price.php
├── test-wc-retailcrm-uploader.php
└── validators
└── test-wc-retailcrm-loyalty-validator.php
/.docker/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM php:7.1-fpm
2 |
3 | RUN apt-get update
4 |
5 | RUN apt-get install -y zlib1g-dev libpq-dev git libicu-dev libxml2-dev libpng-dev libjpeg-dev libmcrypt-dev libxslt-dev libfreetype6-dev \
6 | && docker-php-ext-configure intl \
7 | && docker-php-ext-install intl \
8 | && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
9 | && docker-php-ext-install mysqli pdo pdo_mysql \
10 | && docker-php-ext-install zip \
11 | && docker-php-ext-install xml \
12 | && docker-php-ext-configure gd --with-png-dir=/usr/local/ --with-jpeg-dir=/usr/local/ --with-freetype-dir=/usr/local/ \
13 | && docker-php-ext-install gd \
14 | && docker-php-ext-install mcrypt \
15 | && docker-php-ext-install bcmath \
16 | && docker-php-ext-install soap \
17 | && docker-php-ext-install xsl \
18 | && docker-php-ext-install mbstring
19 |
20 | RUN apt-get install -y gettext
21 | RUN apt-get install -y subversion
22 | RUN apt-get install -y wget
23 |
24 | RUN wget -O /usr/bin/phpunit https://phar.phpunit.de/phpunit-7.phar && chmod +x /usr/bin/phpunit
25 | RUN curl --insecure https://getcomposer.org/download/1.9.3/composer.phar -o /usr/bin/composer && chmod +x /usr/bin/composer
26 |
27 | RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
28 | RUN apt-get install -y nodejs
29 |
30 | # Set timezone
31 | RUN rm /etc/localtime
32 | RUN ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
33 | RUN "date"
34 |
35 | WORKDIR /code
--------------------------------------------------------------------------------
/.env-dist:
--------------------------------------------------------------------------------
1 | # MySQL host and credentials
2 | DB_NAME=wc_retailcrm_test
3 | DB_USER=wc_retailcrm
4 | DB_PASS=wc_retailcrm
5 | DB_HOST=mysql
6 |
7 | # WordPress and WooCommerce versions
8 | WP_VERSION=5.3
9 | WC_VERSION=3.9.0
10 |
11 | # Enable this in order to pipe all module log messages (including debug ones) to STDOUT.
12 | MODULE_LOGS_TO_STDOUT=0
13 |
--------------------------------------------------------------------------------
/.github/workflows/woo.yml:
--------------------------------------------------------------------------------
1 | name: woo
2 |
3 | on:
4 | push:
5 | branches:
6 | - '**'
7 | tags-ignore:
8 | - '*.*'
9 | pull_request:
10 |
11 | env:
12 | DB_HOST: 127.0.0.1
13 | DB_USER: root
14 | DB_PASS: root
15 | DB_NAME: wc_retailcrm_test
16 |
17 | jobs:
18 | test:
19 | runs-on: ubuntu-latest
20 | strategy:
21 | matrix:
22 | include:
23 | # WordPress 5.3
24 | #PHP 7.1 and 7.4
25 | - php-version: '7.1'
26 | wp: '5.3'
27 | wc: '5.4.3'
28 | coverage: 1
29 | phpunit: 'phpunit:7.5.20'
30 | - php-version: '7.1'
31 | wp: '5.3'
32 | wc: '6.4.0'
33 | phpunit: 'phpunit:7.5.20'
34 | - php-version: '7.4'
35 | wp: '5.3'
36 | wc: '5.4.3'
37 | phpunit: 'phpunit:7.5.20'
38 | - php-version: '7.4'
39 | wp: '5.3'
40 | wc: '6.4.0'
41 | phpunit: 'phpunit:7.5.20'
42 |
43 | # WordPress 6.0
44 | # PHP 7.1 and 7.4
45 | - php-version: '7.1'
46 | wp: '6.0'
47 | wc: '5.4.3'
48 | phpunit: 'phpunit:7.5.20'
49 | - php-version: '7.1'
50 | wp: '6.0'
51 | wc: '6.4.0'
52 | phpunit: 'phpunit:7.5.20'
53 | - php-version: '7.4'
54 | wp: '6.0'
55 | wc: '5.4.3'
56 | phpunit: 'phpunit:7.5.20'
57 | - php-version: '7.4'
58 | wp: '6.0'
59 | wc: '6.4.0'
60 | phpunit: 'phpunit:7.5.20'
61 | services:
62 | mysql:
63 | image: mysql:5.7
64 | env:
65 | MYSQL_ALLOW_EMPTY_PASSWORD: false
66 | MYSQL_ROOT_PASSWORD: ${{ env.DB_PASS }}
67 | MYSQL_DATABASE: ${{ env.DB_NAME }}
68 | ports:
69 | - 3306:3306
70 | options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5
71 | steps:
72 | - uses: actions/checkout@v2
73 | - name: Setup PHP ${{ matrix.php-version }}
74 | uses: shivammathur/setup-php@v2
75 | with:
76 | php-version: ${{ matrix.php-version }}
77 | tools: composer:2.1.14, ${{ matrix.phpunit }}
78 | extensions: gd, mbstring, mysqli, zip, unzip, mcrypt, mysql, pdo_mysql, dom
79 | coverage: xdebug
80 |
81 | - name: Tool versions
82 | run: |
83 | php --version
84 | composer --version
85 | phpunit --version
86 |
87 | - name: Install Polyfills dependency for WP 5.9 and 6.0
88 | if: ${{ matrix.wp }} == '6.0' || ${{ matrix.wp }} == '5.9'
89 | run: |
90 | composer require --dev yoast/phpunit-polyfills --ignore-platform-reqs
91 |
92 | - name: Install Woocommerce
93 | env:
94 | WP_VERSION: ${{ matrix.wp }}
95 | WC_VERSION: ${{ matrix.wc }}
96 | run: make install
97 |
98 | - name: Run tests
99 | env:
100 | WP_VERSION: ${{ matrix.wp }}
101 | WC_VERSION: ${{ matrix.wc }}
102 | run: make test
103 |
104 | - name: Coverage
105 | env:
106 | COVERAGE: ${{ matrix.coverage }}
107 | if: env.COVERAGE == 1
108 | run: |
109 | make coverage
110 | bash <(curl -s https://codecov.io/bash)
111 | deploy:
112 | needs: ['test']
113 | if: success() && github.event_name == 'push' && github.repository_owner == 'retailcrm' && github.ref == 'refs/heads/master'
114 | runs-on: ubuntu-latest
115 | steps:
116 | - uses: actions/checkout@v2
117 | - name: Setup PHP 7.2
118 | uses: shivammathur/setup-php@v2
119 | with:
120 | php-version: '7.2'
121 | tools: composer:v2
122 | - name: Build release
123 | run: |
124 | git fetch origin --unshallow --tags
125 | export LAST_TAG=`git describe --abbrev=0 --tags`
126 | export VERSION=`cat VERSION`
127 | export ARCHIVE_NAME=retailcrm-$VERSION.zip
128 | export ARCHIVE_PATH="/tmp/$ARCHIVE_NAME"
129 | export RELEASE_TAG=v$VERSION
130 | export LAST_COMMIT=`git log --oneline --format=%B -n 1 HEAD | head -n 1`
131 | echo RELEASE_TAG=$RELEASE_TAG >> $GITHUB_ENV
132 | echo LAST_TAG=$LAST_TAG >> $GITHUB_ENV
133 | echo LAST_COMMIT=$LAST_COMMIT >> $GITHUB_ENV
134 | echo ARCHIVE_PATH=$ARCHIVE_PATH >> $GITHUB_ENV
135 | echo ARCHIVE_NAME=$ARCHIVE_NAME >> $GITHUB_ENV
136 | make build_archive
137 | - name: Create Release
138 | id: create_release
139 | uses: actions/create-release@v1
140 | if: env.LAST_TAG != env.RELEASE_TAG
141 | env:
142 | GITHUB_TOKEN: ${{ secrets.TOKEN }}
143 | with:
144 | tag_name: ${{ env.RELEASE_TAG }}
145 | release_name: ${{ env.RELEASE_TAG }}
146 | body: ${{ env.LAST_COMMIT }}
147 | draft: false
148 | prerelease: false
149 | - name: Deploy
150 | env:
151 | SVNREPOURL: ${{ secrets.SVNREPOURL }}
152 | USERNAME: ${{ secrets.USERNAME }}
153 | PASSWORD: ${{ secrets.PASSWORD }}
154 | run: |
155 | make svn_clone
156 | make svn_push
157 | - name: Cleanup
158 | if: env.LAST_TAG != env.RELEASE_TAG
159 | run: make remove_dir
160 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /nbproject/
2 | /vendor/
3 | .idea/
4 | .env
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 RetailDriver LLC
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | ROOT_DIR=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
2 | VERSION = `cat $(ROOT_DIR)/VERSION`
3 | ARCHIVE_NAME = '/tmp/retailcrm-'$(VERSION)'.zip'
4 |
5 | .PHONY: test
6 |
7 | svn_clone:
8 | sudo apt install subversion
9 | mkdir -p /tmp/svn_plugin_dir
10 | svn co $(SVNREPOURL) /tmp/svn_plugin_dir --no-auth-cache
11 |
12 | svn_push: /tmp/svn_plugin_dir
13 | if [ ! -d "/tmp/svn_plugin_dir/tags/$(VERSION)" ]; then \
14 | svn delete /tmp/svn_plugin_dir/trunk/*; \
15 | rm -rf /tmp/svn_plugin_dir/trunk/*; \
16 | cp -R $(ROOT_DIR)/src/* /tmp/svn_plugin_dir/trunk; \
17 | svn copy /tmp/svn_plugin_dir/trunk /tmp/svn_plugin_dir/tags/$(VERSION) --no-auth-cache; \
18 | svn add /tmp/svn_plugin_dir/trunk/* --force; \
19 | svn add /tmp/svn_plugin_dir/tags/$(VERSION)/* --force; \
20 | svn ci /tmp/svn_plugin_dir -m $(VERSION) --username $(USERNAME) --password $(PASSWORD) --no-auth-cache; \
21 | fi
22 |
23 | remove_dir:
24 | rm -rf /tmp/svn_plugin_dir
25 |
26 | compile_pot:
27 | msgfmt resources/pot/retailcrm-ru_RU.pot -o src/languages/retailcrm-ru_RU.mo
28 | msgfmt resources/pot/retailcrm-es_ES.pot -o src/languages/retailcrm-es_ES.mo
29 |
30 | install:
31 | sudo apt install subversion
32 | mkdir -p coverage
33 | bash tests/bin/install.sh $(DB_NAME) $(DB_USER) $(DB_HOST) $(DB_PASS) $(WP_VERSION) $(WC_VERSION)
34 |
35 | test:
36 | phpunit -c phpunit.xml.dist
37 |
38 | local_test:
39 | bash tests/bin/install.sh $(DB_NAME) $(DB_USER) $(DB_HOST) $(DB_PASS) $(WP_VERSION) $(WC_VERSION)
40 | phpunit -c phpunit.xml.dist
41 |
42 | run_tests:
43 | docker-compose --no-ansi up -d --build mysql
44 | docker-compose --no-ansi run --rm --no-deps app make local_test
45 | docker-compose down -v
46 |
47 | coverage:
48 | wget https://phar.phpunit.de/phpcov-2.0.2.phar && php phpcov-2.0.2.phar merge coverage/ --clover coverage.xml
49 |
50 | build_archive:
51 | zip -r $(ARCHIVE_NAME) ./src/*
52 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://github.com/retailcrm/woocommerce-module/actions)
2 | [](https://codecov.io/gh/retailcrm/woocommerce-module)
3 | [](https://github.com/retailcrm/woocommerce-module/releases)
4 | [](https://php.net/)
5 |
6 | Woocommerce-module
7 | ==================
8 |
9 | Integration plugin for WooCommerce and [Simla.com](https://www.simla.com)
10 |
11 | [Documentation](https://docs.retailcrm.ru/Users/Integration/SiteModules/WooCommerce) page
12 |
13 | [Customization](https://github.com/retailcrm/woocommerce-module/wiki/%D0%9A%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0) info
14 |
15 | #### Local testing
16 |
17 | To local testing run `make run_tests`
18 |
--------------------------------------------------------------------------------
/VERSION:
--------------------------------------------------------------------------------
1 | 4.8.25
2 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "retailcrm/woocommerce-retailcrm",
3 | "description": "Integration plugin for WooCommerce & RetailCRM",
4 | "type": "wordpress-plugin",
5 | "authors": [
6 | {
7 | "name": "RetailDriver LLC",
8 | "email": "integration@retailcrm.ru"
9 | }
10 | ],
11 | "minimum-stability": "dev",
12 | "require": {
13 | "ext-simplexml": "*",
14 | "ext-xmlwriter": "*"
15 | },
16 | "require-dev": {
17 | "ext-json": "*",
18 | "ext-mbstring": "*",
19 | "phpunit/phpunit": "7.*",
20 | "yoast/phpunit-polyfills": "1.x-dev"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/doc/1.Setup/Abandoned carts settings.md:
--------------------------------------------------------------------------------
1 | ### Настройки брошенных корзин
2 |
3 | В версии 4.6.0 добавлен функционал выгрузки брошенных корзин.
4 |
5 | Для активации необходимо включить опцию ***Выгружать брошенные корзины***
6 |
7 | ### Брошенные корзины
8 |
9 | Брошенная корзина - клиент заходит на сайт, добавляет/удаляет товары в корзине, а затем завершает визит без оформления заказа.
10 |
11 | > Важно:
12 | > * Корзины выгружаются только для зарегестрированных клиентов;
13 | > * Для корректной работы корзин, один API ключ = один магизн в CRM;
14 |
15 | При разработке функционала, ориентировались на хуки корзины в WooCommerce:
16 | * Хуки для метода **set_cart**:
17 | * **woocommerce_add_to_cart** - добавление товара в корзину;
18 | * **woocommerce_after_cart_item_quantity_update** - изменение кол-во товара в корзине;
19 | * **woocommerce_cart_item_removed** - удаление товара с корзины;
20 | * Хуки для метода **clear_cart**:
21 | * **woocommerce_cart_emptied** - полная очистка корзины. Также срабатывает при создании заказа;
22 |
23 | Корзина создается в CRM, при первом добавлении товара.
24 |
25 | **Фильтры:**
26 |
27 | > retailcrm_process_cart - позволяет кастомизировать данные корзины.
28 |
29 | **Пример использования:**
30 |
31 | ```php
32 | карточка товара -> блок Опубликовано)*. Из товаров, чей статус будет соответствовать выбранному, будет сгенерирован ICML-файл каталога. Для выбора необходимо поставить галочку напротив нужного статуса и сохранить настройки.
4 |
5 | Статус видимости товара Личное, также относится к статусам товара "Статус: Опубликовано как личное". Анализ статусов товара был произведен в задаче [#76054](https://redmine.retailcrm.tech/issues/76054)
6 |
7 | 
8 |
--------------------------------------------------------------------------------
/doc/1.Setup/Cron tasks.md:
--------------------------------------------------------------------------------
1 | ### Настройки cron задач
2 |
3 | В версии 4.4.5 добавлен функционал для изменения интервалов времени выполнения cron задач.
4 |
5 | Для изменения интервала времени необходимо с помощью фильтра **retailcrm_add_cron_interval** добавить пользовательский интервал. Затем изменить интервал для cron задач с помощью фильтра **retailcrm_cron_schedules**.
6 | Кастомизацию необходимо добавить на сервере в директорию wp-content -> mu-plugins -> mu-simla.php. После добавления кастомизации в настройках модуля необходимо очистить старые cron задачи.
7 | Перейдите в настройки, откройте "Отладочная информация" и нажмите на кнопку "Очистить cron задачи", появится окно с сообщением об успешной очистке, интервалы будут применены.
8 |
9 | Если необходимо вернуть стандартные интервалы, то удаляем кастомизацию и в настройках так же очищаем старые cron задачи.
10 |
11 | **Интервалы по умолчанию:**
12 | ```php
13 | [
14 | 'icml' => 'three_hours',
15 | 'history' => 'five_minutes',
16 | 'inventories' => 'fiveteen_minutes',
17 | 'loyalty_upload_price' => 'four_hours'
18 | ]
19 | ```
20 | > Важно! При использовании фильтра **retailcrm_cron_schedules**, можно использовать ключи: 'icml', 'history', 'inventories'.
21 |
22 | **Фильтры:**
23 |
24 | > retailcrm_add_cron_interval - позволяет добавить пользовательский интервал времени.
25 |
26 | > retailcrm_cron_schedules - позволяет изменить интервал времени для cron задач.
27 |
28 | **Пример использования:**
29 | ```php
30 | [
37 | 'interval' => 120, // seconds
38 | 'display' => __('Every 2 minutes')
39 | ]
40 | ];
41 | }
42 |
43 |
44 | add_filter('retailcrm_cron_schedules', 'change_cron_tasks');
45 |
46 | function change_cron_tasks($cronTasks)
47 | {
48 | $cronTasks['history'] = 'two_minutes';
49 |
50 | return $cronTasks;
51 | }
52 | ```
53 |
--------------------------------------------------------------------------------
/doc/1.Setup/Custom fields settings.md:
--------------------------------------------------------------------------------
1 | ### Пользовательские поля
2 |
3 | В настройках модуля есть возможность настроить передачу пользовательских полей из CMS в CRM и обратно. Для этого необходимо настроить соответствие между мета полями CMS и пользовательскими полями CRM.
4 |
5 | Слева располагаются мета поля CMS, справа пользовательские поля CRM. В выпадающем списке слева нужно выбрать мета поля CMS, в выпадающем списке справа нужно выбрать пользовательское поле CRM и таким образом сопоставить их.
6 |
7 | Пользовательские поля разбиты на две группы для заказов "Custom fields for order" и для клиентов "Custom fields for customer".
8 |
9 | При нажатии на кнопку "Custom fields for order/customer" будет добавлены новые списки для выбора. Количество списков не может быть больше количества мета полей CMS или пользовательских полей CRM. Поэтому когда добавили максимальное число списков, кнопка добавления пропадает. Для каждой группы предусмотрена своя кнопка добавления.
10 |
11 | Обратите внимание, что значения не должны повторяться, т.е. для двух мета полей CMS, не может быть выбрана одно и то же пользовательское поле CRM. Необходимо выбирать 1 к 1. Если вдруг выбрать значение которое уже используется, будет показано предупреждающее уведомление, выбранный список начнет мигать красным и в этом списке будет установленно значение по умолчанию "Select value".
12 |
13 | Сопоставление можно удалить, если нажать на крестик справа от списка пользовательский полей CRM.
14 |
15 | Для сохранения выбранных сопоставлений необходимо нажать на кнопку "Сохранить изменения" в конце страницы настроек.
16 |
17 | Также в списке значений для сопоставления выводятся **только Активные в CRM пользовательские поля**.
18 |
19 | На стороне CRM доступные пользовательские поля можно увидеть перейдя в **Настройки - Системные - Пользовательские поля.**
20 |
21 |
22 | В версии 4.6.5 добавлен функционал для передачи мета полей CMS в некоторые стандартные поля CRM.
23 |
24 | Список стандартных полей CRM доступных для передачи данных:
25 | * Имя
26 | * Фамилия
27 | * Телефон
28 | * E-mail
29 | * Адрес
30 | * Город
31 | * Индекс
32 | * Регион
33 | * Теги (доступно только для клиентов)
34 | * Комментарий клиента (доступно только для заказов)
35 | * Комментарий менеджера (доступно только для заказов)
36 |
37 | **Важно! Передача мета полей WC в стандартные поля CRM реализована только из CMS в CRM, обратная синхронизация не предусмотрена.**
--------------------------------------------------------------------------------
/doc/1.Setup/Debug information.md:
--------------------------------------------------------------------------------
1 | ### Режим отладки
2 |
3 | Служит для включения расширенного логирования, предназначен для разработчиков. Для просмотра логов необходимо перейти *WooCommerce -> Статус -> Журналы* и там смотреть на файлы **retailcrm_debug**.
4 |
5 | ### Отладочная информация
6 |
7 | Вывод основной информации о работе модуля. На данный момент выводит время последнего запуска крон-задач:
8 |
**History** - показывает время и дату запуска обновления по истории *(данные будут отображены, если активна опция “Загрузка данных из CRM”)*.
9 |
10 | **Icml** - показывает время и дату, когда последний раз срабатывала команда генерации каталога по WP-CRON *(информация будет отображена, если активна опция “Генерация ICML каталога товаров с помощью wp-cron”)*.
11 |
12 | **Inventories** - показывает время и дату запуска получения остатков по товарам из CRM в WooCommerce *(данные будут отображены, если активна опция “Настройка управления остатками”)*.
13 |
14 | Добавлено в версии 4.3.3.
15 |
16 | 
17 |
--------------------------------------------------------------------------------
/doc/1.Setup/Delivery methods.md:
--------------------------------------------------------------------------------
1 | ### Способы доставки
2 |
3 | Необходимо настроить соответствие между доставками WooCommerce и CRM.
4 |
5 | Слева располагаются доставки WooCommerce, справа CRM. В выпадающем списке справа нужно выбрать справочник доставки в CRM, который будет соответствовать доставке в WooCommerce. Данное сопоставление требуется **выбрать для всех доставок**. Если ни одно из предложенных значений не подходит, то необходимо создать в CRM новый справочник доставки, либо пропустить сопоставление.
6 |
7 | После создания новой доставки *(справочника)* на стороне CRM, в WooCommerce необходимо обновить страницу настроек *(перед этим не забудьте сохранить указанные ранее настройки)*, чтобы в предложенных значениях появился новый созданный справочник.
8 |
9 | Если сопоставление пропустить и не выбрать ни одного значения, в этом случае, если в заказе в WooCommerce будет выбрана данная доставка, то в CRM в заказе “Тип доставки” **будет не указан**.
10 |
11 | Обратите внимание, что значения не должны повторяться, т.е. для двух доставок WooCommerce, не может быть выбрана одна и та же доставка *(справочник доставки)* в CRM. Необходимо выбирать 1 к 1.
12 |
13 | **1 доставка WooCommerce = 1 доставка CRM**. Иначе будут наблюдаться ошибки в работе модуля.
14 |
15 | Также в списке значений для сопоставления выводятся **только Активные в CRM справочники**.
16 |
17 | Доставки на стороне WooCommerce можно посмотреть перейдя в *WooCommerce - Настройки - вкладка Доставка - Зоны доставки*; Для каждой зоны доставки будет перечень своих транспортных компаний.
18 |
19 | 
20 |
21 |
22 | На стороне CRM доступные доставки можно увидеть перейдя в *Настройки - Справочники - Типы доставок.*
23 |
24 | 
25 |
--------------------------------------------------------------------------------
/doc/1.Setup/Generating ICML catalog.md:
--------------------------------------------------------------------------------
1 | ### Генерация ICML
2 |
3 | Данная опция позволяет сгенерировать каталог вручную.
4 |
5 | Для активации необходимо нажать на кнопку и дождаться сообщения о завершении генерации. Сгенерированный каталог будет доступен по ссылке https://yoursite.com/simla.xml
6 |
7 | Чтобы проверить, что команда по генерации каталога отработала успешно, можно перейти по ссылке и сравнить дату генерации каталога с текущей:
8 |
9 | 
10 |
11 | Ссылку на каталог требуется указать в настройках магазина в CRM. Для его загрузки в CRM необходимо активировать опцию “Загрузить каталог из ICML сейчас” и сохранить настройки.
12 | 
13 |
14 | ### Генерация ICML каталога товаров с помощью wp-cron
15 |
16 | Данный функционал позволяет генерировать каталог в автоматическом режиме с помощью WP-CRON, в этом случае не потребуется каждый раз при необходимости обновить каталог, заходить в настройки и запускать его загрузку вручную.
17 |
18 | Каталог генерируется **раз в 3 часа**.
19 |
20 | ### Синхронизация остатков и связь товаров
21 |
22 | Функционал служит для **идентификации товаров по SKU (xmlID)**. Для активации необходимо поставить галочку.
23 |
24 | После активации опции при генерации каталога в нем появится параметр xmlID *(артикул)*.
25 |
26 | С версии 4.7.5 после активации/деактивации опции и сохранении настроек, каталог будет сгенерирован автоматически.
27 |
28 | **xmlID** - внешний идентификатор товара, элемент не является обязательным. В случае, если интернет-магазин использует выгрузку номенклатуры товаров из складской системы *(1С, МойСклад)*, то значение этого элемента соответствует идентификатору товара в данной системе. Активируется, когда клиенты используют Woocommerce + MC/1C.
29 |
30 | ### Недавние обновления:
31 |
32 | **В версии 4.4.4** добавлен функционал передачи описания товара в каталог. В настройках каталога необходимо выбрать, какое описание передавать краткое или полное. По умолчанию передается полное описание товара.
33 |
34 | Поле description(описание) выводится в карточке товара, так же его можно использовать в twig-шаблонах. Например, для вывода в печатных формах.
35 | Пример получения описание торгового предложения:
36 | ```twig
37 | {% for availableOrderProduct in order.availableOrderProducts %} {{ availableOrderProduct.getOffer().getDescription() }} {% endfor %}
38 | ```
39 |
40 | **В версии 4.4.6** добавлен фильтр:
41 |
42 | > retailcrm_process_offer - позволяет изменить данные товара, перед записью в ICML каталог.
43 |
44 |
45 | **Пример использования:**
46 | ```php
47 | После указания отмены заказу, в WooCommerce остатки сразу возвращаются, в CRM, если настроена автоматическая отмена товара при отмене заказа, остатки возвращаются, иначе нужно ждать обновления каталога |
19 | | Оформить заказ в CRM, после указать статус из группы Выполнен в CRM | В CRM по товарам остатки не списываются; В WooCommerce остаток по товару списывается, когда приходит статус Выполнен |
20 | | Оформить заказ в CRM, после указать статус из группы Отмена в CRM | В CRM остатки не списываются *(в т.ч. и при установлении отмены статусу товара)*, в WooCommerce остатки по товару также не возвращаются |
21 |
22 | #### На стороне CRM
23 | При ведении стока **на стороне CRM**, остаток по товару сразу списывается в CRM. На стороне WooCommerce остатки по товарам обновляются **раз в 15 минут**.
24 | Если данный статус в CRM не выставляет автоматически статус отмены товару, то в CRM остатки не возвращаются, также, как и на стороне WooCommerce Если будет выставлен статус отмены товару, остатки возвратятся в CRM и спустя 15 минут в WooCommerce
25 |
26 | | Кейс | Результат |
27 | |------------------------------------------------------------------------------|-----------|
28 | | Оформить заказ в CRM, после указать в CRM **статус товару** из группы Отмена | В CRM остаток по товару возвращается, в WooCommerce сток обновляется через 15 минут |
29 | | Оформить заказ на сайте в WooCommerce | Заказ выгружается в CRM, по нему списываются остатки по товару, данное списание передается на сторону WooCommerce |
30 | | Оформить заказ на сайте в WooCommerce, после указать статус Отменен в админке сайта WooCommerce | В CRM приходит статус отмены заказа, если в CRM настроена опция автоматической отмены товара при отмене заказа, то остатки возвращаются в CRM, спустя время и в WooCommerce |
--------------------------------------------------------------------------------
/doc/1.Setup/Settings order number.md:
--------------------------------------------------------------------------------
1 | ### Передача номера заказа
2 |
3 | Функционал позволяет в номер заказа CRM передавать номер заказа WooCommerce.
4 |
5 | Если опция не активна, то номер, с которым выгрузится заказ из WooCommerce в CRM, будет сгенерирован с использованием “Шаблона генерации номера заказа из API” *(в CRM Настройки - Системные - Заказы)*.
6 |
7 | 
8 |
--------------------------------------------------------------------------------
/doc/1.Setup/Settings.md:
--------------------------------------------------------------------------------
1 |
2 | # Settings
3 |
4 |
--------------------------------------------------------------------------------
/doc/1.Setup/Updating data in CRM.md:
--------------------------------------------------------------------------------
1 | ### Обновление данных в Simla.com
2 |
3 | Если активировать данную опцию, **любые изменения заказов из Woocommerce не будут передаваться в CRM**. Изменения заказа из CRM в Woocomerce передаются.
4 |
--------------------------------------------------------------------------------
/doc/1.Setup/User roles.md:
--------------------------------------------------------------------------------
1 | # User roles
2 |
3 | С версии `4.3.7` опция `"Роли клиентов"` была удалена из настроек модуля. Сейчас выгружаются пользователи со всеми доступными ролями в CMS.
4 | Добавили фильтр `retailcrm_customer_roles` для корректировки выгружаемых пользователей.
5 |
6 | ## Пример работы фильтра
7 | В приведенном ниже примере показано, как возможно корректировать роли выгружаемых пользователей:
8 |
9 | ```php
10 |
14 | *__В блоке Контактные лица__*:
15 | - ФИО клиента,
16 | - Email,
17 | - Email-подписка *(значение зависит от флага подписки на рассылку на сайте)*,
18 | - признак Основное,
19 | - Телефон,
20 | - нет привязки к Компании.
21 | *__В блоке Компании__*:
22 | - Название,
23 | - Статус,
24 | - признак Основная,
25 | - Тип контрагента (Юр лицо),
26 | - Адрес регистрации *(из Платежного адреса)*,
27 | - есть привязка к адресу.
28 | *__В блоке Адреса__*
29 | - указан Платежный адрес *(заполнены все строки)*.
30 |
31 | В карточку контактного лица *(клиента, на которого оформлен заказ)* в данные адреса выгружается **Платежный адрес**.
32 |
33 | #### На стороне WooCommerce
34 | | # | Кейс *(действие на стороне Woo)* | Результат |
35 | |--|--|--|
36 | |1| Зарегистрировать клиента, указать в профиле Billing address | При добавлении Billing address в профиле клиента в Woo, он выгружается в CRM в карточку клиента |
37 | |2| Зарегистрировать клиента, указать в профиле Shipping address | Shipping address не выгружается в CRM в карточку клиента |
38 | |3| Зарегистрировать клиента, указать в профиле Billing и Shipping address | В карточку клиента в CRM выгружается только Billing address |
39 | |4| Изменить в профиле клиента Billing address | В карточке клиента в CRM обновляется адрес |
40 | |5| Изменить в профиле клиента Shipping address | Shipping address не выгружается в карточку клиента в CRM |
41 | |6| Зарегистрировать клиента, указать в профиле Billing address, после удалить адрес | При указании Billing address в профиле клиента в Woo, он выгружается в карточку клиента в CRM Адрес в Woo можно изменить, но удалить нельзя *(возможность отсутствует)* |
42 | |7| Зарегистрировать клиента, указать в профиле Shipping address, после удалить | При указании Shipping address в профиле клиента в Woo, он не выгружается в карточку клиента в CRM Адрес в Woo можно изменить, но удалить нельзя (возможность отсутствует) |
43 | |8| Оформить заказ с указанием только Billing address | В карточке клиента в CRM указан Billing address В карточке заказа в CRM указан Billing address |
44 | |9| Оформить заказ с указанием Billing и Shipping address | В карточке клиента в CRM указан Billing address В карточке заказа в CRM в блоке Доставка указан Shipping address |
45 | | | | |
46 | |10| Зарегистрировать клиента, указать при оформлении заказа значение в поле Компания в Billing address | При указании компании в Billing address в профиле клиента, **корп клиент не создается** **Корп клиент создается при оформлении заказа** **billing = shipping** В карточке заказа в CRM в блоке Доставка указан Billing address В карточке корп клиента в CRM в блоке Компании в поле "Адрес регистрации" указан Billing address; в блоке Адреса также указан Billing address В карточке Контактного лица *(клиента, на которого оформлен заказ)* в CRM указан Billing address |
47 | |11| Указать при оформлении заказа значение в поле Компания в Shipping address (в Billing address не указано значение в поле Компания) | Корп клиент не создается в CRM; В карточке заказа в CRM указан Shipping address В карточке клиента в CRM указан Billing address |
48 | |12| Указать при оформлении заказа значение в поле Компания в Billing и Shipping address | Корп клиент создан В карточке заказа в CRM указан Shipping address В карточке корп клиента в CRM в блоке Компании в поле Адрес регистрации указан Billing address; в блоке Адреса также указан Billing address В карточке Контактного лица в CRM указан Billing address |
49 | |13| Изменить значение в поле Компания в профиле клиента в Billing адресе, оформить заказ | Создается новый корп клиент в CRM |
50 | |14| Изменить значение в поле Компания в профиле клиента в Shipping адресе | Никаких изменений на стороне CRM нет |
51 | |15| Зарегистрировать нового клиента, в Billing address в поле Компания указать название существующего корп клиента в CRM | Новый корп клиент не создается в CRM, добавляется новое Контактное лицо в карточку корп клиента + добавляется Billing address в блок Адреса, если он отличен от существующего |
52 | |16| Зарегистрировать нового клиента, в Billing address в поле Компания указать название существующего корп клиента в CRM и существующий адрес | Адрес не дублируется |
53 | | | | |
54 |
--------------------------------------------------------------------------------
/doc/2. Workflow/ Client Registration.md:
--------------------------------------------------------------------------------
1 | #Регистрация клиентов
2 |
3 | Клиент может зарегистрироваться на сайте:
4 | * Администратор может зарегистрировать клиента через административную панель WordPress.
5 | * На странице wp-admin.
6 | * При заполнении email в форме регистрации на сайте.
7 | * Когда оформляет новый заказ, если клиент является "гостем" ему будет предложено зарегистрироваться.
8 |
9 | Модуль обрабатывает регистрацию клиентов через хук **user_register**.
10 |
11 | Модуль обрабатывает таких клиентов по следующей логике:
12 | 1. Производится поиск по email в CRM, если клиент найден, происходит обновление его данных в CRM и актуализируется его externalId.
13 | 2. Если клиент не найден в CRM, будет создан новый.
14 |
15 | Данная логика позволяет минимизировать количество дублей.
16 | Возможно ситуация, когда клиент был удален в CMS, но в CRM такой клиент продолжает существовать, чтобы не потерять таких клиентов производится актуализация их данных.
17 |
18 |
--------------------------------------------------------------------------------
/doc/2. Workflow/Address.md:
--------------------------------------------------------------------------------
1 | # Работа с адресами
2 |
3 | С версии `4.3.8` изменена логика работы с адресами.
4 |
5 | В заказ CRM c заказа WooCommerce будет передаваться, только shipping адрес. Если при оформлении заказа указан только billing адрес, то WooCommerce записывает в БД эти же данные в shipping, то есть shipping = billing.
6 |
7 | При создании обычных/корпоративных клиентов в CRM будет передаваться billing адрес с заказа/пользователя WooCommerce. Если клиент гость и у него нет данных по billing адресу, тогда будет передан billing адрес заказа.
8 |
9 | Для кастомизаций адресов в CRM, добавили новые фильтры:
10 | * `retailcrm_process_order_address`
11 | * `retailcrm_process_customer_address`
12 | * `retailcrm_process_customer_corporate_address`
13 |
14 | ## Пример работы фильтров
15 | В приведенном ниже примере показано, как возможно кастомизировать адрес заказа:
16 |
17 | ```php
18 | WC):
4 | * Если в CRM создают заказ со статусом для которого не выбран маппинг, модуль по умолчанию поставит "pending" для этого заказа в WC.
5 | * Если в CRM изменении заказ со статусом для которого не выбран маппинг, статус заказа в WC изменен не будет.
6 |
7 | Прямая синхронизация (WC --> CRM):
8 | * Если в WC создают/изменяют заказ со статусом для которого в настройках маппинга статусов выбрано "Не отправлять в CRM", при создании заказа, в массиве данных заказа поля "status" не будет, CRM поставит статус по умолчанию, при изменении статус заказа в CRM изменен не будет.
9 |
10 |
11 |
--------------------------------------------------------------------------------
/doc/3. Customization/Filters.md:
--------------------------------------------------------------------------------
1 | ### Фильтры
2 |
3 | Если вы хотите изменить данные отправляемые между CRM и CMS, вы можете использовать **пользовательские фильтры**.
4 |
5 | Чтобы использовать фильтры, необходимо в директории wp-content создать директорию mu-plugins и в ней создать кастомный файл mu-simla.php.
6 |
7 | ### Список доступных фильтров
8 |
9 | > retailcrm_process_customer - позволяет изменить данные клиента при передачи из CMS -> CRM.
10 |
11 | > retailcrm_process_customer_address - позволяет изменить адрес клиента при передачи из CMS -> CRM.
12 |
13 | > retailcrm_process_customer_corporate - позволяет изменить данные корпоративного клиента при передачи из CMS -> CRM.
14 |
15 | > retailcrm_process_customer_corporate_address - позволяет изменить адрес корпоративного клиента при передачи из CMS -> CRM.
16 |
17 | > retailcrm_process_customer_corporate_company - позволяет изменить компанию корпоративного клиента при передачи из CMS -> CRM.
18 |
19 | > retailcrm_customer_roles - позволяет изменить допустимые роли клиентов.
20 |
21 | > retailcrm_daemon_collector - позволяет изменить данные для Daemon Collector.
22 |
23 | > retailcrm_initialize_analytics - позволяет изменить данные скрипта для Google Analytics.
24 |
25 | > retailcrm_send_analytics - позволяет изменить отправляемые данные Google Analytics.
26 |
27 | > retailcrm_process_customer_custom_fields - позволяет изменить данные кастомных полей клиента при передачи из CRM -> CMS .
28 |
29 | > retailcrm_history_before_save - позволяет изменить данные заказа и клиента при передачи из CRM -> CMS.
30 |
31 | > retailcrm_process_order_custom_fields - позволяет изменить данные кастомных полей заказ при передачи из CRM -> CMS.
32 |
33 | > retailcrm_process_offer - позволяет изменить данные товара перед записью в ICML каталог.
34 |
35 | > retailcrm_process_order - позволяет изменить данные заказа при передачи из CMS -> CRM.
36 |
37 | > retailcrm_process_order_address - позволяет изменить адрес заказа при передачи из CMS -> CRM.
38 |
39 | > retailcrm_add_cron_interval - позволяет добавить пользовательский интервал времени.
40 |
41 | > retailcrm_cron_schedules - позволяет изменить интервал времени для cron задач.
42 |
43 | > retailcrm_shipping_list - позволяет изменить методы доставки с CMS.
44 |
45 | > retailcrm_order_create_after - позволяет проверить создание заказа и произвести дополнительные действия
46 |
47 | > retailcrm_order_update_after - позволяет проверить изменение заказа и произвести дополнительные действия
48 |
49 | > retailcrm_change_default_meta_fields - позволяет изменить список получаемых по умолчанию мета-полей
50 |
51 | **Пример использования:**
52 | ```php
53 |
2 |
13 |
14 |
15 | tests
16 |
17 |
18 |
19 |
20 | src
21 |
22 | src/include/api
23 | src/config
24 | src/languages
25 | src/readme.txt
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/src/assets/css/debug-info.css:
--------------------------------------------------------------------------------
1 | .retail-cron-info-title {
2 | font-weight: bold;
3 | }
4 |
--------------------------------------------------------------------------------
/src/assets/css/debug-info.min.css:
--------------------------------------------------------------------------------
1 | .retail-cron-info-title{font-weight:700}
--------------------------------------------------------------------------------
/src/assets/css/meta-fields.css:
--------------------------------------------------------------------------------
1 | .retailcrm-meta-select {
2 | margin-right: 25px !important;
3 | float:left !important;
4 | width: 200px !important;
5 | text-align-last: center;
6 | border: 2px solid #2271b1;
7 | }
8 |
9 | .retailcrm-select-pair {
10 | margin-bottom: 30px;
11 | }
12 |
13 | .retailcrm-order-label, .retailcrm-customer-label {
14 | display: block;
15 | font-size: 14px !important;
16 | margin-top: 16px;
17 | margin-bottom: 10px;
18 | }
19 |
20 | .add-new-select-retailcrm {
21 | display:block;
22 | width: 200px !important;
23 | height: 34px;
24 | color: #4169e1;
25 | border-color: #4169e1;
26 | background: #f6f7f7;
27 | vertical-align: top;
28 | margin-top: 16px;
29 | margin-left: 128px;
30 | margin-bottom: 10px;
31 | }
32 |
33 | .delete-select-retailcrm {
34 | display: block;
35 | width: 34px;
36 | height: 34px;
37 | --weight: 0.5px;
38 | --aa: 0.5px; /* anti-aliasing */
39 | --color: #4169e1;
40 | border-color: #4169e1;
41 | background: #f6f7f7;
42 | padding: 0;
43 | background:
44 | linear-gradient(45deg, transparent calc(50% - var(--weight) - var(--aa)), var(--color) calc(50% - var(--weight)), var(--color) calc(50% + var(--weight)), transparent calc(50% + var(--weight) + var(--aa))),
45 | linear-gradient(-45deg, transparent calc(50% - var(--weight) - var(--aa)), var(--color) calc(50% - var(--weight)), var(--color) calc(50% + var(--weight)), transparent calc(50% + var(--weight) + var(--aa)));
46 | }
47 |
48 |
49 | .red-selected-retailcrm {
50 | border: solid 3px red !important;
51 | animation: 2s blinker linear infinite;
52 | #transition: border-width 0.6s linear;
53 | }
54 |
55 | @keyframes blinker {
56 | 0% { opacity: 1.0; }
57 | 50% { opacity: 0.3; }
58 | 100% { opacity: 1.0; }
59 | }
--------------------------------------------------------------------------------
/src/assets/css/meta-fields.min.css:
--------------------------------------------------------------------------------
1 | .retailcrm-meta-select{margin-right:25px!important;float:left!important;width:200px!important;text-align-last:center;border:2px solid #2271b1}.retailcrm-select-pair{margin-bottom:30px}.retailcrm-customer-label,.retailcrm-order-label{display:block;font-size:14px!important;margin-top:16px;margin-bottom:10px}.add-new-select-retailcrm{display:block;width:200px!important;height:34px;color:#4169e1;border-color:#4169e1;background:#f6f7f7;vertical-align:top;margin-top:16px;margin-left:128px;margin-bottom:10px}.delete-select-retailcrm{display:block;width:34px;height:34px;--weight:0.5px;--aa:0.5px;--color:#4169e1;border-color:#4169e1;background:#f6f7f7;padding:0;background:linear-gradient(45deg,transparent calc(50% - var(--weight) - var(--aa)),var(--color) calc(50% - var(--weight)),var(--color) calc(50% + var(--weight)),transparent calc(50% + var(--weight) + var(--aa))),linear-gradient(-45deg,transparent calc(50% - var(--weight) - var(--aa)),var(--color) calc(50% - var(--weight)),var(--color) calc(50% + var(--weight)),transparent calc(50% + var(--weight) + var(--aa)))}.red-selected-retailcrm{border:solid 3px red!important; animation:2s blinker linear infinite}@keyframes blinker{0%{opacity:1}50%{opacity:.3}100%{opacity:1}}
--------------------------------------------------------------------------------
/src/assets/css/progress-bar.css:
--------------------------------------------------------------------------------
1 | .retail-progress {
2 | border-radius: 18px;
3 | border: 1px solid rgba(122, 122, 122, 0.15);
4 | width: 400px;
5 | height: 18px;
6 | overflow: hidden;
7 | transition: height 0.25s ease;
8 | }
9 |
10 | .retail-progress__loader {
11 | width: 0;
12 | border-radius: 18px;
13 | background: #4169e1;
14 | color: white;
15 | text-align: center;
16 | padding: 0 30px;
17 | font-size: 18px;
18 | font-weight: 600;
19 | transition: width 0.4s ease-in;
20 | line-height: 18px;
21 | box-sizing: border-box;
22 | }
23 |
24 | .retailcrm-hidden {
25 | display: none !important;
26 | }
27 |
28 | .retail-count-data-upload {
29 | margin-bottom: 20px;
30 | size: 30px;
31 | color: #4169e1;
32 | font-weight: bold;
33 | }
--------------------------------------------------------------------------------
/src/assets/css/progress-bar.min.css:
--------------------------------------------------------------------------------
1 | <<<<<<< HEAD
2 | .retail-progress{border-radius:18px;border:1px solid rgba(122,122,122,.15);width:400px;height:18px;overflow:hidden;transition:height .25s ease}.retail-progress__loader{width:0;border-radius:18px;background:#4169e1;color:#fff;text-align:center;padding:0 30px;font-size:18px;font-weight:600;transition:width .4s ease-in;line-height:18px;box-sizing:border-box}.retail-hidden{display:none!important}.retail-count-data-upload{margin-bottom:20px;size:30px;color:#4169e1;font-weight:700}
3 | =======
4 | .retail-progress{border-radius:18px;border:1px solid rgba(122,122,122,.15);width:400px;height:18px;overflow:hidden;transition:height .25s ease}.retail-progress__loader{width:0;border-radius:18px;background:#4169e1;color:#fff;text-align:center;padding:0 30px;font-size:18px;font-weight:600;transition:width .4s ease-in;line-height:18px;box-sizing:border-box}.retailcrm-hidden{display:none!important}.retail-count-data-upload{margin-bottom:20px;size:30px;color:#4169e1;font-weight:700}
5 | >>>>>>> Add mapping metadata fields in settings
6 |
--------------------------------------------------------------------------------
/src/assets/css/retailcrm-loyalty-style.css:
--------------------------------------------------------------------------------
1 | .popup-fade-loyalty {
2 | display: none;
3 | }
4 | .popup-fade-loyalty:before {
5 | content: '';
6 | background: #000;
7 | position: fixed;
8 | left: 0;
9 | top: 0;
10 | width: 100%;
11 | height: 100%;
12 | opacity: 0.7;
13 | z-index: 9999;
14 | }
15 | .popup-loyalty {
16 | position: fixed;
17 | top: 20%;
18 | left: 50%;
19 | padding: 20px;
20 | width: 1000px;
21 | margin-left: -500px;
22 | height: 50%;
23 | background: #fff;
24 | border: 1px solid orange;
25 | border-radius: 4px;
26 | z-index: 99999;
27 | opacity: 1;
28 | overflow: auto;
29 | }
30 | .popup-close-loyalty {
31 | position: absolute;
32 | top: 10px;
33 | right: 10px;
34 | }
35 |
--------------------------------------------------------------------------------
/src/assets/css/whatsapp-icon.css:
--------------------------------------------------------------------------------
1 | .whatsapp-icon {
2 | position: fixed;
3 | z-index: 999;
4 | left: 0;
5 | bottom: 32px;
6 | width: 60px;
7 | height: 60px;
8 | box-sizing: border-box;
9 | }
10 |
11 | .whatsapp-icon_left {
12 | left: 32px;
13 | right: auto;
14 | }
15 |
16 | .whatsapp-icon_right {
17 | right: 32px;
18 | left: auto;
19 | }
20 |
21 | .whatsapp-icon__icon {
22 | width: 100%;
23 | height: 100%;
24 | }
25 |
26 | .chat-btn__text {
27 | color: #8A96A6;
28 | font-weight: 600;
29 | font-size: 8px;
30 | line-height: 10px;
31 | text-align: center;
32 | margin: 0 0 8px;
33 | white-space: nowrap;
34 | }
35 |
--------------------------------------------------------------------------------
/src/assets/css/whatsapp-icon.min.css:
--------------------------------------------------------------------------------
1 | .whatsapp-icon{position:fixed;z-index: 999;left:0;bottom:32px;width:60px;height:60px;box-sizing:border-box}.whatsapp-icon_left{left:32px;right:auto}.whatsapp-icon_right{right:32px;left:auto}.whatsapp-icon__icon{width:100%;height:100%}.chat-btn__text{color:#8A96A6;font-weight:600;font-size:8px;line-height:10px;text-align:center;margin:0 0 8px;white-space:nowrap}
--------------------------------------------------------------------------------
/src/assets/default/default_meta_fields.txt:
--------------------------------------------------------------------------------
1 | _backorders
2 | _billing_address_1
3 | _billing_address_2
4 | _billing_address_index
5 | _billing_city
6 | _billing_company
7 | _billing_country
8 | _billing_email
9 | _billing_first_name
10 | _billing_last_name
11 | _billing_phone
12 | _billing_postcode
13 | _billing_state
14 | _button_text
15 | _cart_discount
16 | _cart_discount_tax
17 | _cart_hash
18 | _children
19 | _completed_date
20 | _created_via
21 | _customer_ip_address
22 | _customer_user
23 | _customer_user_agent
24 | _date_completed
25 | _date_paid
26 | _download_expiry
27 | _download_limit
28 | _download_permissions_granted
29 | _downloadable
30 | _downloadable_files
31 | _edit_last
32 | _edit_lock
33 | _manage_stock
34 | _new_order_email_sent
35 | _order_currency
36 | _order_key
37 | _order_shipping
38 | _order_shipping_tax
39 | _order_stock_reduced
40 | _order_tax
41 | _order_total
42 | _order_version
43 | _paid_date
44 | _payment_method
45 | _payment_method_title
46 | _price
47 | _prices_include_tax
48 | _product_attributes
49 | _product_image_gallery
50 | _product_url
51 | _product_version
52 | _recorded_coupon_usage_counts
53 | _recorded_sales
54 | _refund_amount
55 | _refund_reason
56 | _refunded_by
57 | _refunded_payment
58 | _regular_price
59 | _sale_price
60 | _shipping_address_1
61 | _shipping_address_2
62 | _shipping_address_index
63 | _shipping_city
64 | _shipping_company
65 | _shipping_country
66 | _shipping_first_name
67 | _shipping_last_name
68 | _shipping_postcode
69 | _shipping_state
70 | _sku
71 | _sold_individually
72 | _stock
73 | _stock_status
74 | _stripe_charge_captured
75 | _stripe_currency
76 | _stripe_customer_id
77 | _stripe_fee
78 | _stripe_intent_id
79 | _stripe_net
80 | _stripe_source_id
81 | _tax_class
82 | _tax_status
83 | _thumbnail_id
84 | _transaction_id
85 | _variation_description
86 | _virtual
87 | _wc_attachment_source
88 | _wc_average_rating
89 | _wc_review_count
90 | _wp_attached_file
91 | _wp_attachment_metadata
92 | _wp_desired_post_slug
93 | _wp_old_slug
94 | _wp_page_template
95 | _wp_trash_meta_comments_status
96 | _wp_trash_meta_status
97 | _wp_trash_meta_time
98 | _wpcom_is_markdown
99 | _used_by
100 | attribute_logo
101 | attribute_pa_color
102 | attribute_pa_size
103 | total_sales
104 | coupon_amount
105 | date_expires
106 | discount_type
107 | exclude_sale_items
108 | free_shipping
109 | individual_use
110 | is_vat_exempt
111 | limit_usage_to_x_items
112 | usage_count
113 | usage_limit
114 | usage_limit_per_user
115 | _shipping_phone
116 |
117 | ## Customer
118 |
119 | _last_order
120 | _order_count
121 | _woocommerce_persistent_cart_1
122 | _woocommerce_tracks_anon_id
123 | admin_color
124 | billing_address_1
125 | billing_address_2
126 | billing_city
127 | billing_company
128 | billing_country
129 | billing_email
130 | billing_first_name
131 | billing_last_name
132 | billing_phone
133 | billing_postcode
134 | billing_state
135 | comment_shortcuts
136 | community-events-location
137 | default_password_nag
138 | description
139 | dismissed_maxmind_license_key_notice
140 | dismissed_no_secure_connection_notice
141 | dismissed_regenerating_thumbnails_notice
142 | dismissed_update_notice
143 | dismissed_wc_admin_notice
144 | dismissed_wp_pointers
145 | first_name
146 | last_name
147 | last_update
148 | locale
149 | paying_customer
150 | rich_editing
151 | session_tokens
152 | shipping_address_1
153 | shipping_address_2
154 | shipping_city
155 | shipping_company
156 | shipping_country
157 | shipping_first_name
158 | shipping_last_name
159 | shipping_method
160 | shipping_phone
161 | shipping_postcode
162 | shipping_state
163 | show_admin_bar_front
164 | show_welcome_panel
165 | syntax_highlighting
166 | use_ssl
167 | wc_last_active
168 | woocommerce_admin_activity_panel_inbox_last_read
169 | wp_capabilities
170 | wp_dashboard_quick_press_last_post_id
171 | wp_product_import_error_log
172 | wp_user_level
173 | wp_user-settings
174 | wp_user-settings-time
175 | wp_woocommerce_product_import_mapping
176 | closedpostboxes_shop_order
177 | metaboxhidden_shop_order
178 | wp__stripe_customer_id
179 |
--------------------------------------------------------------------------------
/src/assets/js/retailcrm-cron-info.js:
--------------------------------------------------------------------------------
1 | jQuery(function () {
2 | function RetailcrmCronInfo()
3 | {
4 | this.title = jQuery('.debug_info_options').get(0)
5 | this.submitButton = jQuery('button[id="clear_cron_tasks"]').get(0);
6 |
7 | if (typeof this.title === 'undefined') {
8 | return false;
9 | }
10 |
11 | if (typeof this.submitButton === 'undefined') {
12 | return false;
13 | }
14 |
15 | this.icml = 0;
16 | this.history = 0;
17 | this.inventories = 0;
18 | this.messageSuccessful = '';
19 | this.loyaltyUploadPrice = 0;
20 |
21 | this.adminUrl = AdminUrl.url;
22 |
23 | let _this = this;
24 |
25 | jQuery.ajax({
26 | url: this.adminUrl + '/admin-ajax.php?action=cron_info',
27 | method: "POST",
28 | timeout: 0,
29 | data: {ajax: 1},
30 | dataType: "json"
31 | })
32 | .done(function (response) {
33 | _this.history = response.history;
34 | _this.icml = response.icml;
35 | _this.inventories = response.inventories;
36 | _this.messageSuccessful = response.translate.tr_successful;
37 | _this.loyaltyUploadPrice = response.loyaltyUploadPrice
38 |
39 | _this.displayInfoAboutCron(
40 | response.translate.tr_td_cron,
41 | response.translate.tr_td_icml,
42 | response.translate.tr_td_history,
43 | response.translate.tr_td_inventories,
44 | response.translate.tr_td_loyaltyUploadPrice
45 | );
46 | })
47 |
48 | this.clearCronTasks = this.clearCronTasks.bind(this);
49 |
50 | jQuery(this.submitButton).click(this.clearCronTasks);
51 | }
52 |
53 | RetailcrmCronInfo.prototype.displayInfoAboutCron = function (cron, icml, history, inventories, loyaltyUploadPrice) {
54 | this.table = jQuery(this.title).next();
55 | this.table.append('