diff --git a/openspec/changes/demo-prototype/.openspec.yaml b/openspec/changes/archive/2026-10-08-demo-prototype/.openspec.yaml similarity index 100% rename from openspec/changes/demo-prototype/.openspec.yaml rename to openspec/changes/archive/2026-10-08-demo-prototype/.openspec.yaml diff --git a/openspec/changes/demo-prototype/design.md b/openspec/changes/archive/2026-10-08-demo-prototype/design.md similarity index 100% rename from openspec/changes/demo-prototype/design.md rename to openspec/changes/archive/2026-10-08-demo-prototype/design.md diff --git a/openspec/changes/demo-prototype/proposal.md b/openspec/changes/archive/2026-10-08-demo-prototype/proposal.md similarity index 100% rename from openspec/changes/demo-prototype/proposal.md rename to openspec/changes/archive/2026-10-08-demo-prototype/proposal.md diff --git a/openspec/changes/demo-prototype/specs/consolidated-osv-ui/spec.md b/openspec/changes/archive/2026-10-08-demo-prototype/specs/consolidated-osv-ui/spec.md similarity index 100% rename from openspec/changes/demo-prototype/specs/consolidated-osv-ui/spec.md rename to openspec/changes/archive/2026-10-08-demo-prototype/specs/consolidated-osv-ui/spec.md diff --git a/openspec/changes/demo-prototype/specs/consolidation-setup/spec.md b/openspec/changes/archive/2026-10-08-demo-prototype/specs/consolidation-setup/spec.md similarity index 100% rename from openspec/changes/demo-prototype/specs/consolidation-setup/spec.md rename to openspec/changes/archive/2026-10-08-demo-prototype/specs/consolidation-setup/spec.md diff --git a/openspec/changes/demo-prototype/specs/document-review-ui/spec.md b/openspec/changes/archive/2026-10-08-demo-prototype/specs/document-review-ui/spec.md similarity index 100% rename from openspec/changes/demo-prototype/specs/document-review-ui/spec.md rename to openspec/changes/archive/2026-10-08-demo-prototype/specs/document-review-ui/spec.md diff --git a/openspec/changes/demo-prototype/specs/primary-files-ui/spec.md b/openspec/changes/archive/2026-10-08-demo-prototype/specs/primary-files-ui/spec.md similarity index 100% rename from openspec/changes/demo-prototype/specs/primary-files-ui/spec.md rename to openspec/changes/archive/2026-10-08-demo-prototype/specs/primary-files-ui/spec.md diff --git a/openspec/specs/consolidated-osv-ui/spec.md b/openspec/specs/consolidated-osv-ui/spec.md new file mode 100644 index 0000000..dccb16b --- /dev/null +++ b/openspec/specs/consolidated-osv-ui/spec.md @@ -0,0 +1,44 @@ +# consolidated-osv-ui Specification + +## Purpose +TBD - created by archiving change demo-prototype. Update Purpose after archive. + +## Requirements + +### Requirement: Сводка версии +Экран «Сводная ОСВ» [30] SHALL показывать шапку версии (ГК, период, номер, статус) и сводку +`GET /consolidations/versions/{id}/osv/summary`: строк всего, документов, несопоставленных (`unmapped_total` — счётчик +«Осталось N» без перехода к сопоставлению), автоматически сопоставленных. + +#### Scenario: Контрольные цифры РБ 2024 Q3 +- **WHEN** открыт свод версии РБ 2024 Q3 после подтверждения 22 ОСВ из `fixtures/osv/{rb,schastl}/2024-Q{1,2,3}` +- **THEN** «строк» = 1385, «документов» = 22, «несопоставленных» = 1381 + +### Requirement: Таблица свода и фильтры +Экран SHALL показывать строки `GET /consolidations/versions/{id}/osv` постранично (размер страницы ≤ 2000): ЮЛ, счёт, +контрагент, ИНН контрагента, признак контрагента (ГСК/ГК/Внешний), способ сопоставления, сальдо на начало Дт/Кт, +обороты Дт/Кт, сальдо на конец Дт/Кт (суммы — строками с разделителями разрядов). Фильтры: ЮЛ (`legal_entity_id`), +корень счёта (`account_root`), признак контрагента (`counterparty_type`), только несопоставленные (`unmapped`), поиск по +контрагенту (`q`, ≤ 500 символов). Смена фильтра SHALL перечитывать первую страницу. + +#### Scenario: Строка из контрольных цифр +- **WHEN** фильтр ЮЛ «Пекарня Счастливочная» и поиск «бисквит» +- **THEN** строка `60.01` показывает сальдо нач. Кт 4 454 151.93, обороты Дт 128 058 143.65, Кт 125 950 450.77, + сальдо кон. Кт 2 346 459.05, признак «ГСК» + +### Requirement: Пробелы +Экран SHALL показывать `gaps[]` сводки списком «ЮЛ — счёт — недостающие кварталы» с пояснением, что строки этих пар в +своде отсутствуют. + +#### Scenario: Пробелы РБ 2024 Q3 +- **WHEN** открыт свод версии РБ 2024 Q3 +- **THEN** показано 7 пробелов, у каждого недостающие кварталы «Q1, Q2» + +### Requirement: Экспорт +Кнопка «Скачать xlsx» SHALL получать `GET /consolidations/versions/{id}/osv/export` с текущими фильтрами через клиент API +с токеном и сохранять файл; имя — из `Content-Disposition`, а если заголовок недоступен — +`Сводная_ОСВ_<ГК>_<год>_<квартал>.xlsx`. + +#### Scenario: Экспорт с фильтром +- **WHEN** аналитик скачивает свод с фильтром по ЮЛ +- **THEN** сохраняется xlsx, а ошибка сервера показывается текстом, а не скачивается diff --git a/openspec/specs/consolidation-setup/spec.md b/openspec/specs/consolidation-setup/spec.md new file mode 100644 index 0000000..a4b7f20 --- /dev/null +++ b/openspec/specs/consolidation-setup/spec.md @@ -0,0 +1,44 @@ +# consolidation-setup Specification + +## Purpose +TBD - created by archiving change demo-prototype. Update Purpose after archive. + +## Requirements + +### Requirement: Состав модалки «Новая консолидация» +Модалка [42] SHALL предлагать выбор ГК (`GET /directories/company-groups`), ГСК этой ГК с `kind = gsk` +(`GET /directories/company-groups/{id}/related-groups`), года и квартала, и показывать **все** незакрытые ЮЛ ГК +(`GET /directories/legal-entities?company_group_id=&closed=false`, страницы дочитываются по `offset`, пока не получены +все `total`). Члены выбранной ГСК (`GET /directories/related-groups/{id}` → `members[]`) SHALL быть отмечены +автоматически; пользователь может снять или добавить отметки. + +#### Scenario: Выбор ГСК отмечает её членов +- **WHEN** аналитик выбирает ГК «Русский бисквит» и её ГСК +- **THEN** в списке ЮЛ видны все ЮЛ ГК, а члены ГСК («АО "Русский бисквит"», «ООО "Пекарня Счастливочная"») отмечены + +#### Scenario: ЮЛ больше одной страницы +- **WHEN** у ГК больше ЮЛ, чем `limit` одной страницы +- **THEN** модалка показывает все ЮЛ ГК, а не первую страницу + +### Requirement: Создание и переход к версии +По «Создать» модалка SHALL отправить `POST /consolidations {company_group_id, related_group_id, year, quarter, +legal_entity_ids}` с отмеченными ЮЛ. При 201 модалка SHALL закрыться, список консолидаций ГК — перечитаться, а созданная +версия (`VersionCard.id`) — открыться в карточке. При ошибке модалка SHALL остаться открытой и показать `message` из +`ApiError` (коды `CONSOLIDATION_EXISTS`, `RELATED_GROUP_MISMATCH`, `ENTITY_NOT_IN_GROUP`, `PERIMETER_TOO_SMALL` и 422 +валидации). + +#### Scenario: Успешное создание +- **WHEN** аналитик создаёт консолидацию 2024 Q3 с периметром из ГСК +- **THEN** открыта карточка версии №1 со статусом «Инициация» и двумя ЮЛ в панели «Организации» + +#### Scenario: Консолидация за период уже есть +- **WHEN** сервер отвечает 409 `CONSOLIDATION_EXISTS` +- **THEN** модалка не закрывается и показывает текст ошибки сервера + +### Requirement: Переход к сводной ОСВ из карточки +Кнопка «К отчётности» карточки версии SHALL вести на `/groups/:group_id/versions/:version_id/osv` и быть доступна в +любом статусе версии. + +#### Scenario: Переход к своду +- **WHEN** аналитик нажимает «К отчётности» у версии +- **THEN** открывается экран сводной ОСВ этой версии diff --git a/openspec/specs/document-review-ui/spec.md b/openspec/specs/document-review-ui/spec.md new file mode 100644 index 0000000..3c1a66a --- /dev/null +++ b/openspec/specs/document-review-ui/spec.md @@ -0,0 +1,69 @@ +# document-review-ui Specification + +## Purpose +TBD - created by archiving change demo-prototype. Update Purpose after archive. + +## Requirements + +### Requirement: Экран документа +Маршрут `/documents/:document_id` SHALL загрузить `GET /documents/{id}` и показать вид по `document_type`: `BALANCE` и +`INCOME` — проверка формы, `OSV` — просмотр ОСВ; для прочих типов — карточку документа без данных. Шапка экрана SHALL +показывать тип, ЮЛ-владельца, период и статус документа, кнопку «Назад». + +#### Scenario: Открытие формы баланса +- **WHEN** аналитик открывает документ `BALANCE` +- **THEN** показан экран проверки формы + +### Requirement: Скан рядом с формой +Для ББ/ОФР экран SHALL показывать исходный файл документа: PDF — постранично через pdf.js из байт +`GET /files/{file_id}/content?disposition=inline`, полученных клиентом API с токеном (не через `