Skip to content

Changelog

v1.0.3 — 2026-03-17

Push Notifications — FCM v1 API

  • Installed kreait/laravel-firebase package for Firebase Cloud Messaging v1 API (replaces deprecated legacy API).
  • Created FcmChannel — custom Laravel notification channel for push notifications.
  • Rewrote PushNotificationService to use Kreait\Firebase\Contract\Messaging::sendMulticast() with automatic invalid token deactivation.
  • Added push channel to 11 notifications: OrderPlaced, OrderConfirmed, OrderShipped, OrderDelivered, OrderCancelled, PaymentFailed, RefundProcessed, ReturnApproved, ReturnRejected, StockBackInStock, Welcome.
  • Each notification now includes a toFcm() method returning title, body, and data (with type for Flutter navigation).
  • Updated NotificationController response format to expose type, title, body, data fields for Flutter consumption.
  • Fixed SendPushNotificationJob to accept User model instead of raw token string.

Admin Panel — Notifications Section

  • New PushNotificationResource (/admin/push-notifications): list all notifications, filter by type/read status, mark read/unread, send manual push to any user.
  • New PushTokenResource (/admin/push-tokens): list device tokens, test push, activate/deactivate tokens, filter by platform.
  • Added "Notifications" navigation group in Filament sidebar.

Configuration

  • FIREBASE_CREDENTIALS environment variable added (points to service account JSON file).
  • Firebase service account JSON excluded from git via .gitignore.

v1.0.2 — 2026-03-13

Code Coverage

  • Achieved 100% code coverage across all application classes (Controllers, Services, Models, Middleware, Requests, Resources, Observers, Policies, Notifications, Enums, Traits, Jobs, Events, Exceptions).

Critical Business Logic Fixes

  • BIZ-01: Stock is now deducted at checkout via InventoryService::deduct() for every cart item with track_inventory enabled. Prevents overselling.
  • BIZ-02: Refund amount validation — refundToOriginalPayment() now rejects amounts <= 0 and amounts exceeding the original payment.
  • BIZ-03: Tax calculation integrated into checkout via TaxService::calculate() using the delivery address country/state.
  • BIZ-04: Wallet credit() pessimistic lock fixed — now uses Wallet::where()->lockForUpdate()->firstOrFail(), aligned with debit().
  • BIZ-05: InventoryService::deduct() now throws InsufficientStockException if requested quantity exceeds available stock. Prevents negative inventory.
  • BIZ-06: buy_x_get_y coupon type now implements real logic — identifies cheapest eligible items as free, with percentage discount applied. Falls back to percentage if metadata not configured.

Model Fixes

  • Added dispute to valid transaction types in Transaction model.
  • Fixed all Wallet::create duplicates across tests (UserObserver auto-creates wallet on registration).
  • Fixed Wishlist::create duplicates across tests (same UserObserver pattern).

Test Improvements

  • 10 new PaymentService webhook handler tests with real DB data.
  • Webhook deduplication, default match branch, and all 6 event types covered.
  • URL closure validation tests, SearchController popular endpoint test, ReturnController ORDER_NOT_OWNED branch test.
  • PaymentController confirm/retry error branch tests, ShipmentController default status branch test.
  • OrderObserver, ShippingCalculator, ProductService sync images tests.
  • ReviewController authenticated votes loading fix (actingAs instead of authHeaders on public routes).

Security Audit

  • Full security audit completed: no critical vulnerabilities found.
  • 10 security domains verified (SQL Injection, Mass Assignment, IDOR, Rate Limiting, Input Validation, XSS, File Uploads, Webhook Verification, Sensitive Data, CORS).

v1.0.1 — 2026-03-13

Bug Fixes

  • Order model: Added returned status to allowed values and DB enum — shipments marked as returned now correctly sync the order status.
  • Product model: Added missing orderItems() relation required by the admin analytics endpoint (top_products).
  • WebhookDelivery model: Added delivered to allowed status values — webhook send success was being blocked by validation.
  • CurrencyService: Fixed column name from rate to exchange_rate in getRate() and syncRates().
  • ProductFilterService: Fixed in_stock filter — corrected relation name (variants.inventories) and column names (quantity_on_hand, quantity_reserved).
  • Increased test coverage from 87.8% to ~98.7% with 86+ new tests.

v1.0.0 — 2026-03-05

Initial release.

Features

  • 300+ REST API endpoints across 25 modules
  • 87 database tables (68 core + 19 bonus)
  • Full Stripe integration — payment intents, 3DS, saved cards, webhooks, refunds, disputes
  • Filament v3 admin panel with 46 resources — fully translated to English
  • Multi-warehouse inventory management with stock movements
  • Loyalty points & gift cards system
  • Flash sales, product bundles, price tiers
  • Affiliate marketing with conversion tracking
  • Customer groups with custom discounts
  • Meilisearch full-text search with facets, filters, autocomplete
  • 18+ email + push notifications (OrderPlaced, Shipped, Refund, Return, Invoice, Welcome, StockAlert, etc.)
  • Custom webhook endpoints with delivery logs
  • Tax categories & automatic invoice generation
  • Multi-language support — EN, FR, AR (RTL), ES, DE
  • Multi-currency — USD, EUR, GBP, MAD, CAD, CHF, AED
  • Frontend demo — Bootstrap 5 + jQuery + Stripe.js (single HTML file)
  • 2452 automated tests / 4808 assertions / 100% code coverage
  • MinIO / AWS S3 storage for images
  • Laravel Horizon for queue monitoring
  • Rate limiting & CORS configured
  • Spatie Laravel Permission (3 roles, 57 permissions)

Licensed for single or extended use.