@fleetbase/fleetops-engine 0.6.49 → 0.6.50

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 (142) hide show
  1. package/addon/components/customer/create-order-form.hbs +2 -2
  2. package/addon/components/customer/form.hbs +2 -2
  3. package/addon/components/customer/order-form.hbs +2 -2
  4. package/addon/components/customer/orders.hbs +2 -2
  5. package/addon/components/display-place.hbs +2 -2
  6. package/addon/components/map/google-live-map.js +6 -2
  7. package/addon/components/map/leaflet-live-map.hbs +48 -14
  8. package/addon/components/map/leaflet-live-map.js +184 -20
  9. package/addon/components/modals/order-change-destination.hbs +46 -0
  10. package/addon/components/modals/order-change-destination.js +106 -0
  11. package/addon/components/modals/stop-activity.hbs +28 -0
  12. package/addon/components/modals/stop-activity.js +52 -0
  13. package/addon/components/modals/update-order-activity.hbs +45 -3
  14. package/addon/components/modals/update-order-activity.js +143 -5
  15. package/addon/components/orchestrator/resource-panel.hbs +0 -10
  16. package/addon/components/orchestrator/resource-panel.js +2 -4
  17. package/addon/components/order/activity-list.hbs +2 -2
  18. package/addon/components/order/activity-timeline.hbs +31 -29
  19. package/addon/components/order/details/activity.hbs +3 -3
  20. package/addon/components/order/details/activity.js +11 -0
  21. package/addon/components/order/details/documents.js +2 -0
  22. package/addon/components/order/details/purchase-rate.hbs +2 -2
  23. package/addon/components/order/details/route.hbs +11 -3
  24. package/addon/components/order/details/route.js +91 -14
  25. package/addon/components/order/details/tracking.hbs +101 -72
  26. package/addon/components/order/details/tracking.js +149 -2
  27. package/addon/components/order/form/details.hbs +3 -3
  28. package/addon/components/order/form/documents.js +11 -4
  29. package/addon/components/order/form/route.hbs +108 -104
  30. package/addon/components/order/form/route.js +37 -1
  31. package/addon/components/order/form/service-rate.hbs +2 -2
  32. package/addon/components/order-config-manager/activity-flow.hbs +4 -1
  33. package/addon/components/order-config-manager/activity-flow.js +178 -12
  34. package/addon/components/place/address.js +1 -1
  35. package/addon/components/route-list.hbs +17 -17
  36. package/addon/components/route-list.js +42 -10
  37. package/addon/components/service-rate/details.hbs +41 -0
  38. package/addon/components/service-rate/form.hbs +118 -0
  39. package/addon/components/service-rate/form.js +55 -0
  40. package/addon/components/vehicle/form.js +1 -1
  41. package/addon/components/vehicle/pill.hbs +1 -1
  42. package/addon/controllers/management/vehicles/index/new.js +1 -1
  43. package/addon/controllers/operations/orders/index/details.js +4 -4
  44. package/addon/controllers/operations/orders/index.js +14 -0
  45. package/addon/helpers/place-address-html.js +2 -2
  46. package/addon/routes/operations/service-rates/index.js +1 -1
  47. package/addon/services/geofence.js +163 -19
  48. package/addon/services/leaflet-contextmenu-manager.js +27 -0
  49. package/addon/services/vehicle-actions.js +1 -1
  50. package/addon/styles/fleetops-engine.css +91 -1
  51. package/addon/utils/fleet-ops-options.js +2 -1
  52. package/addon/utils/normalize-order-config-flow.js +41 -0
  53. package/addon/utils/place-address-html.js +3 -2
  54. package/addon/utils/route-visualization.js +54 -7
  55. package/app/components/modals/order-change-destination.js +1 -0
  56. package/app/components/modals/stop-activity.js +1 -0
  57. package/composer.json +1 -1
  58. package/extension.json +1 -1
  59. package/package.json +3 -3
  60. package/server/migrations/2026_05_21_000001_add_geographic_rules_to_service_rate_fees_table.php +37 -0
  61. package/server/migrations/2026_05_25_000001_add_endpoint_tracking_refs_to_payloads_table.php +50 -0
  62. package/server/migrations/2026_05_27_000001_default_driver_vehicle_statuses_to_available.php +48 -0
  63. package/server/resources/views/labels/default.php +57 -49
  64. package/server/resources/views/labels/waypoint-label.php +27 -20
  65. package/server/seeders/Testing/ConnectivitySeeder.php +1 -0
  66. package/server/seeders/Testing/FleetSeeder.php +22 -22
  67. package/server/seeders/Testing/OrdersSeeder.php +6 -22
  68. package/server/seeders/Testing/VroomOrchestrationSeeder.php +21 -21
  69. package/server/src/Console/Commands/AuditCustomerUserConflicts.php +75 -0
  70. package/server/src/Exceptions/CustomerUserConflictException.php +13 -0
  71. package/server/src/Http/Controllers/Api/v1/ContactController.php +17 -2
  72. package/server/src/Http/Controllers/Api/v1/CustomerController.php +876 -0
  73. package/server/src/Http/Controllers/Api/v1/DriverController.php +1 -1
  74. package/server/src/Http/Controllers/Api/v1/OrderConfigController.php +54 -0
  75. package/server/src/Http/Controllers/Api/v1/OrderController.php +98 -70
  76. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +2 -2
  77. package/server/src/Http/Controllers/Api/v1/VehicleController.php +20 -3
  78. package/server/src/Http/Controllers/Internal/v1/ContactController.php +19 -0
  79. package/server/src/Http/Controllers/Internal/v1/LiveController.php +101 -66
  80. package/server/src/Http/Controllers/Internal/v1/OrderController.php +429 -26
  81. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +1 -1
  82. package/server/src/Http/Controllers/Internal/v1/SettingController.php +2 -2
  83. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +54 -1
  84. package/server/src/Http/Middleware/AuthenticateCustomerToken.php +34 -0
  85. package/server/src/Http/Requests/CreateCustomerOrderRequest.php +63 -0
  86. package/server/src/Http/Requests/CreateCustomerRequest.php +48 -0
  87. package/server/src/Http/Requests/CreateDriverRequest.php +1 -1
  88. package/server/src/Http/Requests/CreateVehicleRequest.php +25 -1
  89. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +1 -1
  90. package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +29 -0
  91. package/server/src/Http/Resources/Internal/v1/OrderConfig.php +41 -0
  92. package/server/src/Http/Resources/v1/Customer.php +79 -0
  93. package/server/src/Http/Resources/v1/OrderConfig.php +74 -0
  94. package/server/src/Http/Resources/v1/Payload.php +23 -20
  95. package/server/src/Http/Resources/v1/ServiceArea.php +33 -19
  96. package/server/src/Http/Resources/v1/ServiceRateFee.php +7 -0
  97. package/server/src/Listeners/HandleOrderDispatched.php +2 -2
  98. package/server/src/Models/Contact.php +92 -15
  99. package/server/src/Models/Customer.php +64 -0
  100. package/server/src/Models/Driver.php +12 -3
  101. package/server/src/Models/Entity.php +2 -2
  102. package/server/src/Models/Order.php +29 -4
  103. package/server/src/Models/Payload.php +17 -1
  104. package/server/src/Models/ServiceRate.php +273 -1
  105. package/server/src/Models/ServiceRateFee.php +39 -9
  106. package/server/src/Models/TrackingNumber.php +8 -2
  107. package/server/src/Models/Vehicle.php +18 -2
  108. package/server/src/Models/Waypoint.php +2 -2
  109. package/server/src/Notifications/LateDeparture.php +2 -2
  110. package/server/src/Notifications/ProlongedStoppage.php +2 -2
  111. package/server/src/Notifications/RouteDeviation.php +2 -2
  112. package/server/src/Observers/ContactObserver.php +2 -0
  113. package/server/src/Observers/ServiceRateObserver.php +6 -6
  114. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +1 -1
  115. package/server/src/Providers/FleetOpsServiceProvider.php +1 -0
  116. package/server/src/Support/Analytics/AbstractAnalytics.php +6 -6
  117. package/server/src/Support/Analytics/FuelEfficiency.php +2 -2
  118. package/server/src/Support/Analytics/OrdersByStatus.php +1 -1
  119. package/server/src/Support/Analytics/RevenueTrend.php +0 -1
  120. package/server/src/Support/Analytics/TopDrivers.php +1 -1
  121. package/server/src/Support/CustomerAuth.php +98 -0
  122. package/server/src/Support/LabelPdf.php +52 -0
  123. package/server/src/Support/Metrics/AbstractMetric.php +4 -4
  124. package/server/src/Support/ResolvesOrderServiceStops.php +512 -0
  125. package/server/src/Tracking/TrackingContextBuilder.php +41 -38
  126. package/server/src/Tracking/TrackingIntelligenceService.php +109 -9
  127. package/server/src/Tracking/TrackingStop.php +13 -11
  128. package/server/src/routes.php +43 -9
  129. package/server/tests/CapacityAllocationEngineTest.php +10 -10
  130. package/server/tests/CustomerContactIdentitySafetyTest.php +54 -0
  131. package/server/tests/CustomerEndpointTest.php +199 -0
  132. package/server/tests/DriverVehicleStatusDefaultTest.php +39 -0
  133. package/server/tests/LabelPdfRenderingTest.php +23 -0
  134. package/server/tests/LiveControllerViewportTest.php +60 -0
  135. package/server/tests/MetricsRegistryTest.php +4 -8
  136. package/server/tests/OrchestrationPayloadBuilderTest.php +2 -2
  137. package/server/tests/OrderConfigEndpointTest.php +86 -0
  138. package/server/tests/OrderFileAttachmentTest.php +20 -0
  139. package/server/tests/ServiceAreaZoneApiShapeTest.php +34 -0
  140. package/server/tests/VehicleDriverAssignmentTest.php +18 -0
  141. package/translations/en-us.yaml +1 -0
  142. package/server/migrations/2026_05_13_000001_repair_customer_contact_user_types.php +0 -86
