projects/org/pirotehnika/data/connectors/DATABASE_ARCHITECTURE.md

АРХИТЕКТУРА БАЗ ДАННЫХ

Дата: 2025-12-26
Автор: Claude Opus (Архитектор)


ОБЗОР

В системе 3 базы данных:

База Тип Назначение Статус
PostgreSQL pt7k98pv0fwi1el Production PIM (товары, цены, остатки) ГЛАВНАЯ
PostgreSQL pkxgq45k5mwsdwh Production MCRM (клиенты, задачи, кампании) ✅ Production
SQLite pim.db Локальная Тестирование рефакторинга ⚠️ Не используется

1. PostgreSQL pt7k98pv0fwi1el — PIM (ГЛАВНАЯ)

Параметры подключения

HOST = "localhost"
PORT = 5433
USER = "nocodb"
PASSWORD = "NocoDB2025Secure"
DATABASE = "nocodb"
SCHEMA = "pt7k98pv0fwi1el"

NocoDB

Содержимое

104 таблицы, включая:

Товары

Цены

Остатки

Аналитика

Справочники

Кто использует

  1. PIM приложение (app/pim/) — прямое подключение к PostgreSQL
  2. MCRM (projects/mcrm/) — читает товары из pim_products
  3. MP1 (app/mp1/) — экспорт на OZON/маркетплейсы
  4. Импортеры (data/connectors/, data/scripts/) — загрузка прайсов

2. PostgreSQL pkxgq45k5mwsdwh — MCRM

Параметры подключения

HOST = "localhost"
PORT = 5433
USER = "nocodb"
PASSWORD = "NocoDB2025Secure"
DATABASE = "nocodb"
SCHEMA = "pkxgq45k5mwsdwh"

NocoDB

Содержимое

6 таблиц:

Таблица ID Назначение Записей
crm_prj_clients mrt2ihqnfelqwsm Клиенты ?
crm_prj_tasks m5885vq360vt89w Задачи ?
crm_prj_messages m7gk0dajlk0ezzm Сообщения ?
crm_prj_campaigns mhvsf1dyk5bjbc7 Рассылки ?
CrmPrjCampaignMessages mept56ctcsqvjcp Сообщения кампаний ?
crm_app_managers mlwz2qzwlkg5ltl Менеджеры ?

Кто использует

Только MCRM (projects/mcrm/)


3. SQLite pim.db — ЭКСПЕРИМЕНТАЛЬНАЯ ⚠️

Путь

/opt/claude-workspace/projects/org/pirotehnika/data/nocodb/pim.db

Содержимое

4 таблицы:

Таблица Записей Описание
pim_products 424 Товары (характеристики)
supplier_cost 424 Цены от поставщиков (НОВОЕ)
supplier_stock 27 Остатки у поставщиков (НОВОЕ)
suppliers 3 Справочник поставщиков

Статус

НЕ ИСПОЛЬЗУЕТСЯ в production

История:
- Создана: 2025-12-26 10:20
- Цель: Тестирование рефакторинга (разделение цен/остатков)
- Проблема: Рефакторинг ошибочно применён к SQLite вместо PostgreSQL

Кто использует

Только тестовые скрипты:
- app/pim/test_refactoring.py — тесты
- app/pim/test_retail_pricing.py — тесты расчёта цен
- app/pim/import_from_json.py — импорт в SQLite (тест)


ВЗАИМОСВЯЗИ

┌─────────────────────────────────────────────────────────────┐
│                     PostgreSQL :5433                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────┐   ┌──────────────────────┐    │
│  │  pt7k98pv0fwi1el (PIM)  │   │ pkxgq45k5mwsdwh (CRM)│    │
│  │  ─────────────────────  │   │ ─────────────────────│    │
│  │  • pim_products (4626)  │   │ • crm_prj_clients    │    │
│  │  • stocks (122)         │   │ • crm_prj_tasks      │    │
│  │  • warehouses (9)       │   │ • crm_prj_campaigns  │    │
│  │  • PriceListItem (1716) │   │ • crm_prj_messages   │    │
│  │  • price_rules          │   │ • crm_app_managers   │    │
│  │  • ... (104 таблицы)    │   │                      │    │
│  └────────▲────────────────┘   └──────────────────────┘    │
│           │                                                 │
└───────────┼─────────────────────────────────────────────────┘
            │
            │  Читает товары
            │  (pim_products)
            │
    ┌───────┴──────────┐
    │      MCRM        │
    │   :8091          │
    │                  │
    │  • Клиенты       │
    │  • Воронка       │
    │  • Рассылки      │
    │  • Каталог ──────┼──► Берёт из PIM
    └──────────────────┘

