├── public ├── favicon.ico ├── robots.txt ├── .htaccess └── index.php ├── resources ├── css │ └── app.css ├── views │ ├── sales │ │ ├── edit.blade.php │ │ ├── show.blade.php │ │ └── dashboard.blade.php │ ├── stores │ │ ├── edit.blade.php │ │ ├── index.blade.php │ │ └── create.blade.php │ ├── components │ │ └── search.blade.php │ ├── manufacturers │ │ ├── index.blade.php │ │ ├── show.blade.php │ │ └── create.blade.php │ ├── suppliers │ │ ├── index.blade.php │ │ ├── create.blade.php │ │ └── show.blade.php │ ├── store_products │ │ └── create.blade.php │ ├── reports │ │ └── index.blade.php │ └── products │ │ ├── index.blade.php │ │ ├── create.blade.php │ │ ├── bulk.blade.php │ │ └── show.blade.php └── js │ ├── app.js │ └── bootstrap.js ├── database ├── .gitignore ├── seeders │ ├── DatabaseSeeder.php │ └── StoreSeeder.php ├── migrations │ ├── 2025_02_19_082559_add_qr_code_to_products_table.php │ ├── 2014_10_12_100000_create_password_resets_table.php │ ├── 2025_09_08_160851_add_low_stock_threshold_to_stores_table.php │ ├── 2025_02_18_085429_create_stores_table.php │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2025_09_06_210641_create_manufacturers_table.php │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ ├── 2025_02_19_070701_create_suppliers_table.php │ ├── 2025_09_08_163418_create_expiry_alerts_table.php │ ├── 2025_09_09_165042_create_reports_table.php │ ├── 2025_09_06_223600_create_store_product_table.php │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php │ ├── 2025_09_16_210742_create_sales_predictions_table.php │ ├── 2025_09_16_210749_create_inventory_forecasts_table.php │ ├── 2025_09_09_221237_create_sales_table.php │ └── 2025_02_19_074807_create_products_table.php └── factories │ └── UserFactory.php ├── bootstrap ├── cache │ └── .gitignore └── app.php ├── storage ├── logs │ └── .gitignore ├── app │ ├── public │ │ └── .gitignore │ └── .gitignore └── framework │ ├── testing │ └── .gitignore │ ├── views │ └── .gitignore │ ├── cache │ ├── data │ │ └── .gitignore │ └── .gitignore │ ├── sessions │ └── .gitignore │ └── .gitignore ├── isses.PNG ├── Kanban.PNG ├── use_case.png ├── tests ├── TestCase.php ├── Unit │ └── ExampleTest.php ├── Feature │ └── ExampleTest.php └── CreatesApplication.php ├── .gitattributes ├── app ├── Models │ ├── Report.php │ ├── Manufacturer.php │ ├── ExpiryAlert.php │ ├── Store.php │ ├── SalesPrediction.php │ ├── InventoryForecast.php │ ├── Product.php │ ├── User.php │ ├── Sale.php │ └── Supplier.php ├── Http │ ├── Middleware │ │ ├── EncryptCookies.php │ │ ├── VerifyCsrfToken.php │ │ ├── PreventRequestsDuringMaintenance.php │ │ ├── TrustHosts.php │ │ ├── TrimStrings.php │ │ ├── Authenticate.php │ │ ├── ValidateSignature.php │ │ ├── TrustProxies.php │ │ └── RedirectIfAuthenticated.php │ ├── Controllers │ │ ├── Controller.php │ │ ├── SupplierController.php │ │ ├── StoreProductController.php │ │ ├── DashboardController.php │ │ ├── StoreController.php │ │ ├── ManufacturerController.php │ │ ├── ProductController.php │ │ ├── ReportController.php │ │ └── SaleController.php │ └── Kernel.php ├── Providers │ ├── BroadcastServiceProvider.php │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php ├── Console │ ├── Kernel.php │ └── Commands │ │ ├── CheckProductExpiry.php │ │ └── TestPredictions.php └── Exceptions │ └── Handler.php ├── .gitignore ├── vite.config.js ├── .editorconfig ├── package.json ├── lang └── en │ ├── pagination.php │ ├── auth.php │ └── passwords.php ├── routes ├── channels.php ├── api.php ├── console.php └── web.php ├── config ├── cors.php ├── services.php ├── view.php ├── hashing.php ├── broadcasting.php ├── sanctum.php ├── filesystems.php ├── queue.php ├── cache.php ├── mail.php ├── auth.php ├── logging.php └── database.php ├── phpunit.xml ├── artisan ├── Dockerfile ├── composer.json ├── README.md ├── SPECIFICATION.md ├── TEST_CASE.md ├── Reflection_on_Challenges_test_cases.md ├── Template_Analysis.md ├── class-diagram-counterfeit-system.md ├── Kanban_Board_Customization.md ├── Kanban_Board_Explanation.md ├── ARCHITECTURE.md ├── User_Stories.md ├── Domain_Model_Counterfeit_System.md └── STAKEHOLDER_ANALYSIS.md /public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /resources/views/sales/edit.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | import './bootstrap'; 2 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /isses.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OkuhleNdlebe/spaza_shop/HEAD/isses.PNG -------------------------------------------------------------------------------- /Kanban.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OkuhleNdlebe/spaza_shop/HEAD/Kanban.PNG -------------------------------------------------------------------------------- /use_case.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OkuhleNdlebe/spaza_shop/HEAD/use_case.png -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /resources/views/stores/edit.blade.php: -------------------------------------------------------------------------------- 1 |
Location: {{ $store->location }}
16 |Owner: {{ $store->owner_name }}
17 | View Details 18 || Company Name | 14 |Contact Person | 15 |Phone | 16 |Actions | 18 ||
|---|---|---|---|---|
| {{ $supplier->company_name }} | 24 |{{ $supplier->contact_person }} | 25 |{{ $supplier->phone_number }} | 26 |{{ $supplier->email }} | 27 |28 | View 29 | | 30 |
Email: {{ $manufacturer->contact_email }}
9 |Website: {{ $manufacturer->website }}
10 |Address: {{ $manufacturer->address }}
11 || Name | 18 |Description | 19 |Expiry Date | 20 |Price | 21 |Supplier | 22 |
|---|---|---|---|---|
| {{ $product->name }} | 28 |{{ $product->description }} | 29 |{{ $product->expiry_date }} | 30 |{{ $product->price }} | 31 |{{ $product->supplier->company_name ?? '' }} | 32 |
Generate detailed sales reports by date range and store
17 | Generate Sales Report 18 |Stock levels, valuation, and inventory health
29 | View Inventory Report 30 |Analyze supplier delivery times and product quality
41 | Supplier Reports 42 || Product Name | 27 |Description | 28 |Manufacturer | 29 |Expiry Date | 30 |Supplier | 31 |Actions | 32 |
|---|---|---|---|---|---|
| {{ $product->name }} | 38 |{{ Str::limit($product->description, 50) }} | 39 |{{ $product->manufacturer ? $product->manufacturer->name : 'N/A' }} | 40 |{{ $product->expiry_date }} | 41 |{{ $product->supplier ? $product->supplier->company_name : 'N/A' }} | 42 |43 | View Details 44 | | 45 |
Contact Person: {{ $supplier->contact_person }}
10 |Phone: {{ $supplier->phone_number }}
11 |Email: {{ $supplier->email }}
12 |Address: {{ $supplier->address }}
13 | 14 |Total Products
33 |In Stock
39 |Avg. Delivery Time
45 |Quality Rating
55 |Sale ID: #{{ $sale->id }}
24 |Date & Time: {{ $sale->sale_date->format('M j, Y H:i') }}
25 |Store: {{ $sale->store->name }}
26 |Location: {{ $sale->store->location }}
27 |Product: {{ $sale->product->name }}
30 |Quantity: {{ $sale->quantity }}
31 |Unit Price: R{{ number_format($sale->unit_price, 2) }}
32 |Total Amount: R{{ number_format($sale->total_amount, 2) }}
33 |{{ $sale->notes }}
40 |Supplier: {{ $sale->product->supplier->company_name ?? 'N/A' }}
78 |Manufacturer: {{ $sale->product->manufacturer->name ?? 'N/A' }}
79 |Expiry Date: {{ $sale->product->expiry_date ?? 'N/A' }}
80 |Today's Sales
27 |This Week
35 |This Month
43 |Total Units Sold
51 || Product | 69 |Units Sold | 70 |Revenue | 71 |
|---|---|---|
| {{ $item->product->name }} | 77 |{{ $item->total_sold }} | 78 |R{{ number_format($item->total_sold * $item->product->price, 2) }} | 79 |
| Time | 99 |Product | 100 |Amount | 101 |
|---|---|---|
| {{ $sale->sale_date->format('H:i') }} | 107 |{{ $sale->product->name }} | 108 |R{{ number_format($sale->total_amount, 2) }} | 109 |
Sales chart will be displayed here
128 | Integrate with Chart.js for visual analytics 129 |Export all products to a CSV file. This file can be opened in Excel or any spreadsheet application.
59 | 60 |Description: {{ $product->description ?? 'No description' }}
18 |Manufacturer: {{ $product->manufacturer ? $product->manufacturer->name : 'N/A' }}
19 |Expiry Date: {{ $product->expiry_date ? \Carbon\Carbon::parse($product->expiry_date)->format('M j, Y') : 'N/A' }}
20 |Supplier: {{ $product->supplier ? $product->supplier->company_name : 'N/A' }}
21 |Price: R{{ number_format($product->price, 2) }}
22 |No QR Code generated yet.
31 | 37 || Store Name | 59 |Location | 60 |Quantity | 61 |Delivered At | 62 |Expire Date | 63 |Actions | 64 |
|---|---|---|---|---|---|
| {{ $store->name }} | 70 |{{ $store->location }} | 71 |72 | 73 | {{ $store->pivot->quantity }} 74 | 75 | | 76 |{{ $store->pivot->delivered_at ? \Carbon\Carbon::parse($store->pivot->delivered_at)->format('M j, Y') : 'N/A' }} | 77 |{{ $store->pivot->expire_date ? \Carbon\Carbon::parse($store->pivot->expire_date)->format('M j, Y') : 'N/A' }} | 78 |79 | 80 | View Store 81 | 82 | | 83 |