feat(expenses): allow editing paid expenses (status, amountPayed, paymentDate)

This commit is contained in:
Jose Selesan
2026-06-08 08:12:46 -03:00
parent 6f06ee18da
commit b08399908b
5 changed files with 273 additions and 43 deletions

View File

@@ -28,6 +28,15 @@ export const updateExpenseSchema = z.object({
dueDate: z
.string()
.datetime({ message: "La fecha debe ser una fecha ISO válida" }),
status: z.enum(["PENDING"]).optional(),
amountPayed: z
.number()
.positive("El monto pagado debe ser mayor a 0")
.optional(),
paymentDate: z
.string()
.datetime({ message: "La fecha debe ser una fecha ISO válida" })
.optional(),
});
function lastDayOfMonth(year: number, month: number): number {
@@ -199,22 +208,34 @@ export async function updateExpense(
data: z.infer<typeof updateExpenseSchema>,
) {
const existing = await prisma.expense.findUniqueOrThrow({ where: { id } });
if (existing.status !== PaymentStatus.PENDING) {
throw new Error("Solo se pueden editar gastos pendientes");
}
const dueDate = new Date(data.dueDate);
const year = dueDate.getUTCFullYear();
const month = dueDate.getUTCMonth() + 1;
const updateData: Record<string, unknown> = {
amount: data.amount,
dueDate,
year,
month,
};
if (data.status === "PENDING") {
updateData.status = PaymentStatus.PENDING;
updateData.amountPayed = null;
updateData.paymentDate = null;
} else if (existing.status === PaymentStatus.PAYED) {
if (data.amountPayed !== undefined) {
updateData.amountPayed = data.amountPayed;
}
if (data.paymentDate !== undefined) {
updateData.paymentDate = new Date(data.paymentDate);
}
}
const result = await prisma.expense.update({
where: { id },
data: {
amount: data.amount,
dueDate,
year,
month,
},
data: updateData,
});
cache.invalidateByPrefix("expenses:");
return result;