import { Request, Response, NextFunction } from 'express'; import { TransaksiService } from '../services/transaksi.service'; import { sukses, gagal } from '../utils/response'; import { AuthenticatedRequest } from '../middlewares/auth.middleware'; import prisma from '../utils/db'; export class TransaksiController { static async create(req: AuthenticatedRequest, res: Response, next: NextFunction) { try { const actorId = req.user.id; const ip = (req.ip || req.socket.remoteAddress || 'unknown').replace('::ffff:', ''); const userAgent = (req.headers['user-agent'] || 'unknown') as string; const trans = await TransaksiService.prosesTransaksi({ data: req.body, actorId, ip, userAgent, }); return sukses(res, trans, 'Transaksi berhasil diproses'); } catch (error) { next(error); } } static async list(req: Request, res: Response, next: NextFunction) { try { const skip = parseInt(req.query.skip as string) || 0; const limit = parseInt(req.query.limit as string) || 20; const statusFilter = (req.query.status_filter as any) || undefined; const memberId = req.query.member_id ? parseInt(req.query.member_id as string) : undefined; const where: any = {}; if (statusFilter) where.status = statusFilter; if (memberId) where.member_id = memberId; const total = await prisma.transaksi.count({ where }); const trans = await prisma.transaksi.findMany({ where, orderBy: { created_at: 'desc' }, skip, take: limit, include: { transaksi_detail: true, pembayaran: true, }, }); const page = Math.floor(skip / limit) + 1; return sukses(res, trans, 'Daftar transaksi berhasil dimuat', { total, page, per_page: limit, }); } catch (error) { next(error); } } static async get(req: Request, res: Response, next: NextFunction) { try { const transaksiId = parseInt(req.params.id); const trans = await prisma.transaksi.findUnique({ where: { id: transaksiId }, include: { transaksi_detail: true, pembayaran: true, user: { select: { id: true, nama: true, username: true, }, }, member: true, }, }); if (!trans) { return gagal(res, 404, 'Transaksi tidak ditemukan'); } return sukses(res, trans, 'Detail transaksi berhasil dimuat'); } catch (error) { next(error); } } static async void(req: AuthenticatedRequest, res: Response, next: NextFunction) { try { const transaksiId = parseInt(req.params.id); const actorId = req.user.id; const ip = (req.ip || req.socket.remoteAddress || 'unknown').replace('::ffff:', ''); const userAgent = (req.headers['user-agent'] || 'unknown') as string; const alasan = req.body.alasan || 'Pembatalan transaksi oleh kasir'; const trans = await TransaksiService.prosesVoidTransaksi(transaksiId, alasan, actorId, ip, userAgent); return sukses(res, trans, 'Transaksi berhasil di-void'); } catch (error) { next(error); } } static async retur(req: AuthenticatedRequest, res: Response, next: NextFunction) { try { const actorId = req.user.id; const ip = (req.ip || req.socket.remoteAddress || 'unknown').replace('::ffff:', ''); const userAgent = (req.headers['user-agent'] || 'unknown') as string; const retur = await TransaksiService.prosesReturBarang(req.body, actorId, ip, userAgent); return sukses(res, retur, 'Retur barang berhasil dicatat'); } catch (error) { next(error); } } }