Replaces the recipe dropdown with an inline Section containing a name
field and a spice-repeater with percentage inputs. On save, the recipe
is created (version 1) or updated in place; spice pivot rows are synced
via sync(). SumEquals100 rule enforces that percentages add up to 100.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add size_id, units_produced, quantity_g to batches table
- quantity_g auto-calculated from units × packing size on save
- Batch model deducts spice quantities on create, reverses on delete,
recalculates on update when relevant fields change
- Batch form shows live total weight preview
- Chargen table shows units + grams produced
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Recipe select now has a create/edit modal (name + description)
- Batches RelationManager shows all LOT charges for the product below
the form, sorted newest first, with create/edit/delete actions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add SKU and GTIN fields to product variant repeater
- Render EAN/UPC barcode live from GTIN input (picqer/php-barcode-generator)
- Pull variant price from Shopify API instead of defaulting to 0
- Sync sku/gtin through EditProduct and CreateProduct save logic
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Images are fetched from Shopify CDN, stored in storage/app/public/product-images/
as UUIDs, and saved in the Product.images array — matching Filament's FileUpload format.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Parses additional packaging formats from option1 and falls back to SKU
parsing for single-variant products with 'Default Title'.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fetches all products and variants from Shopify API, creates local
Products, Packings and ProductSizes with shopify_variant_id, and
fills ProductInventory rows to match Shopify's inventory_quantity.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
/shopify/install → redirects to Shopify OAuth
/shopify/callback → exchanges code for access token and displays it
To be removed after token is captured.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Log clear hint for 403 (IP whitelist), 401, 429, 5xx.
Commands exit with failure and print error when API returns no data.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>