Skip to content

Документы и сущности системы

Эта страница описывает сквозную логику SNABZHENETS+: какие документы и справочники есть в системе, как они называются в интерфейсе и как должны связываться друг с другом от клиентской потребности до закупки, оплаты, поставки и аналитики.

При изменении схемы данных или пользовательских потоков эту карту нужно обновлять вместе с кодом, чтобы названия документов и связи оставались едиными для разработки и документации.

Принципы сквозной модели

В системе есть два уровня идентификации.

УровеньЧто хранитДля чего используется
idТехнический UUID записиСвязи в базе, API, аудит, вложения
Номер документаЧеловекочитаемый номер вроде REQ-00001, PUR-00001, CP-20260506113000Интерфейс, поиск, печатные формы, коммуникация с клиентами и поставщиками

Все рабочие данные изолированы внутри портала через tenantId. Номенклатура, контрагенты, документы, склад, счета, платежи, файлы и аудит одного портала не должны смешиваться с данными другого портала.

Позиции документов должны сохранять снимок названия, артикула, единицы измерения, цены и условий на момент создания документа. Для этого в моделях используются поля productNameSnapshot, skuSnapshot, uom, суммы, НДС и комментарии. Даже если карточка товара или контрагента позже изменится, исторический документ должен оставаться читаемым в исходном виде.

Единый формат строк для закупочного контура повторяет PO: номенклатура или название, количество, ед. изм., цена, сумма, НДС, дата поставки и комментарий. Такой формат используется в заявке на закупку из PO, RFQ поставщику, КП и входящем счёте.

Файловый обмен строк PO ведётся через домен PROCUREMENTS в data_exchange_jobs: template, import preview, mapping, apply и export работают для текущей закупки, а не как локальная CSV-операция фронтенда. Импорт поддерживает режимы добавления, обновления по SKU или точному сочетанию названия и единицы измерения, а также полной замены строк после успешного preview.

Как процесс виден в интерфейсе

Рабочий портал показывает не отдельные таблицы, а один закупочный маршрут. Один и тот же документ можно увидеть в воронке, реестре, карточке закупки, аналитике и связанных справочниках.

  • Заявки (PO) — канбан закупочной воронки. Колонки отражают рабочие статусы: черновик, в работе, поиск поставщика, ожидание КП, согласование, ожидание оплаты и просроченные заявки.
  • Заявки на закупку — реестр внутренних потребностей. В строке видны дата создания, номер заявки, контекст PO, инициатор, срок, статус и количество позиций. Раскрытая строка показывает подразделение, проект, источник PO, комментарий и состав потребности.
  • Карточка закупки — рабочее место закупщика. Здесь ведутся позиции, бюджет, срок закупки, поставщики, RFQ, КП, счета, приход на склад, история статусов и быстрые переходы к связанным документам.
  • Номенклатура — единый каталог товаров и услуг. Он хранит коды, артикулы, названия, категории, единицы измерения, статусы, остатки и цены, чтобы строки PO, RFQ и счетов не заполнялись вручную заново.
  • Контрагенты — общая база покупателей, поставщиков и перевозчиков. Одна карточка хранит профиль, форму, ИНН, контакты, теги, статус и supplier-профиль, если контрагент участвует в закупках.
  • Аналитика — сводка по PO, счетам, поставщикам и срокам. Здесь видны объём закупок, сумма к оплате, выполнение бюджета, конверсия заявок, on-time delivery, средний цикл, просрочки и топ поставщиков.
  • Интеграции — маркет подключений и API-инструменты. Через него связываются email, webhooks, ERP/1C, ЭДО, банки, BI и другие внешние сервисы.

Такой интерфейс помогает пройти путь от клиентской потребности до оплаты и поставки без ручной сборки цепочки из переписок, файлов и разрозненных таблиц.

Основные документы

