Логика раскрытия бизнес-модели, прогресс и статус проекта
Актуально на: 2026-06-26
Цель
Документ формализует минимально обязательную траекторию заполнения бизнес-модели PlanForge. На его основе нужно реализовать:
- обязательные поля со звездочками в формах;
- блокировку следующих разделов до выполнения условий текущего этапа;
- процент заполненности по разделам и по проекту;
- ключевые параметры для раздела “Обзор проекта”;
- метрики правой панели “Статус проекта”.
Термины
- Раздел - экран или вкладка рабочей модели: “Заголовок”, “Список продуктов”, “Календарный план” и т.д.
- Gate - условие, после выполнения которого открывается следующий раздел или группа разделов.
- Required field - поле, которое должно быть заполнено для прогресса раздела и отмечается звездочкой в UI.
- Filled - значение не пустое, не состоит только из пробелов, является валидным по типу данных и попадает в допустимый диапазон.
- Product - позиция с
productType = "product". - Service - позиция с
productType = "service".
Общая последовательность раскрытия
- Проект -> Заголовок открыт всегда.
- После полного заполнения заголовка открывается Проект -> Список продуктов.
- После добавления хотя бы одного полностью заполненного продукта/услуги открываются:
- Проект -> Настройка расчета;
- Инвестиционный план -> Календарный план.
- После добавления хотя бы одного полностью заполненного этапа календарного плана открывается Операционный план -> План сбыта.
- После заполнения плана сбыта и выполнения условия окупаемости продажами открываются:
- Операционный план -> Материалы и комплектующие;
- Операционный план -> План производства.
- После выполнения производственной цепочки для всех продуктов открывается Операционный план -> План по персоналу.
- После добавления хотя бы одного полностью заполненного сотрудника открывается Операционный план -> Общие издержки.
- После добавления хотя бы одной полностью заполненной общей издержки открывается Результаты -> Кэш-фло.
- В кэш-фло проект считается финансово состоятельным, если баланс наличности на начало и конец каждого периода положительный.
Раздел: Проект -> Заголовок
Обязательные поля
В 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 до настройки курсов?
- Должен ли “План по материалам” быть полностью скрыт для проектов, где есть только услуги?
- Нужно ли считать прогресс по всем строкам или только по строкам, включенным в расчет?