@fleetbase/fleetops-engine 0.4.17 → 0.4.19

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 (38) hide show
  1. package/addon/components/activity-form-panel.hbs +19 -0
  2. package/addon/components/activity-form-panel.js +18 -0
  3. package/addon/components/live-map.js +14 -7
  4. package/addon/components/order-config-manager/details.js +15 -6
  5. package/addon/components/order-config-manager.js +20 -7
  6. package/addon/controllers/operations/order-config.js +2 -1
  7. package/addon/controllers/operations/orders/index/new.js +5 -0
  8. package/addon/controllers/operations/service-rates/index/new.js +23 -2
  9. package/addon/routes/operations/service-rates/index/edit.js +14 -5
  10. package/addon/routes/operations/service-rates/index/new.js +2 -6
  11. package/addon/services/location.js +54 -44
  12. package/addon/templates/operations/service-rates/index/new.hbs +10 -1
  13. package/composer.json +3 -3
  14. package/extension.json +1 -1
  15. package/package.json +3 -3
  16. package/server/config/api.php +3 -650
  17. package/server/config/fleetops.php +127 -4
  18. package/server/migrations/2024_03_12_033527_add_public_id_column_to_order_configs_table.php +34 -0
  19. package/server/migrations/2024_03_13_061249_add_order_config_uuid_column_to_service_rates_table.php +28 -0
  20. package/server/seeders/OrderConfigSeeder.php +2 -130
  21. package/server/src/Console/Commands/FixLegacyOrderConfigs.php +17 -11
  22. package/server/src/Http/Controllers/Api/v1/OrderController.php +25 -3
  23. package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +10 -5
  24. package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +61 -0
  25. package/server/src/Http/Controllers/Internal/v1/OrderController.php +12 -2
  26. package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +3 -0
  27. package/server/src/Http/Requests/CreateOrderRequest.php +32 -13
  28. package/server/src/Http/Requests/Internal/CreateOrderConfigRequest.php +40 -0
  29. package/server/src/Http/Requests/Internal/CreateOrderRequest.php +97 -0
  30. package/server/src/Http/Requests/Internal/DeleteOrderConfigRequest.php +0 -0
  31. package/server/src/Http/Resources/v1/Order.php +1 -1
  32. package/server/src/Http/Resources/v1/ServiceRate.php +34 -31
  33. package/server/src/Models/OrderConfig.php +48 -0
  34. package/server/src/Models/ServiceRate.php +9 -0
  35. package/server/src/Observers/CompanyObserver.php +20 -0
  36. package/server/src/Providers/FleetOpsServiceProvider.php +1 -0
  37. package/server/src/Support/FleetOps.php +137 -0
  38. package/translations/en-us.yaml +6 -1
@@ -2,10 +2,15 @@
2
2
 
3
3
  /**
4
4
  * -------------------------------------------
5
- * Fleetbase Core API Configuration
5
+ * FleetOps API Configuration
6
6
  * -------------------------------------------
7
7
  */
