@fleetbase/fleetops-engine 0.4.16 → 0.4.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.php-cs-fixer.php +2 -0
- package/addon/components/activity-event-selector.hbs +35 -0
- package/addon/components/activity-event-selector.js +85 -0
- package/addon/components/activity-form-panel.hbs +23 -0
- package/addon/components/activity-form-panel.js +90 -0
- package/addon/components/activity-logic-builder.hbs +80 -0
- package/addon/components/activity-logic-builder.js +260 -0
- package/addon/components/contact-form-panel.hbs +1 -1
- package/addon/components/contact-panel.hbs +1 -1
- package/addon/components/custom-entity-form-panel.hbs +43 -0
- package/addon/components/custom-entity-form-panel.js +129 -0
- package/addon/components/custom-field-form-panel/options-input.hbs +12 -0
- package/addon/components/custom-field-form-panel/options-input.js +139 -0
- package/addon/components/custom-field-form-panel.hbs +77 -0
- package/addon/components/custom-field-form-panel.js +144 -0
- package/addon/components/custom-field.hbs +63 -41
- package/addon/components/custom-field.js +123 -25
- package/addon/components/driver-form-panel.hbs +1 -1
- package/addon/components/driver-panel.hbs +1 -1
- package/addon/components/edit-order-route-panel.hbs +1 -1
- package/addon/components/fleet-form-panel.hbs +1 -1
- package/addon/components/fleet-panel.hbs +1 -1
- package/addon/components/fuel-report-form-panel.hbs +1 -1
- package/addon/components/fuel-report-panel.hbs +1 -1
- package/addon/components/issue-form-panel.hbs +1 -1
- package/addon/components/issue-panel.hbs +1 -1
- package/addon/components/joint-graph.hbs +1 -0
- package/addon/components/joint-graph.js +103 -0
- package/addon/components/layout/fleet-ops-sidebar.hbs +3 -3
- package/addon/components/layout/fleet-ops-sidebar.js +1 -0
- package/addon/components/live-map.js +71 -28
- package/addon/components/modals/new-custom-field-group.hbs +5 -0
- package/addon/components/modals/new-order-config.hbs +3 -3
- package/addon/components/modals/order-new-activity.hbs +1 -1
- package/addon/components/order-config-manager/activity-flow.hbs +11 -0
- package/addon/components/order-config-manager/activity-flow.js +964 -0
- package/addon/components/order-config-manager/custom-fields.hbs +50 -0
- package/addon/components/order-config-manager/custom-fields.js +276 -0
- package/addon/components/order-config-manager/details.hbs +23 -0
- package/addon/components/order-config-manager/details.js +106 -0
- package/addon/components/order-config-manager/entities.hbs +54 -0
- package/addon/components/order-config-manager/entities.js +227 -0
- package/addon/components/order-config-manager-overlay.hbs +26 -0
- package/addon/components/order-config-manager-overlay.js +60 -0
- package/addon/components/order-config-manager.hbs +15 -0
- package/addon/components/order-config-manager.js +298 -0
- package/addon/components/order-flow.hbs +1 -0
- package/addon/components/order-flow.js +3 -0
- package/addon/components/place-form-panel.hbs +1 -1
- package/addon/components/place-panel.hbs +1 -1
- package/addon/components/vehicle-form-panel.hbs +1 -1
- package/addon/components/vehicle-panel.hbs +1 -1
- package/addon/components/vendor-form-panel.hbs +1 -1
- package/addon/components/vendor-panel.hbs +1 -1
- package/addon/controllers/application.js +5 -1
- package/addon/controllers/operations/order-config.js +43 -0
- package/addon/controllers/operations/orders/index/new.js +125 -21
- package/addon/controllers/operations/orders/index/view.js +87 -4
- package/addon/controllers/operations/orders/index.js +2 -2
- package/addon/engine.js +10 -1
- package/addon/initializers/load-jointjs.js +16 -0
- package/addon/routes/application.js +1 -1
- package/addon/routes/operations/order-config.js +28 -0
- package/addon/routes/operations/orders/index/new.js +2 -3
- package/addon/routes/operations/orders/index/view.js +1 -1
- package/addon/routes.js +1 -0
- package/addon/services/context-panel.js +65 -3
- package/addon/styles/fleetops-engine.css +268 -0
- package/addon/templates/application.hbs +1 -1
- package/addon/templates/operations/order-config.hbs +55 -0
- package/addon/templates/operations/orders/index/new.hbs +98 -339
- package/addon/templates/operations/orders/index/view.hbs +36 -96
- package/addon/templates/operations/orders/index.hbs +0 -1
- package/addon/utils/apply-context-component-arguments.js +4 -2
- package/addon/utils/create-custom-entity.js +22 -0
- package/addon/utils/create-flow-activity.js +31 -0
- package/addon/utils/get-custom-field-type-map.js +34 -0
- package/app/components/activity-event-selector.js +1 -0
- package/app/components/activity-form-panel.js +1 -0
- package/app/components/activity-logic-builder.js +1 -0
- package/app/components/custom-entity-form-panel.js +1 -0
- package/app/components/custom-field-form-panel/options-input.js +1 -0
- package/app/components/custom-field-form-panel.js +1 -0
- package/app/components/joint-graph.js +1 -0
- package/app/components/modals/new-custom-field-group.js +1 -0
- package/app/components/order-config-manager/activity-flow.js +1 -0
- package/app/components/order-config-manager/custom-fields.js +1 -0
- package/app/components/order-config-manager/details.js +1 -0
- package/app/components/order-config-manager/entities.js +1 -0
- package/app/components/order-config-manager-overlay.js +1 -0
- package/app/components/order-config-manager.js +1 -0
- package/app/components/order-flow.js +1 -0
- package/app/controllers/operations/order-config.js +1 -0
- package/app/routes/operations/order-config.js +1 -0
- package/app/templates/operations/order-config.js +1 -0
- package/app/utils/create-custom-entity.js +1 -0
- package/app/utils/create-flow-activity.js +1 -0
- package/app/utils/get-custom-field-type-map.js +1 -0
- package/composer.json +4 -3
- package/config/environment.js +1 -0
- package/extension.json +1 -1
- package/index.js +20 -0
- package/package.json +7 -5
- package/server/config/api.php +3 -650
- package/server/migrations/2023_04_27_053456_create_contacts_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_drivers_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_entities_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_fleet_drivers_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_fleets_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_fuel_reports_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_integrated_vendors_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_issues_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_orders_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_payloads_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_places_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_positions_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_proofs_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_purchase_rates_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_routes_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_areas_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_quote_items_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_quotes_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_rate_fees_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_rate_parcel_fees_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_rates_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_tracking_numbers_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_tracking_statuses_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_vehicles_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_vendors_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_waypoints_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_zones_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_companies_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_contacts_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_drivers_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_entities_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleet_drivers_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleets_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fuel_reports_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_integrated_vendors_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_issues_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_orders_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_payloads_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_places_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_positions_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_proofs_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_purchase_rates_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_routes_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_areas_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quote_items_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quotes_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_fees_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_parcel_fees_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rates_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_numbers_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_statuses_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vehicles_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vendors_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_waypoints_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_zones_table.php +1 -2
- package/server/migrations/2023_09_14_074512_update_vehicles_table.php +1 -2
- package/server/migrations/2023_09_14_074619_create_vehicle_devices_table.php +35 -36
- package/server/migrations/2023_09_26_071205_add_online_column_to_vehicles_table.php +1 -2
- package/server/migrations/2023_09_26_083957_create_fleet_vehicles_table.php +1 -2
- package/server/migrations/2023_09_27_023757_add_column_to_fleets_table.php +1 -2
- package/server/migrations/2023_10_05_074811_update_vehicle.php +1 -2
- package/server/migrations/2023_10_25_093014_create_vehicle_device_events_table.php +1 -2
- package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +1 -2
- package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +1 -2
- package/server/migrations/2023_11_09_041807_add_status_column_to_fuel_reports_table.php +1 -2
- package/server/migrations/2023_11_15_062814_add_comments_column_and_resolved_at_column_to_vehicle_device_events_table.php +1 -2
- package/server/migrations/2023_11_17_053001_add_category_uuid_to_entities_table.php +1 -2
- package/server/migrations/2023_11_28_074244_add_supplier_uuid_column_to_entities_table.php +1 -2
- package/server/migrations/2023_12_14_100209_add_meta_column_on_driver_table copy.php +1 -2
- package/server/migrations/2024_02_18_100209_add_avatar_url_columns_table.php +3 -4
- package/server/migrations/2024_02_27_093648_create_order_configs_table.php +43 -0
- package/server/migrations/2024_03_07_075508_add_order_config_uuid_column_to_orders_table.php +28 -0
- package/server/migrations/2024_03_12_033527_add_public_id_column_to_order_configs_table.php +34 -0
- package/server/seeders/OrderConfigSeeder.php +23 -0
- package/server/src/Casts/OrderConfigEntities.php +53 -0
- package/server/src/Console/Commands/FixLegacyOrderConfigs.php +66 -0
- package/server/src/Events/DriverLocationChanged.php +1 -1
- package/server/src/Events/DriverSimulatedLocationChanged.php +1 -1
- package/server/src/Flow/Activity.php +232 -6
- package/server/src/Flow/Condition.php +84 -0
- package/server/src/Flow/Event.php +88 -0
- package/server/src/Flow/Flow.php +50 -0
- package/server/src/Flow/FlowResource.php +143 -0
- package/server/src/Flow/Logic.php +57 -1
- package/server/src/Http/Controllers/Api/v1/DriverController.php +2 -2
- package/server/src/Http/Controllers/Api/v1/IssueController.php +132 -0
- package/server/src/Http/Controllers/Api/v1/OrderController.php +152 -57
- package/server/src/Http/Controllers/Api/v1/OrganizationController.php +27 -0
- package/server/src/Http/Controllers/Api/v1/PlaceController.php +2 -3
- package/server/src/Http/Controllers/Controller.php +9 -0
- package/server/src/Http/Controllers/FleetOpsController.php +7 -0
- package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +40 -233
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +58 -28
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +20 -0
- package/server/src/Http/Filter/OrderConfigFilter.php +13 -0
- package/server/src/Http/Requests/CreateIssueRequest.php +19 -0
- package/server/src/Http/Requests/Internal/CreateOrderConfigRequest.php +40 -0
- package/server/src/Http/Requests/Internal/CreateOrderRequest.php +66 -0
- package/server/src/Http/Requests/Internal/DeleteOrderConfigRequest.php +0 -0
- package/server/src/Http/Requests/UpdateIssueRequest.php +7 -0
- package/server/src/Http/Resources/v1/Order.php +3 -0
- package/server/src/Listeners/HandleOrderCanceled.php +8 -4
- package/server/src/Listeners/HandleOrderDispatched.php +14 -12
- package/server/src/Models/Order.php +527 -31
- package/server/src/Models/OrderConfig.php +467 -0
- package/server/src/Models/Payload.php +6 -7
- package/server/src/Notifications/OrderAssigned.php +1 -1
- package/server/src/Notifications/OrderCanceled.php +1 -1
- package/server/src/Notifications/OrderDispatchFailed.php +1 -1
- package/server/src/Notifications/OrderDispatched.php +1 -1
- package/server/src/Notifications/OrderPing.php +1 -1
- package/server/src/Observers/CompanyObserver.php +20 -0
- package/server/src/Providers/FleetOpsServiceProvider.php +4 -1
- package/server/src/Providers/NotificationServiceProvider.php +2 -1
- package/server/src/Support/FleetOps.php +137 -0
- package/server/src/Support/Utils.php +17 -0
- package/server/src/Traits/HasTrackingNumber.php +9 -9
- package/server/src/routes.php +19 -11
- package/translations/en-us.yaml +137 -0
- package/server/src/Flow/Config.php +0 -7
- package/server/src/Support/Flow.php +0 -653
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\FleetOps\Http\Requests\CreateIssueRequest;
|
|
6
|
+
use Fleetbase\FleetOps\Http\Requests\UpdateIssueRequest;
|
|
7
|
+
use Fleetbase\FleetOps\Http\Resources\v1\Issue as DeletedIssue;
|
|
8
|
+
use Fleetbase\FleetOps\Http\Resources\v1\Issue as IssueResource;
|
|
9
|
+
use Fleetbase\FleetOps\Models\Driver;
|
|
10
|
+
use Fleetbase\FleetOps\Models\Issue;
|
|
11
|
+
use Fleetbase\Http\Controllers\Controller;
|
|
12
|
+
use Illuminate\Http\Request;
|
|
13
|
+
|
|
14
|
+
class IssueController extends Controller
|
|
15
|
+
{
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new Fleetbase Issue resource.
|
|
18
|
+
*
|
|
19
|
+
* @param \Fleetbase\Http\Requests\CreateIssueRequest $request
|
|
20
|
+
*
|
|
21
|
+
* @return \Fleetbase\Http\Resources\Entity
|
|
22
|
+
*/
|
|
23
|
+
public function createRecord(CreateIssueRequest $request)
|
|
24
|
+
{
|
|
25
|
+
// get request input
|
|
26
|
+
$input = $request->only([
|
|
27
|
+
'driver',
|
|
28
|
+
'location',
|
|
29
|
+
'category',
|
|
30
|
+
'type',
|
|
31
|
+
'report',
|
|
32
|
+
'priority',
|
|
33
|
+
]);
|
|
34
|
+
|
|
35
|
+
// Find driver who is reporting
|
|
36
|
+
try {
|
|
37
|
+
$driver = Driver::findRecordOrFail($request->input('driver'));
|
|
38
|
+
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
|
|
39
|
+
return response()->json(
|
|
40
|
+
[
|
|
41
|
+
'error' => 'Driver reporting issue not found.',
|
|
42
|
+
],
|
|
43
|
+
404
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// get the user uuid
|
|
48
|
+
$input['driver_uuid'] = $driver->uuid;
|
|
49
|
+
$input['reported_by_uuid'] = $driver->user_uuid;
|
|
50
|
+
$input['vehicle_uuid'] = $driver->vehicle_uuid;
|
|
51
|
+
|
|
52
|
+
// create the entity
|
|
53
|
+
$entity = Issue::create($input);
|
|
54
|
+
|
|
55
|
+
// response the driver resource
|
|
56
|
+
return new IssueResource($entity);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Updates new Fleetbase Issue resource.
|
|
61
|
+
*
|
|
62
|
+
* @param string $id
|
|
63
|
+
* @param \Fleetbase\Http\Requests\UpdateIssueRequest $request
|
|
64
|
+
*
|
|
65
|
+
* @return \Fleetbase\Http\Resources\Issue
|
|
66
|
+
*/
|
|
67
|
+
public function updateRecord($id, UpdateIssueRequest $request)
|
|
68
|
+
{
|
|
69
|
+
// find for the issue
|
|
70
|
+
try {
|
|
71
|
+
$issue = Issue::findRecordOrFail($id);
|
|
72
|
+
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
|
|
73
|
+
return response()->json(
|
|
74
|
+
[
|
|
75
|
+
'error' => 'Issue resource not found.',
|
|
76
|
+
],
|
|
77
|
+
404
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
$input = $request->only([
|
|
82
|
+
'category',
|
|
83
|
+
'type',
|
|
84
|
+
'report',
|
|
85
|
+
'priority',
|
|
86
|
+
]);
|
|
87
|
+
|
|
88
|
+
// update the issue
|
|
89
|
+
$issue->update($input);
|
|
90
|
+
|
|
91
|
+
// response the issue resource
|
|
92
|
+
return new IssueResource($issue);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Query for Fleetbase Issue resources.
|
|
97
|
+
*
|
|
98
|
+
* @return \Fleetbase\Http\Resources\FleetCollection
|
|
99
|
+
*/
|
|
100
|
+
public function queryRecord(Request $request)
|
|
101
|
+
{
|
|
102
|
+
$results = Issue::queryWithRequest($request);
|
|
103
|
+
|
|
104
|
+
return IssueResource::collection($results);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Deletes a Fleetbase Issue resources.
|
|
109
|
+
*
|
|
110
|
+
* @return \Fleetbase\Http\Resources\FleetCollection
|
|
111
|
+
*/
|
|
112
|
+
public function deleteRecord($id)
|
|
113
|
+
{
|
|
114
|
+
// find for the driver
|
|
115
|
+
try {
|
|
116
|
+
$issue = Issue::findRecordOrFail($id);
|
|
117
|
+
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
|
|
118
|
+
return response()->json(
|
|
119
|
+
[
|
|
120
|
+
'error' => 'Issue resource not found.',
|
|
121
|
+
],
|
|
122
|
+
404
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// delete the issue
|
|
127
|
+
$issue->delete();
|
|
128
|
+
|
|
129
|
+
// response the issue resource
|
|
130
|
+
return new DeletedIssue($issue);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -5,6 +5,7 @@ namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
|
|
|
5
5
|
use Fleetbase\FleetOps\Events\OrderDispatchFailed;
|
|
6
6
|
use Fleetbase\FleetOps\Events\OrderReady;
|
|
7
7
|
use Fleetbase\FleetOps\Events\OrderStarted;
|
|
8
|
+
use Fleetbase\FleetOps\Flow\Activity;
|
|
8
9
|
use Fleetbase\FleetOps\Http\Requests\CreateOrderRequest;
|
|
9
10
|
use Fleetbase\FleetOps\Http\Requests\ScheduleOrderRequest;
|
|
10
11
|
use Fleetbase\FleetOps\Http\Requests\UpdateOrderRequest;
|
|
@@ -14,12 +15,12 @@ use Fleetbase\FleetOps\Http\Resources\v1\Proof as ProofResource;
|
|
|
14
15
|
use Fleetbase\FleetOps\Models\Driver;
|
|
15
16
|
use Fleetbase\FleetOps\Models\Entity;
|
|
16
17
|
use Fleetbase\FleetOps\Models\Order;
|
|
18
|
+
use Fleetbase\FleetOps\Models\OrderConfig;
|
|
17
19
|
use Fleetbase\FleetOps\Models\Payload;
|
|
18
20
|
use Fleetbase\FleetOps\Models\Place;
|
|
19
21
|
use Fleetbase\FleetOps\Models\Proof;
|
|
20
22
|
use Fleetbase\FleetOps\Models\ServiceQuote;
|
|
21
23
|
use Fleetbase\FleetOps\Models\Waypoint;
|
|
22
|
-
use Fleetbase\FleetOps\Support\Flow;
|
|
23
24
|
use Fleetbase\FleetOps\Support\Utils;
|
|
24
25
|
use Fleetbase\Http\Controllers\Controller;
|
|
25
26
|
use Fleetbase\Models\Company;
|
|
@@ -35,14 +36,24 @@ class OrderController extends Controller
|
|
|
35
36
|
/**
|
|
36
37
|
* Creates a new Fleetbase Order resource.
|
|
37
38
|
*
|
|
38
|
-
* @param
|
|
39
|
+
* @param Request|\Fleetbase\Http\Requests\CreateOrderRequest $request
|
|
39
40
|
*
|
|
40
41
|
* @return \Fleetbase\Http\Resources\Order
|
|
41
42
|
*/
|
|
42
43
|
public function create(CreateOrderRequest $request)
|
|
43
44
|
{
|
|
44
45
|
// get request input
|
|
45
|
-
$input = $request->only(['internal_id', 'payload', 'service_quote', 'purchase_rate', 'adhoc', 'adhoc_distance', 'pod_method', 'pod_required', 'scheduled_at', '
|
|
46
|
+
$input = $request->only(['internal_id', 'payload', 'service_quote', 'purchase_rate', 'adhoc', 'adhoc_distance', 'pod_method', 'pod_required', 'scheduled_at', 'status', 'meta', 'notes']);
|
|
47
|
+
|
|
48
|
+
// Get order config
|
|
49
|
+
$orderConfig = OrderConfig::resolveFromIdentifier($request->only(['type', 'order_config']));
|
|
50
|
+
if (!$orderConfig) {
|
|
51
|
+
return response()->apiError('Invalid order `type` or `order_config` provided.');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Set order config to input
|
|
55
|
+
$input['order_config_uuid'] = $orderConfig->uuid;
|
|
56
|
+
$input['type'] = $orderConfig->key;
|
|
46
57
|
|
|
47
58
|
// make sure company is set
|
|
48
59
|
$input['company_uuid'] = session('company');
|
|
@@ -779,23 +790,21 @@ class OrderController extends Controller
|
|
|
779
790
|
return response()->apiError('No driver assigned to order.');
|
|
780
791
|
}
|
|
781
792
|
|
|
782
|
-
//
|
|
783
|
-
$
|
|
793
|
+
// Get the order config
|
|
794
|
+
$orderConfig = $order->config();
|
|
795
|
+
|
|
796
|
+
// Get the order started activity
|
|
797
|
+
$activity = $orderConfig->getStartedActivity();
|
|
784
798
|
|
|
785
|
-
//
|
|
786
|
-
$isNotDispatched = $
|
|
799
|
+
// Order is not dispatched if next activity code is dispatch or order is not flagged as dispatched
|
|
800
|
+
$isNotDispatched = $order->isNotDispatched;
|
|
787
801
|
|
|
788
|
-
//
|
|
802
|
+
// If order is not dispatched yet $activity->is('dispatched') || $order->dispatched === true
|
|
789
803
|
// and not skipping throw order not dispatched error
|
|
790
804
|
if ($isNotDispatched && !$skipDispatch) {
|
|
791
805
|
return response()->apiError('Order has not been dispatched yet and cannot be started.');
|
|
792
806
|
}
|
|
793
807
|
|
|
794
|
-
// if we're going to skip the dispatch get the next activity status and flow and continue
|
|
795
|
-
if ($isNotDispatched && $skipDispatch) {
|
|
796
|
-
$flow = $activity = Flow::getAfterNextActivity($order);
|
|
797
|
-
}
|
|
798
|
-
|
|
799
808
|
// set order to started
|
|
800
809
|
$order->started = true;
|
|
801
810
|
$order->started_at = now();
|
|
@@ -816,7 +825,7 @@ class OrderController extends Controller
|
|
|
816
825
|
$order->setRelation('payload', $payload);
|
|
817
826
|
|
|
818
827
|
// update order activity
|
|
819
|
-
$updateActivityRequest = new Request(['activity' => $
|
|
828
|
+
$updateActivityRequest = new Request(['activity' => $activity->serialize()]);
|
|
820
829
|
|
|
821
830
|
// update activity
|
|
822
831
|
return $this->updateActivity($order, $updateActivityRequest);
|
|
@@ -869,15 +878,20 @@ class OrderController extends Controller
|
|
|
869
878
|
return response()->apiError('Order is already completed.');
|
|
870
879
|
}
|
|
871
880
|
|
|
872
|
-
|
|
881
|
+
// Get the order config
|
|
882
|
+
$orderConfig = $order->config();
|
|
883
|
+
$activity = $request->array('activity');
|
|
884
|
+
if (!Utils::isActivity($activity)) {
|
|
885
|
+
$activity = new Activity($activity, $order->getConfigFlow());
|
|
886
|
+
}
|
|
873
887
|
|
|
874
888
|
// if we're going to skip the dispatch get the next activity status and flow and continue
|
|
875
|
-
if (
|
|
876
|
-
$activity =
|
|
889
|
+
if (Utils::isActivity($activity) && $activity->is('dispatched') && $skipDispatch) {
|
|
890
|
+
$activity = $orderConfig->getStartedActivity();
|
|
877
891
|
}
|
|
878
892
|
|
|
879
893
|
// handle pickup/dropoff order activity update as normal
|
|
880
|
-
if (
|
|
894
|
+
if (Utils::isActivity($activity) && $activity->is('dispatched')) {
|
|
881
895
|
// make sure driver is assigned if not trigger failed dispatch
|
|
882
896
|
if (!$order->hasDriverAssigned && !$order->adhoc) {
|
|
883
897
|
event(new OrderDispatchFailed($order, 'No driver assigned for order to dispatch to.'));
|
|
@@ -898,7 +912,7 @@ class OrderController extends Controller
|
|
|
898
912
|
$order->payload->setFirstWaypoint($activity, $location);
|
|
899
913
|
}
|
|
900
914
|
|
|
901
|
-
if (
|
|
915
|
+
if (Utils::isActivity($activity) && $activity->completesOrder() && $order->payload->isMultipleDropOrder) {
|
|
902
916
|
// confirm every waypoint is completed
|
|
903
917
|
$isCompleted = $order->payload->waypointMarkers->every(function ($waypoint) {
|
|
904
918
|
return $waypoint->status_code === 'COMPLETED';
|
|
@@ -921,24 +935,26 @@ class OrderController extends Controller
|
|
|
921
935
|
}
|
|
922
936
|
}
|
|
923
937
|
|
|
924
|
-
|
|
925
|
-
// unset from driver current job
|
|
926
|
-
$order->driverAssigned->unassignCurrentOrder();
|
|
927
|
-
$order->notifyCompleted();
|
|
928
|
-
}
|
|
929
|
-
|
|
938
|
+
// Update activity
|
|
930
939
|
$order->updateActivity($activity, $proof);
|
|
931
940
|
|
|
932
941
|
// also update for each order entities if not multiple drop order
|
|
933
942
|
// all entities will share the same activity status as is one drop order
|
|
934
943
|
if (!$order->payload->isMultipleDropOrder) {
|
|
935
944
|
foreach ($order->payload->entities as $entity) {
|
|
936
|
-
$entity->insertActivity($activity
|
|
945
|
+
$entity->insertActivity($activity, $location, $proof);
|
|
937
946
|
}
|
|
938
947
|
} else {
|
|
939
948
|
$order->payload->updateWaypointActivity($activity, $location);
|
|
940
949
|
}
|
|
941
950
|
|
|
951
|
+
// Handle order completion
|
|
952
|
+
if (Utils::isActivity($activity) && $activity->completesOrder()) {
|
|
953
|
+
// unset from driver current job
|
|
954
|
+
$order->driverAssigned->unassignCurrentOrder();
|
|
955
|
+
$order->complete();
|
|
956
|
+
}
|
|
957
|
+
|
|
942
958
|
return new OrderResource($order);
|
|
943
959
|
}
|
|
944
960
|
|
|
@@ -947,10 +963,8 @@ class OrderController extends Controller
|
|
|
947
963
|
*
|
|
948
964
|
* @return \Illuminate\Http\Response
|
|
949
965
|
*/
|
|
950
|
-
public function getNextActivity(string $id
|
|
966
|
+
public function getNextActivity(string $id)
|
|
951
967
|
{
|
|
952
|
-
$waypointId = $request->input('waypoint');
|
|
953
|
-
|
|
954
968
|
try {
|
|
955
969
|
$order = Order::findRecordOrFail($id, ['payload']);
|
|
956
970
|
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
|
|
@@ -962,24 +976,20 @@ class OrderController extends Controller
|
|
|
962
976
|
);
|
|
963
977
|
}
|
|
964
978
|
|
|
965
|
-
$
|
|
979
|
+
$activities = $order->config()->nextActivity();
|
|
966
980
|
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
$
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
$activity = Flow::getOrderWaypointFlow($order, $waypoint);
|
|
976
|
-
|
|
977
|
-
return response()->json($activity);
|
|
978
|
-
}
|
|
981
|
+
// If activity is to complete order add proof of delivery properties if required
|
|
982
|
+
// This is a temporary fix until activity is updated to handle POD on it's own
|
|
983
|
+
$activities = $activities->map(function ($activity) use ($order) {
|
|
984
|
+
if ($activity->completesOrder() && $order->pod_required) {
|
|
985
|
+
$activity->set('require_pod', true);
|
|
986
|
+
$activity->set('pod_method', $order->pod_method);
|
|
987
|
+
}
|
|
979
988
|
|
|
980
|
-
|
|
989
|
+
return $activity;
|
|
990
|
+
});
|
|
981
991
|
|
|
982
|
-
return response()->json($
|
|
992
|
+
return response()->json($activities);
|
|
983
993
|
}
|
|
984
994
|
|
|
985
995
|
/**
|
|
@@ -1010,24 +1020,17 @@ class OrderController extends Controller
|
|
|
1010
1020
|
return response()->apiError('Not all waypoints completed for order.');
|
|
1011
1021
|
}
|
|
1012
1022
|
|
|
1013
|
-
$activity =
|
|
1014
|
-
'status' => 'Order completed',
|
|
1015
|
-
'details' => 'Driver has completed order for all waypoints',
|
|
1016
|
-
'code' => 'completed',
|
|
1017
|
-
];
|
|
1018
|
-
|
|
1023
|
+
$activity = $order->config()->getCompletedActivity();
|
|
1019
1024
|
if ($order->driverAssigned) {
|
|
1020
1025
|
// unset from driver current job
|
|
1021
1026
|
$order->driverAssigned->unassignCurrentOrder();
|
|
1022
1027
|
}
|
|
1023
1028
|
|
|
1024
|
-
$order->notifyCompleted();
|
|
1025
|
-
|
|
1026
1029
|
/** @var \Fleetbase\LaravelMysqlSpatial\Types\Point */
|
|
1027
1030
|
$location = $order->getLastLocation();
|
|
1028
|
-
|
|
1029
|
-
$order->
|
|
1030
|
-
$order->
|
|
1031
|
+
$order->setStatus($activity->code);
|
|
1032
|
+
$order->insertActivity($activity, $location);
|
|
1033
|
+
$order->notifyCompleted();
|
|
1031
1034
|
|
|
1032
1035
|
return new OrderResource($order);
|
|
1033
1036
|
}
|
|
@@ -1112,7 +1115,7 @@ class OrderController extends Controller
|
|
|
1112
1115
|
*
|
|
1113
1116
|
* @return void
|
|
1114
1117
|
*/
|
|
1115
|
-
public function captureQrScan(string $id, ?string $subjectId = null
|
|
1118
|
+
public function captureQrScan(Request $request, string $id, ?string $subjectId = null)
|
|
1116
1119
|
{
|
|
1117
1120
|
$code = $request->input('code');
|
|
1118
1121
|
$data = $request->input('data', []);
|
|
@@ -1183,7 +1186,7 @@ class OrderController extends Controller
|
|
|
1183
1186
|
*
|
|
1184
1187
|
* @return void
|
|
1185
1188
|
*/
|
|
1186
|
-
public function captureSignature(string $id, ?string $subjectId = null
|
|
1189
|
+
public function captureSignature(Request $request, string $id, ?string $subjectId = null)
|
|
1187
1190
|
{
|
|
1188
1191
|
$disk = $request->input('disk', config('filesystems.default'));
|
|
1189
1192
|
$bucket = $request->input('bucket', config('filesystems.disks.' . $disk . '.bucket', config('filesystems.disks.s3.bucket')));
|
|
@@ -1269,4 +1272,96 @@ class OrderController extends Controller
|
|
|
1269
1272
|
|
|
1270
1273
|
return new ProofResource($proof);
|
|
1271
1274
|
}
|
|
1275
|
+
|
|
1276
|
+
/**
|
|
1277
|
+
* Validate a photo.
|
|
1278
|
+
*
|
|
1279
|
+
* @return void
|
|
1280
|
+
*/
|
|
1281
|
+
public function capturePhoto(Request $request, string $id, ?string $subjectId = null)
|
|
1282
|
+
{
|
|
1283
|
+
$disk = $request->input('disk', config('filesystems.default'));
|
|
1284
|
+
$bucket = $request->input('bucket', config('filesystems.disks.' . $disk . '.bucket', config('filesystems.disks.s3.bucket')));
|
|
1285
|
+
$photo = $request->input('photo');
|
|
1286
|
+
$data = $request->input('data', []);
|
|
1287
|
+
$remarks = $request->input('remarks', 'Verified by Photo');
|
|
1288
|
+
$type = $subjectId ? strtok($subjectId, '_') : null;
|
|
1289
|
+
|
|
1290
|
+
try {
|
|
1291
|
+
$order = Order::findRecordOrFail($id);
|
|
1292
|
+
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
|
|
1293
|
+
return response()->json(
|
|
1294
|
+
[
|
|
1295
|
+
'error' => 'Order resource not found.',
|
|
1296
|
+
],
|
|
1297
|
+
404
|
|
1298
|
+
);
|
|
1299
|
+
}
|
|
1300
|
+
|
|
1301
|
+
if (!$photo) {
|
|
1302
|
+
return response()->apiError('No photo data to capture.');
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
$subject = $type === null ? $order : null;
|
|
1306
|
+
|
|
1307
|
+
switch ($type) {
|
|
1308
|
+
case 'place':
|
|
1309
|
+
case 'waypoint':
|
|
1310
|
+
$subject = Waypoint::where('payload_uuid', $order->payload_uuid)->where(function ($q) use ($subjectId) {
|
|
1311
|
+
$q->whereHas('place', function ($q) use ($subjectId) {
|
|
1312
|
+
$q->where('public_id', $subjectId);
|
|
1313
|
+
});
|
|
1314
|
+
$q->orWhere('public_id', $subjectId);
|
|
1315
|
+
})->withoutGlobalScopes()->first();
|
|
1316
|
+
break;
|
|
1317
|
+
|
|
1318
|
+
case 'entity':
|
|
1319
|
+
$subject = Entity::where('public_id', $subjectId)->withoutGlobalScopes()->first();
|
|
1320
|
+
break;
|
|
1321
|
+
|
|
1322
|
+
default:
|
|
1323
|
+
break;
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
if (!$subject) {
|
|
1327
|
+
return response()->apiError('Unable to capture photo');
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
// create proof instance
|
|
1331
|
+
$proof = Proof::create([
|
|
1332
|
+
'company_uuid' => session('company'),
|
|
1333
|
+
'order_uuid' => $order->uuid,
|
|
1334
|
+
'subject_uuid' => $subject->uuid,
|
|
1335
|
+
'subject_type' => Utils::getModelClassName($subject),
|
|
1336
|
+
'remarks' => $remarks,
|
|
1337
|
+
'raw_data' => $photo,
|
|
1338
|
+
'data' => $data,
|
|
1339
|
+
]);
|
|
1340
|
+
|
|
1341
|
+
// set the photo storage path
|
|
1342
|
+
$path = 'uploads/' . session('company') . '/photos/' . $proof->public_id . '.png';
|
|
1343
|
+
|
|
1344
|
+
// upload photo
|
|
1345
|
+
Storage::disk($disk)->put($path, base64_decode($photo));
|
|
1346
|
+
|
|
1347
|
+
// create file record for upload
|
|
1348
|
+
$file = File::create([
|
|
1349
|
+
'company_uuid' => session('company'),
|
|
1350
|
+
'uploader_uuid' => session('user'),
|
|
1351
|
+
'name' => basename($path),
|
|
1352
|
+
'original_filename' => basename($path),
|
|
1353
|
+
'extension' => 'png',
|
|
1354
|
+
'content_type' => 'image/png',
|
|
1355
|
+
'path' => $path,
|
|
1356
|
+
'bucket' => $bucket,
|
|
1357
|
+
'type' => 'photo',
|
|
1358
|
+
'size' => Utils::getBase64ImageSize($photo),
|
|
1359
|
+
])->setKey($proof);
|
|
1360
|
+
|
|
1361
|
+
// set file to proof
|
|
1362
|
+
$proof->file_uuid = $file->uuid;
|
|
1363
|
+
$proof->save();
|
|
1364
|
+
|
|
1365
|
+
return new ProofResource($proof);
|
|
1366
|
+
}
|
|
1272
1367
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\Http\Controllers\Controller;
|
|
6
|
+
use Fleetbase\Http\Resources\Organization;
|
|
7
|
+
use Fleetbase\Models\Company;
|
|
8
|
+
|
|
9
|
+
class OrganizationController extends Controller
|
|
10
|
+
{
|
|
11
|
+
/**
|
|
12
|
+
* Return List organizations.
|
|
13
|
+
*
|
|
14
|
+
* @return Organization
|
|
15
|
+
*/
|
|
16
|
+
public function listOrganizations()
|
|
17
|
+
{
|
|
18
|
+
$companies = Company::whereHas('users')->take(10)->get()->map(function ($company) {
|
|
19
|
+
return [
|
|
20
|
+
'name' => $company->name,
|
|
21
|
+
'id' => $company->public_id,
|
|
22
|
+
];
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return response()->json($companies);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -130,9 +130,8 @@ class PlaceController extends Controller
|
|
|
130
130
|
]);
|
|
131
131
|
|
|
132
132
|
// check if missing location
|
|
133
|
-
$isMissingLocation = empty($input['location']);
|
|
134
|
-
|
|
135
133
|
// set a default location for creation
|
|
134
|
+
$isMissingLocation = empty($input['location']);
|
|
136
135
|
if ($isMissingLocation) {
|
|
137
136
|
$input['location'] = new Point(0, 0);
|
|
138
137
|
}
|
|
@@ -141,7 +140,7 @@ class PlaceController extends Controller
|
|
|
141
140
|
$place->fill($input);
|
|
142
141
|
|
|
143
142
|
// attempt to find and set latitude and longitude
|
|
144
|
-
if ($isMissingLocation || $request->missing(['latitude', 'longitude', 'location']) || $place->
|
|
143
|
+
if ($isMissingLocation || $request->missing(['latitude', 'longitude', 'location']) || empty($place->country)) {
|
|
145
144
|
$geocoded = Geocoder::geocode($place->toAddressString(['name']))
|
|
146
145
|
->get()
|
|
147
146
|
->first();
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Http\Controllers;
|
|
4
4
|
|
|
5
|
+
use Fleetbase\FleetOps\Models\Order;
|
|
5
6
|
use Fleetbase\Http\Controllers\FleetbaseController;
|
|
6
7
|
|
|
7
8
|
class FleetOpsController extends FleetbaseController
|
|
@@ -10,4 +11,10 @@ class FleetOpsController extends FleetbaseController
|
|
|
10
11
|
* The package namespace used to resolve from.
|
|
11
12
|
*/
|
|
12
13
|
public string $namespace = '\\Fleetbase\\FleetOps';
|
|
14
|
+
|
|
15
|
+
public function test()
|
|
16
|
+
{
|
|
17
|
+
$order = Order::where('public_id', '')->first();
|
|
18
|
+
dd($order->config()->getNextActivity());
|
|
19
|
+
}
|
|
13
20
|
}
|