@@ -0,0 +1,50 @@
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('payloads', function (Blueprint $table) {
14
+ if (!Schema::hasColumn('payloads', 'pickup_tracking_number_uuid')) {
15
+ $table->uuid('pickup_tracking_number_uuid')->nullable()->index('payloads_pickup_tracking_number_uuid_index')->after('pickup_uuid');
16
+ }
17
+
18
+ if (!Schema::hasColumn('payloads', 'dropoff_tracking_number_uuid')) {
19
+ $table->uuid('dropoff_tracking_number_uuid')->nullable()->index('payloads_dropoff_tracking_number_uuid_index')->after('dropoff_uuid');
20
+ }
21
+
22
+ if (!Schema::hasColumn('payloads', 'return_tracking_number_uuid')) {
23
+ $table->uuid('return_tracking_number_uuid')->nullable()->index('payloads_return_tracking_number_uuid_index')->after('return_uuid');
24
+ }
25
+ });
26
+ }
27
+
28
+ /**
29
+ * Reverse the migrations.
30
+ */
31
+ public function down(): void
32
+ {
33
+ Schema::table('payloads', function (Blueprint $table) {
34
+ if (Schema::hasColumn('payloads', 'pickup_tracking_number_uuid')) {
35
+ $table->dropIndex('payloads_pickup_tracking_number_uuid_index');
36
+ $table->dropColumn('pickup_tracking_number_uuid');
37
+ }
38
+
39
+ if (Schema::hasColumn('payloads', 'dropoff_tracking_number_uuid')) {
40
+ $table->dropIndex('payloads_dropoff_tracking_number_uuid_index');
41
+ $table->dropColumn('dropoff_tracking_number_uuid');
42
+ }
43
+
44
+ if (Schema::hasColumn('payloads', 'return_tracking_number_uuid')) {
45
+ $table->dropIndex('payloads_return_tracking_number_uuid_index');
46
+ $table->dropColumn('return_tracking_number_uuid');
47
+ }
48
+ });
49
+ }
50
+ };
@@ -0,0 +1,48 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\DB;
6
+ use Illuminate\Support\Facades\Schema;
7
+
8
+ return new class extends Migration {
9
+ /**
10
+ * Run the migrations.
11
+ *
12
+ * @return void
13
+ */
14
+ public function up()
15
+ {
16
+ DB::table('drivers')->where(function ($query) {
17
+ $query->where('status', 'active')->orWhereNull('status');
18
+ })->update(['status' => 'available']);
19
+
20
+ DB::table('vehicles')->where(function ($query) {
21
+ $query->where('status', 'active')->orWhereNull('status');
22
+ })->update(['status' => 'available']);
23
+
24
+ Schema::table('drivers', function (Blueprint $table) {
25
+ $table->string('status', 191)->nullable()->default('available')->change();
26
+ });
27
+
28
+ Schema::table('vehicles', function (Blueprint $table) {
29
+ $table->string('status')->nullable()->default('available')->change();
30
+ });
31
+ }
32
+
33
+ /**
34
+ * Reverse the migrations.
35
+ *
36
+ * @return void
37
+ */
38
+ public function down()
39
+ {
40
+ Schema::table('drivers', function (Blueprint $table) {
41
+ $table->string('status', 191)->nullable()->default(null)->change();
42
+ });
43
+
44
+ Schema::table('vehicles', function (Blueprint $table) {
45
+ $table->string('status')->nullable()->default(null)->change();
46
+ });
47
+ }
48
+ };
@@ -1,17 +1,25 @@
1
1
  <?php