8
8
  return [
9
+ /*
10
+ |--------------------------------------------------------------------------
11
+ | API Config
12
+ |--------------------------------------------------------------------------
13
+ */
9
14
  'api' => [
10
15
  'version' => '0.0.1',
11
16
  'routing' => [
@@ -13,10 +18,128 @@ return [
13
18
  'internal_prefix' => 'int'
14
19
  ]
15
20
  ],
21
+ 'connection' => [
22
+ 'db' => env('DB_CONNECTION', 'mysql')
23
+ ],
24
+
25
+ /*
26
+ |--------------------------------------------------------------------------
27
+ | Navigator App
28
+ |--------------------------------------------------------------------------
29
+ */
16
30
  'navigator' => [
17
31
  'bypass_verification_code' => env('NAVIGATOR_BYPASS_VERIFICATION_CODE', '999000')
18
32
  ],
19
- 'connection' => [
20
- 'db' => env('DB_CONNECTION', 'mysql')
21
- ]
33
+
34
+ /*
35
+ |--------------------------------------------------------------------------
36
+ | API Events
37
+ |--------------------------------------------------------------------------
38
+ */
39
+ 'events' => [
40
+ // order events
41
+ 'order.created',
42
+ 'order.updated',
43
+ 'order.deleted',
44
+ 'order.dispatched',
45
+ 'order.dispatch_failed',
46
+ 'order.completed',
47
+ 'order.failed',
48
+ 'order.driver_assigned',
49
+ 'order.completed',
50
+
51
+ // payload events
52
+ 'payload.created',
53
+ 'payload.updated',
54
+ 'payload.deleted',
55
+
56
+ // entity events
57
+ 'entity.created',
58
+ 'entity.updated',
59
+ 'entity.deleted',
60
+ 'entity.driver_assigned',
61
+
62
+ // driver events
63
+ 'driver.created',
64
+ 'driver.updated',
65
+ 'driver.deleted',
66
+ 'driver.assigned',
67
+ // 'driver.entered_zone',
68
+ // 'driver.exited_zone',
69
+
70
+ // fleet events
71
+ 'fleet.created',
72
+ 'fleet.updated',
73
+ 'fleet.deleted',
74
+
75
+ // purchase_rate events
76
+ 'purchase_rate.created',
77
+ 'purchase_rate.updated',
78
+ 'purchase_rate.deleted',
79
+
80
+ // contact events
81
+ 'contact.created',
82
+ 'contact.updated',
83
+ 'contact.deleted',
84
+
85
+ // place events
86
+ 'place.created',
87
+ 'place.updated',
88
+ 'place.deleted',
89
+
90
+ // service_area events
91
+ 'service_area.created',
92
+ 'service_area.updated',
93
+ 'service_area.deleted',
94
+
95
+ // service_quote events
96
+ 'service_quote.created',
97
+ 'service_quote.updated',
98
+ 'service_quote.deleted',
99
+
100
+ // service_rate events
101
+ 'service_rate.created',
102
+ 'service_rate.updated',
103
+ 'service_rate.deleted',
104
+
105
+ // tracking_number events
106
+ 'tracking_number.created',
107
+ 'tracking_number.updated',
108
+ 'tracking_number.deleted',
109
+
110
+ // tracking_status events
111
+ 'tracking_status.created',
112
+ 'tracking_status.updated',
113
+ 'tracking_status.deleted',
114
+
115
+ // vehicle events
116
+ 'vehicle.created',
117
+ 'vehicle.updated',
118
+ 'vehicle.deleted',
119
+
120
+ // vendor events
121
+ 'vendor.created',
122
+ 'vendor.updated',
123
+ 'vendor.deleted',
124
+
125
+ // zone events
126
+ 'zone.created',
127
+ 'zone.updated',
128
+ 'zone.deleted',
129
+ ],
130
+
131
+ /*
132
+ |--------------------------------------------------------------------------
133
+ | Proof of Delivery Methods
134
+ |--------------------------------------------------------------------------
135
+ */
136
+ 'pod_methods' => 'scan,signature,photo',
137
+
138
+ /*
139
+ |--------------------------------------------------------------------------
140
+ | API/Webhook Versions
141
+ |--------------------------------------------------------------------------
142
+ */
143
+ 'versions' => ['2020-09-30', '2024-03-12'],
144
+ 'version' => '2024-03-12',
22
145
  ];
@@ -0,0 +1,34 @@
1
+ <?php
2
+
3
+ use Fleetbase\FleetOps\Models\OrderConfig;
4
+ use Illuminate\Database\Migrations\Migration;
5
+ use Illuminate\Database\Schema\Blueprint;
6
+ use Illuminate\Support\Facades\Schema;
7
+
8
+ return new class() extends Migration {
9
+ /**
10
+ * Run the migrations.
11
+ */
12
+ public function up(): void
13
+ {
14
+ Schema::table('order_configs', function (Blueprint $table) {
15
+ $table->string('public_id')->nullable()->after('uuid')->index();
16
+ });
17
+
18
+ // Update order configs with a public id
19
+ $orderCofigs = OrderConfig::all();
20
+ foreach ($orderCofigs as $orderCofig) {
21
+ $orderCofig->update(['public_id' => OrderConfig::generatePublicId('order_config')]);
22
+ }
23
+ }
24
+
25
+ /**
26
+ * Reverse the migrations.
27
+ */
28
+ public function down(): void
29
+ {
30
+ Schema::table('order_configs', function (Blueprint $table) {
31
+ $table->dropColumn('public_id');
32
+ });
33
+ }
34
+ };
@@ -0,0 +1,28 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ return new class() extends Migration {
8
+ /**
9
+ * Run the migrations.
10
+ */
11
+ public function up(): void
12
+ {
13
+ Schema::table('service_rates', function (Blueprint $table) {
14
+ $table->foreignUuid('order_config_uuid')->nullable()->after('zone_uuid')->references('uuid')->on('order_configs')->onUpdate('CASCADE')->onDelete('CASCADE');
15
+ });
16
+ }
17
+
18
+ /**
19
+ * Reverse the migrations.
20
+ */
21
+ public function down(): void
22
+ {
23
+ Schema::table('service_rates', function (Blueprint $table) {
24
+ $table->dropForeign(['order_config_uuid']);
25
+ $table->dropColumn(['order_config_uuid']);
26
+ });
27
+ }
28
+ };
@@ -2,10 +2,9 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Seeders;
4
4
 
5
- use Fleetbase\FleetOps\Models\OrderConfig;
5
+ use Fleetbase\FleetOps\Support\FleetOps;
6
6
  use Fleetbase\Models\Company;
7
7
  use Illuminate\Database\Seeder;
8
- use Illuminate\Support\Str;
9
8
 
10
9
  class OrderConfigSeeder extends Seeder
11
10
  {
@@ -18,134 +17,7 @@ class OrderConfigSeeder extends Seeder
18
17
  {
19
18
  $companies = Company::all();
20
19
  foreach ($companies as $company) {
21
- static::createTransportConfig($company);
20
+ FleetOps::createTransportConfig($company);
22
21
  }
23
22
  }
24
-
25
- /**
26
- * Creates or retrieves an existing transport configuration for a given company.
27
- *
28
- * This method attempts to find a transport configuration (`OrderConfig`) for the specified company.
29
- * If such a configuration exists, it's returned. Otherwise, a new configuration is created with default values,
30
- * such as the company UUID, key, core service flag, status, version, tags, and predefined workflow steps.
31
- * These steps include 'created', 'enroute', 'started', 'completed', and 'dispatched', each with specific attributes.
32
- *
33
- * @param Company $company the company for which the transport configuration is being created or retrieved
34
- *
35
- * @return OrderConfig the transport configuration associated with the specified company
36
- */
37
- public static function createTransportConfig(Company $company): OrderConfig
38
- {
39
- return OrderConfig::firstOrCreate(
40
- [
41
- 'company_uuid' => $company->uuid,
42
- 'key' => 'transport',
43
- 'namespace' => 'system:order-config:transport',
44
- ],
45
- [
46
- 'name' => 'Transport',
47
- 'key' => 'transport',
48
- 'namespace' => 'system:order-config:transport',
49
- 'description' => 'Default order configuration for transport',
50
- 'core_service' => 1,
51
- 'status' => 'private',
52
- 'version' => '0.0.1',
53
- 'tags' => ['transport', 'delivery'],
54
- 'entities' => [],
55
- 'meta' => [],
56
- 'flow' => [
57
- 'created' => [
58
- 'key' => 'created',
59
- 'code' => 'created',
60
- 'color' => '#1f2937',
61
- 'logic' => [],
62
- 'events' => [],
63
- 'status' => 'Order Created',
64
- 'actions' => [],
65
- 'details' => 'New order was created.',
66
- 'options' => [],
67
- 'complete' => false,
68
- 'entities' => [],
69
- 'sequence' => 0,
70
- 'activities' => ['dispatched'],
71
- 'internalId' => Str::uuid(),
72
- 'pod_method' => 'scan',
73
- 'require_pod' => false,
74
- ],
75
- 'enroute' => [
76
- 'key' => 'enroute',
77
- 'code' => 'enroute',
78
- 'color' => '#1f2937',
79
- 'logic' => [],
80
- 'events' => [],
81
- 'status' => 'Driver Enroute',
82
- 'actions' => [],
83
- 'details' => 'Driver is en-route.',
84
- 'options' => [],
85
- 'complete' => false,
86
- 'entities' => [],
87
- 'sequence' => 0,
88
- 'activities' => ['completed'],
89
- 'internalId' => Str::uuid(),
90
- 'pod_method' => 'scan',
91
- 'require_pod' => false,
92
- ],
93
- 'started' => [
94
- 'key' => 'started',
95
- 'code' => 'started',
96
- 'color' => '#1f2937',
97
- 'logic' => [],
98
- 'events' => [],
99
- 'status' => 'Order Started',
100
- 'actions' => [],
101
- 'details' => 'Order has been started',
102
- 'options' => [],
103
- 'complete' => false,
104
- 'entities' => [],
105
- 'sequence' => 0,
106
- 'activities' => ['enroute'],
107
- 'internalId' => Str::uuid(),
108
- 'pod_method' => 'scan',
109
- 'require_pod' => false,
110
- ],
111
- 'completed' => [
112
- 'key' => 'completed',
113
- 'code' => 'completed',
114
- 'color' => '#1f2937',
115
- 'logic' => [],
116
- 'events' => [],
117
- 'status' => 'Order Completed',
118
- 'actions' => [],
119
- 'details' => 'Order has been completed.',
120
- 'options' => [],
121
- 'complete' => true,
122
- 'entities' => [],
123
- 'sequence' => 0,
124
- 'activities' => [],
125
- 'internalId' => Str::uuid(),
126
- 'pod_method' => 'scan',
127
- 'require_pod' => false,
128
- ],
129
- 'dispatched' => [
130
- 'key' => 'dispatched',
131
- 'code' => 'dispatched',
132
- 'color' => '#1f2937',
133
- 'logic' => [],
134
- 'events' => [],
135
- 'status' => 'Order Dispatched',
136
- 'actions' => [],
137
- 'details' => 'Order has been dispatched.',
138
- 'options' => [],
139
- 'complete' => false,
140
- 'entities' => [],
141
- 'sequence' => 0,
142
- 'activities' => ['started'],
143
- 'internalId' => Str::uuid(),
144
- 'pod_method' => 'scan',
145
- 'require_pod' => false,
146
- ],
147
- ],
148
- ]
149
- );
150
- }
151
23
  }
@@ -4,9 +4,9 @@ namespace Fleetbase\FleetOps\Console\Commands;
4
4
 
5
5
  use Fleetbase\FleetOps\Models\Order;
6
6
  use Fleetbase\FleetOps\Models\OrderConfig;
7
- use Fleetbase\Support\Utils;
7
+ use Fleetbase\FleetOps\Support\FleetOps;
8
+ use Fleetbase\Models\Company;
8
9
  use Illuminate\Console\Command;
9
- use Illuminate\Support\Facades\Artisan;
10
10
 
11
11
  class FixLegacyOrderConfigs extends Command
12
12
  {
@@ -15,7 +15,7 @@ class FixLegacyOrderConfigs extends Command
15
15
  *
16
16
  * @var string
17
17
  */
18
- protected $signature = 'fleetops:fix-legacy-order-configs';
18
+ protected $signature = 'fleetops:fix-legacy-order-configs {--create-configs}';
19
19
 
20
20
  /**
21
21
  * The console command description.
@@ -35,14 +35,20 @@ class FixLegacyOrderConfigs extends Command
35
35
  */
36
36
  public function handle()
37
37
  {
38
- if (Utils::classExists('\\Fleetbase\\FleetOps\\Seeders\\OrderConfigSeeder')) {
39
- $this->info('Starting the database seeding...');
40
-
41
- Artisan::call('db:seed', [
42
- '--class' => '\\Fleetbase\\FleetOps\\Seeders\\OrderConfigSeeder',
43
- ]);
44
-
45
- $this->info('Database seeding completed.');
38
+ $shouldCreateConfigs = $this->option('create-configs');
39
+ if ($shouldCreateConfigs) {
40
+ $companies = Company::all();
41
+ $totalCompanies = $companies->count();
42
+ $this->info('Initializing transport config for ' . $totalCompanies . ' companies.');
43
+ $progressBar = $this->output->createProgressBar($totalCompanies);
44
+ $progressBar->start();
45
+ foreach ($companies as $company) {
46
+ FleetOps::createTransportConfig($company);
47
+ $progressBar->advance();
48
+ }
49
+ $progressBar->finish();
50
+ $this->line('');
51
+ $this->info('All transport configs created.');
46
52
  }
47
53
 
48
54
  $orders = Order::whereNull('order_config_uuid')->get();
@@ -15,6 +15,7 @@ use Fleetbase\FleetOps\Http\Resources\v1\Proof as ProofResource;
15
15
  use Fleetbase\FleetOps\Models\Driver;
16
16
  use Fleetbase\FleetOps\Models\Entity;
17
17
  use Fleetbase\FleetOps\Models\Order;
18
+ use Fleetbase\FleetOps\Models\OrderConfig;
18
19
  use Fleetbase\FleetOps\Models\Payload;
19
20
  use Fleetbase\FleetOps\Models\Place;
20
21
  use Fleetbase\FleetOps\Models\Proof;
@@ -42,7 +43,17 @@ class OrderController extends Controller
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', 'type', 'status', 'meta', 'notes']);
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');
@@ -965,9 +976,20 @@ class OrderController extends Controller
965
976
  );
966
977
  }
967
978
 
968
- $activity = $order->config()->nextActivity();
979
+ $activities = $order->config()->nextActivity();
980
+
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
+ }
988
+
989
+ return $activity;
990
+ });
969
991
 
