@fleetbase/fleetops-engine 0.4.18 → 0.4.20

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 (84) hide show
  1. package/addon/components/activity-event-selector.js +1 -1
  2. package/addon/components/activity-form-panel.hbs +19 -0
  3. package/addon/components/activity-form-panel.js +20 -2
  4. package/addon/components/activity-logic-builder.js +1 -1
  5. package/addon/components/admin/navigator-app.hbs +77 -1
  6. package/addon/components/admin/navigator-app.js +65 -12
  7. package/addon/components/contact-form-panel.js +2 -2
  8. package/addon/components/contact-panel.js +2 -2
  9. package/addon/components/custom-field-form-panel.js +2 -2
  10. package/addon/components/driver-form-panel.js +2 -2
  11. package/addon/components/driver-panel.js +2 -2
  12. package/addon/components/edit-order-route-panel.js +2 -2
  13. package/addon/components/fleet-form-panel.js +2 -2
  14. package/addon/components/fleet-panel/driver-listing.js +1 -1
  15. package/addon/components/fleet-panel/vehicle-listing.js +1 -1
  16. package/addon/components/fleet-panel.js +2 -2
  17. package/addon/components/fuel-report-form-panel.js +2 -2
  18. package/addon/components/fuel-report-panel.js +2 -2
  19. package/addon/components/issue-form-panel.js +2 -2
  20. package/addon/components/issue-panel.js +2 -2
  21. package/addon/components/live-map-drawer.js +2 -2
  22. package/addon/components/live-map.js +14 -7
  23. package/addon/components/order-config-manager/activity-flow.js +1 -1
  24. package/addon/components/order-config-manager/custom-fields.js +1 -1
  25. package/addon/components/order-config-manager/entities.js +1 -1
  26. package/addon/components/order-config-manager-overlay.js +1 -1
  27. package/addon/components/order-config-manager.js +2 -2
  28. package/addon/components/place-form-panel.js +2 -2
  29. package/addon/components/place-panel.js +2 -2
  30. package/addon/components/vehicle-form-panel.js +2 -2
  31. package/addon/components/vehicle-panel.js +2 -2
  32. package/addon/components/vendor-form-panel/create-form.js +1 -1
  33. package/addon/components/vendor-form-panel.js +2 -2
  34. package/addon/components/vendor-panel.js +2 -2
  35. package/addon/controllers/operations/orders/index/new.js +5 -0
  36. package/addon/controllers/operations/service-rates/index/new.js +23 -2
  37. package/addon/routes/operations/service-rates/index/edit.js +14 -5
  38. package/addon/routes/operations/service-rates/index/new.js +2 -6
  39. package/addon/services/location.js +54 -44
  40. package/addon/templates/operations/service-rates/index/new.hbs +10 -1
  41. package/composer.json +2 -2
  42. package/extension.json +1 -1
  43. package/package.json +3 -3
  44. package/server/config/fleetops.php +127 -4
  45. package/server/migrations/2024_03_13_061249_add_order_config_uuid_column_to_service_rates_table.php +28 -0
  46. package/server/src/Console/Commands/FixLegacyOrderConfigs.php +17 -11
  47. package/server/src/Http/Controllers/Api/v1/DriverController.php +0 -1
  48. package/server/src/Http/Controllers/Api/v1/OrderController.php +49 -2
  49. package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +10 -5
  50. package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +3 -0
  51. package/server/src/Http/Controllers/Internal/v1/SettingController.php +20 -0
  52. package/server/src/Http/Filter/ContactFilter.php +5 -0
  53. package/server/src/Http/Filter/DriverFilter.php +5 -0
  54. package/server/src/Http/Filter/EntityFilter.php +18 -0
  55. package/server/src/Http/Filter/FleetFilter.php +5 -0
  56. package/server/src/Http/Filter/FuelReportFilter.php +5 -0
  57. package/server/src/Http/Filter/IssueFilter.php +5 -0
  58. package/server/src/Http/Filter/OrderConfigFilter.php +5 -0
  59. package/server/src/Http/Filter/OrderFilter.php +5 -0
  60. package/server/src/Http/Filter/PayloadFilter.php +18 -0
  61. package/server/src/Http/Filter/PlaceFilter.php +5 -0
  62. package/server/src/Http/Filter/PurchaseRateFilter.php +18 -0
  63. package/server/src/Http/Filter/ServiceAreaFilter.php +5 -0
  64. package/server/src/Http/Filter/ServiceQuoteFilter.php +5 -0
  65. package/server/src/Http/Filter/ServiceRateFilter.php +5 -0
  66. package/server/src/Http/Filter/TrackingNumberFilter.php +18 -0
  67. package/server/src/Http/Filter/TrackingStatusFilter.php +5 -0
  68. package/server/src/Http/Filter/VehicleFilter.php +5 -0
  69. package/server/src/Http/Filter/VendorFilter.php +5 -0
  70. package/server/src/Http/Filter/ZoneFilter.php +5 -0
  71. package/server/src/Http/Requests/CreateOrderRequest.php +32 -13
  72. package/server/src/Http/Requests/Internal/CreateOrderRequest.php +41 -10
  73. package/server/src/Http/Resources/v1/Order.php +1 -0
  74. package/server/src/Http/Resources/v1/ServiceRate.php +34 -31
  75. package/server/src/Models/Driver.php +1 -1
  76. package/server/src/Models/ServiceRate.php +9 -0
  77. package/server/src/Providers/FleetOpsServiceProvider.php +3 -3
  78. package/server/src/Support/Utils.php +40 -14
  79. package/server/src/routes.php +3 -0
  80. package/translations/en-us.yaml +9 -1
  81. package/addon/utils/apply-context-component-arguments.js +0 -33
  82. package/addon/utils/context-component-callback.js +0 -16
  83. package/app/utils/apply-context-component-arguments.js +0 -1
  84. package/app/utils/context-component-callback.js +0 -1