Как MCRM работает с товарами

MCRM НЕ имеет своих товаров!

MCRM напрямую читает товары из PIM через PostgreSQL:

# projects/mcrm/app/services/pim_client.py
class PIMClient:
    def __init__(self):
        self.base_id = "pt7k98pv0fwi1el"  # ← Схема PIM!

# projects/mcrm/app/routers/pricing.py
PG_SCHEMA_PIM = "pt7k98pv0fwi1el"

SELECT * FROM pt7k98pv0fwi1el.pim_products  # ← Прямой доступ к PIM

Примеры использования:

  1. Каталог для сайтов — читает pim_products
  2. Альтернативы товаров — ищет в pim_products
  3. Бюджетный подбор — фильтр по pim_products
  4. Роботы (sales_bot) — подбор салютов из pim_products

ПРАВИЛЬНАЯ АРХИТЕКТУРА

Текущее состояние (СЕЙЧАС)

PIM (pt7k98pv0fwi1el):
  ├─ pim_products
  │   ├─ article, name, brand
  │   ├─ cost_price        ← ДУБЛИКАТ (есть в PriceListItem)
  │   └─ stock_qty         ← ДУБЛИКАТ (есть в stocks)
  ├─ PriceListItem (цены из прайсов)
  └─ stocks (остатки по складам)

MCRM (pkxgq45k5mwsdwh):
  ├─ crm_prj_clients
  └─ ... (свои таблицы CRM)
  └─ Товары читает из pt7k98pv0fwi1el.pim_products ↑

Целевое состояние (ПОСЛЕ МИГРАЦИИ)

PIM (pt7k98pv0fwi1el):
  ├─ pim_products (ТОЛЬКО характеристики)
  │   └─ article, name, brand, category
  ├─ supplier_cost (цены от поставщиков) ← НОВОЕ
  │   └─ article + supplier_code → cost_price
  ├─ supplier_stock (остатки у поставщиков) ← НОВОЕ
  │   └─ article + supplier_code → quantity
  └─ stocks (остатки на складах)
      └─ article + warehouse_id → quantity

MCRM (pkxgq45k5mwsdwh):
  └─ Без изменений, продолжает читать pim_products

Преимущества:
1. ✅ Нет дубликатов (cost_price удалён из pim_products)
2. ✅ История цен (supplier_cost с valid_from/valid_to)
3. ✅ Цены от разных поставщиков для одного товара
4. ✅ MCRM продолжит работать (pim_products остаётся)


ЗАЧЕМ НУЖНА SQLite pim.db?

❌ НЕ НУЖНА для production

SQLite база была создана по ошибке — рефакторинг должен был применяться к PostgreSQL, а не к локальной SQLite.

✅ Можно использовать для:

  1. Локальной разработки — тестирование без доступа к PostgreSQL
  2. Юнит-тестов — быстрые тесты без сетевого подключения
  3. Прототипирования — проверка SQL-запросов перед применением к PostgreSQL

Рекомендация

Удалить SQLite базу после применения миграции к PostgreSQL:

# После успешной миграции PostgreSQL
rm /opt/claude-workspace/projects/org/pirotehnika/data/nocodb/pim.db

Или переместить в архив:

mv /opt/claude-workspace/projects/org/pirotehnika/data/nocodb/pim.db \
   /opt/claude-workspace/projects/org/pirotehnika/app/pim/archive/2025-12-26-refactoring/pim_test.db

МИГРАЦИЯ

План: MIGRATION_PLAN.md

Кратко:
1. Создать supplier_cost, supplier_stock в PostgreSQL (pt7k98pv0fwi1el)
2. Мигрировать данные из pim_products и PriceListItem
3. Обновить код для использования новых таблиц
4. Удалить cost_price, stock_qty из pim_products
5. MCRM продолжит работать (читает pim_products)

Время: ~2 часа


ИТОГО

Ответы на вопросы:

1. Зачем вторая база?

2. С какой базой работает CRM?

MCRM работает с ДВУМЯ базами:
- pkxgq45k5mwsdwh — свои данные (клиенты, задачи, кампании)
- pt7k98pv0fwi1el — читает товары из PIM

MCRM напрямую читает pt7k98pv0fwi1el.pim_products через PostgreSQL.


Версия: 1.0.0
Дата: 2025-12-26
Автор: Claude Opus (Архитектор)