@fleetbase/fleetops-engine 0.4.16 → 0.4.18

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 (225) hide show
  1. package/.php-cs-fixer.php +2 -0
  2. package/addon/components/activity-event-selector.hbs +35 -0
  3. package/addon/components/activity-event-selector.js +85 -0
  4. package/addon/components/activity-form-panel.hbs +23 -0
  5. package/addon/components/activity-form-panel.js +90 -0
  6. package/addon/components/activity-logic-builder.hbs +80 -0
  7. package/addon/components/activity-logic-builder.js +260 -0
  8. package/addon/components/contact-form-panel.hbs +1 -1
  9. package/addon/components/contact-panel.hbs +1 -1
  10. package/addon/components/custom-entity-form-panel.hbs +43 -0
  11. package/addon/components/custom-entity-form-panel.js +129 -0
  12. package/addon/components/custom-field-form-panel/options-input.hbs +12 -0
  13. package/addon/components/custom-field-form-panel/options-input.js +139 -0
  14. package/addon/components/custom-field-form-panel.hbs +77 -0
  15. package/addon/components/custom-field-form-panel.js +144 -0
  16. package/addon/components/custom-field.hbs +63 -41
  17. package/addon/components/custom-field.js +123 -25
  18. package/addon/components/driver-form-panel.hbs +1 -1
  19. package/addon/components/driver-panel.hbs +1 -1
  20. package/addon/components/edit-order-route-panel.hbs +1 -1
  21. package/addon/components/fleet-form-panel.hbs +1 -1
  22. package/addon/components/fleet-panel.hbs +1 -1
  23. package/addon/components/fuel-report-form-panel.hbs +1 -1
  24. package/addon/components/fuel-report-panel.hbs +1 -1
  25. package/addon/components/issue-form-panel.hbs +1 -1
  26. package/addon/components/issue-panel.hbs +1 -1
  27. package/addon/components/joint-graph.hbs +1 -0
  28. package/addon/components/joint-graph.js +103 -0
  29. package/addon/components/layout/fleet-ops-sidebar.hbs +3 -3
  30. package/addon/components/layout/fleet-ops-sidebar.js +1 -0
  31. package/addon/components/live-map.js +71 -28
  32. package/addon/components/modals/new-custom-field-group.hbs +5 -0
  33. package/addon/components/modals/new-order-config.hbs +3 -3
  34. package/addon/components/modals/order-new-activity.hbs +1 -1
  35. package/addon/components/order-config-manager/activity-flow.hbs +11 -0
  36. package/addon/components/order-config-manager/activity-flow.js +964 -0
  37. package/addon/components/order-config-manager/custom-fields.hbs +50 -0
  38. package/addon/components/order-config-manager/custom-fields.js +276 -0
  39. package/addon/components/order-config-manager/details.hbs +23 -0
  40. package/addon/components/order-config-manager/details.js +106 -0
  41. package/addon/components/order-config-manager/entities.hbs +54 -0
  42. package/addon/components/order-config-manager/entities.js +227 -0
  43. package/addon/components/order-config-manager-overlay.hbs +26 -0
  44. package/addon/components/order-config-manager-overlay.js +60 -0
  45. package/addon/components/order-config-manager.hbs +15 -0
  46. package/addon/components/order-config-manager.js +298 -0
  47. package/addon/components/order-flow.hbs +1 -0
  48. package/addon/components/order-flow.js +3 -0
  49. package/addon/components/place-form-panel.hbs +1 -1
  50. package/addon/components/place-panel.hbs +1 -1
  51. package/addon/components/vehicle-form-panel.hbs +1 -1
  52. package/addon/components/vehicle-panel.hbs +1 -1
  53. package/addon/components/vendor-form-panel.hbs +1 -1
  54. package/addon/components/vendor-panel.hbs +1 -1
  55. package/addon/controllers/application.js +5 -1
  56. package/addon/controllers/operations/order-config.js +43 -0
  57. package/addon/controllers/operations/orders/index/new.js +125 -21
  58. package/addon/controllers/operations/orders/index/view.js +87 -4
  59. package/addon/controllers/operations/orders/index.js +2 -2
  60. package/addon/engine.js +10 -1
  61. package/addon/initializers/load-jointjs.js +16 -0
  62. package/addon/routes/application.js +1 -1
  63. package/addon/routes/operations/order-config.js +28 -0
  64. package/addon/routes/operations/orders/index/new.js +2 -3
  65. package/addon/routes/operations/orders/index/view.js +1 -1
  66. package/addon/routes.js +1 -0
  67. package/addon/services/context-panel.js +65 -3
  68. package/addon/styles/fleetops-engine.css +268 -0
  69. package/addon/templates/application.hbs +1 -1
  70. package/addon/templates/operations/order-config.hbs +55 -0
  71. package/addon/templates/operations/orders/index/new.hbs +98 -339
  72. package/addon/templates/operations/orders/index/view.hbs +36 -96
  73. package/addon/templates/operations/orders/index.hbs +0 -1
  74. package/addon/utils/apply-context-component-arguments.js +4 -2
  75. package/addon/utils/create-custom-entity.js +22 -0
  76. package/addon/utils/create-flow-activity.js +31 -0
  77. package/addon/utils/get-custom-field-type-map.js +34 -0
  78. package/app/components/activity-event-selector.js +1 -0
  79. package/app/components/activity-form-panel.js +1 -0
  80. package/app/components/activity-logic-builder.js +1 -0
  81. package/app/components/custom-entity-form-panel.js +1 -0
  82. package/app/components/custom-field-form-panel/options-input.js +1 -0
  83. package/app/components/custom-field-form-panel.js +1 -0
  84. package/app/components/joint-graph.js +1 -0
  85. package/app/components/modals/new-custom-field-group.js +1 -0
  86. package/app/components/order-config-manager/activity-flow.js +1 -0
  87. package/app/components/order-config-manager/custom-fields.js +1 -0
  88. package/app/components/order-config-manager/details.js +1 -0
  89. package/app/components/order-config-manager/entities.js +1 -0
  90. package/app/components/order-config-manager-overlay.js +1 -0
  91. package/app/components/order-config-manager.js +1 -0
  92. package/app/components/order-flow.js +1 -0
  93. package/app/controllers/operations/order-config.js +1 -0
  94. package/app/routes/operations/order-config.js +1 -0
  95. package/app/templates/operations/order-config.js +1 -0
  96. package/app/utils/create-custom-entity.js +1 -0
  97. package/app/utils/create-flow-activity.js +1 -0
  98. package/app/utils/get-custom-field-type-map.js +1 -0
  99. package/composer.json +4 -3
  100. package/config/environment.js +1 -0
  101. package/extension.json +1 -1
  102. package/index.js +20 -0
  103. package/package.json +7 -5
  104. package/server/config/api.php +3 -650
  105. package/server/migrations/2023_04_27_053456_create_contacts_table.php +1 -2
  106. package/server/migrations/2023_04_27_053456_create_drivers_table.php +1 -2
  107. package/server/migrations/2023_04_27_053456_create_entities_table.php +1 -2
  108. package/server/migrations/2023_04_27_053456_create_fleet_drivers_table.php +1 -2
  109. package/server/migrations/2023_04_27_053456_create_fleets_table.php +1 -2
  110. package/server/migrations/2023_04_27_053456_create_fuel_reports_table.php +1 -2
  111. package/server/migrations/2023_04_27_053456_create_integrated_vendors_table.php +1 -2
  112. package/server/migrations/2023_04_27_053456_create_issues_table.php +1 -2
  113. package/server/migrations/2023_04_27_053456_create_orders_table.php +1 -2
  114. package/server/migrations/2023_04_27_053456_create_payloads_table.php +1 -2
  115. package/server/migrations/2023_04_27_053456_create_places_table.php +1 -2
  116. package/server/migrations/2023_04_27_053456_create_positions_table.php +1 -2
  117. package/server/migrations/2023_04_27_053456_create_proofs_table.php +1 -2
  118. package/server/migrations/2023_04_27_053456_create_purchase_rates_table.php +1 -2
  119. package/server/migrations/2023_04_27_053456_create_routes_table.php +1 -2
  120. package/server/migrations/2023_04_27_053456_create_service_areas_table.php +1 -2
  121. package/server/migrations/2023_04_27_053456_create_service_quote_items_table.php +1 -2
  122. package/server/migrations/2023_04_27_053456_create_service_quotes_table.php +1 -2
  123. package/server/migrations/2023_04_27_053456_create_service_rate_fees_table.php +1 -2
  124. package/server/migrations/2023_04_27_053456_create_service_rate_parcel_fees_table.php +1 -2
  125. package/server/migrations/2023_04_27_053456_create_service_rates_table.php +1 -2
  126. package/server/migrations/2023_04_27_053456_create_tracking_numbers_table.php +1 -2
  127. package/server/migrations/2023_04_27_053456_create_tracking_statuses_table.php +1 -2
  128. package/server/migrations/2023_04_27_053456_create_vehicles_table.php +1 -2
  129. package/server/migrations/2023_04_27_053456_create_vendors_table.php +1 -2
  130. package/server/migrations/2023_04_27_053456_create_waypoints_table.php +1 -2
  131. package/server/migrations/2023_04_27_053456_create_zones_table.php +1 -2
  132. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_companies_table.php +1 -2
  133. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_contacts_table.php +1 -2
  134. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_drivers_table.php +1 -2
  135. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_entities_table.php +1 -2
  136. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleet_drivers_table.php +1 -2
  137. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleets_table.php +1 -2
  138. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fuel_reports_table.php +1 -2
  139. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_integrated_vendors_table.php +1 -2
  140. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_issues_table.php +1 -2
  141. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_orders_table.php +1 -2
  142. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_payloads_table.php +1 -2
  143. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_places_table.php +1 -2
  144. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_positions_table.php +1 -2
  145. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_proofs_table.php +1 -2
  146. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_purchase_rates_table.php +1 -2
  147. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_routes_table.php +1 -2
  148. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_areas_table.php +1 -2
  149. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quote_items_table.php +1 -2
  150. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quotes_table.php +1 -2
  151. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_fees_table.php +1 -2
  152. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_parcel_fees_table.php +1 -2
  153. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rates_table.php +1 -2
  154. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_numbers_table.php +1 -2
  155. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_statuses_table.php +1 -2
  156. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vehicles_table.php +1 -2
  157. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vendors_table.php +1 -2
  158. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_waypoints_table.php +1 -2
  159. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_zones_table.php +1 -2
  160. package/server/migrations/2023_09_14_074512_update_vehicles_table.php +1 -2
  161. package/server/migrations/2023_09_14_074619_create_vehicle_devices_table.php +35 -36
  162. package/server/migrations/2023_09_26_071205_add_online_column_to_vehicles_table.php +1 -2
  163. package/server/migrations/2023_09_26_083957_create_fleet_vehicles_table.php +1 -2
  164. package/server/migrations/2023_09_27_023757_add_column_to_fleets_table.php +1 -2
  165. package/server/migrations/2023_10_05_074811_update_vehicle.php +1 -2
  166. package/server/migrations/2023_10_25_093014_create_vehicle_device_events_table.php +1 -2
  167. package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +1 -2
  168. package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +1 -2
  169. package/server/migrations/2023_11_09_041807_add_status_column_to_fuel_reports_table.php +1 -2
  170. package/server/migrations/2023_11_15_062814_add_comments_column_and_resolved_at_column_to_vehicle_device_events_table.php +1 -2
  171. package/server/migrations/2023_11_17_053001_add_category_uuid_to_entities_table.php +1 -2
  172. package/server/migrations/2023_11_28_074244_add_supplier_uuid_column_to_entities_table.php +1 -2
  173. package/server/migrations/2023_12_14_100209_add_meta_column_on_driver_table copy.php +1 -2
  174. package/server/migrations/2024_02_18_100209_add_avatar_url_columns_table.php +3 -4
  175. package/server/migrations/2024_02_27_093648_create_order_configs_table.php +43 -0
  176. package/server/migrations/2024_03_07_075508_add_order_config_uuid_column_to_orders_table.php +28 -0
  177. package/server/migrations/2024_03_12_033527_add_public_id_column_to_order_configs_table.php +34 -0
  178. package/server/seeders/OrderConfigSeeder.php +23 -0
  179. package/server/src/Casts/OrderConfigEntities.php +53 -0
  180. package/server/src/Console/Commands/FixLegacyOrderConfigs.php +66 -0
  181. package/server/src/Events/DriverLocationChanged.php +1 -1
  182. package/server/src/Events/DriverSimulatedLocationChanged.php +1 -1
  183. package/server/src/Flow/Activity.php +232 -6
  184. package/server/src/Flow/Condition.php +84 -0
  185. package/server/src/Flow/Event.php +88 -0
  186. package/server/src/Flow/Flow.php +50 -0
  187. package/server/src/Flow/FlowResource.php +143 -0
  188. package/server/src/Flow/Logic.php +57 -1
  189. package/server/src/Http/Controllers/Api/v1/DriverController.php +2 -2
  190. package/server/src/Http/Controllers/Api/v1/IssueController.php +132 -0
  191. package/server/src/Http/Controllers/Api/v1/OrderController.php +152 -57
  192. package/server/src/Http/Controllers/Api/v1/OrganizationController.php +27 -0
  193. package/server/src/Http/Controllers/Api/v1/PlaceController.php +2 -3
  194. package/server/src/Http/Controllers/Controller.php +9 -0
  195. package/server/src/Http/Controllers/FleetOpsController.php +7 -0
  196. package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +40 -233
  197. package/server/src/Http/Controllers/Internal/v1/OrderController.php +58 -28
  198. package/server/src/Http/Controllers/Internal/v1/SettingController.php +20 -0
  199. package/server/src/Http/Filter/OrderConfigFilter.php +13 -0
  200. package/server/src/Http/Requests/CreateIssueRequest.php +19 -0
  201. package/server/src/Http/Requests/Internal/CreateOrderConfigRequest.php +40 -0
  202. package/server/src/Http/Requests/Internal/CreateOrderRequest.php +66 -0
  203. package/server/src/Http/Requests/Internal/DeleteOrderConfigRequest.php +0 -0
  204. package/server/src/Http/Requests/UpdateIssueRequest.php +7 -0
  205. package/server/src/Http/Resources/v1/Order.php +3 -0
  206. package/server/src/Listeners/HandleOrderCanceled.php +8 -4
  207. package/server/src/Listeners/HandleOrderDispatched.php +14 -12
  208. package/server/src/Models/Order.php +527 -31
  209. package/server/src/Models/OrderConfig.php +467 -0
  210. package/server/src/Models/Payload.php +6 -7
  211. package/server/src/Notifications/OrderAssigned.php +1 -1
  212. package/server/src/Notifications/OrderCanceled.php +1 -1
  213. package/server/src/Notifications/OrderDispatchFailed.php +1 -1
  214. package/server/src/Notifications/OrderDispatched.php +1 -1
  215. package/server/src/Notifications/OrderPing.php +1 -1
  216. package/server/src/Observers/CompanyObserver.php +20 -0
  217. package/server/src/Providers/FleetOpsServiceProvider.php +4 -1
  218. package/server/src/Providers/NotificationServiceProvider.php +2 -1
  219. package/server/src/Support/FleetOps.php +137 -0
  220. package/server/src/Support/Utils.php +17 -0
  221. package/server/src/Traits/HasTrackingNumber.php +9 -9
  222. package/server/src/routes.php +19 -11
  223. package/translations/en-us.yaml +137 -0
  224. package/server/src/Flow/Config.php +0 -7
  225. package/server/src/Support/Flow.php +0 -653
