@fleetbase/fleetops-engine 0.4.15 → 0.4.17

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 (220) 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 +97 -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 +285 -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 +42 -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/migrations/2023_04_27_053456_create_contacts_table.php +1 -2
  105. package/server/migrations/2023_04_27_053456_create_drivers_table.php +1 -2
  106. package/server/migrations/2023_04_27_053456_create_entities_table.php +1 -2
  107. package/server/migrations/2023_04_27_053456_create_fleet_drivers_table.php +1 -2
  108. package/server/migrations/2023_04_27_053456_create_fleets_table.php +1 -2
  109. package/server/migrations/2023_04_27_053456_create_fuel_reports_table.php +1 -2
  110. package/server/migrations/2023_04_27_053456_create_integrated_vendors_table.php +1 -2
  111. package/server/migrations/2023_04_27_053456_create_issues_table.php +1 -2
  112. package/server/migrations/2023_04_27_053456_create_orders_table.php +1 -2
  113. package/server/migrations/2023_04_27_053456_create_payloads_table.php +1 -2
  114. package/server/migrations/2023_04_27_053456_create_places_table.php +1 -2
  115. package/server/migrations/2023_04_27_053456_create_positions_table.php +1 -2
  116. package/server/migrations/2023_04_27_053456_create_proofs_table.php +1 -2
  117. package/server/migrations/2023_04_27_053456_create_purchase_rates_table.php +1 -2
  118. package/server/migrations/2023_04_27_053456_create_routes_table.php +1 -2
  119. package/server/migrations/2023_04_27_053456_create_service_areas_table.php +1 -2
  120. package/server/migrations/2023_04_27_053456_create_service_quote_items_table.php +1 -2
  121. package/server/migrations/2023_04_27_053456_create_service_quotes_table.php +1 -2
  122. package/server/migrations/2023_04_27_053456_create_service_rate_fees_table.php +1 -2
  123. package/server/migrations/2023_04_27_053456_create_service_rate_parcel_fees_table.php +1 -2
  124. package/server/migrations/2023_04_27_053456_create_service_rates_table.php +1 -2
  125. package/server/migrations/2023_04_27_053456_create_tracking_numbers_table.php +1 -2
  126. package/server/migrations/2023_04_27_053456_create_tracking_statuses_table.php +1 -2
  127. package/server/migrations/2023_04_27_053456_create_vehicles_table.php +1 -2
  128. package/server/migrations/2023_04_27_053456_create_vendors_table.php +1 -2
  129. package/server/migrations/2023_04_27_053456_create_waypoints_table.php +1 -2
  130. package/server/migrations/2023_04_27_053456_create_zones_table.php +1 -2
  131. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_companies_table.php +1 -2
  132. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_contacts_table.php +1 -2
  133. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_drivers_table.php +1 -2
  134. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_entities_table.php +1 -2
  135. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleet_drivers_table.php +1 -2
  136. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleets_table.php +1 -2
  137. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fuel_reports_table.php +1 -2
  138. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_integrated_vendors_table.php +1 -2
  139. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_issues_table.php +1 -2
  140. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_orders_table.php +1 -2
  141. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_payloads_table.php +1 -2
  142. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_places_table.php +1 -2
  143. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_positions_table.php +1 -2
  144. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_proofs_table.php +1 -2
  145. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_purchase_rates_table.php +1 -2
  146. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_routes_table.php +1 -2
  147. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_areas_table.php +1 -2
  148. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quote_items_table.php +1 -2
  149. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quotes_table.php +1 -2
  150. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_fees_table.php +1 -2
  151. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_parcel_fees_table.php +1 -2
  152. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rates_table.php +1 -2
  153. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_numbers_table.php +1 -2
  154. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_statuses_table.php +1 -2
  155. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vehicles_table.php +1 -2
  156. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vendors_table.php +1 -2
  157. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_waypoints_table.php +1 -2
  158. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_zones_table.php +1 -2
  159. package/server/migrations/2023_09_14_074512_update_vehicles_table.php +1 -2
  160. package/server/migrations/2023_09_14_074619_create_vehicle_devices_table.php +35 -36
  161. package/server/migrations/2023_09_26_071205_add_online_column_to_vehicles_table.php +1 -2
  162. package/server/migrations/2023_09_26_083957_create_fleet_vehicles_table.php +1 -2
  163. package/server/migrations/2023_09_27_023757_add_column_to_fleets_table.php +1 -2
  164. package/server/migrations/2023_10_05_074811_update_vehicle.php +1 -2
  165. package/server/migrations/2023_10_25_093014_create_vehicle_device_events_table.php +1 -2
  166. package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +1 -2
  167. package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +1 -2
  168. package/server/migrations/2023_11_09_041807_add_status_column_to_fuel_reports_table.php +1 -2
  169. package/server/migrations/2023_11_15_062814_add_comments_column_and_resolved_at_column_to_vehicle_device_events_table.php +1 -2
  170. package/server/migrations/2023_11_17_053001_add_category_uuid_to_entities_table.php +1 -2
  171. package/server/migrations/2023_11_28_074244_add_supplier_uuid_column_to_entities_table.php +1 -2
  172. package/server/migrations/2023_12_14_100209_add_meta_column_on_driver_table copy.php +1 -2
  173. package/server/migrations/2024_02_18_100209_add_avatar_url_columns_table.php +3 -4
  174. package/server/migrations/2024_02_27_093648_create_order_configs_table.php +43 -0
  175. package/server/migrations/2024_03_07_075508_add_order_config_uuid_column_to_orders_table.php +28 -0
  176. package/server/seeders/OrderConfigSeeder.php +151 -0
  177. package/server/src/Casts/OrderConfigEntities.php +53 -0
  178. package/server/src/Console/Commands/FixLegacyOrderConfigs.php +66 -0
  179. package/server/src/Events/DriverLocationChanged.php +1 -1
  180. package/server/src/Events/DriverSimulatedLocationChanged.php +1 -1
  181. package/server/src/Expansions/UserExpansion.php +4 -4
  182. package/server/src/Flow/Activity.php +232 -6
  183. package/server/src/Flow/Condition.php +84 -0
  184. package/server/src/Flow/Event.php +88 -0
  185. package/server/src/Flow/Flow.php +50 -0
  186. package/server/src/Flow/FlowResource.php +143 -0
  187. package/server/src/Flow/Logic.php +57 -1
  188. package/server/src/Http/Controllers/Api/v1/DriverController.php +2 -2
  189. package/server/src/Http/Controllers/Api/v1/IssueController.php +132 -0
  190. package/server/src/Http/Controllers/Api/v1/OrderController.php +130 -57
  191. package/server/src/Http/Controllers/Api/v1/OrganizationController.php +27 -0
  192. package/server/src/Http/Controllers/Api/v1/PlaceController.php +2 -3
  193. package/server/src/Http/Controllers/Controller.php +9 -0
  194. package/server/src/Http/Controllers/FleetOpsController.php +7 -0
  195. package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +5 -259
  196. package/server/src/Http/Controllers/Internal/v1/OrderController.php +56 -35
  197. package/server/src/Http/Controllers/Internal/v1/SettingController.php +20 -0
  198. package/server/src/Http/Filter/OrderConfigFilter.php +13 -0
  199. package/server/src/Http/Requests/CreateIssueRequest.php +19 -0
  200. package/server/src/Http/Requests/UpdateIssueRequest.php +7 -0
  201. package/server/src/Http/Resources/v1/Order.php +3 -0
  202. package/server/src/Http/Resources/v1/Payload.php +1 -1
  203. package/server/src/Listeners/HandleOrderCanceled.php +8 -4
  204. package/server/src/Listeners/HandleOrderDispatched.php +14 -12
  205. package/server/src/Models/Order.php +527 -31
  206. package/server/src/Models/OrderConfig.php +419 -0
  207. package/server/src/Models/Payload.php +8 -7
  208. package/server/src/Notifications/OrderAssigned.php +1 -1
  209. package/server/src/Notifications/OrderCanceled.php +1 -1
  210. package/server/src/Notifications/OrderDispatchFailed.php +1 -1
  211. package/server/src/Notifications/OrderDispatched.php +1 -1
  212. package/server/src/Notifications/OrderPing.php +1 -1
  213. package/server/src/Providers/FleetOpsServiceProvider.php +3 -1
  214. package/server/src/Providers/NotificationServiceProvider.php +2 -1
  215. package/server/src/Support/Utils.php +17 -0
  216. package/server/src/Traits/HasTrackingNumber.php +9 -9
  217. package/server/src/routes.php +19 -11
  218. package/translations/en-us.yaml +137 -0
  219. package/server/src/Flow/Config.php +0 -7
  220. package/server/src/Support/Flow.php +0 -653
