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