Skip to content

Структура даних Івентів - Документація

Огляд системи

D-Internal Portal містить комплексну систему управління освітніми подіями (курси, вебінари, події) з повним циклом від заявки до оплаченої реєстрації.

Основний потік даних:

  1. Event - створення події/курсу
  2. EventRequest - подача заявки користувачем
  3. Cart/CartItem - додавання до кошика
  4. Order/OrderItem - створення замовлення
  5. Payment/Transaction - оплата
  6. EventRegistration - підтверджена реєстрація

1. Основні моделі

Event (Івент/Курс)

Опис: Основна сутність для освітніх подій, курсів та вебінарів

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор123Так
titleCharField(255)Назва події/курсу"Граматика англійської мови для початківців"Так
slugSlugFieldURL-дружній ідентифікатор"gramatika-anglijskoyi-movi"Так
entityCharField(25)Тип сутності:
"course" (Курс),
"event" (Подія)
"course"Так
proteachBooleanFieldКурс ProTeachfalseТак
priceDecimalField(20,2)Ціна за участь в грн850.00Так
sale_priceDecimalField(20,2)Знижкова ціна680.00Ні
video_priceDecimalField(20,2)Ціна за відео минулої події400.00Так
languageCharField(50)Мова проведення"Українська"Ні
participation_typeCharField(25)Тип участі:
"online" (Онлайн),
"offline" (Офлайн),
"offline_online" (Змішаний)
"online"Так
descriptionRichTextFieldДетальний описHTML-контентНі
course_purposeTextFieldМета курсу"Вивчення основ граматики"Ні
duration_lessonPositiveSmallIntegerFieldТривалість уроку в хвилинах90Так
practical_hoursPositiveSmallIntegerFieldКількість практичних годин20Ні
selfeducation_hoursPositiveSmallIntegerFieldГодини самостійного вивчення10Ні
certificate_timePositiveSmallIntegerFieldМін. час для сертифікату (хв)35Так
phoneCharField(16)Контактний телефон"+380501234567"Ні
emailEmailFieldКонтактний email"contact@example.com"Ні
speaker_emailEmailFieldEmail спікера"speaker@example.com"Ні
pastBooleanFieldЧи завершена подіяfalseТак
number_participantsPositiveSmallIntegerFieldКількість учасників45Так
number_registrantsPositiveSmallIntegerFieldКількість зареєстрованих120Так
registration_completedBooleanFieldРеєстрація завершенаfalseТак
hideBooleanFieldПриховати подіюfalseТак
is_activeBooleanFieldАктивна подіяtrueТак
created_atDateTimeFieldДата створення"2024-01-15T10:30:00Z"Так
updated_atDateTimeFieldДата оновлення"2024-01-16T15:45:00Z"Так
------------------
crm_record_idCharField(255)ID запису в CRM"CRM-12345"Ні
crm_sync_stateCharField(20)Стан синхронізації:
"pending" (Очікує),
"in_progress" (Синхронізується),
"synced" (Синхронізовано),
"failed" (Помилка),
"crm_updated" (Оновлено з CRM)
"synced"Так
crm_sync_dateDateTimeFieldДата синхронізації"2024-01-16T12:00:00Z"Ні
------------------
event_type_idForeignKey → EventTypeТип події3Ні
level_idForeignKey → EventLevelРівень складності1Ні
sector_idForeignKey → EducationalSectorОсвітній сектор2Ні
budget_education_idForeignKey(BudgetEducation)Бюджетна освіта1Ні
approbation_idForeignKey(File)Файл апробації15Ні
speakersManyToManyField → EventSpeakerСпікери події[15, 23, 34]Так
organizersManyToManyField → EventOrganizerОрганізатори[1, 4]Ні
directionsManyToManyField → EventDirectionНапрямки навчання[7, 12]Так

EventRequest (Запит на івент)