2
2
 
3
3
  use Fleetbase\Fleetops\Models\Order;
4
- use Fleetbase\Support\Utils; ?>
4
+ use Fleetbase\Support\Utils;
5
+
6
+ ?>
5
7
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
8
  <html xmlns="http://www.w3.org/1999/xhtml">
7
9
 
8
10
  <head>
9
11
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
10
12
  <meta name="viewport" content="width=device-width, initial-scale=1" />
11
- <title><?= $company->name ?? ($order->internal_id ?? $order->public_id) ?> Label</title>
13
+ <title><?php echo e($company->name ?? ($order->internal_id ?? $order->public_id)); ?> Label</title>
12
14
  </head>
13
15
 
14
16
  <style>
17
+ body {
18
+ font-family: "DejaVu Sans", "Noto Sans", "Noto Sans Arabic", "Noto Sans CJK SC", "Noto Sans CJK JP", sans-serif;
19
+ font-size: 12px;
20
+ line-height: 1.35;
21
+ }
22
+
15
23
  .group:after {
16
24
  content: "";
17
25
  display: table;
@@ -45,33 +53,33 @@ use Fleetbase\Support\Utils; ?>
45
53
  <div style="width: 420px; border: 2px #414141 solid; margin: auto;">
46
54
  <div class="group" style="border-bottom: 1px #414141 solid; overflow: hidden;">
47
55
  <div style="float: left; width: 130px; height: 120px; border-right: 1px #414141 solid; text-align: center; padding: 10px; box-sizing: border-box;">
48
- <img src="data:image/png;base64,<?= Utils::notEmpty($trackingNumber) ? $trackingNumber->qr_code : $order->trackingNumber->qr_code ?>" style="width: 100%; height: 100%; object-fit: cover;">
56
+ <img src="data:image/png;base64,<?php echo Utils::notEmpty($trackingNumber) ? $trackingNumber->qr_code : $order->trackingNumber->qr_code; ?>" style="width: 100%; height: 100%; object-fit: cover;">
49
57
  </div>
50
58
  <div style="margin-top: 10px; padding-left: 10px;">
51
- <div style="font-size: 18px; font-weight: bold;"><?= strtoupper($company->name) ?></div>
59
+ <div style="font-size: 18px; font-weight: bold;"><?php echo e($company->name); ?></div>
52
60
  <div style="font-size: 16px; font-weight: 300; color: #000;">
53
61
  <?php
54
- if ($order && $order instanceof Order) {
55
- $order->load('purchaseRate.serviceQuote.serviceRate');
56
- $serviceName = data_get($order, 'purchaseRate.serviceQuote.serviceRate.service_name');
57
- if ($serviceName) {
58
- echo strtoupper($serviceName);
59
- }
60
- }
61
- ?>
62
+ if ($order && $order instanceof Order) {
63
+ $order->load('purchaseRate.serviceQuote.serviceRate');
64
+ $serviceName = data_get($order, 'purchaseRate.serviceQuote.serviceRate.service_name');
65
+ if ($serviceName) {
66
+ echo e($serviceName);
67
+ }
68
+ }
69
+ ?>
62
70
  </div>
63
71
  </div>
64
72
  </div>
65
73
 
66
74
  <?php
67
- // load payload locations
68
- if ($order) {
69
- $order->load('payload.pickup', 'payload.dropoff', 'payload.entities');
70
- $pickup = $pickup ?? $order->payload->pickup;
71
- $dropoff = $dropoff ?? $order->payload->dropoff;
72
- $entities = $entities ?? ($order->payload['entities'] ?? []);
73
- }
74
- ?>
75
+ // load payload locations
76
+ if ($order) {
77
+ $order->load('payload.pickup', 'payload.dropoff', 'payload.entities');
78
+ $pickup = $pickup ?? $order->payload->pickup;
79
+ $dropoff = $dropoff ?? $order->payload->dropoff;
80
+ $entities = $entities ?? ($order->payload['entities'] ?? []);
81
+ }
82
+ ?>
75
83
  <?php if ($pickup) { ?>
76
84
  <div class="group">
77
85
  <div class="group" style="border-bottom: 1px #414141 solid; padding: 15px;">
@@ -79,35 +87,35 @@ use Fleetbase\Support\Utils; ?>
79
87
  PICKUP:
80
88
  </div>
81
89
  <div class="places--display-address" style="float: left; display: inline-block">
82
- <div class="line"><strong><?= $pickup->name ?></strong></div>
83
- <div class="line"><?= $pickup->street1 ?></div>
90
+ <div class="line"><strong><?php echo e($pickup->name); ?></strong></div>
91
+ <div class="line"><?php echo e($pickup->street1); ?></div>
84
92
  <?php if (!empty($pickup->street2)) { ?>
85
- <div class="line"><?= $pickup->street2 ?></div>
93
+ <div class="line"><?php echo e($pickup->street2); ?></div>
86
94
  <?php } ?>
87
95
  <div class="line">
88
96
  <?php if (!empty($pickup->neighborhood)) { ?>
89
- <span class="segment"><?= $pickup->neighborhood ?></span>
97
+ <span class="segment"><?php echo e($pickup->neighborhood); ?></span>
90
98
  <?php } ?>
91
99
  <?php if (!empty($pickup->district)) { ?>
92
- <span class="segment"><?= $pickup->district ?></span>
100
+ <span class="segment"><?php echo e($pickup->district); ?></span>
93
101
  <?php } ?>
94
102
  </div>
95
103
  <div class="line">
96
104
  <?php if (!empty($pickup->postal_code)) { ?>
97
- <span class="segment"><?= $pickup->postal_code ?></span>
105
+ <span class="segment"><?php echo e($pickup->postal_code); ?></span>
98
106
  <?php } ?>
99
107
  <?php if (!empty($pickup->city)) { ?>
100
- <span class="segment"><?= $pickup->city ?></span>
108
+ <span class="segment"><?php echo e($pickup->city); ?></span>
101
109
  <?php } ?>
102
110
  <?php if (!empty($pickup->province)) { ?>
103
- <span class="segment"><?= $pickup->province ?></span>
111
+ <span class="segment"><?php echo e($pickup->province); ?></span>
104
112
  <?php } ?>
105
113
  <?php if (!empty($pickup->country)) { ?>
106
- <span class="segment"><?= $pickup->country ?></span>
114
+ <span class="segment"><?php echo e($pickup->country); ?></span>
107
115
  <?php } ?>
108
116
  </div>
109
117
  <?php if (!empty($pickup->phone_number)) { ?>
110
- <div class="line"><?= $pickup->phone_number ?></div>
118
+ <div class="line"><?php echo e($pickup->phone_number); ?></div>
111
119
  <?php } ?>
112
120
  </div>
113
121
  </div>
@@ -120,35 +128,35 @@ use Fleetbase\Support\Utils; ?>
120
128
  DROPOFF:
121
129
  </div>
122
130
  <div class="places--display-address" style="float: left; display: inline-block">
123
- <div class="line"><strong><?= $dropoff->name ?></strong></div>
124
- <div class="line"><?= $dropoff->street1 ?></div>
131
+ <div class="line"><strong><?php echo e($dropoff->name); ?></strong></div>
132
+ <div class="line"><?php echo e($dropoff->street1); ?></div>
125
133
  <?php if (!empty($dropoff->street2)) { ?>
126
- <div class="line"><?= $dropoff->street2 ?></div>
134
+ <div class="line"><?php echo e($dropoff->street2); ?></div>
127
135
  <?php } ?>
128
136
  <div class="line">
129
137
  <?php if (!empty($dropoff->neighborhood)) { ?>
130
- <span class="segment"><?= $dropoff->neighborhood ?></span>
138
+ <span class="segment"><?php echo e($dropoff->neighborhood); ?></span>
131
139
  <?php } ?>
132
140
  <?php if (!empty($dropoff->district)) { ?>
133
- <span class="segment"><?= $dropoff->district ?></span>
141
+ <span class="segment"><?php echo e($dropoff->district); ?></span>
134
142
  <?php } ?>
135
143
  </div>
136
144
  <div class="line">
137
145
  <?php if (!empty($dropoff->postal_code)) { ?>
138
- <span class="segment"><?= $dropoff->postal_code ?></span>
146
+ <span class="segment"><?php echo e($dropoff->postal_code); ?></span>
139
147
  <?php } ?>
140
148
  <?php if (!empty($dropoff->city)) { ?>
141
- <span class="segment"><?= $dropoff->city ?></span>
149
+ <span class="segment"><?php echo e($dropoff->city); ?></span>
142
150
  <?php } ?>
143
151
  <?php if (!empty($dropoff->province)) { ?>
144
- <span class="segment"><?= $dropoff->province ?></span>
152
+ <span class="segment"><?php echo e($dropoff->province); ?></span>
145
153
  <?php } ?>
146
154
  <?php if (!empty($dropoff->country)) { ?>
147
- <span class="segment"><?= $dropoff->country ?></span>
155
+ <span class="segment"><?php echo e($dropoff->country); ?></span>
148
156
  <?php } ?>
149
157
  </div>
150
158
  <?php if (!empty($dropoff->phone_number)) { ?>
151
- <div class="line"><?= $dropoff->phone_number ?></div>
159
+ <div class="line"><?php echo e($dropoff->phone_number); ?></div>
152
160
  <?php } ?>
153
161
  </div>
154
162
  </div>
@@ -162,12 +170,12 @@ use Fleetbase\Support\Utils; ?>
162
170
  <div class="line">
163
171
  <strong>
164
172
  <?php
165
- if (isset($entity['name']) && !empty($entity['name'])) {
166
- echo strtoupper($entity['name']) . ' - ' . ($entity['internal_id'] ?? '');
167
- } else {
168
- echo 'ITEM -' . ($entity['internal_id'] ?? '');
169
- }
170
- ?>
173
+ if (isset($entity['name']) && !empty($entity['name'])) {
174
+ echo e($entity['name'] . ' - ' . ($entity['internal_id'] ?? ''));
175
+ } else {
176
+ echo e('ITEM -' . ($entity['internal_id'] ?? ''));
177
+ }
178
+ ?>
171
179
  </strong>
172
180
  </div>
173
181
  <?php } ?>
@@ -177,11 +185,11 @@ use Fleetbase\Support\Utils; ?>
177
185
  <?php } ?>
