@fleetbase/fleetops-engine 0.6.48 → 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 (266) 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/driver/details.hbs +5 -1
  7. package/addon/components/driver/form.hbs +11 -1
  8. package/addon/components/fleet-listing-panel.hbs +2 -2
  9. package/addon/components/fleet-listing-panel.js +10 -0
  10. package/addon/components/map/google-live-map.js +18 -75
  11. package/addon/components/map/leaflet-live-map.hbs +187 -37
  12. package/addon/components/map/leaflet-live-map.js +184 -20
  13. package/addon/components/modals/order-change-destination.hbs +46 -0
  14. package/addon/components/modals/order-change-destination.js +106 -0
  15. package/addon/components/modals/stop-activity.hbs +28 -0
  16. package/addon/components/modals/stop-activity.js +52 -0
  17. package/addon/components/modals/update-order-activity.hbs +45 -3
  18. package/addon/components/modals/update-order-activity.js +143 -5
  19. package/addon/components/orchestrator/phase-builder.hbs +21 -0
  20. package/addon/components/orchestrator/phase-builder.js +13 -0
  21. package/addon/components/orchestrator/resource-panel.hbs +0 -10
  22. package/addon/components/orchestrator/resource-panel.js +2 -4
  23. package/addon/components/orchestrator-workbench.js +1 -0
  24. package/addon/components/order/activity-list.hbs +2 -2
  25. package/addon/components/order/activity-timeline.hbs +31 -29
  26. package/addon/components/order/details/activity.hbs +3 -3
  27. package/addon/components/order/details/activity.js +11 -0
  28. package/addon/components/order/details/documents.js +2 -0
  29. package/addon/components/order/details/purchase-rate.hbs +2 -2
  30. package/addon/components/order/details/route.hbs +11 -3
  31. package/addon/components/order/details/route.js +91 -14
  32. package/addon/components/order/details/tracking.hbs +101 -72
  33. package/addon/components/order/details/tracking.js +149 -2
  34. package/addon/components/order/form/details.hbs +3 -3
  35. package/addon/components/order/form/documents.js +11 -4
  36. package/addon/components/order/form/route.hbs +108 -104
  37. package/addon/components/order/form/route.js +37 -1
  38. package/addon/components/order/form/service-rate.hbs +2 -2
  39. package/addon/components/order/form.hbs +2 -2
  40. package/addon/components/order-config-manager/activity-flow.hbs +4 -1
  41. package/addon/components/order-config-manager/activity-flow.js +178 -12
  42. package/addon/components/place/address.js +1 -1
  43. package/addon/components/route-list.hbs +17 -17
  44. package/addon/components/route-list.js +42 -10
  45. package/addon/components/service-rate/details.hbs +41 -0
  46. package/addon/components/service-rate/form.hbs +118 -0
  47. package/addon/components/service-rate/form.js +55 -0
  48. package/addon/components/vehicle/form.js +1 -1
  49. package/addon/components/vehicle/pill.hbs +1 -1
  50. package/addon/components/widget/fleet-ops-key-metrics.hbs +19 -17
  51. package/addon/components/widget/fleet-ops-key-metrics.js +26 -0
  52. package/addon/components/widget/fuel-efficiency.hbs +26 -0
  53. package/addon/components/widget/fuel-efficiency.js +43 -0
  54. package/addon/components/widget/geofence-violations.hbs +44 -0
  55. package/addon/components/widget/geofence-violations.js +55 -0
  56. package/addon/components/widget/issues-insights.hbs +43 -0
  57. package/addon/components/widget/issues-insights.js +62 -0
  58. package/addon/components/widget/kpi-active-orders.hbs +10 -0
  59. package/addon/components/widget/kpi-active-orders.js +5 -0
  60. package/addon/components/widget/kpi-aov.hbs +10 -0
  61. package/addon/components/widget/kpi-aov.js +5 -0
  62. package/addon/components/widget/kpi-distance.hbs +10 -0
  63. package/addon/components/widget/kpi-distance.js +5 -0
  64. package/addon/components/widget/kpi-drivers-online.hbs +10 -0
  65. package/addon/components/widget/kpi-drivers-online.js +5 -0
  66. package/addon/components/widget/kpi-earnings.hbs +10 -0
  67. package/addon/components/widget/kpi-earnings.js +5 -0
  68. package/addon/components/widget/kpi-open-issues.hbs +11 -0
  69. package/addon/components/widget/kpi-open-issues.js +5 -0
  70. package/addon/components/widget/kpi-tile.hbs +59 -0
  71. package/addon/components/widget/kpi-tile.js +168 -0
  72. package/addon/components/widget/live-fleet.hbs +122 -0
  73. package/addon/components/widget/live-fleet.js +365 -0
  74. package/addon/components/widget/maintenance-overview.hbs +45 -0
  75. package/addon/components/widget/maintenance-overview.js +40 -0
  76. package/addon/components/widget/on-time-delivery.hbs +27 -0
  77. package/addon/components/widget/on-time-delivery.js +73 -0
  78. package/addon/components/widget/operations-pulse.hbs +51 -0
  79. package/addon/components/widget/operations-pulse.js +173 -0
  80. package/addon/components/widget/orders-by-status.hbs +26 -0
  81. package/addon/components/widget/orders-by-status.js +54 -0
  82. package/addon/components/widget/revenue-trend.hbs +34 -0
  83. package/addon/components/widget/revenue-trend.js +67 -0
  84. package/addon/components/widget/top-drivers.hbs +44 -0
  85. package/addon/components/widget/top-drivers.js +54 -0
  86. package/addon/controllers/management/vehicles/index/new.js +1 -1
  87. package/addon/controllers/operations/orders/index/details.js +4 -4
  88. package/addon/controllers/operations/orders/index.js +14 -0
  89. package/addon/controllers/settings/routing.js +26 -0
  90. package/addon/extension.js +172 -3
  91. package/addon/helpers/place-address-html.js +2 -2
  92. package/addon/routes/operations/service-rates/index.js +1 -1
  93. package/addon/services/geofence.js +163 -19
  94. package/addon/services/leaflet-contextmenu-manager.js +27 -0
  95. package/addon/services/map-adapter/google.js +13 -2
  96. package/addon/services/vehicle-actions.js +1 -1
  97. package/addon/styles/fleetops-engine.css +205 -88
  98. package/addon/templates/maintenance/equipment/index.hbs +1 -1
  99. package/addon/templates/maintenance/parts/index.hbs +1 -1
  100. package/addon/templates/maintenance/schedules/index.hbs +1 -1
  101. package/addon/templates/management/vehicles/index.hbs +1 -1
  102. package/addon/templates/settings/avatars.hbs +1 -1
  103. package/addon/templates/settings/custom-fields.hbs +1 -1
  104. package/addon/templates/settings/map.hbs +1 -1
  105. package/addon/templates/settings/navigator-app.hbs +1 -1
  106. package/addon/templates/settings/notifications.hbs +1 -1
  107. package/addon/templates/settings/orchestrator.hbs +1 -1
  108. package/addon/templates/settings/payments/index.hbs +1 -1
  109. package/addon/templates/settings/payments/onboard.hbs +1 -1
  110. package/addon/templates/settings/routing.hbs +22 -2
  111. package/addon/templates/settings/scheduling.hbs +1 -1
  112. package/addon/utils/fleet-ops-options.js +2 -1
  113. package/addon/utils/live-map-card-content.js +171 -0
  114. package/addon/utils/normalize-order-config-flow.js +41 -0
  115. package/addon/utils/place-address-html.js +3 -2
  116. package/addon/utils/route-visualization.js +54 -7
  117. package/app/components/modals/order-change-destination.js +1 -0
  118. package/app/components/modals/stop-activity.js +1 -0
  119. package/app/components/widget/fuel-efficiency.js +1 -0
  120. package/app/components/widget/geofence-violations.js +1 -0
  121. package/app/components/widget/issues-insights.js +1 -0
  122. package/app/components/widget/kpi-active-orders.js +1 -0
  123. package/app/components/widget/kpi-aov.js +1 -0
  124. package/app/components/widget/kpi-distance.js +1 -0
  125. package/app/components/widget/kpi-drivers-online.js +1 -0
  126. package/app/components/widget/kpi-earnings.js +1 -0
  127. package/app/components/widget/kpi-open-issues.js +1 -0
  128. package/app/components/widget/kpi-tile.js +1 -0
  129. package/app/components/widget/live-fleet.js +1 -0
  130. package/app/components/widget/maintenance-overview.js +1 -0
  131. package/app/components/widget/on-time-delivery.js +1 -0
  132. package/app/components/widget/operations-pulse.js +1 -0
  133. package/app/components/widget/orders-by-status.js +1 -0
  134. package/app/components/widget/revenue-trend.js +1 -0
  135. package/app/components/widget/top-drivers.js +1 -0
  136. package/app/utils/live-map-card-content.js +1 -0
  137. package/composer.json +1 -1
  138. package/extension.json +1 -1
  139. package/package.json +3 -3
  140. package/pnpm-workspace.yaml +1 -0
  141. package/server/config/telematics.php +111 -1
  142. package/server/migrations/2026_05_18_000001_add_license_expiry_to_drivers_table.php +25 -0
  143. package/server/migrations/2026_05_21_000001_add_geographic_rules_to_service_rate_fees_table.php +37 -0
  144. package/server/migrations/2026_05_25_000001_add_endpoint_tracking_refs_to_payloads_table.php +50 -0
  145. package/server/migrations/2026_05_27_000001_default_driver_vehicle_statuses_to_available.php +48 -0
  146. package/server/resources/views/labels/default.php +57 -49
  147. package/server/resources/views/labels/waypoint-label.php +27 -20
  148. package/server/seeders/Testing/Concerns/SeedsTestingData.php +183 -0
  149. package/server/seeders/Testing/ConnectivitySeeder.php +213 -0
  150. package/server/seeders/Testing/FleetSeeder.php +341 -0
  151. package/server/seeders/Testing/MaintenanceSeeder.php +238 -0
  152. package/server/seeders/Testing/NetworkSeeder.php +250 -0
  153. package/server/seeders/Testing/OrdersSeeder.php +198 -0
  154. package/server/seeders/Testing/TestingSeeder.php +40 -0
  155. package/server/seeders/{VroomOrchestrationSeeder.php → Testing/VroomOrchestrationSeeder.php} +29 -22
  156. package/server/src/Console/Commands/AuditCustomerUserConflicts.php +75 -0
  157. package/server/src/Console/Commands/ProcessOperationalAlerts.php +279 -0
  158. package/server/src/Exceptions/CustomerUserConflictException.php +13 -0
  159. package/server/src/Http/Controllers/Api/v1/ContactController.php +17 -2
  160. package/server/src/Http/Controllers/Api/v1/CustomerController.php +876 -0
  161. package/server/src/Http/Controllers/Api/v1/DriverController.php +1 -1
  162. package/server/src/Http/Controllers/Api/v1/OrderConfigController.php +54 -0
  163. package/server/src/Http/Controllers/Api/v1/OrderController.php +98 -70
  164. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +2 -2
  165. package/server/src/Http/Controllers/Api/v1/VehicleController.php +20 -3
  166. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +119 -0
  167. package/server/src/Http/Controllers/Internal/v1/ContactController.php +19 -0
  168. package/server/src/Http/Controllers/Internal/v1/LiveController.php +101 -66
  169. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +82 -3
  170. package/server/src/Http/Controllers/Internal/v1/OrderController.php +441 -32
  171. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +1 -1
  172. package/server/src/Http/Controllers/Internal/v1/SettingController.php +46 -1
  173. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +54 -1
  174. package/server/src/Http/Middleware/AuthenticateCustomerToken.php +34 -0
  175. package/server/src/Http/Requests/CreateCustomerOrderRequest.php +63 -0
  176. package/server/src/Http/Requests/CreateCustomerRequest.php +48 -0
  177. package/server/src/Http/Requests/CreateDriverRequest.php +1 -1
  178. package/server/src/Http/Requests/CreateVehicleRequest.php +25 -1
  179. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +1 -1
  180. package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +29 -0
  181. package/server/src/Http/Resources/Internal/v1/OrderConfig.php +41 -0
  182. package/server/src/Http/Resources/v1/Customer.php +79 -0
  183. package/server/src/Http/Resources/v1/Driver.php +2 -0
  184. package/server/src/Http/Resources/v1/Fleet.php +4 -0
  185. package/server/src/Http/Resources/v1/Index/Driver.php +48 -0
  186. package/server/src/Http/Resources/v1/Index/Vehicle.php +74 -1
  187. package/server/src/Http/Resources/v1/OrderConfig.php +74 -0
  188. package/server/src/Http/Resources/v1/Payload.php +23 -20
  189. package/server/src/Http/Resources/v1/ServiceArea.php +33 -19
  190. package/server/src/Http/Resources/v1/ServiceRateFee.php +7 -0
  191. package/server/src/Listeners/HandleOrderDispatched.php +2 -2
  192. package/server/src/Models/Contact.php +92 -15
  193. package/server/src/Models/Customer.php +64 -0
  194. package/server/src/Models/Driver.php +14 -3
  195. package/server/src/Models/Entity.php +2 -2
  196. package/server/src/Models/Order.php +29 -4
  197. package/server/src/Models/OrderConfig.php +14 -11
  198. package/server/src/Models/Payload.php +17 -1
  199. package/server/src/Models/ServiceRate.php +273 -1
  200. package/server/src/Models/ServiceRateFee.php +39 -9
  201. package/server/src/Models/TrackingNumber.php +8 -2
  202. package/server/src/Models/Vehicle.php +18 -2
  203. package/server/src/Models/Waypoint.php +2 -2
  204. package/server/src/Notifications/LateDeparture.php +48 -0
  205. package/server/src/Notifications/ProlongedStoppage.php +48 -0
  206. package/server/src/Notifications/RouteDeviation.php +48 -0
  207. package/server/src/Observers/ContactObserver.php +2 -0
  208. package/server/src/Observers/ServiceRateObserver.php +6 -6
  209. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +29 -2
  210. package/server/src/Providers/FleetOpsServiceProvider.php +6 -0
  211. package/server/src/Providers/NotificationServiceProvider.php +3 -0
  212. package/server/src/Support/Analytics/AbstractAnalytics.php +77 -0
  213. package/server/src/Support/Analytics/FuelEfficiency.php +83 -0
  214. package/server/src/Support/Analytics/GeofenceViolations.php +63 -0
  215. package/server/src/Support/Analytics/IssuesInsights.php +67 -0
  216. package/server/src/Support/Analytics/LiveFleet.php +127 -0
  217. package/server/src/Support/Analytics/MaintenanceOverview.php +70 -0
  218. package/server/src/Support/Analytics/OnTimeDelivery.php +75 -0
  219. package/server/src/Support/Analytics/OperationsPulse.php +86 -0
  220. package/server/src/Support/Analytics/OrdersByStatus.php +64 -0
  221. package/server/src/Support/Analytics/RevenueTrend.php +78 -0
  222. package/server/src/Support/Analytics/TopDrivers.php +92 -0
  223. package/server/src/Support/CustomerAuth.php +98 -0
  224. package/server/src/Support/LabelPdf.php +52 -0
  225. package/server/src/Support/Metrics/AbstractMetric.php +170 -0
  226. package/server/src/Support/Metrics/ActiveLiveOrdersMetric.php +28 -0
  227. package/server/src/Support/Metrics/AvgOrderValueMetric.php +53 -0
  228. package/server/src/Support/Metrics/DriversOnlineMetric.php +30 -0
  229. package/server/src/Support/Metrics/EarningsMetric.php +30 -0
  230. package/server/src/Support/Metrics/FuelCostsMetric.php +30 -0
  231. package/server/src/Support/Metrics/MoneyMetric.php +30 -0
  232. package/server/src/Support/Metrics/OpenIssuesMetric.php +35 -0
  233. package/server/src/Support/Metrics/OrdersCanceledMetric.php +35 -0
  234. package/server/src/Support/Metrics/OrdersCompletedMetric.php +35 -0
  235. package/server/src/Support/Metrics/OrdersInProgressMetric.php +51 -0
  236. package/server/src/Support/Metrics/OrdersScheduledMetric.php +37 -0
  237. package/server/src/Support/Metrics/Registry.php +46 -0
  238. package/server/src/Support/Metrics/ResolvedIssuesMetric.php +35 -0
  239. package/server/src/Support/Metrics/TotalCustomersMetric.php +29 -0
  240. package/server/src/Support/Metrics/TotalDistanceTraveledMetric.php +35 -0
  241. package/server/src/Support/Metrics/TotalDriversMetric.php +28 -0
  242. package/server/src/Support/Metrics/TotalTimeTraveledMetric.php +35 -0
  243. package/server/src/Support/Metrics.php +46 -249
  244. package/server/src/Support/ResolvesOrderServiceStops.php +512 -0
  245. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +290 -0
  246. package/server/src/Support/Telematics/Providers/SafeeProvider.php +333 -0
  247. package/server/src/Tracking/TrackingContextBuilder.php +41 -38
  248. package/server/src/Tracking/TrackingIntelligenceService.php +109 -9
  249. package/server/src/Tracking/TrackingStop.php +13 -11
  250. package/server/src/routes.php +50 -0
  251. package/server/tests/AnalyticsRoutesTest.php +41 -0
  252. package/server/tests/CapacityAllocationEngineTest.php +10 -10
  253. package/server/tests/CustomerContactIdentitySafetyTest.php +54 -0
  254. package/server/tests/CustomerEndpointTest.php +199 -0
  255. package/server/tests/DriverVehicleStatusDefaultTest.php +39 -0
  256. package/server/tests/LabelPdfRenderingTest.php +23 -0
  257. package/server/tests/LiveControllerViewportTest.php +60 -0
  258. package/server/tests/MetricsRegistryTest.php +84 -0
  259. package/server/tests/OrchestrationPayloadBuilderTest.php +2 -2
  260. package/server/tests/OrderConfigEndpointTest.php +86 -0
  261. package/server/tests/OrderFileAttachmentTest.php +20 -0
  262. package/server/tests/ServiceAreaZoneApiShapeTest.php +34 -0
  263. package/server/tests/VehicleDriverAssignmentTest.php +18 -0
  264. package/server/tests/VroomOrchestrationEngineTest.php +91 -0
  265. package/translations/en-us.yaml +38 -0
  266. package/server/migrations/2026_05_13_000001_repair_customer_contact_user_types.php +0 -86