Опис: Заявка користувача на участь в події

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор456Так
first_nameCharField(150)Ім'я"Олексій"Так
last_nameCharField(150)Прізвище"Петренко"Так
emailEmailFieldEmail адреса"oleksiy@example.com"Так
phoneCharField(16)Номер телефону"+380501234567"Так
settlementCharField(150)Місто"Київ"Ні
institutionCharField(255)Навчальний заклад"КНУ ім. Шевченка"Ні
institution_typeCharField(50)Тип закладу:
"school" (ЗНЗ),
"college" (ВНЗ),
"teacher" (Приватний вчитель),
"courses" (Курси)
"college"Ні
statusCharField(25)Статус заявки:
"new" (Новий),
"done" (Виконано),
"cancelled" (Скасовано)
"new"Так
registration_statusCharField(25)Статус реєстрації:
"pending" (Очікує),
"approved" (Схвалено),
"rejected" (Відхилено),
"cancelled" (Скасовано)
"pending"Так
created_atDateTimeFieldДата створення"2024-01-15T14:30:00Z"Так
updated_atDateTimeFieldДата оновлення"2024-01-15T14:30:00Z"Так
------------------
user_idForeignKey(User)Користувач системи789Ні
event_idForeignKey → EventПодія123Ні
lesson_idForeignKey → LessonКонкретне заняття45Ні
area_idForeignKey(Area)Область12Ні
------------------
crm_sync_stateCharField(20)Стан синхронізації:
"pending" (Очікує),
"in_progress" (Синхронізується),
"synced" (Синхронізовано),
"failed" (Помилка),
"crm_updated" (Оновлено з CRM)
"pending"Так
crm_sync_dateDateTimeFieldДата синхронізації"2024-01-16T10:00:00Z"Ні

EventRegistration (Реєстрація на івент)

Опис: Підтверджена реєстрація користувача на подію (після оплати)

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор789Так
first_nameCharField(150)Ім'я"Олексій"Так
last_nameCharField(150)Прізвище"Петренко"Так
emailEmailFieldEmail адреса"oleksiy@example.com"Так
phoneCharField(16)Номер телефону"+380501234567"Так
settlementCharField(150)Місто"Київ"Ні
institutionCharField(255)Навчальний заклад"КНУ ім. Шевченка"Ні
institution_typeCharField(50)Тип закладу:
"school" (ЗНЗ),
"college" (ВНЗ),
"teacher" (Приватний вчитель),
"courses" (Курси)
"college"Ні
join_urlURLFieldПосилання для приєднання"https://zoom.us/j/123456789"Ні
external_idCharField(255)Зовнішній ID (Zoom)"zoom_reg_12345"Ні
pass_testBooleanFieldЗдано тест для сертифікатуfalseТак
created_atDateTimeFieldДата створення"2024-01-15T16:30:00Z"Так
updated_atDateTimeFieldДата оновлення"2024-01-15T16:30:00Z"Так
------------------
event_request_idOneToOneField → EventRequestПов'язана заявка456Ні
event_idForeignKey → EventПодія123Ні
lesson_idForeignKey → LessonКонкретне заняття45Ні
user_idForeignKey(User)Користувач системи789Ні
webinar_idForeignKey(Webinar)Zoom вебінар67Ні
area_idForeignKey(Area)Область12Ні
------------------
crm_record_idCharField(255)ID запису в CRM"CRM-REG-456"Ні
crm_sync_stateCharField(20)Стан синхронізації:
"pending" (Очікує),
"in_progress" (Синхронізується),
"synced" (Синхронізовано),
"failed" (Помилка),
"crm_updated" (Оновлено з CRM)
"synced"Так
crm_sync_dateDateTimeFieldДата синхронізації"2024-01-16T12:30:00Z"Ні

2. Система оплати

Cart (Кошик)

Опис: Кошик покупок користувача

ПолеТипОписПрикладОбов'язкове
uuidUUIDFieldУнікальний ідентифікатор"550e8400-e29b-41d4-a716-446655440000"Так
statusCharField(10)Статус кошика:
"opened" (Відкритий),
"closed" (Закритий)
"opened"Так
session_keyCharField(255)Ключ сесії"abc123def456"Ні
quantityDecimalField(20,2)Загальна кількість2.00Так
total_clear_priceDecimalField(20,2)Загальна ціна без знижок1500.00Так
total_promocode_diffDecimalField(20,2)Знижка по промокоду150.00Так
total_priceDecimalField(20,2)Загальна ціна1350.00Так
parametersJSONFieldДодаткові параметриТак
created_atDateTimeFieldДата створення"2024-01-15T12:00:00Z"Так
updated_atDateTimeFieldДата оновлення"2024-01-15T12:30:00Z"Так
------------------
user_idForeignKey(User)Користувач789Ні
promocode_idForeignKey(Promocode)Активований промокод12Ні

