Перейти до вмісту

Каталог сутностей

Перелік доменних сутностей (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 — курінь (за числом). 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 — календар і задачі: події й задачі з призначенням «для кого» (курінь, гурток, провід, людина), категорією з власним кольором, повторами й відповідями «буду / не буду». Автор бачить те, що створив, навіть коли призначив іншим.
  • 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). Правило, яке не можна порахувати, при читанні відкидається.

  • 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. Передачу, яку курінний скарбник уже прийняв, теж не можна змінити чи видалити (409 TransferReceived, DuesEntryLock). Видаляється лише позначкою.
  • DuesEntryEvent — подія з операцією і її знімок після зміни; живе стільки ж, скільки операція.
  • KurinScoreSettings — як курінь рахує бали (ScoreAlgorithm); без рядка — середнє.
  • ScoreRule — скільки вартує автоматичне джерело (вмілість, точка проби, сплачений квартал, пересторога) з певної дати; нуль вимикає джерело.
  • ScoreAttendanceRate — скільки вартує присутність: на всіх подіях категорії або на одній події чи серії (вона важливіша).
  • ScoreItem — позиція зі списку куреня («однострій» +1, «запізнення» −1); на події дається людині лише раз.
  • ScoreStage — названий відрізок днів для окремого підсумку; балів не має, тож етапи можуть перекриватися.
  • ScoreAttendance — людина була на одному повторенні події. Одна відмітка на (членство, подія, повторення); зняття лишає рядок із позначкою.
  • ScoreNotHeldOccurrence — повторення події не відбулося («Сходин не було»): одне на (подія, повторення), хто й коли сказав. Прибирає подію зі «Справ» проводу; перша відмітка присутності чи «Повернути» видаляє рядок, а журнал дій памʼятає обидва кроки.
  • ScoreEntry — бали вручну людині або гуртку: позиція зі списку або вільна сума з причиною.
  • ScoreGroupMove — перехід людини між гуртками, щоб бали лишались за гуртком, де їх здобуто.
  • ScoreTrailEvent — слід кожної зміни точкування зі знімком рядка; лише додається.
  • PrivateScoreCriterion / PrivateScoreEntry — книга КВ: власні критерії й бали, які бачать лише Звʼязковий і впорядники; у таблицю не потрапляють.
  • KurinAuditEvent — хто, що й коли змінив у курені: курінь, час, виконавець (ключ, імʼя й роль знімком), розділ (AuditArea) і дія (AuditActions), про кого й про що (знімки імені, гуртка, підпису), зміни [{field, from, to, redacted}]. Без зовнішніх ключів; особисті поля — лише «змінено». Строк — 365 днів.
  • AppNotification — сповіщення користувача.
  • WebPushSubscription — підписка браузера чи телефона на сповіщення.
  • SystemSetting — системні налаштування (ключ-значення), зокрема id інсталяції для телеметрії (Telemetry__InstanceId).

Безпекові події (вхід, MFA, дії адміністратора, дев-перемикач) окремої таблиці не мають: IActivityLogger пише їх структурованими трейсами в лог.