diff --git a/app/(dashboard)/invoices/[id]/page.tsx b/app/(dashboard)/invoices/[id]/page.tsx index 36486809..c49d7e4e 100644 --- a/app/(dashboard)/invoices/[id]/page.tsx +++ b/app/(dashboard)/invoices/[id]/page.tsx @@ -169,6 +169,8 @@ export default function InvoiceDetailPage({ params }: { params: Promise<{ id: st const [showBookConfirm, setShowBookConfirm] = useState(false) const [bookVoucherPreview, setBookVoucherPreview] = useState(null) const [reminderDays, setReminderDays] = useState<[number, number, number]>([15, 30, 45]) + // null = settings row not loaded; don't promise a reminder schedule then. + const [autoRemindersEnabled, setAutoRemindersEnabled] = useState(null) const statusLabel = (status: InvoiceStatus): string => t(`status_${status}`) const reminderLevelLabel = (level: 1 | 2 | 3): string => t(`reminder_level_${level}`) @@ -213,7 +215,7 @@ export default function InvoiceDetailPage({ params }: { params: Promise<{ id: st const settingsPromise = company?.id ? supabase .from('company_settings') - .select('ore_rounding, vat_registered, accounting_method, defer_invoice_booking, reminder_days_level_1, reminder_days_level_2, reminder_days_level_3') + .select('ore_rounding, vat_registered, accounting_method, defer_invoice_booking, reminder_days_level_1, reminder_days_level_2, reminder_days_level_3, send_invoice_reminders') .eq('company_id', company.id) .maybeSingle() : Promise.resolve(null) @@ -311,6 +313,9 @@ export default function InvoiceDetailPage({ params }: { params: Promise<{ id: st settings?.reminder_days_level_2 ?? 30, settings?.reminder_days_level_3 ?? 45, ]) + if (settings) { + setAutoRemindersEnabled(settings.send_invoice_reminders ?? true) + } } // Related documents need the invoice row but do not gate the main detail @@ -1480,13 +1485,15 @@ export default function InvoiceDetailPage({ params }: { params: Promise<{ id: st {t('reminders_card_title')} - {reminders.length === 0 && ( + {reminders.length === 0 && autoRemindersEnabled !== null && ( - {t('reminders_description', { - day1: reminderDays[0], - day2: reminderDays[1], - day3: reminderDays[2], - })} + {autoRemindersEnabled + ? t('reminders_description', { + day1: reminderDays[0], + day2: reminderDays[1], + day3: reminderDays[2], + }) + : t('reminders_disabled')} )} diff --git a/components/settings/InvoiceSettingsForm.tsx b/components/settings/InvoiceSettingsForm.tsx index d7af0b11..11e1d253 100644 --- a/components/settings/InvoiceSettingsForm.tsx +++ b/components/settings/InvoiceSettingsForm.tsx @@ -1,9 +1,12 @@ 'use client' +import { useState } from 'react' import { useTranslations } from 'next-intl' +import { Switch } from '@/components/ui/switch' import { SettingsGroup, SettingsInput, + SettingsReveal, SettingsRow, SettingsTextarea, } from '@/components/settings/SettingsRows' @@ -15,6 +18,7 @@ interface InvoiceSettingsFormProps { export function InvoiceSettingsForm({ settings }: InvoiceSettingsFormProps) { const t = useTranslations('settings_invoice_form') + const [sendReminders, setSendReminders] = useState(settings.send_invoice_reminders ?? true) return ( <> @@ -101,50 +105,65 @@ export function InvoiceSettingsForm({ settings }: InvoiceSettingsFormProps) { - - - - - - - setSendReminders(v === true)} /> + + + + + + + + + + + + ) diff --git a/components/settings/sections/InvoicingSettingsContent.tsx b/components/settings/sections/InvoicingSettingsContent.tsx index fc524005..23022ea3 100644 --- a/components/settings/sections/InvoicingSettingsContent.tsx +++ b/components/settings/sections/InvoicingSettingsContent.tsx @@ -37,6 +37,7 @@ export function InvoicingSettingsContent() { Number.parseInt(formData.get('reminder_days_level_2') as string) || 30, reminder_days_level_3: Number.parseInt(formData.get('reminder_days_level_3') as string) || 45, + send_invoice_reminders: formData.get('send_invoice_reminders') === 'true', } return { updates, diff --git a/messages/en.json b/messages/en.json index 7c427cac..311a1ba9 100644 --- a/messages/en.json +++ b/messages/en.json @@ -1935,6 +1935,8 @@ "default_notes_help": "Suggested automatically for new invoices.", "reminder_days_heading": "Automatic reminders", "reminder_days_help": "Choose how many days after the due date each reminder is sent. The days must be in ascending order.", + "send_reminders_label": "Send automatic reminders", + "send_reminders_help": "When off, no automatic reminder emails are sent to customers with overdue invoices.", "reminder_days_level_1": "First reminder (days)", "reminder_days_level_2": "Second reminder (days)", "reminder_days_level_3": "Final reminder (days)" @@ -3502,6 +3504,7 @@ "payment_status_empty": "No payments recorded yet.", "reminders_card_title": "Reminders", "reminders_description": "Automatic reminders are sent when the invoice is {day1}, {day2} and {day3} days overdue", + "reminders_disabled": "Automatic reminders are turned off in settings.", "reminders_empty": "No reminders have been sent yet.", "reminder_level_label": "Level {level}", "reminder_level_1": "Friendly reminder", diff --git a/messages/sv.json b/messages/sv.json index e263b5c7..45dd808d 100644 --- a/messages/sv.json +++ b/messages/sv.json @@ -1935,6 +1935,8 @@ "default_notes_help": "Föreslås automatiskt vid ny faktura.", "reminder_days_heading": "Automatiska påminnelser", "reminder_days_help": "Ange hur många dagar efter förfallodatum varje påminnelse skickas. Dagarna måste vara i stigande ordning.", + "send_reminders_label": "Skicka automatiska påminnelser", + "send_reminders_help": "När detta är avstängt skickas inga automatiska påminnelsemejl till kunder med förfallna fakturor.", "reminder_days_level_1": "Första påminnelsen (dagar)", "reminder_days_level_2": "Andra påminnelsen (dagar)", "reminder_days_level_3": "Slutlig påminnelse (dagar)" @@ -3502,6 +3504,7 @@ "payment_status_empty": "Inga registrerade betalningar ännu.", "reminders_card_title": "Påminnelser", "reminders_description": "Automatiska påminnelser skickas när fakturan varit förfallen i {day1}, {day2} och {day3} dagar", + "reminders_disabled": "Automatiska påminnelser är avstängda i inställningarna.", "reminders_empty": "Inga påminnelser har skickats ännu.", "reminder_level_label": "Nivå {level}", "reminder_level_1": "Vänlig påminnelse",