Розділи документації API
Документація API/CRM/Угоди

Угоди

Продажі в роботі: угода йде етапами воронки до виграшу чи програшу, має очікувану суму й товари, з неї виставляється рахунок. Право ролі: opportunity.

Маршрути

GET/opportunity
Список угод з пагінацією, фільтрами й total.
право: opportunity.view2 очк.
GET/opportunity/{id}
Одна картка.
право: opportunity.view1 очк.
GET/opportunity/count
Лише кількість за тими самими фільтрами (голе число).
право: opportunity.view2 очк.
POST/opportunity
Створити.
право: opportunity.create5 очк.
PUT/opportunity/{id}
Оновити.
право: opportunity.update5 очк.
DELETE/opportunity/{id}
Видалити.
право: opportunity.delete5 очк.
POST/opportunity/{id}/move-funnel
Перенести на інший етап чи в іншу воронку: { "funnel_id": 2, "status_id": 9 }. Без status_id угода стає на перший етап воронки.
право: opportunity.update5 очк.
GET/opportunity/document-products/{id}
Позиції з уже виставленою й доступною кількістю для часткового рахунку.
право: opportunity.view2 очк.
POST/opportunity/{id}/create-invoice
Виставити рахунок з угоди.
право: invoice.create5 очк.
POST/opportunity/{id}/create-act
Створити акт виконаних робіт.
право: document.create5 очк.
GET/opportunity/deleted?since=…
Видалені: див. Синхронізація.
право: opportunity.view2 очк.

Усі поля

Обов’язкове лише name. Теги й доп. поля описано в розділі Вкладені дані.

ПолеТипОбмеженняОпис
nameобов.рядок≤ 255 симв.Назва угоди.
external_idрядок≤ 64 симв.Ключ запису у вашій системі. Унікальний; пошук: filter[external_id;eq]. Див. «Синхронізація».
amountціле, копійкиОчікувана сума угоди, копійки.
currency_ididВалюта (/currency).
exchange_rateдесяткове (рядок)Курс валюти до гривні на дату документа: десяткове число рядком, напр. "41.250000". Для гривні завжди 1; якщо для валюти курс не передано, береться курс довідника.
repeatціле0 | 1Повторний (1) чи перший (0) продаж.
descriptionрядок≤ 1024 симв.Опис / коментар.
next_stepрядок≤ 100 симв.Наступний крок.
probabilityціле≤ 100Ймовірність виграшу, %.
falter_reason_ididПричина програшу (/lookup?type=reason).
falter_reason_textрядок≤ 250 симв.Коментар до причини програшу.
closed_dateдата-часДата закриття.
status_ididЕтап воронки угод. Якщо не передано, ставиться перший етап.
funnel_ididВоронка (/lead/funnel).
type_ididТип угоди (/lookup?type=opp_type).
source_ididДжерело (/lookup?type=source).
owner_ididВідповідальний користувач (/user). Якщо не передано, це користувач токена.
contact_ididКонтакт (/contact).
account_ididКонтрагент (/account).
lead_opportunity_ididЛід, з якого створено угоду.
project_ididПроєкт.
project_stage_ididЕтап проєкту.
is_archivedboolВ архіві. Архівні записи приховує параметр is_archived=true.
tagsмасив TagТеги: [{"id": 3}] або [{"name": "VIP"}]. Передані замінюють усі теги запису. Див. «Вкладені дані».
idлише читанняцілеІдентифікатор запису.
costлише читанняціле, копійкиСума позицій у копійках, рахує сервер.
paymentлише читанняціле, копійкиСплачено за рахунками угоди, у копійках; рахує сервер.
won_atлише читаннядата-часКоли виграно. Ставить сервер при переході на етап kind=won.
lost_atлише читаннядата-часКоли програно. Ставить сервер при переході на етап kind=lost.
created_by_idлише читанняidХто створив запис.
shop_idлише читанняidМагазин (філія), ставиться з профілю користувача.
created_atлише читаннядата-часЧас створення.
updated_atлише читаннядата-часЧас останньої зміни, на ньому будується інкрементальна синхронізація.
deleted_atлише читаннядата-часЧас видалення (у звичайних відповідях завжди null).
tasksлише читаннямасив TaskЗавдання запису (лише у відповіді).
tasks_countлише читанняціле
updated_userлише читанняоб’єкт UserХто змінив запис останнім.
subлише читаннярядокСлужбове поле, ігноруйте.
versionлише читанняцілеСлужбовий лічильник змін запису.

Вкладені масиви

  • opportunity_extra_fields: пишеться в тілі POST/PUT, формат див. у розділі Вкладені дані.
Повʼязані обʼєкти для ?expand= (14)

Без expand приходять як null; писати їх не можна, передавайте відповідне *_id.

Currency → CurrencyFalterReason → LookupStatus → LeadFunnelItemFunnel → LeadFunnelType → LookupSource → LookupOwner → UserCreatedBy → UserShop → ShopContact → ContactAccount → AccountLead → LeadProject → ProjectProjectStage → ProjectStage

Службові поля у відповіді, ігноруйте: OldOpportunity.

Воронки та етапи

Воронки угод живуть у тому ж довіднику, що й воронки лідів, але з entity_type=opportunity. Тип етапу kind: open (в роботі), won (виграно), lost (програно).

Воронки угод

GET /api/v1/lead/funnel?filter[entity_type;eq]=opportunity

