Документация проекта

Проект «К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_customer0 строк

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_event3 строки

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_registration12 строк

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_aux0 строк

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 Назначения пожертвований — кастомная, published4 строки

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_ledger18 строк

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 Дежурства — кастомная, published8 строк

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 assignee_email isEmpty, runOnAutomation

set_fields: assignee_name=«Отец Николай Протасов», assignee_email=delivered+protierey@resend.dev (статические значения — обход неработающего кросс-табличного LOOKUP, §57.5)

283

1593 Требы

Напоминание ответственному за день

schedule cron 0 9 * * * Europe/Moscow, each_row, cond: treba_date=$tomorrow AND status≠done

send_email → recipients kind=column(assignee_email); тема/тело с {{col.*}}

284

1593 Требы

Уведомить заявителя о завершении

status_transition status→done

send_email → applicant_email (kind=column)

285

1595 Записи на дежурство

Напоминание дежурному за день

schedule cron 0 9 * * *, each_row, cond: duty_start=$tomorrow AND status≠«Отменено»

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. Открытые вопросы / дефекты

1.

1583 Клиенты и 1586 Служебный справочник пусты (0 строк) — purpose-зависимости модулей core_event/core_directory_aux; демо-наполнение не заводилось. Вопрос: нужны ли они в сценариях К1 или только как платформенная техзависимость.

2.

Мёртвые колонки модуля: ticket_price (1584) и amount (1585) помечены «не используется» — наследие core_*-модулей; панель «Выручка с билетов» дашборда 1587 опирается на пустующую колонку.

3.

Дашборд 1587 «События (дашборд модуля)» не опубликован и дублирует функциональность модуля event; кандидат на архив, если не планируется.

4.

Форма 1600 «Отметить дежурство» фактически — самозапись (пишет строку в 1595 «Записи на дежурство»); название расходится с действием.

5.

channels: [] — email-канал проекта выключен; send_message не работает, работает только send_email через SMTP-коннектор.

6.

Из doc 1601 (админ-чеклист, открытый): проверить SMTP-доставку; опубликовать страницу прихода с QR/телефоном казначея; проверить браузером отправку форм (HTTP-submit давал 422).

7.

Аналитика кворума: quorum_flag пересчитывается только при write-таче строки собрания (не при записи явки) — староста может увидеть устаревший кворум до «touch» собрания.

8.

E79–E81 карты K1-oc2 — минорные дефекты карты, не закрыты.