Частичные скидки в заказе
Частичная скидка действует не на все позиции заказа, а на выбранные. Позиция задаётся id строки заказа, order_lines[].id, а не product_id и не variant_id.
Один и тот же товар может стоять в заказе несколькими строками. Так бывает после расщепления комплекта: комплект K из товаров A и B превращается в отдельные строки A и B, и рядом может лежать ещё одна строка A, купленная отдельно. У строк совпадают product_id и даже variant_id, а скидка нужна только одной из них. Поэтому строку нельзя узнать по товару.
У строки заказа есть full_total_price и full_sale_price: это суммы уже с учётом скидок. Если раскладка по строкам не нужна, достаточно их.
Как назначить скидку
PUT /admin/orders/:id.json принимает discounts_attributes. Поля из справочника Order:
discount— величинаtype_id—1процент (значение по умолчанию),2суммаdescriptiondiscount_order_lines_ids— id строк, на которые скидка действует. Без массива скидка идёт на все строки
{
"order": {
"discounts_attributes": [
{
"discount": 10,
"description": "10% only for first order line",
"discount_order_lines_ids": [1]
}
]
}
}
В ответе у заказа есть массив discounts и поле discount — первая скидка массива, оно оставлено для старых клиентов. У объекта скидки два массива:
discount_order_lines_ids— строки заказаdiscount_products_ids— товары этих строк
Оба приходят заполненными, когда скидка частичная. Для записи передавайте только discount_order_lines_ids.
Удаление скидки — тот же PUT с id и _destroy:
{
"order": {
"discounts_attributes": [
{ "id": 1, "_destroy": 1 }
]
}
}
Создание заказа сразу с discount_order_lines_ids справочник не описывает: строки получают id уже после создания. Частичную скидку добавляют обновлением готового заказа.