From d5abd69f24dd67a35c6b9ce3f60028d10069cad7 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sun, 19 Apr 2026 17:11:37 +0000 Subject: [PATCH] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/routes/invoices.$invoiceId.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/routes/invoices.$invoiceId.tsx b/src/routes/invoices.$invoiceId.tsx index 357f412..95fab9b 100644 --- a/src/routes/invoices.$invoiceId.tsx +++ b/src/routes/invoices.$invoiceId.tsx @@ -317,10 +317,16 @@ function InvoiceDetail() { }; const deleteInvoice = async () => { - if (!confirm("Delete this draft invoice and unbill its time/expenses?")) return; + const msg = isDraft + ? "Delete this draft invoice and unbill its time/expenses?" + : `Permanently delete invoice ${invoice.invoice_number}? This will remove all payments and unbill its time/expenses. This cannot be undone.`; + if (!confirm(msg)) return; // Unlink time/expenses await supabase.from("time_entries").update({ invoice_id: null }).eq("invoice_id", invoiceId); await supabase.from("expenses").update({ invoice_id: null }).eq("invoice_id", invoiceId); + // Remove payments first (no cascade guarantee) + await supabase.from("invoice_payments").delete().eq("invoice_id", invoiceId); + await supabase.from("invoice_line_items").delete().eq("invoice_id", invoiceId); const { error } = await supabase.from("invoices").delete().eq("id", invoiceId); if (error) return toast.error(error.message); toast.success("Invoice deleted");