@@ -0,0 +1,132 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Requests\CreateIssueRequest;
6
+ use Fleetbase\FleetOps\Http\Requests\UpdateIssueRequest;
7
+ use Fleetbase\FleetOps\Http\Resources\v1\Issue as DeletedIssue;
8
+ use Fleetbase\FleetOps\Http\Resources\v1\Issue as IssueResource;
9
+ use Fleetbase\FleetOps\Models\Driver;
10
+ use Fleetbase\FleetOps\Models\Issue;
11
+ use Fleetbase\Http\Controllers\Controller;
12
+ use Illuminate\Http\Request;
13
+
14
+ class IssueController extends Controller
15
+ {
16
+ /**
17
+ * Creates a new Fleetbase Issue resource.
18
+ *
19
+ * @param \Fleetbase\Http\Requests\CreateIssueRequest $request
20
+ *
21
+ * @return \Fleetbase\Http\Resources\Entity
22
+ */
23
+ public function createRecord(CreateIssueRequest $request)
24
+ {
25
+ // get request input
26
+ $input = $request->only([
27
+ 'driver',
28
+ 'location',
29
+ 'category',
30
+ 'type',
31
+ 'report',
32
+ 'priority',
33
+ ]);
34
+
35
+ // Find driver who is reporting
36
+ try {
37
+ $driver = Driver::findRecordOrFail($request->input('driver'));
38
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
39
+ return response()->json(
40
+ [
41
+ 'error' => 'Driver reporting issue not found.',
42
+ ],
43
+ 404
44
+ );
45
+ }
46
+
47
+ // get the user uuid
48
+ $input['driver_uuid'] = $driver->uuid;
49
+ $input['reported_by_uuid'] = $driver->user_uuid;
50
+ $input['vehicle_uuid'] = $driver->vehicle_uuid;
51
+
52
+ // create the entity
53
+ $entity = Issue::create($input);
54
+
55
+ // response the driver resource
56
+ return new IssueResource($entity);
57
+ }
58
+
59
+ /**
60
+ * Updates new Fleetbase Issue resource.
61
+ *
62
+ * @param string $id
63
+ * @param \Fleetbase\Http\Requests\UpdateIssueRequest $request
64
+ *
65
+ * @return \Fleetbase\Http\Resources\Issue
66
+ */
67
+ public function updateRecord($id, UpdateIssueRequest $request)
68
+ {
69
+ // find for the issue
70
+ try {
71
+ $issue = Issue::findRecordOrFail($id);
72
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
73
+ return response()->json(
74
+ [
75
+ 'error' => 'Issue resource not found.',
76
+ ],
77
+ 404
78
+ );
79
+ }
80
+
81
+ $input = $request->only([
82
+ 'category',
83
+ 'type',
84
+ 'report',
85
+ 'priority',
86
+ ]);
87
+
88
+ // update the issue
89
+ $issue->update($input);
90
+
91
+ // response the issue resource
92
+ return new IssueResource($issue);
93
+ }
94
+
95
+ /**
96
+ * Query for Fleetbase Issue resources.
97
+ *
98
+ * @return \Fleetbase\Http\Resources\FleetCollection
99
+ */
100
+ public function queryRecord(Request $request)
101
+ {
102
+ $results = Issue::queryWithRequest($request);
103
+
104
+ return IssueResource::collection($results);
105
+ }
106
+
107
+ /**
108
+ * Deletes a Fleetbase Issue resources.
109
+ *
110
+ * @return \Fleetbase\Http\Resources\FleetCollection
111
+ */
112
+ public function deleteRecord($id)
113
+ {
114
+ // find for the driver
115
+ try {
116
+ $issue = Issue::findRecordOrFail($id);
117
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
118
+ return response()->json(
119
+ [
120
+ 'error' => 'Issue resource not found.',
121
+ ],
122
+ 404
123
+ );
124
+ }
125
+
126
+ // delete the issue
127
+ $issue->delete();
128
+
129
+ // response the issue resource
130
+ return new DeletedIssue($issue);
131
+ }
132
+ }
@@ -5,6 +5,7 @@ namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
5
5
  use Fleetbase\FleetOps\Events\OrderDispatchFailed;
