Сравнение с системы с одной жёсткой карточкой контрагента

Один контрагент — три способа на него смотреть: архитектура вместо компромисса

системы с одной жёсткой карточкой контрагента

Обложка статьи: Один контрагент — три взгляда

Одна и та же компания нужна трём отделам по-разному: бухгалтерии — одна запись с одним ИНН, продажам — несколько подразделений с отдельными менеджерами, закупкам — поставщик с договорами. Обычная база заставляет выбрать одну структуру на всех, и спор кончается компромиссом, неудобным никому. В Интеграме сам контрагент и способы смотреть на него хранятся раздельно: запись одна, взгляды — связи с типами. Новый взгляд — это строка в справочнике типов, а не перестройка данных.

Почти в любой компании есть контрагент, на которого смотрят с трёх сторон. Бухгалтерии нужна одна запись с одним ИНН — так требует отчётность и закон; двадцать карточек на одну компанию — ошибка учёта. Продажи видят холдинг: три завода — три реальных заказчика, у каждого свой менеджер, воронка и история переговоров; склеить их в одну карточку — менеджеры утонут в чужих сделках. Закупкам всё это без разницы: для них тот же контрагент — поставщик, с договорами, заявками и рекламациями. Кто из них прав? Все трое — в этом и проблема. Обычная база хранит сущность одной жёсткой структурой: приходится заранее выбрать, что это за запись и какие у неё поля. Одна карточка с полем «тип» обрастает чужими полями, три отдельные карточки рвут компанию на части, и холдинг приходится собирать руками. Спор решается компромиссом, а компромисс, устроивший всех сразу, не устраивает никого: он не устраняет три потребности, а смешивает их в одной записи.

Контекст

Типичная история: контрагент с холдинговой структурой и три отдела, каждому из которых нужен «свой» взгляд на него. В базе с одной жёсткой карточкой контрагента это оборачивается вот чем:

  • одна карточка на всех — у клиента появляются поля поставщика, а у бухгалтерской записи — поля продаж; каждый отчёт начинается с того, что вычищает чужое;
  • три карточки на одну компанию — и никто не видит её целым: общий ИНН, холдинг и общую историю собирают вручную;
  • по одному ИНН плодятся дубли — бухгалтерия ловит их при закрытии периода;
  • новый взгляд — «арендатор склада», «участник тендера», «должник по графику» — требует перестройки того, что уже работает;
  • спор о структуре решает не тот, кто прав, а тот, кто громче настаивает, — потому что переделка стоит недель работы программиста.

Как это решает Интеграм

В Интеграме контрагент устроен как контакт в телефонной книжке: сам контакт один, а ярлыков может быть сколько угодно. Запись компании одна, «бухгалтерский», «продажный» и «закупочный» взгляд — связи с типами. Как это выглядит на практике:

  1. компанию-контрагента заводят один раз — с одним ИНН, как того требует бухгалтерия;
  2. подразделения холдинга связывают типом «входит в холдинг по ИНН» — бухгалтерский отчёт собирается по этому типу и ничего постороннего не задевает;
  3. продажи видят каждое подразделение отдельным заказчиком через тип «заказчик → подразделение»: свой менеджер, своя воронка, своя история переговоров;
  4. закупки подключают к той же записи тип «поставщик» — договоры, заявки и рекламации живут своей, третьей картиной;
  5. в одной рабочей базе в одной таблице связей живут 418 типов, а собрать запись со всеми реквизитами занимает 0,16 мс — обычный Postgres;
  6. когда поверх уже накопленных данных понадобился новый тип связи, больше четырёхсот связей (+402) разнесли одним проходом: ноль миграций, и ни один существующий отчёт не изменился;
  7. когда нужен следующий взгляд — «арендатор склада», «участник тендера» — это строка в справочнике типов и отчёт поверх неё. Не пригодился — строку убрали.