178
186
  <div class="group">
179
187
  <div style="text-align: center; padding: 15px 0px; border-top: 1px #414141 solid;">
180
- <img src="data:image/png;base64,<?= isset($trackingNumber) ? $trackingNumber->barcode : $order->trackingNumber->barcode ?>" style="height: 90px; margin-top: 10px;">
181
- <div><?= strtoupper(isset($trackingNumber) ? $trackingNumber->tracking_number : $order->trackingNumber->tracking_number) ?></div>
188
+ <img src="data:image/png;base64,<?php echo isset($trackingNumber) ? $trackingNumber->barcode : $order->trackingNumber->barcode; ?>" style="height: 90px; margin-top: 10px;">
189
+ <div><?php echo e(strtoupper(isset($trackingNumber) ? $trackingNumber->tracking_number : $order->trackingNumber->tracking_number)); ?></div>
182
190
  </div>
183
191
  </div>
184
192
  </div>
185
193
  </body>
186
194
 
187
- </html>
195
+ </html>
@@ -1,5 +1,6 @@
1
1
  <?php
2
- use Fleetbase\Support\Utils;
2
+ use Fleetbase\Support\Utils;
3
+
3
4
  ?>
4
5
 
5
6
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -8,10 +9,16 @@ use Fleetbase\Support\Utils;
8
9
  <head>