Код / номерДокумент в интерфейсеМодельНазначениеКлючевые связи
PO / внешний номерЗаявка или заказ от покупателяОтдельной модели сейчас нетВнешнее основание от клиента: письмо, заказ, заявка, тендерная потребность. В текущей схеме фиксируется как clientRef, externalReference, комментарий или вложение к связанному документуПокупатель, КП, исходящий счёт, заявка на закупку
REQ-00001Заявка на закупкуProcurementRequestВнутренний запрос от инициатора: что нужно купить, в каком количестве, к какому сроку и для какого контекстаИнициатор, позиции заявки, будущая закупка
Строка заявкиПозиция заявки на закупкуProcurementRequestItemКонкретная потребность в PO-формате: товар или услуга, количество, ед. изм., цена, сумма, НДС, дата поставки, бренд и комментарийЗаявка, номенклатура, единица измерения, позиция закупки
PUR-00001 / PO-...Закупка / закупочная воронкаProcurementРабочий объект закупщика: входящий запрос клиента, shortlist поставщиков, условия, КП, победитель, счета, поставкаЗаявка, заказчик-контрагент, ответственный, поставщики, КП поставщиков, входящие счета, склад
Строка закупкиПозиция закупкиProcurementItemПозиция, которую реально закупают. Может быть перенесена из заявки или создана вручнуюЗакупка, позиция заявки, номенклатура, RFQ, котировки
Участник закупкиПоставщик в закупкеProcurementSupplierПоставщик, которого пригласили или рассматривают в конкретной закупкеЗакупка, профиль поставщика, котировки, RFQ
RFQ-...Заявка поставщику / запрос КПSupplierRfqИсходящий запрос поставщику на цену, сроки и условия поставкиЗакупка, поставщик, позиции RFQ, токен портала поставщика
Строка RFQПозиция заявки поставщикуSupplierRfqItemЧто именно запрашивается у поставщика в PO-подобном формате: количество, ед. изм., целевая цена, НДС, срок поставки, комментарий и допустимость аналоговRFQ, позиция закупки, номенклатура
QUOTE-...Ответ поставщика / КП поставщикаSupplierQuoteПолученное от поставщика предложение с ценами, сроками, условиями и источникомЗакупка, RFQ, поставщик, версии, события статусов
Строка ответа поставщикаПозиция КП поставщикаSupplierQuoteItemЦена, скидка, НДС, срок поставки и решение по строкеКП поставщика, строка RFQ, номенклатура
Версия ответаВерсия КП поставщикаSupplierQuoteVersionСнимок предложения при отправке или пересогласованииКП поставщика, автор сохранения
Котировка закупкиСравнительная котировкаProcurementQuoteВнутренняя запись для сравнения предложений и выбора победителяПоставщик в закупке, КП поставщика, закупка
Строка котировкиПозиция сравнительной котировкиProcurementQuoteItemСопоставление строк закупки и строк предложения поставщикаКотировка закупки, позиция закупки, строка КП поставщика
Номер поставщикаВходящий счётInvoiceСчёт от поставщика на оплату закупки. Старые счета могут хранить только сумму, новые счета создаются со строкамиЗакупка, поставщик, файл счёта, позиции счёта, оплаты, история цен
Строка входящего счётаПозиция входящего счётаInvoiceItemСтрока счета в PO-формате: товар, количество, ед. изм., цена, сумма, НДС, дата поставки и комментарийВходящий счёт, позиция закупки, номенклатура
ПлатёжОплата входящего счётаPaymentФакт оплаты поставщику, включая частичные оплатыВходящий счёт
CP-...Коммерческое предложение клиентуCommercialProposalSell-side предложение покупателю: цены, сроки, условия оплаты и поставкиПокупатель, позиции КП, исходящий счёт
Строка КППозиция коммерческого предложенияCommercialProposalItemТовар или услуга в PO-подобном формате: количество, ед. изм., цена, сумма, скидка, НДС, срок поставки и комментарийКП, номенклатура, строка исходящего счёта
SI-...Счёт клиенту / исходящий счётSalesInvoiceСчёт на оплату для покупателя. Может быть создан из КП или напрямуюПокупатель, КП, оплаты клиента
Строка исходящего счётаПозиция счёта клиентуSalesInvoiceItemСтрока, выставленная покупателюИсходящий счёт, строка КП, номенклатура
Платёж клиентаОплата исходящего счётаSalesInvoicePaymentФакт оплаты от покупателяИсходящий счёт

Справочники и рабочие сущности