970
- return response()->json($activity);
992
+ return response()->json($activities);
971
993
  }
972
994
 
973
995
  /**
@@ -4,6 +4,7 @@ namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
4
4
 
5
5
  use Fleetbase\FleetOps\Http\Requests\QueryServiceQuotesRequest;
6
6
  use Fleetbase\FleetOps\Http\Resources\v1\ServiceQuote as ServiceQuoteResource;
7
+ use Fleetbase\FleetOps\Models\Entity;
7
8
  use Fleetbase\FleetOps\Models\IntegratedVendor;
8
9
  use Fleetbase\FleetOps\Models\Payload;
9
10
  use Fleetbase\FleetOps\Models\Place;
@@ -76,11 +77,15 @@ class ServiceQuoteController extends Controller
76
77
 
77
78
  // if quote for single service
78
79
  if ($service && $service !== 'all') {
79
- $serviceRate = ServiceRate::where('uuid', $service)->where(function ($q) use ($currency) {
80
- if ($currency) {
81
- $q->where(DB::raw('lower(currency)'), strtolower($currency));
82
- }
83
- })->first();
80
+ $serviceRate = ServiceRate::where(
81
+ function ($query) use ($service) {
82
+ $query->where('uuid', $service)->orWhere('public_id', $service);
83
+ })->where(
84
+ function ($q) use ($currency) {
85
+ if ($currency) {
86
+ $q->where(DB::raw('lower(currency)'), strtolower($currency));
87
+ }
88
+ })->first();
84
89
  $serviceQuotes = collect();
85
90
 
86
91
  if ($serviceRate) {
@@ -2,7 +2,12 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\Exceptions\FleetbaseRequestValidationException;
5
6
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
7
+ use Fleetbase\FleetOps\Http\Requests\Internal\CreateOrderConfigRequest;
8
+ use Fleetbase\FleetOps\Models\OrderConfig;
9
+ use Illuminate\Http\Request;
10
+ use Illuminate\Support\Facades\Validator;
6
11
 
7
12
  class OrderConfigController extends FleetOpsController
8
13
  {
@@ -12,4 +17,60 @@ class OrderConfigController extends FleetOpsController
12
17
  * @var string
13
18
  */