6
6
  use Fleetbase\FleetOps\Events\OrderReady;
7
7
  use Fleetbase\FleetOps\Events\OrderStarted;
8
+ use Fleetbase\FleetOps\Flow\Activity;
8
9
  use Fleetbase\FleetOps\Http\Requests\CreateOrderRequest;
9
10
  use Fleetbase\FleetOps\Http\Requests\ScheduleOrderRequest;
10
11
  use Fleetbase\FleetOps\Http\Requests\UpdateOrderRequest;
@@ -14,12 +15,12 @@ use Fleetbase\FleetOps\Http\Resources\v1\Proof as ProofResource;
14
15
  use Fleetbase\FleetOps\Models\Driver;
15
16
  use Fleetbase\FleetOps\Models\Entity;
16
17
  use Fleetbase\FleetOps\Models\Order;
18
+ use Fleetbase\FleetOps\Models\OrderConfig;
17
19
  use Fleetbase\FleetOps\Models\Payload;
18
20
  use Fleetbase\FleetOps\Models\Place;
19
21
  use Fleetbase\FleetOps\Models\Proof;
20
22
  use Fleetbase\FleetOps\Models\ServiceQuote;
21
23
  use Fleetbase\FleetOps\Models\Waypoint;
22
- use Fleetbase\FleetOps\Support\Flow;
23
24
  use Fleetbase\FleetOps\Support\Utils;
