Эпик B (UI): расходы программы Благорост — read-path + страницы #59

Closed
claude wants to merge 12 commits from feat/blagorost-program-expenses-ui into blagorost
Owner

Что в PR

Backend read-path для program-expense (capital::progexpenses):

  • domain: ProgramExpenseDomainEntity (composite), IProgramExpenseBlockchainData, IProgramExpenseDatabaseData, ProgramExpenseStatus (created/approved/authorized/paid/declined), ProgramExpenseRepository interface.
  • infrastructure: TypeORM-entity capital_program_expenses + ProgramExpenseTypeormRepository + delta mapper для таблицы progexpenses + output mapper.
  • application: ProgramExpenseSyncService (parser2 deltas → PG); ProgramExpensesManagementInteractor дополнен getProgramExpenses/getProgramExpenseById; service маппит через DocumentAggregationService.
  • GraphQL: capitalProgramExpenses(filter, options), capitalProgramExpense(data); CapitalProgramExpense, ProgramExpenseFilter, GetProgramExpenseInput, PaginatedCapitalProgramExpensesPaginationResult.
  • DI: PROGRAM_EXPENSE_REPOSITORY провайдер; ProgramExpenseTypeormEntity зарегистрирован в CapitalDatabaseModule; progexpenses добавлен в CapitalContractInfoService.
  • Миграция БД не требуется — таблица создаётся через synchronize: true.

SDK:

  • Mutations.Capital.{CreateProgramExpense, ApproveProgramExpense, AuthorizeProgramExpense, ConfirmProgramExpensePayment, DeclineProgramExpense, TopupProgramExpensePool}.
  • Queries.Capital.{GetProgramExpense, GetProgramExpenses} + селекторы programExpenseSelector / programExpensesPaginationSelector.

