
Добавлена миграция для создания таблицы FulfillmentConsumableInventory и связанных структур для новой V2 архитектуры управления расходниками фулфилмента. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
151 lines
8.7 KiB
SQL
151 lines
8.7 KiB
SQL
-- =============================================================================
|
||
-- 📦 МИГРАЦИЯ ДЛЯ СИСТЕМЫ ПОСТАВОК РАСХОДНИКОВ СЕЛЛЕРА
|
||
-- =============================================================================
|
||
-- Создание: Новые таблицы для селлерских поставок расходников
|
||
-- Автор: Claude Code AI Assistant
|
||
-- Дата: $(date)
|
||
|
||
-- Создание нового enum для статусов селлера (5-статусная система)
|
||
CREATE TYPE "SellerSupplyOrderStatus" AS ENUM (
|
||
'PENDING', -- Ожидает одобрения поставщика
|
||
'APPROVED', -- Одобрено поставщиком
|
||
'SHIPPED', -- Отгружено
|
||
'DELIVERED', -- Доставлено
|
||
'COMPLETED', -- Завершено
|
||
'CANCELLED' -- Отменено
|
||
);
|
||
|
||
-- Основная таблица поставок расходников селлера
|
||
CREATE TABLE "seller_consumable_supply_orders" (
|
||
-- === БАЗОВЫЕ ПОЛЯ ===
|
||
"id" TEXT NOT NULL,
|
||
"status" "SellerSupplyOrderStatus" NOT NULL DEFAULT 'PENDING',
|
||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||
|
||
-- === ДАННЫЕ СЕЛЛЕРА (создатель) ===
|
||
"sellerId" TEXT NOT NULL, -- кто заказывает (FK: Organization SELLER)
|
||
"fulfillmentCenterId" TEXT NOT NULL, -- куда доставлять (FK: Organization FULFILLMENT)
|
||
"requestedDeliveryDate" TIMESTAMP(3) NOT NULL, -- когда нужно
|
||
"notes" TEXT, -- заметки селлера
|
||
|
||
-- === ДАННЫЕ ПОСТАВЩИКА ===
|
||
"supplierId" TEXT, -- кто поставляет (FK: Organization WHOLESALE)
|
||
"supplierApprovedAt" TIMESTAMP(3), -- когда одобрил
|
||
"packagesCount" INTEGER, -- количество грузомест
|
||
"estimatedVolume" DECIMAL(8,3), -- объем груза в м³
|
||
"supplierContractId" TEXT, -- номер договора
|
||
"supplierNotes" TEXT, -- заметки поставщика
|
||
|
||
-- === ДАННЫЕ ЛОГИСТИКИ ===
|
||
"logisticsPartnerId" TEXT, -- кто везет (FK: Organization LOGIST)
|
||
"estimatedDeliveryDate" TIMESTAMP(3), -- план доставки
|
||
"routeId" TEXT, -- маршрут (FK: LogisticsRoute)
|
||
"logisticsCost" DECIMAL(10,2), -- стоимость доставки
|
||
"logisticsNotes" TEXT, -- заметки логистики
|
||
|
||
-- === ДАННЫЕ ОТГРУЗКИ ===
|
||
"shippedAt" TIMESTAMP(3), -- факт отгрузки
|
||
"trackingNumber" TEXT, -- номер отслеживания
|
||
|
||
-- === ДАННЫЕ ПРИЕМКИ ===
|
||
"deliveredAt" TIMESTAMP(3), -- факт доставки в ФФ
|
||
"receivedById" TEXT, -- кто принял в ФФ (FK: User)
|
||
"actualQuantity" INTEGER, -- принято количество
|
||
"defectQuantity" INTEGER, -- брак
|
||
"receiptNotes" TEXT, -- заметки приемки
|
||
|
||
-- === ЭКОНОМИКА (для будущего раздела экономики) ===
|
||
"totalCostWithDelivery" DECIMAL(12,2), -- общая стоимость с доставкой
|
||
"estimatedStorageCost" DECIMAL(10,2), -- оценочная стоимость хранения
|
||
|
||
CONSTRAINT "seller_consumable_supply_orders_pkey" PRIMARY KEY ("id")
|
||
);
|
||
|
||
-- Позиции в поставке расходников селлера
|
||
CREATE TABLE "seller_consumable_supply_items" (
|
||
"id" TEXT NOT NULL,
|
||
"supplyOrderId" TEXT NOT NULL, -- связь с поставкой
|
||
"productId" TEXT NOT NULL, -- какой расходник (FK: Product)
|
||
|
||
-- === КОЛИЧЕСТВА ===
|
||
"requestedQuantity" INTEGER NOT NULL, -- запросили
|
||
"approvedQuantity" INTEGER, -- поставщик одобрил
|
||
"shippedQuantity" INTEGER, -- отгрузили
|
||
"receivedQuantity" INTEGER, -- приняли в ФФ
|
||
"defectQuantity" INTEGER DEFAULT 0, -- брак
|
||
|
||
-- === ЦЕНЫ ===
|
||
"unitPrice" DECIMAL(10,2) NOT NULL, -- цена за единицу от поставщика
|
||
"totalPrice" DECIMAL(12,2) NOT NULL, -- общая стоимость
|
||
|
||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||
|
||
CONSTRAINT "seller_consumable_supply_items_pkey" PRIMARY KEY ("id")
|
||
);
|
||
|
||
-- === СОЗДАНИЕ ИНДЕКСОВ ===
|
||
CREATE UNIQUE INDEX "seller_consumable_supply_items_supplyOrderId_productId_key"
|
||
ON "seller_consumable_supply_items"("supplyOrderId", "productId");
|
||
|
||
-- === СОЗДАНИЕ ВНЕШНИХ КЛЮЧЕЙ ===
|
||
|
||
-- Seller Supply Orders связи
|
||
ALTER TABLE "seller_consumable_supply_orders"
|
||
ADD CONSTRAINT "seller_consumable_supply_orders_sellerId_fkey"
|
||
FOREIGN KEY ("sellerId") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
||
ALTER TABLE "seller_consumable_supply_orders"
|
||
ADD CONSTRAINT "seller_consumable_supply_orders_fulfillmentCenterId_fkey"
|
||
FOREIGN KEY ("fulfillmentCenterId") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
||
ALTER TABLE "seller_consumable_supply_orders"
|
||
ADD CONSTRAINT "seller_consumable_supply_orders_supplierId_fkey"
|
||
FOREIGN KEY ("supplierId") REFERENCES "organizations"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||
|
||
ALTER TABLE "seller_consumable_supply_orders"
|
||
ADD CONSTRAINT "seller_consumable_supply_orders_logisticsPartnerId_fkey"
|
||
FOREIGN KEY ("logisticsPartnerId") REFERENCES "organizations"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||
|
||
ALTER TABLE "seller_consumable_supply_orders"
|
||
ADD CONSTRAINT "seller_consumable_supply_orders_receivedById_fkey"
|
||
FOREIGN KEY ("receivedById") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||
|
||
-- Seller Supply Items связи
|
||
ALTER TABLE "seller_consumable_supply_items"
|
||
ADD CONSTRAINT "seller_consumable_supply_items_supplyOrderId_fkey"
|
||
FOREIGN KEY ("supplyOrderId") REFERENCES "seller_consumable_supply_orders"("id") ON DELETE CASCADE;
|
||
|
||
ALTER TABLE "seller_consumable_supply_items"
|
||
ADD CONSTRAINT "seller_consumable_supply_items_productId_fkey"
|
||
FOREIGN KEY ("productId") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
||
-- === ДОБАВЛЕНИЕ СВЯЗЕЙ В СУЩЕСТВУЮЩИЕ ТАБЛИЦЫ ===
|
||
|
||
-- Добавление связей в organizations (если они еще не существуют)
|
||
DO $$
|
||
BEGIN
|
||
-- Проверяем существование колонок перед добавлением
|
||
IF NOT EXISTS (
|
||
SELECT 1 FROM information_schema.columns
|
||
WHERE table_name = 'organizations'
|
||
AND column_name = 'sellerSupplyOrdersAsSeller'
|
||
) THEN
|
||
-- Добавляем связи будут созданы автоматически через Prisma при следующем generate
|
||
RAISE NOTICE 'Связи для селлерских поставок будут созданы автоматически при prisma generate';
|
||
END IF;
|
||
END
|
||
$$;
|
||
|
||
-- Комментарии к таблицам
|
||
COMMENT ON TABLE "seller_consumable_supply_orders" IS 'Поставки расходников селлера - заказы от селлеров для доставки в фулфилмент-центры';
|
||
COMMENT ON TABLE "seller_consumable_supply_items" IS 'Позиции в поставках расходников селлера';
|
||
|
||
-- Комментарии к ключевым полям
|
||
COMMENT ON COLUMN "seller_consumable_supply_orders"."sellerId" IS 'Селлер-заказчик (тип SELLER)';
|
||
COMMENT ON COLUMN "seller_consumable_supply_orders"."fulfillmentCenterId" IS 'Фулфилмент-получатель (тип FULFILLMENT)';
|
||
COMMENT ON COLUMN "seller_consumable_supply_orders"."supplierId" IS 'Поставщик товаров (тип WHOLESALE)';
|
||
COMMENT ON COLUMN "seller_consumable_supply_orders"."totalCostWithDelivery" IS 'Для будущего раздела экономики селлера';
|
||
|
||
RAISE NOTICE 'Система поставок расходников селлера успешно создана!'; |