@@ -106,6 +106,116 @@ return [
106
106
  'pagination' => 'cursor',
107
107
  ],
108
108
  ],
109
+
110
+ [
111
+ 'key' => 'afaqy',
112
+ 'label' => 'AFAQY',
113
+ 'type' => 'native',
114
+ 'driver_class' => \Fleetbase\FleetOps\Support\Telematics\Providers\AfaqyProvider::class,
115
+ 'icon' => 'https://api.afaqy.sa/docs/img/favicon.ico',
116
+ 'description' => 'AFAQY AVL REST integration for unit discovery, live position, speed, heading, odometer, fuel, and signal data.',
117
+ 'docs_url' => 'https://api.afaqy.sa/docs/',
118
+ 'required_fields' => [
119
+ [
120
+ 'name' => 'base_url',
121
+ 'label' => 'Base URL',
122
+ 'type' => 'text',
123
+ 'placeholder' => 'https://api.afaqy.sa',
124
+ 'required' => false,
125
+ 'validation' => 'nullable|url',
126
+ ],
127
+ [
128
+ 'name' => 'username',
129
+ 'label' => 'Username',
130
+ 'type' => 'text',
131
+ 'placeholder' => 'Enter your AFAQY username',
132
+ 'required' => false,
133
+ 'validation' => 'required_without:token|string',
134
+ ],
135
+ [
136
+ 'name' => 'password',
137
+ 'label' => 'Password',
138
+ 'type' => 'password',
139
+ 'placeholder' => 'Enter your AFAQY password',
140
+ 'required' => false,
141
+ 'validation' => 'required_without:token|string',
142
+ ],
143
+ [
144
+ 'name' => 'token',
145
+ 'label' => 'Token',
146
+ 'type' => 'password',
147
+ 'placeholder' => 'Use an existing AFAQY token',
148
+ 'required' => false,
149
+ 'validation' => 'required_without:username|string',
150
+ ],
151
+ ],
152
+ 'supports_webhooks' => false,
153
+ 'supports_discovery' => true,
154
+ 'metadata' => [
155
+ 'rate_limit' => 60,
156
+ 'pagination' => 'offset',
157
+ 'capabilities' => ['tracking', 'speed', 'heading', 'odometer', 'fuel_level', 'ignition'],
158
+ ],
159
+ ],
160
+
161
+ [
162
+ 'key' => 'safee',
163
+ 'label' => 'Safee Tracking',
164
+ 'type' => 'native',
165
+ 'driver_class' => \Fleetbase\FleetOps\Support\Telematics\Providers\SafeeProvider::class,
166
+ 'description' => 'Safee Tracking REST integration for vehicle discovery, last state, live positions, odometer, fuel, and sensor data.',
167
+ 'required_fields' => [
168
+ [
169
+ 'name' => 'server_uri',
170
+ 'label' => 'Server URI',
171
+ 'type' => 'text',
172
+ 'placeholder' => 'https://tracking.example.com',
173
+ 'required' => true,
174
+ 'validation' => 'required|url',
175
+ ],
176
+ [
177
+ 'name' => 'realm_id',
178
+ 'label' => 'Realm ID',
179
+ 'type' => 'text',
180
+ 'placeholder' => 'Enter Safee realm ID',
181
+ 'required' => true,
182
+ ],
183
+ [
184
+ 'name' => 'client_id',
185
+ 'label' => 'Client ID',
186
+ 'type' => 'text',
187
+ 'placeholder' => 'Enter Safee client ID',
188
+ 'required' => true,
189
+ ],
190
+ [
191
+ 'name' => 'client_secret',
192
+ 'label' => 'Client Secret',
193
+ 'type' => 'password',
194
+ 'placeholder' => 'Enter Safee client secret',
195
+ 'required' => true,
196
+ ],
197
+ [
198
+ 'name' => 'username',
199
+ 'label' => 'Username',
200
+ 'type' => 'text',
201
+ 'placeholder' => 'Enter Safee username',
202
+ 'required' => true,
203
+ ],
204
+ [
205
+ 'name' => 'password',
206
+ 'label' => 'Password',
207
+ 'type' => 'password',
208
+ 'placeholder' => 'Enter Safee password',
209
+ 'required' => true,
210
+ ],
211
+ ],
212
+ 'supports_webhooks' => false,
213
+ 'supports_discovery' => true,
214
+ 'metadata' => [
215
+ 'rate_limit' => 3000,
216
+ 'pagination' => 'none',
217
+ 'capabilities' => ['tracking', 'speed', 'heading', 'odometer', 'fuel_level', 'ignition'],
218
+ ],
219
+ ],
109
220
  ]