CartItem (Елемент кошика)

Опис: Товар в кошику користувача

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор234Так
content_type_idForeignKey(ContentType)Тип об'єкта15Так
object_idCharField(255)ID об'єкта"123"Так
priceDecimalField(20,2)Ціна товару850.00Так
clear_priceDecimalField(20,2)Ціна без знижки1000.00Так
promocode_diffDecimalField(20,2)Знижка по промокоду150.00Так
quantityDecimalField(20,2)Кількість1.00Так
parametersJSONFieldДодаткові параметриТак
created_atDateTimeFieldДата створення"2024-01-15T12:00:00Z"Так
------------------
period_idForeignKey(Lesson)Період події45Ні
promocode_idForeignKey(Promocode)Промокод12Ні

Order (Замовлення)

Опис: Створене замовлення з кошика

ПолеТипОписПрикладОбов'язкове
uuidUUIDFieldУнікальний ідентифікатор"550e8400-e29b-41d4-a716-446655440001"Так
public_identifierCharField(255)Публічний номер"OR-150124-001"Ні
first_nameCharField(150)Ім'я замовника"Олексій"Так
last_nameCharField(150)Прізвище замовника"Петренко"Так
emailEmailFieldEmail замовника"oleksiy@example.com"Так
phoneCharField(16)Телефон замовника"+380501234567"Так
settlementCharField(150)Місто"Київ"Ні
institutionCharField(255)Навчальний заклад"КНУ ім. Шевченка"Ні
institution_typeCharField(50)Тип закладу:
"school" (ЗНЗ),
"college" (ВНЗ),
"teacher" (Приватний вчитель),
"courses" (Курси)
"college"Ні
company_nameCharField(150)Назва компанії"ТОВ Освіта"Ні
tax_codeCharField(20)Податковий код"12345678"Ні
total_priceDecimalField(20,2)Загальна сума1350.00Так
total_clear_priceDecimalField(20,2)Сума без знижок1500.00Так
total_promocode_diffDecimalField(20,2)Знижка по промокоду150.00Так
statusCharField(50)Статус замовлення:
"new" (Новий),
"confirmed" (Підтверджений),
"completed" (Завершений),
"canceled" (Скасований)
"new"Так
payment_statusCharField(50)Статус оплати:
"not_paid" (Не оплачений),
"paid" (Оплачений),
"error" (Помилка оплати)
"not_paid"Так
created_atDateTimeFieldДата створення"2024-01-15T13:00:00Z"Так
updated_atDateTimeFieldДата оновлення"2024-01-15T13:30:00Z"Так
------------------
cart_idForeignKey(Cart)Кошик"550e8400-e29b-41d4-a716-446655440000"Ні
user_idForeignKey(User)Користувач789Ні
promocode_idForeignKey(Promocode)Промокод12Ні
payment_gateway_idForeignKey(PaymentGateway)Платіжний шлюз3Ні
area_idForeignKey(Area)Область12Ні
------------------
crm_record_idCharField(255)ID запису в CRM"CRM-ORDER-234"Ні
crm_sync_stateCharField(20)Стан синхронізації:
"pending" (Очікує),
"in_progress" (Синхронізується),
"synced" (Синхронізовано),
"failed" (Помилка),
"crm_updated" (Оновлено з CRM)
"pending"Так
crm_sync_dateDateTimeFieldДата синхронізації"2024-01-16T14:00:00Z"Ні

OrderItem (Елемент замовлення)

Опис: Товар в замовленні

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор345Так
titleCharField(255)Назва товару"Граматика англійської мови"Так
content_type_idForeignKey(ContentType)Тип об'єкта15Так
object_idCharField(255)ID об'єкта"123"Так
quantityPositiveIntegerFieldКількість1Так
priceDecimalField(20,2)Ціна товару850.00Так
clear_priceDecimalField(20,2)Ціна без знижки1000.00Так
promocode_diffDecimalField(20,2)Знижка по промокоду150.00Так
parametersJSONFieldДодаткові параметриТак
created_atDateTimeFieldДата створення"2024-01-15T13:00:00Z"Так
------------------
order_idForeignKey → OrderЗамовлення"550e8400-e29b-41d4-a716-446655440001"Так
period_idForeignKey → LessonПеріод події45Ні
promocode_idForeignKey → PromocodeПромокод12Ні
event_request_idForeignKey → EventRequestПов'язана заявка456Ні

