@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
@@ -2,268 +2,75 @@
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;
5
+ use Fleetbase\Exceptions\FleetbaseRequestValidationException;
6
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
7
+ use Fleetbase\FleetOps\Http\Requests\Internal\CreateOrderConfigRequest;
8
+ use Fleetbase\FleetOps\Models\OrderConfig;
13
9
  use Illuminate\Http\Request;
14
- use Illuminate\Support\Str;
10
+ use Illuminate\Support\Facades\Validator;
15
11
 
16
- class OrderConfigController extends Controller
12
+ class OrderConfigController extends FleetOpsController
17
13
  {
18
14
  /**
19
- * Retrieve all installed or created order configurations.
15
+ * The resource to query.
20
16
  *
21
- * @return \Illuminate\Http\Response
22
- */
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
17
+ * @var string
121
18
  */
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
- }
19
+ public $resource = 'order-config';
154
20
 
155
21
  /**
156
- * Clones an order configuration into a new configuration.
22
+ * Creates a record with request payload.
157
23
  *
158
24
  * @return \Illuminate\Http\Response
159
25
  */
160
- public function clone(Request $request)
26
+ public function createRecord(Request $request)
161
27
  {
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
- );
28
+ // Create validation request
29
+ $createOrderRequest = CreateOrderConfigRequest::createFrom($request);
30
+ $rules = $createOrderRequest->rules();
31
+
32
+ // Manually validate request
33
+ $validator = Validator::make($request->input('orderConfig'), $rules);
34
+ if ($validator->fails()) {
35
+ return $createOrderRequest->responseWithErrors($validator);
175
36
  }
176
37
 
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();
38
+ try {
39
+ $record = $this->model->createRecordFromRequest($request);
196
40
 
197
- return response()->json($clonedInstall->asExtension());
41
+ return ['order_config' => new $this->resource($record)];
42
+ } catch (\Exception $e) {
43
+ return response()->error($e->getMessage());
44
+ } catch (\Illuminate\Database\QueryException $e) {
45
+ return response()->error($e->getMessage());
46
+ } catch (FleetbaseRequestValidationException $e) {
47
+ return response()->error($e->getErrors());
198
48
  }
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
49
  }
220
50
 
221
51
  /**
222
- * Pull all dynamically created meta fields throughout orders of a specific type.
52
+ * Delete's an order config.
223
53
  *
224
54
  * @return \Illuminate\Http\Response
225
55
  */
226
- public function getDynamicMetaFields(Request $request)
56
+ public function deleteRecord($id, Request $request)
227
57
  {
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));
58
+ $orderConfig = OrderConfig::where('uuid', $id)->first();
59
+ if (!$orderConfig) {
60
+ return response()->error('No order config found.');
234
61
  }
235
62
 
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]);
63
+ // `core_service` order configs cannot be deleted
64
+ if ($orderConfig->core_service) {
65
+ return response()->error('Core service order config\'s cannot be deleted.');
252
66
  }
253
67
 
254
- $installedExtension = ExtensionInstall::where(['uuid' => $id, 'company_uuid' => session('company')])->first();
68
+ if ($orderConfig) {
69
+ $orderConfig->delete();
255
70
 
256
- if ($installedExtension) {
257
- $installedExtension->delete();
71
+ $this->resource::wrap($this->resourceSingularlName);
258
72
 
259
- return response()->json(['status' => 'OK', 'deleted' => $installedExtension->uuid]);
73
+ return new $this->resource($orderConfig);
260
74
  }
261
-
262
- return response()->json(
263
- [
264
- 'errors' => 'Unable to uninstall order configuration',
265
- ],
266
- 400
267
- );
268
75
  }
269
76
  }
@@ -6,8 +6,10 @@ 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;
12
+ use Fleetbase\FleetOps\Http\Requests\Internal\CreateOrderRequest;
11
13
  use Fleetbase\FleetOps\Imports\OrdersImport;
12
14
  use Fleetbase\FleetOps\Models\Driver;
13
15
  use Fleetbase\FleetOps\Models\Entity;
@@ -17,13 +19,14 @@ use Fleetbase\FleetOps\Models\Place;
17
19
  use Fleetbase\FleetOps\Models\ServiceQuote;
18
20
  use Fleetbase\FleetOps\Models\TrackingStatus;
19
21
  use Fleetbase\FleetOps\Models\Waypoint;
20
- use Fleetbase\FleetOps\Support\Flow;
21
22
  use Fleetbase\FleetOps\Support\Utils;
22
23
  use Fleetbase\Http\Requests\Internal\BulkDeleteRequest;
