Предметная областьОписания страницБизнес-модельЛогика раскрытия бизнес-модели, прогресс и статус проекта

Логика раскрытия бизнес-модели, прогресс и статус проекта

Актуально на: 2026-06-26

Цель

Документ формализует минимально обязательную траекторию заполнения бизнес-модели PlanForge. На его основе нужно реализовать:

  • обязательные поля со звездочками в формах;
  • блокировку следующих разделов до выполнения условий текущего этапа;
  • процент заполненности по разделам и по проекту;
  • ключевые параметры для раздела “Обзор проекта”;
  • метрики правой панели “Статус проекта”.

Термины

  • Раздел - экран или вкладка рабочей модели: “Заголовок”, “Список продуктов”, “Календарный план” и т.д.
  • Gate - условие, после выполнения которого открывается следующий раздел или группа разделов.
  • Required field - поле, которое должно быть заполнено для прогресса раздела и отмечается звездочкой в UI.
  • Filled - значение не пустое, не состоит только из пробелов, является валидным по типу данных и попадает в допустимый диапазон.
  • Product - позиция с productType = "product".
  • Service - позиция с productType = "service".

Общая последовательность раскрытия

  1. Проект -> Заголовок открыт всегда.
  2. После полного заполнения заголовка открывается Проект -> Список продуктов.
  3. После добавления хотя бы одного полностью заполненного продукта/услуги открываются:
    • Проект -> Настройка расчета;
    • Инвестиционный план -> Календарный план.
  4. После добавления хотя бы одного полностью заполненного этапа календарного плана открывается Операционный план -> План сбыта.
  5. После заполнения плана сбыта и выполнения условия окупаемости продажами открываются:
    • Операционный план -> Материалы и комплектующие;
    • Операционный план -> План производства.
  6. После выполнения производственной цепочки для всех продуктов открывается Операционный план -> План по персоналу.
  7. После добавления хотя бы одного полностью заполненного сотрудника открывается Операционный план -> Общие издержки.
  8. После добавления хотя бы одной полностью заполненной общей издержки открывается Результаты -> Кэш-фло.
  9. В кэш-фло проект считается финансово состоятельным, если баланс наличности на начало и конец каждого периода положительный.

Раздел: Проект -> Заголовок

Обязательные поля

В UI рядом с каждым полем ставится звездочка:

  • Название проекта;
  • Вариант;
  • Автор;
  • Отрасль;
  • Регион;
  • Дата начала;
  • Длительность, мес.;
  • Валюта проекта.

Примечание: в исходном описании “Дата начала” указана дважды. В модели считаем ее одним обязательным полем.

Валидация

  • Название, вариант, автор, отрасль, регион: непустая строка.
  • Дата начала: валидная дата YYYY-MM-DD.
  • Длительность: целое число больше 0.
  • Валюта проекта:
    • если выбрана стандартная валюта, должен быть указан код валюты;
    • если выбрана пользовательская валюта, обязательны название и код.

Gate

project-title считается пройденным, если заполнены все обязательные поля. Только после этого открывается project-products.

Раздел: Проект -> Список продуктов

Минимальное условие

У пользователя должен быть заполнен хотя бы один продукт или услуга.

Обязательные поля продукта/услуги

Звездочками отмечаются:

  • Название;
  • Тип позиции: продукт или услуга;
  • Единица измерения;
  • Канал продаж;
  • Дата начала продаж;
  • Валюта;
  • Цена;
  • Статус.

Комментарий не является обязательным.

Валидация

  • Тип позиции: только product или service.
  • Дата начала продаж: валидная дата, желательно в пределах горизонта проекта.
  • Цена: валидное число, допускается 0.
  • Валюта:
    • стандартная валюта должна иметь код;
    • пользовательская валюта должна иметь название и код.

Gate

project-products считается пройденным, если есть хотя бы одна строка и каждая строка, участвующая в модели, проходит валидацию обязательных полей.

После прохождения gate одновременно открываются:

  • project-calc;
  • investment-calendar.

Раздел: Проект -> Настройка расчета

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

Когда в разделе появятся новые ручные настройки, каждая настройка должна получить отдельный required-критерий.