@@ -4,8 +4,8 @@ import { action } from '@ember/object';
4
4
  import { inject as service } from '@ember/service';
5
5
  import { isArray } from '@ember/array';
6
6
  import VendorPanelDetailComponent from './vendor-panel/details';
7
- import contextComponentCallback from '../utils/context-component-callback';
8
- import applyContextComponentArguments from '../utils/apply-context-component-arguments';
7
+ import contextComponentCallback from '@fleetbase/ember-core/utils/context-component-callback';
8
+ import applyContextComponentArguments from '@fleetbase/ember-core/utils/apply-context-component-arguments';
9
9
 
10
10
  export default class VendorPanelComponent extends Component {
11
11
  /**
@@ -534,6 +534,11 @@ export default class OperationsOrdersIndexNewController extends BaseController {
534
534
  params.facilitator = this.order.facilitator.public_id;
535
535
  }
536
536
 
537
+ // filter by order config type
538
+ if (this.orderConfig) {
539
+ params.service_type = this.orderConfig.key;
540
+ }
541
+
537
542
  if (shouldCheck) {
538
543
  try {
539
544
  serviceRates = await this.fetch.get(`service-rates/for-route`, params);
@@ -48,11 +48,11 @@ export default class OperationsServiceRatesIndexNewController extends BaseContro
48
48
  @tracked serviceRate = this.store.createRecord('service-rate', { per_meter_unit: 'm' });
49
49
 
50
50
  /**
51
- * Different service types available, based on order type.
51
+ * Available order configs.
52
52
  *
53
53
  * @var {Array}
54
54
  */
55
- @tracked serviceTypes = [];
55
+ @tracked orderConfigs = [];
56
56
 
57
57
  /**
58
58
  * Service areas.
@@ -75,6 +75,13 @@ export default class OperationsServiceRatesIndexNewController extends BaseContro
75
75
  */
76
76
  @tracked isCreatingServiceRate = false;
77
77
 
78
+ /**
79
+ * The current selected order config.
80
+ *
81
+ * @var {OrderConfigModel|null}
82
+ */
83
+ @tracked orderConfig;
84
+
78
85
  /**
79
86
  * True if updating service rate.
80
87
  *
@@ -279,6 +286,20 @@ export default class OperationsServiceRatesIndexNewController extends BaseContro
279
286
  });
280
287
  }
281
288
 
289
+ @action setConfig(event) {
290
+ const orderConfigId = event.target.value;
291
+ if (!orderConfigId) {
292
+ return;
293
+ }
294
+
295
+ const orderConfig = this.store.peekRecord('order-config', orderConfigId);
296
+ if (orderConfig) {
297
+ this.orderConfig = orderConfig;
298
+ this.serviceRate.set('order_config_uuid', orderConfig.id);
299
+ this.serviceRate.set('service_type', orderConfig.key);
300
+ }
301
+ }
302
+
282
303
  /**
283
304
  * Adds a per drop-off rate fee
284
305
  */
@@ -7,8 +7,20 @@ export default class OperationsServiceRatesIndexEditRoute extends Route {
7
7
  @service currentUser;
8
8
  @service notifications;
9
9
 
10
+ /**
11
+ * Re-use the new service rate form template.
12
+ *
13
+ * @memberof OperationsServiceRatesIndexEditRoute
14
+ */
10
15
  templateName = 'operations.service-rates.index.new';
11
16
 
17
+ /**
18
+ * Handle any async error.
19
+ *
20
+ * @param {*} error
21
+ * @return {*}
22
+ * @memberof OperationsServiceRatesIndexEditRoute
23
+ */
12
24
  @action error(error) {
13
25
  this.notifications.serverError(error);
14
26
  return this.transitionTo('operations.service-rates.index');
@@ -33,10 +45,7 @@ export default class OperationsServiceRatesIndexEditRoute extends Route {
33
45
  controller.parcelFees = model.parcel_fees;
34
46
  }
35
47
 
36
- const serviceTypes = await this.currentUser.getInstalledOrderConfigs();
37
- const serviceAreas = await this.store.findAll('service-area');
38
-
39
- controller.serviceTypes = serviceTypes;
40
- controller.serviceAreas = serviceAreas;
48
+ controller.orderConfigs = await this.store.findAll('order-config');
49
+ controller.serviceAreas = await this.store.findAll('service-area');
41
50
  }
42
51
  }
@@ -3,13 +3,9 @@ import { inject as service } from '@ember/service';
3
3
 
4
4
  export default class OperationsServiceRatesIndexNewRoute extends Route {
5
5
  @service store;
6
- @service currentUser;
7
6
 
8
7
  async setupController(controller) {
9
- const serviceTypes = await this.currentUser.getInstalledOrderConfigs();
10
- const serviceAreas = await this.store.findAll('service-area');
11
-
12
- controller.serviceTypes = serviceTypes;
13
- controller.serviceAreas = serviceAreas;
8
+ controller.orderConfigs = await this.store.findAll('order-config');
9
+ controller.serviceAreas = await this.store.findAll('service-area');
14
10
  }
15
11
  }
@@ -78,66 +78,74 @@ export default class LocationService extends Service {
78
78
  }
79
79
 
80
80
  /**
81
- * Attempts to fetch the user's location from various sources.
82
- * Uses cached data, navigator geolocation, or WHOIS data as fallbacks.
81
+ * Attempts to fetch the user's location from various sources including cached data,
82
+ * navigator geolocation, or WHOIS data. It first tries to get the cached coordinates.
83
+ * If not available or outdated, it tries the browser's geolocation API.
84
+ * As a fallback, it uses WHOIS data associated with the user's account.
85
+ *
83
86
  * @returns {Promise<Object>} A promise that resolves to an object containing latitude and longitude.
84
87
  */
85
- getUserLocation() {
86
- return this.fetch.cachedGet('fleet-ops/live/coordinates', {}, { expirationInterval: 1, expirationIntervalUnit: 'hour' }).then((coordinates) => {
88
+ async getUserLocation() {
89
+ // If the location has already been located, return the existing coordinates
90
+ if (this.located) {
91
+ return { latitude: this.latitude, longitude: this.longitude };
92
+ }
93
+
94
+ try {
95
+ const coordinates = await this.fetch.cachedGet('fleet-ops/live/coordinates', {}, { expirationInterval: 1, expirationIntervalUnit: 'hour' });
96
+
87
97
  if (isBlank(coordinates)) {
88
- return this.getUserLocationFromNavigator().then((navigatorCoordinates) => {
89
- this.updateLocation(navigatorCoordinates);
90
- return navigatorCoordinates;
91
- });
98
+ return await this.getUserLocationFromNavigator();
92
99
  }
93
100
 
94
- if (isArray(coordinates)) {
95
- const validCoordinates = coordinates.filter((point) => point.coordinates[0] !== 0);
101
+ if (isArray(coordinates) && coordinates.length > 0) {
102
+ // Ensure the coordinates array contains valid data
103
+ const validCoordinates = coordinates.find((point) => point.coordinates[0] !== 0 && point.coordinates[1] !== 0);
96
104
  if (validCoordinates) {
97
- const [longitude, latitude] = getWithDefault(validCoordinates, '0.coordinates', [0, 0]);
98
- const userCoordinates = {
99
- latitude,
100
- longitude,
101
- };
102
-
103
- this.updateLocation(userCoordinates);
104
- return userCoordinates;
105
+ const [longitude, latitude] = validCoordinates.coordinates;
106
+ this.updateLocation({ latitude, longitude });
107
+ return { latitude, longitude };
105
108
  }
106
109
  }
107
110
 
108
- return this.getUserLocationFromWhois();
109
- });
111
+ return await this.getUserLocationFromWhois();
112
+ } catch (error) {
113
+ return await this.getUserLocationFromWhois();
114
+ }
110
115
  }
111
116
 
112
117
  /**
113
118
  * Retrieves the user's location using the browser's navigator geolocation API.
114
- * @returns {Promise<Object>} A promise that resolves to geolocation coordinates.
119
+ * It creates a promise that resolves with the geolocation if successful,
120
+ * or with WHOIS data as a fallback in case of failure or absence of navigator geolocation.
121
+ *
122
+ * @returns {Promise<Object>} A promise that resolves to geolocation coordinates or WHOIS data.
115
123
  */
116
- getUserLocationFromNavigator() {
117
- return new Promise((resolve) => {
118
- // eslint-disable-next-line no-undef
119
- if (window.navigator && window.navigator.geolocation) {
120
- // eslint-disable-next-line no-undef
121
- return navigator.geolocation.getCurrentPosition(
122
- ({ coords }) => {
123
- this.updateLocation(coords);
124
- return resolve(coords);
125
- },
126
- () => {
127
- // If failed use user whois
128
- return resolve(this.getUserLocationFromWhois());
129
- }
130
- );
124
+ async getUserLocationFromNavigator() {
125
+ if (window.navigator && window.navigator.geolocation) {
126
+ try {
127
+ const position = await new Promise((resolve, reject) => {
128
+ navigator.geolocation.getCurrentPosition(resolve, reject, {
129
+ enableHighAccuracy: true,
130
+ timeout: 600,
131
+ });
132
+ });
133
+ const { latitude, longitude } = position.coords;
134
+ this.updateLocation({ latitude, longitude });
135
+ return { latitude, longitude };
136
+ } catch (error) {
137
+ return await this.getUserLocationFromWhois();
131
138
  }
132
-
133
- // default to whois lookup coordinates
134
- return resolve(this.getUserLocationFromWhois());
135
- });
139
+ } else {
140
+ return await this.getUserLocationFromWhois();
141
+ }
136
142
  }
137
143
 
138
144
  /**
139
- * Retrieves the user's location based on WHOIS data associated with the user's account.
140
- * @returns {Object} An object containing latitude and longitude from WHOIS data.
145
+ * Retrieves the user's location based on WHOIS data associated with their account.
146
+ * Defaults to predefined coordinates if WHOIS data is not available.
147
+ *
148
+ * @returns {Object} An object containing latitude and longitude from WHOIS data or default values.
141
149
  */
142
150
  getUserLocationFromWhois() {
143
151
  const whois = this.currentUser.getOption('whois');
@@ -151,8 +159,10 @@ export default class LocationService extends Service {
151
159
  }
152
160
 
153
161
  /**
154
- * Updates the service's tracked properties with the new location data and triggers an event.
155
- * @param {Object} coordinates - An object containing the latitude and longitude.
162
+ * Updates the service's tracked properties with the new location data.
163
+ * Triggers an event to notify other parts of the application that the user's location has been updated.
164
+ *
165
+ * @param {Object} coordinates - An object containing the latitude and longitude to be set.
156
166
  */
157
167
  updateLocation({ latitude, longitude }) {
158
168
  this.latitude = latitude;
@@ -17,7 +17,16 @@
17
17
 
18
18
  <div class="input-group">
19
19
  <InputLabel @labelText={{t "fleet-ops.operations.service-rates.index.new.service-order-label"}} @helpText={{t "fleet-ops.operations.service-rates.index.new.service-order-help-text"}} />
20
- <Select class="w-full" @options={{this.serviceTypes}} @value={{this.serviceRate.service_type}} @optionLabel="name" @optionValue="key" @onSelect={{fn (mut this.serviceRate.service_type)}} @placeholder={{t "fleet-ops.operations.service-rates.index.new.service-order-placeholder"}} />
20
+ <select class="form-select w-full has--placeholder" {{on "change" this.setConfig}}>
21
+ <option selected disabled>
22
+ {{t "fleet-ops.operations.service-rates.index.new.service-order-placeholder"}}
23
+ </option>
24
+ {{#each this.orderConfigs as |orderConfig|}}
25
+ <option value={{orderConfig.id}} selected={{eq orderConfig.id this.serviceRate.order_config_uuid}}>
26
+ {{orderConfig.name}}
27
+ </option>
28
+ {{/each}}
29
+ </select>
21
30
  </div>
22
31
 
23
32
  <div class="input-group">
package/composer.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetbase/fleetops-api",
3
- "version": "0.4.18",
3
+ "version": "0.4.20",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "keywords": [
6
6
  "fleetbase-extension",
@@ -22,7 +22,7 @@
22
22
  ],
23
23
  "require": {
24
24
  "php": "^8.0",
25
- "fleetbase/core-api": "^1.4.12",
25
+ "fleetbase/core-api": "^1.4.14",
26
26
  "barryvdh/laravel-dompdf": "^2.0",
27
27
  "brick/geo": "0.7.2",
28
28
  "cknow/laravel-money": "^7.1",
package/extension.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "Fleet-Ops",
3
- "version": "0.4.18",
3
+ "version": "0.4.20",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "repository": "https://github.com/fleetbase/fleetops",
6
6
  "license": "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fleetbase/fleetops-engine",
3
- "version": "0.4.18",
3
+ "version": "0.4.20",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "fleetbase": {
6
6
  "route": "fleet-ops"
@@ -42,9 +42,9 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@babel/core": "^7.23.2",
45
- "@fleetbase/ember-core": "^0.2.6",
45
+ "@fleetbase/ember-core": "^0.2.8",
46
46
  "@fleetbase/ember-ui": "^0.2.11",
47
- "@fleetbase/fleetops-data": "^0.1.13",
47
+ "@fleetbase/fleetops-data": "^0.1.14",
48
48
  "@fleetbase/leaflet-routing-machine": "^3.2.16",
49
49
  "@fortawesome/ember-fontawesome": "^0.4.1",
50
50
  "@fortawesome/fontawesome-svg-core": "^6.4.0",
@@ -2,10 +2,15 @@
2
2
 
3
3
  /**
4
4
  * -------------------------------------------
5
- * Fleetbase Core API Configuration
5
+ * FleetOps API Configuration
6
6
  * -------------------------------------------
7
7
  */
8
8
  return [
9
+ /*
10
+ |--------------------------------------------------------------------------
11
+ | API Config
12
+ |--------------------------------------------------------------------------
13
+ */
9
14
  'api' => [
10
15
  'version' => '0.0.1',
11
16
  'routing' => [
@@ -13,10 +18,128 @@ return [
13
18
  'internal_prefix' => 'int'
14
19
  ]
15
20
  ],
21
+ 'connection' => [
22
+ 'db' => env('DB_CONNECTION', 'mysql')
23
+ ],
24
+
25
+ /*
26
+ |--------------------------------------------------------------------------
27
+ | Navigator App
28
+ |--------------------------------------------------------------------------
29
+ */
16
30
  'navigator' => [
17
31
  'bypass_verification_code' => env('NAVIGATOR_BYPASS_VERIFICATION_CODE', '999000')
18
32
  ],
19
- 'connection' => [
20
- 'db' => env('DB_CONNECTION', 'mysql')
21
- ]
33
+
34
+ /*
35
+ |--------------------------------------------------------------------------
36
+ | API Events
37
+ |--------------------------------------------------------------------------
38
+ */
39
+ 'events' => [
40
+ // order events
41
+ 'order.created',
42
+ 'order.updated',
43
+ 'order.deleted',
44
+ 'order.dispatched',
45
+ 'order.dispatch_failed',
46
+ 'order.completed',
47
+ 'order.failed',
48
+ 'order.driver_assigned',
49
+ 'order.completed',
50
+
51
+ // payload events
52
+ 'payload.created',
53
+ 'payload.updated',
54
+ 'payload.deleted',
55
+
56
+ // entity events
57
+ 'entity.created',
58
+ 'entity.updated',
59
+ 'entity.deleted',
60
+ 'entity.driver_assigned',
61
+
62
+ // driver events
63
+ 'driver.created',
64
+ 'driver.updated',
65
+ 'driver.deleted',
66
+ 'driver.assigned',
67
+ // 'driver.entered_zone',
68
+ // 'driver.exited_zone',
69
+
70
+ // fleet events
71
+ 'fleet.created',
72
+ 'fleet.updated',
73
+ 'fleet.deleted',
74
+
75
+ // purchase_rate events
76
+ 'purchase_rate.created',
77
+ 'purchase_rate.updated',
78
+ 'purchase_rate.deleted',
79
+
80
+ // contact events
81
+ 'contact.created',
82
+ 'contact.updated',
83
+ 'contact.deleted',
84
+
85
+ // place events
86
+ 'place.created',
87
+ 'place.updated',
88
+ 'place.deleted',
89
+
90
+ // service_area events
91
+ 'service_area.created',
92
+ 'service_area.updated',
93
+ 'service_area.deleted',
94
+
95
+ // service_quote events
96
+ 'service_quote.created',
97
+ 'service_quote.updated',
98
+ 'service_quote.deleted',
99
+
100
+ // service_rate events
101
+ 'service_rate.created',
102
+ 'service_rate.updated',
103
+ 'service_rate.deleted',
104
+
105
+ // tracking_number events
106
+ 'tracking_number.created',
107
+ 'tracking_number.updated',
108
+ 'tracking_number.deleted',
109
+
110
+ // tracking_status events
111
+ 'tracking_status.created',
112
+ 'tracking_status.updated',
113
+ 'tracking_status.deleted',
114
+
115
+ // vehicle events
116
+ 'vehicle.created',
117
+ 'vehicle.updated',
118
+ 'vehicle.deleted',
119
+
120
+ // vendor events
121
+ 'vendor.created',
122
+ 'vendor.updated',
123
+ 'vendor.deleted',
124
+
125
+ // zone events
126
+ 'zone.created',
127
+ 'zone.updated',
128
+ 'zone.deleted',
129
+ ],
130
+
131
+ /*
132
+ |--------------------------------------------------------------------------
133
+ | Proof of Delivery Methods
134
+ |--------------------------------------------------------------------------
135
+ */
136
+ 'pod_methods' => 'scan,signature,photo',
137
+
138
+ /*
139
+ |--------------------------------------------------------------------------
140
+ | API/Webhook Versions
141
+ |--------------------------------------------------------------------------
142
+ */
143
+ 'versions' => ['2020-09-30', '2024-03-12'],
144
+ 'version' => '2024-03-12',
22
145
  ];
@@ -0,0 +1,28 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ return new class() extends Migration {
8
+ /**
9
+ * Run the migrations.
10
+ */
11
+ public function up(): void
12
+ {
13
+ Schema::table('service_rates', function (Blueprint $table) {
14
+ $table->foreignUuid('order_config_uuid')->nullable()->after('zone_uuid')->references('uuid')->on('order_configs')->onUpdate('CASCADE')->onDelete('CASCADE');
15
+ });
16
+ }
17
+
18
+ /**
19
+ * Reverse the migrations.
20
+ */
21
+ public function down(): void
22
+ {
23
+ Schema::table('service_rates', function (Blueprint $table) {
24
+ $table->dropForeign(['order_config_uuid']);
25
+ $table->dropColumn(['order_config_uuid']);
26
+ });
27
+ }
28
+ };
@@ -4,9 +4,9 @@ namespace Fleetbase\FleetOps\Console\Commands;
4
4
 
5
5
  use Fleetbase\FleetOps\Models\Order;
6
6
  use Fleetbase\FleetOps\Models\OrderConfig;
7
- use Fleetbase\Support\Utils;
7
+ use Fleetbase\FleetOps\Support\FleetOps;
8
+ use Fleetbase\Models\Company;
8
9
  use Illuminate\Console\Command;
9
- use Illuminate\Support\Facades\Artisan;
10
10
 
11
11
  class FixLegacyOrderConfigs extends Command
12
12
  {
@@ -15,7 +15,7 @@ class FixLegacyOrderConfigs extends Command
15
15
  *
16
16
  * @var string
17
17
  */
18
- protected $signature = 'fleetops:fix-legacy-order-configs';
18
+ protected $signature = 'fleetops:fix-legacy-order-configs {--create-configs}';
19
19
 
20
20
  /**
21
21
  * The console command description.
@@ -35,14 +35,20 @@ class FixLegacyOrderConfigs extends Command
35
35
  */
36
36
  public function handle()
37
37
  {
38
- if (Utils::classExists('\\Fleetbase\\FleetOps\\Seeders\\OrderConfigSeeder')) {
39
- $this->info('Starting the database seeding...');
40
-
41
- Artisan::call('db:seed', [
42
- '--class' => '\\Fleetbase\\FleetOps\\Seeders\\OrderConfigSeeder',
43
- ]);
44
-
45
- $this->info('Database seeding completed.');
38
+ $shouldCreateConfigs = $this->option('create-configs');
39
+ if ($shouldCreateConfigs) {
40
+ $companies = Company::all();
41
+ $totalCompanies = $companies->count();
42
+ $this->info('Initializing transport config for ' . $totalCompanies . ' companies.');
43
+ $progressBar = $this->output->createProgressBar($totalCompanies);
44
+ $progressBar->start();
45
+ foreach ($companies as $company) {
46
+ FleetOps::createTransportConfig($company);
47
+ $progressBar->advance();
48
+ }
49
+ $progressBar->finish();
50
+ $this->line('');
51
+ $this->info('All transport configs created.');
46
52
  }
47
53
 
48
54
  $orders = Order::whereNull('order_config_uuid')->get();
@@ -11,7 +11,6 @@ use Fleetbase\FleetOps\Http\Resources\v1\Driver as DriverResource;
11
11
  use Fleetbase\FleetOps\Jobs\SimulateDrivingRoute;
12
12
  use Fleetbase\FleetOps\Models\Driver;
13
13
  use Fleetbase\FleetOps\Models\Order;
14
- use Fleetbase\FleetOps\Support\Flow;
15
14
  use Fleetbase\FleetOps\Support\OSRM;
16
15
  use Fleetbase\FleetOps\Support\Utils;
17
16
  use Fleetbase\Http\Controllers\Controller;
@@ -25,6 +25,7 @@ use Fleetbase\FleetOps\Support\Utils;
25
25
  use Fleetbase\Http\Controllers\Controller;
26
26
  use Fleetbase\Models\Company;
27
27
  use Fleetbase\Models\File;
28
+ use Fleetbase\Models\Setting;
28
29
  use Fleetbase\Support\Auth;
29
30
  use Illuminate\Http\Request;
30
31
  use Illuminate\Support\Carbon;
@@ -433,8 +434,6 @@ class OrderController extends Controller
433
434
  public function query(Request $request)
434
435
  {
435
436
  $results = Order::queryWithRequest($request, function (&$query, $request) {
436
- $query->where('company_uuid', session('company'));
437
-
438
437
  if ($request->has('payload')) {
439
438
  $query->whereHas('payload', function ($q) use ($request) {
440
439
  $q->where('public_id', $request->input('payload'));
@@ -1364,4 +1363,52 @@ class OrderController extends Controller
1364
1363
 
1365
1364
  return new ProofResource($proof);
1366
1365
  }
1366
+
1367
+ /**
1368
+ * Retrieves editable fields for a specific order entity based on its configuration.
1369
+ *
1370
+ * This function looks up an order by its ID and retrieves configurable editable fields
1371
+ * associated with it, as defined in the settings. If the order is not found, it returns
1372
+ * a 404 response with an error message. Otherwise, it returns the editable fields for
1373
+ * the order entity.
1374
+ *
1375
+ * @param string $id the unique identifier of the order
1376
+ * @param Request $request the incoming request instance
1377
+ *
1378
+ * @return \Illuminate\Http\JsonResponse returns a JSON response containing either an error message
1379
+ * or the editable fields for the order entity
1380
+ *
1381
+ * @throws \Illuminate\Database\Eloquent\ModelNotFoundException thrown if the order with the given ID cannot be found
1382
+ */
1383
+ public function getEditableEntityFields(string $id, Request $request)
1384
+ {
1385
+ try {
1386
+ $order = Order::findRecordOrFail($id);
1387
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
1388
+ return response()->json(
1389
+ [
1390
+ 'error' => 'Order resource not found.',
1391
+ ],
1392
+ 404
1393
+ );
1394
+ }
1395
+
1396
+ // Define settings as array
1397
+ $entityEditingSettings = [];
1398
+
1399
+ // get the order config id
1400
+ $orderConfigId = data_get($order, 'order_config_uuid');
1401
+
1402
+ // Get entity editing settings
1403
+ $savedEntityEditingSettings = Setting::where('key', 'fleet-ops.entity-editing-settings')->value('value');
1404
+
1405
+ if ($orderConfigId && $savedEntityEditingSettings) {
1406
+ $resolvedEntityEditingSettings = data_get($savedEntityEditingSettings, $orderConfigId, []);
1407
+ if ($resolvedEntityEditingSettings) {
1408
+ $entityEditingSettings = data_get($resolvedEntityEditingSettings, 'editable_entity_fields', []);
1409
+ }
1410
+ }
1411
+
1412
+ return response()->json($entityEditingSettings);
1413
+ }
1367
1414
  }
@@ -4,6 +4,7 @@ namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
4
4
 
5
5
  use Fleetbase\FleetOps\Http\Requests\QueryServiceQuotesRequest;
6
6
  use Fleetbase\FleetOps\Http\Resources\v1\ServiceQuote as ServiceQuoteResource;
7
+ use Fleetbase\FleetOps\Models\Entity;
7
8
  use Fleetbase\FleetOps\Models\IntegratedVendor;
8
9
  use Fleetbase\FleetOps\Models\Payload;
9
10
  use Fleetbase\FleetOps\Models\Place;
@@ -76,11 +77,15 @@ class ServiceQuoteController extends Controller
76
77
 
77
78
  // if quote for single service
78
79
  if ($service && $service !== 'all') {
79
- $serviceRate = ServiceRate::where('uuid', $service)->where(function ($q) use ($currency) {
80
- if ($currency) {
81
- $q->where(DB::raw('lower(currency)'), strtolower($currency));
82
- }
83
- })->first();
80
+ $serviceRate = ServiceRate::where(
81
+ function ($query) use ($service) {
82
+ $query->where('uuid', $service)->orWhere('public_id', $service);
83
+ })->where(
84
+ function ($q) use ($currency) {
85
+ if ($currency) {
86
+ $q->where(DB::raw('lower(currency)'), strtolower($currency));
87
+ }
88
+ })->first();
84
89
  $serviceQuotes = collect();
85
90
 
86
91
  if ($serviceRate) {