CluPilotCloud/resources/views
nexxo d8ff717cb5
tests / pest (push) Failing after 7m29s Details
tests / assets (push) Successful in 23s Details
tests / release (push) Has been skipped Details
Let a destination say how it is laid out and how long anything stays
Two destinations doing two jobs. A handover directory a NAS collects from wants
a folder per day and wants emptying — thirty days is enough to notice a NAS that
stopped collecting, and keeping more only hides it. An archive on the NAS itself
wants a folder per year and wants nothing deleted, ever. So both are per
destination rather than global.

Deleting is safe here in a way it usually is not, and that is worth saying
plainly: the invoice is a frozen document in the database and its PDF is
rendered from that on demand. Nothing is moved anywhere — it is copied, and
anything removed from a directory can be produced again and re-exported. The
directory is a handover point, not the record.

keep_days is null by default and stays null unless somebody sets it: a retention
rule nobody asked for is a deletion nobody expected. The prune only touches
folders whose NAME is one of the two shapes this application writes, and leaves
everything else alone — a prune that deletes what it does not recognise is how
an archive loses something nobody was watching. It also skips a destination
whose path is missing rather than acting on whatever is underneath an absent
mountpoint.

The shape is matched with a pattern before parsing rather than by handing
nonsense to Carbon: under strict mode createFromFormat throws instead of
returning false, so one folder somebody made by hand would have ended the whole
prune instead of being skipped. The test with a foreign folder in it found that.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 03:08:27 +02:00
..
components List issued invoices in the console, with no way to change one 2026-07-29 02:21:15 +02:00
errors Refuse a portal login for an address that already belongs to an operator 2026-07-28 14:42:16 +02:00
layouts Answer a check at once, start an update at once, and count down to neither 2026-07-28 22:25:07 +02:00
livewire Let a destination say how it is laid out and how long anything stays 2026-07-29 03:08:27 +02:00
mail Send the invoice with the invoice attached 2026-07-29 02:13:41 +02:00
pdf Issue an invoice from what somebody bought, and freeze it there 2026-07-29 02:09:05 +02:00
vendor/wire-elements-modal fix(admin): no admin lockout (is_admin fallback); centered modal width; datacenter edit modal + country dropdown 2026-07-25 18:09:17 +02:00
coming-soon.blade.php One design system for every surface 2026-07-27 16:03:47 +02:00
landing.blade.php Say EU and stop there, as the approved template does 2026-07-28 09:19:24 +02:00
legal.blade.php feat(landing): public marketing homepage at / (+ legal placeholders) 2026-07-25 08:59:39 +02:00
status.blade.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
welcome.blade.php feat(portal): design foundation — Tailwind v3, tokens, self-hosted fonts 2026-07-25 00:43:01 +02:00