СущностьМодельЧто означаетГде используется
Портал / организацияTenantИзолированная рабочая область компанииВладеет всеми tenant-данными
ПользовательUserСотрудник портала или платформенный администратор. Для сотрудника хранится отдел, должность, телефон, Telegram и признак обязательной смены временного пароляИнициирует заявки, отвечает за закупки, действует в аудитах
ОтделDepartmentTenant-справочник подразделений сотрудниковГрупповой доступ к документам уровня Для группы, профиль пользователя
РольRoleНабор прав пользователя по матрице доступаУправление доступом, навигацией и действиями
РазрешениеPermissionКонкретное право на действиеРоли и RBAC
КонтрагентCounterpartyЮрлицо, ИП, физлицо или иностранная компанияПокупатели, поставщики, перевозчики, счета, КП
Профиль поставщикаSupplierДополнительная закупочная карточка контрагентаЗакупки, цены, входящие счета
НоменклатураCatalogItemТовар или услуга из каталогаПозиции заявок, закупок, RFQ, КП, счетов, склад
КатегорияCatalogCategoryГруппа номенклатурыКаталог и аналитика
Единица измеренияUnitШт, кг, м, услуга и другие единицыПозиции документов
СкладWarehouseМесто хранения или транзитная зонаОстатки и движения
ОстатокStockBalanceКоличество товара на складе: на руках, резерв, доступно, в путиКаталог, складская аналитика
Движение складаStockMovementПриход, расход, резерв, корректировка или перемещениеПриёмка по закупке или счёту, ручные корректировки
История ценPriceHistoryЗафиксированная закупочная цена по товаруКаталог, аналитика, повторные закупки
Прайс-листPriceListПрайс поставщика, покупателя или внутренний ориентирКаталог, контрагенты и сравнение цен
Строка прайсаPriceListItemКоммерческие условия по товару из номенклатуры: цена, валюта, минимальная партия, срок поставки и срок действияПрайс-лист, номенклатура
Версия прайсаPriceListVersionИстория изменения строк прайса и источник обновленияПрайс-лист, аудит изменений
ФайлFileВложение к документу или сущностиСчета, КП, закупки, контрагенты
Задача обмена даннымиDataExchangeJobPreview, mapping, apply и export для файлового обменаКаталог, остатки, позиции PO через домен PROCUREMENTS
КомментарийCommentОбсуждение внутри карточкиЛюбая сущность через entityType и entityId
Журнал аудитаAuditLogИстория действий и измененийВсе ключевые документы и справочники

Служебные и связующие сущности

СущностьМодельНазначение
Роль пользователяUserRoleСвязь пользователя и его единственной основной роли
Право ролиRolePermissionСвязь роли и разрешения
Refresh-токенRefreshTokenОснова будущего обновления сессий
Аудит входаLoginAuditУспешные и неуспешные попытки входа
Токен портала поставщикаSupplierRfqPortalTokenБезопасная ссылка поставщика на RFQ
Событие статуса RFQSupplierRfqStatusEventИстория переходов заявки поставщику
Событие статуса ответа поставщикаSupplierQuoteStatusEventИстория переходов КП поставщика
Событие статуса КП клиентуCommercialProposalStatusEventИстория переходов коммерческого предложения
Событие статуса счёта клиентуSalesInvoiceStatusEventИстория переходов исходящего счёта

Сквозной buy-side поток

Базовый закупочный поток начинается с внутренней потребности и заканчивается оплатой поставщику и складским отражением.

text
REQ Заявка на закупку
  -> PUR Закупка
    -> ProcurementSupplier shortlist поставщиков
      -> RFQ Заявка поставщику
        -> QUOTE Ответ поставщика
          -> ProcurementQuote сравнение и выбор победителя
            -> Invoice входящий счёт
              -> Payment оплата поставщику
              -> StockMovement приход на склад
              -> PriceHistory история закупочной цены