24
25
  use Fleetbase\Http\Controllers\Controller;
25
26
  use Fleetbase\Models\Company;
@@ -35,14 +36,24 @@ class OrderController extends Controller
35
36
  /**
36
37
  * Creates a new Fleetbase Order resource.
37
38
  *
38
- * @param \Illuminate\Http\Request|\Fleetbase\Http\Requests\CreateOrderRequest $request
39
+ * @param Request|\Fleetbase\Http\Requests\CreateOrderRequest $request
39
40
  *
40
41
  * @return \Fleetbase\Http\Resources\Order
41
42
  */
42
43
  public function create(CreateOrderRequest $request)
43
44
  {
44
45
  // get request input
45
- $input = $request->only(['internal_id', 'payload', 'service_quote', 'purchase_rate', 'adhoc', 'adhoc_distance', 'pod_method', 'pod_required', 'scheduled_at', 'type', 'status', 'meta', 'notes']);
46
+ $input = $request->only(['internal_id', 'payload', 'service_quote', 'purchase_rate', 'adhoc', 'adhoc_distance', 'pod_method', 'pod_required', 'scheduled_at', 'status', 'meta', 'notes']);
47
+
48
+ // Get order config
49
+ $orderConfig = OrderConfig::resolveFromIdentifier($request->only(['type', 'order_config']));
50
+ if (!$orderConfig) {
51
+ return response()->apiError('Invalid order `type` or `order_config` provided.');
52
+ }
53
+
54
+ // Set order config to input
55
+ $input['order_config_uuid'] = $orderConfig->uuid;
56
+ $input['type'] = $orderConfig->key;
46
57
 
47
58
  // make sure company is set
48
59
  $input['company_uuid'] = session('company');
@@ -779,23 +790,21 @@ class OrderController extends Controller
779
790
  return response()->apiError('No driver assigned to order.');
780
791
  }
