'use server'; import { signIn } from '@/auth'; import { AuthError } from 'next-auth'; export async function authenticate( prevState: string | undefined, formData: FormData, ) { try { await signIn('credentials', Object.fromEntries(formData)); } catch (error) { if (error instanceof AuthError) { switch (error.type) { case 'CredentialsSignin': return 'Invalid credentials.'; default: return 'Something went wrong.'; } } throw error; } } import { prisma } from '@/lib/prisma'; import { revalidatePath } from 'next/cache'; import { auth } from '@/auth'; export async function submitReimbursement(formData: FormData) { const session = await auth(); if (!session?.user) throw new Error('Unauthorized'); const amount = formData.get('amount') as string; const description = formData.get('description') as string; const category = formData.get('category') as string; const dateStr = formData.get('date') as string; await prisma.reimbursement.create({ data: { amount: parseFloat(amount), description, category, createdAt: new Date(dateStr), userId: (session.user as any).id, }, }); revalidatePath('/me/reimbursements'); revalidatePath('/me/dashboard'); } export async function submitOvertime(formData: FormData) { const session = await auth(); if (!session?.user) throw new Error('Unauthorized'); const date = formData.get('date') as string; const hours = formData.get('hours') as string; const reason = formData.get('reason') as string; await prisma.overtime.create({ data: { date: new Date(date), hours: parseFloat(hours), reason, userId: (session.user as any).id, }, }); revalidatePath('/me/overtime'); revalidatePath('/me/dashboard'); } export async function updateRequestStatus(id: string, type: 'reimbursement' | 'overtime', status: 'APPROVED' | 'REJECTED' | 'PAID') { const session = await auth(); // Simple role check if ((session?.user as any)?.role !== 'ADMIN') throw new Error('Admin only'); if (type === 'reimbursement') { await prisma.reimbursement.update({ where: { id }, data: { status }, }); } else { await prisma.overtime.update({ where: { id }, data: { status }, }); } revalidatePath('/admin/approvals'); revalidatePath('/admin/dashboard'); } export async function createBudget(formData: FormData) { const department = formData.get('department') as string; const amount = formData.get('amount') as string; const period = formData.get('period') as string; await prisma.budget.create({ data: { department, amount: parseFloat(amount), period, }, }); revalidatePath('/admin/budgeting'); } export async function createLedgerEntry(formData: FormData) { const amount = formData.get('amount') as string; const type = formData.get('type') as 'CREDIT' | 'DEBIT'; const description = formData.get('description') as string; const categoryId = formData.get('categoryId') as string; const accountId = formData.get('accountId') as string; await prisma.companyTransaction.create({ data: { amount: parseFloat(amount), type, description, categoryId, accountId, }, }); revalidatePath('/admin/ledger'); revalidatePath('/admin/dashboard'); }