@@ -2,268 +2,14 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
- use Fleetbase\FleetOps\Models\Order;
6
- use Fleetbase\FleetOps\Support\Flow;
7
- use Fleetbase\FleetOps\Support\Utils;
8
- use Fleetbase\Http\Controllers\Controller;
9
- use Fleetbase\Models\Category;
10
- use Fleetbase\Models\Extension;
11
- use Fleetbase\Models\ExtensionInstall;
12
- use Fleetbase\Models\Type;
13
- use Illuminate\Http\Request;
14
- use Illuminate\Support\Str;
5
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
15
6
 
16
- class OrderConfigController extends Controller
7
+ class OrderConfigController extends FleetOpsController
17
8
  {
18
9
  /**
19
- * Retrieve all installed or created order configurations.
10
+ * The resource to query.
20
11
  *
21
- * @return \Illuminate\Http\Response
12
+ * @var string
22
13
  */
23
- public function getInstalled(Request $request)
24
- {
25
- $key = $request->input('key');
26
- $namespace = $request->input('namespace');
27
- $single = $request->input('single', false);
28
- $installedExtensions = [];
29
-
30
- // get all installed order configs
31
- $installed = ExtensionInstall::where('company_uuid', session('company'))
32
- ->whereHas(
33
- 'extension',
34
- function ($query) {
35
- $query->where('meta_type', 'order_config');
36
- }
37
- )
38
- ->with('extension')->get();
39
-
40
- // morph installed into extensions
41
- foreach ($installed as $install) {
42
- $installedExtensions[] = $install->asExtension();
43
- }
44
-
45
- // get authored extension installs
46
- $authored = Extension::where(['author_uuid' => session('company'), 'meta_type' => 'order_config', 'status' => 'private'])->get();
47
-
48
- // create array of configs
49
- $configs = collect([...$installedExtensions, ...$authored]);
50
-
51
- // if no installed configs always place default config
52
- if ($configs->isEmpty()) {
53
- $configs = $configs->merge(Flow::getAllDefaultOrderConfigs());
54
- }
55
-
56
- // filter by key
57
- if ($key) {
58
- $configs = $configs->where('key', $key);
59
- }
60
-
61
- // filter by namespace
62
- if ($namespace) {
63
- $configs = $configs->where('namespace', $namespace);
64
- }
65
-
66
- if ($single) {
67
- return response()->json($configs->first());
68
- }
69
-
70
- return response()->json($configs->values()->toArray());
71
- }
72
-
73
- /**
74
- * Save an order extension, whether installed or authored.
75
- *
76
- * @return \Illuminate\Http\Response
77
- */
78
- public function save(Request $request)
79
- {
80
- $data = $request->input('data', []);
81
- $isInstalled = isset($data['installed']) && Utils::isTrue($data['installed']);
82
-
83
- // if the extension is from installed
84
- if ($isInstalled) {
85
- // get the extension install record
86
- $install = ExtensionInstall::where('uuid', $data['install_uuid'])->first();
87
-
88
- // update install record
89
- $overwrite = $install->overwrite ?? [];
90
- $overwrite['name'] = $data['name'];
91
- $overwrite['description'] = $data['description'];
92
-
93
- // update json fields
94
- $install->overwrite = $overwrite;
95
- $install->meta = $data['meta'];
96
-
97
- // save changes
98
- $install->save();
99
-
100
- return response()->json(['status' => 'OK']);
101
- }
102
-
103
- // get the extension record
104
- $extension = Extension::where('uuid', $data['uuid'])->first();
105
-
106
- // update extension record
107
- $extension->name = $data['name'];
108
- $extension->description = $data['description'];
109
- $extension->meta = $data['meta'];
110
-
111
- // save
112
- $extension->save();
113
-
114
- return response()->json(['status' => 'OK']);
115
- }
116
-
117
- /**
118
- * Creates a new empty order configuration.
119
- *
120
- * @return \Illuminate\Http\Response
121
- */
122
- public function new(Request $request)
123
- {
124
- $name = $request->input('name');
125
- $description = $request->input('description');
126
- $tags = $request->input('tags', []);
127
-
128
- $company = Flow::getCompanySession();
129
- $category = Category::where(['for' => 'extension', 'name' => 'Logistics'])->first();
130
- $type = Type::where(['for' => 'extension', 'key' => 'config'])->first();
131
-
132
- $orderConfig = Extension::create(
133
- [
134
- 'author_uuid' => session('company'),
135
- 'category_uuid' => $category->uuid,
136
- 'type_uuid' => $type->uuid,
137
- 'name' => $name,
138
- 'description' => $description,
139
- 'display_name' => $name,
140
- 'key' => Str::slug($name),
141
- 'tags' => $tags,
142
- 'namespace' => Extension::createNamespace($company->slug, 'order-config', $name),
143
- 'version' => '0.0.1',
144
- 'core_service' => 0,
145
- 'meta' => ['flow' => Flow::getDefaultOrderFlow()],
146
- 'meta_type' => 'order_config',
147
- 'config' => [],
148
- 'status' => 'private',
149
- ]
150
- );
151
-
152
- return response()->json($orderConfig);
153
- }
154
-
155
- /**
156
- * Clones an order configuration into a new configuration.
157
- *
158
- * @return \Illuminate\Http\Response
159
- */
160
- public function clone(Request $request)
161
- {
162
- $name = $request->input('name');
163
- $description = $request->input('description');
164
- $id = $request->input('id');
165
- $installed = $request->input('installed', false);
166
- $company = Flow::getCompanySession();
167
-
168
- if (!$id) {
169
- return response()->json(
170
- [
171
- 'errors' => ['Extension attempted to clone not found'],
172
- ],
173
- 400
174
- );
175
- }
176
-
177
- // if the extension is from installed
178
- if ($installed) {
179
- // get the extension install record
180
- $install = ExtensionInstall::where('uuid', $id)->first();
181
-
182
- // replicate the install
183
- $clonedInstall = $install->replicate();
184
- $clonedInstall->id = null;
185
- $clonedInstall->uuid = Extension::generateUuid();
186
- $clonedInstall->overwrite = [
187
- 'name' => $name,
188
- 'display_name' => $name,
189
- 'description' => $description,
190
- 'key' => Str::slug($name),
191
- 'namespace' => Extension::createNamespace($company->slug, 'order-config', $name, Str::random(5)),
192
- ];
193
-
194
- // save clone
195
- $clonedInstall->save();
196
-
197
- return response()->json($clonedInstall->asExtension());
198
- }
199
-
200
- // get the extension record
201
- $extension = Extension::where('uuid', $id)->first();
202
-
203
- // replicate the extension record
204
- $clonedExtension = $extension->replicate();
205
- $clonedExtension->id = null;
206
- $clonedExtension->uuid = Extension::generateUuid();
207
- $clonedExtension->public_id = Extension::generatePublicId('ext');
208
- $clonedExtension->name = $name;
209
- $clonedExtension->display_name = $name;
210
- $clonedExtension->description = $description;
211
- $clonedExtension->key = Str::slug($name);
212
- $clonedExtension->namespace = Extension::createNamespace($company->slug, 'order-config', $name, Str::random(5));
213
- $clonedExtension->status = 'private';
214
-
215
- // save clone
216
- $clonedExtension->save();
217
-
218
- return response()->json($clonedExtension);
219
- }
220
-
221
- /**
222
- * Pull all dynamically created meta fields throughout orders of a specific type.
223
- *
224
- * @return \Illuminate\Http\Response
225
- */
226
- public function getDynamicMetaFields(Request $request)
227
- {
228
- $type = $request->input('type', 'transport');
229
- $orders = Order::select('meta')->where('type', $type)->whereNull('deleted_at')->get();
230
- $dynamicFields = collect();
231
-
232
- foreach ($orders as $order) {
233
- $dynamicFields = $dynamicFields->merge(array_keys($order->meta));
234
- }
235
-
236
- return response()->json($dynamicFields->unique()->values());
237
- }
238
-
239
- /**
240
- * Pull all dynamically created meta fields throughout orders of a specific type.
241
- *
242
- * @return \Illuminate\Http\Response
243
- */
244
- public function delete(string $id)
245
- {
246
- $extension = Extension::where(['uuid' => $id, 'author_uuid' => session('company'), 'meta_type' => 'order_config'])->first();
247
-
248
- if ($extension) {
249
- $extension->delete();
250
-
251
- return response()->json(['status' => 'OK', 'deleted' => $extension->uuid]);
252
- }
253
-
254
- $installedExtension = ExtensionInstall::where(['uuid' => $id, 'company_uuid' => session('company')])->first();
255
-
256
- if ($installedExtension) {
257
- $installedExtension->delete();
258
-
259
- return response()->json(['status' => 'OK', 'deleted' => $installedExtension->uuid]);
260
- }
261
-
262
- return response()->json(
263
- [
264
- 'errors' => 'Unable to uninstall order configuration',
265
- ],
266
- 400
267
- );
268
- }
14
+ public $resource = 'order-config';
269
15
  }
