This commit is contained in:
2025-12-22 15:44:16 +03:30
parent 7aee650ac6
commit a5be5909a2
2 changed files with 63 additions and 41 deletions
@@ -96,45 +96,10 @@ export class OrdersController {
return this.ordersService.changeOrderStatus(orderId, restId, status, 'admin', dto?.desc);
}
// @UseGuards(AdminAuthGuard)
// @Patch('admin/orders/:orderId/confirm')
// @ApiOperation({ summary: 'Accept an order' })
// @ApiParam({ name: 'orderId', description: 'Order ID' })
// acceptOrder(@Param('orderId') orderId: string, @RestId() restId: string) {
// return this.ordersService.confirmOrder(orderId, restId);
// }
// @UseGuards(AdminAuthGuard)
// @Patch('admin/orders/:id/prepare')
// @ApiOperation({ summary: 'Prepare an order By Admin' })
// @ApiParam({ name: 'id', description: 'Order ID' })
// prepareOrder(@Param('id') id: string, @RestId() restId: string) {
// return this.ordersService.prepareOrder(id, restId);
// }
// @UseGuards(AdminAuthGuard)
// @Patch('admin/orders/:orderId/reject')
// @ApiOperation({ summary: 'Reject an order' })
// @ApiParam({ name: 'orderId', description: 'Order ID' })
// rejectOrder(@Param('orderId') orderId: string, @RestId() restId: string) {
// return this.ordersService.rejectOrder(orderId, restId);
// }
// @UseGuards(AdminAuthGuard)
// @ApiBearerAuth()
// @Patch('admin/orders/:orderId/ready')
// @ApiOperation({ summary: 'Ready for pickup or delivery ' })
// @ApiParam({ name: 'orderId', description: 'Order ID' })
// readyForPickup(@Param('orderId') orderId: string, @RestId() restId: string) {
// return this.ordersService.readyForDelivery(orderId, restId);
// }
// @UseGuards(AdminAuthGuard)
// @ApiBearerAuth()
// @Patch('admin/orders/:orderId/delivered')
// @ApiOperation({ summary: 'Mark an order as delivered' })
// @ApiParam({ name: 'orderId', description: 'Order ID' })
// markAsDelivered(@Param('orderId') orderId: string, @RestId() restId: string) {
// return this.ordersService.markAsDelivered(orderId, restId);
// }
@UseGuards(AdminAuthGuard)
@ApiOperation({ summary: 'Get Stats for report page' })
@Get('admin/orders/stats')
findStats( @RestId() restId: string) {
return this.ordersService.getStats(restId);
}
}
@@ -458,4 +458,61 @@ export class OrdersService {
);
}
}
async getStats(restId: string) {
return this.em.transactional(async em => {
// 1. Total orders count (excluding pending and canceled)
const totalOrders = await em.count(Order, {
restaurant: { id: restId },
status: {
$in: [
OrderStatus.PAID,
OrderStatus.CONFIRMED,
OrderStatus.PREPARING,
OrderStatus.DELIVERED_TO_WAITER,
OrderStatus.DELIVERED_TO_RECEPTIONIST,
OrderStatus.SHIPPED,
OrderStatus.COMPLETED,
],
},
});
// 2. Active foods count
const activeFoods = await em.count(Food, {
restaurant: { id: restId },
isActive: true,
});
// 3. Total clients count (distinct users with orders for this restaurant)
const clientsResult = await em.execute(
`
SELECT COUNT(DISTINCT o.user_id) as count
FROM orders o
WHERE o.restaurant_id = ?
`,
[restId],
);
const totalClients = Number(clientsResult[0]?.count || 0);
// 4. Total revenue (sum of paid payments for orders of this restaurant)
const revenueResult = await em.execute(
`
SELECT COALESCE(SUM(p.amount), 0)::numeric as total
FROM payments p
INNER JOIN orders o ON p.order_id = o.id
WHERE o.restaurant_id = ? AND p.status = 'paid'
`,
[restId],
);
const totalRevenue = Number(revenueResult[0]?.total || 0);
return {
totalOrders,
activeFoods,
totalClients,
totalRevenue,
};
});
}
}