9
10
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
10
11
  <meta name="viewport" content="width=device-width, initial-scale=1" />
11
- <title><?= $company->name ?? ($waypoint->internal_id ?? $waypoint->public_id) ?> Waypoint Label</title>
12
+ <title><?php echo e($company->name ?? ($waypoint->internal_id ?? $waypoint->public_id)); ?> Waypoint Label</title>
12
13
  </head>
13
14
 
14
15
  <style>
16
+ body {
17
+ font-family: "DejaVu Sans", "Noto Sans", "Noto Sans Arabic", "Noto Sans CJK SC", "Noto Sans CJK JP", sans-serif;
18
+ font-size: 12px;
19
+ line-height: 1.35;
20
+ }
21
+
15
22
  .group:after {
16
23
  content: "";
17
24
  display: table;
@@ -45,10 +52,10 @@ use Fleetbase\Support\Utils;
45
52
  <div style="width: 420px; border: 2px #414141 solid; margin: auto;">
46
53
  <div class="group" style="border-bottom: 1px #414141 solid; overflow: hidden;">
47
54
  <div style="float: left; width: 130px; height: 120px; border-right: 1px #414141 solid; text-align: center; padding: 10px; box-sizing: border-box;">
48
- <img src="data:image/png;base64,<?= Utils::notEmpty($trackingNumber) ? $trackingNumber->qr_code : $order->trackingNumber->qr_code ?>" style="width: 100%; height: 100%; object-fit: cover;">
55
+ <img src="data:image/png;base64,<?php echo Utils::notEmpty($trackingNumber) ? $trackingNumber->qr_code : $order->trackingNumber->qr_code; ?>" style="width: 100%; height: 100%; object-fit: cover;">
49
56
  </div>
50
57
  <div style="margin-top: 10px;">
51
- <span style="padding-left: 10px; font-size: 18px; font-weight: bold;"><?= strtoupper($company->name) ?></span>
58
+ <span style="padding-left: 10px; font-size: 18px; font-weight: bold;"><?php echo e($company->name); ?></span>
52
59
  </div>
53
60
  </div>
54
61
 
@@ -59,35 +66,35 @@ use Fleetbase\Support\Utils;
59
66
  ADDRESS:
60
67
  </div>
61
68
  <div class="places--display-address" style="float: left; display: inline-block">
62
- <div class="line"><strong><?= $dropoff->name ?></strong></div>
63
- <div class="line"><?= $dropoff->street1 ?></div>
69
+ <div class="line"><strong><?php echo e($dropoff->name); ?></strong></div>
70
+ <div class="line"><?php echo e($dropoff->street1); ?></div>
64
71
  <?php if (!empty($dropoff->street2)) { ?>
65
- <div class="line"><?= $dropoff->street2 ?></div>
72
+ <div class="line"><?php echo e($dropoff->street2); ?></div>
66
73
  <?php } ?>
67
74
  <div class="line">
68
75
  <?php if (!empty($dropoff->neighborhood)) { ?>
69
- <span class="segment"><?= $dropoff->neighborhood ?></span>
76
+ <span class="segment"><?php echo e($dropoff->neighborhood); ?></span>
70
77
  <?php } ?>
71
78
  <?php if (!empty($dropoff->district)) { ?>
72
- <span class="segment"><?= $dropoff->district ?></span>
79
+ <span class="segment"><?php echo e($dropoff->district); ?></span>
73
80
  <?php } ?>
74
81
  </div>
75
82
  <div class="line">
76
83
  <?php if (!empty($dropoff->postal_code)) { ?>
77
- <span class="segment"><?= $dropoff->postal_code ?></span>
84
+ <span class="segment"><?php echo e($dropoff->postal_code); ?></span>
78
85
  <?php } ?>
79
86
  <?php if (!empty($dropoff->city)) { ?>
80
- <span class="segment"><?= $dropoff->city ?></span>
87
+ <span class="segment"><?php echo e($dropoff->city); ?></span>
81
88
  <?php } ?>
82
89
  <?php if (!empty($dropoff->province)) { ?>
83
- <span class="segment"><?= $dropoff->province ?></span>
90
+ <span class="segment"><?php echo e($dropoff->province); ?></span>
84
91
  <?php } ?>
85
92
  <?php if (!empty($dropoff->country)) { ?>
86
- <span class="segment"><?= $dropoff->country ?></span>
93
+ <span class="segment"><?php echo e($dropoff->country); ?></span>
87
94
  <?php } ?>
88
95
  </div>
89
96
  <?php if (!empty($dropoff->phone_number)) { ?>
90
- <div class="line"><?= $dropoff->phone_number ?></div>
97
+ <div class="line"><?php echo e($dropoff->phone_number); ?></div>
91
98
  <?php } ?>
92
99
  </div>
93
100
  </div>
@@ -102,11 +109,11 @@ use Fleetbase\Support\Utils;
102
109
  <strong>
103
110
  <?php
104
111
  if (data_get($entity, 'name')) {
105
- echo strtoupper(data_get($entity, 'name') . ' - ' . data_get($entity, 'internal_id', ''));
112
+ echo e(data_get($entity, 'name') . ' - ' . data_get($entity, 'internal_id', ''));
106
113
  } else {
107
- echo strtoupper('ITEM - ' . data_get($entity, 'internal_id', ''));
114
+ echo e('ITEM - ' . data_get($entity, 'internal_id', ''));
108
115
  }
109
- ?>
116
+ ?>
110
117
  </strong>
111
118
  </div>
112
119
  <?php } ?>