@@ -6,6 +6,7 @@ use Fleetbase\Exceptions\FleetbaseRequestValidationException;
6
6
  use Fleetbase\FleetOps\Events\OrderDispatchFailed;
7
7
  use Fleetbase\FleetOps\Events\OrderReady;
8
8
  use Fleetbase\FleetOps\Events\OrderStarted;
9
+ use Fleetbase\FleetOps\Flow\Activity;
9
10
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
10
11
  use Fleetbase\FleetOps\Http\Requests\CancelOrderRequest;
11
12
  use Fleetbase\FleetOps\Imports\OrdersImport;
@@ -17,9 +18,9 @@ use Fleetbase\FleetOps\Models\Place;
17
18
  use Fleetbase\FleetOps\Models\ServiceQuote;
18
19
  use Fleetbase\FleetOps\Models\TrackingStatus;
19
20
  use Fleetbase\FleetOps\Models\Waypoint;
20
- use Fleetbase\FleetOps\Support\Flow;
21
21
  use Fleetbase\FleetOps\Support\Utils;
22
22
  use Fleetbase\Http\Requests\Internal\BulkDeleteRequest;
23
+ use Fleetbase\Models\CustomFieldValue;
23
24
  use Fleetbase\Models\File;
24
25
  use Fleetbase\Models\Type;
