Appearance
Структура даних Івентів - Документація
Огляд системи
D-Internal Portal містить комплексну систему управління освітніми подіями (курси, вебінари, події) з повним циклом від заявки до оплаченої реєстрації.
Основний потік даних:
- Event - створення події/курсу
- EventRequest - подача заявки користувачем
- Cart/CartItem - додавання до кошика
- Order/OrderItem - створення замовлення
- Payment/Transaction - оплата
- EventRegistration - підтверджена реєстрація
1. Основні моделі
Event (Івент/Курс)
Опис: Основна сутність для освітніх подій, курсів та вебінарів
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 123 | Так |
| title | CharField(255) | Назва події/курсу | "Граматика англійської мови для початківців" | Так |
| slug | SlugField | URL-дружній ідентифікатор | "gramatika-anglijskoyi-movi" | Так |
| entity | CharField(25) | Тип сутності: "course" (Курс), "event" (Подія) | "course" | Так |
| proteach | BooleanField | Курс ProTeach | false | Так |
| price | DecimalField(20,2) | Ціна за участь в грн | 850.00 | Так |
| sale_price | DecimalField(20,2) | Знижкова ціна | 680.00 | Ні |
| video_price | DecimalField(20,2) | Ціна за відео минулої події | 400.00 | Так |
| language | CharField(50) | Мова проведення | "Українська" | Ні |
| participation_type | CharField(25) | Тип участі: "online" (Онлайн), "offline" (Офлайн), "offline_online" (Змішаний) | "online" | Так |
| description | RichTextField | Детальний опис | HTML-контент | Ні |
| course_purpose | TextField | Мета курсу | "Вивчення основ граматики" | Ні |
| duration_lesson | PositiveSmallIntegerField | Тривалість уроку в хвилинах | 90 | Так |
| practical_hours | PositiveSmallIntegerField | Кількість практичних годин | 20 | Ні |
| selfeducation_hours | PositiveSmallIntegerField | Години самостійного вивчення | 10 | Ні |
| certificate_time | PositiveSmallIntegerField | Мін. час для сертифікату (хв) | 35 | Так |
| phone | CharField(16) | Контактний телефон | "+380501234567" | Ні |
| EmailField | Контактний email | "contact@example.com" | Ні | |
| speaker_email | EmailField | Email спікера | "speaker@example.com" | Ні |
| past | BooleanField | Чи завершена подія | false | Так |
| number_participants | PositiveSmallIntegerField | Кількість учасників | 45 | Так |
| number_registrants | PositiveSmallIntegerField | Кількість зареєстрованих | 120 | Так |
| registration_completed | BooleanField | Реєстрація завершена | false | Так |
| hide | BooleanField | Приховати подію | false | Так |
| is_active | BooleanField | Активна подія | true | Так |
| created_at | DateTimeField | Дата створення | "2024-01-15T10:30:00Z" | Так |
| updated_at | DateTimeField | Дата оновлення | "2024-01-16T15:45:00Z" | Так |
| ------------------ | ||||
| crm_record_id | CharField(255) | ID запису в CRM | "CRM-12345" | Ні |
| crm_sync_state | CharField(20) | Стан синхронізації: "pending" (Очікує), "in_progress" (Синхронізується), "synced" (Синхронізовано), "failed" (Помилка), "crm_updated" (Оновлено з CRM) | "synced" | Так |
| crm_sync_date | DateTimeField | Дата синхронізації | "2024-01-16T12:00:00Z" | Ні |
| ------------------ | ||||
| event_type_id | ForeignKey → EventType | Тип події | 3 | Ні |
| level_id | ForeignKey → EventLevel | Рівень складності | 1 | Ні |
| sector_id | ForeignKey → EducationalSector | Освітній сектор | 2 | Ні |
| budget_education_id | ForeignKey(BudgetEducation) | Бюджетна освіта | 1 | Ні |
| approbation_id | ForeignKey(File) | Файл апробації | 15 | Ні |
| speakers | ManyToManyField → EventSpeaker | Спікери події | [15, 23, 34] | Так |
| organizers | ManyToManyField → EventOrganizer | Організатори | [1, 4] | Ні |
| directions | ManyToManyField → EventDirection | Напрямки навчання | [7, 12] | Так |
EventRequest (Запит на івент)
Опис: Заявка користувача на участь в події
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 456 | Так |
| first_name | CharField(150) | Ім'я | "Олексій" | Так |
| last_name | CharField(150) | Прізвище | "Петренко" | Так |
| EmailField | Email адреса | "oleksiy@example.com" | Так | |
| phone | CharField(16) | Номер телефону | "+380501234567" | Так |
| settlement | CharField(150) | Місто | "Київ" | Ні |
| institution | CharField(255) | Навчальний заклад | "КНУ ім. Шевченка" | Ні |
| institution_type | CharField(50) | Тип закладу: "school" (ЗНЗ), "college" (ВНЗ), "teacher" (Приватний вчитель), "courses" (Курси) | "college" | Ні |
| status | CharField(25) | Статус заявки: "new" (Новий), "done" (Виконано), "cancelled" (Скасовано) | "new" | Так |
| registration_status | CharField(25) | Статус реєстрації: "pending" (Очікує), "approved" (Схвалено), "rejected" (Відхилено), "cancelled" (Скасовано) | "pending" | Так |
| created_at | DateTimeField | Дата створення | "2024-01-15T14:30:00Z" | Так |
| updated_at | DateTimeField | Дата оновлення | "2024-01-15T14:30:00Z" | Так |
| ------------------ | ||||
| user_id | ForeignKey(User) | Користувач системи | 789 | Ні |
| event_id | ForeignKey → Event | Подія | 123 | Ні |
| lesson_id | ForeignKey → Lesson | Конкретне заняття | 45 | Ні |
| area_id | ForeignKey(Area) | Область | 12 | Ні |
| ------------------ | ||||
| crm_sync_state | CharField(20) | Стан синхронізації: "pending" (Очікує), "in_progress" (Синхронізується), "synced" (Синхронізовано), "failed" (Помилка), "crm_updated" (Оновлено з CRM) | "pending" | Так |
| crm_sync_date | DateTimeField | Дата синхронізації | "2024-01-16T10:00:00Z" | Ні |
EventRegistration (Реєстрація на івент)
Опис: Підтверджена реєстрація користувача на подію (після оплати)
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 789 | Так |
| first_name | CharField(150) | Ім'я | "Олексій" | Так |
| last_name | CharField(150) | Прізвище | "Петренко" | Так |
| EmailField | Email адреса | "oleksiy@example.com" | Так | |
| phone | CharField(16) | Номер телефону | "+380501234567" | Так |
| settlement | CharField(150) | Місто | "Київ" | Ні |
| institution | CharField(255) | Навчальний заклад | "КНУ ім. Шевченка" | Ні |
| institution_type | CharField(50) | Тип закладу: "school" (ЗНЗ), "college" (ВНЗ), "teacher" (Приватний вчитель), "courses" (Курси) | "college" | Ні |
| join_url | URLField | Посилання для приєднання | "https://zoom.us/j/123456789" | Ні |
| external_id | CharField(255) | Зовнішній ID (Zoom) | "zoom_reg_12345" | Ні |
| pass_test | BooleanField | Здано тест для сертифікату | false | Так |
| created_at | DateTimeField | Дата створення | "2024-01-15T16:30:00Z" | Так |
| updated_at | DateTimeField | Дата оновлення | "2024-01-15T16:30:00Z" | Так |
| ------------------ | ||||
| event_request_id | OneToOneField → EventRequest | Пов'язана заявка | 456 | Ні |
| event_id | ForeignKey → Event | Подія | 123 | Ні |
| lesson_id | ForeignKey → Lesson | Конкретне заняття | 45 | Ні |
| user_id | ForeignKey(User) | Користувач системи | 789 | Ні |
| webinar_id | ForeignKey(Webinar) | Zoom вебінар | 67 | Ні |
| area_id | ForeignKey(Area) | Область | 12 | Ні |
| ------------------ | ||||
| crm_record_id | CharField(255) | ID запису в CRM | "CRM-REG-456" | Ні |
| crm_sync_state | CharField(20) | Стан синхронізації: "pending" (Очікує), "in_progress" (Синхронізується), "synced" (Синхронізовано), "failed" (Помилка), "crm_updated" (Оновлено з CRM) | "synced" | Так |
| crm_sync_date | DateTimeField | Дата синхронізації | "2024-01-16T12:30:00Z" | Ні |
2. Система оплати
Cart (Кошик)
Опис: Кошик покупок користувача
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| uuid | UUIDField | Унікальний ідентифікатор | "550e8400-e29b-41d4-a716-446655440000" | Так |
| status | CharField(10) | Статус кошика: "opened" (Відкритий), "closed" (Закритий) | "opened" | Так |
| session_key | CharField(255) | Ключ сесії | "abc123def456" | Ні |
| quantity | DecimalField(20,2) | Загальна кількість | 2.00 | Так |
| total_clear_price | DecimalField(20,2) | Загальна ціна без знижок | 1500.00 | Так |
| total_promocode_diff | DecimalField(20,2) | Знижка по промокоду | 150.00 | Так |
| total_price | DecimalField(20,2) | Загальна ціна | 1350.00 | Так |
| parameters | JSONField | Додаткові параметри | Так | |
| created_at | DateTimeField | Дата створення | "2024-01-15T12:00:00Z" | Так |
| updated_at | DateTimeField | Дата оновлення | "2024-01-15T12:30:00Z" | Так |
| ------------------ | ||||
| user_id | ForeignKey(User) | Користувач | 789 | Ні |
| promocode_id | ForeignKey(Promocode) | Активований промокод | 12 | Ні |
CartItem (Елемент кошика)
Опис: Товар в кошику користувача
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 234 | Так |
| content_type_id | ForeignKey(ContentType) | Тип об'єкта | 15 | Так |
| object_id | CharField(255) | ID об'єкта | "123" | Так |
| price | DecimalField(20,2) | Ціна товару | 850.00 | Так |
| clear_price | DecimalField(20,2) | Ціна без знижки | 1000.00 | Так |
| promocode_diff | DecimalField(20,2) | Знижка по промокоду | 150.00 | Так |
| quantity | DecimalField(20,2) | Кількість | 1.00 | Так |
| parameters | JSONField | Додаткові параметри | Так | |
| created_at | DateTimeField | Дата створення | "2024-01-15T12:00:00Z" | Так |
| ------------------ | ||||
| period_id | ForeignKey(Lesson) | Період події | 45 | Ні |
| promocode_id | ForeignKey(Promocode) | Промокод | 12 | Ні |
Order (Замовлення)
Опис: Створене замовлення з кошика
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| uuid | UUIDField | Унікальний ідентифікатор | "550e8400-e29b-41d4-a716-446655440001" | Так |
| public_identifier | CharField(255) | Публічний номер | "OR-150124-001" | Ні |
| first_name | CharField(150) | Ім'я замовника | "Олексій" | Так |
| last_name | CharField(150) | Прізвище замовника | "Петренко" | Так |
| EmailField | Email замовника | "oleksiy@example.com" | Так | |
| phone | CharField(16) | Телефон замовника | "+380501234567" | Так |
| settlement | CharField(150) | Місто | "Київ" | Ні |
| institution | CharField(255) | Навчальний заклад | "КНУ ім. Шевченка" | Ні |
| institution_type | CharField(50) | Тип закладу: "school" (ЗНЗ), "college" (ВНЗ), "teacher" (Приватний вчитель), "courses" (Курси) | "college" | Ні |
| company_name | CharField(150) | Назва компанії | "ТОВ Освіта" | Ні |
| tax_code | CharField(20) | Податковий код | "12345678" | Ні |
| total_price | DecimalField(20,2) | Загальна сума | 1350.00 | Так |
| total_clear_price | DecimalField(20,2) | Сума без знижок | 1500.00 | Так |
| total_promocode_diff | DecimalField(20,2) | Знижка по промокоду | 150.00 | Так |
| status | CharField(50) | Статус замовлення: "new" (Новий), "confirmed" (Підтверджений), "completed" (Завершений), "canceled" (Скасований) | "new" | Так |
| payment_status | CharField(50) | Статус оплати: "not_paid" (Не оплачений), "paid" (Оплачений), "error" (Помилка оплати) | "not_paid" | Так |
| created_at | DateTimeField | Дата створення | "2024-01-15T13:00:00Z" | Так |
| updated_at | DateTimeField | Дата оновлення | "2024-01-15T13:30:00Z" | Так |
| ------------------ | ||||
| cart_id | ForeignKey(Cart) | Кошик | "550e8400-e29b-41d4-a716-446655440000" | Ні |
| user_id | ForeignKey(User) | Користувач | 789 | Ні |
| promocode_id | ForeignKey(Promocode) | Промокод | 12 | Ні |
| payment_gateway_id | ForeignKey(PaymentGateway) | Платіжний шлюз | 3 | Ні |
| area_id | ForeignKey(Area) | Область | 12 | Ні |
| ------------------ | ||||
| crm_record_id | CharField(255) | ID запису в CRM | "CRM-ORDER-234" | Ні |
| crm_sync_state | CharField(20) | Стан синхронізації: "pending" (Очікує), "in_progress" (Синхронізується), "synced" (Синхронізовано), "failed" (Помилка), "crm_updated" (Оновлено з CRM) | "pending" | Так |
| crm_sync_date | DateTimeField | Дата синхронізації | "2024-01-16T14:00:00Z" | Ні |
OrderItem (Елемент замовлення)
Опис: Товар в замовленні
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 345 | Так |
| title | CharField(255) | Назва товару | "Граматика англійської мови" | Так |
| content_type_id | ForeignKey(ContentType) | Тип об'єкта | 15 | Так |
| object_id | CharField(255) | ID об'єкта | "123" | Так |
| quantity | PositiveIntegerField | Кількість | 1 | Так |
| price | DecimalField(20,2) | Ціна товару | 850.00 | Так |
| clear_price | DecimalField(20,2) | Ціна без знижки | 1000.00 | Так |
| promocode_diff | DecimalField(20,2) | Знижка по промокоду | 150.00 | Так |
| parameters | JSONField | Додаткові параметри | Так | |
| created_at | DateTimeField | Дата створення | "2024-01-15T13:00:00Z" | Так |
| ------------------ | ||||
| order_id | ForeignKey → Order | Замовлення | "550e8400-e29b-41d4-a716-446655440001" | Так |
| period_id | ForeignKey → Lesson | Період події | 45 | Ні |
| promocode_id | ForeignKey → Promocode | Промокод | 12 | Ні |
| event_request_id | ForeignKey → EventRequest | Пов'язана заявка | 456 | Ні |
Payment (Платіж)
Опис: Платіжна транзакція
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| uuid | UUIDField | Унікальний ідентифікатор | "550e8400-e29b-41d4-a716-446655440002" | Так |
| status | CharField(25) | Статус платежу: "waiting_for_payment" (Очікує оплати), "paid" (Оплачений), "canceled" (Скасований), "error" (Помилка) | "paid" | Так |
| currency | CharField(3) | Валюта | "UAH" | Так |
| amount | DecimalField(10,2) | Сума до оплати | 1350.00 | Так |
| captured_amount | DecimalField(10,2) | Отримана сума | 1350.00 | Так |
| paid_at | DateTimeField | Дата оплати | "2024-01-15T13:45:00Z" | Ні |
| message | TextField | Повідомлення | "Оплата успішна" | Ні |
| created_at | DateTimeField | Дата створення | "2024-01-15T13:30:00Z" | Так |
| updated_at | DateTimeField | Дата оновлення | "2024-01-15T13:45:00Z" | Так |
| ------------------ | ||||
| order_id | ForeignKey → Order | Замовлення | "550e8400-e29b-41d4-a716-446655440001" | Ні |
| user_id | ForeignKey → User | Користувач | 789 | Ні |
| gateway_id | ForeignKey → PaymentGateway | Платіжний шлюз | 3 | Ні |
Transaction (Транзакція)
Опис: Операція з платіжним шлюзом
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 567 | Так |
| token | CharField(128) | Зовнішній ID | "liqpay_12345" | Ні |
| customer_id | CharField(256) | ID клієнта | "customer_789" | Ні |
| is_success | BooleanField | Успішна транзакція | true | Так |
| amount | DecimalField(10,2) | Сума транзакції | 1350.00 | Так |
| currency | CharField(3) | Валюта | "UAH" | Так |
| error | TextField | Опис помилки | "" | Ні |
| gateway_response | JSONField | Відповідь шлюзу | Так | |
| created_at | DateTimeField | Дата створення | "2024-01-15T13:45:00Z" | Так |
| ------------------ | ||||
| payment_id | ForeignKey → Payment | Платіж | "550e8400-e29b-41d4-a716-446655440002" | Так |
3. Довідникові моделі
EventType (Тип події)
Опис: Довідник типів освітніх подій
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 3 | Так |
| name | CharField(255) | Назва типу | "Курс підвищення кваліфікації" | Так |
| slug | SlugField | URL-дружній ідентифікатор | "kurs-pidvyshchennya-kvalifikatsiyi" | Так |
| my_order | PositiveIntegerField | Порядок сортування | 10 | Так |
EventLevel (Рівень складності)
Опис: Довідник рівнів складності подій
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 1 | Так |
| name | CharField(255) | Назва рівня | "Початковий" | Так |
| color | CharField(20) | Колір для відображення | "#4CAF50" | Так |
EventDirection (Напрямок навчання)
Опис: Довідник напрямків освітніх програм
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 7 | Так |
| name | CharField(255) | Назва напрямку | "Англійська мова" | Так |
| slug | SlugField | URL-дружній ідентифікатор | "anglijska-mova" | Так |
| my_order | PositiveIntegerField | Порядок сортування | 5 | Так |
EducationalSector (Освітній сектор)
Опис: Довідник освітніх секторів
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 2 | Так |
| name | CharField(255) | Назва сектору | "Загальна середня освіта" | Так |
| slug | SlugField | URL-дружній ідентифікатор | "zagalna-serednya-osvita" | Так |
| my_order | PositiveIntegerField | Порядок сортування | 3 | Так |
EventSpeaker (Спікер)
Опис: Довідник спікерів та викладачів
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 15 | Так |
| full_name | CharField(255) | Повне ім'я | "Марія Коваленко" | Так |
| slug | SlugField | URL-дружній ідентифікатор | "mariya-kovalenko" | Так |
| job_title | CharField(255) | Посада | "Кандидат педагогічних наук" | Так |
| CharField(255) | Email для Zoom | "maria@example.com" | Так | |
| legal_entity | CharField(255) | Юридична особа | "ТОВ Освіта Плюс" | Ні |
| quote | TextField | Цитата спікера | "Освіта - це ключ до успіху" | Ні |
| display_on_proteach | BooleanField | Показувати на сторінці ProTeach | false | Так |
| my_order | PositiveIntegerField | Порядок сортування | 1 | Так |
EventOrganizer (Організатор)
Опис: Довідник організаторів подій
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 1 | Так |
| name | CharField(255) | Назва організатора | "D-Internal Academy" | Так |
| my_order | PositiveIntegerField | Порядок сортування | 1 | Так |
Promocode (Промокод)
Опис: Система промокодів для знижок
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 12 | Так |
| code | CharField(64) | Код промокоду | "SPRING2024" | Так |
| type_discount | CharField(50) | Тип знижки: "percent" (Відсоток), "fixed" (Фіксована сума) | "percent" | Так |
| percent | PositiveSmallIntegerField | Відсоток знижки | 15 | Так |
| fixed_discount | PositiveIntegerField | Фіксована знижка | 0 | Так |
| limit_count | PositiveIntegerField | Максимальна кількість використань | 100 | Так |
| current_use | PositiveIntegerField | Поточна кількість використань | 23 | Так |
| start_at | DateTimeField | Дата початку дії | "2024-03-01T00:00:00Z" | Так |
| end_at | DateTimeField | Дата закінчення дії | "2024-05-31T23:59:59Z" | Так |
| is_active | BooleanField | Активний промокод | true | Так |
| more_one | SmallIntegerField | Мінімальна кількість товарів | 1 | Так |
| for_all_cart | BooleanField | Застосовувати до всього кошика | false | Так |
| use_for_all_tests | BooleanField | Для всіх тестів/екзаменів | false | Так |
Many-to-Many поля:
| Поле | Тип | Опис | Приклад |
|---|---|---|---|
| educational_sectors | ManyToManyField(EducationalSector) | Сектори освіти | [1, 2, 3] |
| events | ManyToManyField(Event) | Конкретні події | [123, 456] |
| exams | ManyToManyField(ExamProduct) | Конкретні екзамени | [78, 90] |
4. Допоміжні моделі
Lesson (Заняття)
Опис: Конкретні заняття в рамках події
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 45 | Так |
| start_date | DateField | Дата початку | "2024-02-15" | Так |
| start_time | TimeField | Час початку | "14:00:00" | Так |
| task_id | CharField(255) | ID завдання | "celery_task_123" | Ні |
| number_registrants | PositiveSmallIntegerField | Кількість зареєстрованих | 35 | Так |
| event_id | ForeignKey → Event | Подія | 123 | Так |
EventInclude (Що включає подія)
Опис: Список того, що включає в себе подія
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 67 | Так |
| title | CharField(255) | Заголовок | "Сертифікат про проходження" | Так |
| description | CharField(255) | Опис | "Офіційний сертифікат державного зразка" | Так |
| my_order | PositiveIntegerField | Порядок відображення | 1 | Так |
| event_id | ForeignKey → Event | Подія | 123 | Так |
EventAdvantage (Переваги події)
Опис: Переваги участі в події
| Поле | Тип | Опис | Приклад | Обов'язкове |
|---|---|---|---|---|
| id | AutoField | Унікальний ідентифікатор | 89 | Так |
| title | CharField(255) | Заголовок | "Практичні навички" | Так |
| description | CharField(255) | Опис | "Отримаєте практичні навички викладання" | Так |
| my_order | PositiveIntegerField | Порядок відображення | 2 | Так |
| event_id | ForeignKey → Event | Подія | 123 | Так |
5. Схема зв'язків
Потік реєстрації та оплати:
- Event ← створюється подія
- EventRequest ← користувач подає заявку
- Cart/CartItem ← додавання до кошика
- Order/OrderItem ← створення замовлення
- Payment/Transaction ← процес оплати
- EventRegistration ← підтверджена реєстрація
Основні зв'язки:
Event→EventRequest(один до багатьох)Event→EventRegistration(один до багатьох)EventRequest→EventRegistration(один до одного)Event→CartItem(через GenericForeignKey)Cart→Order(один до багатьох)Order→Payment(один до багатьох)Payment→Transaction(один до багатьох)
CRM інтеграція:
Всі основні моделі (Event, EventRequest, EventRegistration, Order) мають поля для синхронізації з CRM:
crm_record_id- ID запису в CRMcrm_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"