@fleetbase/storefront-engine 0.1.7 → 0.1.8

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.
Files changed (307) hide show
  1. package/.php-cs-fixer.php +29 -0
  2. package/LICENSE.md +16 -4
  3. package/README.md +106 -13
  4. package/app/adapters/addon-category.js +1 -1
  5. package/app/adapters/gateway.js +1 -1
  6. package/app/adapters/network.js +1 -1
  7. package/app/adapters/notification-channel.js +1 -1
  8. package/app/adapters/product-addon-category.js +1 -1
  9. package/app/adapters/product-addon.js +1 -1
  10. package/app/adapters/product-hour.js +1 -1
  11. package/app/adapters/product-store-location.js +1 -1
  12. package/app/adapters/product-variant-option.js +1 -1
  13. package/app/adapters/product-variant.js +1 -1
  14. package/app/adapters/product.js +1 -1
  15. package/app/adapters/store-hour.js +1 -1
  16. package/app/adapters/store-location.js +1 -1
  17. package/app/adapters/store.js +1 -1
  18. package/app/adapters/storefront.js +1 -1
  19. package/app/components/file-record.js +1 -1
  20. package/app/components/modals/add-store-hours.js +1 -1
  21. package/app/components/modals/add-store-to-category.js +1 -1
  22. package/app/components/modals/add-stores-to-network.js +1 -1
  23. package/app/components/modals/assign-driver.js +1 -1
  24. package/app/components/modals/create-first-store.js +1 -1
  25. package/app/components/modals/create-gateway.js +1 -1
  26. package/app/components/modals/create-network-category.js +1 -1
  27. package/app/components/modals/create-network.js +1 -1
  28. package/app/components/modals/create-new-variant.js +1 -1
  29. package/app/components/modals/create-notification-channel.js +1 -1
  30. package/app/components/modals/create-product-category.js +1 -1
  31. package/app/components/modals/create-store.js +1 -1
  32. package/app/components/modals/edit-network.js +1 -1
  33. package/app/components/modals/import-products.js +1 -1
  34. package/app/components/modals/incoming-order.js +1 -1
  35. package/app/components/modals/manage-addons.js +1 -1
  36. package/app/components/modals/order-ready-assign-driver.js +1 -1
  37. package/app/components/modals/select-addon-category.js +1 -1
  38. package/app/components/modals/share-network.js +1 -1
  39. package/app/components/modals/store-details.js +1 -1
  40. package/app/components/modals/store-form.js +1 -1
  41. package/app/components/modals/store-location-form.js +1 -1
  42. package/app/components/network-category-picker.js +1 -1
  43. package/app/components/order-card.js +1 -1
  44. package/app/components/schedule-manager.js +1 -1
  45. package/app/components/settings-container.js +1 -1
  46. package/app/components/store-selector.js +1 -1
  47. package/app/components/widget/customers.js +1 -1
  48. package/app/components/widget/orders.js +1 -1
  49. package/app/components/widget/storefront-metrics.js +1 -1
  50. package/app/controllers/application.js +1 -1
  51. package/app/controllers/customers/index.js +1 -1
  52. package/app/controllers/home.js +1 -1
  53. package/app/controllers/networks/index/network/customers.js +1 -1
  54. package/app/controllers/networks/index/network/index.js +1 -1
  55. package/app/controllers/networks/index/network/orders.js +1 -1
  56. package/app/controllers/networks/index/network/stores.js +1 -1
  57. package/app/controllers/networks/index/network.js +1 -1
  58. package/app/controllers/networks/index.js +1 -1
  59. package/app/controllers/orders/index.js +1 -1
  60. package/app/controllers/products/index/category/edit.js +1 -1
  61. package/app/controllers/products/index/category/new.js +1 -1
  62. package/app/controllers/products/index/category.js +1 -1
  63. package/app/controllers/products/index/index/edit.js +1 -1
  64. package/app/controllers/products/index/index.js +1 -1
  65. package/app/controllers/products/index.js +1 -1
  66. package/app/controllers/settings/api.js +1 -1
  67. package/app/controllers/settings/gateways.js +1 -1
  68. package/app/controllers/settings/index.js +1 -1
  69. package/app/controllers/settings/locations.js +1 -1
  70. package/app/controllers/settings/notifications.js +1 -1
  71. package/app/helpers/get-tip-amount.js +1 -1
  72. package/app/models/addon-category.js +1 -1
  73. package/app/models/gateway.js +1 -1
  74. package/app/models/network.js +1 -1
  75. package/app/models/notification-channel.js +1 -1
  76. package/app/models/product-addon-category.js +1 -1
  77. package/app/models/product-addon.js +1 -1
  78. package/app/models/product-hour.js +1 -1
  79. package/app/models/product-store-location.js +1 -1
  80. package/app/models/product-variant-option.js +1 -1
  81. package/app/models/product-variant.js +1 -1
  82. package/app/models/product.js +1 -1
  83. package/app/models/store-hour.js +1 -1
  84. package/app/models/store-location.js +1 -1
  85. package/app/models/store.js +1 -1
  86. package/app/routes/application.js +1 -1
  87. package/app/routes/customers/index/edit.js +1 -1
  88. package/app/routes/customers/index.js +1 -1
  89. package/app/routes/home.js +1 -1
  90. package/app/routes/networks/index/network/customers.js +1 -1
  91. package/app/routes/networks/index/network/index.js +1 -1
  92. package/app/routes/networks/index/network/orders.js +1 -1
  93. package/app/routes/networks/index/network/stores.js +1 -1
  94. package/app/routes/networks/index/network.js +1 -1
  95. package/app/routes/networks/index.js +1 -1
  96. package/app/routes/orders/index/edit.js +1 -1
  97. package/app/routes/orders/index/new.js +1 -1
  98. package/app/routes/orders/index/view.js +1 -1
  99. package/app/routes/orders/index.js +1 -1
  100. package/app/routes/products/index/category/edit.js +1 -1
  101. package/app/routes/products/index/category/new.js +1 -1
  102. package/app/routes/products/index/category.js +1 -1
  103. package/app/routes/products/index/index/edit.js +1 -1
  104. package/app/routes/products/index/index.js +1 -1
  105. package/app/routes/products/index.js +1 -1
  106. package/app/routes/settings/api.js +1 -1
  107. package/app/routes/settings/gateways.js +1 -1
  108. package/app/routes/settings/index.js +1 -1
  109. package/app/routes/settings/locations.js +1 -1
  110. package/app/routes/settings/notifications.js +1 -1
  111. package/app/serializers/addon-category.js +1 -1
  112. package/app/serializers/network.js +1 -1
  113. package/app/serializers/notification-channel.js +1 -1
  114. package/app/serializers/product-addon-category.js +1 -1
  115. package/app/serializers/product-variant.js +1 -1
  116. package/app/serializers/product.js +1 -1
  117. package/app/serializers/store-location.js +1 -1
  118. package/app/serializers/store.js +1 -1
  119. package/app/services/storefront.js +1 -1
  120. package/app/templates/customers/index/edit.js +1 -1
  121. package/app/templates/customers/index.js +1 -1
  122. package/app/templates/home.js +1 -1
  123. package/app/templates/networks/index/network/customers.js +1 -1
  124. package/app/templates/networks/index/network/index.js +1 -1
  125. package/app/templates/networks/index/network/orders.js +1 -1
  126. package/app/templates/networks/index/network/stores.js +1 -1
  127. package/app/templates/networks/index/network.js +1 -1
  128. package/app/templates/networks/index.js +1 -1
  129. package/app/templates/orders/index/edit.js +1 -1
  130. package/app/templates/orders/index/new.js +1 -1
  131. package/app/templates/orders/index/view.js +1 -1
  132. package/app/templates/orders/index.js +1 -1
  133. package/app/templates/products/index/category/edit.js +1 -1
  134. package/app/templates/products/index/category/new.js +1 -1
  135. package/app/templates/products/index/category.js +1 -1
  136. package/app/templates/products/index/index/edit.js +1 -1
  137. package/app/templates/products/index/index.js +1 -1
  138. package/app/templates/products/index.js +1 -1
  139. package/app/templates/settings/api.js +1 -1
  140. package/app/templates/settings/gateways.js +1 -1
  141. package/app/templates/settings/index.js +1 -1
  142. package/app/templates/settings/locations.js +1 -1
  143. package/app/templates/settings/notifications.js +1 -1
  144. package/app/templates/settings.js +1 -1
  145. package/app/utils/create-shareable-link.js +1 -1
  146. package/app/utils/get-gateway-schemas.js +1 -1
  147. package/app/utils/get-notification-schemas.js +1 -1
  148. package/composer.json +88 -0
  149. package/extension.json +10 -0
  150. package/package.json +6 -6
  151. package/phpstan.neon.dist +8 -0
  152. package/phpunit.xml.dist +16 -0
  153. package/server/.gitattributes +14 -0
  154. package/server/README.md +40 -0
  155. package/server/config/api.php +101 -0
  156. package/server/config/database.connections.php +57 -0
  157. package/server/config/storefront.php +19 -0
  158. package/server/config/twilio-notification-channel.php +36 -0
  159. package/server/migrations/2023_05_03_025307_create_carts_table.php +44 -0
  160. package/server/migrations/2023_05_03_025307_create_checkouts_table.php +51 -0
  161. package/server/migrations/2023_05_03_025307_create_gateways_table.php +48 -0
  162. package/server/migrations/2023_05_03_025307_create_network_stores_table.php +36 -0
  163. package/server/migrations/2023_05_03_025307_create_networks_table.php +56 -0
  164. package/server/migrations/2023_05_03_025307_create_notification_channels_table.php +43 -0
  165. package/server/migrations/2023_05_03_025307_create_payment_methods_table.php +44 -0
  166. package/server/migrations/2023_05_03_025307_create_product_addon_categories_table.php +38 -0
  167. package/server/migrations/2023_05_03_025307_create_product_addons_table.php +43 -0
  168. package/server/migrations/2023_05_03_025307_create_product_hours_table.php +37 -0
  169. package/server/migrations/2023_05_03_025307_create_product_store_locations_table.php +34 -0
  170. package/server/migrations/2023_05_03_025307_create_product_variant_options_table.php +40 -0
  171. package/server/migrations/2023_05_03_025307_create_product_variants_table.php +44 -0
  172. package/server/migrations/2023_05_03_025307_create_products_table.php +59 -0
  173. package/server/migrations/2023_05_03_025307_create_reviews_table.php +41 -0
  174. package/server/migrations/2023_05_03_025307_create_store_hours_table.php +37 -0
  175. package/server/migrations/2023_05_03_025307_create_store_locations_table.php +38 -0
  176. package/server/migrations/2023_05_03_025307_create_stores_table.php +57 -0
  177. package/server/migrations/2023_05_03_025307_create_votes_table.php +39 -0
  178. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_carts_table.php +40 -0
  179. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_checkouts_table.php +48 -0
  180. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_gateways_table.php +40 -0
  181. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_network_stores_table.php +40 -0
  182. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_networks_table.php +42 -0
  183. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_notification_channels_table.php +40 -0
  184. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_payment_methods_table.php +40 -0
  185. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addon_categories_table.php +38 -0
  186. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addons_table.php +38 -0
  187. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_hours_table.php +32 -0
  188. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_store_locations_table.php +34 -0
  189. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variant_options_table.php +32 -0
  190. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variants_table.php +32 -0
  191. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_products_table.php +44 -0
  192. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_reviews_table.php +38 -0
  193. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_hours_table.php +32 -0
  194. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_locations_table.php +40 -0
  195. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_stores_table.php +42 -0
  196. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_votes_table.php +38 -0
  197. package/server/src/Auth/Schemas/Storefront.php +95 -0
  198. package/server/src/Console/Commands/NotifyStorefrontOrderNearby.php +86 -0
  199. package/server/src/Expansions/EntityExpansion.php +44 -0
  200. package/server/src/Http/Controllers/ActionController.php +119 -0
  201. package/server/src/Http/Controllers/AddonCategoryController.php +13 -0
  202. package/server/src/Http/Controllers/CustomerController.php +13 -0
  203. package/server/src/Http/Controllers/GatewayController.php +13 -0
  204. package/server/src/Http/Controllers/MetricsController.php +71 -0
  205. package/server/src/Http/Controllers/NetworkController.php +170 -0
  206. package/server/src/Http/Controllers/NotificationChannelController.php +13 -0
  207. package/server/src/Http/Controllers/OrderController.php +154 -0
  208. package/server/src/Http/Controllers/ProductAddonCategoryController.php +14 -0
  209. package/server/src/Http/Controllers/ProductAddonController.php +14 -0
  210. package/server/src/Http/Controllers/ProductController.php +123 -0
  211. package/server/src/Http/Controllers/ProductHourController.php +13 -0
  212. package/server/src/Http/Controllers/ProductVariantController.php +13 -0
  213. package/server/src/Http/Controllers/ProductVariantOptionController.php +13 -0
  214. package/server/src/Http/Controllers/ReviewController.php +13 -0
  215. package/server/src/Http/Controllers/StoreController.php +26 -0
  216. package/server/src/Http/Controllers/StoreHourController.php +13 -0
  217. package/server/src/Http/Controllers/StoreLocationController.php +13 -0
  218. package/server/src/Http/Controllers/StorefrontController.php +15 -0
  219. package/server/src/Http/Controllers/VoteController.php +13 -0
  220. package/server/src/Http/Controllers/v1/CartController.php +161 -0
  221. package/server/src/Http/Controllers/v1/CategoryController.php +138 -0
  222. package/server/src/Http/Controllers/v1/CheckoutController.php +957 -0
  223. package/server/src/Http/Controllers/v1/CustomerController.php +482 -0
  224. package/server/src/Http/Controllers/v1/GatewayControllerController.php +11 -0
  225. package/server/src/Http/Controllers/v1/NetworkController.php +281 -0
  226. package/server/src/Http/Controllers/v1/PaymentMethodController.php +11 -0
  227. package/server/src/Http/Controllers/v1/ProductController.php +94 -0
  228. package/server/src/Http/Controllers/v1/ReviewController.php +270 -0
  229. package/server/src/Http/Controllers/v1/ServiceQuoteController.php +402 -0
  230. package/server/src/Http/Controllers/v1/StoreController.php +176 -0
  231. package/server/src/Http/Filter/AddonCategoryFilter.php +19 -0
  232. package/server/src/Http/Filter/CustomerFilter.php +18 -0
  233. package/server/src/Http/Filter/GatewayFilter.php +13 -0
  234. package/server/src/Http/Filter/NetworkFilter.php +18 -0
  235. package/server/src/Http/Filter/NotificationChannelFilter.php +13 -0
  236. package/server/src/Http/Filter/OrderFilter.php +46 -0
  237. package/server/src/Http/Filter/ProductFilter.php +28 -0
  238. package/server/src/Http/Filter/StoreFilter.php +42 -0
  239. package/server/src/Http/Filter/StoreLocationFilter.php +23 -0
  240. package/server/src/Http/Middleware/SetStorefrontSession.php +130 -0
  241. package/server/src/Http/Requests/AddStoreToNetworkCategory.php +45 -0
  242. package/server/src/Http/Requests/CaptureOrderRequest.php +30 -0
  243. package/server/src/Http/Requests/CreateCustomerRequest.php +44 -0
  244. package/server/src/Http/Requests/CreateReviewRequest.php +34 -0
  245. package/server/src/Http/Requests/GetServiceQuoteFromCart.php +40 -0
  246. package/server/src/Http/Requests/InitializeCheckoutRequest.php +38 -0
  247. package/server/src/Http/Requests/NetworkActionRequest.php +43 -0
  248. package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +31 -0
  249. package/server/src/Http/Resources/Cart.php +31 -0
  250. package/server/src/Http/Resources/Category.php +48 -0
  251. package/server/src/Http/Resources/Customer.php +36 -0
  252. package/server/src/Http/Resources/Gateway.php +32 -0
  253. package/server/src/Http/Resources/Media.php +29 -0
  254. package/server/src/Http/Resources/Network.php +48 -0
  255. package/server/src/Http/Resources/Product.php +209 -0
  256. package/server/src/Http/Resources/Review.php +45 -0
  257. package/server/src/Http/Resources/ReviewCustomer.php +60 -0
  258. package/server/src/Http/Resources/Store.php +76 -0
  259. package/server/src/Http/Resources/StoreHour.php +29 -0
  260. package/server/src/Http/Resources/StoreLocation.php +33 -0
  261. package/server/src/Imports/ProductsImport.php +20 -0
  262. package/server/src/Jobs/DownloadProductImageUrl.php +60 -0
  263. package/server/src/Listeners/HandleOrderCompleted.php +31 -0
  264. package/server/src/Listeners/HandleOrderDispatched.php +34 -0
  265. package/server/src/Listeners/HandleOrderDriverAssigned.php +37 -0
  266. package/server/src/Listeners/HandleOrderStarted.php +27 -0
  267. package/server/src/Mail/StorefrontNetworkInvite.php +48 -0
  268. package/server/src/Models/AddonCategory.php +30 -0
  269. package/server/src/Models/Cart.php +691 -0
  270. package/server/src/Models/Checkout.php +166 -0
  271. package/server/src/Models/Customer.php +88 -0
  272. package/server/src/Models/Gateway.php +165 -0
  273. package/server/src/Models/Network.php +300 -0
  274. package/server/src/Models/NetworkStore.php +86 -0
  275. package/server/src/Models/NotificationChannel.php +147 -0
  276. package/server/src/Models/PaymentMethod.php +99 -0
  277. package/server/src/Models/Product.php +315 -0
  278. package/server/src/Models/ProductAddon.php +128 -0
  279. package/server/src/Models/ProductAddonCategory.php +90 -0
  280. package/server/src/Models/ProductHour.php +59 -0
  281. package/server/src/Models/ProductStoreLocation.php +77 -0
  282. package/server/src/Models/ProductVariant.php +125 -0
  283. package/server/src/Models/ProductVariantOption.php +86 -0
  284. package/server/src/Models/Review.php +127 -0
  285. package/server/src/Models/Store.php +478 -0
  286. package/server/src/Models/StoreHour.php +59 -0
  287. package/server/src/Models/StoreLocation.php +126 -0
  288. package/server/src/Models/StorefrontModel.php +22 -0
  289. package/server/src/Models/Vote.php +84 -0
  290. package/server/src/Notifications/StorefrontOrderCanceled.php +196 -0
  291. package/server/src/Notifications/StorefrontOrderCompleted.php +201 -0
  292. package/server/src/Notifications/StorefrontOrderCreated.php +157 -0
  293. package/server/src/Notifications/StorefrontOrderDriverAssigned.php +200 -0
  294. package/server/src/Notifications/StorefrontOrderEnroute.php +199 -0
  295. package/server/src/Notifications/StorefrontOrderNearby.php +201 -0
  296. package/server/src/Notifications/StorefrontOrderPreparing.php +202 -0
  297. package/server/src/Notifications/StorefrontOrderReadyForPickup.php +202 -0
  298. package/server/src/Observers/NetworkObserver.php +40 -0
  299. package/server/src/Observers/ProductObserver.php +118 -0
  300. package/server/src/Providers/EventServiceProvider.php +23 -0
  301. package/server/src/Providers/StorefrontServiceProvider.php +103 -0
  302. package/server/src/Support/Metrics.php +193 -0
  303. package/server/src/Support/OrderConfig.php +13 -0
  304. package/server/src/Support/QPay.php +208 -0
  305. package/server/src/Support/Storefront.php +201 -0
  306. package/server/src/routes.php +180 -0
  307. package/server/tests/Feature.php +5 -0