24
+ use Fleetbase\Models\CustomFieldValue;
23
25
  use Fleetbase\Models\File;
24
26
  use Fleetbase\Models\Type;
25
27
  use Illuminate\Http\Request;
26
28
  use Illuminate\Support\Facades\DB;
29
+ use Illuminate\Support\Facades\Validator;
27
30
  use Illuminate\Support\Str;
28
31
  use Maatwebsite\Excel\Facades\Excel;
29
32
 
@@ -43,9 +46,17 @@ class OrderController extends FleetOpsController
43
46
  */
44
47
  public function createRecord(Request $request)
45
48
  {
46
- try {
47
- $this->validateRequest($request);
49
+ // Create validation request
50
+ $createOrderRequest = CreateOrderRequest::createFrom($request);
51
+ $rules = $createOrderRequest->rules();
52
+
53
+ // Manually validate request
54
+ $validator = Validator::make($request->input('order'), $rules);
55
+ if ($validator->fails()) {
56
+ return $createOrderRequest->responseWithErrors($validator);
57
+ }
48
58
 
59
+ try {
49
60
  $record = $this->model->createRecordFromRequest(
50
61
  $request,
51
62
  function ($request, &$input) {
@@ -78,11 +89,12 @@ class OrderController extends FleetOpsController
78
89
  $isIntegratedVendorOrder = isset($requestInput['integrated_vendor_order']);
79
90
  $serviceQuote = ServiceQuote::resolveFromRequest($request);
80
91
 
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', []);
92
+ $route = Utils::get($input, 'route');
93
+ $payload = Utils::get($input, 'payload');
94
+ $waypoints = Utils::get($input, 'payload.waypoints');
95
+ $entities = Utils::get($input, 'payload.entities');
96
+ $uploads = Utils::get($input, 'files', []);
97
+ $customFieldValues = Utils::get($input, 'custom_field_values', []);
86
98
 
87
99
  // save order route & payload with request input
88
100
  $order
@@ -102,6 +114,20 @@ class OrderController extends FleetOpsController
102
114
  }
103
115
  }
104
116
 
117
+ // save custom field values
118
+ if (is_array($customFieldValues)) {
119
+ foreach ($customFieldValues as $customFieldValue) {
120
+ CustomFieldValue::create([
121
+ 'company_uuid' => session('company'),
122
+ 'custom_field_uuid' => data_get($customFieldValue, 'custom_field_uuid'),
123
+ 'subject_uuid' => $order->uuid,
124
+ 'subject_type' => Utils::getMutationType($order),
125
+ 'value' => data_get($customFieldValue, 'value'),
126
+ 'value_type' => data_get($customFieldValue, 'value_type', 'text'),
127
+ ]);
128
+ }
129
+ }
130
+
105
131
  // if it's integrated vendor order apply to meta
106
132
  if ($isIntegratedVendorOrder) {
107
133
  $order->updateMeta(
@@ -357,7 +383,7 @@ class OrderController extends FleetOpsController
357
383
  /**
358
384
  * @var \Fleetbase\Models\Order
359
385
  */
360
- $order = Order::select(['uuid', 'driver_assigned_uuid', 'adhoc', 'dispatched', 'dispatched_at'])->where('uuid', $request->input('order'))->withoutGlobalScopes()->first();
386
+ $order = Order::select(['uuid', 'driver_assigned_uuid', 'order_config_uuid', 'adhoc', 'dispatched', 'dispatched_at'])->where('uuid', $request->input('order'))->withoutGlobalScopes()->first();
361
387
 
362
388
  if (!$order->hasDriverAssigned && !$order->adhoc) {
363
389
  return response()->error('No driver assigned to dispatch!');
@@ -367,7 +393,7 @@ class OrderController extends FleetOpsController
367
393
  return response()->error('Order has already been dispatched!');
368
394
  }
369
395
 
370
- $order->dispatch();
396
+ $order->dispatchWithActivity();
371
397
 
372
398
  return response()->json(
373
399
  [
@@ -425,7 +451,7 @@ class OrderController extends FleetOpsController
425
451
  $driver->save();
426
452
 
427
453
  // get the next order activity
428
- $flow = $activity = Flow::getNextActivity($order);
454
+ $flow = $activity = $order->config()->nextFirstActivity();
429
455
 
430
456
  /**
431
457
  * @var \Fleetbase\LaravelMysqlSpatial\Types\Point
@@ -443,11 +469,11 @@ class OrderController extends FleetOpsController
443
469
 
444
470
  // update activity for each waypoint and entity
445
471
  foreach ($payload->waypointMarkers as $waypointMarker) {
446
- $waypointMarker->insertActivity($activity['status'], $activity['details'], $location, $activity['code']);
472
+ $waypointMarker->insertActivity($activity, $location);
447
473
  }
448
474
 
449
475
  foreach ($payload->entities as $entity) {
450
- $entity->insertActivity($activity['status'], $activity['details'], $location, $activity['code']);
476
+ $entity->insertActivity($activity, $location);
451
477
  }
452
478
  }
453
479
 
@@ -477,10 +503,11 @@ class OrderController extends FleetOpsController
477
503
  return response()->error('No order found.');
478
504
  }
479
505
 
480
- $activity = $request->input('activity');
506
+ $activity = $request->array('activity');
507
+ $activity = new Activity($activity, $order->getConfigFlow());
481
508
 
482
- // handle pickup/dropoff order activity update as normal
483
- if (is_array($activity) && $activity['code'] === 'dispatched') {
509
+ // Handle pickup/dropoff order activity update as normal
510
+ if (Utils::isActivity($activity) && $activity->is('dispatched')) {
484
511
  // make sure driver is assigned if not trigger failed dispatch
485
512
  if (!$order->hasDriverAssigned && !$order->adhoc) {
486
513
  event(new OrderDispatchFailed($order, 'No driver assigned for order to dispatch to.'));
@@ -493,28 +520,31 @@ class OrderController extends FleetOpsController
493
520
  return response()->json(['status' => 'dispatched']);
494
521
  }
495
522
 
496
- if (is_array($activity) && $activity['code'] === 'completed' && $order->driverAssigned) {
497
- // unset from driver current job
498
- $order->driverAssigned->unassignCurrentOrder();
499
- $order->notifyCompleted();
500
- }
501
-
502
523
  /**
503
524
  * @var \Fleetbase\LaravelMysqlSpatial\Types\Point
504
525
  */
505
526
  $location = $order->getLastLocation();
506
-
507
- $order->setStatus($activity['code']);
508
- $order->insertActivity($activity['status'], $activity['details'], $location, $activity['code']);
527
+ $order->setStatus($activity->code);
528
+ $order->insertActivity($activity, $location);
509
529
 
510
530
  // also update for each order entities if not multiple drop order
511
531
  // all entities will share the same activity status as is one drop order
512
532
  if (!$order->payload->isMultipleDropOrder) {
513
533
  foreach ($order->payload->entities as $entity) {
514
- $entity->insertActivity($activity['status'], $activity['details'], $location, $activity['code']);
534
+ $entity->insertActivity($activity, $location);
515
535
  }
516
536
  }
517
537
 
538
+ // Handle order completed
539
+ if (Utils::isActivity($activity) && $activity->completesOrder() && $order->driverAssigned) {
540
+ // unset from driver current job
541
+ $order->driverAssigned->unassignCurrentOrder();
542
+ $order->complete();
543
+ }
544
+
545
+ // Fire activity events
546
+ $activity->fireEvents($order);
547
+
518
548
  return response()->json(['status' => 'ok']);
519
549
  }
520
550
 
@@ -534,9 +564,9 @@ class OrderController extends FleetOpsController
534
564
  return response()->error('No order found.');
535
565
  }
536
566
 
537
- $flow = Flow::getOrderFlow($order);
567
+ $nextActivities = $order->config()->nextActivity();
538
568
 
539
- return response()->json($flow);
569
+ return response()->json($nextActivities);
540
570
  }
541
571
 
542
572
  /**
@@ -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,40 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Requests\Internal;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+ use Illuminate\Validation\Rule;
7
+
8
+ class CreateOrderConfigRequest extends FleetbaseRequest
9
+ {
10
+ /**
11
+ * Determine if the user is authorized to make this request.
12
+ *
13
+ * @return bool
14
+ */
15
+ public function authorize()
16
+ {
17
+ return request()->session()->has('company');
18
+ }
19
+
20
+ /**
21
+ * Get the validation rules that apply to the request.
22
+ *
23
+ * @return array
24
+ */
25
+ public function rules()
26
+ {
27
+ return [
28
+ 'name' => [
29
+ 'required',
30
+ Rule::unique('order_configs', 'name')
31
+ ->where('company_uuid', request()->session()->get('company'))->whereNull('deleted_at'),
32
+ ],
33
+ 'key' => [
34
+ 'required',
35
+ Rule::unique('order_configs', 'key')
36
+ ->where('company_uuid', request()->session()->get('company'))->whereNull('deleted_at'),
37
+ ],
38
+ ];
39
+ }
40
+ }