diff --git a/src/services/admin-service.js b/src/services/admin-service.js index cd86acc..4995fdc 100644 --- a/src/services/admin-service.js +++ b/src/services/admin-service.js @@ -545,7 +545,7 @@ const adminService = { e.id AS event_id, e.name AS event_name, COUNT(t.id)::int AS tickets_generated, COUNT(t.check_in_at)::int AS tickets_checked_in, - p.transaction_id, p.gateway, p.status AS gateway_status, p.paid_at + p.transaction_id, p.juspay_order_id, p.gateway, p.status AS gateway_status, p.paid_at FROM bookings b JOIN users u ON u.id = b.user_id JOIN events e ON e.id = b.event_id @@ -578,7 +578,7 @@ const adminService = { if (conditions.length > 0) query += ` WHERE ${conditions.join(' AND ')}` query += ` GROUP BY b.id, u.id, u.name, u.email, u.phone, e.id, e.name, - p.transaction_id, p.gateway, p.status, p.paid_at` + p.transaction_id, p.juspay_order_id, p.gateway, p.status, p.paid_at` query += ` ORDER BY b.booked_at DESC LIMIT $${p++} OFFSET $${p++}` params.push(limit, offset) @@ -613,13 +613,14 @@ const adminService = { const whereClause = conditions.join(' AND ') - // For tickets subquery, we need to rebuild the conditions - const ticketConditions = managerId + // For tickets/payment subqueries, we need to rebuild the conditions + const subqueryManagerCond = managerId ? `bk.event_id IN (SELECT id FROM events WHERE manager_id = $${managerParamPosition})` : '1=1' - const ticketDateCond = [`bk.booked_at >= $${fromParamPosition}`] - if (toParamPosition) ticketDateCond.push(`bk.booked_at <= $${toParamPosition}`) - const ticketWhere = [ticketConditions, ...ticketDateCond, 'bk.status = \'confirmed\''].filter(Boolean).join(' AND ') + const subqueryDateCond = [`bk.booked_at >= $${fromParamPosition}`] + if (toParamPosition) subqueryDateCond.push(`bk.booked_at <= $${toParamPosition}`) + const ticketWhere = [subqueryManagerCond, ...subqueryDateCond, 'bk.status = \'confirmed\''].filter(Boolean).join(' AND ') + const paymentWhere = [subqueryManagerCond, ...subqueryDateCond, "p.status IN ('success', 'refunded')"].filter(Boolean).join(' AND ') const row = await dbOneOrNone(` SELECT @@ -627,8 +628,8 @@ const adminService = { COUNT(*) FILTER (WHERE b.status = 'confirmed')::int AS successful_payments, COUNT(*) FILTER (WHERE b.status = 'pending')::int AS pending_payments, COUNT(*) FILTER (WHERE b.status = 'cancelled')::int AS failed_payments, - COALESCE(SUM(b.total_amount) FILTER (WHERE b.status = 'confirmed'), 0)::numeric AS total_revenue, - COALESCE(AVG(b.total_amount) FILTER (WHERE b.status = 'confirmed'), 0)::numeric AS avg_order_value, + COALESCE((SELECT SUM(p.amount - COALESCE(p.refund_amount, 0)) FROM payments p JOIN bookings bk ON bk.id = p.booking_id WHERE ${paymentWhere}), 0)::numeric AS total_revenue, + COALESCE((SELECT AVG(p.amount - COALESCE(p.refund_amount, 0)) FROM payments p JOIN bookings bk ON bk.id = p.booking_id WHERE ${paymentWhere} AND (p.amount - COALESCE(p.refund_amount, 0)) > 0), 0)::numeric AS avg_order_value, (SELECT COUNT(*)::int FROM tickets t JOIN bookings bk ON bk.id = t.booking_id WHERE ${ticketWhere}) AS total_tickets, (SELECT COUNT(*)::int FROM tickets t JOIN bookings bk ON bk.id = t.booking_id WHERE t.check_in_at IS NOT NULL AND ${ticketWhere}) AS checked_in_tickets FROM bookings b diff --git a/src/views/admin/payments/PaymentAnalysisView.js b/src/views/admin/payments/PaymentAnalysisView.js index d422542..3af0a02 100644 --- a/src/views/admin/payments/PaymentAnalysisView.js +++ b/src/views/admin/payments/PaymentAnalysisView.js @@ -128,6 +128,34 @@ const PaymentAnalysisView = () => { const statusData = Object.entries(statusCounts).filter(([, v]) => v > 0) const txnCols = [ + { + field: 'id', headerName: 'Order ID', width: 100, + renderCell: ({ row }) => ( + + #{row.id} + + ) + }, + { + field: 'juspay_order_id', headerName: 'Juspay ID', width: 180, + renderCell: ({ row }) => ( + + + {row.juspay_order_id || '—'} + + + ) + }, + { + field: 'transaction_id', headerName: 'Transaction ID', width: 180, + renderCell: ({ row }) => ( + + + {row.transaction_id || '—'} + + + ) + }, { field: 'user_name', headerName: 'User', flex: 1, minWidth: 220, renderCell: ({ row }) => (