@@ -0,0 +1,119 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers;
4
+
5
+ use Fleetbase\Http\Controllers\Controller;
6
+ use Fleetbase\FleetOps\Models\Contact;
7
+ use Fleetbase\FleetOps\Models\Order;
8
+ use Fleetbase\Storefront\Models\Store;
9
+ use Illuminate\Http\Request;
10
+ use Illuminate\Support\Carbon;
11
+
12
+ class ActionController extends Controller
13
+ {
14
+ public function welcome()
15
+ {
16
+ return response()->json(['message' => 'Hello Friend!']);
17
+ }
18
+
19
+ /**
20
+ * Get the number of storefronts created.
21
+ *
22
+ * @param \Illuminate\Http\Request $request
23
+ * @return \Illuminate\Http\Response
24
+ */
25
+ public function getStoreCount(Request $request)
26
+ {
27
+ $count = Store::where('company_uuid', session('company'))->count();
28
+
29
+ return response()->json(['storeCount' => $count]);
30
+ }
31
+
32
+ /**
33
+ * Get key metrics for storefront.
34
+ *
35
+ * @param \Illuminate\Http\Request $request
36
+ * @return \Illuminate\Http\Response
37
+ */
38
+ public function getMetrics(Request $request)
39
+ {
40
+ $store = $request->input('store');
41
+ $start = $request->has('start') ? Carbon::fromString($request->input('start'))->toDateTimeString() : Carbon::now()->startOfMonth()->toDateTimeString();
42
+ $end = $request->has('end') ? Carbon::fromString($request->input('end'))->toDateTimeString() : Carbon::now()->toDateTimeString();
43
+
44
+ // default metrics
45
+ $metrics = [
46
+ 'orders_count' => 0,
47
+ 'customers_count' => 0,
48
+ 'stores_count' => 0,
49
+ 'earnings_sum' => 0
50
+ ];
51
+
52
+ // get the current active store
53
+ if (!$store) {
54
+ return response()->json($metrics);
55
+ }
56
+
57
+ $store = Store::where('uuid', $store)->first();
58
+
59
+ if (!$store) {
60
+ return response()->json($metrics);
61
+ }
62
+
63
+ /**
64
+ * Query metrics between given time period
65
+ */
66
+
67
+ // send back currency
68
+ $metrics['currency'] = $store->currency;
69
+
70
+ // - orders count
71
+ $metrics['orders_count'] = Order::where([
72
+ 'company_uuid' => session('company'),
73
+ 'type' => 'storefront'
74
+ ])
75
+ ->where('meta->storefront_id', $store->public_id)
76
+ ->whereNotIn('status', ['canceled'])
77
+ ->whereBetween('created_at', [$start, $end])->count();
78
+
79
+ // - customers count -- change to where has orders where meta->storefront_id === store
80
+ $metrics['customers_count'] = Contact::where([
81
+ 'company_uuid' => session('company'),
82
+ 'type' => 'customer'
83
+ ])->whereHas('customerOrders', function ($q) use ($start, $end, $store) {
84
+ $q->whereBetween('created_at', [$start, $end]);
85
+ $q->where('meta->storefront_id', $store->public_id);
86
+ $q->whereNotIn('status', ['canceled']);
87
+ })->count();
88
+
89
+ // - stores count
90
+ $metrics['stores_count'] = Store::where(['company_uuid' => session('company')])->count();
91
+
92
+ // - earnings sum
93
+ // $metrics['earnings_sum'] = Transaction::where(['company_uuid' => session('company'), 'type' => 'storefront', 'meta->storefront_id' => $store->public_id])->whereBetween('created_at', [$start, $end])->sum('amount');
94
+ $metrics['earnings_sum'] = Order::where([
95
+ 'company_uuid' => session('company'),
96
+ 'type' => 'storefront'
97
+ ])
98
+ ->whereBetween('created_at', [$start, $end])
99
+ ->where('meta->storefront_id', $store->public_id)
100
+ ->with(['transaction'])
101
+ ->whereNotIn('status', ['canceled'])
102
+ ->get()
103
+ ->sum(function ($order) {
104
+ return $order->transaction->amount;
105
+ });
106
+
107
+ response()->json($metrics);
108
+ }
109
+
110
+ /**
111
+ * CORS OPTIONS.
112
+ *
113
+ * @return \Illuminate\Http\Response
114
+ */
115
+ public function options()
116
+ {
117
+ return response()->json(['status' => 'ok']);
118
+ }
119
+ }
@@ -0,0 +1,13 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers;
4
+
5
+ class AddonCategoryController extends StorefrontController
6
+ {
7
+ /**
8
+ * The resource to query
9
+ *
10
+ * @var string
11
+ */
12
+ public $resource = 'addon_category';
13
+ }
@@ -0,0 +1,13 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers;
4
+
5
+ class CustomerController extends StorefrontController
6
+ {
7
+ /**
8
+ * The resource to query
9
+ *
10
+ * @var string
11
+ */
12
+ public $resource = 'customer';
13
+ }
@@ -0,0 +1,13 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers;
4
+
5
+ class GatewayController extends StorefrontController
6
+ {
7
+ /**
8
+ * The resource to query
9
+ *
10
+ * @var string
11
+ */
12
+ public $resource = 'gateway';
13
+ }
@@ -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,13 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers;
4
+
5
+ class NotificationChannelController extends StorefrontController
6
+ {
7
+ /**
8
+ * The resource to query
9
+ *
10
+ * @var string
11
+ */
12
+ public $resource = 'notification_channel';
13
+ }
@@ -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,14 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers;
4
+
5
+
6
+ class ProductAddonCategoryController extends StorefrontController
7
+ {
8
+ /**
9
+ * The resource to query
10
+ *
11
+ * @var string
12
+ */
13
+ public $resource = 'product_addon_category';
14
+ }
@@ -0,0 +1,14 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers;
4
+
5
+
6
+ class ProductAddonController extends StorefrontController
7
+ {
8
+ /**
9
+ * The resource to query
10
+ *
11
+ * @var string
12
+ */
13
+ public $resource = 'product_addons';
14
+ }