Правила работы:

  • Заявка REQ создаётся инициатором и содержит позиции потребности.
  • Закупка PUR / PO может быть создана из заявки или напрямую как быстрый входящий запрос клиента. При создании из заявки позиции должны переноситься в ProcurementItem, а заявка получает статус converted_to_procurement; при быстром создании позиции можно добавить уже внутри карточки закупки.
  • Если из PO создаётся заявка на закупку, все строки с ненулевым остатком заранее отмечены. Пользователь снимает лишние галочки, а цена, сумма, НДС и дата поставки копируются из строк PO.
  • В закупке закупщик формирует список поставщиков ProcurementSupplier.
  • Для каждого поставщика можно создать RFQ. RFQ можно запустить из заявки на закупку или напрямую из PO, если поставщик уже известен. В обоих случаях строки RFQ подтягиваются из источника и заранее отмечены.
  • Ответ поставщика QUOTE фиксирует цены, скидки, НДС, сроки и условия. Если ответ пришёл через RFQ, он связан с SupplierRfq.
  • Внутренняя ProcurementQuote нужна для сравнения предложений и выбора победителя. Победитель записывается в selectedSupplierId, selectedSupplierCounterpartyId и selectedQuoteId закупки.
  • Входящий счёт Invoice связывается с закупкой и поставщиком. Новые счета создаются со строками: сумма и НДС считаются из выбранных позиций, а при привязке к PO строки подтягиваются из доступного остатка.
  • При приёмке создаются движения склада StockMovement, обновляются остатки StockBalance, а закупочные цены попадают в PriceHistory.

Сквозной sell-side поток

Sell-side поток начинается с покупателя и заканчивается выставлением и оплатой исходящего счёта.

text
PO / внешняя заявка покупателя
  -> CP Коммерческое предложение
    -> SI Счёт клиенту
      -> SalesInvoicePayment оплата клиента

Правила работы:

  • Покупатель хранится как Counterparty с сегментом buyer.
  • Если клиент прислал PO, заявку, письмо или тендерное основание, в текущей схеме это внешний документ. Его нужно фиксировать в clientRef, externalReference, комментарии или файле до появления отдельной модели CustomerOrder.
  • Коммерческое предложение CP создаётся на покупателя и содержит условия продажи: позиции, цены, НДС, сроки, оплату и доставку.
  • Строки КП заполняются тем же PO-подобным редактором, чтобы названия, количества, цены, суммы, НДС, сроки поставки и комментарии не расходились с закупочным контуром.
  • Принятое КП может быть конвертировано в исходящий счёт SI; строки счёта сохраняют связь со строками КП.
  • Оплаты клиента фиксируются как SalesInvoicePayment; сумма оплаты обновляет paidAmount, outstandingAmount и статус счёта.
  • Если для выполнения клиентского заказа нужна закупка, в Procurement фиксируется быстрый клиентский контекст: номер заявки клиента, заказчик-контрагент или текстовое название компании, ожидаемая клиентом дата и файл запроса. Целевая логика на будущее: отдельный PO/CustomerOrder связывает покупателя, КП, закупочные заявки и исходящие счета напрямую.

Статусы основных документов

Заявка на закупку

СтатусНаименованиеСмысл
newНоваяЗаявка создана
under_reviewНа проверкеЗаявку проверяет закупщик или руководитель
acceptedПринятаЗаявку можно передавать в закупку
needs_clarificationНужно уточнениеНе хватает данных по позициям, срокам или контексту
converted_to_procurementПередана в закупкуПо заявке создана закупка
cancelledОтмененаЗаявка закрыта без закупки

Закупка

СтатусНаименованиеСмысл
draftЧерновикЗакупка создана, данные ещё заполняются
in_progressВ работеЗакупщик ведёт закупку
supplier_searchПоиск поставщикаФормируется список поставщиков
waiting_quoteОжидаем КПЗапрошены или ожидаются предложения
approvalСогласованиеПобедитель и условия проходят согласование
waiting_paymentОжидает оплатыЕсть счёт или условия к оплате
paidОплаченоОплата поставщику выполнена
in_deliveryВ путиПоставка ожидается
partially_receivedЧастично полученоПринята часть количества
fully_receivedПолученоПоставка получена полностью
closedЗакрытоЗакупка завершена
cancelledОтмененоЗакупка остановлена
overdueПросроченоНарушен контрольный срок

RFQ поставщику

