Import was present but use statement inside class body was missing,
so role checks had no effect on these two resources.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Overriding mount() conflicts with parent void return type; intercepting
the URL in routes/web.php (registered before Filament) is the clean fix.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
send()+exit breaks in Livewire's mount() context; returning the
redirect response is the correct Livewire v3 approach.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Accidentally removed when cleaning up login render hook; still needed
for the sidebar footer build-info hook.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes email/password fields entirely; custom login page shows only
the blue "Mit Blue Spices Zanzibar Cloud anmelden" button.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Variables were defined in .env but never forwarded to the app container,
so config/services.php could not read them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Every delivery and batch now writes a signed movement entry instead of
directly incrementing/decrementing spice.quantity. The balance is always
the sum of all movements. Existing data is backfilled in the migration.
Rohstoff edit page shows the full movement history (Lagerbewegungen tab).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Shows a warning in the confirmation dialog when stock would go below zero.
Deletion proceeds and sets stock to 0 rather than blocking the action.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SCP only adds/overwrites files, never deletes. Clearing app/, routes/,
config/, database/, resources/, bootstrap/ before copy ensures the server
always reflects the current git state exactly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Products now have a configurable lot_prefix (e.g. "112"). In the batch form
the prefix is shown read-only next to the suffix input (JJMMTT), and the full
lot_number (e.g. "112-260912") is composed automatically and stored.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When the recipe is changed in a batch form, keep origin data for spices
that exist in both the old and new recipe. Only add empty rows for
spices that are new to the selected recipe version.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each spice now returns an `origins` array (was single `origin` object) with
supplier and farmer resolved from the new entries relation, not flat columns.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each BatchOrigin (spice) now has multiple BatchOriginEntry rows, replacing the flat
single-supplier/farmer fields. Lieferant and Landwirt are Select fields backed by
dedicated tables with inline create support. Migration preserves existing data.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each batch origin row now shows a searchable Rohstoff Select so the same
ingredient can appear in multiple rows with different suppliers or farmers.
Pre-fill from recipe still works (one row per ingredient); user clicks
'Eintrag hinzufügen' to add a second entry for the same ingredient.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Selecting a Produkt auto-sets the current Rezeptur and pre-fills one
Herkunft row per Rohstoff. Changing the Rezeptur resets the rows.
Rohstoff is shown read-only (Hidden + Placeholder); user fills in
supplier, origin country, farmer and notes only.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When creating a new batch, the Herkunft-Repeater is automatically populated
with one row per Rohstoff from the product's current recipe. The Rohstoff
field is shown as a read-only label (Hidden spice_id + Placeholder name)
so the user only fills in supplier, origin country, farmer and notes.
Changing the recipe field updates the origin rows accordingly.
On edit, existing origin data is preserved unchanged.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The Filament table boot lifecycle (bootedInteractsWithTable) fires before
mount(), causing issues with typed $record properties on custom resource
pages. Replaced with a plain Page + Blade view rendering recipes directly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>