@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.
- package/addon/components/customer/create-order-form.hbs +2 -2
- package/addon/components/customer/form.hbs +2 -2
- package/addon/components/customer/order-form.hbs +2 -2
- package/addon/components/customer/orders.hbs +2 -2
- package/addon/components/display-place.hbs +2 -2
- package/addon/components/map/google-live-map.js +6 -2
- package/addon/components/map/leaflet-live-map.hbs +48 -14
- package/addon/components/map/leaflet-live-map.js +184 -20
- package/addon/components/modals/order-change-destination.hbs +46 -0
- package/addon/components/modals/order-change-destination.js +106 -0
- package/addon/components/modals/stop-activity.hbs +28 -0
- package/addon/components/modals/stop-activity.js +52 -0
- package/addon/components/modals/update-order-activity.hbs +45 -3
- package/addon/components/modals/update-order-activity.js +143 -5
- package/addon/components/orchestrator/resource-panel.hbs +0 -10
- package/addon/components/orchestrator/resource-panel.js +2 -4
- package/addon/components/order/activity-list.hbs +2 -2
- package/addon/components/order/activity-timeline.hbs +31 -29
- package/addon/components/order/details/activity.hbs +3 -3
- package/addon/components/order/details/activity.js +11 -0
- package/addon/components/order/details/documents.js +2 -0
- package/addon/components/order/details/purchase-rate.hbs +2 -2
- package/addon/components/order/details/route.hbs +11 -3
- package/addon/components/order/details/route.js +91 -14
- package/addon/components/order/details/tracking.hbs +101 -72
- package/addon/components/order/details/tracking.js +149 -2
- package/addon/components/order/form/details.hbs +3 -3
- package/addon/components/order/form/documents.js +11 -4
- package/addon/components/order/form/route.hbs +108 -104
- package/addon/components/order/form/route.js +37 -1
- package/addon/components/order/form/service-rate.hbs +2 -2
- package/addon/components/order-config-manager/activity-flow.hbs +4 -1
- package/addon/components/order-config-manager/activity-flow.js +178 -12
- package/addon/components/place/address.js +1 -1
- package/addon/components/route-list.hbs +17 -17
- package/addon/components/route-list.js +42 -10
- package/addon/components/service-rate/details.hbs +41 -0
- package/addon/components/service-rate/form.hbs +118 -0
- package/addon/components/service-rate/form.js +55 -0
- package/addon/components/vehicle/form.js +1 -1
- package/addon/components/vehicle/pill.hbs +1 -1
- package/addon/controllers/management/vehicles/index/new.js +1 -1
- package/addon/controllers/operations/orders/index/details.js +4 -4
- package/addon/controllers/operations/orders/index.js +14 -0
- package/addon/helpers/place-address-html.js +2 -2
- package/addon/routes/operations/service-rates/index.js +1 -1
- package/addon/services/geofence.js +163 -19
- package/addon/services/leaflet-contextmenu-manager.js +27 -0
- package/addon/services/vehicle-actions.js +1 -1
- package/addon/styles/fleetops-engine.css +91 -1
- package/addon/utils/fleet-ops-options.js +2 -1
- package/addon/utils/normalize-order-config-flow.js +41 -0
- package/addon/utils/place-address-html.js +3 -2
- package/addon/utils/route-visualization.js +54 -7
- package/app/components/modals/order-change-destination.js +1 -0
- package/app/components/modals/stop-activity.js +1 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +3 -3
- package/server/migrations/2026_05_21_000001_add_geographic_rules_to_service_rate_fees_table.php +37 -0
- package/server/migrations/2026_05_25_000001_add_endpoint_tracking_refs_to_payloads_table.php +50 -0
- package/server/migrations/2026_05_27_000001_default_driver_vehicle_statuses_to_available.php +48 -0
- package/server/resources/views/labels/default.php +57 -49
- package/server/resources/views/labels/waypoint-label.php +27 -20
- package/server/seeders/Testing/ConnectivitySeeder.php +1 -0
- package/server/seeders/Testing/FleetSeeder.php +22 -22
- package/server/seeders/Testing/OrdersSeeder.php +6 -22
- package/server/seeders/Testing/VroomOrchestrationSeeder.php +21 -21
- package/server/src/Console/Commands/AuditCustomerUserConflicts.php +75 -0
- package/server/src/Exceptions/CustomerUserConflictException.php +13 -0
- package/server/src/Http/Controllers/Api/v1/ContactController.php +17 -2
- package/server/src/Http/Controllers/Api/v1/CustomerController.php +876 -0
- package/server/src/Http/Controllers/Api/v1/DriverController.php +1 -1
- package/server/src/Http/Controllers/Api/v1/OrderConfigController.php +54 -0
- package/server/src/Http/Controllers/Api/v1/OrderController.php +98 -70
- package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +2 -2
- package/server/src/Http/Controllers/Api/v1/VehicleController.php +20 -3
- package/server/src/Http/Controllers/Internal/v1/ContactController.php +19 -0
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +101 -66
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +429 -26
- package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +2 -2
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +54 -1
- package/server/src/Http/Middleware/AuthenticateCustomerToken.php +34 -0
- package/server/src/Http/Requests/CreateCustomerOrderRequest.php +63 -0
- package/server/src/Http/Requests/CreateCustomerRequest.php +48 -0
- package/server/src/Http/Requests/CreateDriverRequest.php +1 -1
- package/server/src/Http/Requests/CreateVehicleRequest.php +25 -1
- package/server/src/Http/Requests/Internal/CreateDriverRequest.php +1 -1
- package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +29 -0
- package/server/src/Http/Resources/Internal/v1/OrderConfig.php +41 -0
- package/server/src/Http/Resources/v1/Customer.php +79 -0
- package/server/src/Http/Resources/v1/OrderConfig.php +74 -0
- package/server/src/Http/Resources/v1/Payload.php +23 -20
- package/server/src/Http/Resources/v1/ServiceArea.php +33 -19
- package/server/src/Http/Resources/v1/ServiceRateFee.php +7 -0
- package/server/src/Listeners/HandleOrderDispatched.php +2 -2
- package/server/src/Models/Contact.php +92 -15
- package/server/src/Models/Customer.php +64 -0
- package/server/src/Models/Driver.php +12 -3
- package/server/src/Models/Entity.php +2 -2
- package/server/src/Models/Order.php +29 -4
- package/server/src/Models/Payload.php +17 -1
- package/server/src/Models/ServiceRate.php +273 -1
- package/server/src/Models/ServiceRateFee.php +39 -9
- package/server/src/Models/TrackingNumber.php +8 -2
- package/server/src/Models/Vehicle.php +18 -2
- package/server/src/Models/Waypoint.php +2 -2
- package/server/src/Notifications/LateDeparture.php +2 -2
- package/server/src/Notifications/ProlongedStoppage.php +2 -2
- package/server/src/Notifications/RouteDeviation.php +2 -2
- package/server/src/Observers/ContactObserver.php +2 -0
- package/server/src/Observers/ServiceRateObserver.php +6 -6
- package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +1 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +1 -0
- package/server/src/Support/Analytics/AbstractAnalytics.php +6 -6
- package/server/src/Support/Analytics/FuelEfficiency.php +2 -2
- package/server/src/Support/Analytics/OrdersByStatus.php +1 -1
- package/server/src/Support/Analytics/RevenueTrend.php +0 -1
- package/server/src/Support/Analytics/TopDrivers.php +1 -1
- package/server/src/Support/CustomerAuth.php +98 -0
- package/server/src/Support/LabelPdf.php +52 -0
- package/server/src/Support/Metrics/AbstractMetric.php +4 -4
- package/server/src/Support/ResolvesOrderServiceStops.php +512 -0
- package/server/src/Tracking/TrackingContextBuilder.php +41 -38
- package/server/src/Tracking/TrackingIntelligenceService.php +109 -9
- package/server/src/Tracking/TrackingStop.php +13 -11
- package/server/src/routes.php +43 -9
- package/server/tests/CapacityAllocationEngineTest.php +10 -10
- package/server/tests/CustomerContactIdentitySafetyTest.php +54 -0
- package/server/tests/CustomerEndpointTest.php +199 -0
- package/server/tests/DriverVehicleStatusDefaultTest.php +39 -0
- package/server/tests/LabelPdfRenderingTest.php +23 -0
- package/server/tests/LiveControllerViewportTest.php +60 -0
- package/server/tests/MetricsRegistryTest.php +4 -8
- package/server/tests/OrchestrationPayloadBuilderTest.php +2 -2
- package/server/tests/OrderConfigEndpointTest.php +86 -0
- package/server/tests/OrderFileAttachmentTest.php +20 -0
- package/server/tests/ServiceAreaZoneApiShapeTest.php +34 -0
- package/server/tests/VehicleDriverAssignmentTest.php +18 -0
- package/translations/en-us.yaml +1 -0
- 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
|
|
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
|
|
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;"
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
|
83
|
-
<div class="line"
|
|
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"
|
|
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"
|
|
97
|
+
<span class="segment"><?php echo e($pickup->neighborhood); ?></span>
|
|
90
98
|
<?php } ?>
|
|
91
99
|
<?php if (!empty($pickup->district)) { ?>
|
|
92
|
-
<span class="segment"
|
|
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"
|
|
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"
|
|
108
|
+
<span class="segment"><?php echo e($pickup->city); ?></span>
|
|
101
109
|
<?php } ?>
|
|
102
110
|
<?php if (!empty($pickup->province)) { ?>
|
|
103
|
-
<span class="segment"
|
|
111
|
+
<span class="segment"><?php echo e($pickup->province); ?></span>
|
|
104
112
|
<?php } ?>
|
|
105
113
|
<?php if (!empty($pickup->country)) { ?>
|
|
106
|
-
<span class="segment"
|
|
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"
|
|
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
|
|
124
|
-
<div class="line"
|
|
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"
|
|
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"
|
|
138
|
+
<span class="segment"><?php echo e($dropoff->neighborhood); ?></span>
|
|
131
139
|
<?php } ?>
|
|
132
140
|
<?php if (!empty($dropoff->district)) { ?>
|
|
133
|
-
<span class="segment"
|
|
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"
|
|
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"
|
|
149
|
+
<span class="segment"><?php echo e($dropoff->city); ?></span>
|
|
142
150
|
<?php } ?>
|
|
143
151
|
<?php if (!empty($dropoff->province)) { ?>
|
|
144
|
-
<span class="segment"
|
|
152
|
+
<span class="segment"><?php echo e($dropoff->province); ?></span>
|
|
145
153
|
<?php } ?>
|
|
146
154
|
<?php if (!empty($dropoff->country)) { ?>
|
|
147
|
-
<span class="segment"
|
|
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"
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
|
181
|
-
<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
|
|
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
|
|
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;"
|
|
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
|
|
63
|
-
<div class="line"
|
|
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"
|
|
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"
|
|
76
|
+
<span class="segment"><?php echo e($dropoff->neighborhood); ?></span>
|
|
70
77
|
<?php } ?>
|
|
71
78
|
<?php if (!empty($dropoff->district)) { ?>
|
|
72
|
-
<span class="segment"
|
|
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"
|
|
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"
|
|
87
|
+
<span class="segment"><?php echo e($dropoff->city); ?></span>
|
|
81
88
|
<?php } ?>
|
|
82
89
|
<?php if (!empty($dropoff->province)) { ?>
|
|
83
|
-
<span class="segment"
|
|
90
|
+
<span class="segment"><?php echo e($dropoff->province); ?></span>
|
|
84
91
|
<?php } ?>
|
|
85
92
|
<?php if (!empty($dropoff->country)) { ?>
|
|
86
|
-
<span class="segment"
|
|
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"
|
|
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
|
|
112
|
+
echo e(data_get($entity, 'name') . ' - ' . data_get($entity, 'internal_id', ''));
|
|
106
113
|
} else {
|
|
107
|
-
echo
|
|
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
|
|
120
|
-
<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, '
|
|
89
|
-
'van_east' => ['EAS-01', 'Nissan', 'NV200', 'GBB-1002', 1.3520, 103.9449, true, '
|
|
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, '
|
|
93
|
-
'van_cold_chain' => ['CLD-06', 'Hyundai', 'H350', 'GBB-1006', 1.3525, 103.9447, true, '
|
|
94
|
-
'truck_west' => ['JUR-07', 'Hino', '300 Series', 'GBB-1007', 1.3345, 103.7420, true, '
|
|
95
|
-
'van_linehaul' => ['LNH-08', 'Ford', 'Transit', 'GBB-1008', 1.3215, 103.7055, false, '
|
|
96
|
-
'van_returns' => ['RTN-09', 'Peugeot', 'Expert', 'GBB-1009', 1.3150, 103.7649, true, '
|
|
97
|
-
'van_central_2' => ['CEN-02', 'Toyota', 'HiAce', 'GBB-1010', 1.2871, 103.8550, true, '
|
|
98
|
-
'van_central_3' => ['CEN-03', 'Nissan', 'NV350', 'GBB-1011', 1.2950, 103.8468, true, '
|
|
99
|
-
'bike_rochor_2' => ['RCH-11', 'Yamaha', 'NMAX', 'GBB-1012', 1.3042, 103.8528, true, '
|
|
100
|
-
'bike_rochor_3' => ['RCH-12', 'Honda', 'ADV160', 'GBB-1013', 1.3017, 103.8509, true, '
|
|
101
|
-
'truck_alexandra_1' => ['ALX-14', 'Mitsubishi Fuso', 'Canter', 'GBB-1014', 1.2868, 103.8054, true, '
|
|
102
|
-
'van_alexandra_2' => ['ALX-15', 'Ford', 'Transit Custom', 'GBB-1015', 1.2881, 103.8079, false, '
|
|
103
|
-
'van_changi_2' => ['CGO-16', 'Mercedes-Benz', 'Sprinter', 'GBB-1016', 1.3658, 103.9871, true, '
|
|
104
|
-
'truck_changi_3' => ['CGO-17', 'Isuzu', 'NPR', 'GBB-1017', 1.3610, 103.9954, true, '
|
|
105
|
-
'van_tampines_cold_2' => ['CLD-18', 'Hyundai', 'H350', 'GBB-1018', 1.3529, 103.9460, true, '
|
|
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, '
|
|
108
|
-
'van_jurong_3' => ['JUR-21', 'Nissan', 'Urvan', 'GBB-1021', 1.3362, 103.7451, true, '
|
|
109
|
-
'truck_linehaul_2' => ['LNH-22', 'Volvo', 'FL', 'GBB-1022', 1.3210, 103.7032, true, '
|
|
110
|
-
'van_linehaul_3' => ['LNH-23', 'Ford', 'Transit', 'GBB-1023', 1.3234, 103.7088, true, '
|
|
111
|
-
'van_returns_2' => ['RTN-24', 'Peugeot', 'Expert', 'GBB-1024', 1.3168, 103.7660, true, '
|
|
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' => '
|
|
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' =>
|
|
115
|
-
'orchestrator_priority' =>
|
|
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
|
|
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
|
|
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
|
}
|