781
792
 
782
- // get the next order activity
783
- $flow = $activity = Flow::getNextActivity($order);
793
+ // Get the order config
794
+ $orderConfig = $order->config();
795
+
796
+ // Get the order started activity
797
+ $activity = $orderConfig->getStartedActivity();
784
798
 
785
- // order is not dispatched if next activity code is dispatch or order is not flagged as dispatched
786
- $isNotDispatched = $activity['code'] === 'dispatched' || $order->isNotDispatched;
799
+ // Order is not dispatched if next activity code is dispatch or order is not flagged as dispatched
800
+ $isNotDispatched = $order->isNotDispatched;
787
801
 
788
- // if order is not dispatched yet $activity['code'] === 'dispatched' || $order->dispatched === true
802
+ // If order is not dispatched yet $activity->is('dispatched') || $order->dispatched === true
789
803
  // and not skipping throw order not dispatched error
790
804
  if ($isNotDispatched && !$skipDispatch) {
791
805
  return response()->apiError('Order has not been dispatched yet and cannot be started.');
792
806
  }
793
807
 
794
- // if we're going to skip the dispatch get the next activity status and flow and continue
795
- if ($isNotDispatched && $skipDispatch) {
796
- $flow = $activity = Flow::getAfterNextActivity($order);
797
- }
798
-
799
808
  // set order to started