Раздел: Инвестиционный план -> Календарный план

Минимальное условие

Должен быть создан хотя бы один этап.

Обязательные поля этапа

Звездочками отмечаются:

  • Короткое наименование;
  • Дата начала;
  • Дата окончания;
  • Стоимость;
  • Оплата.

Валидация

  • Короткое наименование: непустая строка.
  • Дата начала и дата окончания: валидные даты.
  • Дата окончания не раньше даты начала.
  • Стоимость: валидное число, больше или равно 0.
  • Оплата:
    • если оплата “в начале” или “в конце”, этого достаточно;
    • если оплата по графику, сумма графика должна быть валидной;
    • рекомендуемое правило: сумма графика оплат должна равняться 100%, если график задан в процентах, или стоимости этапа, если график задан суммами.

Gate

investment-calendar считается пройденным, если есть хотя бы один этап и все обязательные поля заполнены валидно. Только после этого открывается ops-sales.

Раздел: Операционный план -> План сбыта

Минимальное условие

Единственное условие раскрытия следующих разделов - совокупная выручка должна покрывать инвестиционные затраты.

Пустые периоды, пустые цены и пустые объемы сами по себе не блокируют переход дальше. Для расчета gate пустые значения считаются нулями.

Финансовый gate

Следующие разделы открываются только если совокупная выручка по всем продуктам/услугам за все периоды покрывает инвестиционные затраты.

Формула:

totalRevenue = sum(productPeriodVolume * productPeriodPrice)
totalInvestmentCost = sum(calendarPhaseCost)
salesGatePassed = totalRevenue >= totalInvestmentCost

Если есть НДС, скидки, возвраты или разные валюты, для MVP считаем значения в валюте проекта после нормализации. Отдельную валютную переоценку нужно описать позже.

Gate

ops-sales считается пройденным, если:

  • totalRevenue >= totalInvestmentCost.

После этого одновременно открываются:

  • ops-mik;
  • ops-production.

Разделы: Материалы и комплектующие + План производства

Эти разделы работают как единый gate производственной цепочки.

Условие для услуг

Для услуг (productType = "service") материалы и производственные нормы не обязательны.

Условие для продуктов

Для каждого продукта (productType = "product") должна быть обеспечена цепочка:

Материал/комплектующее -> производственная норма -> продукт

Минимальные требования

Для каждого продукта:

  • в справочнике материалов должен существовать хотя бы один материал или комплектующее;
  • в плане производства для продукта должна быть хотя бы одна строка нормы расхода;
  • строка нормы должна ссылаться на существующий материал/комплектующее;
  • расход на единицу должен быть валидным числом больше 0;
  • потери, если указаны, должны быть валидным числом больше или равно 0.

Gate

Производственный gate считается пройденным, если для всех productType = "product" выполнены минимальные требования.

Если в проекте есть только услуги, gate считается пройденным автоматически после прохождения плана сбыта, а разделы материалов/производства могут быть открыты как необязательные.

После прохождения gate открывается ops-personnel.

Раздел: Операционный план -> План по персоналу

Минимальное условие

Должен быть добавлен хотя бы один сотрудник или роль.

Обязательные поля сотрудника

Звездочками отмечаются:

  • Группа/подразделение;
  • Должность/роль;
  • Количество ставок;
  • Зарплата;
  • Дата найма или месяц начала;
  • Режим выплат;
  • Налоги/ставка начислений, если поле доступно в UI.

Комментарий не является обязательным.

Валидация

  • Количество ставок: число больше 0.
  • Зарплата: число больше или равно 0.
  • Дата/месяц начала: валидное значение в пределах проекта.
  • Ставки налогов/индексации: валидные числа, больше или равны 0.

Gate

ops-personnel считается пройденным, если есть хотя бы одна строка персонала и все обязательные поля этой строки заполнены валидно.

После этого открывается ops-general-expenses.

Раздел: Операционный план -> Общие издержки

Минимальное условие

Должна быть добавлена хотя бы одна общая издержка.

Логически обязательные поля издержки

