const { PrismaClient } = require('@prisma/client') const prisma = new PrismaClient() async function simulateSupplyOrderReceive() { console.log('🎬 Симулируем прием заказа поставки (как в резолвере fulfillmentReceiveOrder)...') try { // Найдем организацию фулфилмента const fulfillmentOrg = await prisma.organization.findFirst({ where: { type: 'FULFILLMENT' }, select: { id: true, name: true } }) if (!fulfillmentOrg) { console.log('❌ Организация фулфилмента не найдена') return } // Найдем заказ поставки в статусе SHIPPED const existingOrder = await prisma.supplyOrder.findFirst({ where: { fulfillmentCenterId: fulfillmentOrg.id, status: 'SHIPPED', }, include: { items: { include: { product: { include: { category: true, }, }, }, }, organization: true, partner: true, }, }) if (!existingOrder) { console.log('❌ Не найден заказ поставки в статусе SHIPPED') return } console.log(`📋 Симулируем прием заказа: ${existingOrder.id}`) console.log(` Тип расходников: ${existingOrder.consumableType}`) console.log(` Элементов: ${existingOrder.items.length}`) // 1. ОБНОВЛЯЕМ СТАТУС ЗАКАЗА НА DELIVERED console.log('\n1️⃣ Обновляем статус заказа на DELIVERED...') const updatedOrder = await prisma.supplyOrder.update({ where: { id: existingOrder.id }, data: { status: 'DELIVERED' }, include: { partner: true, organization: true, fulfillmentCenter: true, logisticsPartner: true, items: { include: { product: { include: { category: true, organization: true, }, }, }, }, }, }) console.log('✅ Статус заказа обновлен на DELIVERED') // 2. СИНХРОНИЗАЦИЯ ОСТАТКОВ ПОСТАВЩИКА console.log('\n2️⃣ Обновляем остатки поставщика...') for (const item of existingOrder.items) { const product = await prisma.product.findUnique({ where: { id: item.product.id }, }) if (product) { await prisma.product.update({ where: { id: item.product.id }, data: { inTransit: Math.max((product.inTransit || 0) - item.quantity, 0), sold: (product.sold || 0) + item.quantity, }, }) console.log(`✅ Товар поставщика "${product.name}" обновлен`) } } // 3. СОЗДАНИЕ/ОБНОВЛЕНИЕ SUPPLY ЗАПИСЕЙ (ИСПРАВЛЕННАЯ ЛОГИКА) console.log('\n3️⃣ Обрабатываем Supply записи (исправленная логика)...') for (const item of existingOrder.items) { console.log(`\n📦 Товар: ${item.product.name}`) console.log(` Артикул: "${item.product.article}"`) console.log(` Количество: ${item.quantity}`) // Проверяем артикул if (!item.product.article || item.product.article.trim() === '') { console.log(' ❌ ОШИБКА: У товара нет артикула! Пропускаем...') continue } // Определяем тип расходника const isSellerSupply = existingOrder.consumableType === 'SELLER_CONSUMABLES' const supplyType = isSellerSupply ? 'SELLER_CONSUMABLES' : 'FULFILLMENT_CONSUMABLES' const sellerOwnerId = isSellerSupply ? existingOrder.organizationId : null const targetOrganizationId = fulfillmentOrg.id console.log(` Тип: ${supplyType}`) console.log(` Владелец селлер: ${sellerOwnerId}`) // ИСПРАВЛЕННАЯ ЛОГИКА: Ищем по артикулу const whereCondition = isSellerSupply ? { organizationId: targetOrganizationId, article: item.product.article, // ИСПРАВЛЕНО: поиск по артикулу type: 'SELLER_CONSUMABLES', sellerOwnerId: existingOrder.organizationId, } : { organizationId: targetOrganizationId, article: item.product.article, // ИСПРАВЛЕНО: поиск по артикулу type: 'FULFILLMENT_CONSUMABLES', sellerOwnerId: null, } console.log(' 🔍 Условие поиска:') console.log(' ', JSON.stringify(whereCondition, null, 8)) const existingSupply = await prisma.supply.findFirst({ where: whereCondition, }) if (existingSupply) { // ОБНОВЛЯЕМ существующий console.log(` ✅ НАЙДЕН существующий Supply (ID: ${existingSupply.id})`) console.log(` Текущий остаток: ${existingSupply.currentStock}`) const newCurrentStock = existingSupply.currentStock + item.quantity const newTotalQuantity = existingSupply.quantity + item.quantity await prisma.supply.update({ where: { id: existingSupply.id }, data: { currentStock: newCurrentStock, quantity: newTotalQuantity, status: 'in-stock', updatedAt: new Date(), }, }) console.log(` 📈 ОБНОВЛЕН: остаток ${existingSupply.currentStock} → ${newCurrentStock}`) console.log(` 📈 ОБНОВЛЕН: общее количество ${existingSupply.quantity} → ${newTotalQuantity}`) } else { // СОЗДАЕМ новый console.log(` 🆕 НЕ найден - СОЗДАЕМ новый Supply`) const newSupply = await prisma.supply.create({ data: { name: item.product.name, article: item.product.article, // ДОБАВЛЕНО: артикул description: item.product.description || `Поставка от ${existingOrder.partner.name}`, price: item.price, quantity: item.quantity, unit: 'шт', category: item.product.category?.name || 'Расходники', status: 'in-stock', date: new Date(), supplier: existingOrder.partner.name || existingOrder.partner.fullName || 'Не указан', minStock: Math.round(item.quantity * 0.1), currentStock: item.quantity, usedStock: 0, type: supplyType, organizationId: targetOrganizationId, sellerOwnerId: sellerOwnerId, }, }) console.log(` ✅ СОЗДАН новый Supply (ID: ${newSupply.id})`) console.log(` 📦 Название: ${newSupply.name}`) console.log(` 🏷️ Артикул: ${newSupply.article}`) console.log(` 📊 Остаток: ${newSupply.currentStock}`) console.log(` 🏢 Тип: ${newSupply.type}`) } } console.log('\n✅ СИМУЛЯЦИЯ ЗАВЕРШЕНА!') console.log('\n📊 Проверьте результат:') // Проверяем итоговые данные const finalSupplies = await prisma.supply.findMany({ where: { organizationId: fulfillmentOrg.id, type: 'FULFILLMENT_CONSUMABLES', }, select: { id: true, name: true, article: true, currentStock: true, quantity: true, status: true, createdAt: true, }, orderBy: { updatedAt: 'desc' }, }) console.log(`\n📦 Supply записи после обработки (${finalSupplies.length}):`); finalSupplies.forEach((supply, index) => { console.log(` ${index + 1}. "${supply.name}" (артикул: ${supply.article})`) console.log(` Остаток: ${supply.currentStock}, Всего: ${supply.quantity}`) console.log(` Статус: ${supply.status}, ID: ${supply.id}`) console.log(` ---`) }) } catch (error) { console.error('❌ ОШИБКА в симуляции:', error) console.error('Детали:', error.message) if (error.code) { console.error('Код ошибки:', error.code) } } finally { await prisma.$disconnect() } } simulateSupplyOrderReceive()