import { Claim, ClaimStatus, ClaimWithServiceLines, InsertClaim, UpdateClaim, } from "@repo/db/types"; import { prisma as db } from "@repo/db/client"; export interface IStorage { getClaim(id: number): Promise; getActiveClaimByAppointmentId(appointmentId: number): Promise; getRecentClaimsByPatientId( patientId: number, limit: number, offset: number ): Promise; getTotalClaimCountByPatient(patientId: number): Promise; getClaimsByAppointmentId(appointmentId: number): Promise; getRecentClaims(limit: number, offset: number): Promise; getTotalClaimCount(): Promise; createClaim(claim: InsertClaim): Promise; updateClaim(id: number, updates: UpdateClaim): Promise; updateClaimStatus(id: number, status: ClaimStatus): Promise; deleteClaim(id: number): Promise; getAppointmentIdsWithClaimNumbers(ids: number[]): Promise>; } export const claimsStorage: IStorage = { async getClaim(id: number): Promise { const claim = await db.claim.findUnique({ where: { id } }); return claim ?? undefined; }, async getRecentClaimsByPatientId( patientId: number, limit: number, offset: number ): Promise { return db.claim.findMany({ where: { patientId }, orderBy: { createdAt: "desc" }, skip: offset, take: limit, include: { serviceLines: true, staff: true, claimFiles: true, }, }); }, async getTotalClaimCountByPatient(patientId: number): Promise { return db.claim.count({ where: { patientId }, }); }, async getActiveClaimByAppointmentId(appointmentId: number): Promise { return db.claim.findFirst({ where: { appointmentId, status: { notIn: ["CANCELLED"] }, }, orderBy: { createdAt: "desc" }, include: { serviceLines: true, claimFiles: true, staff: true }, }) as Promise; }, async getClaimsByAppointmentId(appointmentId: number): Promise { return await db.claim.findMany({ where: { appointmentId } }); }, async getRecentClaims( limit: number, offset: number ): Promise { return db.claim.findMany({ orderBy: { createdAt: "desc" }, skip: offset, take: limit, include: { serviceLines: true, staff: true, claimFiles: true }, }); }, async getTotalClaimCount(): Promise { return db.claim.count(); }, async createClaim(claim: InsertClaim): Promise { return await db.claim.create({ data: claim as Claim }); }, async updateClaim(id: number, updates: UpdateClaim): Promise { try { return await db.claim.update({ where: { id }, data: updates, }); } catch (err) { throw new Error(`Claim with ID ${id} not found`); } }, async updateClaimStatus(id: number, status: ClaimStatus): Promise { const existing = await db.claim.findUnique({ where: { id } }); if (!existing) { throw new Error("Claim not found"); } return db.claim.update({ where: { id }, data: { status }, }); }, async deleteClaim(id: number): Promise { try { await db.claim.delete({ where: { id } }); } catch (err) { throw new Error(`Claim with ID ${id} not found`); } }, async getAppointmentIdsWithClaimNumbers(ids: number[]): Promise> { if (!ids.length) return new Set(); const rows = await db.claim.findMany({ where: { appointmentId: { in: ids }, claimNumber: { not: null } }, select: { appointmentId: true }, distinct: ["appointmentId"], }); return new Set(rows.map((r) => r.appointmentId)); }, };