@fleetbase/storefront-engine 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.php-cs-fixer.php +29 -0
- package/LICENSE.md +16 -4
- package/README.md +106 -13
- package/composer.json +88 -0
- package/extension.json +10 -0
- package/package.json +6 -6
- package/phpstan.neon.dist +8 -0
- package/phpunit.xml.dist +16 -0
- package/server/.gitattributes +14 -0
- package/server/README.md +40 -0
- package/server/config/api.php +101 -0
- package/server/config/database.connections.php +57 -0
- package/server/config/storefront.php +19 -0
- package/server/config/twilio-notification-channel.php +36 -0
- package/server/migrations/2023_05_03_025307_create_carts_table.php +44 -0
- package/server/migrations/2023_05_03_025307_create_checkouts_table.php +51 -0
- package/server/migrations/2023_05_03_025307_create_gateways_table.php +48 -0
- package/server/migrations/2023_05_03_025307_create_network_stores_table.php +36 -0
- package/server/migrations/2023_05_03_025307_create_networks_table.php +56 -0
- package/server/migrations/2023_05_03_025307_create_notification_channels_table.php +43 -0
- package/server/migrations/2023_05_03_025307_create_payment_methods_table.php +44 -0
- package/server/migrations/2023_05_03_025307_create_product_addon_categories_table.php +38 -0
- package/server/migrations/2023_05_03_025307_create_product_addons_table.php +43 -0
- package/server/migrations/2023_05_03_025307_create_product_hours_table.php +37 -0
- package/server/migrations/2023_05_03_025307_create_product_store_locations_table.php +34 -0
- package/server/migrations/2023_05_03_025307_create_product_variant_options_table.php +40 -0
- package/server/migrations/2023_05_03_025307_create_product_variants_table.php +44 -0
- package/server/migrations/2023_05_03_025307_create_products_table.php +59 -0
- package/server/migrations/2023_05_03_025307_create_reviews_table.php +41 -0
- package/server/migrations/2023_05_03_025307_create_store_hours_table.php +37 -0
- package/server/migrations/2023_05_03_025307_create_store_locations_table.php +38 -0
- package/server/migrations/2023_05_03_025307_create_stores_table.php +57 -0
- package/server/migrations/2023_05_03_025307_create_votes_table.php +39 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_carts_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_checkouts_table.php +48 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_gateways_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_network_stores_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_networks_table.php +42 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_notification_channels_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_payment_methods_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addon_categories_table.php +38 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addons_table.php +38 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_hours_table.php +32 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_store_locations_table.php +34 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variant_options_table.php +32 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variants_table.php +32 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_products_table.php +44 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_reviews_table.php +38 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_hours_table.php +32 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_locations_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_stores_table.php +42 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_votes_table.php +38 -0
- package/server/src/Auth/Schemas/Storefront.php +95 -0
- package/server/src/Console/Commands/NotifyStorefrontOrderNearby.php +86 -0
- package/server/src/Expansions/EntityExpansion.php +44 -0
- package/server/src/Http/Controllers/ActionController.php +119 -0
- package/server/src/Http/Controllers/AddonCategoryController.php +13 -0
- package/server/src/Http/Controllers/CustomerController.php +13 -0
- package/server/src/Http/Controllers/GatewayController.php +13 -0
- package/server/src/Http/Controllers/MetricsController.php +71 -0
- package/server/src/Http/Controllers/NetworkController.php +170 -0
- package/server/src/Http/Controllers/NotificationChannelController.php +13 -0
- package/server/src/Http/Controllers/OrderController.php +154 -0
- package/server/src/Http/Controllers/ProductAddonCategoryController.php +14 -0
- package/server/src/Http/Controllers/ProductAddonController.php +14 -0
- package/server/src/Http/Controllers/ProductController.php +123 -0
- package/server/src/Http/Controllers/ProductHourController.php +13 -0
- package/server/src/Http/Controllers/ProductVariantController.php +13 -0
- package/server/src/Http/Controllers/ProductVariantOptionController.php +13 -0
- package/server/src/Http/Controllers/ReviewController.php +13 -0
- package/server/src/Http/Controllers/StoreController.php +26 -0
- package/server/src/Http/Controllers/StoreHourController.php +13 -0
- package/server/src/Http/Controllers/StoreLocationController.php +13 -0
- package/server/src/Http/Controllers/StorefrontController.php +15 -0
- package/server/src/Http/Controllers/VoteController.php +13 -0
- package/server/src/Http/Controllers/v1/CartController.php +161 -0
- package/server/src/Http/Controllers/v1/CategoryController.php +138 -0
- package/server/src/Http/Controllers/v1/CheckoutController.php +957 -0
- package/server/src/Http/Controllers/v1/CustomerController.php +482 -0
- package/server/src/Http/Controllers/v1/GatewayControllerController.php +11 -0
- package/server/src/Http/Controllers/v1/NetworkController.php +281 -0
- package/server/src/Http/Controllers/v1/PaymentMethodController.php +11 -0
- package/server/src/Http/Controllers/v1/ProductController.php +94 -0
- package/server/src/Http/Controllers/v1/ReviewController.php +270 -0
- package/server/src/Http/Controllers/v1/ServiceQuoteController.php +402 -0
- package/server/src/Http/Controllers/v1/StoreController.php +176 -0
- package/server/src/Http/Filter/AddonCategoryFilter.php +19 -0
- package/server/src/Http/Filter/CustomerFilter.php +18 -0
- package/server/src/Http/Filter/GatewayFilter.php +13 -0
- package/server/src/Http/Filter/NetworkFilter.php +18 -0
- package/server/src/Http/Filter/NotificationChannelFilter.php +13 -0
- package/server/src/Http/Filter/OrderFilter.php +46 -0
- package/server/src/Http/Filter/ProductFilter.php +28 -0
- package/server/src/Http/Filter/StoreFilter.php +42 -0
- package/server/src/Http/Filter/StoreLocationFilter.php +23 -0
- package/server/src/Http/Middleware/SetStorefrontSession.php +130 -0
- package/server/src/Http/Requests/AddStoreToNetworkCategory.php +45 -0
- package/server/src/Http/Requests/CaptureOrderRequest.php +30 -0
- package/server/src/Http/Requests/CreateCustomerRequest.php +44 -0
- package/server/src/Http/Requests/CreateReviewRequest.php +34 -0
- package/server/src/Http/Requests/GetServiceQuoteFromCart.php +40 -0
- package/server/src/Http/Requests/InitializeCheckoutRequest.php +38 -0
- package/server/src/Http/Requests/NetworkActionRequest.php +43 -0
- package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +31 -0
- package/server/src/Http/Resources/Cart.php +31 -0
- package/server/src/Http/Resources/Category.php +48 -0
- package/server/src/Http/Resources/Customer.php +36 -0
- package/server/src/Http/Resources/Gateway.php +32 -0
- package/server/src/Http/Resources/Media.php +29 -0
- package/server/src/Http/Resources/Network.php +48 -0
- package/server/src/Http/Resources/Product.php +209 -0
- package/server/src/Http/Resources/Review.php +45 -0
- package/server/src/Http/Resources/ReviewCustomer.php +60 -0
- package/server/src/Http/Resources/Store.php +76 -0
- package/server/src/Http/Resources/StoreHour.php +29 -0
- package/server/src/Http/Resources/StoreLocation.php +33 -0
- package/server/src/Imports/ProductsImport.php +20 -0
- package/server/src/Jobs/DownloadProductImageUrl.php +60 -0
- package/server/src/Listeners/HandleOrderCompleted.php +31 -0
- package/server/src/Listeners/HandleOrderDispatched.php +34 -0
- package/server/src/Listeners/HandleOrderDriverAssigned.php +37 -0
- package/server/src/Listeners/HandleOrderStarted.php +27 -0
- package/server/src/Mail/StorefrontNetworkInvite.php +48 -0
- package/server/src/Models/AddonCategory.php +30 -0
- package/server/src/Models/Cart.php +691 -0
- package/server/src/Models/Checkout.php +166 -0
- package/server/src/Models/Customer.php +88 -0
- package/server/src/Models/Gateway.php +165 -0
- package/server/src/Models/Network.php +300 -0
- package/server/src/Models/NetworkStore.php +86 -0
- package/server/src/Models/NotificationChannel.php +147 -0
- package/server/src/Models/PaymentMethod.php +99 -0
- package/server/src/Models/Product.php +315 -0
- package/server/src/Models/ProductAddon.php +128 -0
- package/server/src/Models/ProductAddonCategory.php +90 -0
- package/server/src/Models/ProductHour.php +59 -0
- package/server/src/Models/ProductStoreLocation.php +77 -0
- package/server/src/Models/ProductVariant.php +125 -0
- package/server/src/Models/ProductVariantOption.php +86 -0
- package/server/src/Models/Review.php +127 -0
- package/server/src/Models/Store.php +478 -0
- package/server/src/Models/StoreHour.php +59 -0
- package/server/src/Models/StoreLocation.php +126 -0
- package/server/src/Models/StorefrontModel.php +22 -0
- package/server/src/Models/Vote.php +84 -0
- package/server/src/Notifications/StorefrontOrderCanceled.php +196 -0
- package/server/src/Notifications/StorefrontOrderCompleted.php +201 -0
- package/server/src/Notifications/StorefrontOrderCreated.php +157 -0
- package/server/src/Notifications/StorefrontOrderDriverAssigned.php +200 -0
- package/server/src/Notifications/StorefrontOrderEnroute.php +199 -0
- package/server/src/Notifications/StorefrontOrderNearby.php +201 -0
- package/server/src/Notifications/StorefrontOrderPreparing.php +202 -0
- package/server/src/Notifications/StorefrontOrderReadyForPickup.php +202 -0
- package/server/src/Observers/NetworkObserver.php +40 -0
- package/server/src/Observers/ProductObserver.php +118 -0
- package/server/src/Providers/EventServiceProvider.php +23 -0
- package/server/src/Providers/StorefrontServiceProvider.php +103 -0
- package/server/src/Support/Metrics.php +193 -0
- package/server/src/Support/OrderConfig.php +13 -0
- package/server/src/Support/QPay.php +208 -0
- package/server/src/Support/Storefront.php +201 -0
- package/server/src/routes.php +180 -0
- package/server/tests/Feature.php +5 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\Storefront\Http\Controllers;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\Storefront\Support\Metrics;
|
|
6
|
+
use Fleetbase\Http\Controllers\Controller;
|
|
7
|
+
use Illuminate\Http\Request;
|
|
8
|
+
|
|
9
|
+
class MetricsController extends Controller
|
|
10
|
+
{
|
|
11
|
+
public function all(Request $request)
|
|
12
|
+
{
|
|
13
|
+
$start = $request->date('start');
|
|
14
|
+
$end = $request->date('end');
|
|
15
|
+
$discover = $request->array('discover', []);
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
$data = Metrics::forCompany($request->user()->company, $start, $end)->with($discover)->get();
|
|
19
|
+
} catch (\Exception $e) {
|
|
20
|
+
return response()->error($e->getMessage());
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return response()->json($data);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public function dashboard(Request $request)
|
|
27
|
+
{
|
|
28
|
+
$start = $request->date('start');
|
|
29
|
+
$end = $request->date('end');
|
|
30
|
+
$discover = $request->array('discover', []);
|
|
31
|
+
$metrics = [];
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
$metrics = Metrics::forCompany($request->user()->company, $start, $end)->with($discover)->get();
|
|
35
|
+
} catch (\Exception $e) {
|
|
36
|
+
return response()->error($e->getMessage());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// metrics format map
|
|
40
|
+
$metricsFormats = [];
|
|
41
|
+
|
|
42
|
+
// dashboard config
|
|
43
|
+
$dashboardConfig = [
|
|
44
|
+
[
|
|
45
|
+
'size' => 12,
|
|
46
|
+
'title' => 'Storefront Metrics',
|
|
47
|
+
'classList' => [],
|
|
48
|
+
'component' => null,
|
|
49
|
+
'queryParams' => [
|
|
50
|
+
'start' => ['component' => 'date-picker'],
|
|
51
|
+
'end' => ['component' => 'date-picker'],
|
|
52
|
+
],
|
|
53
|
+
'widgets' => collect($metrics)
|
|
54
|
+
->map(function ($value, $key) use ($metricsFormats) {
|
|
55
|
+
return [
|
|
56
|
+
'component' => 'count',
|
|
57
|
+
'options' => [
|
|
58
|
+
'format' => $metricsFormats[$key] ?? null,
|
|
59
|
+
'title' => str_replace('_', ' ', \Illuminate\Support\Str::title($key)),
|
|
60
|
+
'value' => $value
|
|
61
|
+
]
|
|
62
|
+
];
|
|
63
|
+
})
|
|
64
|
+
->values()
|
|
65
|
+
->toArray()
|
|
66
|
+
]
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
return response()->json(array_values($dashboardConfig));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\Storefront\Http\Controllers;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\Storefront\Http\Requests\AddStoreToNetworkCategory;
|
|
6
|
+
use Fleetbase\Storefront\Http\Requests\NetworkActionRequest;
|
|
7
|
+
use Fleetbase\Storefront\Mail\StorefrontNetworkInvite;
|
|
8
|
+
use Fleetbase\Storefront\Models\Network;
|
|
9
|
+
use Fleetbase\Storefront\Models\NetworkStore;
|
|
10
|
+
use Fleetbase\Models\Category;
|
|
11
|
+
use Fleetbase\Models\Invite;
|
|
12
|
+
use Fleetbase\FleetOps\Support\Utils;
|
|
13
|
+
use Illuminate\Support\Facades\Mail;
|
|
14
|
+
use Illuminate\Support\Str;
|
|
15
|
+
|
|
16
|
+
class NetworkController extends StorefrontController
|
|
17
|
+
{
|
|
18
|
+
/**
|
|
19
|
+
* The resource to query
|
|
20
|
+
*
|
|
21
|
+
* @var string
|
|
22
|
+
*/
|
|
23
|
+
public $resource = 'networks';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Find network by public_id or invitation code.
|
|
27
|
+
*
|
|
28
|
+
* @param string $id
|
|
29
|
+
* @return \Illuminate\Http\Response
|
|
30
|
+
*/
|
|
31
|
+
public function findNetwork(string $id)
|
|
32
|
+
{
|
|
33
|
+
$id = trim($id);
|
|
34
|
+
$isPublicId = Str::startsWith($id, ['storefront_network_', 'network_']);
|
|
35
|
+
|
|
36
|
+
if ($isPublicId) {
|
|
37
|
+
$network = Network::where('public_id', $id)->first();
|
|
38
|
+
} else {
|
|
39
|
+
$invite = Invite::where(['uri' => $id, 'reason' => 'join_storefront_network'])->with(['subject'])->first();
|
|
40
|
+
|
|
41
|
+
if ($invite) {
|
|
42
|
+
$network = $invite->subject;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return response()->json($network);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Add stores to a network.
|
|
51
|
+
*
|
|
52
|
+
* @param string $id
|
|
53
|
+
* @param \Fleetbase\Storefront\Http\Requests\NetworkActionRequest $request
|
|
54
|
+
* @return \Illuminate\Http\Response
|
|
55
|
+
*/
|
|
56
|
+
public function sendInvites(string $id, NetworkActionRequest $request)
|
|
57
|
+
{
|
|
58
|
+
$network = Network::find($id);
|
|
59
|
+
$recipients = $request->input('recipients', []);
|
|
60
|
+
|
|
61
|
+
// create invitation
|
|
62
|
+
$invitation = Invite::create([
|
|
63
|
+
'company_uuid' => session('company'),
|
|
64
|
+
'created_by_uuid' => session('user'),
|
|
65
|
+
'subject_uuid' => $network->uuid,
|
|
66
|
+
'subject_type' => Utils::getMutationType($network),
|
|
67
|
+
'protocol' => 'email',
|
|
68
|
+
'recipients' => $recipients,
|
|
69
|
+
'reason' => 'join_storefront_network'
|
|
70
|
+
]);
|
|
71
|
+
|
|
72
|
+
// make sure subject is set
|
|
73
|
+
$invitation->setRelation('subject', $network);
|
|
74
|
+
$invitation->setRelation('createdBy', $request->user());
|
|
75
|
+
|
|
76
|
+
// send invite
|
|
77
|
+
Mail::send(new StorefrontNetworkInvite($invitation));
|
|
78
|
+
|
|
79
|
+
return response()->json(['status' => 'ok']);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Add stores to a network.
|
|
84
|
+
*
|
|
85
|
+
* @param string $id
|
|
86
|
+
* @param \Fleetbase\Storefront\Http\Requests\NetworkActionRequest $request
|
|
87
|
+
* @return \Illuminate\Http\Response
|
|
88
|
+
*/
|
|
89
|
+
public function addStores(string $id, NetworkActionRequest $request)
|
|
90
|
+
{
|
|
91
|
+
$network = Network::find($id);
|
|
92
|
+
$stores = collect($request->input('stores', []));
|
|
93
|
+
$remove = collect($request->input('remove', []));
|
|
94
|
+
|
|
95
|
+
// firstOrCreate each
|
|
96
|
+
foreach ($stores as $storeId) {
|
|
97
|
+
NetworkStore::firstOrCreate(
|
|
98
|
+
['network_uuid' => $network->uuid, 'store_uuid' => $storeId],
|
|
99
|
+
['network_uuid' => $network->uuid, 'store_uuid' => $storeId]
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// delete each
|
|
104
|
+
foreach ($remove as $storeId) {
|
|
105
|
+
NetworkStore::where('store_uuid', $storeId)->delete();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return response()->json(['status' => 'ok']);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Remove stores from a network.
|
|
113
|
+
*
|
|
114
|
+
* @param string $id
|
|
115
|
+
* @param \Fleetbase\Storefront\Http\Requests\NetworkActionRequest $request
|
|
116
|
+
* @return \Illuminate\Http\Response
|
|
117
|
+
*/
|
|
118
|
+
public function removeStores(string $id, NetworkActionRequest $request)
|
|
119
|
+
{
|
|
120
|
+
$stores = collect($request->input('stores', []));
|
|
121
|
+
|
|
122
|
+
// delete each
|
|
123
|
+
foreach ($stores as $storeId) {
|
|
124
|
+
NetworkStore::where(['store_uuid' => $storeId, 'network_uuid' => $id])->delete();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return response()->json(['status' => 'ok']);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Remove stores to a network.
|
|
132
|
+
*
|
|
133
|
+
* @param string $id
|
|
134
|
+
* @param \Fleetbase\Storefront\Http\Requests\AddStoreToNetworkCategory $request
|
|
135
|
+
* @return \Illuminate\Http\Response
|
|
136
|
+
*/
|
|
137
|
+
public function addStoreToCategory(string $id, AddStoreToNetworkCategory $request)
|
|
138
|
+
{
|
|
139
|
+
$category = $request->input('category');
|
|
140
|
+
$store = $request->input('store');
|
|
141
|
+
|
|
142
|
+
// get network store instance
|
|
143
|
+
$networkStore = NetworkStore::where(['network_uuid' => $id, 'store_uuid' => $store])->first();
|
|
144
|
+
|
|
145
|
+
if ($networkStore) {
|
|
146
|
+
$networkStore->update(['category_uuid' => $category]);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return response()->json(['status' => 'ok']);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Remove stores to a network.
|
|
153
|
+
*
|
|
154
|
+
* @param string $id
|
|
155
|
+
* @param \Fleetbase\Storefront\Http\Requests\NetworkActionRequest $request
|
|
156
|
+
* @return \Illuminate\Http\Response
|
|
157
|
+
*/
|
|
158
|
+
public function deleteCategory(string $id, NetworkActionRequest $request)
|
|
159
|
+
{
|
|
160
|
+
$category = $request->input('category');
|
|
161
|
+
|
|
162
|
+
// get network store instance
|
|
163
|
+
NetworkStore::where(['network_uuid' => $id, 'category_uuid' => $category])->update(['category_uuid' => null]);
|
|
164
|
+
|
|
165
|
+
// delete the category
|
|
166
|
+
Category::where(['owner_uuid' => $id, 'uuid' => $category])->delete();
|
|
167
|
+
|
|
168
|
+
return response()->json(['status' => 'ok']);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\Storefront\Http\Controllers;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\FleetOps\Models\Order;
|
|
6
|
+
use Fleetbase\FleetOps\Http\Controllers\Internal\v1\OrderController as FleetbaseOrderController;
|
|
7
|
+
use Fleetbase\Storefront\Notifications\StorefrontOrderPreparing;
|
|
8
|
+
use Illuminate\Http\Request;
|
|
9
|
+
|
|
10
|
+
class OrderController extends FleetbaseOrderController
|
|
11
|
+
{
|
|
12
|
+
/**
|
|
13
|
+
* The resource to query
|
|
14
|
+
*
|
|
15
|
+
* @var string
|
|
16
|
+
*/
|
|
17
|
+
public $resource = 'order';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The filter to use
|
|
21
|
+
*
|
|
22
|
+
* @var \Fleetbase\Http\Filter\Filter
|
|
23
|
+
*/
|
|
24
|
+
public $filter = \Fleetbase\Storefront\Http\Filter\OrderFilter::class;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Accept an order by incrementing status to preparing.
|
|
28
|
+
*
|
|
29
|
+
* @param \Illuminate\Http\Request $request
|
|
30
|
+
* @return \Illuminate\Http\Response
|
|
31
|
+
*/
|
|
32
|
+
public function acceptOrder(Request $request)
|
|
33
|
+
{
|
|
34
|
+
$order = Order::where('uuid', $request->order)->whereNull('deleted_at')->with(['customer'])->first();
|
|
35
|
+
|
|
36
|
+
if (!$order) {
|
|
37
|
+
return response()->json([
|
|
38
|
+
'error' => 'No order to accept!'
|
|
39
|
+
], 400);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// update activity to prepating
|
|
43
|
+
$order->updateStatus('preparing');
|
|
44
|
+
$order->customer->notify(new StorefrontOrderPreparing($order));
|
|
45
|
+
|
|
46
|
+
return response()->json([
|
|
47
|
+
'status' => 'ok',
|
|
48
|
+
'order' => $order->public_id,
|
|
49
|
+
'status' => $order->status
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Accept an order by incrementing status to preparing.
|
|
55
|
+
*
|
|
56
|
+
* @param \Illuminate\Http\Request $request
|
|
57
|
+
* @return \Illuminate\Http\Response
|
|
58
|
+
*/
|
|
59
|
+
public function markOrderAsReady(Request $request)
|
|
60
|
+
{
|
|
61
|
+
$adhoc = $request->boolean('adhoc');
|
|
62
|
+
$driver = $request->input('driver');
|
|
63
|
+
/** @var \Fleetbase\Models\Order $order */
|
|
64
|
+
$order = Order::where('uuid', $request->order)->whereNull('deleted_at')->with(['customer'])->first();
|
|
65
|
+
|
|
66
|
+
if (!$order) {
|
|
67
|
+
return response()->json([
|
|
68
|
+
'error' => 'No order to update!'
|
|
69
|
+
], 400);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if ($order->isMeta('is_pickup')) {
|
|
73
|
+
$order->updateStatus('ready');
|
|
74
|
+
|
|
75
|
+
return response()->json([
|
|
76
|
+
'status' => 'ok',
|
|
77
|
+
'order' => $order->public_id,
|
|
78
|
+
'status' => $order->status
|
|
79
|
+
]);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// toggle order to adhoc
|
|
83
|
+
if ($order->adhoc === false && $adhoc === true) {
|
|
84
|
+
$order->update(['adhoc' => true]);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// if driver then assign driver
|
|
88
|
+
if ($driver) {
|
|
89
|
+
$order->assignDriver($driver);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// update activity to dispatched
|
|
93
|
+
$order->updateStatus('dispatched');
|
|
94
|
+
|
|
95
|
+
return response()->json([
|
|
96
|
+
'status' => 'ok',
|
|
97
|
+
'order' => $order->public_id,
|
|
98
|
+
'status' => $order->status
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Accept an order by incrementing status to preparing.
|
|
104
|
+
*
|
|
105
|
+
* @param \Illuminate\Http\Request $request
|
|
106
|
+
* @return \Illuminate\Http\Response
|
|
107
|
+
*/
|
|
108
|
+
public function markOrderAsCompleted(Request $request)
|
|
109
|
+
{
|
|
110
|
+
/** @var Order */
|
|
111
|
+
$order = Order::where('uuid', $request->order)->whereNull('deleted_at')->with(['customer'])->first();
|
|
112
|
+
|
|
113
|
+
if (!$order) {
|
|
114
|
+
return response()->json([
|
|
115
|
+
'error' => 'No order to update!'
|
|
116
|
+
], 400);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// update activity to completed
|
|
120
|
+
$order->updateStatus('completed');
|
|
121
|
+
|
|
122
|
+
return response()->json([
|
|
123
|
+
'status' => 'ok',
|
|
124
|
+
'order' => $order->public_id,
|
|
125
|
+
'status' => $order->status
|
|
126
|
+
]);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Reject order and notify customer order is rejected/canceled.
|
|
131
|
+
*
|
|
132
|
+
* @param \Illuminate\Http\Request $request
|
|
133
|
+
* @return \Illuminate\Http\Response
|
|
134
|
+
*/
|
|
135
|
+
public function rejectOrder(Request $request)
|
|
136
|
+
{
|
|
137
|
+
$order = Order::where('uuid', $request->order)->whereNull('deleted_at')->with(['customer'])->first();
|
|
138
|
+
|
|
139
|
+
if (!$order) {
|
|
140
|
+
return response()->json([
|
|
141
|
+
'error' => 'No order to cancel!'
|
|
142
|
+
], 400);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// update activity to dispatched
|
|
146
|
+
$order->updateStatus('cancel');
|
|
147
|
+
|
|
148
|
+
return response()->json([
|
|
149
|
+
'status' => 'ok',
|
|
150
|
+
'order' => $order->public_id,
|
|
151
|
+
'status' => $order->status
|
|
152
|
+
]);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\Storefront\Http\Controllers;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\Storefront\Imports\ProductsImport;
|
|
6
|
+
use Fleetbase\Storefront\Jobs\DownloadProductImageUrl;
|
|
7
|
+
use Fleetbase\Storefront\Models\Product;
|
|
8
|
+
use Fleetbase\Storefront\Models\Store;
|
|
9
|
+
use Fleetbase\Models\Category;
|
|
10
|
+
use Fleetbase\Models\File;
|
|
11
|
+
use Fleetbase\FleetOps\Support\Utils;
|
|
12
|
+
use Maatwebsite\Excel\Facades\Excel;
|
|
13
|
+
use Illuminate\Http\Request;
|
|
14
|
+
use Illuminate\Support\Arr;
|
|
15
|
+
use Illuminate\Support\Str;
|
|
16
|
+
|
|
17
|
+
class ProductController extends StorefrontController
|
|
18
|
+
{
|
|
19
|
+
/**
|
|
20
|
+
* The resource to query
|
|
21
|
+
*
|
|
22
|
+
* @var string
|
|
23
|
+
*/
|
|
24
|
+
public $resource = 'product';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* List all activity options for current order.
|
|
28
|
+
*
|
|
29
|
+
* @param \Illuminate\Http\Request $request
|
|
30
|
+
* @return \Illuminate\Http\Response
|
|
31
|
+
*/
|
|
32
|
+
public function processImports(Request $request)
|
|
33
|
+
{
|
|
34
|
+
$disk = env('FILESYSTEM_DRIVER');
|
|
35
|
+
$store = $request->input('store');
|
|
36
|
+
$category = $request->input('category');
|
|
37
|
+
$files = $request->input('files');
|
|
38
|
+
$files = File::whereIn('uuid', $files)->get();
|
|
39
|
+
$validFileTypes = ['csv', 'tsv', 'xls', 'xlsx'];
|
|
40
|
+
$imports = collect();
|
|
41
|
+
|
|
42
|
+
if ($category) {
|
|
43
|
+
$category = Category::find($category);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if ($store) {
|
|
47
|
+
$store = Store::find($store);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
foreach ($files as $file) {
|
|
51
|
+
// validate file type
|
|
52
|
+
if (!Str::endsWith($file->path, $validFileTypes)) {
|
|
53
|
+
return response()->error('Invalid file uploaded, must be one of the following: ' . implode(', ', $validFileTypes));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
$data = Excel::toArray(new ProductsImport(), $file->path, $disk);
|
|
58
|
+
} catch (\Exception $e) {
|
|
59
|
+
return response()->error('Invalid file, unable to proccess.');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
$data = Arr::first($data);
|
|
63
|
+
$imports = $imports->merge($data);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// track imported products
|
|
67
|
+
$products = [];
|
|
68
|
+
|
|
69
|
+
foreach ($imports as $row) {
|
|
70
|
+
if (empty($row) || empty(array_values($row))) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// $importId = (string) Str::uuid();
|
|
75
|
+
$name = Utils::or($row, ['name', 'product_name', 'entry_name', 'entity_name', 'entity', 'item_name', 'item', 'service', 'service_name']);
|
|
76
|
+
$description = Utils::or($row, ['description', 'product_description', 'details', 'info', 'about', 'item_description']);
|
|
77
|
+
$tags = Utils::or($row, ['tags']);
|
|
78
|
+
$sku = Utils::or($row, ['sku', 'internal_id', 'stock_number']);
|
|
79
|
+
$price = Utils::or($row, ['price', 'cost', 'value']);
|
|
80
|
+
$salePrice = Utils::or($row, ['sale_price', 'sale_cost', 'sale_value']);
|
|
81
|
+
$isService = Utils::or($row, ['is_service'], false);
|
|
82
|
+
$isBookable = Utils::or($row, ['is_bookable', 'bookable'], false);
|
|
83
|
+
$isOnSale = Utils::or($row, ['on_sale', 'is_on_sale'], false);
|
|
84
|
+
$isAvailable = Utils::or($row, ['available', 'is_available'], true);
|
|
85
|
+
$isRecommended = Utils::or($row, ['recommended', 'is_recommended'], false);
|
|
86
|
+
$canPickup = Utils::or($row, ['can_pickup', 'is_pickup', 'is_pickup_only'], false);
|
|
87
|
+
$youtubeUrls = Utils::or($row, ['youtube', 'youtube_urls', 'youtube_videos']);
|
|
88
|
+
$images = Utils::or($row, ['photos', 'images', 'image', 'photo', 'primary_image', 'product_image', 'thumbnail', 'photo1', 'image1']);
|
|
89
|
+
|
|
90
|
+
$products[] = $product = Product::create(
|
|
91
|
+
[
|
|
92
|
+
'company_uuid' => $request->session()->get('company'),
|
|
93
|
+
'created_by_uuid' => $request->session()->get('user'),
|
|
94
|
+
'store_uuid' => $store->uuid,
|
|
95
|
+
'name' => Utils::unicodeDecode($name),
|
|
96
|
+
'description' => Utils::unicodeDecode($description),
|
|
97
|
+
'sku' => $sku,
|
|
98
|
+
'tags' => explode(',', $tags),
|
|
99
|
+
'youtube_urls' => explode(',', $youtubeUrls),
|
|
100
|
+
'price' => $price,
|
|
101
|
+
'sale_price' => $salePrice,
|
|
102
|
+
'currency' => $store->currency,
|
|
103
|
+
'is_service' => $isService,
|
|
104
|
+
'is_bookable' => $isBookable,
|
|
105
|
+
'is_on_sale' => $isOnSale,
|
|
106
|
+
'is_available' => $isAvailable,
|
|
107
|
+
'is_recommended' => $isRecommended,
|
|
108
|
+
'can_pickup' => $canPickup,
|
|
109
|
+
'category_uuid' => $category ? $category->uuid : null,
|
|
110
|
+
'status' => 'published'
|
|
111
|
+
]
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
$images = explode(',', $images);
|
|
115
|
+
|
|
116
|
+
foreach ($images as $imageUrl) {
|
|
117
|
+
dispatch(new DownloadProductImageUrl($product, $imageUrl));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return response()->json($products);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\Storefront\Http\Controllers;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\Storefront\Models\Store;
|
|
6
|
+
use Illuminate\Http\Request;
|
|
7
|
+
|
|
8
|
+
class StoreController extends StorefrontController
|
|
9
|
+
{
|
|
10
|
+
/**
|
|
11
|
+
* The resource to query
|
|
12
|
+
*
|
|
13
|
+
* @var string
|
|
14
|
+
*/
|
|
15
|
+
public $resource = 'store';
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
public function allStores(Request $request)
|
|
19
|
+
{
|
|
20
|
+
$stores = Store::select(['uuid', 'name', 'description', 'created_at'])
|
|
21
|
+
->withoutRelations()->where('company_uuid', $request->session()->get('company'))
|
|
22
|
+
->get();
|
|
23
|
+
|
|
24
|
+
return response()->json(['stores' => $stores]);
|
|
25
|
+
}
|
|
26
|
+
}
|