800
809
  $order->started = true;
801
810
  $order->started_at = now();
@@ -816,7 +825,7 @@ class OrderController extends Controller
816
825
  $order->setRelation('payload', $payload);
817
826
 
818
827
  // update order activity
819
- $updateActivityRequest = new Request(['activity' => $flow]);
828
+ $updateActivityRequest = new Request(['activity' => $activity->serialize()]);
820
829
 
821
830
  // update activity
822
831
  return $this->updateActivity($order, $updateActivityRequest);
@@ -869,15 +878,20 @@ class OrderController extends Controller
869
878
  return response()->apiError('Order is already completed.');
870
879
  }
871
880
 
872
- $activity = $request->input('activity', Flow::getNextActivity($order));
881
+ // Get the order config
882
+ $orderConfig = $order->config();
883
+ $activity = $request->array('activity');
884
+ if (!Utils::isActivity($activity)) {
885
+ $activity = new Activity($activity, $order->getConfigFlow());
886
+ }
873
887
 
874
888
  // if we're going to skip the dispatch get the next activity status and flow and continue
875
- if (is_array($activity) && $activity['code'] === 'dispatched' && $skipDispatch) {
876
- $activity = Flow::getAfterNextActivity($order);
889
+ if (Utils::isActivity($activity) && $activity->is('dispatched') && $skipDispatch) {
890
+ $activity = $orderConfig->getStartedActivity();
877
891
  }
878
892
 
879
893
  // handle pickup/dropoff order activity update as normal
880
- if (is_array($activity) && $activity['code'] === 'dispatched') {
894
+ if (Utils::isActivity($activity) && $activity->is('dispatched')) {
881
895
  // make sure driver is assigned if not trigger failed dispatch
882
896
  if (!$order->hasDriverAssigned && !$order->adhoc) {
883
897
  event(new OrderDispatchFailed($order, 'No driver assigned for order to dispatch to.'));
@@ -898,7 +912,7 @@ class OrderController extends Controller
898
912
  $order->payload->setFirstWaypoint($activity, $location);
899
913
  }
900
914
 
901
- if (is_array($activity) && $activity['code'] === 'completed' && $order->payload->isMultipleDropOrder) {
915
+ if (Utils::isActivity($activity) && $activity->completesOrder() && $order->payload->isMultipleDropOrder) {
902
916
  // confirm every waypoint is completed
903
917
  $isCompleted = $order->payload->waypointMarkers->every(function ($waypoint) {
904
918
  return $waypoint->status_code === 'COMPLETED';
@@ -921,24 +935,26 @@ class OrderController extends Controller
921
935
  }
922
936
  }
923
937
 
924
- if (is_array($activity) && $activity['code'] === 'completed' && $order->driverAssigned) {
925
- // unset from driver current job
926
- $order->driverAssigned->unassignCurrentOrder();
927
- $order->notifyCompleted();
928
- }
929
-
938
+ // Update activity
930
939
  $order->updateActivity($activity, $proof);
931
940
 
932
941
  // also update for each order entities if not multiple drop order
933
942
  // all entities will share the same activity status as is one drop order
934
943
  if (!$order->payload->isMultipleDropOrder) {
935
944
  foreach ($order->payload->entities as $entity) {
936
- $entity->insertActivity($activity['status'], $activity['details'] ?? '', $location, $activity['code'], $proof);
945
+ $entity->insertActivity($activity, $location, $proof);
937
946
  }
938
947
  } else {
939
948
  $order->payload->updateWaypointActivity($activity, $location);
940
949
  }
941
950
 
951
+ // Handle order completion
952
+ if (Utils::isActivity($activity) && $activity->completesOrder()) {
953
+ // unset from driver current job
954
+ $order->driverAssigned->unassignCurrentOrder();
955
+ $order->complete();
956
+ }
957
+
942
958
  return new OrderResource($order);
943
959
  }
944
960
 
@@ -947,10 +963,8 @@ class OrderController extends Controller
947
963
  *
948
964
  * @return \Illuminate\Http\Response
949
965
  */
950
- public function getNextActivity(string $id, Request $request)
966
+ public function getNextActivity(string $id)
951
967
  {
952
- $waypointId = $request->input('waypoint');
953
-
954
968
  try {
955
969
  $order = Order::findRecordOrFail($id, ['payload']);
956
970
  } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
@@ -962,24 +976,20 @@ class OrderController extends Controller
962
976
  );
963
977
  }
964
978
 
965
- $isMultipleDropOrder = $order->payload->isMultipleDropOrder;
979
+ $activities = $order->config()->nextActivity();
966
980
 
967
- if ($waypointId && $isMultipleDropOrder) {
968
- $waypoint = Waypoint::where('payload_uuid', $order->payload_uuid)->where(function ($q) use ($waypointId) {
969
- $q->whereHas('place', function ($q) use ($waypointId) {
970
- $q->where('public_id', $waypointId);
971
- });
972
- $q->orWhere('public_id', $waypointId);
973
- })->withoutGlobalScopes()->first();
974
-
975
- $activity = Flow::getOrderWaypointFlow($order, $waypoint);
976
-
977
- return response()->json($activity);
978
- }
981
+ // If activity is to complete order add proof of delivery properties if required
982
+ // This is a temporary fix until activity is updated to handle POD on it's own
983
+ $activities = $activities->map(function ($activity) use ($order) {
984
+ if ($activity->completesOrder() && $order->pod_required) {
985
+ $activity->set('require_pod', true);
986
+ $activity->set('pod_method', $order->pod_method);
987
+ }
979
988
 
980
- $activity = Flow::getOrderFlow($order);
989
+ return $activity;
990
+ });
981
991
 
982
- return response()->json($activity);
992
+ return response()->json($activities);
983
993
  }
984
994
 
985
995
  /**
@@ -1010,24 +1020,17 @@ class OrderController extends Controller
1010
1020
  return response()->apiError('Not all waypoints completed for order.');
1011
1021
  }
1012
1022
 
1013
- $activity = [
1014
- 'status' => 'Order completed',
1015
- 'details' => 'Driver has completed order for all waypoints',
1016
- 'code' => 'completed',
1017
- ];
1018
-
1023
+ $activity = $order->config()->getCompletedActivity();
1019
1024
  if ($order->driverAssigned) {
1020
1025
  // unset from driver current job
1021
1026
  $order->driverAssigned->unassignCurrentOrder();
1022
1027
  }
1023
1028
 
1024
- $order->notifyCompleted();
1025
-
1026
1029
  /** @var \Fleetbase\LaravelMysqlSpatial\Types\Point */
1027
1030
  $location = $order->getLastLocation();
1028
-
1029
- $order->setStatus($activity['code']);
1030
- $order->insertActivity($activity['status'], $activity['details'] ?? '', $location, $activity['code']);
1031
+ $order->setStatus($activity->code);
1032
+ $order->insertActivity($activity, $location);
1033
+ $order->notifyCompleted();
1031
1034
 
1032
1035
  return new OrderResource($order);
1033
1036
  }
@@ -1112,7 +1115,7 @@ class OrderController extends Controller
1112
1115
  *
1113
1116
  * @return void
1114
1117
  */
1115
- public function captureQrScan(string $id, ?string $subjectId = null, Request $request)
1118
+ public function captureQrScan(Request $request, string $id, ?string $subjectId = null)
1116
1119
  {
1117
1120
  $code = $request->input('code');
1118
1121
  $data = $request->input('data', []);
@@ -1183,7 +1186,7 @@ class OrderController extends Controller
1183
1186
  *
1184
1187
  * @return void
1185
1188
  */
1186
- public function captureSignature(string $id, ?string $subjectId = null, Request $request)
1189
+ public function captureSignature(Request $request, string $id, ?string $subjectId = null)
1187
1190
  {
1188
1191
  $disk = $request->input('disk', config('filesystems.default'));
1189
1192
  $bucket = $request->input('bucket', config('filesystems.disks.' . $disk . '.bucket', config('filesystems.disks.s3.bucket')));
@@ -1269,4 +1272,96 @@ class OrderController extends Controller
1269
1272
 
1270
1273
  return new ProofResource($proof);
1271
1274
  }
1275
+
1276
+ /**
1277
+ * Validate a photo.
1278
+ *
1279
+ * @return void
1280
+ */
1281
+ public function capturePhoto(Request $request, string $id, ?string $subjectId = null)
1282
+ {
1283
+ $disk = $request->input('disk', config('filesystems.default'));
1284
+ $bucket = $request->input('bucket', config('filesystems.disks.' . $disk . '.bucket', config('filesystems.disks.s3.bucket')));
1285
+ $photo = $request->input('photo');
1286
+ $data = $request->input('data', []);
1287
+ $remarks = $request->input('remarks', 'Verified by Photo');
1288
+ $type = $subjectId ? strtok($subjectId, '_') : null;
1289
+
1290
+ try {
1291
+ $order = Order::findRecordOrFail($id);
1292
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
1293
+ return response()->json(
1294
+ [
1295
+ 'error' => 'Order resource not found.',
1296
+ ],
1297
+ 404
1298
+ );
1299
+ }
1300
+
1301
+ if (!$photo) {
1302
+ return response()->apiError('No photo data to capture.');
1303
+ }
1304
+
1305
+ $subject = $type === null ? $order : null;
1306
+
1307
+ switch ($type) {
1308
+ case 'place':
1309
+ case 'waypoint':
1310
+ $subject = Waypoint::where('payload_uuid', $order->payload_uuid)->where(function ($q) use ($subjectId) {
1311
+ $q->whereHas('place', function ($q) use ($subjectId) {
1312
+ $q->where('public_id', $subjectId);
1313
+ });
1314
+ $q->orWhere('public_id', $subjectId);
1315
+ })->withoutGlobalScopes()->first();
1316
+ break;
1317
+
1318
+ case 'entity':
1319
+ $subject = Entity::where('public_id', $subjectId)->withoutGlobalScopes()->first();
1320
+ break;
1321
+
1322
+ default:
1323
+ break;
1324
+ }
1325
+
1326
+ if (!$subject) {
1327
+ return response()->apiError('Unable to capture photo');
1328
+ }
1329
+
1330
+ // create proof instance
1331
+ $proof = Proof::create([
1332
+ 'company_uuid' => session('company'),
1333
+ 'order_uuid' => $order->uuid,
1334
+ 'subject_uuid' => $subject->uuid,
1335
+ 'subject_type' => Utils::getModelClassName($subject),
1336
+ 'remarks' => $remarks,
1337
+ 'raw_data' => $photo,
1338
+ 'data' => $data,
1339
+ ]);
1340
+
1341
+ // set the photo storage path
1342
+ $path = 'uploads/' . session('company') . '/photos/' . $proof->public_id . '.png';
1343
+
1344
+ // upload photo
1345
+ Storage::disk($disk)->put($path, base64_decode($photo));
1346
+
1347
+ // create file record for upload
1348
+ $file = File::create([
1349
+ 'company_uuid' => session('company'),
1350
+ 'uploader_uuid' => session('user'),
1351
+ 'name' => basename($path),
1352
+ 'original_filename' => basename($path),
1353
+ 'extension' => 'png',
1354
+ 'content_type' => 'image/png',
1355
+ 'path' => $path,
1356
+ 'bucket' => $bucket,
1357
+ 'type' => 'photo',
1358
+ 'size' => Utils::getBase64ImageSize($photo),
1359
+ ])->setKey($proof);
1360
+
1361
+ // set file to proof
1362
+ $proof->file_uuid = $file->uuid;
1363
+ $proof->save();
1364
+
1365
+ return new ProofResource($proof);
1366
+ }
1272
1367
  }
@@ -0,0 +1,27 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
4
+
5
+ use Fleetbase\Http\Controllers\Controller;
6
+ use Fleetbase\Http\Resources\Organization;
7
+ use Fleetbase\Models\Company;
8
+
9
+ class OrganizationController extends Controller
10
+ {
11
+ /**
12
+ * Return List organizations.
13
+ *
14
+ * @return Organization
15
+ */
16
+ public function listOrganizations()
17
+ {
18
+ $companies = Company::whereHas('users')->take(10)->get()->map(function ($company) {
19
+ return [
20
+ 'name' => $company->name,
21
+ 'id' => $company->public_id,
22
+ ];
23
+ });
24
+
25
+ return response()->json($companies);
26
+ }
27
+ }
@@ -130,9 +130,8 @@ class PlaceController extends Controller
130
130
  ]);
