Стройматериалы · Торговая ERP · Портал партнёров
Techizat — ERP для торговли стройматериалами с порталом для партнёров
От шести таблиц — к единому учёту в телефоне
Мы создали Techizat для бакинского поставщика стройматериалов, который продаёт их строительным компаниям. Закупки, продажи, платежи, маржа FIFO, коммерческие предложения, счета и накладные живут в одной системе, созданной в первую очередь для телефона, а у каждого партнёра есть портал со своим балансом и документами.
Операции · сегодня
- 16.09 · ПР-2026-0158 Продажа ООО «Model Yard» 1 200,00 ₼
- 16.09 · ПЛ-2026-0043 Входящий платёж ООО «Sample Homes» 500,00 ₼
- 15.09 · ЗК-2026-0086 Закупка Demo Cement Supply 3 080,00 ₼
- 15.09 · ПР-2026-0156 Продажа ООО «Demo Build» 960,00 ₼
- 14.09 · ПР-2026-0151 Продажа ООО «Sample Homes» 1 620,00 ₼
- 13.09 · ПЛ-2026-0041 Исходящий платёж Demo Cement Supply 2 000,00 ₼
- 12.09 · ПР-2026-0142 Продажа ООО «Demo Build» 1 422,00 ₼
- 08.09 · АВ-2026-0012 Получен аванс ООО «Demo Build» 2 000,00 ₼
- 16.09 · ПР-2026-0158 Продажа ООО «Model Yard» 1 200,00 ₼
- 16.09 · ПЛ-2026-0043 Входящий платёж ООО «Sample Homes» 500,00 ₼
- 15.09 · ЗК-2026-0086 Закупка Demo Cement Supply 3 080,00 ₼
- 15.09 · ПР-2026-0156 Продажа ООО «Demo Build» 960,00 ₼
- 14.09 · ПР-2026-0151 Продажа ООО «Sample Homes» 1 620,00 ₼
- 13.09 · ПЛ-2026-0041 Исходящий платёж Demo Cement Supply 2 000,00 ₼
- 12.09 · ПР-2026-0142 Продажа ООО «Demo Build» 1 422,00 ₼
- 08.09 · АВ-2026-0012 Получен аванс ООО «Demo Build» 2 000,00 ₼
₼ Баланс 16 сентября
Чистая позиция
18 640,00 ₼
- Нам должны (7)
- 26 480,00
- Мы должны (3)
- 7 840,00
Самые старые долги
- ООО «Example Towers» 64 дн. 7 850,00
- ООО «Sample Homes» 41 дн. 4 120,00
- ООО «Model Yard» 12 дн. 2 760,00
Продажа сохранена ПР-2026-0142 · 1 422,00 ₼
Маржа FIFO ПР-2026-0142 · 18,4%
Ключевые факты о проекте
- Тип проекта
- Клиентский проект
- Отрасль
- Торговля и дистрибуция
- Платформы
- Мобильное PWA · Компьютер · Портал партнёров
- Языки
- Азербайджанский
01 Проблема
Шесть таблиц — и никто не знает маржу
Поставщик закупает стройматериалы и перепродаёт их строительным компаниям. Торговля держалась на шести таблицах сверки с поставщиками, WhatsApp и телефонных звонках. Закупки записывались. Продажи — нет.
сверка-поставщик-1.xlsx
Баланс =SUM(D2:D41)
сверка-поставщик-2.xlsx
Баланс =D41-E41
сверка-поставщик-3.xlsx
Баланс =SUM(F:F)*1.18
сверка-поставщик-4.xlsx
Баланс введено вручную
сверка-поставщик-5.xlsx
Баланс #REF!
сверка-поставщик-6.xlsx
Баланс =D40-E40+G12
Сколько мы им сейчас должны?
Сейчас открою файлы и перезвоню
Маржа = ?
-
Продажи не записывались
У каждой закупки была строка в таблице сверки с поставщиком. Вторая половина торговли жила в чатах, поэтому прибыль от продажи была догадкой.
-
Шесть файлов — шесть способов считать
Каждая таблица считала баланс по своей формуле. Ошибка в одном файле незаметно гасила ошибку в другом.
-
Авансы проваливались между строк
Деньги, заплаченные поставщикам вперёд, и депозиты не попадали ни в один баланс, поэтому никто не мог сказать, где находится оборотный капитал.
-
Один товар — много названий
Один и тот же мешок цемента встречался под разными названиями, записанными в свободной форме, поэтому остатки и цены нельзя было сравнить.
-
Каждый ответ — через звонок
«Сколько они нам должны?» означало открыть файлы, сложить столбцы и перезвонить.
Наше правило проектирования
Если ввод операции занимает больше времени, чем сообщение в WhatsApp, её никто не введёт. Поэтому каждый экран спроектирован под телефон и секундомер.
02 Продажи с телефона
Запись меньше чем за 20 секунд
Партнёр, товар, количество, цена, сохранить. Продажа записывается между двумя звонками, и типичный ввод занимает меньше 20 секунд с телефона. Автоматический сквозной тест на каждом релизе засекает время ввода на эмулированном телефоне и сравнивает его с жёстким лимитом.
Секундомер 17,4 с
Типичный ввод меньше 20 с
- Партнёр
- Товар
- Количество
- Цена
- Сохранить
Новая продажа
Закупка Продажа Платёж
Партнёр Недавние
ООО «Demo Build» ООО «Sample Homes» ООО «Model Yard»
Товар
Цемент М500 меш.
Количество
180
Цена за единицу
7,90
Итого 1 422,00 ₼
Маржа FIFO 261,00 · 18,4%
- Кредитный лимит в пределах
- На складе 470 меш.
Сохранить
Сохранено · ПР-2026-0142
-
Недавние партнёры — первыми
Компании, которым вы продавали последними, стоят вверху списка, поэтому большинство продаж начинается с одного касания.
-
Один каталог, никакого свободного текста
Товары выбираются из каталога с поиском. Название товара у поставщика один раз сопоставляется с каталогом и запоминается для всех следующих закупок.
-
Числа никогда не угадываются
«1.465,20» и «1,465.20» означают разное. Если разделители неоднозначны, форма просит ввести число заново, а не угадывает.
-
Черновики и дубликаты
Прерванный ввод ждёт в черновиках. Счёт поставщика, введённый дважды в течение недели, помечается ещё до сохранения.
03 Себестоимость FIFO и маржа
Каждая продажа знает, из какой закупки она пришла
Каждая строка закупки открывает партию себестоимости. Продажи расходуют сначала самые старые партии, и каждое списание сохраняется, поэтому маржа каждой продажи — зафиксированный факт, а не оценка в конце месяца.
-
Первая продажа опустошает самую старую партию
180 мешков для ООО «Demo Build» забирают все 120 мешков первой партии и 60 из второй. Себестоимость, выручка и маржа сохраняются вместе с продажей.
-
Вторая продажа встречает новую цену
200 мешков для ООО «Sample Homes» закрывают вторую партию и открывают третью. Более новая закупочная цена сразу отражается в марже.
-
Третья продажа отказывается выдумывать себестоимость
Продано 150 мешков, но в партиях осталось только 90. Techizat рассчитывает себестоимость этих 90 и помечает продажу как «себестоимость неполная», пока не придёт счёт на закупку. Разрыв никогда не заполняется последней ценой или нулём.
Партии себестоимости Цемент М500 · меш.
Маржа последней продажи Себестоимость неполная
60 меш.
закупки ещё нет
П1 02.09
120 × 6,40
П2 05.09
200 × 6,55
П3 11.09
150 × 6,70
-
ПР-2026-0142 ООО «Demo Build» 180 меш. × 7,90
П1 120 × 6,40П2 60 × 6,55
- Себестоимость
- 1 161,00
- Выручка
- 1 422,00
- Маржа
- 261,00 · 18,4%
-
ПР-2026-0151 ООО «Sample Homes» 200 меш. × 8,10
П2 140 × 6,55П3 60 × 6,70
- Себестоимость
- 1 319,00
- Выручка
- 1 620,00
- Маржа
- 301,00 · 18,6%
-
ПР-2026-0158 ООО «Model Yard» 150 меш. × 8,00
П3 90 × 6,70 60 · закупки ещё нет
- Себестоимость
- 603,00
- Выручка
- 1 200,00
- Маржа
- Себестоимость неполная
Остаток по себестоимости 0,00 ₼
Закупки = себестоимость продаж + остаток по себестоимости 3 083,00 = 3 083,00 + 0,00
-
Ни копейки не теряется на округлении
Списание, которое закрывает партию, забирает её точный остаток, поэтому закупки всегда равны себестоимости продаж плюс остаток по себестоимости.
-
Себестоимость видит только владелец
Помощник может вводить закупки, но себестоимость и маржа от этой роли скрыты.
-
Корректировки с одобрением
Позднее изменение цены в закупке становится запросом на корректировку себестоимости, и его одобряет владелец.
-
Лёгкий склад
Остатки, инвентаризации, возвраты от покупателей, возвраты поставщикам, списания и неликвид без движения 90 дней.
04 Платежи и балансы
Баланс, который никто не вводит
В Techizat нет поля «баланс». Каждый баланс пересчитывается из движений: товаров, платежей, авансов, депозитов и возвратов. Он не может разойтись с данными, потому что синхронизировать просто нечего.
Выписка по партнёру ООО «Demo Build» · Сентябрь
₼Дата Документ Движение Сумма Баланс
08.09 АВ-2026-0012 Получен аванс Получен аванс − 2 000,00 мы должны 2 000,00
12.09 ПР-2026-0142 Продажа Продажа + 1 422,00 мы должны 578,00
15.09 ПР-2026-0156 Продажа Продажа + 960,00 должен нам 382,00
16.09 ПЛ-2026-0044 Банковский платёж Банковский платёж − 300,00 должен нам 82,00
Рассчитано из 4 движений. Не хранится.
должен нам 82,00 ₼
Куда ушли деньги
-
СЧ-2026-0031 ПР-2026-0142 · 1 422,00 ₼ Оплачен
Аванс 1 422,00
-
СЧ-2026-0034 ПР-2026-0156 · 960,00 ₼ Оплачен частично
Аванс 578,00 Банк 300,00 Открыт 82,00
-
Рассчитывается, а не вводится
Откройте экран баланса — и каждая цифра пересобирается из движений. Нет сохранённого итога, который мог бы устареть.
-
Авансы и депозиты учитываются
Деньги, заплаченные вперёд, входят в баланс, поэтому владелец видит, сколько оборотного капитала находится у поставщиков.
-
Одна компания — один баланс
Если вы и покупаете у компании, и продаёте ей, у неё одна карточка и одна чистая позиция.
-
Платежи находят свои документы
Платёж закрывает открытые счета, начиная с самого старого, или ровно те, что вы выбрали. Взаимозачёты, трёхсторонние расчёты и переводы долга записываются как есть.
-
Ничего не удаляется
Ошибочная строка сторнируется новой строкой, поэтому история сохраняется, а баланс остаётся верным. Для списания долга нужна причина.
-
Кассы и банковские счета
Каждое движение денег попадает в конкретную кассу или на конкретный банковский счёт, поэтому наличные в кассе — это цифра, а не ощущение.
05 КП, счета, накладные
От КП до накладной — одна цепочка
Запрос, пришедший в WhatsApp, становится коммерческим предложением. Принятое КП становится продажей, а к продаже формируются счёт и накладная. Каждый документ знает, откуда он появился и в каком он статусе.
- 01 Запрос
- 02 КП отправлено
- 03 Принято
- 04 Счёт выставлен
- 05 Доставлено
Предложение
КП-2026-0007 10.09
Запрос через WhatsApp
Товар Кол-во Цена Сумма
Цемент М500 180 меш. 7,90 1 422,00
Мытый песок 12 т 24,00 288,00
Итого 1 710,00 ₼
Выполнено частично
ПринятоСчёт
СЧ-2026-0031 12.09
КП-2026-0007 → ПР-2026-0142
Товар Кол-во Цена Сумма
Цемент М500 180 меш. 7,90 1 422,00
Итого 1 422,00 ₼
Оплачено
Накладная
НК-2026-0019 12.09
Товар Кол-во
Цемент М500 180 меш.
Получил · обязательно R. Sample
Доставлено-
У КП есть жизненный цикл
Запрос, отправлено, принято, выполнено частично, закрыто. Для проигранного КП фиксируется причина: цена, срок поставки, наличие или условия.
-
Отправлено — значит зафиксировано
Как только КП отправлено, его строки больше не меняются. Новое предложение — это копия, поэтому то, что видел клиент, никогда не переписывается.
-
Статус — из платежей
Счёт не оплачен, оплачен частично, оплачен или просрочен по распределённым на него платежам, а не потому, что кто-то поставил галочку.
-
Доставка с именем
Для накладной нужно имя получателя. Доставленная накладная уже не возвращается назад; ошибка исправляется новым документом.
-
Нумерация по сериям
У КП, счетов и накладных свои автоматические серии, например КП-2026-0007.
-
Печать и WhatsApp
У каждого документа есть печатная форма, а сообщение партнёру в WhatsApp открывается с телефона одним касанием.
06 Дебиторская задолженность и кредитные лимиты
Продажа, которая останавливается на лимите
Перед сохранением продажи Techizat задаёт один вопрос: сколько этот партнёр будет должен после этой строки? Вблизи лимита система предупреждает. За лимитом продажа останавливается и требует указать причину.
Возраст самой старой неоплаченной строки
Возраст долга
- ООО «Example Towers» 64 дн. 7 850,00 Отправлено уведомление: 60 дней
- ООО «Sample Homes» 41 дн. 4 120,00
- ООО «Model Yard» 12 дн. 2 760,00
- ООО «Demo Build» 1 дн. 82,00
- Test Site Group закрыт —
< 30 дн. 30–59 дн. 60+ дн.
Новая продажа
ООО «Example Towers»
- Должен сейчас
- 7 850,00
- Эта продажа
- +4 630,00
- После этой строки
- 12 480,00
- Кредитный лимит
- 10 000,00
Использовано 80% лимита Лимит превышен на 2 480,00
Причина
Оплата наличными при доставке, согласовано по телефону
Сохранено с причиной · отправлено на проверку владельцу
-
Вопрос задаётся до строки
Проверка использует баланс после этой продажи, а не до неё, поэтому предупреждение приходит, пока оно ещё может изменить решение.
-
Причина, а не тупик
За лимитом владелец подтверждает продажу, указав причину. Продажа помощника проходит с причиной и попадает в очередь проверки владельца.
-
«Не задан» — не значит «без лимита»
Партнёр без лимита отображается как партнёр с незаданным лимитом, поэтому забытый лимит никогда не сойдёт за щедрый.
-
Возраст, а не интервалы
Возраст долга — это возраст самой старой неоплаченной строки. Уведомления на 30, 60, 90 и 120 днях срабатывают по одному разу на долг, а экран баланса открывается тремя самыми старыми долгами.
07 Портал партнёров
Каждый партнёр видит только своё
Вместо звонка партнёр находит ответ в портале. Там компания видит свой баланс, свои операции в обе стороны, свои акты сверки и адресованные ей КП. Никакие данные других партнёров не покидают сервер.
Все операции · владелец
- 16.09 ПЛ-2026-0044 ООО «Demo Build» 300,00
- 15.09 ПР-2026-0156 ООО «Demo Build» 960,00
Данные других партнёров не отправляются
₼ Портал партнёра ООО «Demo Build»
Ваш баланс
Вы должны
82,00 ₼
на 16.09
Ваши операции
- ↓ Банковский платёж 16.09 · ПЛ-2026-0044 300,00
- ↑ Продажа 15.09 · ПР-2026-0156 960,00
- ↑ Продажа 12.09 · ПР-2026-0142 1 422,00
- ↓ Получен аванс 08.09 · АВ-2026-0012 2 000,00
Акт сверки за сентябрь Подтвердить
Предложение КП-2026-0007 Принять
-
Одна компания — и ничего больше
Партнёр видит свой баланс, операции, акты сверки и КП. Что отправлять, решает сервер; экран ничего не прячет.
-
Сверка без звонков
Ежемесячный акт сверки подтверждается в портале, а не по телефону.
-
КП принимаются онлайн
Принятие КП — осознанное действие с подтверждением, которое фиксируется вместе со временем.
-
Доступ по одобрению
Партнёр подаёт заявку на доступ, и портал открывается только после одобрения владельцем.
-
Тесты на утечки при каждом изменении
Автоматические тесты входят как один партнёр и пытаются прочитать данные другого. Любая утечка проваливает проверку.
08 PWA, устойчивое к обрывам связи
Нет связи на объекте — нет потерянных операций
На складах и стройплощадках связь слабая. Techizat продолжает принимать операции: они ждут в очереди на телефоне и уходят, когда связь возвращается, и ничего не проводится дважды.
На телефоне
- Продажа ООО «Model Yard» 1 200,00 Сохранено
- Входящий платёж ООО «Sample Homes» 500,00 Сохранено
- Продажа ООО «Example Towers» 4 630,00 Нужен ваш ответ
Проверки сервера
- Одноразовый ключ
- Кредитный лимит
- Дубликат счёта
- Остаток на складе
Повторная отправка · тот же ключ · не проведено дважды
Учёт
- ООО «Model Yard» 3 960,00
- ООО «Sample Homes» 3 620,00
- ООО «Example Towers» 7 850,00 Кредитный лимит: укажите причину
Балансы меняются только после того, как сервер примет операцию
-
Очередь на телефоне
Без сигнала операции хранятся в очереди на устройстве — со временем, когда они были сделаны на самом деле.
-
Честные цифры
Операция в очереди отображается как ещё не отправленная и не меняет ни одного баланса, пока сервер её не примет.
-
Никогда не проводится дважды
Каждая операция с момента ввода несёт собственный одноразовый ключ, поэтому повторная отправка распознаётся и пропускается.
-
Проверки продолжают работать
Вопросы о кредитном лимите, дубликатах счетов и остатках возвращаются при синхронизации очереди и ждут ответа владельца.
09 Как это устроено
Спроектирована как бухгалтерское ПО
Правила, которые защищают деньги, живут в ядре предметной области без фреймворков и покрыты модульными тестами. Сквозные тесты запускаются в десктопных и мобильных браузерах, а собственные проверки останавливают всё, что нарушает денежные правила.
Проверки при каждом изменении
- 01 Денежные расчёты в десятичных числах, без float пройдено
- 02 Балансы пересобираются из движений пройдено
- 03 FIFO: закупки = себестоимость продаж + остаток пройдено
- 04 Ни один партнёр не видит данные другого пройдено
- 05 Данные компаний изолированы в базе данных пройдено
- 06 Ввод с телефона засекается от начала до конца пройдено
- 07 Финансовые строки сторнируются, а не удаляются пройдено
- 08 Здоровье данных: проверки целостности пройдено
8 / 8 пройдено
- Сначала учёт
- Балансы, возраст долга и статус счёта выводятся из движений. Ни одно из этих значений не является полем, которое можно отредактировать.
- Точные деньги
- Все денежные расчёты идут в десятичных числах, а автоматическая проверка отклоняет арифметику с плавающей точкой над суммами.
- Ядро предметной области
- Учёт, FIFO, кредит, возраст долга, КП и документы живут в одном протестированном ядре, общем для веб-приложения и портала.
- Безопасность
- Ролевые права доступа, отдельный вход для партнёров, одобрение доступа к порталу владельцем и изоляция данных арендаторов на уровне базы данных.
- Журнал аудита
- Сторно вместо удаления, причины для списаний и превышения лимитов, а также проверка операций помощника в конце дня.
- Здоровье данных
- Экран здоровья данных отделяет повреждённые данные (красные) от незавершённой работы (жёлтой) — например, от продажи, которая ещё ждёт закупочную себестоимость.
Три роли — три представления
-
Владелец
Видит себестоимость, маржу и все балансы. Только владелец сторнирует строки, списывает долги и одобряет доступ к порталу.
-
Помощник
Вводит закупки и платежи. Себестоимость и маржа скрыты, а владелец проверяет операции за день.
-
Партнёр
Входит в портал и видит одну компанию: свой баланс, операции, акты сверки и КП.
Вокруг ядра
Наша роль
Что сделала Atlas BIP
-
Анализ на основе таблиц
Мы построчно разобрали таблицы сверки с поставщиками и пересобрали бизнес в виде данных: партнёры, нормализованный каталог товаров, закупки, платежи и продажи, которые раньше никогда не записывались.
-
Продуктовый дизайн для телефона
Мы спроектировали каждый экран вокруг одного правила — быстрее сообщения в WhatsApp — и сохранили спокойный интерфейс: один стиль карточек и цвет только там, где он что-то значит.
-
Разработка предметной области
Мы написали учёт, FIFO-себестоимость, кредитные лимиты, возраст долга, КП и документы как протестированное ядро с точными десятичными денежными расчётами.
-
Портал партнёров
Мы создали портал с отдельным входом, одобрением владельцем и изоляцией данных каждого партнёра, которую подтверждают автоматические тесты на утечки.
-
Офлайн-PWA и качество
Мы добавили офлайн-очередь, сквозные тесты в десктопных и мобильных браузерах и тест с засечкой времени ввода с телефона, который выполняется на каждом релизе.
Технологии
Современный стек
- Приложение
-
- TypeScript
- React
- Next.js
- Tailwind CSS
- Офлайн
-
- PWA
- Service worker
- IndexedDB
- Данные
-
- PostgreSQL
- Prisma
- Zod
- Качество
-
- Vitest
- Playwright
Вопросы и ответы
Что спрашивают торговые компании
Насколько быстро вводить данные с телефона?
Типичная операция занимает меньше 20 секунд с телефона. Недавние партнёры стоят первыми, товары выбираются из каталога с поиском, а итог всегда на экране. Автоматический сквозной тест на каждом релизе засекает время ввода на эмулированном телефоне.
Как FIFO-себестоимость учитывает товар, проданный до ввода счёта на закупку?
Каждая строка закупки открывает партию, а продажи расходуют сначала самые старые партии. Если продаже нужно больше, чем есть в партиях, Techizat рассчитывает себестоимость того, что есть, и помечает продажу как «себестоимость неполная», пока не придёт закупка. Себестоимость никогда не выдумывается из последней цены или нуля.
Что именно партнёр видит в портале?
Только свою компанию: баланс, операции в обе стороны, акты сверки и адресованные ей КП. Доступ открывается после одобрения заявки владельцем, а разделение обеспечивается на сервере и в базе данных, а не скрытием элементов на экране.
Работает ли система без стабильного интернета?
Да. Techizat — PWA, устойчивое к обрывам связи: операции, введённые без сигнала, ждут в очереди на телефоне и синхронизируются, когда связь возвращается. Каждая операция несёт одноразовый ключ, поэтому повторная отправка никогда не проводится дважды.
Можете создать такую систему для нашей дистрибьюторской компании?
Да. Мы начинаем с ваших реальных таблиц, актов сверки и чатов, письменно согласуем с вами денежные правила и строим вокруг них ERP для телефона: учёт, себестоимость и маржу, кредитный контроль, документы и портал партнёров.
Ваш проект
Следующая система — ваша
Расскажите, как сегодня в компании движутся заказы, деньги и документы. Мы ответим в течение 24 часов — с вопросами и конкретным планом.
Названия и цифры на экранах — демонстрационные данные.
Вернуться к началу