16. Анализ плана закупок — ключ analize в ответе списка документов (type=procurement_plan)
Date: 2026-02-08
Status
Accepted
Context
При запросе GET /api/v2/documents/?type__key__in=procurement_plan&... необходимо возвращать структурированный анализ плана закупки: выполнение по позициям (с ограничением 100%), экономия относительно исторической базы, метрики для фин. директора и рекомендации.
Decision
Добавить в ответ каждого документа типа procurement_plan поле analize (SerializerMethodField в AllDocumentSerializerV2). Для документов с type.key != 'procurement_plan' поле равно null. Имя поля оставлено «analize» в соответствии с ТЗ.
Структура analize:
positions_fulfillment— по каждой позиции:position_id,required_quantity,purchased_quantity,fulfillment_percent(макс 100%),capped_at_100plan_fulfillment_summary— сводка:total_required,total_purchased,avg_fulfillment_percent,positions_count,positions_over_100_countsavings_analysis—avg_last_2_supplies,planned_purchase_avg,avg_last_3_we_buy,savings_vs_baseline,savings_percent,interpretationmetrics— бюджет (planned/ordered/supplied), просрочки, концентрация поставщиков, конверсия офферовrecommendations— массив текстовых рекомендаций по порогам
Обоснование
- Единая точка входа — анализ доступен в том же эндпоинте, что и список планов, без отдельного запроса.
- Обратная совместимость — поле опционально (null для не‑план-документов), существующие клиенты не ломаются.
- Польза для фин. директора — один объект содержит исполнение плана, экономию, бюджет и рекомендации.
Consequences
- (+) Фронт и отчёты получают готовый анализ без дублирования логики.
- (-) Увеличение времени ответа при списке планов из‑за расчёта analize; смягчено prefetch (ADR-005).
Источник: backend/narmak_v2/app/document/ADR.md (ADR-001)