@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,467 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Models;
4
+
5
+ use Fleetbase\Casts\Json;
6
+ use Fleetbase\FleetOps\Casts\OrderConfigEntities;
7
+ use Fleetbase\FleetOps\Flow\Activity;
8
+ use Fleetbase\Models\Company;
9
+ use Fleetbase\Models\Model;
10
+ use Fleetbase\Support\Auth;
11
+ use Fleetbase\Traits\HasApiModelBehavior;
12
+ use Fleetbase\Traits\HasMetaAttributes;
13
+ use Fleetbase\Traits\HasPublicId;
14
+ use Fleetbase\Traits\HasUuid;
15
+ use Fleetbase\Traits\Searchable;
16
+ use Illuminate\Support\Collection;
17
+ use Illuminate\Support\Str;
18
+
19
+ class OrderConfig extends Model
20
+ {
21
+ use HasUuid;
22
+ use HasPublicId;
23
+ use Searchable;
24
+ use HasMetaAttributes;
25
+ use HasApiModelBehavior;
26
+
27
+ /**
28
+ * The database table used by the model.
29
+ *
30
+ * @var string
31
+ */
32
+ protected $table = 'order_configs';
33
+
34
+ /**
35
+ * The type of public Id to generate.
36
+ *
37
+ * @var string
38
+ */
39
+ protected $publicIdType = 'order_config';
40
+
41
+ /**
42
+ * These attributes that can be queried.
43
+ *
44
+ * @var array
45
+ */
46
+ protected $searchableColumns = ['name'];
47
+
48
+ /**
49
+ * The attributes that are mass assignable.
50
+ *
51
+ * @var array
52
+ */
53
+ protected $fillable = [
54
+ 'public_id',
55
+ 'company_uuid',
56
+ 'author_uuid',
57
+ 'category_uuid',
58
+ 'icon_uuid',
59
+ 'name',
60
+ 'namespace',
61
+ 'description',
62
+ 'key',
63
+ 'status',
64
+ 'version',
65
+ 'core_service',
66
+ 'tags',
67
+ 'flow',
68
+ 'entities',
69
+ 'meta',
70
+ ];
71
+
72
+ /**
73
+ * The attributes that should be cast to native types.
74
+ *
75
+ * @var array
76
+ */
77
+ protected $casts = [
78
+ 'tags' => Json::class,
79
+ 'flow' => Json::class,
80
+ 'entities' => OrderConfigEntities::class,
81
+ 'meta' => Json::class,
82
+ ];
83
+
84
+ /**
85
+ * Dynamic attributes that are appended to object.
86
+ *
87
+ * @var array
88
+ */
89
+ protected $appends = ['type'];
90
+
91
+ /**
92
+ * The attributes excluded from the model's JSON form.
93
+ *
94
+ * @var array
95
+ */
96
+ protected $hidden = [];
97
+
98
+ /**
99
+ * The current order in context to this config.
100
+ *
101
+ * @var Order
102
+ */
103
+ protected $orderContext;
104
+
105
+ /**
106
+ * Bootstraps the model and its events.
107
+ *
108
+ * This method overrides the default Eloquent model boot method
109
+ * to add a custom 'creating' event listener. This listener is used
110
+ * to set default values when a new model instance is being created.
111
+ *
112
+ * @return void
113
+ */
114
+ protected static function boot()
115
+ {
116
+ parent::boot();
117
+
118
+ static::creating(function ($model) {
119
+ $model->namespace = empty($model->namespace) ? static::createNamespace($model->name) : $model->namespace;
120
+ $model->version = '0.0.1';
121
+ $model->status = 'private';
122
+ $model->key = Str::slug($model->name);
123
+ });
124
+ }
125
+
126
+ /**
127
+ * Creates a namespaced string based on the provided name.
128
+ *
129
+ * This method generates a namespaced string using the company's name
130
+ * retrieved from the authenticated user's company, followed by a fixed
131
+ * segment ':order-config:', and the provided name. This is used to
132
+ * create a unique namespace for each model instance.
133
+ *
134
+ * @param string $name the name to be included in the namespace
135
+ *
136
+ * @return string the generated namespaced string
137
+ */
138
+ public static function createNamespace(string $name): string
139
+ {
140
+ $company = Auth::getCompany();
141
+
142
+ return Str::slug($company->name) . ':order-config:' . Str::slug($name);
143
+ }
144
+
145
+ /**
146
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
147
+ */
148
+ public function company()
149
+ {
150
+ return $this->belongsTo(Order::class);
151
+ }
152
+
153
+ /**
154
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
155
+ */
156
+ public function author()
157
+ {
158
+ return $this->belongsTo(\Fleetbase\Models\User::class);
159
+ }
160
+
161
+ /**
162
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
163
+ */
164
+ public function category()
165
+ {
166
+ return $this->belongsTo(\Fleetbase\Models\Category::class);
167
+ }
168
+
169
+ /**
170
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
171
+ */
172
+ public function icon()
173
+ {
174
+ return $this->belongsTo(\Fleetbase\Models\File::class);
175
+ }
176
+
177
+ /**
178
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
179
+ */
180
+ public function customFields()
181
+ {
182
+ return $this->belongsTo(\Fleetbase\Models\CustomField::class);
183
+ }
184
+
185
+ /**
186
+ * Accessor method for getting the type attribute of the order config.
187
+ *
188
+ * @return string the type of the order config
189
+ */
190
+ public function getTypeAttribute()
191
+ {
192
+ return 'order-config';
193
+ }
194
+
195
+ /**
196
+ * Sets the order context for the current order config.
197
+ *
198
+ * @param Order $order the order to set as the context
199
+ *
200
+ * @return self returns the instance for chaining
201
+ */
202
+ public function setOrderContext(Order $order): self
203
+ {
204
+ $this->orderContext = $order;
205
+
206
+ return $this;
207
+ }
208
+
209
+ /**
210
+ * Retrieves the current order context, setting it if not already set.
211
+ *
212
+ * @param Order|null $order the order to use as context if no current context is set
213
+ *
214
+ * @return Order|null the current order context
215
+ *
216
+ * @throws \Exception if no order context is found and none is provided
217
+ */
218
+ public function getOrderContext(?Order $order = null): ?Order
219
+ {
220
+ if (!$this->orderContext && $order instanceof Order) {
221
+ $this->setOrderContext($order);
222
+
223
+ return $order;
224
+ }
225
+
226
+ if (!$this->orderContext) {
227
+ throw new \Exception('No order context found to run order config.');
228
+ }
229
+
230
+ return $this->orderContext;
231
+ }
232
+
233
+ /**
234
+ * Retrieves all activities defined in the order config's flow.
235
+ *
236
+ * @return Collection a collection of Activity objects
237
+ */
238
+ public function activities(): Collection
239
+ {
240
+ $activities = collect();
241
+ foreach ($this->flow as $activity) {
242
+ $activities->push(new Activity($activity, $this->flow));
243
+ }
244
+
245
+ return $activities;
246
+ }
247
+
248
+ /**
249
+ * Retrieves the 'created' activity from the flow.
250
+ *
251
+ * @return Activity|null the created Activity object or null if not found
252
+ */
253
+ public function getCreatedActivity(): ?Activity
254
+ {
255
+ return $this->activities()->firstWhere('code', 'created');
256
+ }
257
+
258
+ /**
259
+ * Retrieves the 'dispatched' activity from the flow.
260
+ *
261
+ * @return Activity|null the dispatched Activity object or null if not found
262
+ */
263
+ public function getDispatchActivity(): ?Activity
264
+ {
265
+ return $this->activities()->firstWhere('code', 'dispatched');
266
+ }
267
+
268
+ /**
269
+ * Determines the current activity based on the order's status.
270
+ *
271
+ * @param Order|null $order the order to evaluate
272
+ *
273
+ * @return Activity|null the current Activity object or null if not found
274
+ */
275
+ public function currentActivity(?Order $order = null): ?Activity
276
+ {
277
+ $order = $this->getOrderContext($order);
278
+
279
+ return $this->activities()->firstWhere('code', $order->status);
280
+ }
281
+
282
+ /**
283
+ * Determines the next set of activities based on the current activity.
284
+ *
285
+ * @param Order|null $order the order to evaluate
286
+ *
287
+ * @return Collection a collection of the next activities
288
+ */
289
+ public function nextActivity(?Order $order = null): Collection
290
+ {
291
+ $order = $this->getOrderContext($order);
292
+ $currentActivity = $this->currentActivity($order);
293
+ if ($currentActivity) {
294
+ return $currentActivity->getNext($order);
295
+ }
296
+
297
+ return collect();
298
+ }
299
+
300
+ /**
301
+ * Retrieves the first activity in the next set of activities.
302
+ *
303
+ * @param Order|null $order the order to evaluate
304
+ *
305
+ * @return Activity|null the first Activity object in the next set or null if not found
306
+ */
307
+ public function nextFirstActivity(?Order $order = null): ?Activity
308
+ {
309
+ $next = collect();
310
+ $order = $this->getOrderContext($order);
311
+ $currentActivity = $this->currentActivity($order);
312
+ if ($currentActivity) {
313
+ $next = $currentActivity->getNext($order);
314
+ }
315
+
316
+ return $next->first();
317
+ }
318
+
319
+ /**
320
+ * Retrieves the activity that follows after the next activity.
321
+ *
322
+ * @param Order|null $order the order to evaluate
323
+ *
324
+ * @return Activity|null the Activity object that follows after the next or null if not found
325
+ */
326
+ public function afterNextActivity(?Order $order = null): ?Activity
327
+ {
328
+ $afterNext = collect();
329
+ $order = $this->getOrderContext($order);
330
+ $nextActivity = $this->nextFirstActivity($order);
331
+ if ($nextActivity) {
332
+ $afterNext = $nextActivity->getNext($order);
333
+ }
334
+
335
+ return $afterNext->first();
336
+ }
337
+
338
+ /**
339
+ * Retrieves the previous activities based on the current activity.
340
+ *
341
+ * @param Order|null $order the order to evaluate
342
+ *
343
+ * @return Collection a collection of previous activities
344
+ */
345
+ public function previousActivity(?Order $order = null): Collection
346
+ {
347
+ $order = $this->getOrderContext($order);
348
+ $currentActivity = $this->currentActivity($order);
349
+ if ($currentActivity) {
350
+ return $currentActivity->getPrevious($order);
351
+ }
352
+
353
+ return collect();
354
+ }
355
+
356
+ /**
357
+ * Creates an Activity instance representing a canceled order.
358
+ *
359
+ * This method constructs an Activity object with specific attributes
360
+ * like key, code, status, and details, indicating that the order has been canceled.
361
+ * It utilizes the flow associated with the OrderConfig for this purpose.
362
+ *
363
+ * @return Activity a new Activity instance representing a canceled order
364
+ */
365
+ public function getCanceledActivity()
366
+ {
367
+ $canceledActivity = $this->activities()->firstWhere('code', 'canceled');
368
+ if ($canceledActivity) {
369
+ return $canceledActivity;
370
+ }
371
+
372
+ return new Activity([
373
+ 'key' => 'order_canceled',
374
+ 'code' => 'canceled',
375
+ 'status' => 'Order canceled',
376
+ 'details' => 'Order was canceled',
377
+ 'complete' => false,
378
+ ], $this->flow);
379
+ }
380
+
381
+ /**
382
+ * Creates an Activity instance representing a completed order.
383
+ *
384
+ * This method constructs an Activity object with specific attributes
385
+ * such as key, code, status, and details, indicating that the order has been completed.
386
+ * It leverages the flow associated with the OrderConfig to construct this Activity.
387
+ *
388
+ * @return Activity a new Activity instance representing a completed order
389
+ */
390
+ public function getCompletedActivity()
391
+ {
392
+ $completedActivity = $this->activities()->firstWhere('code', 'completed');
393
+ if ($completedActivity) {
394
+ return $completedActivity;
395
+ }
396
+
397
+ return new Activity([
398
+ 'key' => 'order_completed',
399
+ 'code' => 'completed',
400
+ 'status' => 'Order completed',
401
+ 'details' => 'Order was completed',
402
+ 'complete' => true,
403
+ ], $this->flow);
404
+ }
405
+
406
+ /**
407
+ * Creates an Activity instance representing a started order.
408
+ *
409
+ * This method constructs an Activity object with specific attributes
410
+ * such as key, code, status, and details, indicating that the order has been started.
411
+ * It leverages the flow associated with the OrderConfig to construct this Activity.
412
+ *
413
+ * @return Activity a new Activity instance representing a started order
414
+ */
415
+ public function getStartedActivity()
416
+ {
417
+ $startedActivity = $this->activities()->firstWhere('code', 'started');
418
+ if ($startedActivity) {
419
+ return $startedActivity;
420
+ }
421
+
422
+ return new Activity([
423
+ 'key' => 'order_started',
424
+ 'code' => 'started',
425
+ 'status' => 'Order started',
426
+ 'details' => 'Order has started',
427
+ 'complete' => false,
428
+ ], $this->flow);
429
+ }
430
+
431
+ /**
432
+ * Resolves an OrderConfig from a given identifier or an array of identifiers within an optional company context.
433
+ *
434
+ * @param string|array $orderConfigIdentifier the identifier(s) for the OrderConfig (namespace, public_id, or key)
435
+ * @param Company|null $company the company context, if any, to narrow down the search
436
+ *
437
+ * @return OrderConfig|null the found OrderConfig or null if none found
438
+ */
439
+ public static function resolveFromIdentifier($orderConfigIdentifier, ?Company $company = null): ?OrderConfig
440
+ {
441
+ $query = static::query();
442
+
443
+ if ($company instanceof Company) {
444
+ $query->where('company_uuid', $company->uuid);
445
+ } else {
446
+ $companyUuid = session('company');
447
+ if ($companyUuid) {
448
+ $query->where('company_uuid', $companyUuid);
449
+ }
450
+ }
451
+
452
+ $identifiers = is_array($orderConfigIdentifier) ? $orderConfigIdentifier : [$orderConfigIdentifier];
453
+ foreach ($identifiers as $identifier) {
454
+ $orderConfig = $query->where(function ($query) use ($identifier) {
455
+ $query->where('namespace', $identifier)
456
+ ->orWhere('public_id', $identifier)
457
+ ->orWhere('key', $identifier);
458
+ })->first();
459
+
460
+ if ($orderConfig) {
461
+ return $orderConfig;
462
+ }
463
+ }
464
+
465
+ return null;
466
+ }
467
+ }
@@ -3,6 +3,7 @@
3
3
  namespace Fleetbase\FleetOps\Models;
