Files
sfera-new/seller_supply_migration.sql
Veronika Smirnova 888fe76849 feat(database): добавить SQL миграцию для V2 системы поставок расходников
Добавлена миграция для создания таблицы FulfillmentConsumableInventory
и связанных структур для новой V2 архитектуры управления расходниками фулфилмента.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-25 22:34:59 +03:00

151 lines
8.7 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- 📦 МИГРАЦИЯ ДЛЯ СИСТЕМЫ ПОСТАВОК РАСХОДНИКОВ СЕЛЛЕРА
-- =============================================================================
-- Создание: Новые таблицы для селлерских поставок расходников
-- Автор: 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 'Система поставок расходников селлера успешно создана!';