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; 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; } 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 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`); } }, };