25
26
  use Illuminate\Http\Request;
@@ -78,11 +79,12 @@ class OrderController extends FleetOpsController
78
79
  $isIntegratedVendorOrder = isset($requestInput['integrated_vendor_order']);
79
80
  $serviceQuote = ServiceQuote::resolveFromRequest($request);
80
81
 
81
- $route = Utils::get($input, 'route');
82
- $payload = Utils::get($input, 'payload');
83
- $waypoints = Utils::get($input, 'payload.waypoints');
84
- $entities = Utils::get($input, 'payload.entities');
85
- $uploads = Utils::get($input, 'files', []);
82
+ $route = Utils::get($input, 'route');
83
+ $payload = Utils::get($input, 'payload');
84
+ $waypoints = Utils::get($input, 'payload.waypoints');
85
+ $entities = Utils::get($input, 'payload.entities');
86
+ $uploads = Utils::get($input, 'files', []);
87
+ $customFieldValues = Utils::get($input, 'custom_field_values', []);
86
88
 
87
89
  // save order route & payload with request input
88
90
  $order
@@ -102,6 +104,20 @@ class OrderController extends FleetOpsController
102
104
  }
103
105
  }
104
106
 
107
+ // save custom field values
108
+ if (is_array($customFieldValues)) {
109
+ foreach ($customFieldValues as $customFieldValue) {
110
+ CustomFieldValue::create([
111
+ 'company_uuid' => session('company'),
112
+ 'custom_field_uuid' => data_get($customFieldValue, 'custom_field_uuid'),
113
+ 'subject_uuid' => $order->uuid,
114
+ 'subject_type' => Utils::getMutationType($order),
115
+ 'value' => data_get($customFieldValue, 'value'),
116
+ 'value_type' => data_get($customFieldValue, 'value_type', 'text'),
117
+ ]);
118
+ }
119
+ }
120
+
105
121
  // if it's integrated vendor order apply to meta
