mirror of
https://github.com/retailcrm/prestashop-module.git
synced 2025-03-02 19:33:14 +03:00
Added export of customers without orders. Updated orders export
This commit is contained in:
parent
3c032aa171
commit
608c4be21b
201
retailcrm/lib/RetailcrmExport.php
Normal file
201
retailcrm/lib/RetailcrmExport.php
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MIT License
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 DIGITAL RETAIL TECHNOLOGIES SL
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
* DISCLAIMER
|
||||||
|
*
|
||||||
|
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||||
|
* versions in the future. If you wish to customize PrestaShop for your
|
||||||
|
* needs please refer to http://www.prestashop.com for more information.
|
||||||
|
*
|
||||||
|
* @author DIGITAL RETAIL TECHNOLOGIES SL <mail@simlachat.com>
|
||||||
|
* @copyright 2020 DIGITAL RETAIL TECHNOLOGIES SL
|
||||||
|
* @license https://opensource.org/licenses/MIT The MIT License
|
||||||
|
*
|
||||||
|
* Don't forget to prefix your containers with your own identifier
|
||||||
|
* to avoid any conflicts with others containers.
|
||||||
|
*/
|
||||||
|
class RetailcrmExport
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get total count of orders for context shop
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public static function getOrdersCount()
|
||||||
|
{
|
||||||
|
$sql = 'SELECT count(o.id_order)
|
||||||
|
FROM `' . _DB_PREFIX_ . 'orders` o
|
||||||
|
WHERE 1
|
||||||
|
' . Shop::addSqlRestriction(false, 'o');
|
||||||
|
|
||||||
|
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get orders ids from the database
|
||||||
|
*
|
||||||
|
* @param int $start Sets the LIMIT start parameter for sql query
|
||||||
|
* @param int|null $count Sets the count of orders to get from database
|
||||||
|
*
|
||||||
|
* @return Generator
|
||||||
|
* @throws PrestaShopDatabaseException
|
||||||
|
*/
|
||||||
|
public static function getOrdersIds($start = 0, $count = null)
|
||||||
|
{
|
||||||
|
if (is_null($count)) {
|
||||||
|
$count = static::getOrdersCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($count > 0) {
|
||||||
|
$loadSize = 5000;
|
||||||
|
$predefinedSql = 'SELECT o.`id_order`
|
||||||
|
FROM `' . _DB_PREFIX_ . 'orders` o
|
||||||
|
WHERE 1
|
||||||
|
' . Shop::addSqlRestriction(false, 'o') . '
|
||||||
|
ORDER BY o.`id_order` ASC';
|
||||||
|
|
||||||
|
while ($start <= $count) {
|
||||||
|
$offset = ($start + $loadSize > $count) ? $count - $start : $loadSize;
|
||||||
|
|
||||||
|
$sql = $predefinedSql . '
|
||||||
|
LIMIT ' . (int)$start . ', ' . (int)$offset;
|
||||||
|
|
||||||
|
$orders = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
|
||||||
|
|
||||||
|
if (empty($orders))
|
||||||
|
break;
|
||||||
|
|
||||||
|
foreach ($orders as $order) {
|
||||||
|
yield $order;
|
||||||
|
}
|
||||||
|
|
||||||
|
$start += $offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get total count of customers without orders for context shop
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public static function getCustomersCount()
|
||||||
|
{
|
||||||
|
$sql = 'SELECT count(c.id_customer)
|
||||||
|
FROM `' . _DB_PREFIX_ . 'customer` c
|
||||||
|
WHERE 1
|
||||||
|
' . Shop::addSqlRestriction(false, 'c') . '
|
||||||
|
AND c.id_customer not in (
|
||||||
|
select o.id_customer
|
||||||
|
from `' . _DB_PREFIX_ . 'orders` o
|
||||||
|
WHERE 1
|
||||||
|
' . Shop::addSqlRestriction(false, 'o') . '
|
||||||
|
group by o.id_customer
|
||||||
|
)';
|
||||||
|
|
||||||
|
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get customers ids from database
|
||||||
|
*
|
||||||
|
* @param int $start Sets the LIMIT start parameter for sql query
|
||||||
|
* @param null $count Sets the count of customers to get from database
|
||||||
|
* @param bool $withAddressId If set to <b>true</b>, then also return address id in <i>`id_address`</i>
|
||||||
|
*
|
||||||
|
* @return Generator
|
||||||
|
* @throws PrestaShopDatabaseException
|
||||||
|
*/
|
||||||
|
public static function getCustomersIds($start = 0, $count = null, $withAddressId = true)
|
||||||
|
{
|
||||||
|
if (is_null($count)) {
|
||||||
|
$count = static::getCustomersCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($count > 0) {
|
||||||
|
$loadSize = 500;
|
||||||
|
$predefinedSql = 'SELECT c.`id_customer`
|
||||||
|
' . ($withAddressId ? ', a.`id_address`' : '') . '
|
||||||
|
FROM `' . _DB_PREFIX_ . 'customer` c
|
||||||
|
' . ($withAddressId ? '
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
ad.`id_customer`,
|
||||||
|
ad.`id_address`
|
||||||
|
FROM
|
||||||
|
`' . _DB_PREFIX_ . 'address` ad
|
||||||
|
INNER JOIN
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
`id_customer`,
|
||||||
|
MAX(`date_add`) AS `date_add`
|
||||||
|
FROM
|
||||||
|
`' . _DB_PREFIX_ . 'address`
|
||||||
|
GROUP BY
|
||||||
|
id_customer
|
||||||
|
) ad2
|
||||||
|
ON
|
||||||
|
ad2.`id_customer` = ad.`id_customer` AND ad2.`date_add` = ad.`date_add`
|
||||||
|
ORDER BY
|
||||||
|
ad.`id_customer` ASC
|
||||||
|
) a
|
||||||
|
ON
|
||||||
|
a.`id_customer` = c.`id_customer`
|
||||||
|
' : '') . '
|
||||||
|
WHERE 1
|
||||||
|
' . Shop::addSqlRestriction(false, 'c') . '
|
||||||
|
AND c.`id_customer` not in (
|
||||||
|
select o.`id_customer`
|
||||||
|
from `' . _DB_PREFIX_ . 'orders` o
|
||||||
|
WHERE 1
|
||||||
|
' . Shop::addSqlRestriction(false, 'o') . '
|
||||||
|
group by o.`id_customer`
|
||||||
|
)
|
||||||
|
ORDER BY c.`id_customer` ASC';
|
||||||
|
|
||||||
|
|
||||||
|
while ($start <= $count) {
|
||||||
|
$offset = ($start + $loadSize > $count) ? $count - $start : $loadSize;
|
||||||
|
|
||||||
|
$sql = $predefinedSql . '
|
||||||
|
LIMIT ' . (int)$start . ', ' . (int)$offset;
|
||||||
|
|
||||||
|
$customers = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
|
||||||
|
|
||||||
|
if (empty($customers))
|
||||||
|
break;
|
||||||
|
|
||||||
|
foreach ($customers as $customer) {
|
||||||
|
yield $customer;
|
||||||
|
}
|
||||||
|
|
||||||
|
$start += $offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -28,9 +28,9 @@
|
|||||||
* versions in the future. If you wish to customize PrestaShop for your
|
* versions in the future. If you wish to customize PrestaShop for your
|
||||||
* needs please refer to http://www.prestashop.com for more information.
|
* needs please refer to http://www.prestashop.com for more information.
|
||||||
*
|
*
|
||||||
* @author DIGITAL RETAIL TECHNOLOGIES SL <mail@simlachat.com>
|
* @author DIGITAL RETAIL TECHNOLOGIES SL <mail@simlachat.com>
|
||||||
* @copyright 2020 DIGITAL RETAIL TECHNOLOGIES SL
|
* @copyright 2020 DIGITAL RETAIL TECHNOLOGIES SL
|
||||||
* @license https://opensource.org/licenses/MIT The MIT License
|
* @license https://opensource.org/licenses/MIT The MIT License
|
||||||
*
|
*
|
||||||
* Don't forget to prefix your containers with your own identifier
|
* Don't forget to prefix your containers with your own identifier
|
||||||
* to avoid any conflicts with others containers.
|
* to avoid any conflicts with others containers.
|
||||||
@ -65,7 +65,7 @@ class RetailcrmExportEvent extends RetailcrmAbstractEvent implements RetailcrmEv
|
|||||||
}
|
}
|
||||||
|
|
||||||
$orders = array();
|
$orders = array();
|
||||||
$orderRecords = Order::getOrdersWithInformations();
|
$orderRecords = RetailcrmExport::getOrdersIds();
|
||||||
$orderBuilder = new RetailcrmOrderBuilder();
|
$orderBuilder = new RetailcrmOrderBuilder();
|
||||||
$orderBuilder->defaultLangFromConfiguration()->setApi($api);
|
$orderBuilder->defaultLangFromConfiguration()->setApi($api);
|
||||||
|
|
||||||
@ -97,20 +97,64 @@ class RetailcrmExportEvent extends RetailcrmAbstractEvent implements RetailcrmEv
|
|||||||
try {
|
try {
|
||||||
$orders[] = $orderBuilder->buildOrderWithPreparedCustomer();
|
$orders[] = $orderBuilder->buildOrderWithPreparedCustomer();
|
||||||
} catch (\InvalidArgumentException $exception) {
|
} catch (\InvalidArgumentException $exception) {
|
||||||
RetailcrmLogger::writeCaller('export', $exception->getMessage());
|
RetailcrmLogger::writeCaller('export', sprintf('Error while building %s: %s', $record['id_order'], $exception->getMessage()));
|
||||||
RetailcrmLogger::writeNoCaller($exception->getTraceAsString());
|
RetailcrmLogger::writeNoCaller($exception->getTraceAsString());
|
||||||
RetailcrmLogger::output($exception->getMessage());
|
RetailcrmLogger::output($exception->getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
time_nanosleep(0, 500000000);
|
time_nanosleep(0, 250000000);
|
||||||
|
|
||||||
|
if (count($orders) == 50) {
|
||||||
|
$api->ordersUpload($orders);
|
||||||
|
$orders = array();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unset($orderRecords);
|
if (count($orders)) {
|
||||||
|
$api->ordersUpload($orders);
|
||||||
|
}
|
||||||
|
|
||||||
$orders = array_chunk($orders, 50);
|
$customers = array();
|
||||||
|
$customersRecords = RetailcrmExport::getCustomersIds();
|
||||||
|
|
||||||
foreach ($orders as $chunk) {
|
foreach ($customersRecords as $record) {
|
||||||
$api->ordersUpload($chunk);
|
$customerId = $record['id_customer'];
|
||||||
|
$addressId = $record['id_address'];
|
||||||
|
|
||||||
|
$cmsCustomer = new Customer($customerId);
|
||||||
|
|
||||||
|
if (Validate::isLoadedObject($cmsCustomer)) {
|
||||||
|
if ($addressId) {
|
||||||
|
$cmsAddress = new Address($addressId);
|
||||||
|
|
||||||
|
$addressBuilder = new RetailcrmAddressBuilder();
|
||||||
|
$address = $addressBuilder
|
||||||
|
->setAddress($cmsAddress)
|
||||||
|
->build()
|
||||||
|
->getDataArray();
|
||||||
|
} else {
|
||||||
|
$address = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$customers[] = RetailcrmOrderBuilder::buildCrmCustomer($cmsCustomer, $address);
|
||||||
|
} catch (\Exception $exception) {
|
||||||
|
RetailcrmLogger::writeCaller('export', sprintf('Error while building %s: %s', $customerId, $exception->getMessage()));
|
||||||
|
RetailcrmLogger::writeNoCaller($exception->getTraceAsString());
|
||||||
|
RetailcrmLogger::output($exception->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($customers) == 50) {
|
||||||
|
$api->customersUpload($customers);
|
||||||
|
$customers = array();
|
||||||
|
|
||||||
|
time_nanosleep(0, 250000000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($customers)) {
|
||||||
|
$api->customersUpload($customers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user