EventBuzz_Console/src/services/api/eventTicketingManual.ts

102 lines
3.4 KiB
TypeScript

import { api } from './client';
export type TicketingManualPaymentSettings = {
enabled: boolean;
manualQrMode: 'upload' | 'dynamic';
upiQrImageUrl: string;
upiId: string;
payeeName: string;
instructions: string;
platformFeeInr: number;
platformFeeInrIsDefault: boolean;
/** One-time unlock fee (INR) — same as charged in checkout-order. */
enablementFeeInr: number;
enablementPaid: boolean;
enablementPaidAt: string | null;
};
export type TicketManualOrderRow = {
_id: string;
status: string;
createdAt?: string;
purchaserEmail: string;
screenshotUrl: string;
buyerNote?: string;
quote: Record<string, unknown> | null;
currency: string;
ticket: { _id: string; name: string } | null;
reviewedAt?: string;
rejectReason?: string;
fulfillmentParticipantIds?: string[];
};
export type PatchTicketingManualPayload = Partial<{
enabled: boolean;
manualQrMode: 'upload' | 'dynamic';
upiQrImageUrl: string;
upiId: string;
payeeName: string;
instructions: string;
platformFeeInr: number | null;
}>;
export const eventTicketingManualApi = {
async get(eventId: string): Promise<TicketingManualPaymentSettings> {
const r = await api.get<{ ticketingManualPayment: TicketingManualPaymentSettings }>(
`/events/${eventId}/ticketing-manual-payment`,
);
if (r.error || !r.data?.ticketingManualPayment) throw new Error(r.error ?? 'Failed to load manual payment settings');
return r.data.ticketingManualPayment;
},
async patch(eventId: string, payload: PatchTicketingManualPayload): Promise<TicketingManualPaymentSettings> {
const r = await api.patch<{ ticketingManualPayment: TicketingManualPaymentSettings }>(
`/events/${eventId}/ticketing-manual-payment`,
payload,
);
if (r.error || !r.data?.ticketingManualPayment) throw new Error(r.error ?? 'Failed to save');
return r.data.ticketingManualPayment;
},
async checkoutEnablementOrder(eventId: string): Promise<{
keyId: string;
orderId: string;
amount: number;
currency: string;
transactionId: string;
checkoutSource: string;
enablementFeeInr: number;
}> {
const r = await api.post<{
keyId: string;
orderId: string;
amount: number;
currency: string;
transactionId: string;
checkoutSource: string;
enablementFeeInr: number;
}>(`/events/${eventId}/ticketing-manual-enablement/checkout-order`, {});
if (r.error || !r.data) throw new Error(r.error ?? 'Failed to create payment order');
return r.data;
},
};
export const ticketManualOrdersApi = {
async list(eventId: string, status: 'pending_review' | 'approved' | 'rejected' | 'all' = 'pending_review') {
const q = status === 'pending_review' ? '' : `?status=${encodeURIComponent(status)}`;
const r = await api.get<{ orders: TicketManualOrderRow[] }>(`/events/${eventId}/ticket-manual-orders${q}`);
if (r.error) throw new Error(r.error);
return r.data?.orders ?? [];
},
async approve(eventId: string, orderId: string): Promise<void> {
const r = await api.post<{ ok: boolean }>(`/events/${eventId}/ticket-manual-orders/${orderId}/approve`, {});
if (r.error) throw new Error(r.error);
},
async reject(eventId: string, orderId: string, reason?: string): Promise<void> {
const r = await api.post<{ ok: boolean }>(`/events/${eventId}/ticket-manual-orders/${orderId}/reject`, { reason });
if (r.error) throw new Error(r.error);
},
};