Payment (Платіж)

Опис: Платіжна транзакція

ПолеТипОписПрикладОбов'язкове
uuidUUIDFieldУнікальний ідентифікатор"550e8400-e29b-41d4-a716-446655440002"Так
statusCharField(25)Статус платежу:
"waiting_for_payment" (Очікує оплати),
"paid" (Оплачений),
"canceled" (Скасований),
"error" (Помилка)
"paid"Так
currencyCharField(3)Валюта"UAH"Так
amountDecimalField(10,2)Сума до оплати1350.00Так
captured_amountDecimalField(10,2)Отримана сума1350.00Так
paid_atDateTimeFieldДата оплати"2024-01-15T13:45:00Z"Ні
messageTextFieldПовідомлення"Оплата успішна"Ні
created_atDateTimeFieldДата створення"2024-01-15T13:30:00Z"Так
updated_atDateTimeFieldДата оновлення"2024-01-15T13:45:00Z"Так
------------------
order_idForeignKey → OrderЗамовлення"550e8400-e29b-41d4-a716-446655440001"Ні
user_idForeignKey → UserКористувач789Ні
gateway_idForeignKey → PaymentGatewayПлатіжний шлюз3Ні

Transaction (Транзакція)

Опис: Операція з платіжним шлюзом

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор567Так
tokenCharField(128)Зовнішній ID"liqpay_12345"Ні
customer_idCharField(256)ID клієнта"customer_789"Ні
is_successBooleanFieldУспішна транзакціяtrueТак
amountDecimalField(10,2)Сума транзакції1350.00Так
currencyCharField(3)Валюта"UAH"Так
errorTextFieldОпис помилки""Ні
gateway_responseJSONFieldВідповідь шлюзуТак
created_atDateTimeFieldДата створення"2024-01-15T13:45:00Z"Так
------------------
payment_idForeignKey → PaymentПлатіж"550e8400-e29b-41d4-a716-446655440002"Так

3. Довідникові моделі

EventType (Тип події)

Опис: Довідник типів освітніх подій

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор3Так
nameCharField(255)Назва типу"Курс підвищення кваліфікації"Так
slugSlugFieldURL-дружній ідентифікатор"kurs-pidvyshchennya-kvalifikatsiyi"Так
my_orderPositiveIntegerFieldПорядок сортування10Так

EventLevel (Рівень складності)

Опис: Довідник рівнів складності подій

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор1Так
nameCharField(255)Назва рівня"Початковий"Так
colorCharField(20)Колір для відображення"#4CAF50"Так

EventDirection (Напрямок навчання)

Опис: Довідник напрямків освітніх програм

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор7Так
nameCharField(255)Назва напрямку"Англійська мова"Так
slugSlugFieldURL-дружній ідентифікатор"anglijska-mova"Так
my_orderPositiveIntegerFieldПорядок сортування5Так

EducationalSector (Освітній сектор)

Опис: Довідник освітніх секторів

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор2Так
nameCharField(255)Назва сектору"Загальна середня освіта"Так
slugSlugFieldURL-дружній ідентифікатор"zagalna-serednya-osvita"Так
my_orderPositiveIntegerFieldПорядок сортування3Так

EventSpeaker (Спікер)

Опис: Довідник спікерів та викладачів

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор15Так
full_nameCharField(255)Повне ім'я"Марія Коваленко"Так
slugSlugFieldURL-дружній ідентифікатор"mariya-kovalenko"Так
job_titleCharField(255)Посада"Кандидат педагогічних наук"Так
emailCharField(255)Email для Zoom"maria@example.com"Так
legal_entityCharField(255)Юридична особа"ТОВ Освіта Плюс"Ні
quoteTextFieldЦитата спікера"Освіта - це ключ до успіху"Ні
display_on_proteachBooleanFieldПоказувати на сторінці ProTeachfalseТак
my_orderPositiveIntegerFieldПорядок сортування1Так

EventOrganizer (Організатор)

Опис: Довідник організаторів подій

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор1Так
nameCharField(255)Назва організатора"D-Internal Academy"Так
my_orderPositiveIntegerFieldПорядок сортування1Так

