Каталог сутностей
Перелік доменних сутностей (ProjectK.Common/Entities), згрупований за модулями. Спільний базовий
клас — Entity. Межі модулів і те, хто в кого може питати, описано в
Архітектурі.
- AppUser — обліковий запис (ASP.NET Identity), має
OnboardingStatus(активний, запрошений, призупинений).ActiveKurinKey— курінь, у якому людина зараз діє. - AppRole — системна роль (Identity). Насправді значуща лише
Admin; діловодства в курені дають ролі виглядуKV.Zvyazkovyiпід час входу, а не зберігаються в Identity. - UserRefreshToken — одна сесія браузера. Вхід додає рядок, вихід завершує один, зміна пароля чи MFA завершує всі.
- Invitation — запрошення з токеном активації.
- WaitlistEntry — заявка зі списку очікування (
WaitlistVerificationStatus).KraiCode— край, який вибрав заявник (зовнішній ключ наKrai, може бути порожнім). Курінь відкривається в краї, який адміністратор задав при схваленні, інакше в цьому, інакше в типовому. - UserTileLayout — збережене розташування плиток на панелі користувача.
- DismissedDuty — справа, яку людина сховала зі своїх «Справ»: ключ справи (вид, курінь,
гурток, подія, повторення) і її розмір на той час (
Fingerprint, для лічильних — число). Справа лишається схованою, поки не виросте; рядок живе 30 днів, видалення акаунта забирає його каскадом.
Kurin (ядро домену)
Section titled “Kurin (ядро домену)”- Kurin — курінь (за числом).
KraiCode— край (зовнішній ключ наKrai, типовоua); число унікальне в межах краю, тож у двох краях може бути свій курінь 12.HiddenCardFields— JSON-масив ключів полів картки, які курінь не показує: лише ті, що край дозволяє прибрати.AccessPolicy— JSON з відхиленнями прав і видимості від значеньKurinCapabilities({"v":1,"grants":{…}}); порожнє — усе за замовчуванням. - Group — гурток у курені.
- Member — людина. Від 0.20.0 член не належить куреню напряму. Окрім імені, пошти й дати
народження —
MiddleName,Address,School, контакти батьків (Mother*,Father*) іCardExtras(значення власних полів краю, JSON). Телефони зберігаються одним виглядом —+380501234567, лише «+» і цифри (ProjectK.Common/Phones/PhoneNumbers.cs). - Membership — належність людини до куреня (з гуртком, датами приходу й виходу). Одна людина може стояти в кількох куренях; активний вибирається при вході.
- Leadership / LeadershipHistory — провід (КВ, курінний, гуртковий) і хто коли яке діловодство тримав. Саме з активних записів виводяться права.
- MentorAssignment — закріплення впорядника за гуртком. Активне закріплення трактується як діловодство впорядника в КВ.
- MemberAward — відзначення; MemberWarning — зауваження й стягнення.
- PlastLevelHistory — історія пластових ступенів.
- PlanningSession, PlanningParticipant, ParticipantBusyRange — планування заходів і зайнятість учасників.
- AgendaItem, AgendaAssignment, AgendaCategory, AgendaResponse — календар і задачі: події й задачі з призначенням «для кого» (курінь, гурток, провід, людина), категорією з власним кольором, повторами й відповідями «буду / не буду». Автор бачить те, що створив, навіть коли призначив іншим.
Probes & Badges
Section titled “Probes & Badges”- ProbeProgress / ProbePointProgress — проба і її окремі точки.
- BadgeProgress — вмілість.
- Історія підписів і статусів проби й вмілості живе в журналі дій (
KurinAuditEvent); колишніProbeProgressAuditEvent/BadgeProgressAuditEventперенесено туди в 1.2.3.
Каталог самих проб і вмілостей у базі не живе — його віддає сервіс каталогу по API.
- Krai — пластовий край за коротким кодом (
ua,pl,de…). Кожен курінь належить одному краю. Початкові 28 країв (список із глобального сайту Пласту) засіває міграція зKraiSeed: Україна й Чехія — з порожнім профілем, решта — зі своєю валютою й часовим поясом. Каталог мітить вмілості лише якuaчиpl, тож Польща читає польські, а решта засіяних — українські. Край, зареєстрований пізніше, додає адміністратор черезPOST api/krai, а не новий рядок уKraiSeed: код, який адмін уже створив, зламав би таку міграцію дублікатом. - KraiProfileRevision — одна збережена версія профілю краю (JSON у
Json,SchemaVersion). Рядки лише додаються: чинна — остання ревізія, відновлення давнішої додає нову.
Сам профіль — не сутність, а модель у ProjectK.Common/Models/KraiProfiles: KraiProfileDocument
(як збережено, кожне поле необовʼязкове) і KraiProfile (усе заповнено, це читає решта коду через
IKraiProfileProvider). Секції: Catalog — з яких країв вмілості й які приховати; Locale —
валюта, часовий пояс, формат чисел (NumberLocale, типово uk-UA); CardFields — які поля картки
обовʼязкові, необовʼязкові чи приховані, і власні поля краю; Dues — куди курені передають вкладку
(upstream: stanytsia, krai чи both, типово stanytsia) і пільги краю (concessions[]:
key, name, kind — percent, amount чи exempt, value, appliesTo — stanytsia,
krai, kurin, group). Правило, яке не можна порахувати, при читанні відкидається.
Dues (вкладка)
Section titled “Dues (вкладка)”- KurinDuesRate — курінна частина квартальної вкладки з певного кварталу: статті в
Articles(JSON-колонка зі спискомKurinDuesArticle— назва, сума, сума з пільгою, кому йде:DuesRecipient.Stanytsia= 0,Kurin= 1 чиKrai= 2) і підсумки з них за отримувачем (StanytsiaFull/Reduced,KraiFull/Reduced);KurinReduced— курінна частина з пільгою,nullна ставках, заданих до статей. - GroupDuesRate — гурткова частина вкладки з певного кварталу; кожен гурток задає свою.
- DuesConcession — пільга куреня, увімкнена чи вимкнена для членства з певного кварталу; рядки — історія.
- DuesConcessionGrant — пільга краю, надана членству на відрізок кварталів:
ConcessionKey, копія правила (Name,Kind,Value,Parts— прапорціDuesParts:Stanytsia,Krai,Kurin,Group),FromQuarter/ToQuarter(якDuesQuarter.Index, кінця може не бути),Reason,SetByUserKey. Правило копіюється, тож зміна профілю не переписує минулих кварталів. Із пільги куреня й наданих пільг краю діє та, з якою людина платить найменше. - DuesCharge — квартал вкладки, який винне членство, і гурток, у якому людина тоді була. Суму не зберігає — її рахують зі ставок при читанні.
- DuesEntry — операція в касі гуртка чи куреня (
GroupKey=null); передачу куреня просто краю позначаєTransferToKrai= 8. Перевірена операція замкнена; помилку в ній виправляєCorrection. Передачу, яку курінний скарбник уже прийняв, теж не можна змінити чи видалити (409TransferReceived,DuesEntryLock). Видаляється лише позначкою. - DuesEntryEvent — подія з операцією і її знімок після зміни; живе стільки ж, скільки операція.
Score (точкування)
Section titled “Score (точкування)”- KurinScoreSettings — як курінь рахує бали (
ScoreAlgorithm); без рядка — середнє. - ScoreRule — скільки вартує автоматичне джерело (вмілість, точка проби, сплачений квартал, пересторога) з певної дати; нуль вимикає джерело.
- ScoreAttendanceRate — скільки вартує присутність: на всіх подіях категорії або на одній події чи серії (вона важливіша).
- ScoreItem — позиція зі списку куреня («однострій» +1, «запізнення» −1); на події дається людині лише раз.
- ScoreStage — названий відрізок днів для окремого підсумку; балів не має, тож етапи можуть перекриватися.
- ScoreAttendance — людина була на одному повторенні події. Одна відмітка на (членство, подія, повторення); зняття лишає рядок із позначкою.
- ScoreNotHeldOccurrence — повторення події не відбулося («Сходин не було»): одне на (подія, повторення), хто й коли сказав. Прибирає подію зі «Справ» проводу; перша відмітка присутності чи «Повернути» видаляє рядок, а журнал дій памʼятає обидва кроки.
- ScoreEntry — бали вручну людині або гуртку: позиція зі списку або вільна сума з причиною.
- ScoreGroupMove — перехід людини між гуртками, щоб бали лишались за гуртком, де їх здобуто.
- ScoreTrailEvent — слід кожної зміни точкування зі знімком рядка; лише додається.
- PrivateScoreCriterion / PrivateScoreEntry — книга КВ: власні критерії й бали, які бачать лише Звʼязковий і впорядники; у таблицю не потрапляють.
Audit (журнал дій)
Section titled “Audit (журнал дій)”- KurinAuditEvent — хто, що й коли змінив у курені: курінь, час, виконавець (ключ, імʼя й роль
знімком), розділ (
AuditArea) і дія (AuditActions), про кого й про що (знімки імені, гуртка, підпису), зміни[{field, from, to, redacted}]. Без зовнішніх ключів; особисті поля — лише «змінено». Строк — 365 днів.
Infrastructure
Section titled “Infrastructure”- AppNotification — сповіщення користувача.
- WebPushSubscription — підписка браузера чи телефона на сповіщення.
- SystemSetting — системні налаштування (ключ-значення), зокрема id інсталяції для телеметрії
(
Telemetry__InstanceId).
Безпекові події (вхід, MFA, дії адміністратора, дев-перемикач) окремої таблиці не мають:
IActivityLogger пише їх структурованими трейсами в лог.