106
122
  if ($isIntegratedVendorOrder) {
107
123
  $order->updateMeta(
@@ -144,15 +160,16 @@ class OrderController extends FleetOpsController
144
160
 
145
161
  /**
146
162
  * Route which enables editing of an order route.
147
- *
148
- * @param string $id - The order ID.
149
- * @param Request $request
163
+ *
164
+ * @param string $id - The order ID
165
+ *
150
166
  * @return Response
151
167
  */
152
- public function editOrderRoute(string $id, Request $request) {
153
- $pickup = $request->input('pickup');
154
- $dropoff = $request->input('dropoff');
155
- $return = $request->input('return');
168
+ public function editOrderRoute(string $id, Request $request)
169
+ {
170
+ $pickup = $request->input('pickup');
171
+ $dropoff = $request->input('dropoff');
172
+ $return = $request->input('return');
156
173
  $waypoints = $request->array('waypoints', []);
157
174
 
158
175
  // Get the order
@@ -160,7 +177,7 @@ class OrderController extends FleetOpsController
160
177
  if (!$order) {
161
178
  return response()->error('Unable to find order to update route for.');
162
179
  }
163
-
180
+
164
181
  // Handle update of multiple waypoints
165
182
  if ($waypoints) {
166
183
  $order->payload->updateWaypoints($waypoints);
@@ -185,7 +202,7 @@ class OrderController extends FleetOpsController
185
202
  $order->payload->removeWaypoints();
186
203
  }
187
204
 
188
- return ['order' => new $this->resource($order)];
205
+ return ['order' => new $this->resource($order)];
189
206
  }
190
207
 
191
208
  /**
@@ -356,7 +373,7 @@ class OrderController extends FleetOpsController
356
373
  /**
357
374
  * @var \Fleetbase\Models\Order
358
375
  */
359
- $order = Order::select(['uuid', 'driver_assigned_uuid', 'adhoc', 'dispatched', 'dispatched_at'])->where('uuid', $request->input('order'))->withoutGlobalScopes()->first();
376
+ $order = Order::select(['uuid', 'driver_assigned_uuid', 'order_config_uuid', 'adhoc', 'dispatched', 'dispatched_at'])->where('uuid', $request->input('order'))->withoutGlobalScopes()->first();
360
377
 
361
378
  if (!$order->hasDriverAssigned && !$order->adhoc) {
362
379
  return response()->error('No driver assigned to dispatch!');
@@ -366,7 +383,7 @@ class OrderController extends FleetOpsController
366
383
  return response()->error('Order has already been dispatched!');
367
384
  }
368
385
 
369
- $order->dispatch();
386
+ $order->dispatchWithActivity();
370
387
 
371
388
  return response()->json(
372
389
  [
@@ -424,7 +441,7 @@ class OrderController extends FleetOpsController
424
441
  $driver->save();
425
442
 
426
443
  // get the next order activity
427
- $flow = $activity = Flow::getNextActivity($order);
444
+ $flow = $activity = $order->config()->nextFirstActivity();
428
445
 
429
446
  /**
430
447
  * @var \Fleetbase\LaravelMysqlSpatial\Types\Point
@@ -442,11 +459,11 @@ class OrderController extends FleetOpsController
442
459
 
443
460
  // update activity for each waypoint and entity
444
461
  foreach ($payload->waypointMarkers as $waypointMarker) {
445
- $waypointMarker->insertActivity($activity['status'], $activity['details'], $location, $activity['code']);
462
+ $waypointMarker->insertActivity($activity, $location);
446
463
  }
447
464
 
448
465
  foreach ($payload->entities as $entity) {
449
- $entity->insertActivity($activity['status'], $activity['details'], $location, $activity['code']);
466
+ $entity->insertActivity($activity, $location);
450
467
  }
451
468
  }
452
469
 
@@ -476,10 +493,11 @@ class OrderController extends FleetOpsController
476
493
  return response()->error('No order found.');
477
494
  }
478
495
 
479
- $activity = $request->input('activity');
496
+ $activity = $request->array('activity');
497
+ $activity = new Activity($activity, $order->getConfigFlow());
480
498
 
481
- // handle pickup/dropoff order activity update as normal
482
- if (is_array($activity) && $activity['code'] === 'dispatched') {
499
+ // Handle pickup/dropoff order activity update as normal
500
+ if (Utils::isActivity($activity) && $activity->is('dispatched')) {
483
501
  // make sure driver is assigned if not trigger failed dispatch
484
502
  if (!$order->hasDriverAssigned && !$order->adhoc) {
485
503
  event(new OrderDispatchFailed($order, 'No driver assigned for order to dispatch to.'));
@@ -492,28 +510,31 @@ class OrderController extends FleetOpsController
492
510
  return response()->json(['status' => 'dispatched']);
493
511
  }
494
512
 
495
- if (is_array($activity) && $activity['code'] === 'completed' && $order->driverAssigned) {
496
- // unset from driver current job
497
- $order->driverAssigned->unassignCurrentOrder();
498
- $order->notifyCompleted();
499
- }
500
-
501
513
  /**
502
514
  * @var \Fleetbase\LaravelMysqlSpatial\Types\Point
503
515
  */
504
516
  $location = $order->getLastLocation();
505
-
506
- $order->setStatus($activity['code']);
507
- $order->insertActivity($activity['status'], $activity['details'], $location, $activity['code']);
517
+ $order->setStatus($activity->code);
518
+ $order->insertActivity($activity, $location);
508
519
 
509
520
  // also update for each order entities if not multiple drop order
510
521
  // all entities will share the same activity status as is one drop order
511
522
  if (!$order->payload->isMultipleDropOrder) {
512
523
  foreach ($order->payload->entities as $entity) {
513
- $entity->insertActivity($activity['status'], $activity['details'], $location, $activity['code']);
524
+ $entity->insertActivity($activity, $location);
514
525
  }
515
526
  }
516
527
 
528
+ // Handle order completed
529
+ if (Utils::isActivity($activity) && $activity->completesOrder() && $order->driverAssigned) {
530
+ // unset from driver current job
531
+ $order->driverAssigned->unassignCurrentOrder();
532
+ $order->complete();
533
+ }
534
+
535
+ // Fire activity events
536
+ $activity->fireEvents($order);
537
+
517
538
  return response()->json(['status' => 'ok']);
518
539
  }
519
540
 
@@ -533,9 +554,9 @@ class OrderController extends FleetOpsController
533
554
  return response()->error('No order found.');
534
555
  }
535
556
 
536
- $flow = Flow::getOrderFlow($order);
557
+ $nextActivities = $order->config()->nextActivity();
537
558
 
538
- return response()->json($flow);
559
+ return response()->json($nextActivities);
539
560
  }
540
561
 
541
562
  /**
@@ -11,6 +11,15 @@ use Illuminate\Http\Request;
11
11
  */
12
12
  class SettingController extends Controller
13
13
  {
14
+ /**
15
+ * Retrieves the current visibility settings.
16
+ *
17
+ * This method fetches the visibility settings for 'fleet-ops' from the database and
18
+ * returns them in a JSON response. The settings are retrieved based on a specific key
19
+ * from the 'Setting' model.
20
+ *
21
+ * @return \Illuminate\Http\Response the visibility settings in JSON format
22
+ */
14
23
  public function getVisibilitySettings()
15
24
  {
16
25
  $visibilitySettings = Setting::where('key', 'fleet-ops.visibility')->value('value');
@@ -18,6 +27,17 @@ class SettingController extends Controller
18
27
  return response()->json(['visibilitySettings' => $visibilitySettings]);
19
28
  }
20
29
 
30
+ /**
31
+ * Saves the visibility settings provided in the request.
32
+ *
33
+ * This method accepts visibility settings via the request and updates them in the database.
34
+ * The new settings are saved using a specific key in the 'Setting' model. The method
35
+ * returns the updated settings in a JSON response.
36
+ *
37
+ * @param Request $request the HTTP request containing the visibility settings
38
+ *
39
+ * @return \Illuminate\Http\Response the updated visibility settings in JSON format
40
+ */
21
41
  public function saveVisibilitySettings(Request $request)
22
42
  {
23
43
  $visibilitySettings = $request->input('visibilitySettings', []);
@@ -0,0 +1,13 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Filter;
4
+
5
+ use Fleetbase\Http\Filter\Filter;
6
+
7
+ class OrderConfigFilter extends Filter
8
+ {
9
+ public function queryForInternal()
10
+ {
11
+ $this->builder->where('company_uuid', $this->session->get('company'));
12
+ }
13
+ }
@@ -0,0 +1,19 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Requests;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+
7
+ class CreateIssueRequest extends FleetbaseRequest
8
+ {
9
+ public function rules()
10
+ {
11
+ return [
12
+ 'driver' => ['required'],
13
+ 'location' => ['required'],
14
+ 'category' => ['nullable'],
15
+ 'type' => ['nullable'],
16
+ 'priority' => ['nullable'],
17
+ ];
18
+ }
19
+ }
@@ -0,0 +1,7 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Requests;
4
+
5
+ class UpdateIssueRequest extends CreateIssueRequest
6
+ {
7
+ }
@@ -39,6 +39,8 @@ class Order extends FleetbaseResource
39
39
  'service_quote_uuid' => $this->when(Http::isInternalRequest(), $this->service_quote_uuid),
40
40
  'has_driver_assigned' => $this->when(Http::isInternalRequest(), $this->has_driver_assigned),
41
41
  'is_scheduled' => $this->when(Http::isInternalRequest(), $this->is_scheduled),
42
+ 'order_config' => $this->when(Http::isInternalRequest(), $this->whenLoaded('orderConfig', $this->orderConfig)),
43
+ 'custom_field_values' => $this->when(Http::isInternalRequest(), $this->customFieldValues),
42
44
  'customer' => $this->setCustomerType(Resolve::resourceForMorph($this->customer_type, $this->customer_uuid)),
43
45
  'payload' => new Payload($this->payload),
44
46
  'facilitator' => $this->setFacilitatorType(Resolve::resourceForMorph($this->facilitator_type, $this->facilitator_uuid)),
@@ -49,6 +51,7 @@ class Order extends FleetbaseResource
49
51
  'files' => $this->when(Http::isInternalRequest(), $this->files, File::collection($this->files)),
50
52
  'purchase_rate' => new PurchaseRate($this->purchaseRate),
51
53
  'notes' => $this->notes,
54
+ ...$this->getCustomFieldValues(),
52
55
  'type' => $this->type,
53
56
  'status' => $this->status,
54
57
  'pod_method' => $this->pod_method,
@@ -48,7 +48,7 @@ class Payload extends FleetbaseResource
48
48
  return $waypoint;
49
49
  });
50
50
  }
51
-
51
+
52
52
  return [];
53
53
  }
