Files
OpticZ/src/app/api/reports/inventory/route.ts
2026-05-30 14:33:11 +01:00

115 lines
2.9 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
import { db } from '@/lib/db'
export async function GET(request: NextRequest) {
try {
// Stock valuation by category
const stockValuationRaw = await db.produit.groupBy({
by: ['categorie'],
where: {
actif: true
},
_sum: {
stock: true
},
_count: true
})
// Calculate value for each category
const stockValuationByCategory = await Promise.all(
stockValuationRaw.map(async (item) => {
const products = await db.produit.findMany({
where: {
categorie: item.categorie,
actif: true
},
select: {
stock: true,
prixAchatHT: true
}
})
const totalValue = products.reduce((sum, p) => sum + (p.stock * p.prixAchatHT), 0)
return {
category: item.categorie,
value: totalValue,
count: item._count
}
})
)
const totalValue = stockValuationByCategory.reduce((sum, item) => sum + item.value, 0)
// Low stock items
const lowStockItems = await db.produit.findMany({
where: {
actif: true,
stock: {
lt: db.produit.fields.stockMin
}
},
select: {
id: true,
reference: true,
designation: true,
categorie: true,
stock: true,
stockMin: true,
prixAchatHT: true
},
orderBy: {
stock: 'asc'
}
})
const lowStockItemsWithValue = lowStockItems.map((item) => ({
...item,
value: item.stock * item.prixAchatHT
}))
// Category breakdown
const categoryBreakdown = await Promise.all(
['MONTURE', 'VERRE', 'LENTILLE', 'ACCESSOIRE'].map(async (category) => {
const [totalProducts, activeProducts] = await Promise.all([
db.produit.count({ where: { categorie: category } }),
db.produit.count({ where: { categorie: category, actif: true } })
])
const products = await db.produit.findMany({
where: { categorie: category, actif: true },
select: { stock: true, prixAchatHT: true }
})
const totalStock = products.reduce((sum, p) => sum + p.stock, 0)
const stockValue = products.reduce((sum, p) => sum + (p.stock * p.prixAchatHT), 0)
return {
category,
totalProducts,
activeProducts,
totalStock,
stockValue
}
})
)
const inventoryData = {
stockValuation: {
totalValue,
byCategory: stockValuationByCategory
},
lowStockItems: lowStockItemsWithValue,
categoryBreakdown
}
return NextResponse.json(inventoryData)
} catch (error) {
console.error('Error fetching inventory data:', error)
return NextResponse.json(
{ error: 'Failed to fetch inventory data' },
{ status: 500 }
)
}
}