Wiki Bitrix

Entity\DataManager для b_sale_order

Как таблицу заказов перевести на ORM В7 для замены неуклюжего CSaleOrder::GetList(), плюс пользовательские поля? Ниже - вариант решения.

request.php
namespace Vendor\Dealer\Orm\Request;
 
use \Bitrix\Main\Entity;
 
/*
 
"Заявка с сайта". То, что обычно делается через `CSaleOrder::GetList`, но последний имеет ограничения, нельзя сделать LOGIC ... OR и выбрать по условию "или"
 
*/
 
 
class RequestTable extends Entity\DataManager {
 
  public static function getTableName() {
    return 'b_sale_order';
  }
 
  public static function getMap() {
 
    return [
      new Entity\IntegerField('ID', ['primary' => true]), // совпадает с ACCOUNT_NUMBER
      new Entity\StringField('LID', ['size' => 2]),
      new Entity\StringField('STATUS_ID', ['size' => 1]),
      new Entity\DatetimeField('DATE_STATUS'),
      new Entity\FloatField('PRICE'),
      new Entity\FloatField('TAX_VALUE'),
      new Entity\IntegerField('USER_ID'),
      new Entity\ReferenceField(
        'USER',
        'Bitrix\Main\UserTable',
        ['=this.USER_ID' => 'ref.ID']
      ),
      new Entity\DatetimeField('DATE_INSERT'),
      new Entity\StringField('USER_DESCRIPTION', ['size' => 250]),
      new Entity\BooleanField('UPDATED_1C', ['values' => ['N', 'Y'], 'default_value' => 'N']),
      new Entity\BooleanField('RESERVED', ['values' => ['N', 'Y'], 'default_value' => 'N']),
 
      /*
        Дополнительные "внешние" свойства заказа
        Указывать в виде ID оказалось быстрее, чем по коду `CODE`
      */
 
      // NUMBER_1C
      new Entity\ReferenceField(
        'PROP_NUMBER_1C',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 29),
        ]
      ),
      new Entity\ExpressionField('NUMBER_1C', '%s', 'PROP_NUMBER_1C.VALUE'),
 
      // PARTNER
      new Entity\ReferenceField(
        'PROP_PARTNER',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 7),
        ]
      ),
      new Entity\ExpressionField('PARTNER', '%s', 'PROP_PARTNER.VALUE'),
 
      // NUMBER - номер заказа по вашей нумерации
      new Entity\ReferenceField(
        'PROP_CUST_NUMBER',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 9),
        ]
      ),
      new Entity\ExpressionField('CUST_NUMBER', '%s', 'PROP_CUST_NUMBER.VALUE'),
 
      // DATE - дата заказа по вашей нумерации
      new Entity\ReferenceField(
        'PROP_CUST_DATE',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 10),
        ]
      ),
      new Entity\ExpressionField('CUST_DATE', '%s', 'PROP_CUST_DATE.VALUE'),
 
 
      // TECH_REQUEST
      new Entity\ReferenceField(
        'PROP_TECH_REQUEST',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 20),
        ]
      ),
      new Entity\ExpressionField('TECH_REQUEST', '%s', 'PROP_TECH_REQUEST.VALUE'),
 
      // ORDER_GUID
      new Entity\ReferenceField(
        'PROP_ORDER_GUID',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 21),
        ]
      ),
      new Entity\ExpressionField('ORDER_GUID', '%s', 'PROP_ORDER_GUID.VALUE'),
 
      // EXPRESS_ORDER
      new Entity\ReferenceField(
        'PROP_EXPRESS_ORDER',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
          [
            '=this.ID' => 'ref.ORDER_ID',
            '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 24),
          ]
      ),
      new Entity\ExpressionField('EXPRESS_ORDER', '%s', 'PROP_EXPRESS_ORDER.VALUE'),
 
      // NS_REQUEST
      new Entity\ReferenceField(
        'PROP_NS_REQUEST',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
          [
            '=this.ID' => 'ref.ORDER_ID',
            '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 32),
          ]
      ),
      new Entity\ExpressionField('NS_REQUEST', '%s', 'PROP_NS_REQUEST.VALUE'),
 
      // NS_REQUEST - Заявка для удовлетворения НС
      new Entity\ReferenceField(
        'PROP_NS_REQUEST',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 32),
        ]
      ),
      new Entity\ExpressionField('NS_REQUEST', '%s', 'PROP_NS_REQUEST.VALUE'),
 
      // URLISO_PLATELCHIK_NAME
      new Entity\ReferenceField(
        'PROP_URLISO_PLATELCHIK_NAME',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 14),
        ]
      ),
      new Entity\ExpressionField('URLISO_PLATELCHIK', '%s', 'PROP_URLISO_PLATELCHIK_NAME.VALUE'),
 
      // URLISO_GRUZOPOL_NAME
      new Entity\ReferenceField(
        'PROP_URLISO_GRUZOPOL_NAME',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 16),
        ]
      ),
      new Entity\ExpressionField('URLISO_GRUZOPOL', '%s', 'PROP_URLISO_GRUZOPOL_NAME.VALUE'),
 
      // INVOICE
      new Entity\ReferenceField(
        'PROP_INVOICE',
        'Vendor\Dealer\Orm\Request\RequestPropsTable',
        [
          '=this.ID' => 'ref.ORDER_ID',
          '=ref.ORDER_PROPS_ID' => new \Bitrix\Main\DB\SqlExpression('?i', 27),
        ]
      ),
      new Entity\ExpressionField('INVOICE', '%s', 'PROP_INVOICE.VALUE'),
 
    ];
  }
 
}
requestprops.php
// Свойства заказа
 
namespace Vendor\Dealer\Orm\Request;
 
use \Bitrix\Main\Entity;
 
class RequestPropsTable extends Entity\DataManager {
 
  public static function getTableName() {
    return 'b_sale_order_props_value';
  }
 
  public static function getMap() {
 
    return [
      new Entity\IntegerField('ID', ['primary' => true]),
      new Entity\IntegerField('ORDER_ID'),
      new Entity\IntegerField('ORDER_PROPS_ID'),
      new Entity\StringField('NAME'),
      new Entity\StringField('VALUE'),
      new Entity\StringField('CODE'),
    ];
 
  }
 
}