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

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

Статус

Комментарий

/public/football-club-oc/podtverdit-uchastie

404

форма архивирована (publicUrlBlocked=document_archived)

/api/public/football-club-oc/data-tables/1290/rows

404

таблицы не опубликованы/архив

/api/public/football-club-oc/forms/podtverdit-uchastie

404

/public/football-club-oc/debitorka

404

дашборды не опубликованы

/p/football-club-oc

307 → /auth/login

портал жив, анонимный вход закрыт (норма)

/portal/football-club-oc

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

1.

Архивация всего проекта 03.09.2026 14:39 — намеренное закрытие волны или побочный эффект? Восстанавливать ли (doc_restore) — решение владельца.

2.

Правила 195/196/198/199 из журналов отсутствуют живьём — задокументировать автоматизацию нечем; при рестарте кейса их надо собирать заново.

3.

subscription:reference в 1286 — битая ссылка (target null).

4.

test_read_check (1301) — удалить при рестарте.

5.

Дубли счетов E63 не решены (сид vs новые).

6.

Публичная форма 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 в этом разделе — история, а не указатель.