Проект: Marketplace MVP (mp1)
Версия: 2.4.0
Дата обновления: 2025-11-08
Дата начала: 2025-11-08
Цель: Полное пересоздание проекта с нуля, модуль за модулем
Принцип: Без дизайна, только стандартные библиотеки
1. Core (БД, auth, config)
└─> 2. Legal Entities (юр.лица)
└─> 3. Channels (каналы продаж)
└─> 4. Products (товары)
└─> 5. Orders (заказы) ← зависит от Products!
└─> 6. Returns (возвраты)
└─> 7. Analytics (анализ)
└─> 8. Settings (управление)
core/auth.py, core/database.py, core/config.py, app.pyАрхитектура 3 типов каталогов:
1. PIM (Product Information Management) - главный источник истины
- Оригинальные артикулы (SKU мастер)
- Полное описание, характеристики, размеры, вес, изображения
Каталоги маркетплейсов - для каждой площадки свой
- Ozon: свои артикулы (ozon_sku)
- Wildberries: свои артикулы (wb_sku)
- Яндекс.Маркет: свои артикулы (ym_sku)
- Артикулы могут совпадать между площадками
Сопоставления - связи PIM ↔ Маркет (ProductMapping)
- Автосопоставление по штрихкоду/артикулу
- Ручное сопоставление
Страница "Товары" - динамические вкладки:
1. PIM Каталог - главный каталог (всегда первая вкладка)
2. Вкладки по каналам - создаются автоматически для каждого подключенного канала:
- Пример: ООО "Продажи 1" - Ozon Склад А
- Пример: ООО "Продажи 1" - Ozon Склад Б
- Пример: ООО "Продажи 2" - Wildberries
- Пример: ООО "Продажи 2" - Яндекс.Маркет
Структура вкладок:
[PIM Каталог] [ООО1-Ozon-А] [ООО1-Ozon-Б] [ООО2-WB] [ООО2-ЯМ]
↑ динамически генерируются из таблицы Channel
Отдельный подмодуль:
- Сопоставления товаров - отдельная страница для управления связями PIM ↔ Каналы
Workflow:
- Создать товар в PIM → Страница создания
- Клик на товар → Отдельная страница товара (редактирование всех полей)
- 📋 Копировать внутри PIM (для адаптации под маркет)
- 📥 Загрузить с маркета в PIM
- 📤 Выгрузить из PIM на маркет
- 🔗 Автосопоставление (по ШК/артикулу)
Страница товара (детали):
- URL: /product/{product_id}
- Все поля доступны для редактирования
- Секции: Основное, Характеристики, Изображения, Цены, Остатки (только просмотр)
- Кнопки: Сохранить, Отменить, Удалить, Копировать
- История изменений (кто, когда, что изменил)
Подмодули Products (v3.0+):
- Сопоставления товаров (v3.0) - отдельная страница управления связями PIM ↔ Каналы
- Таблица маппинга: PIM SKU ↔ Channel SKU
- Автосопоставление по штрихкоду/артикулу
- Ручное сопоставление
- Удаление связей
Отдельные модули (v4.0+):
- Остатки (отдельная страница)
- Цены (отдельная страница)
- Мультикарточки (вариации: цвет, размер, количество)
- Нечеткий поиск с пониманием количеств
🎨 Стилизация проекта:
- Основная тема: .streamlit/config.toml (цвета, шрифты)
- Primary: #3B82F6 (Blue)
- Background: #FFFFFF (White)
- Secondary BG: #F9FAFB (Gray 50)
- Text: #374151 (Gray 700)
- Минимальный CSS: styles/main.css (только скрытие элементов Streamlit)
- Хелперы: utils/styles.py (load_css(), apply_page_config())
- Иконки: Emoji (✅ ❌ 📦 🔧 ✉️ 📊)
- Компоненты: st.metric(), st.tabs(), st.columns()
❌ НЕ используем:
- Кастомные стили CSS (кроме минимума)
- Hydralit components
- st_aggrid (сложный)
- Сложные UI библиотеки
✅ Используем только:
- st.dataframe(), st.table() - таблицы
- st.button(), st.text_input(), st.selectbox() - формы
- st.columns() - layout
- st.tabs() - группировка
- plotly.express - графики (стандартная библиотека)
- st.metric() - метрики
- st.sidebar - навигация
Для каждого модуля:
database/models.pymodules/<module>/pages/<N>_<Module>.pyВерсия: 2.4.0
Дата: 2025-11-08
Основная схема работы: realFBS (своя доставка)
Проект создаётся для всех случаев (FBO/FBS/realFBS поддерживаются), но приоритет на:
🔴 КРИТИЧНО (должно быть):
1. Интеграция СДЭК API + Почта России API
2. Автоматическая обработка realFBS заказов
3. Учет остатков (базовый)
🟡 ВАЖНО (нужно сделать):
4. Дропшиппинг (модели + UI)
5. Замены товаров
6. Обработка возвратов (расширенная)
🟢 ЖЕЛАТЕЛЬНО (nice to have):
7. Аналитика и отчёты
8. Telegram бот уведомления
9. Другие маркетплейсы (WB, Яндекс.Маркет)
Цель: Полный автоматический цикл от заказа Ozon до доставки покупателю
Дедлайн: 2025-12-08
Задачи:
- [ ] Модуль СДЭК API (modules/delivery/cdek.py)
- [ ] Класс CdekAPI с базовыми методами
- [ ] create_order() - создание заказа
- [ ] get_label() - получение этикетки (PDF)
- [ ] get_tracking() - получение трек-номера
- [ ] track_status() - отслеживание статуса доставки
- [ ] Тестирование на СДЭК sandbox
modules/delivery/pochta.py)PochtaAPI с базовыми методамиcreate_order() - создание заказаget_label() - получение этикеткиtrack() - трекинг посылкиРезультат недель 1-2:
- ✅ 2 рабочих модуля API (СДЭК + Почта)
- ✅ Тесты на sandbox проходят
- ✅ Документация в MP1-API-GUIDE.md
Задачи:
- [ ] Автосоздание заказов в доставке
- [ ] При загрузке заказа Ozon (realFBS) → автоматически создать в СДЭК/Почте
- [ ] Выбор службы доставки (настройка по умолчанию)
- [ ] Обработка ошибок создания заказа
[ ] UI для просмотра/скачивания этикеток
[ ] Загрузка трек-номеров на Ozon
track_uploaded = True[ ] Обновление shipped_at
[ ] Синхронизация статусов
[ ] Уведомления при изменении статуса
[ ] E2E тестирование
Результат недель 3-4:
- ✅ Заказ Ozon (realFBS) обрабатывается автоматически
- ✅ Трек-номера загружаются на Ozon
- ✅ Статусы синхронизируются
- ✅ E2E тест проходит
Результат месяца 1:
Заказ Ozon → Автоматически СДЭК/Почта → Этикетка → Трек на Ozon → Доставка
Цель: Учет остатков с резервированием + работа с поставщиками
Дедлайн: 2026-01-08
Задачи:
- [ ] Модель StockMovement (database/models.py)
python
id, warehouse_id, product_id, variant_id
quantity_before, quantity_after, quantity_delta
movement_type # in/out/reserve/unreserve/correction/return
order_id, user_id, reason, created_at
create_movement() - создать движениеreserve_stock() - резервировать при заказеrelease_stock() - списать при отгрузкеunreserve_stock() - вернуть при отмене[ ] get_stock_history() - история движений
[ ] Логика резервирования
Product.reserved_quantity увеличиваетсяProduct.available_quantity уменьшаетсяreserved → 0, stock → -delta)[ ] При отмене → вернуть (reserved → 0, available → +delta)
[ ] UI страница остатков
Результат недель 1-2:
- ✅ Остатки учитываются корректно
- ✅ Резервирование работает при заказе
- ✅ Списание работает при отгрузке
- ✅ История движений сохраняется
Задачи:
- [ ] Модель Supplier (database/models.py)
python
id, user_id, name, supplier_type # dropshipper/wholesale/manufacturer
contact_person, phone, email, address, inn
contract_number, payment_terms # 7/14/30 дней
is_dropshipper, margin_percent, rating, active
[ ] Модель SupplierProduct (database/models.py)
python
id, supplier_id, product_id
supplier_sku, cost_price, stock_quantity
lead_time_days, min_order_qty, active
[ ] CRUD поставщиков (modules/suppliers/crud.py)
[ ] Обновление остатков у поставщика
[ ] UI управления поставщиками
[ ] Просмотр остатков у дропшипперов
[ ] Автозаказ у дропшиппера
Результат недель 3-4:
- ✅ Поставщики добавлены в систему
- ✅ Товары связаны с поставщиками
- ✅ Остатки на складах дропшипперов учитываются
- ✅ Автозаказ работает (при отсутствии на складе)
Результат месяца 2:
Заказ Ozon (нет остатка) → Автозаказ у дропшиппера → Получение → Отгрузка
Цель: Гибкая работа с ассортиментом + полная обработка возвратов
Дедлайн: 2026-02-08
Задачи:
- [ ] Модель Substitution (database/models.py)
python
id, product_id, substitute_product_id
substitution_type # auto/manual/ai_suggested/approved
priority, max_price_diff_percent
active, auto_apply, times_used, last_used_at
ai_confidence, ai_reason, created_by
[ ] Применение подмены при заказе
[ ] UI управления подменами
[ ] AI предложения подмен (будущее)
[ ] Логика автоподмены
Результат недель 1-2:
- ✅ Подмены настраиваются
- ✅ Автоматическая подмена работает при отсутствии товара
- ✅ История подмен сохраняется
Задачи:
- [ ] Улучшить модель Return
- [ ] Добавить поля для детальной обработки
- [ ] Связь с StockMovement (возврат на склад)
get_returns() в OzonAPI[ ] Обновление статусов
[ ] UI обработки возвратов
[ ] Возврат денег покупателю (отметка)
[ ] Статистика по возвратам
Результат недель 3-4:
- ✅ Возвраты загружаются с Ozon
- ✅ Обработка возврата работает (деньги + склад)
- ✅ Статистика показывает проблемные товары
Результат месяца 3:
Полная обработка исключительных ситуаций:
- Нет товара → Подмена
- Возврат → Обработка → Статистика
Дедлайн: 2025-11-11
modules/delivery/cdek.py__init__() - авторизация (account + secure_password)create_order() - создание заказаget_label() - получение этикетки (PDF)get_tracking() - получение трек-номераtrack_status() - отслеживаниеДокументация: https://api-docs.cdek.ru/
Дедлайн: 2025-11-13
modules/delivery/pochta.py__init__() - авторизация (токен OAuth)create_order() - создание отправленияget_label() - печатная формаtrack() - трекингДокументация: https://otpravka.pochta.ru/specification
Дедлайн: 2025-11-16
Дедлайн: 2025-11-17
database/models.pyДедлайн: 2025-11-19
Фокус: Расширение интеграций + аналитика
modules/api/wildberries.py[ ] Загрузка заказов WB
[ ] Яндекс.Маркет интеграция
modules/api/yandex_market.py[ ] Загрузка заказов ЯМ
[ ] Аналитика и отчёты
[ ] P&L (прибыль/убыток)
[ ] Telegram бот уведомления
Фокус: Финансы + команда
Transaction (продажи, комиссии, возвраты)PriceHistory (история цен)[ ] Акты сверки
[ ] Multi-user (команда)
Фокус: Автоматизация + AI
[ ] Автосмена статусов (при событиях)
[ ] AI функции
Последнее обновление: 2025-11-08
Автор: MP1 Team