Cs-Cart Теперь Работает С Retail Crm

Для товаров с вариациями сложнее, нужно external_id вариации добавлять в XmlId после external_id основного товара через хэштег #. Пусть этим займутся разработчики.

Добавить productName тоже несложно по аналогии с XmlId как написал выше.

В том и дело, основные сложности с вариациями.

Предыдущий код кривой.
Вот нормальный.

  1. app/addons/yml_export/Tygh/Ym/Offers/Base.php не трогаем.

  2. app/addons/retailcrm/Tygh/Addons/Retailcrm/Ym/Offers/Simple.php
    public function gatherAdditional($product)
    {
    parent::gatherAdditional($product);

     //$this->schema[] = 'purchasePrice';
     // @fm
     $this->schema[] = 'xmlId';
     $this->schema[] = 'productName';
    
     $this->offer['attr'] = array_merge($this->offer['attr'], self::getRetailCrmOfferAttributes($product));
     $this->offer['items'] = $this->getRetailCrmOfferItem($this->offer['items'], $product);
    
     return true;
    

    }

public static function getRetailCrmOfferItem($offer_item, $product)
{
if (!empty($product[‘yml2_purchase_price’])) {
$offer_item[‘purchasePrice’] = $product[‘yml2_purchase_price’];
}

    if (empty($offer_item['name'])) {
        $offer_item['name'] = $product['product'];
    }
    
    if (empty($offer_item['productName'])) {
        $offer_item['productName'] = $product['product'];
    }
    
    if (!empty($product['external_id'])) {
        $offer_item['xmlId'] = $product['external_id'];
    }
    
    $param = array(
                    'attr' => array(
                        'name' => 'Артикул',
                        'code' => 'article'
                    ),
                    'value' => $product['product_code']
                );
    
    $offer_item['param'][] = $param;
    
    
    return $offer_item;
}
  1. app/addons/retailcrm/Tygh/Addons/Retailcrm/Ym/Offers/Vendor.php
    public function gatherAdditional($product)
    {
    parent::gatherAdditional($product);

     // @fm_mod
     //$this->schema[] = 'purchasePrice';
     if (!in_array('name', $this->schema)) {
         $this->schema[] = 'name';
     }
     if (!in_array('productName', $this->schema)) {
         $this->schema[] = 'productName';
     }
     if (!in_array('xmlId', $this->schema)) {        
     	$this->schema[] = 'xmlId';
     }
    
     $this->offer['attr'] = array_merge($this->offer['attr'], Simple::getRetailCrmOfferAttributes($product));
     $this->offer['items'] = Simple::getRetailCrmOfferItem($this->offer['items'], $product);
    
     return true;
    

    }

2 лайка

Будете героем недели, если еще покажете всем, как передавать верный айди при выгрузке заказа в retalCRM))

Вот тут было предположение:

app\addons\retailcrm\Tygh\Addons\Retailcrm\Converters\OrderConverter.php

$item = array(
‘initialPrice’ => $original_price,
‘quantity’ => (float) $product[‘amount’],
‘discount’ => $discount,
‘productName’ => $product[‘product’],
‘product_id’ => $product[‘product_id’],
‘offer’ => array(
‘externalId’ => $product[‘product_id’],
// @fm_mod
‘xmlId’ => $product[‘external_id’]
)
);

Работоспособно ли на настоящее время это решение? Или в свете вышедших обновлений уже не актуально? Т.к. попробовал у себя - нет external_id ни в выгрузке, ни в заказе.

В последних обновлениях этот модуль не модифицировался.

Аналогично. Как я понял, $product[‘external_id’] выдает пустоту :frowning:
Увы, моих скромных познаний в программировании на подробнее не хватает.
@fevzi спаси нас :disappointed:

1 лайк

Очень уж хочется нормальной работы связки cs-cart - retailcrm - мой склад
@fevzi спаси нас :disappointed:

В общем в массиве $product не содержится значения external_id. Я пока смог придумать только костыль (работает):

Файл app/addons/retailcrm/Tygh/Addons/Retailcrm/Ym/Offers/Simple.php
Добавляем переменную $external_ids со значением, которое берется запросом из БД.

 if (empty($offer_item['productName'])) {
        $offer_item['ProductName'] = $product['product'];
    }

    $external_ids = db_get_fields('SELECT p.external_id FROM ?:products AS p WHERE product_id = ?i', $product['product_id']);

    if (!empty($external_ids)) {
        $offer_item['xmlId'] = $external_ids;
    }
1 лайк

Еще заметил неприятный момент: при создании заказа в RetailCRM, не срабатывает генерация купонов в CS-Cart… Кто-Нибудь знает как поправить?

По словам техподдержки, с версии 4.9.1 в модуле экспорта больше не передается параметр <name>, если вы экспортируете товары по vendor.model (в экспорте есть поля <vendor> и <model>).

Без этого параметра в RetailCRM не будут подгружаться названия товаров, пропадут из всех док-ов.
Так что трижды подумайте перед обновлением :slight_smile:

На самом деле это не так.

Вам уже ответили в Help Desk, что поле name будет выгружаться для типа vendor.model, в случае, если для прайс-листа стоит галочка Прайс-лист для retailCRM.

Однако, в 4.9.1 из-за ошибки в принципе невозможно выгрузить прайс лист. Данная ошибка уже исправлена и её исправление войдёт в 4.9.2

Выгрузка в retailCRM через модуль генерации YML конечно путает.
Да, это было очень логично и целесообразно с точки зрения трудозатрат реализовать подобным образом, т.к. ICML является расширением YML, но… слишком запутанно просто на ровном месте.

Я считаю, что не должен пользователь морочиться техническими тонкостями и вникать - из-за какого параметра всё пошло не так.
Нам всем максимум, что нужно - указать, какие директории включить/исключить в выгрузке.
Есть стандарт ICML, он очень прост. Хочется просто нажать кнопку и получить нормальный файл. Ну или чтобы он генерился по крону.

Это настолько простая задача (даже с учетом поддержки вариаций - нескольких товарных предложений для одного товара), что непонятно, почему до сих пор есть проблемы.

Если пользоваться еще и МойСклад/1С, то этот модуль вообще не имеет смысла. Проще считать, что его нет, и заказывать разработку на стороне.

Будет ли дорабатываться этот модуль обмена?

На самом деле так.
Уже вышла 4.9.2SP3 и в ней экспортный файл идет без выгрузки названия файла.
В лучших традициях 1С я начинаю бояться обновления до следующей версии…

Мой коллега ответил в вашем тикете в Help desk. Проблема была вызвана модификацией в файлах модуля RetailCRM в вашей установке

Добрый день.

Подскажите, пожалуйста, у кого реализована связка cs-cart - retailcrm - мойсклад? Расскажите об обработке заказа.
Остатки выгружаются из МС в cs-cart по commerceml, а также через icml в retailcrm. После размещения заказа на сайте он переносится в retailcrm и в МС. Где осуществляется смена статуса и отгрузки?
Меняется ли при этом статус автоматически в МС и cs-cart?

По докам RCRM: Интеграция сайта с МойСклад должна быть односторонней. То есть получаем остатки товаров из МС, но вот заказы отправляем только в RCRM.
RetailCRM <-> CS-Cart
МойСклад <- CS-Cart
RetailCRM <-> МойСклад

RCRM уже самостоятельо отправит заказы в МС.
В модуле интеграции RCRM - МС настройте соответствие статусов и там где-то есть пункт, в каком статусе создавать отгрузку.