4
4
 
5
5
  use Fleetbase\Casts\Json;
6
+ use Fleetbase\FleetOps\Flow\Activity;
6
7
  use Fleetbase\FleetOps\Support\Utils;
7
8
  use Fleetbase\Http\Resources\Internal\v1\Payload as PayloadResource;
8
9
  use Fleetbase\LaravelMysqlSpatial\Types\Point;
@@ -701,12 +702,11 @@ class Payload extends Model
701
702
  /**
702
703
  * Set the first waypoint and update activity.
703
704
  *
704
- * @param array $activity
705
705
  * @param Point $location
706
706
  *
707
707
  * @return void
708
708
  */
709
- public function setFirstWaypoint($activity = null, $location = null)
709
+ public function setFirstWaypoint(?Activity $activity = null, $location = null)
710
710
  {
711
711
  $destination = null;
712
712
 
@@ -730,27 +730,26 @@ class Payload extends Model
730
730
  /**
731
731
  * Update the current waypoint activity and it's entities.
732
732
  *
733
- * @param array $activity
734
733
  * @param Point $location
735
734
  * @param \Fleetbase\Models\Proof|string|null $proof resolvable proof of delivery/activity
736
735
  *
737
736
  * @return $this
738
737
  */
739
- public function updateWaypointActivity($activity = null, $location = null, $proof = null)
738
+ public function updateWaypointActivity(?Activity $activity = null, $location = null, $proof = null)
740
739
  {
741
- if ($this->isMultipleDropOrder && is_array($activity) && $location) {
740
+ if ($this->isMultipleDropOrder && Utils::isActivity($activity) && $location) {
742
741
  // update activity for the current waypoint
743
742
  $currentWaypoint = $this->waypointMarkers->firstWhere('place_uuid', $this->current_waypoint_uuid);
744
743
 
745
744
  if ($currentWaypoint) {
746
- $currentWaypoint->insertActivity($activity['status'], $activity['details'], $location, $activity['code'], $proof);
745
+ $currentWaypoint->insertActivity($activity, $location, $proof);
747
746
  }
748
747
 
749
748
  // update activity for all entities for this destination/waypoint
750
749
  $entities = $this->entities->where('destination_uuid', $this->current_waypoint_uuid);
751
750
 
752
751
  foreach ($entities as $entity) {
753
- $entity->insertActivity($activity['status'], $activity['details'], $location, $activity['code'], $proof);
752
+ $entity->insertActivity($activity, $location, $proof);
754
753
  }
755
754
  }
756
755
 
@@ -65,7 +65,7 @@ class OrderAssigned extends Notification implements ShouldQueue
65
65
  /**
66
66
  * Get the channels the event should broadcast on.
67
67
  *
68
- * @return \Illuminate\Broadcasting\Channel|array
68
+ * @return Channel|array
69
69
  */
70
70
  public function broadcastOn()
71
71
  {
@@ -65,7 +65,7 @@ class OrderCanceled extends Notification implements ShouldQueue
65
65
  /**
66
66
  * Get the channels the event should broadcast on.
67
67
  *
68
- * @return \Illuminate\Broadcasting\Channel|array
68
+ * @return Channel|array
69
69
  */
70
70
  public function broadcastOn()
71
71
  {
@@ -59,7 +59,7 @@ class OrderDispatchFailed extends Notification implements ShouldQueue
59
59
  /**
60
60
  * Get the channels the event should broadcast on.
61
61
  *
62
- * @return \Illuminate\Broadcasting\Channel|array
62
+ * @return Channel|array
63
63
  */
64
64
  public function broadcastOn()
65
65
  {
@@ -77,7 +77,7 @@ class OrderDispatched extends Notification implements ShouldQueue
77
77
  /**
78
78
  * Get the channels the event should broadcast on.
79
79
  *
80
- * @return \Illuminate\Broadcasting\Channel|array
80
+ * @return Channel|array
81
81
  */
82
82
  public function broadcastOn()
83
83
  {
@@ -82,7 +82,7 @@ class OrderPing extends Notification implements ShouldQueue
82
82
  /**
83
83
  * Get the channels the event should broadcast on.
84
84
  *
85
- * @return \Illuminate\Broadcasting\Channel|array
85
+ * @return Channel|array
86
86
  */
87
87
  public function broadcastOn()
88
88
  {
@@ -0,0 +1,20 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Observers;
4
+
5
+ use Fleetbase\FleetOps\Support\FleetOps;
6
+ use Fleetbase\Models\Company;
7
+
8
+ class CompanyObserver
9
+ {
10
+ /**
11
+ * Handle the Company "created" event.
12
+ *
13
+ * @return void
14
+ */
15
+ public function created(Company $company)
16
+ {
17
+ // Add the default transport order config
18
+ FleetOps::createTransportConfig($company);
19
+ }
20
+ }
@@ -6,8 +6,9 @@ use Brick\Geo\Engine\GeometryEngineRegistry;
6
6
  use Brick\Geo\Engine\GEOSEngine;
7
7
  use Fleetbase\Providers\CoreServiceProvider;
8
8
  use Fleetbase\Support\NotificationRegistry;
9
+ use Fleetbase\Support\Utils;
9
10
 
10
- if (!class_exists(CoreServiceProvider::class)) {
11
+ if (!Utils::classExists(CoreServiceProvider::class)) {
11
12
  throw new \Exception('FleetOps cannot be loaded without `fleetbase/core-api` installed!');
12
13
  }
13
14
 
@@ -33,6 +34,7 @@ class FleetOpsServiceProvider extends CoreServiceProvider
33
34
  \Fleetbase\FleetOps\Models\Vehicle::class => \Fleetbase\FleetOps\Observers\VehicleObserver::class,
34
35
  \Fleetbase\FleetOps\Models\Fleet::class => \Fleetbase\FleetOps\Observers\FleetObserver::class,
35
36
  \Fleetbase\Models\User::class => \Fleetbase\FleetOps\Observers\UserObserver::class,
37
+ \Fleetbase\Models\Company::class => \Fleetbase\FleetOps\Observers\CompanyObserver::class,
36
38
  ];
37
39
 
38
40
  /**
@@ -45,6 +47,7 @@ class FleetOpsServiceProvider extends CoreServiceProvider
45
47
  \Fleetbase\FleetOps\Console\Commands\DispatchOrders::class,
46
48
  \Fleetbase\FleetOps\Console\Commands\TrackOrderDistanceAndTime::class,
47
49
  \Fleetbase\FleetOps\Console\Commands\FixDriverCompanies::class,
50
+ \Fleetbase\FleetOps\Console\Commands\FixLegacyOrderConfigs::class,
48
51
  ];
49
52
 
50
53
  /**
@@ -4,8 +4,9 @@ namespace Fleetbase\FleetOps\Providers;
4
4
 
5
5
  use Fleetbase\Providers\CoreServiceProvider;
6
6
  use Fleetbase\Support\NotificationRegistry;
7
+ use Fleetbase\Support\Utils;
7
8
 
8
- if (!class_exists(CoreServiceProvider::class)) {
9
+ if (!Utils::classExists(CoreServiceProvider::class)) {
9
10
  throw new \Exception('FleetOps cannot be loaded without `fleetbase/core-api` installed!');
10
11
  }
11
12