The reconciliation page saturated the browser with concurrent requests
(net::ERR_INSUFFICIENT_RESOURCES), re-verifying the same deliveries dozens
of times. Three compounding causes:
- the auto-verification effect depended on verificationResults and
verifyingDeliveries, so every incoming result re-ran it and re-scheduled
the same deliveries; the effect now depends only on the data, and
de-duplication uses a ref applied synchronously instead of state
- verifications fired all at once; they now go through a queue capped at 3
concurrent requests, which also drops the random 0-1s scatter and the
200ms stagger of "verify all"
- each auto-filled delivery invalidated the deliveries cache, triggering a
refetch that re-ran the effect; invalidation now happens once, when the
queue drains
Also fixes cached results computed after the setState that was supposed to
apply them, so deliveries with a known invoice amount never got their green
check and were re-examined on every pass, and silences toasts for automatic
verifications (one toast per row on a network outage).
Mail signature is now the LaFoir'Fouille brand plus the store recorded on
the delivery, instead of the current user's name.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHdE9nEh8zHhQNGpCgrtYe
Each reconciliation row now shows a mail icon that opens the default mail
client (Outlook) with the supplier address, subject and body pre-filled,
asking for the invoice as PDF or the delivery note as Excel.
- new client/src/lib/supplierMail.ts helper building the subject, body and
mailto URL from the delivery (supplier, store, delivery date, BL number,
BL amount, invoice reference) with the current user as signature
- body line breaks encoded as CRLF per RFC 6068 so Outlook keeps the layout
- supplier email read from the delivery join, with fallback to the suppliers
list; when no email is set the button explains where to add it
- button added to both the manual and validated tabs
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHdE9nEh8zHhQNGpCgrtYe