Admin: avviso critico se non c'e' alcun SMTP configurato

Il tab diceva 'Vuoto = provider di default dell'app', ma questa installazione non
ha secret SMTP_*: vuoto significava 'nessuna ricevuta parte', in silenzio - mentre
CHECKLIST-COMPLIANCE-MERCHANT promette 'ricevuta sempre inviata'.

Il loader ora espone appDefaultSmtp (presenza di SMTP_HOST lato app). Se non c'e'
ne' quello ne' l'SMTP per-shop, banner critico: la ricevuta su supporto durevole
e' un obbligo (art. 54-bis), la funzione non e' conforme finche' non e' configurato.
This commit is contained in:
2026-07-10 12:42:19 +02:00
parent 97bb3998dd
commit 5796e94154

View File

@@ -66,6 +66,9 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
smtpSecure: s?.smtpSecure ?? false, smtpSecure: s?.smtpSecure ?? false,
smtpFrom: s?.smtpFrom ?? "", smtpFrom: s?.smtpFrom ?? "",
smtpPassSet: !!s?.smtpPass, smtpPassSet: !!s?.smtpPass,
// Esiste un SMTP di default a livello app (env/fly secret)? In prod oggi NO:
// senza SMTP per-shop non parte nessuna ricevuta.
appDefaultSmtp: !!process.env.SMTP_HOST,
}; };
}; };
@@ -605,11 +608,23 @@ export default function SettingsPage() {
Email (SMTP) Email (SMTP)
</Text> </Text>
<Text as="p" tone="subdued"> <Text as="p" tone="subdued">
Vuoto = provider di default dell'app. Compila per inviare dal {d.appDefaultSmtp
tuo SMTP (email dal tuo dominio). La password è cifrata a ? "Vuoto = provider di default dell'app. Compila per inviare dal tuo SMTP (email dal tuo dominio). La password è cifrata a riposo."
riposo. : "Questa installazione non ha un provider di default: la ricevuta parte solo dal tuo SMTP. La password è cifrata a riposo."}
</Text> </Text>
</BlockStack> </BlockStack>
{!smtpHost.trim() && !d.appDefaultSmtp ? (
<Banner tone="critical" title="Nessun SMTP configurato">
<Text as="p">
Le ricevute di recesso <strong>non vengono inviate</strong>.
La ricevuta su supporto durevole è un obbligo di legge
(art. 54-bis): finché non configuri l'SMTP, la funzione
non è conforme. Compila i campi qui sotto e usa "Invia
email di prova" per verificare.
</Text>
</Banner>
) : null}
<TextField <TextField
label="Host SMTP" label="Host SMTP"
value={smtpHost} value={smtpHost}