@@ -116,11 +123,11 @@ use Fleetbase\Support\Utils;
116
123
  <?php } ?>
117
124
  <div class="group">
118
125
  <div style="text-align: center; padding: 15px 0px; border-top: 1px #414141 solid;">
119
- <img src="data:image/png;base64,<?= isset($trackingNumber) ? $trackingNumber->barcode : $order->trackingNumber->barcode ?>" style="height: 90px; margin-top: 10px;">
120
- <div><?= strtoupper(isset($trackingNumber) ? $trackingNumber->tracking_number : $order->trackingNumber->tracking_number) ?></div>
126
+ <img src="data:image/png;base64,<?php echo isset($trackingNumber) ? $trackingNumber->barcode : $order->trackingNumber->barcode; ?>" style="height: 90px; margin-top: 10px;">
127
+ <div><?php echo e(strtoupper(isset($trackingNumber) ? $trackingNumber->tracking_number : $order->trackingNumber->tracking_number)); ?></div>
121
128
  </div>
122
129
  </div>
123
130
  </div>
124
131
  </body>
125
132
 
126
- </html>
133
+ </html>
@@ -142,6 +142,7 @@ class ConnectivitySeeder extends Seeder
142
142
  'min_threshold' => $min,
143
143
  'max_threshold' => $max,
144
144
  'threshold_inclusive' => true,
145
+ 'last_position' => $device?->last_position ?? $this->point(0, 0),
145
146
  'last_reading_at' => $this->timestamp(2),
146
147
  'last_value' => $lastValue,
147
148
  'sensorable_type' => Device::class,
@@ -85,30 +85,30 @@ class FleetSeeder extends Seeder
85
85
  protected function seedVehicles(Company $company): array