54
54
 
@@ -3,6 +3,7 @@
3
3
  namespace Fleetbase\FleetOps\Listeners;
4
4
 
5
5
  use Fleetbase\FleetOps\Events\OrderCanceled;
6
+ use Fleetbase\FleetOps\Flow\Activity;
6
7
  use Fleetbase\FleetOps\Models\Driver;
7
8
  use Fleetbase\FleetOps\Notifications\OrderCanceled as OrderCanceledNotification;
8
9
  use Illuminate\Contracts\Queue\ShouldQueue;
@@ -25,15 +26,18 @@ class HandleOrderCanceled implements ShouldQueue
25
26
  $order = $event->getModelRecord();
26
27
  $location = $order->getLastLocation();
27
28
 
28
- // update order activity
29
- $order->setStatus('canceled');
30
- $order->createActivity('Order canceled', 'Order was canceled', $location, $order->status);
29
+ // Create order cancel activity
30
+ $activity = $order->config()->getCanceledActivity();
31
+
32
+ // Update order activity
33
+ $order->setStatus($activity->status);
34
+ $order->createActivity($activity, $location);
31
35
 
32
36
  if ($order->isIntegratedVendorOrder()) {
33
37
  $order->facilitator->provider()->callback('onCanceled', $order);
34
38
  }
