Документация проекта
Проект «К1 Приход» — документация (живой снимок платформы)
Название: K1-parish-oc («Как работает: приход К1»)
Slug: parish1 · Project id: 34
Features: agents, portal_agent · Scope токена: mcp:admin
Назначение: автоматизация жизни прихода — требы, пожертвования (ledger), собрания с явкой/кворумом, дежурства с самозаписью; публичные формы для прихожан/гостей.
Настройки проекта: baseCurrency RUB, timezone Europe/Moscow, isPublished: true, channels: [], portalAllowedOrigins: [].
Дата снятия: 2026-09-04, прогон oc2 (только чтение платформы).
1. Дерево объектов (doc_tree, 19 узлов, все parentId=null — без вложенности)
id | Тип | Имя | slug | Published | PortalExposed |
|---|---|---|---|---|---|
1583 | dataTable | Клиенты (техзависимость событий) | customer | — | — |
1584 | dataTable | Собрания прихода | event | — | — |
1585 | dataTable | Явка на собрание | registration | — | — |
1586 | dataTable | Служебный справочник | directory-aux | — | — |
1587 | dashboard | События (дашборд модуля) | sobytiya | — | — |
1588 | dataTable | Прихожане | prikhozhane | — | — |
1589 | dataTable | Ключи аудиторий | klyuchi-auditoriy | — | — |
1590 | dataTable | Назначения пожертвований | naznacheniya-pozhertvovaniy | ✅ | — |
1591 | dataTable | Движения пожертвований | dvizheniya-pozhertvovaniy | — | — |
1592 | dataTable | Параметры прихода | parametry-prikhoda | — | — |
1593 | dataTable | Требы | treby | — | — |
1594 | dataTable | Дежурства | dezhurstva | ✅ | — |
1595 | dataTable | Записи на дежурство | zapisi-na-dezhurstvo | — | — |
1596 | dataTable | Быстрый ввод | bystryy-vvod | — | — |
1597 | dashboard | Отчёт совету | otchyot-sovetu | ✅ | — |
1598 | form | Записать требу | zapisat-trebu | ✅ | ✅ |
1599 | form | Сообщить о пожертвовании | soobshchit-o-pozhertvovanii | ✅ | ✅ |
1600 | form | Отметить дежурство | otmetit-dezhurstvo | ✅ | ✅ |
1601 | document | Как работает: приход К1 | kak-rabotaet-prikhod-k1 | ✅ | — |
Итого: 13 таблиц, 2 дашборда, 3 формы, 1 prose-документ.
2. Таблицы: схемы + счётчики записей
Счётчики — datatable_aggregate countEmpty+countNonEmpty по ключевой колонке. Всего строк: 77.
1583 Клиенты (техзависимость событий) — purpose core_customer — 0 строк
name(text), email, phone, address(multilineText), externalUser(externalPerson — «Личный кабинет»), source(select: walk_in/referral/online/social/phone/repeat/other), loyalty_points(number min0), marketing_opt_in(boolean), owner(person, personRole=assignee), notes. Техническая таблица-зависимость модуля core_event/core_registration; реальных клиентов не ведёт (см. открытые вопросы).
1584 Собрания прихода — purpose core_event — 3 строки
title(text), venue(reference→core_location, scheduleRole=resource), start/end(datetime, scheduleRole start/end), capacity(number), ticket_price(currency RUB, «не используется»), registered_count(rollup backlink из 1585), seats_left(formula {capacity}-{registered_count}), status(машина: draft→published→completed🔒/cancelled🔒), notes, agenda, minutes(протокол, вручную), roster_count(number), quorum_percent(number 0-100), quorum_flag(formula IF кворум).
1585 Явка на собрание — purpose core_registration — 12 строк
event(reference→1584), attendee(reference→1588 Прихожане), quantity(number min1), ticket_type(select), amount(currency, «не используется»), status(registered→attended/no_show/cancelled, все конечные кроме registered), registered_at(datetime).
1586 Служебный справочник — purpose core_directory_aux — 0 строк
person(person, directoryEntry), first_name/middle_name/last_name(text), full_name(formula TRIM(CONCAT)), manager(reference→1586, isHierarchyParent). Иерархия-clergy; демо не заполнено.
1588 Прихожане — кастомная — 7 строк
name(ФИО), email, phone, group(reference→1589 Ключи аудиторий).
1589 Ключи аудиторий — кастомная — 2 строки
name(unique), contact_email.
1590 Назначения пожертвований — кастомная, published — 4 строки
name(Назначение, unique), goal_amount(number ₽), progress_note, balance(balance-колонка: ledgerTableId=1591, deltaColumnId=delta, parentRefColumnId=parentRef, countedStateRoles=[posted], reservedStateRoles=[pending], effectiveDateColumnId=effectiveDate, allowNegative=false).
1591 Движения пожертвований — purpose core_ledger — 18 строк
parentRef(reference→1590, ledgerRole=parentRef), delta(ledgerRole=delta), effectiveDate(ledgerRole=effectiveDate), reverses(reference→1591, unique, ledgerRole=reverses — сторно), donor_name, donor_email, source(select), comment, status(машина: draft→pending(🪝reserved)→posted(🔒counted)/void(🔒)). Проведённое терминально — исправление только сторно.
1592 Параметры прихода — кастомная — 3 строки
key(unique), value, value_email, value_number.
1593 Требы — кастомная — 12 строк
applicant_name, applicant_email, treba_type(select), treba_date(date), assignee_name, assignee_email, comment, status(new→assigned→done).
1594 Дежурства — кастомная, published — 8 строк
title(Служба/праздник), start/end(datetime), slots_needed(number min1), status(select), filled_count(rollup backlink из 1595). Строка = слот-место (см. §57.2: exclusive_scheduling, слот=ОДНО место).
1595 Записи на дежурство — кастомная (scheduleRole-теги) — 6 строк
duty(reference→1594, scheduleRole=resource), volunteer_name, volunteer_email, duty_start/duty_end(datetime, scheduleRole start/end, dateRole planned), status(select). Пересекающаяся запись отклоняется 409.
1596 Быстрый ввод — кастомная — 2 строки
raw_text(Фраза), amount(number ₽), purpose(reference→1590), processed(boolean), kind(select).
3. Автоматизации (5 правил, все enabled: true, onError=stop)
id | Таблица | Название | Триггер | Действия |
|---|---|---|---|---|
282 | 1593 Требы | Автоназначение ответственного | event:create, cond | set_fields: assignee_name=«Отец Николай Протасов», assignee_email=delivered+protierey@resend.dev (статические значения — обход неработающего кросс-табличного LOOKUP, §57.5) |
283 | 1593 Требы | Напоминание ответственному за день | schedule cron | send_email → recipients kind=column(assignee_email); тема/тело с {{col.*}} |
284 | 1593 Требы | Уведомить заявителя о завершении | status_transition status→ | send_email → applicant_email (kind=column) |
285 | 1595 Записи на дежурство | Напоминание дежурному за день | schedule cron | send_email → volunteer_email (kind=column) |
286 | 1584 Собрания | Анонс в почту прихода | event:create, runOnAutomation | send_email → static delivered+parish-announce@resend.dev, {{col.title}}/{{col.start}}/{{col.agenda}} |
Доставка: на parish1 send_email реально доставлял 04.09 (runs 834/836/827–830, «Emailed 1 recipient(s)») — SMTP-коннектор работает, несмотря на channels: [] (send_message email-канал не включён — §57.6).
4. Формы (все публичные: submitAccess=everyone, portalExposed)
id | Название | Целевая таблица | Поля (→колонки) | URL |
|---|---|---|---|---|
1598 | Записать требу | 1593 Требы | ФИО→applicant_name*, email→applicant_email*, вид требу→treba_type*, дата→treba_date*, просьба→comment | /public/parish1/zapisat-trebu |
1599 | Сообщить о пожертвовании | 1591 Движения | назначение→parentRef*(reference), от кого→donor_name*, email→donor_email*, сумма→delta*, способ→source, коммент | /public/parish1/soobshchit-o-pozhertvovanii |
1600 | Отметить дежурство | 1595 Записи | слот→duty*(reference), ФИО→volunteer_name*, email→volunteer_email*, начало→duty_start*, окончание→duty_end* | /public/parish1/otmetit-dezhurstvo |
(* — required; кнопки: Отправить / Сообщить / Записаться; portalConfig=null у всех.)
5. Дашборды
1587 «События (дашборд модуля)» — не опубликован, publicUrl нет. 4 панели: Всего событий (metric, countNonEmpty title, 1584), По статусу (bar chart, dim status, 1584), Регистраций по событиям (horizontalBar, sum registered_count по title, 1584), Выручка с билетов (sum amount, 1585) — наследие модуля, «билеты» в К1 не используются.
1597 «Отчёт совету» — опубликован, публичный URL работает (200). 5 панелей: Собрано (sum delta status=posted, 1591), Заявок на подтверждении (countNonEmpty delta status=pending), Сборы по назначениям (chart, dim parentRef), Назначения: цель и сборы (pivot по 1590: goal_amount/balance), Последние поступления (table 1591, sort effectiveDate desc) + 2 слайсера (Период effectiveDate range, Источник source).
6. Документы-шаблоны и проверка токенов {{col.*}}
prose-документов в проекте ровно один: 1601 «Как работает: приход К1» (опубликован). Тело прочитано через doc_get_content: литеральных токенов {{col.*}} НЕТ — чисто. Содержит роли, точки входа, описание 4 процессов, админ-чеклист.
Шаблонов квитанций/писем как document-узлов нет; тексты писем живут в actions правил 283/284/285/286, где {{col.*}} — штатные runtime-токены (резолвятся движком, не дефект).
Примечание из реестра (dev-report строка 131): находка design-stage «платформа не генерирует текстовые документы» (К1) снята из реестра 03.09 как непроверенная — при живой сборке требует проверки.
7. Публичный контур (curl, 04.09)
URL | Статус |
|---|---|
/public/parish1/zapisat-trebu (форма) | 200 |
/public/parish1/soobshchit-o-pozhertvovanii (форма) | 200 |
/public/parish1/otmetit-dezhurstvo (форма) | 200 |
/public/parish1/otchyot-sovetu (дашборд) | 200 |
/public/parish1/naznacheniya-pozhertvovaniy (таблица) | 200 |
/public/parish1/dezhurstva (таблица) | 200 |
/public/parish1/kak-rabotaet-prikhod-k1 (документ) | 200 |
/portal/parish1 (корень портала) | 307 → 200 |
/public/parish1/sobytiya (неопубликованный дашборд 1587) | 404 (ожидаемо) |
/public/parish1/<несуществующий> | 404 (контроль) |
Контур К1 открыт и работает.
8. Известные грабли (из dev-report.md / error.md, относящиеся к parish1/К1)
dev-report §2 (обход обязателен): doc_upsert с documentId на уже читанный документ отвечает ok, но тело не пишет; в К1 потребовалось дважды: 1102→1108→1109 (нынешний документ — 1601). Правило: doc_get_content сразу после каждой записи; при отказе — archive + doc_upsert без documentId.
dev-report §57 (сборка К1, 9 наблюдений): 1) data_table_set_behaviour — аргумент roles:{resource:[colIds],start,end}; 2) exclusive_scheduling работает на CUSTOM-таблицах через scheduleRole-теги (слот=ОДНО место, «несколько мест» = несколько строк слота); 3) ledger pending=резерв — при allowNegative:false порядок демо: posted до pending (over_reservation); 4) batch прерывается на первом failed шаге; 5) set_fields канон fields:[{columnId,value}], map-форма падает s is not iterable; кросс-табличный LOOKUP из действий не работает (проверка №17 — ПРОВАЛ); 6) send_email ходит в SMTP напрямую и на parish1 доставлял (§2/E62 здесь НЕ подтверждается); 7) формула по rollup пересчитывается на write-таче строки-РОДИТЕЛЯ (кворум — проверка №18); 8) dashboard_set_meta: sort-ключ direction; balance-колонка валидна как measure; publicSources — полем dashboard_set_meta; 9) doc_upsert тип — document не doc.
error.md E94: ошибки сборки К1: dicts-формат set_fields+LOOKUP (2 failed-прогона), «несколько человек на слот» vs слот=место, pending до posted, переносы строк в shell-аргументах. Итог — неконсистентных данных нет, тестовые строки удалены/засторнированы.
error.md E79/E80/E81 (карта K1-oc2, открыто, минор): дублирование цепочек в разделе 3; служебная строка в непустой таблице расхождений; «Чьё действие»=«—» вне словаря в 5 строках 👤.
error.md R4: Личный кабинет для К1 не собран (механика есть на К17) — разработка, не настройка.
9. Открытые вопросы / дефекты
1583 Клиенты и 1586 Служебный справочник пусты (0 строк) — purpose-зависимости модулей core_event/core_directory_aux; демо-наполнение не заводилось. Вопрос: нужны ли они в сценариях К1 или только как платформенная техзависимость.
Мёртвые колонки модуля: ticket_price (1584) и amount (1585) помечены «не используется» — наследие core_*-модулей; панель «Выручка с билетов» дашборда 1587 опирается на пустующую колонку.
Дашборд 1587 «События (дашборд модуля)» не опубликован и дублирует функциональность модуля event; кандидат на архив, если не планируется.
Форма 1600 «Отметить дежурство» фактически — самозапись (пишет строку в 1595 «Записи на дежурство»); название расходится с действием.
channels: [] — email-канал проекта выключен; send_message не работает, работает только send_email через SMTP-коннектор.
Из doc 1601 (админ-чеклист, открытый): проверить SMTP-доставку; опубликовать страницу прихода с QR/телефоном казначея; проверить браузером отправку форм (HTTP-submit давал 422).
Аналитика кворума: quorum_flag пересчитывается только при write-таче строки собрания (не при записи явки) — староста может увидеть устаревший кворум до «touch» собрания.
E79–E81 карты K1-oc2 — минорные дефекты карты, не закрыты.