Initial commit
This commit is contained in:
114
src/app/api/reports/inventory/route.ts
Normal file
114
src/app/api/reports/inventory/route.ts
Normal file
@@ -0,0 +1,114 @@
|
||||
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 }
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user