СтатусНаименованиеСмысл
DRAFTЧерновикЗапрос готовится
PENDING_APPROVALНа согласованииЗапрос ожидает внутреннего подтверждения
APPROVEDСогласованМожно отправлять поставщику
REJECTEDОтклонёнНужно доработать или отменить
SENTОтправленЗапрос ушёл поставщику
VIEWEDПросмотренПоставщик открыл запрос
PARTIALLY_ANSWEREDЧастично отвеченОтвет получен не по всем позициям
ANSWEREDОтвеченПоставщик дал ответ
EXPIREDИстёкСрок ответа прошёл
CLOSEDЗакрытРабота по запросу завершена
CANCELLEDОтменёнЗапрос отменён

Ответ поставщика

СтатусНаименованиеСмысл
DRAFTЧерновикОтвет готовится
SUBMITTEDПоданПоставщик или менеджер отправил предложение
UNDER_REVIEWНа проверкеЗакупщик анализирует условия
REVISION_REQUESTEDЗапрошена правкаПоставщику нужна доработка
RESUBMITTEDПодан повторноПоставщик прислал исправленную версию
ACCEPTEDПринятПредложение принято полностью
PARTIALLY_ACCEPTEDПринят частичноПриняты отдельные строки
REJECTEDОтклонёнПредложение не подходит
WITHDRAWNОтозванПоставщик или менеджер снял предложение
EXPIREDИстёкПредложение потеряло актуальность

Входящий счёт

СтатусНаименованиеСмысл
draftЧерновикСчёт заведён, но ещё не готов к оплате
uploadedЗагруженФайл счёта загружен
checkingНа проверкеРеквизиты и суммы проверяются
waiting_paymentОжидает оплатыСчёт готов к оплате
partially_paidОплачен частичноЗарегистрирована часть оплаты
paidОплаченСчёт закрыт оплатами
overdueПросроченСрок оплаты прошёл
voidedАннулированСчёт исключён из оплаты

Коммерческое предложение

СтатусНаименованиеСмысл
DRAFTЧерновикКП готовится
PENDING_APPROVALНа согласованииКП ожидает внутреннего подтверждения
APPROVEDСогласованоКП можно отправлять клиенту
REJECTEDОтклоненоКП нужно доработать
SENTОтправленоКП отправлено покупателю
VIEWEDПросмотреноПокупатель открыл КП
ACCEPTEDПринятоПокупатель согласился
DECLINEDОтклонено клиентомПокупатель отказался
EXPIREDИстеклоСрок действия КП прошёл
CONVERTED_TO_INVOICEСконвертировано в счётПо КП создан исходящий счёт
CANCELLEDОтмененоКП отменено внутри системы

Счёт клиенту

СтатусНаименованиеСмысл
DRAFTЧерновикСчёт готовится
PENDING_APPROVALНа согласованииОжидает внутреннего подтверждения
APPROVEDСогласованМожно выставлять
ISSUEDВыставленСчёт выпущен
SENTОтправленСчёт отправлен покупателю
VIEWEDПросмотренПокупатель открыл счёт
PARTIALLY_PAIDОплачен частичноЕсть частичная оплата
PAIDОплаченСчёт полностью закрыт
OVERDUEПросроченОплата просрочена
VOIDEDАннулированСчёт аннулирован
CANCELLEDОтменёнСчёт отменён до завершения

Статусы справочников и сервисного слоя

ОбластьЗначенияНаименования
Общий статус записиactive, inactive, blocked, archivedАктивно, неактивно, заблокировано, в архиве
Пользовательinvited, active, suspended, deletedПриглашён, активен, приостановлен, удалён
Контрагентllc, ie, individual, self_employed, foreign_companyЮрлицо/ООО, ИП, физлицо, самозанятый, иностранная компания
Сегмент контрагентаsupplier, buyer, carrierПоставщик, покупатель, перевозчик
Поставщикnew, active, checking, risky, blockedНовый, активный, на проверке, рисковый, заблокированный
Складstorage, transit, returnsХранение, транзит, возвраты
Движение складаreceipt, issue, transfer_in, transfer_out, adjustment, reservation, release, in_transit_increase, in_transit_decreaseПриход, расход, перемещение, корректировка, резерв, снятие резерва, изменение количества в пути
Подписка порталаTRIAL, ACTIVE, EXPIRED, BLOCKED, CANCELED, MANUAL_PENDING, ENTERPRISE_REQUESTEDТриал, активна, истекла, заблокирована, отменена, ручное ожидание, запрос Enterprise
Биллинг-платёжPENDING, PAID, FAILED, CANCELEDОжидает, оплачен, ошибка, отменён
Установка интеграцииPENDING_CONFIG, ACTIVE, ERROR, DISABLED, UNINSTALLEDОжидает настройки, активна, ошибка, отключена, удалена
Синхронизация интеграцииSUCCESS, ERROR, RUNNING, IDLEУспешно, ошибка, выполняется, простаивает

