Commit Graph
37 Commits
Author SHA1 Message Date
Malek TellissiandClaude Sonnet 4.6 1e93aaa7d8 Make description read-only and auto-sized using Placeholder
Deploy / deploy (push) Successful in 14s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 05:22:32 +02:00
Malek TellissiandClaude Sonnet 4.6 a12502418b Display product images in grid layout with 200px preview height
Deploy / deploy (push) Successful in 14s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 05:20:40 +02:00
Malek TellissiandClaude Sonnet 4.6 a7f5c4a83e Recipe versioning, inline recipe create, recipe summary, Shopify description
Deploy / deploy (push) Successful in 15s
- Add version + product_id to recipes table (migration)
- Recipe select shows version label (e.g. "Kurkuma v2")
- Creating recipe from product page pre-fills product name, auto-increments version
- Recipe ingredient summary shown read-only below the select
- Remove package_content field (redundant with recipe ingredients)
- Pull product description from Shopify body_html on import
- Update existing products with empty description on re-import

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 05:18:11 +02:00
Malek TellissiandClaude Sonnet 4.6 6e28984278 Add recipe inline create/edit and batches relation on product page
Deploy / deploy (push) Successful in 14s
- 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>
2026-09-12 05:10:04 +02:00
Malek TellissiandClaude Sonnet 4.6 e959faff8d Fix barcode 500 error, GTIN mask formatting, and add price sync
Deploy / deploy (push) Successful in 15s
- Wrap barcode generation in try-catch to prevent 500 on invalid GTIN
- Move barcode preview above GTIN input field
- Add input mask (X XXXXXX XXXXXX) and strip non-digits before save/render
- Only render barcode when >= 8 digits present
- shopify:sync now updates price alongside inventory

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 04:59:46 +02:00
Malek TellissiandClaude Sonnet 4.6 25b32c717b Add SKU/GTIN fields, live barcode preview, and Shopify price import
Deploy / deploy (push) Successful in 26s
- 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>
2026-09-12 04:46:00 +02:00
Malek TellissiandClaude Sonnet 4.6 35cacb2e99 Replace storage:link with explicit ln -sf to fix broken symlink
Deploy / deploy (push) Successful in 14s
php artisan storage:link was creating a regular file instead of a
symlink, causing 404s for all uploaded images.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 04:36:42 +02:00
Malek TellissiandClaude Sonnet 4.6 cb7765bbcc Ensure storage directories exist before storage:link in entrypoint
Deploy / deploy (push) Successful in 14s
The Docker volume replaces storage/app/ with an empty volume on first
run, so storage/app/public/ must be created explicitly before the
storage:link symlink is registered.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 04:33:44 +02:00
Malek TellissiandClaude Sonnet 4.6 e34020e5bd Update README: Docker setup, artisan-in-container, Shopify commands
Deploy / deploy (push) Successful in 10s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 04:30:04 +02:00
Malek TellissiandClaude Sonnet 4.6 2024f060f1 Run artisan inside container instead of on host (PHP version mismatch)
Deploy / deploy (push) Successful in 14s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 04:27:14 +02:00
Malek TellissiandClaude Sonnet 4.6 9752e7db4c Fix composer install dir: use \$HOME instead of ~ in deploy script
Deploy / deploy (push) Failing after 8s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 04:25:12 +02:00
Malek TellissiandClaude Sonnet 4.6 4e53c9a310 Install composer on host during deploy so artisan commands work directly
Deploy / deploy (push) Failing after 7s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 04:22:59 +02:00
Malek TellissiandClaude Sonnet 4.6 822790bfc0 Improve image import logging and move HTTP downloads out of DB transaction
Deploy / deploy (push) Successful in 16s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-12 04:16:12 +02:00
Malek TellissiandClaude Sonnet 4.6 02c17d6984 Add shopify:images command to download product images for existing products
Deploy / deploy (push) Successful in 14s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 15:09:47 +02:00
Malek TellissiandClaude Sonnet 4.6 9ee67dfb69 Download and store Shopify product images locally on import
Deploy / deploy (push) Successful in 13s
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>
2026-09-11 15:08:01 +02:00
Malek TellissiandClaude Sonnet 4.6 edc4c5a28c Set explicit navigation group order in panel provider
Deploy / deploy (push) Successful in 13s
Produkte group appears first, followed by Lager, Waren Ein/Ausgang,
Ressourcen, CRM.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 15:06:21 +02:00
Malek TellissiandClaude Sonnet 4.6 53955b0163 Group Produkte, Rezepte and Chargen under 'Produkte' nav group
Deploy / deploy (push) Successful in 13s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 15:04:19 +02:00
Malek TellissiandClaude Sonnet 4.6 32e196719a Extend shopify:import to handle Stück, Stangen and Default Title variants
Deploy / deploy (push) Successful in 13s
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>
2026-09-11 15:02:12 +02:00
Malek TellissiandClaude Sonnet 4.6 94d94effa9 Add shopify:import command for initial product/inventory import
Deploy / deploy (push) Successful in 14s
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>
2026-09-11 14:58:40 +02:00
Malek TellissiandClaude Sonnet 4.6 e099e7a0a0 Pass Shopify env vars into container via docker-compose
Deploy / deploy (push) Successful in 15s
Variables in .env are only available to docker compose for interpolation,
not automatically passed into the container — must be listed explicitly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 14:55:22 +02:00
Malek Tellissi afd5f5bd00 Trigger redeploy to include SHOPIFY_ACCESS_TOKEN
Deploy / deploy (push) Successful in 9s
2026-09-11 14:45:10 +02:00
Malek TellissiandClaude Sonnet 4.6 80b7831a1e Remove temporary Shopify OAuth install routes
Deploy / deploy (push) Successful in 14s
Token captured, routes no longer needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 03:21:48 +02:00
Malek Tellissi d7c956d21c Trigger redeploy to pick up Shopify secrets
Deploy / deploy (push) Successful in 9s
2026-09-11 03:17:49 +02:00
Malek TellissiandClaude Sonnet 4.6 527f99bb6e Set explicit redirect_uri in Shopify OAuth install URL
Deploy / deploy (push) Successful in 14s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 03:15:02 +02:00
Malek TellissiandClaude Sonnet 4.6 99d3ea748c Fix nullable clientSecret in ShopifyInstallController
Deploy / deploy (push) Successful in 13s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 03:13:40 +02:00
Malek TellissiandClaude Sonnet 4.6 2b7913311a Add temporary Shopify OAuth install routes
Deploy / deploy (push) Successful in 14s
/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>
2026-09-11 03:12:20 +02:00
Malek TellissiandClaude Sonnet 4.6 7e9c43f2bf Improve Shopify sync error logging
Deploy / deploy (push) Successful in 14s
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>
2026-09-11 02:54:44 +02:00
Malek TellissiandClaude Sonnet 4.6 467d85dfec Add Shopify inventory sync and order webhook
Deploy / deploy (push) Successful in 14s
- Migration: shopify_variant_id on products_sizes, shopify_order_id on products_sales
- ShopifyService: paginated REST client (2024-10 API)
- shopify:map — one-time command to link variants by SKU
- shopify:sync — reconciliation command (Shopify is master)
- VerifyShopifyWebhook middleware: HMAC-SHA256 verification
- ShopifyWebhookController: idempotent orders/paid handler, FIFO inventory deduction
- Webhook route: POST /api/webhooks/shopify/orders-paid

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 02:53:49 +02:00
Malek TellissiandClaude Sonnet 4.6 f54b471848 Fix container startup: plain HTTP behind reverse proxy
Deploy / deploy (push) Successful in 13s
- Caddyfile: disable auto_https and admin, listen on :80 only
- docker-compose: bind port only on 127.0.0.1 to avoid public exposure
- bootstrap/app.php: trust all proxies so Laravel generates correct URLs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 02:29:22 +02:00
Malek TellissiandClaude Sonnet 4.6 a9d14e4bde Run app on host port 5000 behind reverse proxy
Deploy / deploy (push) Successful in 14s
Caddy still listens on :80 inside the container, but only port 5000 is
exposed to the host. Removes 443/HTTPS ports and Caddy cert volumes —
TLS is handled by the upstream reverse proxy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 02:23:36 +02:00
Malek TellissiandClaude Sonnet 4.6 a10f43fe21 Fix brace expansion not working in Alpine sh
Deploy / deploy (push) Failing after 29s
Busybox ash does not support brace expansion, so
storage/framework/{sessions,views,cache} was created as a literal
directory name instead of three separate ones. Split into explicit paths.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 02:19:21 +02:00
Malek TellissiandClaude Sonnet 4.6 b3a2070a9e Fix bootstrap/cache missing during Docker build
Deploy / deploy (push) Failing after 10s
Composer's post-autoload-dump hook runs php artisan package:discover,
which requires bootstrap/cache and storage/framework subdirs to exist.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 02:16:29 +02:00
Malek TellissiandClaude Sonnet 4.6 e8b52a255c Fix: FrankenPHP-Tag auf php8.4-alpine korrigieren (latest-php8.4-alpine existiert nicht)
Deploy / deploy (push) Failing after 2m22s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 02:11:40 +02:00
Malek TellissiandClaude Sonnet 4.6 a597e58838 Fix: PHP 8.3 -> 8.4 im Dockerfile (Symfony 8.1.x erfordert >=8.4.1)
Deploy / deploy (push) Failing after 7s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 02:10:34 +02:00
Malek TellissiandClaude Sonnet 4.6 9567ce7511 Fix: Composer in Dockerfile via multi-stage copy hinzufügen
Deploy / deploy (push) Failing after 12s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 02:08:50 +02:00
Malek TellissiandClaude Sonnet 4.6 a9f25d37e9 Initial commit: SpiceManagementSystem mit Deploy-Pipeline
Deploy / deploy (push) Failing after 4m54s
- Laravel 11 + Filament 3 Warenwirtschaft für Gewürze
- Chargen/LOT-Verwaltung mit Herkunfts-Tracking
- Öffentliche LOT-API (/api/lot/{nummer})
- Shopify Inventory Import
- Docker/FrankenPHP/Caddy Setup
- Gitea Actions Deploy-Workflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-11 01:55:06 +02:00
Malek Tellissi 400172cdde Erster Upload 2026-09-11 01:17:47 +02:00