Документация проекта
Проект «К7 Футбольный клуб» — документация живой сборки
Название: K7-football-club-oc
Slug: football-club-oc
Project ID: 41
Назначение: кейс К7 (каталог SMB) — учёт турнирных взносов и дебиторки клуба (счета/платежи/кредит-ноты), события и регистрации, RSVP-подтверждения участия, лист ожидания.
Дата съёмки: 2026-09-05, сбор живьём через MCP-фолбэк (mcp.py), опора только на текущее состояние платформы.
⚠️ Главный факт сборки: все 17 объектов проекта архивированы (
archivedAt≈ 2026-09-03T14:39Z;test_read_check— 08:48Z). Активное дерево (doc_treeбезincludeArchived) пусто:total: 0. Данные (строки) при этом сохранены и читаются. Документация ниже описывает архивированную, но единственную живую конфигурацию.
1. Дерево объектов (doc_tree, includeArchived, всего 17)
Все узлы — уровень parentId=null (корень), порядки a0–aG:
documentId | Имя | Тип | Slug | isPublished | Статус |
|---|---|---|---|---|---|
1285 | Счета | dataTable | invoice | false | архив |
1286 | Строки счетов | dataTable | invoice-line | false | архив |
1287 | Платежи | dataTable | payment | false | архив |
1288 | Кредит-ноты | dataTable | credit-note | false | архив |
1289 | Площадки | dataTable | location | false | архив |
1290 | Игроки | dataTable | customer | true | архив |
1291 | События | dataTable | event | true | архив |
1292 | Регистрации | dataTable | registration | false | архив |
1293 | Дебиторка | dashboard | debitorka | false | архив |
1294 | События | dashboard | sobytiya | false | архив |
1295 | Параметры клуба | dataTable | parametry-kluba | false | архив |
1296 | Команда | dataTable | komanda | false | архив |
1297 | Лист ожидания | dataTable | list-ozhidaniya | false | архив |
1298 | Турнирный сбор | dataTable | turnirnyy-sbor | false | архив |
1299 | Подтвердить участие | form | podtverdit-uchastie | true (portalExposed) | архив |
1300 | Заявки на участие | dataTable | zayavki-na-uchastie | false | архив |
1301 | test_read_check | dataTable | test-read-check | false | архив |
Документов (type=document), папок, таблиц-документов, whiteboard/link/spreadsheet в дереве нет (проверено с includeArchived=true и фильтром по типам).
2. Таблицы: схемы и счётчики
Счётчики — постраничное чтение datatable_get_rows (limit 200; total в ответе отсутствует — не отдаётся; агрегация по id не использовалась). Итого строк: 87.
2.1 Счета (1285, invoice, purpose core_invoice) — 21 строка
number:sequence(INV-{YYYY}-, pad4, yearly) · customer:reference→1290 · company:reference→core_company · issue_date:date · due_date:date · period_start:date · tax_jurisdiction:text · total:rollup sum backlink 1286.line_total · amount_paid:rollup sum backlink 1287.effect · amount_credited:rollup sum backlink 1288.effect · tax_total:rollup sum backlink 1286.tax_amount · total_gross:formula {total}+{tax_total} · outstanding:formula {total_gross}+{amount_paid}+{amount_credited} · aging:formula (Paid/Current/1-30/31-60/61-90/90+ от due_date) · status:status (draft→sent→partial→paid; void locksRow; autoTransitions: sent→paid при outstanding≤0, sent→partial при amount_paid>0, partial→paid) · notes · purpose · email · phone · fee_amount:currency · tournament_ref:reference→1296.
Protected: number, status.
2.2 Строки счетов (1286, invoice-line, core_invoice_line) — 9 строк
invoice:reference→1285 · product:reference→core_catalog · description · qty:number · unit_price:currency(USD) · line_total:formula qty*unit_price · subscription:reference(target=null — битая ссылка) · period_start/period_end:date · tax_category:text · tax_rate:formula TAX_RATE(LOOKUP({invoice},"tax_jurisdiction"),{tax_category}) · tax_amount:formula · line_total_gross:formula.
2.3 Платежи (1287, payment, core_payment) — 3 строки
invoice:reference→1285 · amount:currency · kind:select · effect:formula IF(kind="refund", amount, -amount) · method:select · paid_at:date · reference:text.
2.4 Кредит-ноты (1288, credit-note, core_credit_note) — 0 строк
number:sequence · invoice:reference→1285 · amount:currency · effect:formula -amount · reason:select · issued_at:date · notes.
2.5 Площадки (1289, location, core_location) — 3 строки
code · name · timezone:select · address · lat/lng:number · parent_location:reference→1289 · geofence:geofence.
2.6 Игроки (1290, customer, core_customer, isPublished=true) — 15 строк
name · email · phone · address · externalUser:externalPerson (личный кабинет) · source:select · loyalty_points:number · marketing_opt_in:boolean · owner:person · notes · ar_balance:rollup sum backlink 1285.outstanding via customer · status_in_squad:select · position:select · team_ref:reference→1296.
2.7 События (1291, event, core_event, isPublished=true) — 5 строк
title · venue:reference→1289 · start/end:datetime · capacity:number · ticket_price:currency · registered_count:rollup count backlink 1292.event · seats_left:formula · status:status (draft/published/completed locks/cancelled locks) · notes · min_players/max_players:number · tournament_fee:currency · fee_issued:boolean · roster_notified:boolean · team_ref:reference→1296 · captain_email:email.
2.8 Регистрации (1292, registration, core_registration) — 23 строки
event:reference→1291 · attendee:reference→1290 · quantity · ticket_type:select · amount:currency · status:status (registered/attended/no_show/cancelled) · registered_at:datetime · email · phone · submitted_by:externalPerson(personRole=submitter) · event_start:lookup forward via event→start.
2.9 Параметры клуба (1295) — 6 строк — key/value:text + description. (purpose null; значения хранятся текстом — см. грабли.)
2.10 Команда (1296) — 1 строка — season_name:text · fee_amount:currency · is_issued:boolean.
2.11 Лист ожидания (1297) — 0 строк — event→1291 · player→1290 · added_at:datetime · status:select.
2.12 Турнирный сбор (1298) — 0 строк — name · fee_amount:currency · is_issued:boolean.
2.13 Заявки на участие (1300) — 1 строка — event→1291 · attendee→1290 · email · phone · status:select. (Таргет формы 1299.)
2.14 test_read_check (1301) — 0 строк, колонок нет — технический мусор сборки.
3. Автоматизации
automation_get_meta по documentId всех 14 таблиц, формы и обоих дашбордов: rules: []. Поиск search({type:"automation"}) по широкому набору подстрок (RU/EN) — 0 совпадений.
Вывод живой сборки: автоматизаций в проекте нет ни одного правила. Журналы прежней волны упоминали правила 195/196/198/199 (выставление счетов, напоминания) — в текущем живом состоянии они отсутствуют (удалены/не перенесены при архивации).
4. Формы
1299 «Подтвердить участие» (podtverdit-uchastie):
Поля: event (Событие, required), attendee (Игрок, required), email (required), phone (required); submitLabel «Подтвердить участие».
Таргет записей: dataTable 1300 «Заявки на участие».
portalExposed: true, isPublished: true, но документ архивирован → publicUrl: null, publicUrlBlocked: "document_archived".
5. Дашборды
1293 «Дебиторка» (debitorka, isPublished=false): панели — outstanding metric «К оплате, всего» (sum outstanding, binding 1285), by_aging bar «Просрочка» (sum outstanding × aging, 1285), by_status horizontalBar «По статусу» (1285).
1294 «События» (sobytiya, isPublished=false): total_events metric (countNonEmpty title, 1291), by_status bar (1291), registered_by_event horizontalBar (sum registered_count × title, 1291), ticket_revenue metric (sum amount, 1292).
6. Документы-шаблоны и проверка токенов
В дереве (включая архив) нет ни одного объекта type=document — проверено doc_tree({types:["document","folder","spreadsheet","whiteboard","link"], includeArchived:true}) → total 0.
Результат проверки ключевого вопроса волны (литеральные токены {{col.*}} / {{parent.*}} в телах через doc_get_content): неприменимо — документировать нечего. Артефактов doc_get_content не вызывалось (шаблонов нет).
7. Публичный контур (проверено curl 2026-09-05)
Настройки проекта: isPublished: true, channels [email], baseCurrency RUB, timezone Europe/Moscow, portalAllowedOrigins [].
URL | Статус | Комментарий |
|---|---|---|
| 404 | форма архивирована (publicUrlBlocked=document_archived) |
| 404 | таблицы не опубликованы/архив |
| 404 | |
| 404 | дашборды не опубликованы |
| 307 → /auth/login | портал жив, анонимный вход закрыт (норма) |
| 307 → …/login |
Вердикт: публичный контентный контур ЗАКРЫТ — ни один публичный адрес не отдаёт 200; причина — архивация всех документов (для формы) и isPublished=false (для таблиц/дашбордов), при опубликованном проекте.
8. Грабли проекта (из журналов, сверено живьём где возможно)
E59: правило 198 создавало только шапки счетов → rollup total=0; due_date = дата выставления вместо +7 дней. Живой след: 21 строка в 1285 при 9 сид-счетах.
E62: без живого SMTP-коннектора все send_message-правила честно падали failed; канал email в settings ≠ доставка (нужен connector_set_meta({pluginId:"email"})).
E63: дубли счетов: сид INV-2026-0001..0009 + 12 от правила 198 (у 9 игроков по два счёта); повторный fire закрыт флагом is_issued=true, дубли в данных остались.
dev-report §32: create_rows_from_source не фильтрует строки источника (счета всем 15, включая запасных); automation_set_meta молча принимает неизвестные ключи (sourceConditions проигнорирован).
R2 (не проверено): rollup registered_count включает ли строки «лист ожидания» (К7 обойдено отдельной таблицей 1297).
R4: личный кабинет для К7 не собран (механика есть на К17).
Параметры клуба (1295): все значения живут текстом в key/value против number/select в карте — читатели должны кастовать.
9. Открытые вопросы
Архивация всего проекта 03.09.2026 14:39 — намеренное закрытие волны или побочный эффект? Восстанавливать ли (doc_restore) — решение владельца.
Правила 195/196/198/199 из журналов отсутствуют живьём — задокументировать автоматизацию нечем; при рестарте кейса их надо собирать заново.
subscription:reference в 1286 — битая ссылка (target null).
test_read_check (1301) — удалить при рестарте.
Дубли счетов E63 не решены (сид vs новые).
Публичная форма RSVP нерабочая (архив) — при оживлении снять архив и переустановить publicUrl.
Публичный доступ
Настоящая документация опубликована на платформе типом document, имя «Документация проекта», slug dokumentatsiya-proekta, isPublished=true; живой publicUrl — тот, что отдаёт doc_get для неархивированного экземпляра из doc_tree.
История экземпляров: 1757 и 1758 — оба архивированы (дефект body-patch ниже); живой экземпляр — последний неархивированный «Документация проекта» в doc_tree (его publicUrl в doc_get).
publicUrl живого экземпляра: https://smb.farhome.ru/public/football-club-oc/dokumentatsiya-proekta — анонимный curl подтверждён HTTP 200 (2026-09-05).
Проект опубликован (project_settings_get.isPublished=true), обход E32 (project_settings_set) не понадобился.
Остальной публичный контент проекта по-прежнему закрыт (все 17 объектов архивированы; форма 1299 — publicUrlBlocked=document_archived, таблицы/дашборды — 404). Единственный живой публичный адрес — этот документ.
Дефект платформы (снимок 05.09)
doc_upsert с documentId (partial patch) возвращает mode:"update", ok, но тело не переписывает: updatedAt не двигается, doc_get_content отдаёт старое содержимое (воспроизведено 3 раза, включая тело-маркер TEST-MARKER). Обход: doc_archive + повторный create с тем же slug (архив не удерживает slug — суффикс -2 не выдан). Побочный эффект обхода — self-id в тексте не может ссылаться на финальный экземпляр, поэтому id в этом разделе — история, а не указатель.