Promocode (Промокод)

Опис: Система промокодів для знижок

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор12Так
codeCharField(64)Код промокоду"SPRING2024"Так
type_discountCharField(50)Тип знижки:
"percent" (Відсоток),
"fixed" (Фіксована сума)
"percent"Так
percentPositiveSmallIntegerFieldВідсоток знижки15Так
fixed_discountPositiveIntegerFieldФіксована знижка0Так
limit_countPositiveIntegerFieldМаксимальна кількість використань100Так
current_usePositiveIntegerFieldПоточна кількість використань23Так
start_atDateTimeFieldДата початку дії"2024-03-01T00:00:00Z"Так
end_atDateTimeFieldДата закінчення дії"2024-05-31T23:59:59Z"Так
is_activeBooleanFieldАктивний промокодtrueТак
more_oneSmallIntegerFieldМінімальна кількість товарів1Так
for_all_cartBooleanFieldЗастосовувати до всього кошикаfalseТак
use_for_all_testsBooleanFieldДля всіх тестів/екзаменівfalseТак

Many-to-Many поля:

ПолеТипОписПриклад
educational_sectorsManyToManyField(EducationalSector)Сектори освіти[1, 2, 3]
eventsManyToManyField(Event)Конкретні події[123, 456]
examsManyToManyField(ExamProduct)Конкретні екзамени[78, 90]

4. Допоміжні моделі

Lesson (Заняття)

Опис: Конкретні заняття в рамках події

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор45Так
start_dateDateFieldДата початку"2024-02-15"Так
start_timeTimeFieldЧас початку"14:00:00"Так
task_idCharField(255)ID завдання"celery_task_123"Ні
number_registrantsPositiveSmallIntegerFieldКількість зареєстрованих35Так
event_idForeignKey → EventПодія123Так

EventInclude (Що включає подія)

Опис: Список того, що включає в себе подія

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор67Так
titleCharField(255)Заголовок"Сертифікат про проходження"Так
descriptionCharField(255)Опис"Офіційний сертифікат державного зразка"Так
my_orderPositiveIntegerFieldПорядок відображення1Так
event_idForeignKey → EventПодія123Так

EventAdvantage (Переваги події)

Опис: Переваги участі в події

ПолеТипОписПрикладОбов'язкове
idAutoFieldУнікальний ідентифікатор89Так
titleCharField(255)Заголовок"Практичні навички"Так
descriptionCharField(255)Опис"Отримаєте практичні навички викладання"Так
my_orderPositiveIntegerFieldПорядок відображення2Так
event_idForeignKey → EventПодія123Так

5. Схема зв'язків

Потік реєстрації та оплати:

  1. Event ← створюється подія
  2. EventRequest ← користувач подає заявку
  3. Cart/CartItem ← додавання до кошика
  4. Order/OrderItem ← створення замовлення
  5. Payment/Transaction ← процес оплати
  6. EventRegistration ← підтверджена реєстрація

Основні зв'язки:

  • EventEventRequest (один до багатьох)
  • EventEventRegistration (один до багатьох)
  • EventRequestEventRegistration (один до одного)
  • EventCartItem (через GenericForeignKey)
  • CartOrder (один до багатьох)
  • OrderPayment (один до багатьох)
  • PaymentTransaction (один до багатьох)

CRM інтеграція:

Всі основні моделі (Event, EventRequest, EventRegistration, Order) мають поля для синхронізації з CRM:

  • crm_record_id - ID запису в CRM
  • crm_sync_state - стан синхронізації
  • crm_sync_date - дата останньої синхронізації

6. Приклади даних

Приклад повного циклу:

Event #123: "Граматика англійської мови для початківців"
├── EventRequest #456: Олексій Петренко подав заявку
├── CartItem: Додано до кошика
├── Order #OR-150124-001: Створено замовлення на 850 грн
├── Payment: Оплачено через LiqPay
└── EventRegistration #789: Підтверджена реєстрація з join_url

CRM синхронізація:
├── Event: crm_record_id="CRM-12345", crm_sync_state="synced"
├── EventRequest: crm_sync_state="synced" 
├── Order: crm_record_id="CRM-ORDER-234", crm_sync_state="synced"
└── EventRegistration: crm_record_id="CRM-REG-456", crm_sync_state="synced"