feat: завершить полную миграцию V1→V2 с модульной архитектурой и документацией

- Завершить миграцию фулфилмента на 100% V2 (удалить legacy компонент)
- Создать полную V2 систему для расходников селлера (SellerConsumableInventory)
- Автоматическое пополнение инвентаря при статусе DELIVERED
- Удалить весь код создания V1 Supply для расходников
- Исправить фильтрацию: расходники селлера только на странице consumables
- Исправить Organization.inn null ошибку с fallback значениями
- Создать документацию V2 систем и отчет о миграции
- Обновить import порядок для ESLint совместимости

BREAKING CHANGES: V1 система поставок расходников полностью удалена
This commit is contained in:
Veronika Smirnova
2025-09-01 00:11:48 +03:00
parent 3f0cc933fc
commit be891f5354
18 changed files with 1347 additions and 1520 deletions

View File

@ -139,6 +139,10 @@ model Organization {
// === НОВЫЕ СВЯЗИ СО СКЛАДСКИМИ ОСТАТКАМИ V2 ===
fulfillmentInventory FulfillmentConsumableInventory[] @relation("FFInventory")
sellerSupplyOrdersAsLogistics SellerConsumableSupplyOrder[] @relation("SellerSupplyOrdersLogistics")
// === СВЯЗИ С ИНВЕНТАРЕМ РАСХОДНИКОВ СЕЛЛЕРА V2 ===
sellerInventoryAsOwner SellerConsumableInventory[] @relation("SellerInventory")
sellerInventoryAsWarehouse SellerConsumableInventory[] @relation("SellerInventoryWarehouse")
@@index([referralCode])
@@index([referredById])
@ -308,7 +312,8 @@ model Product {
sellerSupplyItems SellerConsumableSupplyItem[] @relation("SellerSupplyItems")
// === НОВЫЕ СВЯЗИ СО СКЛАДСКИМИ ОСТАТКАМИ V2 ===
inventoryRecords FulfillmentConsumableInventory[] @relation("InventoryProducts")
inventoryRecords FulfillmentConsumableInventory[] @relation("InventoryProducts")
sellerInventoryRecords SellerConsumableInventory[] @relation("SellerInventoryProducts")
@@unique([organizationId, article])
@@map("products")
@ -993,3 +998,48 @@ model FulfillmentConsumableInventory {
@@index([fulfillmentCenterId, lastSupplyDate])
@@map("fulfillment_consumable_inventory")
}
// === V2 SELLER CONSUMABLE INVENTORY SYSTEM ===
// Система складского учета расходников селлера на складе фулфилмента
model SellerConsumableInventory {
// === ИДЕНТИФИКАЦИЯ ===
id String @id @default(cuid())
// === СВЯЗИ ===
sellerId String // кому принадлежат расходники (FK: Organization SELLER)
fulfillmentCenterId String // где хранятся (FK: Organization FULFILLMENT)
productId String // что хранится (FK: Product)
// === СКЛАДСКИЕ ДАННЫЕ ===
currentStock Int @default(0) // текущий остаток на складе фулфилмента
minStock Int @default(0) // минимальный порог для автозаказа
maxStock Int? // максимальный порог (опционально)
reservedStock Int @default(0) // зарезервировано для использования селлером
totalReceived Int @default(0) // всего получено с момента создания
totalUsed Int @default(0) // всего использовано селлером
// === ЦЕНЫ ===
averageCost Decimal @default(0) @db.Decimal(10, 2) // средняя себестоимость покупки
usagePrice Decimal? @db.Decimal(10, 2) // цена списания/использования
// === МЕТАДАННЫЕ ===
lastSupplyDate DateTime? // последняя поставка
lastUsageDate DateTime? // последнее использование
notes String? // заметки по складскому учету
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// === СВЯЗИ ===
seller Organization @relation("SellerInventory", fields: [sellerId], references: [id])
fulfillmentCenter Organization @relation("SellerInventoryWarehouse", fields: [fulfillmentCenterId], references: [id])
product Product @relation("SellerInventoryProducts", fields: [productId], references: [id])
// === ИНДЕКСЫ ===
@@unique([sellerId, fulfillmentCenterId, productId]) // один товар = одна запись на связку селлер-фулфилмент
@@index([sellerId, currentStock])
@@index([fulfillmentCenterId, sellerId]) // для таблицы "Детализация по магазинам"
@@index([currentStock, minStock]) // для поиска "заканчивающихся"
@@index([sellerId, lastSupplyDate])
@@map("seller_consumable_inventory")
}