131
131
 
132
132
  // check if missing location
133
- $isMissingLocation = empty($input['location']);
134
-
135
133
  // set a default location for creation
134
+ $isMissingLocation = empty($input['location']);
136
135
  if ($isMissingLocation) {
137
136
  $input['location'] = new Point(0, 0);
138
137
  }
@@ -141,7 +140,7 @@ class PlaceController extends Controller
141
140
  $place->fill($input);
142
141
 
143
142
  // attempt to find and set latitude and longitude
144
- if ($isMissingLocation || $request->missing(['latitude', 'longitude', 'location']) || $place->isMissing('country')) {
143
+ if ($isMissingLocation || $request->missing(['latitude', 'longitude', 'location']) || empty($place->country)) {
145
144
  $geocoded = Geocoder::geocode($place->toAddressString(['name']))
146
145
  ->get()
147
146
  ->first();
@@ -0,0 +1,9 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers;
4
+
5
+ use Illuminate\Routing\Controller as BaseController;
6
+
7
+ class Controller extends BaseController
8
+ {
9
+ }
@@ -2,6 +2,7 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers;
4
4
 
5
+ use Fleetbase\FleetOps\Models\Order;
5
6
  use Fleetbase\Http\Controllers\FleetbaseController;
6
7
 
7
8
  class FleetOpsController extends FleetbaseController
@@ -10,4 +11,10 @@ class FleetOpsController extends FleetbaseController
10
11
  * The package namespace used to resolve from.
11
12
  */
12
13
  public string $namespace = '\\Fleetbase\\FleetOps';
14
+
15
+ public function test()
16
+ {
17
+ $order = Order::where('public_id', '')->first();
18
+ dd($order->config()->getNextActivity());
19
+ }
13
20
  }