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,
smtpFrom: s?.smtpFrom ?? "",
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)
</Text>
<Text as="p" tone="subdued">
Vuoto = provider di default dell'app. Compila per inviare dal
tuo SMTP (email dal tuo dominio). La password è cifrata a
riposo.
{d.appDefaultSmtp
? "Vuoto = provider di default dell'app. Compila per inviare dal tuo SMTP (email dal tuo dominio). La password è cifrata a riposo."
: "Questa installazione non ha un provider di default: la ricevuta parte solo dal tuo SMTP. La password è cifrata a riposo."}
</Text>
</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
label="Host SMTP"
value={smtpHost}