Звездочками отмечаются:

  • Группа расходов;
  • Наименование;
  • Сумма;
  • Дата начала;
  • Периодичность;
  • Момент оплаты;
  • Количество, если включен режим количества;
  • Ставка НДС/налога, если поле участвует в расчете;
  • График оплат, если выбран режим оплаты по графику.

Комментарий не является обязательным.

Валидация

  • Сумма: валидное число, больше или равно 0.
  • Дата начала: валидная дата в пределах проекта.
  • Дата окончания, если указана, не раньше даты начала.
  • Периодичность: одно из допустимых значений (monthly, quarterly, yearly, one_time).
  • Момент оплаты: одно из допустимых значений (start, end, schedule).
  • Количество: число больше 0, если включен режим количества.
  • График оплат: обязательный и валидный, если выбран schedule.

Gate

ops-general-expenses считается пройденным, если есть хотя бы одна строка общей издержки и все обязательные поля этой строки заполнены валидно.

После этого открывается results-cashflow.

Раздел: Результаты -> Кэш-фло

Минимальное условие

Кэш-фло открывается после прохождения общих издержек.

Финансовое условие состоятельности

Баланс наличности должен быть положительным:

  • на начало каждого периода;
  • на конец каждого периода.

Формула проверки:

cashBalanceStart[period] > 0
cashBalanceEnd[period] > 0

Если хотя бы один период имеет отрицательный или нулевой баланс, проект получает статус “Требует финансирования/коррекции”.

Методика расчета прогресса

Прогресс поля

Каждое обязательное поле дает 1 балл, если заполнено и валидно.

fieldProgress = validRequiredFields / totalRequiredFields

Прогресс строки

Для табличных сущностей прогресс строки считается по обязательным полям строки.

rowProgress = validRequiredFieldsInRow / totalRequiredFieldsInRow

Прогресс раздела

Разделы с простыми полями:

sectionProgress = fieldProgress

Разделы со строками:

sectionProgress = 0, если нет минимального количества строк
sectionProgress = average(rowProgress), если строки есть

Разделы с дополнительным gate:

sectionProgress = min(baseSectionProgress, gateProgress)

Где gateProgress:

  • 1, если gate выполнен;
  • 0.5, если все поля заполнены, но финансовое/цепочное условие не выполнено;
  • 0, если базовые обязательные данные отсутствуют.

Вес разделов в общем прогрессе

Для MVP общий прогресс считается взвешенно:

РазделВес
Заголовок10%
Список продуктов12%
Настройка расчета5%
Календарный план12%
План сбыта16%
Материалы и производство14%
План по персоналу10%
Общие издержки10%
Кэш-фло11%

Итого: 100%.

Формула:

projectProgress = sum(sectionProgress * sectionWeight)

Отображение прогресса

Прогресс нужно показывать:

  • в левой панели рядом с каждым разделом: процент раздела и статус;
  • в верхней панели workspace: общий процент готовности модели;
  • в правой панели “Статус проекта”: общий статус, следующий блокер, ключевые метрики.

Статусы раздела:

  • Закрыт - предыдущий gate не выполнен.
  • Открыт - раздел доступен, но не заполнен.
  • В работе - прогресс больше 0%, но меньше 100%.
  • Готов - прогресс 100% и gate выполнен.
  • Ошибка - обязательные поля заполнены, но бизнес-условие не выполнено.

Алгоритм раскрытия разделов

Псевдокод:

titleReady = validateProjectTitle(projectInfo, settings)
productsReady = titleReady && validateProducts(products)
calcOpen = productsReady
calendarOpen = productsReady
calendarReady = calendarOpen && validateCalendar(calendarPhases)
salesOpen = calendarReady
salesReady = salesOpen && validateSalesPlan(products, salesPlanRows, calendarPhases)
productionOpen = salesReady
productionReady = productionOpen && validateProductionChain(products, mikRows, productionNorms)
personnelOpen = productionReady
personnelReady = personnelOpen && validatePersonnel(personnelRows, personnelSettings)
generalExpensesOpen = personnelReady
generalExpensesReady = generalExpensesOpen && validateGeneralExpenses(generalExpenseRows)
cashflowOpen = generalExpensesReady
cashflowReady = cashflowOpen && validateCashflow(cashflow)