Етапи воронки 2

GET /api/v1/lead/funnel/lead-funnel-items?filter[funnel_id;eq]=2&order=order

{ "items": [ { "id": 8, "name": "Нерозібрані", "kind": "open", "order": 1 }, ... ] }

Виграш і програш

Перенесіть угоду на етап з kind=won або kind=lost через move-funnel чи звичайний PUT зі status_id. Сервер сам поставить won_at / lost_at; повернення на відкритий етап їх скидає. Від цих дат рахуються плани продажів і комісії.

Позиції документа

Товари й послуги документа. Власного права в позицій немає: читати їх може той, хто бачить документ, а змінювати той, хто може змінювати документ. Сума документа перераховується автоматично.

GET/opportunity/{id}/items
Позиції з товаром і одиницею, з total.
право: opportunity.view2 очк.
POST/opportunity/{id}/items
Додати позицію.
право: opportunity.update10 очк.
PUT/opportunity/{id}/items/{item_id}
Змінити кількість, ціну, знижку.
право: opportunity.update10 очк.
DELETE/opportunity/{id}/items/{item_id}
Видалити позицію.
право: opportunity.update10 очк.
ПолеТипОбмеженняОпис
entity_typeобов.лише читаннярядокТип документа, береться зі шляху.
entity_idобов.лише читанняidId документа, береться зі шляху.
product_idобов.idТовар. Для kind=custom не потрібен.
nameрядок≤ 120 симв.Назва рядка. Для kind=custom обов’язкова, для товару береться з картки.
kindрядокproduct | custom, ≤ 10 симв.product (товар) або custom (довільний рядок без товару, напр. доставка чи послуга).
cost_priceціле, копійкиСобівартість одиниці, копійки. Вводиться лише для kind=custom; у товарного рядка береться з партій і в запиті ігнорується.
cost_sourceрядокnone | manual | product | batch, ≤ 10 симв.Звідки собівартість: none, manual, product, batch.
unit_labelрядок≤ 30 симв.Підпис одиниці.
input_unit_ididОдиниця введення / упаковка (/product/{id}/units).
input_quantityціле, ×1000Кількість в упаковках, ×1000.
input_priceціле, копійкиЦіна упаковки, копійки.
priceціле, копійкиЦіна за одиницю, копійки. При додаванні ставиться базова ціна товару; змінюйте PUT рядка.
quantityціле, ×1000Кількість, ×1000.
discount_amountціле, копійкиЗнижка сумою, копійки.
discountціле≤ 10000Знижка, соті частки % (1000 = 10 %). Якщо не передано, діє персональна знижка клієнта.
exchange_rateдесяткове (рядок)Курс перерахунку ціни товару у валюту документа (службове).
reason_ididПричина (для повернень).
price_book_ididПрайс-лист, з якого взято ціну.
statusрядокСтатус рядка (службове).
descriptionрядок≤ 255 симв.Коментар до рядка.
idлише читанняцілеІдентифікатор запису.
unit_idлише читанняidОдиниця товару (лише у відповіді).
input_factorлише читаннядесяткове (рядок)Скільки базових одиниць в упаковці, береться з картки товару.
product_unitsлише читаннямасив ProductUnitОдиниці товару (лише у відповіді).
totalлише читанняціле, копійкиПідсумок рядка, рахує сервер.
created_atлише читаннядата-часЧас створення.
updated_atлише читаннядата-часЧас останньої зміни, на ньому будується інкрементальна синхронізація.
updated_userлише читанняоб’єкт UserХто змінив запис останнім.
subлише читаннярядокСлужбове поле, ігноруйте.
versionлише читанняцілеСлужбовий лічильник змін запису.

Вкладені масиви

  • batches: лише у відповіді (expand=Batches).
  • serial_numbers: лише у відповіді (expand=SerialNumbers).
Повʼязані обʼєкти для ?expand= (4)

Без expand приходять як null; писати їх не можна, передавайте відповідне *_id.

InputUnit → LookupProduct → ProductReason → LookupPriceBook → PriceBook

Службові поля у відповіді, ігноруйте: UserId, OldEntityProduct.

Додати товар

POST /api/v1/opportunity/85/items
Idempotency-Key: opportunity-85-add-258

{ "product_id": 258, "quantity": 3000 }

Змінити ціну й знижку рядка

PUT /api/v1/opportunity/85/items/323
{ "price": 145000, "discount": 500 }
Документ і рядок беруться зі шляху: entity_type / entity_id у тілі ігноруються. Рядок чужого документа в цьому шляху дає 404. Закритий обліковий період, недостатній залишок чи вже проведений документ дають 422 з поясненням (див. Помилки).

Приклади

Створити угоду

POST /api/v1/opportunity
Idempotency-Key: crm-deal-77

{
  "name": "Освітлення шоуруму",
  "external_id": "deal-77",
  "account_id": 12,
  "amount": 18500000,
  "currency_id": 1,
  "probability": 40
}

Угоди менеджера на етапі 9 з сумою від 100 000 грн

GET /api/v1/opportunity?filter[owner_id;eq]=7&filter[status_id;eq]=9&filter[amount;gte]=10000000&order=-amount

Виставити рахунок на всі позиції

POST /api/v1/opportunity/13/create-invoice
{}
Угоду можна отримати й кваліфікацією ліда (Ліди, прапорець opportunity).