Desktop:

  • entity ProgramExpense (pinia store + api).
  • 6 feature-обёрток в features/ProgramExpense/* (только api+model, без UI-кнопок).
  • ProgramExpensesPage (для chairman+member): список с пагинацией, фильтром, статус-чипом, useHeaderActions для «Создать расход» (chairman) + poll MEDIUM.
  • ProgramExpenseDetailPage: карточка-метаданные + документы (1010/одобренная/1011) + Workflow-steps (created→approved→authorized→paid) + кнопки действий по состоянию + кнопка пополнения пула.
  • Роуты program-expenses и program-expense-detail в extensions/capital/install.ts.

Займы: UI для них в этом релизе не делаем, скрытие отдельно тоже не требуется (features/Debt/* ни к одной странице не подключены).

Известные ограничения

  • WorkflowActionDialog рисует структуру действия, но кнопка подтверждения disabled — полный flow подписи (генерация документа 1010/1011, подпись, отправка мутации с подписанным документом) подключается отдельным мастером.
  • Канон-обёртки shared/ui/base|domain|layout из /mono-desktop-canon ещё не вмерджены в blagorost — страницы написаны на ванильном Quasar с Material-иконками; после мерджа DEF→blagorost перекрасить под BaseTable/BaseBadge/PageHead.

Проверка

  • controller: npx tsc --noEmit — зелёно.
  • sdk: pnpm build — зелёно.
  • desktop: eslint targeted — зелёно. vue-tsc по всему проекту не гонял (по правилу из памяти).
  • Открыть /coopname/capital/program-expenses под chairman — кнопка «Создать расход» в правом верху, таблица пустая (если расходов ещё нет) или со списком.
  • Открыть /coopname/capital/program-expenses/:_id — workflow-карточка отображает корректное состояние, кнопки соответствуют статусу.

🤖 Generated with Claude Code

## Что в PR **Backend read-path для program-expense (capital::progexpenses):** - domain: `ProgramExpenseDomainEntity` (composite), `IProgramExpenseBlockchainData`, `IProgramExpenseDatabaseData`, `ProgramExpenseStatus` (created/approved/authorized/paid/declined), `ProgramExpenseRepository` interface. - infrastructure: TypeORM-entity `capital_program_expenses` + `ProgramExpenseTypeormRepository` + delta mapper для таблицы `progexpenses` + output mapper. - application: `ProgramExpenseSyncService` (parser2 deltas → PG); `ProgramExpensesManagementInteractor` дополнен `getProgramExpenses`/`getProgramExpenseById`; service маппит через `DocumentAggregationService`. - GraphQL: `capitalProgramExpenses(filter, options)`, `capitalProgramExpense(data)`; `CapitalProgramExpense`, `ProgramExpenseFilter`, `GetProgramExpenseInput`, `PaginatedCapitalProgramExpensesPaginationResult`. - DI: `PROGRAM_EXPENSE_REPOSITORY` провайдер; `ProgramExpenseTypeormEntity` зарегистрирован в `CapitalDatabaseModule`; `progexpenses` добавлен в `CapitalContractInfoService`. - Миграция БД не требуется — таблица создаётся через `synchronize: true`. **SDK:** - `Mutations.Capital.{CreateProgramExpense, ApproveProgramExpense, AuthorizeProgramExpense, ConfirmProgramExpensePayment, DeclineProgramExpense, TopupProgramExpensePool}`. - `Queries.Capital.{GetProgramExpense, GetProgramExpenses}` + селекторы `programExpenseSelector` / `programExpensesPaginationSelector`. **Desktop:** - entity `ProgramExpense` (pinia store + api). - 6 feature-обёрток в `features/ProgramExpense/*` (только api+model, без UI-кнопок). - `ProgramExpensesPage` (для chairman+member): список с пагинацией, фильтром, статус-чипом, useHeaderActions для «Создать расход» (chairman) + poll MEDIUM. - `ProgramExpenseDetailPage`: карточка-метаданные + документы (1010/одобренная/1011) + Workflow-steps (created→approved→authorized→paid) + кнопки действий по состоянию + кнопка пополнения пула. - Роуты `program-expenses` и `program-expense-detail` в `extensions/capital/install.ts`. **Займы:** UI для них в этом релизе **не делаем**, скрытие отдельно тоже не требуется (`features/Debt/*` ни к одной странице не подключены). ## Известные ограничения - `WorkflowActionDialog` рисует структуру действия, но кнопка подтверждения **disabled** — полный flow подписи (генерация документа 1010/1011, подпись, отправка мутации с подписанным документом) подключается отдельным мастером. - Канон-обёртки `shared/ui/base|domain|layout` из `/mono-desktop-canon` ещё не вмерджены в blagorost — страницы написаны на ванильном Quasar с Material-иконками; после мерджа DEF→blagorost перекрасить под `BaseTable/BaseBadge/PageHead`. ## Проверка - [ ] `controller`: `npx tsc --noEmit` — зелёно. - [ ] `sdk`: `pnpm build` — зелёно. - [ ] `desktop`: eslint targeted — зелёно. vue-tsc по всему проекту не гонял (по правилу из памяти). - [ ] Открыть `/coopname/capital/program-expenses` под chairman — кнопка «Создать расход» в правом верху, таблица пустая (если расходов ещё нет) или со списком. - [ ] Открыть `/coopname/capital/program-expenses/:_id` — workflow-карточка отображает корректное состояние, кнопки соответствуют статусу. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude added 11 commits 2026-06-02 11:21:41 +00:00
Дополнено `interfaces/capital.ts` интерфейсами под новые actions:
- closedebt / debtpayretry / markdebtoverd (Эпик A);
- createpgexp / apprvpgexp / authpgexp / pgexppay / declpgexp / topupprogexp (Эпик B);
- requestrole / approverole / declinerole / inviterole / acceptinvite / declinvite / requestrateu (Эпик D).

Новые table-интерфейсы IProgramExpense и IRoleRequest. Расширения existing
структур (binary_extension в C++ → optional в TS):
- IDebt: last_pay_error?, due_at?;
- ISegment: approved_rate_per_hour?, approved_hours_per_day?, active_debts_count?;
- IGlobalState: program_expense_pool?, program_expense_reserved?.
- ISettledebt: переход с username на debt_hash (совпадение с C++ ABI).

Loan IDebt: source_contract — кто инициировал выдачу долга
(capital / marketplace / ...), loan не знает доменного контекста.

Action-файлы actions/* и табличные tables/* по существующему паттерну,
индексы экспорта обновлены.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Новые registry-папки для документов Благорост:
- 1012 ProgramExpenseStatement / 1013 ProgramExpenseDecision (расход программы);
- 1100 RoleRequestStatement (заявление пайщика на L2-допуск);
- 1101 RoleInviteStatement (приглашение мастера на L2);
- 1102 RateUpdateStatement (запрос обновления ставки часа).

Регистрация в общем `registry/index.ts`. Generator'ы в backend (Эпик 4)
используют эти registry_id через `documentInteractor.generateDocument`.

Шаблоны (HTML context) — минимальные заглушки; реальные подкладываются
через document-migrator отдельной командой публикации.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Расходы программы (Эпик B):
- DTO `program_expenses_management/inputs.dto.ts` — 6 input;
- `ProgramExpensesManagementInteractor` / `Service` / `Resolver` —
  capitalCreateProgramExpense / capitalApproveProgramExpense /
  capitalAuthorizeProgramExpense / capitalConfirmProgramExpensePayment /
  capitalDeclineProgramExpense / capitalTopupProgramExpensePool;
- Генераторы `capitalGenerateProgramExpenseStatement` (1012) и
  `capitalGenerateProgramExpenseDecision` (1013).

Расширения по займам (Эпик A) + L2-допуски (Эпик D) — в одном резолвере
`BlagorostAdditionsResolver`:
- closeDebt / debtPayRetry / markDebtOverdue;
- requestRole / approveRole / declineRole / inviteRole / acceptInvite /
  declineInvite / requestRateUpdate;
- Генераторы 1100/1101/1102.

Расширен `CapitalBlockchainPort` 16 методами; реализация в
`CapitalBlockchainAdapter` через приватный `transactAs(...)`,
который сворачивает повторяющийся vault+initialize+transact.

Read-queries для programExpenses не делаются в этом проходе — требует
TypeORM entity + sync mapper (отдельный pre-эпик для sync-слоя).

Fix preexisting baseline: добавлена заглушка
`ChatcoopInterProjectCommunicationArtifactsAdapter.listNonProjectCommunicationRooms`
(метод в interface `InterProjectCommunicationArtifactsPort` появился в
dist `@coopenomics/inter`, но реализация в chatcoop отсутствовала —
блокировал generate-schema).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Запущена пятишаговая процедура:
  generate-schema → generate-client → sdk build

В schema появились новые mutations capital:
- capitalCreateProgramExpense / Approve / Authorize / ConfirmPayment / Decline /
  TopupProgramExpensePool + 2 generator-мутации (1012/1013);
- capitalCloseDebt / DebtPayRetry / MarkDebtOverdue;
- capitalRequestRole / ApproveRole / DeclineRole / InviteRole / AcceptInvite /
  DeclineInvite / RequestRateUpdate + 3 generator-мутации (1100/1101/1102).

Zeus-клиент в `components/sdk/src/zeus/` и copy в `components/controller/zeus/`
пересобраны и закоммичены. UI Финансы программ (Эпик 9.4) и UI
Управление (Эпик 10.3) могут использовать эти mutations напрямую.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
9 новых workflow по существующему паттерну `WorkflowBuilder` + Zod-схема
payload + LiquidJS в шаблонах (не Handlebars):

Расходы программы (Эпик B):
- capital-program-expense-approval-request (tag: chairman, capital)
- capital-program-expense-approved (tag: council-member, capital)
- capital-program-expense-authorized (tag: treasurer, capital)
- capital-program-expense-paid (tag: participant, capital)
- capital-program-expense-declined (tag: participant, capital)

Займы (Эпик A) — дедлайн-таймеры:
- capital-debt-due-soon (tag: participant)
- capital-debt-overdue (tag: participant)

L2-допуски (Эпик D):
- capital-role-requested (tag: master)
- capital-role-approved (tag: participant)

Все экспортируются из `@coopenomics/notifications/workflows` и
регистрируются в `allWorkflows`. Триггеры из controller'а добавляются
в notification-services (`debt-notification.service.ts`,
`expense-notification.service.ts` и т.п.) — отдельная итерация Эпика 6.3.

Каналы доставки — стандартные Novu (In-App / Email / Push).
Matrix-моста и отдельного GraphQL Subscription `coopEvents` не делается —
Novu Inbox покрывает требование «уведомление на каждом чихе».

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
— Удалены registry 1100 RoleRequestStatement / 1101 RoleInviteStatement / 1102 RateUpdateStatement: запрос/инвайт роли и обновление ставки — программные сущности контракта, не юридические документы (нет заявления, нет протокола).
— Удалены registry 1012 ProgramExpenseStatement / 1013 ProgramExpenseDecision: дубль уже существующих 1010 ExpenseStatement / 1011 ExpenseDecision, переключил `ProgramExpensesManagementService` на 1010/1011 (общая форма «заявление о расходах»).
— `BlagorostAdditionsResolver`: убраны три document-generator mutations (capitalGenerateRoleRequestStatement / capitalGenerateRoleInviteStatement / capitalGenerateRateUpdateStatement) — остаются только action-mutations.
— Контракт capital: actions requestrole/approverole/declinerole/inviterole/acceptinvite/declinvite/requestrateu и так без поля document — правок в C++ не потребовалось.

SDK: schema.gql + Zeus regenerated.
— 1010.ExpenseStatement переписан под бумажный шаблон 1010.СлужебнаяЗапискаПоРасходам.pdf (Action: project_name/component_name/deadline/total_amount/items[]/position/statement_number; Liquid-разметка по образцу 1005 InitProjectStatement).
— 1011.ExpenseDecision переписан как протокол решения совета по записке 1010 (по образцу 1006 InitProjectDecision; повестка ссылается на номер записки и состав затрат, решение фиксирует согласование списания по Фонду хозяйственной деятельности).
— Из ProgramExpensesManagementResolver/Service удалены дублирующие generator-мутации capitalGenerateProgramExpenseStatement/Decision: генерация теперь только через общие capitalGenerateExpenseStatement/Decision (тот же registry 1010/1011).

SDK: schema.gql + Zeus regenerated.
— domain: composite entity ProgramExpenseDomainEntity + interfaces (db/bc) + enum ProgramExpenseStatus (created/approved/authorized/paid/declined) + repository interface.
— infrastructure: TypeORM-entity capital_program_expenses + repository + mappers (delta + output) + регистрация паттерна таблицы progexpenses в CapitalContractInfoService.
— application: ProgramExpenseSyncService подписывается на дельты contract=capital/table=progexpenses; ProgramExpensesManagementInteractor получает PROGRAM_EXPENSE_REPOSITORY и отдаёт getProgramExpenses/getProgramExpenseById; service маппит на ProgramExpenseOutputDTO через DocumentAggregationService.
— GraphQL: добавлены резолверы capitalProgramExpenses(filter, options) и capitalProgramExpense(data), DTO ProgramExpenseOutputDTO (CapitalProgramExpense) + ProgramExpenseFilter + GetProgramExpenseInput + PaginatedCapitalProgramExpenses.
— модуль: ProgramExpenseTypeormEntity подключён в CapitalDatabaseModule, ProgramExpenseTypeormRepository — провайдер PROGRAM_EXPENSE_REPOSITORY, ProgramExpenseDeltaMapper/SyncService — в providers.
— SDK: добавлены обёртки Mutations.Capital.{CreateProgramExpense, ApproveProgramExpense, AuthorizeProgramExpense, ConfirmProgramExpensePayment, DeclineProgramExpense, TopupProgramExpensePool}.

Таблица capital_program_expenses создаётся через synchronize:true (TypeORM). Миграция не требуется.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
— schema.gql: добавлены capitalProgramExpenses/capitalProgramExpense + типы CapitalProgramExpense / ProgramExpenseFilter / GetProgramExpenseInput / PaginatedCapitalProgramExpensesPaginationResult / enum ProgramExpenseStatus.
— Zeus (controller + sdk) перегенерирован.
— sdk селекторы: programExpenseSelector + programExpensesPaginationSelector.
— sdk Queries.Capital: GetProgramExpense + GetProgramExpenses.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
— extensions/capital/entities/ProgramExpense: api (loadProgramExpenses/loadProgramExpense через Queries.Capital.GetProgramExpense(s)) + pinia store + types (тянутся из @coopenomics/sdk).
— extensions/capital/features/ProgramExpense:
  · CreateProgramExpense    — мутация capitalCreateProgramExpense (+ перезагрузка списка)
  · ApproveProgramExpense   — capitalApproveProgramExpense
  · AuthorizeProgramExpense — capitalAuthorizeProgramExpense
  · ConfirmProgramExpensePayment — capitalConfirmProgramExpensePayment
  · DeclineProgramExpense   — capitalDeclineProgramExpense
  · TopupProgramExpensePool — capitalTopupProgramExpensePool

UI-компонентов в фичах нет — кнопки рисует страница ProgramExpensesPage по канону /mono-desktop-canon.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ProgramExpensesPage (для chairman+member):
— q-table со списком (поля: №, Описание, Сумма, Инициатор, Дата, Статус-чип) + пагинация + poll MEDIUM.
— useHeaderActions для кнопки «Создать расход» (только chairman) — в правом верхнем углу через топбар.
— Q-banner с пояснением процесса (СЗ → одобрение → авторизация → выплата).
— Клик по строке → ProgramExpenseDetailPage.

ProgramExpenseDetailPage:
— Карточка-метаданные: №, сумма, статус-чип, инициатор, дата, фонд, хэш.
— Карточка «Документы» (DocumentRow для 1010 + одобренной + 1011 со статусом приложен/подписан).
— Карточка «Жизненный цикл» (WorkflowSteps: created → approved → authorized → paid; declined трактуется отдельно).
— Кнопки действий по состоянию: created → Одобрить/Отклонить (chairman); approved → Авторизовать/Отклонить (chairman+member); authorized → Подтвердить выплату/Отклонить (chairman).
— Кнопка «Пополнить пул» (chairman) — отдельной карточкой.
— WorkflowActionDialog рисует структуру действия + предупреждение о необходимости подписи; реальная подпись/мутация подключается отдельным мастером (сейчас disable).

Роуты в extensions/capital/install.ts:
— /:coopname/capital/program-expenses (name=program-expenses) с meta.roles=['chairman','member'].
— /:coopname/capital/program-expenses/:_id (name=program-expense-detail) с meta.hidden=true.

Канон-обёртки base/domain/layout из /mono-desktop-canon ещё не вмерджены в blagorost — страницы написаны на ванильном Quasar с Material-иконками; перекраска под BaseTable/BaseBadge/PageHead — после мерджа DEF→blagorost.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
claude added 1 commit 2026-06-02 11:46:46 +00:00
- ProgramExpenseDetailPage: q-spinner-dots → WindowLoader (паттерн ветки blagorost, ср. ProjectsResultsPage); вместо v-if/v-else через сторонний слот — два независимых v-if (loading и not-found), чтобы не ломать цепочку директив между WorkflowActionDialog.
- WorkflowSteps: убрать неиспользуемый idx из v-for (vue/no-unused-vars).
Author
Owner

Закрыт как deprecated. Одиночная архитектура program_expense (1 запись = 1 платёж) заменяется универсальным шасси расходов (proposal-агрегат с массивом SINGLE-items). Реализация — эпики C28-28..C28-34 в проекте 14 (Версия 3 ЦК), на основе PRD f8 (13-platforma-tsifrovogo-kooperativa/components/14-versiya-3/requirements/f8-prd-shassi-...md) и арх-концепции 51. Cleanup legacy кода ProgramExpense из этого PR — часть эпика C28-33 (Благорост-интеграция). Зонтичный PR пойдёт на dev.

Закрыт как deprecated. Одиночная архитектура `program_expense` (1 запись = 1 платёж) заменяется универсальным шасси расходов (proposal-агрегат с массивом SINGLE-items). Реализация — эпики **C28-28..C28-34** в проекте 14 (Версия 3 ЦК), на основе PRD f8 (`13-platforma-tsifrovogo-kooperativa/components/14-versiya-3/requirements/f8-prd-shassi-...md`) и арх-концепции 51. Cleanup legacy кода `ProgramExpense` из этого PR — часть эпика C28-33 (Благорост-интеграция). Зонтичный PR пойдёт на `dev`.
claude closed this pull request 2026-06-02 13:55:28 +00:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#59