Appearance
Changelog
v1.0.3 — 2026-03-17
Push Notifications — FCM v1 API
- Installed
kreait/laravel-firebasepackage for Firebase Cloud Messaging v1 API (replaces deprecated legacy API). - Created
FcmChannel— custom Laravel notification channel for push notifications. - Rewrote
PushNotificationServiceto useKreait\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 returningtitle,body, anddata(withtypefor Flutter navigation). - Updated
NotificationControllerresponse format to exposetype,title,body,datafields for Flutter consumption. - Fixed
SendPushNotificationJobto acceptUsermodel 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_CREDENTIALSenvironment 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 withtrack_inventoryenabled. 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 usesWallet::where()->lockForUpdate()->firstOrFail(), aligned withdebit(). - BIZ-05:
InventoryService::deduct()now throwsInsufficientStockExceptionif requested quantity exceeds available stock. Prevents negative inventory. - BIZ-06:
buy_x_get_ycoupon 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
disputeto valid transaction types inTransactionmodel. - Fixed all
Wallet::createduplicates across tests (UserObserver auto-creates wallet on registration). - Fixed
Wishlist::createduplicates 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 (
actingAsinstead ofauthHeaderson 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
returnedstatus 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
deliveredto allowed status values — webhook send success was being blocked by validation. - CurrencyService: Fixed column name from
ratetoexchange_rateingetRate()andsyncRates(). - ProductFilterService: Fixed
in_stockfilter — 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)