110
221
  ];
111
-
@@ -0,0 +1,25 @@
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
+ public function up()
9
+ {
10
+ Schema::table('drivers', function (Blueprint $table) {
11
+ if (!Schema::hasColumn('drivers', 'license_expiry')) {
12
+ $table->date('license_expiry')->nullable()->after('drivers_license_number')->index();
13
+ }
14
+ });
15
+ }
16
+
17
+ public function down()
18
+ {
19
+ Schema::table('drivers', function (Blueprint $table) {
20
+ if (Schema::hasColumn('drivers', 'license_expiry')) {
21
+ $table->dropColumn('license_expiry');
22
+ }
23
+ });
24
+ }
25
+ };
@@ -0,0 +1,37 @@
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
+ * @return void
12
+ */
13
+ public function up()
14
+ {
15
+ Schema::table('service_rate_fees', function (Blueprint $table) {
16
+ $table->uuid('service_area_uuid')->nullable()->index()->after('service_rate_uuid');
17
+ $table->uuid('zone_uuid')->nullable()->index()->after('service_area_uuid');
18
+ $table->string('label')->nullable()->after('zone_uuid');
19
+ $table->integer('priority')->default(0)->after('label');
20
+ $table->boolean('is_fallback')->default(false)->after('priority');
21
+ });
22
+ }
23
+
24
+ /**
25
+ * Reverse the migrations.
26
+ *
27
+ * @return void
28
+ */
29
+ public function down()
30
+ {
31
+ Schema::table('service_rate_fees', function (Blueprint $table) {
32
+ $table->dropIndex(['service_area_uuid']);
33
+ $table->dropIndex(['zone_uuid']);
34
+ $table->dropColumn(['service_area_uuid', 'zone_uuid', 'label', 'priority', 'is_fallback']);
35
+ });
36
+ }
37
+ };
@@ -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>