86
86
  {
87
87
  $vehicles = [
88
- 'van_central' => ['CEN-01', 'Toyota', 'HiAce', 'GBB-1001', 1.2819, 103.8507, true, 'active', 250, 8, 2, 42],
89
- 'van_east' => ['EAS-01', 'Nissan', 'NV200', 'GBB-1002', 1.3520, 103.9449, true, 'active', 160, 5, 1, 28],
88
+ 'van_central' => ['CEN-01', 'Toyota', 'HiAce', 'GBB-1001', 1.2819, 103.8507, true, 'available', 250, 8, 2, 42],
89
+ 'van_east' => ['EAS-01', 'Nissan', 'NV200', 'GBB-1002', 1.3520, 103.9449, true, 'available', 160, 5, 1, 28],
90
90
  'truck_maintenance' => ['WRK-03', 'Isuzu', 'NPR', 'GBB-1003', 1.3347, 103.7423, false, 'maintenance', 900, 24, 8, 160],
91
91
  'bike_unassigned' => ['RCH-04', 'Honda', 'PCX', 'GBB-1004', 1.3039, 103.8520, false, 'inactive', 25, 1, 0, 6],
92
- 'van_airport' => ['CGO-05', 'Mercedes-Benz', 'Vito', 'GBB-1005', 1.3644, 103.9915, true, 'active', 220, 7, 2, 36],
93
- 'van_cold_chain' => ['CLD-06', 'Hyundai', 'H350', 'GBB-1006', 1.3525, 103.9447, true, 'active', 300, 10, 3, 48],
94
- 'truck_west' => ['JUR-07', 'Hino', '300 Series', 'GBB-1007', 1.3345, 103.7420, true, 'active', 1200, 30, 10, 180],
95
- 'van_linehaul' => ['LNH-08', 'Ford', 'Transit', 'GBB-1008', 1.3215, 103.7055, false, 'active', 450, 14, 4, 72],
96
- 'van_returns' => ['RTN-09', 'Peugeot', 'Expert', 'GBB-1009', 1.3150, 103.7649, true, 'active', 180, 6, 1, 32],
97
- 'van_central_2' => ['CEN-02', 'Toyota', 'HiAce', 'GBB-1010', 1.2871, 103.8550, true, 'active', 250, 8, 2, 42],
98
- 'van_central_3' => ['CEN-03', 'Nissan', 'NV350', 'GBB-1011', 1.2950, 103.8468, true, 'active', 280, 9, 2, 45],
99
- 'bike_rochor_2' => ['RCH-11', 'Yamaha', 'NMAX', 'GBB-1012', 1.3042, 103.8528, true, 'active', 25, 1, 0, 6],
100
- 'bike_rochor_3' => ['RCH-12', 'Honda', 'ADV160', 'GBB-1013', 1.3017, 103.8509, true, 'active', 30, 1, 0, 7],
101
- 'truck_alexandra_1' => ['ALX-14', 'Mitsubishi Fuso', 'Canter', 'GBB-1014', 1.2868, 103.8054, true, 'active', 850, 20, 6, 120],
102
- 'van_alexandra_2' => ['ALX-15', 'Ford', 'Transit Custom', 'GBB-1015', 1.2881, 103.8079, false, 'active', 400, 12, 3, 64],
103
- 'van_changi_2' => ['CGO-16', 'Mercedes-Benz', 'Sprinter', 'GBB-1016', 1.3658, 103.9871, true, 'active', 500, 16, 4, 80],
104
- 'truck_changi_3' => ['CGO-17', 'Isuzu', 'NPR', 'GBB-1017', 1.3610, 103.9954, true, 'active', 1000, 26, 8, 150],
105
- 'van_tampines_cold_2' => ['CLD-18', 'Hyundai', 'H350', 'GBB-1018', 1.3529, 103.9460, true, 'active', 320, 10, 3, 50],
92
+ 'van_airport' => ['CGO-05', 'Mercedes-Benz', 'Vito', 'GBB-1005', 1.3644, 103.9915, true, 'available', 220, 7, 2, 36],
93
+ 'van_cold_chain' => ['CLD-06', 'Hyundai', 'H350', 'GBB-1006', 1.3525, 103.9447, true, 'available', 300, 10, 3, 48],
94
+ 'truck_west' => ['JUR-07', 'Hino', '300 Series', 'GBB-1007', 1.3345, 103.7420, true, 'available', 1200, 30, 10, 180],
95
+ 'van_linehaul' => ['LNH-08', 'Ford', 'Transit', 'GBB-1008', 1.3215, 103.7055, false, 'available', 450, 14, 4, 72],
96
+ 'van_returns' => ['RTN-09', 'Peugeot', 'Expert', 'GBB-1009', 1.3150, 103.7649, true, 'available', 180, 6, 1, 32],
97
+ 'van_central_2' => ['CEN-02', 'Toyota', 'HiAce', 'GBB-1010', 1.2871, 103.8550, true, 'available', 250, 8, 2, 42],
98
+ 'van_central_3' => ['CEN-03', 'Nissan', 'NV350', 'GBB-1011', 1.2950, 103.8468, true, 'available', 280, 9, 2, 45],
99
+ 'bike_rochor_2' => ['RCH-11', 'Yamaha', 'NMAX', 'GBB-1012', 1.3042, 103.8528, true, 'available', 25, 1, 0, 6],
100
+ 'bike_rochor_3' => ['RCH-12', 'Honda', 'ADV160', 'GBB-1013', 1.3017, 103.8509, true, 'available', 30, 1, 0, 7],
101
+ 'truck_alexandra_1' => ['ALX-14', 'Mitsubishi Fuso', 'Canter', 'GBB-1014', 1.2868, 103.8054, true, 'available', 850, 20, 6, 120],
102
+ 'van_alexandra_2' => ['ALX-15', 'Ford', 'Transit Custom', 'GBB-1015', 1.2881, 103.8079, false, 'available', 400, 12, 3, 64],
103
+ 'van_changi_2' => ['CGO-16', 'Mercedes-Benz', 'Sprinter', 'GBB-1016', 1.3658, 103.9871, true, 'available', 500, 16, 4, 80],
104
+ 'truck_changi_3' => ['CGO-17', 'Isuzu', 'NPR', 'GBB-1017', 1.3610, 103.9954, true, 'available', 1000, 26, 8, 150],
105
+ 'van_tampines_cold_2' => ['CLD-18', 'Hyundai', 'H350', 'GBB-1018', 1.3529, 103.9460, true, 'available', 320, 10, 3, 50],
106
106
  'van_tampines_cold_3' => ['CLD-19', 'Toyota', 'HiAce Refrigerated', 'GBB-1019', 1.3498, 103.9425, false, 'maintenance', 260, 8, 2, 40],
107
- 'truck_jurong_2' => ['JUR-20', 'Hino', '500 Series', 'GBB-1020', 1.3340, 103.7398, true, 'active', 1400, 34, 12, 220],
108
- 'van_jurong_3' => ['JUR-21', 'Nissan', 'Urvan', 'GBB-1021', 1.3362, 103.7451, true, 'active', 300, 9, 2, 52],
109
- 'truck_linehaul_2' => ['LNH-22', 'Volvo', 'FL', 'GBB-1022', 1.3210, 103.7032, true, 'active', 1800, 42, 14, 260],
110
- 'van_linehaul_3' => ['LNH-23', 'Ford', 'Transit', 'GBB-1023', 1.3234, 103.7088, true, 'active', 470, 14, 4, 72],
111
- 'van_returns_2' => ['RTN-24', 'Peugeot', 'Expert', 'GBB-1024', 1.3168, 103.7660, true, 'active', 180, 6, 1, 32],
107
+ 'truck_jurong_2' => ['JUR-20', 'Hino', '500 Series', 'GBB-1020', 1.3340, 103.7398, true, 'available', 1400, 34, 12, 220],
108
+ 'van_jurong_3' => ['JUR-21', 'Nissan', 'Urvan', 'GBB-1021', 1.3362, 103.7451, true, 'available', 300, 9, 2, 52],
109
+ 'truck_linehaul_2' => ['LNH-22', 'Volvo', 'FL', 'GBB-1022', 1.3210, 103.7032, true, 'available', 1800, 42, 14, 260],
110
+ 'van_linehaul_3' => ['LNH-23', 'Ford', 'Transit', 'GBB-1023', 1.3234, 103.7088, true, 'available', 470, 14, 4, 72],
111
+ 'van_returns_2' => ['RTN-24', 'Peugeot', 'Expert', 'GBB-1024', 1.3168, 103.7660, true, 'available', 180, 6, 1, 32],
112
112
  'bike_returns_3' => ['RTN-25', 'Honda', 'PCX', 'GBB-1025', 1.3136, 103.7629, false, 'inactive', 25, 1, 0, 6],
113
113
  ];
114
114
 
@@ -167,7 +167,7 @@ class FleetSeeder extends Seeder
167
167
  'city' => 'Singapore',
168
168
  'online' => $online,
169
169
  'current_status' => $status,
170
- 'status' => 'active',
170
+ 'status' => 'available',
171
171
  'skills' => $skills,
172
172
  'max_travel_time' => 3600,
173
173
  'max_distance' => 60000,
@@ -82,7 +82,6 @@ class OrdersSeeder extends Seeder
82
82
  'order_started' => ['started', 'driver_ken', 'van_east', 'customer_ben', 'airport_hub', 'tampines_store', [], 8, 1, null, true, true],
83
83
  'order_completed' => ['completed', 'driver_ava', 'van_central', 'customer_alice', 'central_depot', 'orchard_store', [], -4, 1, null, true, true],
84
84
  'order_canceled' => ['canceled', null, null, 'customer_ben', 'central_depot', 'rochor_store', [], -2, 1, null, false, false],
85
- 'order_failed' => ['failed', 'driver_ken', 'van_east', 'customer_ben', 'airport_hub', 'tampines_store', [], -1, 1, null, true, true],
86
85
  'order_vehicle_assigned' => ['created', null, 'van_central', 'customer_alice', 'west_depot', 'airport_hub', ['orchard_store', 'rochor_store'], 10, 3, null, false, false],
87
86
  ];