35
39
 
36
- // notify driver assigned order was canceled
40
+ // Notify driver assigned order was canceled
37
41
  if ($order->hasDriverAssigned) {
38
42
  /** @var \Fleetbase\Models\Driver */
39
43
  $driver = Driver::where('uuid', $order->driver_assigned_uuid)->withoutGlobalScopes()->first();
@@ -5,9 +5,9 @@ namespace Fleetbase\FleetOps\Listeners;
5
5
  use Fleetbase\FleetOps\Events\OrderDispatched;
6
6
  use Fleetbase\FleetOps\Events\OrderDispatchFailed;
7
7
  use Fleetbase\FleetOps\Models\Driver;
8
+ use Fleetbase\FleetOps\Models\TrackingStatus;
8
9
  use Fleetbase\FleetOps\Notifications\OrderDispatched as OrderDispatchedNotification;
9
10
  use Fleetbase\FleetOps\Notifications\OrderPing;
10
- use Fleetbase\FleetOps\Support\Flow;
11
11
  use Fleetbase\FleetOps\Support\Utils;
12
12
  use Illuminate\Contracts\Queue\ShouldQueue;
13
13
  use Illuminate\Queue\InteractsWithQueue;
@@ -39,15 +39,19 @@ class HandleOrderDispatched implements ShouldQueue
39
39
  return event(new OrderDispatchFailed($order, 'No driver assigned for order to dispatch to.'));
40
40
  }