14
19
  public $resource = 'order-config';
20
+
21
+ /**
22
+ * Creates a record with request payload.
23
+ *
24
+ * @return \Illuminate\Http\Response
25
+ */
26
+ public function createRecord(Request $request)
27
+ {
28
+ // Create validation request
29
+ $createOrderRequest = CreateOrderConfigRequest::createFrom($request);
30
+ $rules = $createOrderRequest->rules();
31
+
32
+ // Manually validate request
33
+ $validator = Validator::make($request->input('orderConfig'), $rules);
34
+ if ($validator->fails()) {
35
+ return $createOrderRequest->responseWithErrors($validator);
36
+ }
37
+
38
+ try {
39
+ $record = $this->model->createRecordFromRequest($request);
40
+
41
+ return ['order_config' => new $this->resource($record)];
42
+ } catch (\Exception $e) {
43
+ return response()->error($e->getMessage());
44
+ } catch (\Illuminate\Database\QueryException $e) {
45
+ return response()->error($e->getMessage());
46
+ } catch (FleetbaseRequestValidationException $e) {
47
+ return response()->error($e->getErrors());
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Delete's an order config.
53
+ *
54
+ * @return \Illuminate\Http\Response
55
+ */
56
+ public function deleteRecord($id, Request $request)
57
+ {
58
+ $orderConfig = OrderConfig::where('uuid', $id)->first();
59
+ if (!$orderConfig) {
60
+ return response()->error('No order config found.');
61
+ }
62
+
63
+ // `core_service` order configs cannot be deleted
64
+ if ($orderConfig->core_service) {
65
+ return response()->error('Core service order config\'s cannot be deleted.');
66
+ }
67
+
68
+ if ($orderConfig) {
69
+ $orderConfig->delete();
70
+
71
+ $this->resource::wrap($this->resourceSingularlName);
72
+
73
+ return new $this->resource($orderConfig);
74
+ }
75
+ }
15
76
  }
@@ -9,6 +9,7 @@ use Fleetbase\FleetOps\Events\OrderStarted;
9
9
  use Fleetbase\FleetOps\Flow\Activity;
10
10
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
11
11
  use Fleetbase\FleetOps\Http\Requests\CancelOrderRequest;
12
+ use Fleetbase\FleetOps\Http\Requests\Internal\CreateOrderRequest;
12
13
  use Fleetbase\FleetOps\Imports\OrdersImport;
13
14
  use Fleetbase\FleetOps\Models\Driver;
14
15
  use Fleetbase\FleetOps\Models\Entity;
@@ -25,6 +26,7 @@ use Fleetbase\Models\File;
25
26
  use Fleetbase\Models\Type;
26
27
  use Illuminate\Http\Request;
27
28
  use Illuminate\Support\Facades\DB;
29
+ use Illuminate\Support\Facades\Validator;
28
30
  use Illuminate\Support\Str;
29
31
  use Maatwebsite\Excel\Facades\Excel;
30
32
 
@@ -44,9 +46,17 @@ class OrderController extends FleetOpsController
44
46
  */
45
47
  public function createRecord(Request $request)
46
48
  {
47
- try {
48
- $this->validateRequest($request);
49
+ // Create validation request
50
+ $createOrderRequest = CreateOrderRequest::createFrom($request);
51
+ $rules = $createOrderRequest->rules();
52
+
53
+ // Manually validate request
54
+ $validator = Validator::make($request->input('order'), $rules);
55
+ if ($validator->fails()) {
56
+ return $createOrderRequest->responseWithErrors($validator);
57
+ }
49
58
 
59
+ try {
50
60
  $record = $this->model->createRecordFromRequest(
51
61
  $request,
52
62
  function ($request, &$input) {
@@ -39,6 +39,9 @@ class ServiceRateController extends FleetOpsController
39
39
  $waypoints,
40
40
  function ($query) use ($request) {
41
41
  $query->where('company_uuid', $request->session()->get('company'));
42
+ if ($request->filled('service_type')) {
43
+ $query->where('service_type', $request->input('service_type'));
44
+ }
42
45
  }
43
46
  );
44
47