Если пользователь пытается открыть закрытый раздел, UI должен:

  • не переключать раздел;
  • подсветить ближайший незавершенный обязательный раздел;
  • показать короткое объяснение: “Сначала заполните …”;
  • в правой панели показать список недостающих требований.

Ключевые параметры для “Обзор проекта”

Раздел “Обзор проекта” должен показывать компактную сводку:

  • Название проекта;
  • Вариант;
  • Автор;
  • Компания, если поле используется;
  • Отрасль;
  • Регион;
  • Дата начала;
  • Длительность, мес.;
  • Горизонт проекта: дата начала - расчетная дата окончания;
  • Валюта проекта;
  • Количество продуктов;
  • Количество услуг;
  • Количество инвестиционных этапов;
  • Общая сумма инвестиций;
  • Плановая выручка за горизонт;
  • Соотношение выручки к инвестициям;
  • Количество материалов/комплектующих;
  • Количество производимых продуктов, требующих норм расхода;
  • Количество сотрудников/ролей;
  • Количество общих издержек;
  • Минимальный баланс денежных средств;
  • Первый период отрицательного баланса, если есть;
  • Общий процент готовности модели;
  • Следующий обязательный шаг.

Метрики правой панели “Статус проекта”

Правая панель должна быть диагностической, а не только декоративной.

Верхний блок

  • Общий прогресс модели, %.
  • Текущий статус:
    • “Черновик”;
    • “Заполняется”;
    • “Готов к расчету”;
    • “Требует финансирования”;
    • “Финансово устойчив”.
  • Следующий обязательный шаг.
  • Количество блокеров.

Блок “Заполненность”

  • Заголовок: %;
  • Продукты: %, количество продуктов/услуг;
  • Инвестиции: %, количество этапов;
  • Сбыт: %, покрытие инвестиций выручкой;
  • Производство: %, продуктов с нормами / всего продуктов;
  • Персонал: %, количество сотрудников;
  • Общие издержки: %, количество издержек;
  • Кэш-фло: %, минимальный баланс.

Блок “Финансы”

  • Общая сумма инвестиций.
  • Совокупная выручка за горизонт.
  • Выручка / инвестиции, коэффициент.
  • Сумма общих издержек за горизонт.
  • Фонд оплаты труда за горизонт.
  • Минимальный баланс денежных средств.
  • Количество периодов с отрицательным балансом.

Блок “Риски и блокеры”

Показывать первые 3-5 самых важных проблемы:

  • незаполненное обязательное поле;
  • отсутствует продукт;
  • отсутствует этап инвестиций;
  • выручка не покрывает инвестиции;
  • у продукта нет материала/нормы расхода;
  • нет сотрудника;
  • нет общей издержки;
  • отрицательный баланс в кэш-фло.

Каждый блокер должен иметь:

  • короткий текст;
  • раздел, куда перейти;
  • severity: critical, warning, info;
  • optional action label: “Открыть раздел”.

Поведение обязательных отметок в UI

  • Звездочка ставится рядом с названием обязательного поля.
  • Если поле пустое после первого взаимодействия или после попытки перейти дальше, поле подсвечивается ошибкой.
  • До первой попытки перехода лучше показывать мягкое состояние: звездочка есть, но ошибки нет.
  • В таблицах строка с незаполненными обязательными полями должна получать маркер “Не завершено”.
  • В левой панели незавершенный раздел должен показывать процент, а не только факт заполнения.

Открытые вопросы для будущей реализации

  • Нужна ли отдельная настройка, которая разрешает проходить план сбыта без покрытия инвестиций, если проект финансируется займами или капиталом?
  • Нужно ли учитывать дисконтирование при сравнении выручки и инвестиций, или для gate достаточно номинальных значений?
  • Как обрабатывать мультивалютные продукты: конвертировать по курсу проекта или запрещать gate до настройки курсов?
  • Должен ли “План по материалам” быть полностью скрыт для проектов, где есть только услуги?
  • Нужно ли считать прогресс по всем строкам или только по строкам, включенным в расчет?