41
41
 
42
- /** check for dispatch code in activity options, if there is the correct dispatch code update activity */
43
- $activity = Flow::getDispatchActivity($order);
44
-
45
- if ($activity) {
46
- /** update order activity */
47
- $location = $order->getLastLocation();
48
-
49
- $order->setStatus($activity['code']);
50
- $order->createActivity($activity['status'], $activity['details'], $location, $activity['code']);
42
+ /**
43
+ * Check if dispatch activity already exists, if not -
44
+ * Check for dispatch code in activity options, if there is the correct dispatch code update activity.
45
+ **/
46
+ $doesntHaveDispatchActivity = TrackingStatus::where(['code' => 'DISPATCHED', 'tracking_number_uuid' => $order->tracking_number_uuid])->doesntExist();
47
+ if ($doesntHaveDispatchActivity) {
48
+ $activity = $order->config()->getDispatchActivity();
49
+ if ($activity) {
50
+ /** update order activity */
51
+ $location = $order->getLastLocation();
52
+ $order->setStatus($activity->code);
53
+ $order->createActivity($activity, $location);
54
+ }
51
55
  }
52
56
 
53
57
  /* update dispatch attributes */
@@ -59,10 +63,8 @@ class HandleOrderDispatched implements ShouldQueue
59
63
  /* if order is adhoc ping drivers within radius of pickup to accept order * */
60
64
  if ($order->adhoc) {
61
65
  $order->load(['company']);
62
-
63
66
  $pickup = $order->getPickupLocation();
64
67
  $distance = $order->getAdhocDistance();
65
-
66
68
  if (!Utils::isPoint($pickup)) {
67
69
  return;
68
70
  }