## Product Variations System - Add ProductVariation model with quantity-based pricing (1 for £10, 2 for £19, 3 for £25) - Complete CRUD operations for product variations - Enhanced ProductService to include variations in all queries - Updated OrderItem to support ProductVariationId for variation-based orders - Graceful error handling for duplicate quantity constraints - Admin interface with variations management (Create/Edit/Delete) - API endpoints for programmatic variation management ## Enhanced Order Workflow Management - Redesigned OrderStatus enum with clear workflow states (Accept → Packing → Dispatched → Delivered) - Added workflow tracking fields (AcceptedAt, PackingStartedAt, DispatchedAt, ExpectedDeliveryDate) - User tracking for accountability (AcceptedByUser, PackedByUser, DispatchedByUser) - Automatic delivery date calculation (dispatch date + working days, skips weekends) - On Hold workflow for problem resolution with reason tracking - Tab-based orders interface focused on workflow stages - One-click workflow actions from list view ## Mobile-Responsive Design - Responsive orders interface: tables on desktop, cards on mobile - Touch-friendly buttons and spacing for mobile users - Horizontal scrolling tabs with condensed labels on mobile - Color-coded status borders for quick visual recognition - Smart text switching based on screen size ## Product Import/Export System - CSV import with product variations support - Template download with examples - Export existing products to CSV - Detailed import results with success/error reporting - Category name resolution (no need for GUIDs) - Photo URLs import support ## Enhanced Dashboard - Product variations count and metrics - Stock alerts (low stock/out of stock warnings) - Order workflow breakdown (pending, accepted, dispatched counts) - Enhanced layout with more detailed information ## Technical Improvements - Fixed form binding issues across all admin forms - Removed external CDN dependencies for isolated deployment - Bot Wizard form with auto-personality assignment - Proper authentication scheme configuration (Cookie + JWT) - Enhanced debug logging for troubleshooting ## Self-Contained Deployment - All external CDN references replaced with local libraries - Ready for air-gapped/isolated network deployment - No external internet dependencies 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
72 lines
2.3 KiB
YAML
72 lines
2.3 KiB
YAML
version: '3.8'
|
|
|
|
services:
|
|
littleshop:
|
|
build: ./LittleShop
|
|
image: littleshop:latest
|
|
container_name: littleshop
|
|
restart: unless-stopped
|
|
environment:
|
|
- ASPNETCORE_ENVIRONMENT=Production
|
|
- ASPNETCORE_URLS=http://+:5000
|
|
- JWT_SECRET_KEY=${JWT_SECRET_KEY:-YourSuperSecretKeyThatIsAtLeast32CharactersLong!}
|
|
- BTCPAY_SERVER_URL=${BTCPAY_SERVER_URL:-https://thebankofdebbie.giize.com}
|
|
- BTCPAY_STORE_ID=${BTCPAY_STORE_ID:-}
|
|
- BTCPAY_API_KEY=${BTCPAY_API_KEY:-}
|
|
- BTCPAY_WEBHOOK_SECRET=${BTCPAY_WEBHOOK_SECRET:-}
|
|
volumes:
|
|
- littleshop_data:/app/data
|
|
- littleshop_uploads:/app/wwwroot/uploads
|
|
- littleshop_logs:/app/logs
|
|
ports:
|
|
- "8081:5000" # Expose on port 8081 to avoid conflicts with BTCPay
|
|
networks:
|
|
- littleshop_network
|
|
labels:
|
|
# Traefik configuration for reverse proxy
|
|
- "traefik.enable=true"
|
|
- "traefik.docker.network=littleshop_network"
|
|
|
|
# HTTP Router for LittleShop
|
|
- "traefik.http.routers.littleshop.rule=Host(`shop.thebankofdebbie.giize.com`)"
|
|
- "traefik.http.routers.littleshop.entrypoints=websecure"
|
|
- "traefik.http.routers.littleshop.tls=true"
|
|
- "traefik.http.routers.littleshop.tls.certresolver=letsencrypt"
|
|
|
|
# Service
|
|
- "traefik.http.services.littleshop.loadbalancer.server.port=5000"
|
|
|
|
# Middleware for forwarded headers
|
|
- "traefik.http.routers.littleshop.middlewares=littleshop-headers"
|
|
- "traefik.http.middlewares.littleshop-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
|
|
- "traefik.http.middlewares.littleshop-headers.headers.customrequestheaders.X-Forwarded-Host=shop.thebankofdebbie.giize.com"
|
|
|
|
# Optional: Reverse proxy with nginx if Traefik is not available
|
|
nginx:
|
|
image: nginx:alpine
|
|
container_name: littleshop-nginx
|
|
restart: unless-stopped
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
volumes:
|
|
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
|
- ./ssl:/etc/nginx/ssl:ro
|
|
depends_on:
|
|
- littleshop
|
|
networks:
|
|
- littleshop_network
|
|
profiles:
|
|
- nginx # Only start with: docker-compose --profile nginx up
|
|
|
|
volumes:
|
|
littleshop_data:
|
|
driver: local
|
|
littleshop_uploads:
|
|
driver: local
|
|
littleshop_logs:
|
|
driver: local
|
|
|
|
networks:
|
|
littleshop_network:
|
|
driver: bridge |