Глубокий анализ проекта Bridge CRM
🏗️ Общая архитектура проекта
Принцип построения
Проект использует модульную архитектуру Django с четким разделением ответственности:
bridge_crm_django/
├── core/ # Базовые классы (BaseModel, BaseTimestampedModel)
├── common/ # Справочники (Currency, Kato, SubjectType)
├── accounts/ # Пользователи и профили (UserProfile, роли)
├── announces/ # Объявления о тендерах (Announce, AnnounceLot)
├── deals/ # 🎯 ЦЕНТРАЛЬНАЯ СУЩНОСТЬ - Сделки
├── customers/ # Заказчики (Interest, Order)
├── suppliers/ # Поставщики (Product, Offer)
├── operators_kz/ # Оператор Казахстан
├── operators_cn/ # Оператор Китай
├── carriers/ # Перевозчики
├── customs/ # Таможня
├── integrations/ # Внешние API (read-only)
└── tenders/ # Панель управления (legacy)
Ключевые принципы
- Deal-центричная архитектура - все бизнес-процессы вращаются вокруг модели
Deal - Один лот = одна сделка - строгое правило системы
- State Machine - управление жизненным циклом через конечный автомат
- Разделение ответственности - каждая роль имеет свой модуль
🔄 Архитектура бизнес-процессов
Жизненный цикл сделки (Deal)
Сделка проходит через 7 уровней с тремя параллельными статусами:
Уровень 1: Интерес (Interest)
- Заказчик проявляет интерес к лоту
- Ещё не обязательство, только намерение
- Модель:
customers.Interest
Уровень 2: Коммерческое предложение (Offer)
- Поставщик создаёт коммерческое предложение
- Юридически значимый документ
- Модель:
suppliers.Offer
Уровень 3: Заказ (Order)
- Заказчик создаёт заказ на основе лота
- При создании автоматически создаётся
Deal - Модель:
customers.Order
Уровень 4: Финансовый статус (Financial Status)
- PENDING → Ожидает оплаты
- PAYMENT_INITIATED → Оплата инициирована заказчиком
- PAYMENT_RECEIVED → Оплата получена платформой (блокировка средств)
- FUNDS_TRANSFERRED → Средства переданы оператору КЗ
- OPERATOR_CN_FUNDS_RECEIVED → Оператор CN получил средства
- SUPPLIER_PAID → Поставщик оплачен
- COMPLETED → Финансы закрыты
Уровень 5-6: Статус груза (Cargo Status)
- NOT_STARTED → Груз не начат
- CARGO_TRANSFERRED → Груз передан перевозчику
- IN_TRANSIT → В пути
- AT_CUSTOMS → На таможне
- CUSTOMS_CLEARED → Таможня пройдена
- DELIVERED → Доставлен заказчику
Уровень 7: Статус документов (Document Status)
- PENDING → Документы ожидают
- SUBMITTED → Документы поданы
- UNDER_REVIEW → На рассмотрении
- CORRIDOR_ASSIGNED → Коридор назначен
- CLEARED → Выпущен
- REJECTED → Отклонен
State Machine (Конечный автомат)
Система использует State Machine для управления переходами между состояниями:
DealState.CREATED
→ DealState.OFFER_SUBMITTED
→ DealState.SUPPLIER_SELECTED
→ DealState.PAYMENT_INITIATED
→ DealState.PAYMENT_RECEIVED
→ DealState.FUNDS_TRANSFERRED
→ DealState.OPERATOR_CN_FUNDS_RECEIVED
→ DealState.SUPPLIER_PAID
→ DealState.CARGO_TRANSFERRED
→ DealState.IN_TRANSIT
→ DealState.AT_CUSTOMS
→ DealState.CUSTOMS_CLEARED
→ DealState.DELIVERED
→ DealState.COMPLETED
- Груз не может двигаться без подтверждения оплаты
- Поставщик не оплачивается без подтверждения оплаты заказчика
- Груз не передаётся перевозчику без подтверждения оплаты поставщиком
- Транспортировка не начинается без подтверждения получения груза перевозчиком
- Таможня не обрабатывает без подтверждения получения груза
Платёжная схема (Гибкая система управления денежными потоками)
Платформа формирует платёжную схему (PaymentScheme), которая определяет:
- Кто платит
- Кому платит
- За что платит
- В каком порядке
- Схема 1: Оператор КЗ оплачивает логистику и таможню
- Схема 2: Платформа оплачивает логистику и таможню напрямую
Структура платёжной схемы
Пример структуры (текущая схема через операторов):
{
"payments": [
{
"from": "platform",
"to": "operator_kz",
"amount": 1000.00,
"currency": "KZT",
"purpose": "supplier_payment",
"order": 1,
"status": "pending"
},
{
"from": "operator_kz",
"to": "operator_cn",
"amount": 1000.00,
"currency": "KZT",
"purpose": "supplier_payment",
"order": 2,
"status": "pending"
},
{
"from": "operator_cn",
"to": "supplier",
"amount": 1000.00,
"currency": "CNY",
"purpose": "supplier_payment",
"order": 3,
"status": "pending"
},
{
"from": "operator_kz",
"to": "carrier",
"amount": 100.00,
"currency": "KZT",
"purpose": "logistics",
"order": 4,
"status": "pending"
},
{
"from": "operator_kz",
"to": "customs",
"amount": 50.00,
"currency": "KZT",
"purpose": "customs_duties",
"order": 5,
"status": "pending"
}
]
}
Пример структуры (альтернативная схема - платформа платит напрямую):
{
"payments": [
{
"from": "platform",
"to": "operator_cn",
"amount": 1000.00,
"currency": "KZT",
"purpose": "supplier_payment",
"order": 1,
"status": "pending"
},
{
"from": "operator_cn",
"to": "supplier",
"amount": 1000.00,
"currency": "CNY",
"purpose": "supplier_payment",
"order": 2,
"status": "pending"
},
{
"from": "platform",
"to": "carrier",
"amount": 100.00,
"currency": "KZT",
"purpose": "logistics",
"order": 3,
"status": "pending"
},
{
"from": "platform",
"to": "customs",
"amount": 50.00,
"currency": "KZT",
"purpose": "customs_duties",
"order": 4,
"status": "pending"
}
]
}
Возможные значения полей
- from:
"platform","operator_kz","operator_cn" - to:
"operator_kz","operator_cn","supplier","carrier","customs" - purpose:
"supplier_payment","logistics","customs_duties" - status:
"pending","completed","failed"
Управление схемой
Платформа может:
- Создать схему при создании сделки
- Обновить схему (создаётся новая версия, старая сохраняется для истории)
- Выполнить платежи согласно схеме в правильном порядке
- Просмотреть историю изменений схемы
Важно: Поставщик находится в Китае, поэтому:
- ❌ Оператор КЗ НЕ может оплачивать поставщика напрямую
- ✅ Только Оператор CN оплачивает поставщика в Китае
🚀 Как работает платформа
Основной поток работы
1. Создание объявления (Announce)
Источники:
- Ручное создание - заказчик создаёт объявление вручную
- ГосЗакуп - автоматическая синхронизация через GraphQL API
- Самрук - автоматическая синхронизация через REST API
2. Проявление интереса (Interest)
Заказчик:
- Просматривает объявления и лоты
- Может создать
Interest(типы: Слежение, Расчёт, Участие) - Ещё не обязательство
3. Создание коммерческого предложения (Offer)
Поставщик:
- Просматривает доступные лоты
- Создаёт
Offerна основе лота - Указывает цены, условия доставки и оплаты
- Связывает продукты из каталога (
Product)
4. Создание заказа и сделки (Order → Deal)
Заказчик:
- Создаёт
Orderна основе лота - Выбирает поставщика (из предложений)
- При сохранении автоматически создаётся
Deal
5. Финансовый поток
- Инициирование оплаты (Заказчик) - Статус:
PAYMENT_INITIATED - Получение оплаты платформой - Средства блокируются, статус:
PAYMENT_RECEIVED - Передача средств оператору КЗ - Статус:
FUNDS_TRANSFERRED - Получение средств оператором CN - Статус:
OPERATOR_CN_FUNDS_RECEIVED - Оплата поставщика (Оператор CN) - Статус:
SUPPLIER_PAIDВажно: Только оператор CN может оплачивать поставщика, так как поставщик находится в Китае - Подтверждение оплаты поставщиком - Флаг:
supplier_payment_confirmed = True
6. Логистический поток
- Передача груза перевозчику (Поставщик) - Статус:
CARGO_TRANSFERRED - Принятие груза перевозчиком - Флаг:
carrier_cargo_confirmed = True, Статус:IN_TRANSIT - Доставка на таможню - Статус:
AT_CUSTOMS - Подтверждение получения таможней - Флаг:
customs_cargo_confirmed = True - Таможенное оформление - Статус документов:
CLEARED, Статус груза:CUSTOMS_CLEARED - Доставка заказчику - Статус:
DELIVERED
👥 Взаимодействие ролей
Роли в системе
1. Заказчик (Customer)
Профиль: UserProfile с profile_type = CUSTOMER
Возможности:
- Просмотр объявлений и лотов
- Создание интересов (
Interest) - Создание заказов (
Order) → автоматически создаётDeal - Выбор поставщика из предложений
- Инициирование оплаты
- Завершение сделки
2. Поставщик (Supplier)
Профиль: UserProfile с profile_type = SUPPLIER
Возможности:
- Управление каталогом продуктов (
Product) - Создание коммерческих предложений (
Offer) - Просмотр доступных лотов
- Подтверждение получения оплаты
- Передача груза перевозчику
3. Оператор КЗ (Operator KZ)
Профиль: UserProfile с profile_type = OPERATOR_KZ
Возможности:
- Получение средств от платформы
- Передача средств оператору CN
- Оплата логистики и таможни (если указано в платёжной схеме)
- Управление платёжными схемами (только просмотр)
Ограничения:
- Видит только связанные сделки
- Не может инициировать платежи без платёжной схемы
- НЕ может оплачивать поставщика (поставщик в Китае, оплачивает только оператор CN)
4. Оператор CN (Operator CN)
Профиль: UserProfile с profile_type = OPERATOR_CN
Возможности:
- Получение средств от оператора КЗ или платформы
- Оплата поставщика в Китае (единственный, кто может оплачивать поставщика)
- Подтверждение получения средств
Ограничения:
- Видит только связанные сделки
- Может оплачивать только поставщика (не логистику и таможню)
5. Перевозчик (Carrier)
Профиль: UserProfile с profile_type = CARRIER
Возможности:
- Принятие груза от поставщика
- Подтверждение получения груза
- Транспортировка груза
- Доставка на таможню
- Доставка заказчику
- Получение оплаты за логистические услуги (от платформы или оператора КЗ согласно схеме)
Ограничения:
- Видит только связанные сделки
- Не может изменять финансовые статусы
6. Таможня (Customs)
Профиль: UserProfile с profile_type = CUSTOMS
Возможности:
- Подтверждение получения груза
- Обработка таможенного оформления
- Назначение коридора (зелёный/жёлтый/красный)
- Выпуск с таможни
- Получение оплаты за таможенные услуги (от платформы или оператора КЗ согласно схеме)
Ограничения:
- Видит только связанные сделки
- Не может изменять финансовые статусы
7. Платформа (Platform)
Профиль: UserProfile с user.is_staff = True
Возможности:
- Получение оплаты от заказчиков
- Блокировка средств под сделки
- Передача средств операторам
- Подтверждение оплат
- Просмотр всех сделок
- Управление системой
- Создание и управление платёжными схемами (кто кому платит)
- Изменение платёжных схем (создание новых версий)
- Оплата логистики и таможни напрямую (если указано в схеме)
- Выполнение платежей согласно платёжной схеме
Ограничения:
- Не может создавать сделки от имени пользователей
- Не может изменять статусы без бизнес-логики
Матрица взаимодействия
| Роль | Может видеть | Может создавать | Может изменять |
|---|---|---|---|
| Заказчик | Свои сделки, объявления | Interest, Order, Deal | Финансовый статус (инициирование) |
| Поставщик | Свои предложения, доступные лоты | Product, Offer | Статус груза (передача), подтверждение оплаты |
| Оператор КЗ | Связанные сделки | - | Финансовый статус (передача оператору CN, оплата логистики/таможни) |
| Оператор CN | Связанные сделки | - | Финансовый статус (оплата поставщика, подтверждение получения) |
| Перевозчик | Связанные сделки | - | Статус груза (принятие, транспортировка, доставка), получение оплаты |
| Таможня | Связанные сделки | - | Статус документов, статус груза (таможня), получение оплаты |
| Платформа | Все сделки | PaymentScheme | Все статусы (через бизнес-логику), управление платёжными схемами |
🛠️ Техническая архитектура
Технологический стек
Backend:
- Django 5.2.8
- Django REST Framework
- PostgreSQL (production) / SQLite (development)
- Redis (кэширование, Celery брокер)
- Celery (фоновые задачи)
- Gunicorn (WSGI сервер)
Frontend:
- HTML5, CSS3, JavaScript
- jQuery
- AOS (анимации)
- Swiper (слайдеры)
- Flatpickr (даты)
Структура данных
Базовые классы
BaseModel- UUID primary keyTimestampedModel- create_date, update_dateBaseTimestampedModel- UUID + timestamps
Модель Deal (центральная)
Сделка содержит:
- Связь с лотом (
announce_lot) - Заказчик (
customer) - Поставщик (
supplier) - Участники:
operator_kz,operator_cn,carrier,customs - Три защищённых статуса:
_financial_status,_cargo_status,_document_status - Блокировка средств (
funds_locked)
Платёжная схема (PaymentScheme)
Гибкая система управления денежными потоками:
- Поля:
status,version,previous_version - Методы:
get_active_payments(),get_next_payment(),mark_payment_completed(),update_scheme() - Версионирование для истории изменений
Новые модели
CarrierPayment- оплата перевозчику за логистические услугиCustomsPayment- оплата таможне за таможенные услуги
PaymentExecutor сервис
Сервис для выполнения платежей согласно платёжной схеме:
can_execute_payment()- проверка прав на выполнение платежаvalidate_payment_order()- проверка порядка выполненияexecute_payment()- выполнение платежа для всех типов получателей
API архитектура
Основной endpoint: /api/v1/deals/
Действия:
POST /api/v1/deals/- Создание сделки (заказчик)GET /api/v1/deals/- Список сделок (с фильтрацией по роли)GET /api/v1/deals/{id}/- Детали сделкиPOST /api/v1/deals/{id}/submit-offer/- Подача предложения (поставщик)POST /api/v1/deals/{id}/select-supplier/- Выбор поставщика (заказчик)POST /api/v1/deals/{id}/initiate-payment/- Инициирование оплаты (заказчик)POST /api/v1/deals/{id}/confirm-payment/- Подтверждение оплаты (платформа)POST /api/v1/deals/{id}/transfer-funds/- Передача средств (платформа)POST /api/v1/deals/{id}/create-payment-scheme/- Создание платёжной схемы (платформа)POST /api/v1/deals/{id}/update-payment-scheme/- Обновление платёжной схемы (платформа)POST /api/v1/deals/{id}/execute-payment/- Выполнение платежа по схемеGET /api/v1/deals/{id}/payment-scheme/- Просмотр платёжной схемыGET /api/v1/deals/{id}/payment-scheme/history/- История изменений схемыPOST /api/v1/deals/{id}/pay-supplier/- Оплата поставщика (оператор CN) - устаревший метод, использовать execute-paymentPOST /api/v1/deals/{id}/accept-cargo/- Принятие груза (перевозчик)POST /api/v1/deals/{id}/deliver-to-customs/- Доставка на таможню (перевозчик)POST /api/v1/deals/{id}/process-customs/- Обработка таможни (таможня)POST /api/v1/deals/{id}/complete/- Завершение сделки
🔌 Интеграции
ГосЗакуп (goszakup.gov.kz)
- Тип: GraphQL API
- URL:
https://ows.goszakup.gov.kz/v3/graphql - Аутентификация: Bearer Token
- Функциональность: Получение тендеров, автоматическая синхронизация
Самрук (zakup.sk.kz)
- Тип: REST API
- URL:
https://zakup.sk.kz/eprocsearch/api/external/4dv3rts - Метод: POST
- Функциональность: Получение тендеров по фильтрам
Национальный Банк РК
- Тип: RSS XML
- URL:
https://nationalbank.kz/rss/get_rates.cfm - Функциональность: Получение курсов валют, автоматическое обновление
NCANode (ЭЦП)
- Тип: REST API
- URL:
https://v3.ncanode.kz/api/v1 - Функциональность: Проверка электронной цифровой подписи, верификация сертификатов
🔒 Безопасность и права доступа
Система permissions
View-level permissions (DRF):
IsPlatform- Платформа (is_staff)IsCustomer- ЗаказчикIsSupplier- ПоставщикIsOperatorKZ- Оператор КЗIsOperatorCN- Оператор CNIsCarrier- ПеревозчикIsCustoms- Таможня
Object-level permissions (DealPolicy):
DealPolicy.can_view()- Просмотр сделкиDealPolicy.can_submit_offer()- Подача предложенияDealPolicy.can_select_supplier()- Выбор поставщикаDealPolicy.can_pay()- ОплатаDealPolicy.can_confirm_payment()- Подтверждение оплатыDealPolicy.can_transfer_funds()- Передача средств- И другие методы...
DealPolicy
🗺️ Полная архитектурная диаграмма (Ментальная карта)
1. Общая структура проекта
- Нажмите "🔍 Открыть в полноэкранном режиме" для детального просмотра
- Кликайте на узлы для раскрытия/сворачивания ветвей
- Используйте поиск для быстрого нахождения элементов
- Используйте кнопки управления для массового раскрытия/сворачивания
- Нажмите Escape или кликните вне окна для закрытия
2. Жизненный цикл сделки (Deal Flow)
3. Взаимодействие ролей в сделке
(Единственный кто может оплачивать поставщика)"] end subgraph "Перевозчик (Carrier)" CR1[Принимает груз] --> CR2[Транспортирует] CR2 --> CR3[Доставляет на таможню] CR3 --> CR4[Доставляет заказчику] end subgraph "Таможня (Customs)" CS1[Подтверждает получение] --> CS2[Обрабатывает документы] CS2 --> CS3[Выпускает груз] end C1 --> D[Deal] S1 --> D C2 --> D C3 --> P1 P3 --> O1 O2 --> OC1 OC2 --> S2 O3 -.->|Оплата| CR1 O4 -.->|Оплата| CS1 S3 --> CR1 CR3 --> CS1 CS3 --> CR4 CR4 --> C4
4. Финансовый поток
5. Логистический поток
🎯 Выводы
Сильные стороны
- Чёткая архитектура - модульная структура, разделение ответственности
- Deal-центричность - все процессы вращаются вокруг одной сущности
- State Machine - гарантированная валидация переходов
- Безопасность - защищённые поля, централизованные проверки прав
- История изменений - полный аудит всех действий
- Интеграции - автоматическая синхронизация с внешними системами
Области для улучшения
- Платёжная схема - ✅ РЕАЛИЗОВАНО - гибкая система управления денежными потоками
- ✅ Добавлены модели CarrierPayment и CustomsPayment
- ✅ Расширена PaymentScheme (статусы, версии, методы управления)
- ✅ Создан PaymentExecutor для выполнения платежей
- ✅ API endpoints для управления схемой
- ✅ Тесты созданы и протестированы (17 тестов прошли успешно)
- Уведомления - можно добавить систему уведомлений для участников
- Отчёты - можно добавить аналитику и отчёты по сделкам
- Тестирование - увеличить покрытие тестами (особенно для PaymentExecutor и новых моделей)
Статус реализации гибкой системы платежей
Все этапы реализации завершены:
- ✅ Этап 1: Расширение модели Deal (добавлены поля operator_kz, operator_cn, carrier, customs)
- ✅ Этап 2: Модели для оплаты перевозчиков и таможни (CarrierPayment, CustomsPayment)
- ✅ Этап 3: Расширение PaymentScheme (статусы, версии, методы управления)
- ✅ Этап 4: PaymentExecutor сервис (выполнение платежей по схеме)
- ✅ Этап 5: API Endpoints (create-payment-scheme, update-payment-scheme, execute-payment, payment-scheme, payment-scheme/history)
- ✅ Этап 6: Обновление DealPolicy (can_create_payment_scheme, can_update_payment_scheme, can_execute_payment)
- ✅ Этап 7: Миграции созданы и применены
- ✅ Этап 8: Документация обновлена
- ✅ Этап 9: Тесты созданы и протестированы (17 тестов прошли успешно)