Административные, биллинговые и интеграционные сущности

СущностьМодельНазначение
API-ключApiKeyДоступ внешних систем к API портала
Исходящий вебхукWebhookОтправка событий портала во внешнюю систему
Категория интеграцийIntegrationCategoryГруппировка интеграций в маркетплейсе
ИнтеграцияIntegrationDefinitionОписание доступного подключения
Установка интеграцииIntegrationInstallationПодключение интеграции в конкретном портале
Webhook endpoint интеграцииIntegrationWebhookEndpointПубличный входящий URL для интеграции
Лог вебхука интеграцииIntegrationWebhookLogИстория входящих и исходящих webhook-событий
Задача синхронизацииIntegrationSyncJobРегламентный импорт или экспорт данных
Возможность интеграцииIntegrationCapabilityRecordВключённые capability: товары, счета, банк, EDI, BI и другие
ТарифBillingPlanПлан START, TEAM, BUSINESS или ENTERPRISE
Подписка порталаTenantSubscriptionТекущий тариф, период, статус и провайдер оплаты
Платёж биллингаBillingPaymentОплата подписки
Биллинговая транзакцияBillingTransactionИстория ручных и системных начислений
Биллинговое событиеBillingEventЖурнал событий подписки
ПартнёрPartnerПартнёр платформы
Реферальная ссылкаReferralLinkКод регистрации порталов от партнёра
Вознаграждение партнёраPartnerRewardНачисление или выплата партнёру
Hub-аудитHubAuditLogЖурнал действий операторской панели
Настройки Telegram HubHubTelegramSettingsКонфигурация Telegram-бота операторов
Подписчик TelegramHubTelegramSubscriberПолучатель уведомлений Hub
Лог Telegram-уведомленийHubTelegramNotificationLogЗащита от повторных уведомлений
Настройки Max HubHubMaxSettingsКонфигурация Max-бота операторов
Получатель MaxHubMaxSubscriberПолучатель уведомлений Hub
Лог Max-уведомленийHubMaxNotificationLogЗащита от повторных уведомлений

Рекомендуемый сквозной формат связей

Для новых сценариев и интеграций стоит придерживаться таких правил:

  1. Внешняя клиентская потребность должна иметь один устойчивый внешний номер: PO, номер письма, номер тендера или номер заказа клиента.
  2. Если отдельной модели под внешний PO ещё нет, этот номер должен повторяться в clientRef, externalReference, комментарии и вложении всех связанных документов.
  3. Внутренние документы должны иметь свои номера: REQ, PUR, RFQ, QUOTE, CP, SI; номера нельзя использовать как технические ключи вместо id.
  4. Каждая строка документа должна ссылаться на предыдущую строку процесса, если такая связь есть: заявка -> закупка -> RFQ -> ответ поставщика -> котировка -> счёт.
  5. Counterparty должен быть единой карточкой для покупателя, поставщика и перевозчика; роль задаётся сегментами buyer, supplier, carrier.
  6. Supplier должен использоваться только как закупочный профиль контрагента-поставщика: рейтинг, условия оплаты, условия доставки, предпочтительность.
  7. Все суммы должны храниться с валютой, НДС-режимом и итогами документа; пересчёт строк не должен ломать исторические документы.
  8. Любое изменение статуса ключевого документа должно создавать событие статуса и запись в AuditLog, чтобы можно было восстановить историю принятия решений.
  9. Файлы и комментарии должны прикрепляться через entityType и entityId, а не через отдельные поля для каждого документа.
  10. Складские движения должны ссылаться на документ-основание через documentType и documentId: например, приход по закупке или входящему счёту.

Документация платформы SNABZHENETS+.