88
87
 
@@ -111,15 +110,15 @@ class OrdersSeeder extends Seeder
111
110
  'status' => $status,
112
111
  'notes' => 'FleetOps testing fixture order: ' . $seedId,
113
112
  'pod_method' => 'scan',
114
- 'pod_required' => in_array($status, ['completed', 'failed'], true),
115
- 'orchestrator_priority' => $status === 'failed' ? 90 : 50,
113
+ 'pod_required' => $status === 'completed',
114
+ 'orchestrator_priority' => 50,
116
115
  'required_skills' => $vehicleSeedId === 'van_east' ? ['cold_chain'] : [],
117
116
  'meta' => $this->meta($seedId),
118
117
  'created_at' => $this->timestamp($hourOffset),
119
118
  'updated_at' => $this->timestamp($hourOffset + 1),
120
119
  ]);
121
120
 
122
- $trackingNumber = $this->createTrackingNumber($company, $order, $seedId, $status);
121
+ $trackingNumber = $this->createTrackingNumber($company, $order, $seedId);
123
122
  $order->forceFill(['tracking_number_uuid' => $trackingNumber->uuid])->save();
124
123
  $this->seedEntities($company, $payload, $trackingNumber, $seedId, $entityCount, $places[$dropoffSeedId]);
125
124
  }
@@ -154,7 +153,7 @@ class OrdersSeeder extends Seeder
154
153
  return $payload;
155
154
  }
156
155
 
157
- protected function createTrackingNumber(Company $company, Order $order, string $seedId, string $status): TrackingNumber
156
+ protected function createTrackingNumber(Company $company, Order $order, string $seedId): TrackingNumber
158
157
  {
159
158
  /** @var TrackingNumber $trackingNumber */
160
159
  $trackingNumber = $this->createRecord(TrackingNumber::class, [
@@ -166,22 +165,6 @@ class OrdersSeeder extends Seeder
166
165
  'region' => 'SG',
167
166
  ]);
168
167
 
169
- $trackingStatus = $this->createRecord(TrackingStatus::class, [
170
- '_key' => $this->fixtureKey($seedId . '_tracking_status'),
171
- 'company_uuid' => $company->uuid,
172
- 'tracking_number_uuid' => $trackingNumber->uuid,
173
- 'status' => str_replace('_', ' ', $status),
174
- 'details' => 'FleetOps testing tracking status for ' . $seedId,
175
- 'code' => $status,
176
- 'complete' => $status === 'completed',
177
- 'city' => 'Singapore',
178
- 'country' => 'SG',
179
- 'location' => $this->point(1.3048, 103.8318),
180
- 'meta' => $this->meta($seedId . '_tracking_status'),
181
- ]);
182
-
183
- $trackingNumber->forceFill(['status_uuid' => $trackingStatus->uuid])->save();
184
-
185
168
  return $trackingNumber;
186
169
  }
187
170
 
@@ -191,6 +174,7 @@ class OrdersSeeder extends Seeder
191
174
  $this->createRecord(Entity::class, [
192
175
  '_key' => $this->fixtureKey($seedId . '_entity_' . $i),
193
176
  '_import_id' => $this->fixtureKey($seedId . ':entity:' . $i),
177
+ 'public_id' => Entity::generatePublicId(),
194
178
  'company_uuid' => $company->uuid,
195
179
  'payload_uuid' => $payload->uuid,
196
180
  'tracking_number_uuid' => $trackingNumber->uuid,
@@ -208,7 +192,7 @@ class OrdersSeeder extends Seeder
208
192
  'currency' => 'SGD',
209
193
  'declared_value' => 1000 + ($i * 100),
210
194
  'meta' => $this->meta($seedId . '_entity_' . $i),
211
- ]);
195
+ ], true);
212
196
  }
213
197
  }
214
198
  }