@fleetbase/fleetops-engine 0.6.35 → 0.6.36

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 (71) hide show
  1. package/addon/components/avatar-manager.hbs +86 -0
  2. package/addon/components/avatar-manager.js +165 -0
  3. package/addon/components/customer/create-order-form.js +5 -0
  4. package/addon/components/layout/fleet-ops-sidebar.js +8 -0
  5. package/addon/components/order-progress-card.js +1 -1
  6. package/addon/controllers/analytics/reports/index/edit.js +2 -0
  7. package/addon/controllers/analytics/reports/index/new.js +2 -0
  8. package/addon/controllers/connectivity/devices/index/edit.js +2 -0
  9. package/addon/controllers/connectivity/devices/index/new.js +2 -0
  10. package/addon/controllers/connectivity/sensors/index/edit.js +2 -0
  11. package/addon/controllers/connectivity/sensors/index/new.js +2 -0
  12. package/addon/controllers/connectivity/telematics/index/edit.js +2 -0
  13. package/addon/controllers/connectivity/telematics/index/new.js +2 -0
  14. package/addon/controllers/management/contacts/customers/edit.js +2 -0
  15. package/addon/controllers/management/contacts/customers/new.js +2 -0
  16. package/addon/controllers/management/contacts/index/edit.js +2 -0
  17. package/addon/controllers/management/contacts/index/new.js +2 -0
  18. package/addon/controllers/management/drivers/index/edit.js +2 -0
  19. package/addon/controllers/management/drivers/index/new.js +2 -0
  20. package/addon/controllers/management/fleets/index/edit.js +2 -0
  21. package/addon/controllers/management/fleets/index/new.js +2 -0
  22. package/addon/controllers/management/fuel-reports/index/edit.js +2 -0
  23. package/addon/controllers/management/fuel-reports/index/new.js +2 -0
  24. package/addon/controllers/management/issues/index/edit.js +2 -0
  25. package/addon/controllers/management/issues/index/new.js +2 -0
  26. package/addon/controllers/management/places/index/edit.js +2 -0
  27. package/addon/controllers/management/places/index/new.js +2 -0
  28. package/addon/controllers/management/vehicles/index/edit.js +2 -0
  29. package/addon/controllers/management/vehicles/index/new.js +2 -0
  30. package/addon/controllers/management/vendors/index/edit.js +2 -0
  31. package/addon/controllers/management/vendors/index/new.js +2 -0
  32. package/addon/controllers/operations/orders/index/new.js +2 -0
  33. package/addon/controllers/operations/routes/index/new.js +1 -0
  34. package/addon/controllers/operations/service-rates/index/edit.js +2 -0
  35. package/addon/controllers/operations/service-rates/index/new.js +2 -0
  36. package/addon/controllers/settings/avatars.js +3 -0
  37. package/addon/extension.js +0 -5
  38. package/addon/routes/settings/avatars.js +3 -0
  39. package/addon/routes.js +1 -0
  40. package/addon/templates/operations/orders/index/new.hbs +1 -0
  41. package/addon/templates/settings/avatars.hbs +10 -0
  42. package/app/components/avatar-manager.js +1 -0
  43. package/app/controllers/settings/avatars.js +1 -0
  44. package/app/routes/settings/avatars.js +1 -0
  45. package/app/templates/settings/avatars.js +1 -0
  46. package/composer.json +1 -1
  47. package/extension.json +1 -1
  48. package/package.json +3 -3
  49. package/server/config/fleetops.php +1 -1
  50. package/server/src/Auth/Schemas/FleetOps.php +4 -0
  51. package/server/src/Expansions/UserFilterExpansion.php +31 -0
  52. package/server/src/Http/Controllers/Internal/v1/ContactController.php +5 -2
  53. package/server/src/Http/Controllers/Internal/v1/DriverController.php +13 -2
  54. package/server/src/Http/Controllers/Internal/v1/FleetController.php +5 -2
  55. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +5 -2
  56. package/server/src/Http/Controllers/Internal/v1/IssueController.php +5 -2
  57. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +5 -2
  58. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +8 -3
  59. package/server/src/Http/Controllers/Internal/v1/VendorController.php +5 -2
  60. package/server/src/Imports/ContactImport.php +6 -0
  61. package/server/src/Imports/DriverImport.php +6 -0
  62. package/server/src/Imports/FleetImport.php +6 -0
  63. package/server/src/Imports/FuelReportImport.php +6 -0
  64. package/server/src/Imports/IssueImport.php +6 -0
  65. package/server/src/Imports/PlaceImport.php +6 -0
  66. package/server/src/Imports/VehicleImport.php +6 -0
  67. package/server/src/Imports/VendorImport.php +6 -0
  68. package/server/src/Models/Vehicle.php +9 -2
  69. package/server/src/Support/Reporting/FleetOpsReportSchema.php +129 -1
  70. package/translations/en-us.yaml +2 -0
  71. package/DRIVER_SCHEDULING.md +0 -186
@@ -9,6 +9,7 @@ export default class ManagementVehiclesIndexEditController extends Controller {
9
9
  @service intl;
10
10
  @service notifications;
11
11
  @service modalsManager;
12
+ @service events;
12
13
  @tracked overlay;
13
14
  @tracked actionButtons = [
14
15
  {
@@ -20,6 +21,7 @@ export default class ManagementVehiclesIndexEditController extends Controller {
20
21
  @task *save(vehicle) {
21
22
  try {
22
23
  yield vehicle.save();
24
+ this.events.trackResourceUpdated(vehicle);
23
25
  this.overlay?.close();
24
26
 
25
27
  yield this.hostRouter.transitionTo('console.fleet-ops.management.vehicles.index.details', vehicle);
@@ -11,12 +11,14 @@ export default class ManagementVehiclesIndexNewController extends Controller {
11
11
  @service hostRouter;
12
12
  @service intl;
13
13
  @service notifications;
14
+ @service events;
14
15
  @tracked overlay;
15
16
  @tracked vehicle = this.store.createRecord('vehicle', DEFAULT_PROPERTIES);
16
17
 
17
18
  @task *save(vehicle) {
18
19
  try {
19
20
  yield vehicle.save();
21
+ this.events.trackResourceCreated(vehicle);
20
22
  this.overlay?.close();
21
23
 
22
24
  yield this.hostRouter.refresh();
@@ -9,6 +9,7 @@ export default class ManagementVendorsIndexEditController extends Controller {
9
9
  @service intl;
10
10
  @service notifications;
11
11
  @service modalsManager;
12
+ @service events;
12
13
  @tracked overlay;
13
14
  @tracked actionButtons = [
14
15
  {
@@ -20,6 +21,7 @@ export default class ManagementVendorsIndexEditController extends Controller {
20
21
  @task *save(vendor) {
21
22
  try {
22
23
  yield vendor.save();
24
+ this.events.trackResourceUpdated(vendor);
23
25
  this.overlay?.close();
24
26
 
25
27
  yield this.hostRouter.transitionTo('console.fleet-ops.management.vendors.index.details', vendor);
@@ -9,6 +9,7 @@ export default class ManagementVendorsIndexNewController extends Controller {
9
9
  @service hostRouter;
10
10
  @service intl;
11
11
  @service notifications;
12
+ @service events;
12
13
  @tracked overlay;
13
14
  @tracked vendor = this.vendorActions.createNewInstance();
14
15
  @tracked integratedVendor;
@@ -18,6 +19,7 @@ export default class ManagementVendorsIndexNewController extends Controller {
18
19
 
19
20
  try {
20
21
  yield vendor.save();
22
+ this.events.trackResourceCreated(vendor);
21
23
  this.overlay?.close();
22
24
 
23
25
  yield this.hostRouter.refresh();
@@ -19,6 +19,7 @@ export default class OperationsOrdersIndexNewController extends Controller {
19
19
  @service orderImport;
20
20
  @service orderCreation;
21
21
  @service orderValidation;
22
+ @service events;
22
23
  @tracked order = this.orderCreation.newOrder();
23
24
  @tracked overlay;
24
25
 
@@ -73,6 +74,7 @@ export default class OperationsOrdersIndexNewController extends Controller {
73
74
 
74
75
  // Save order
75
76
  const createdOrder = yield order.save();
77
+ this.events.trackResourceCreated(order);
76
78
 
77
79
  // Trigger created event
78
80
  this.universe.trigger('fleet-ops.order.created', createdOrder);
@@ -6,6 +6,7 @@ import { task } from 'ember-concurrency';
6
6
 
7
7
  export default class OperationsRoutesIndexNewController extends Controller {
8
8
  @service store;
9
+ @service events;
9
10
  @tracked panel;
10
11
  @tracked selectedOrders = '';
11
12
  @tracked waypoints = [];
@@ -10,6 +10,7 @@ export default class OperationsServiceRatesIndexEditController extends Controlle
10
10
  @service intl;
11
11
  @service notifications;
12
12
  @service modalsManager;
13
+ @service events;
13
14
  @tracked overlay;
14
15
  @tracked actionButtons = [
15
16
  {
@@ -21,6 +22,7 @@ export default class OperationsServiceRatesIndexEditController extends Controlle
21
22
  @task *save(serviceRate) {
22
23
  try {
23
24
  yield serviceRate.save();
25
+ this.events.trackResourceUpdated(serviceRate);
24
26
  this.overlay?.close();
25
27
 
26
28
  yield this.hostRouter.transitionTo('console.fleet-ops.operations.service-rates.index.details', serviceRate);
@@ -9,12 +9,14 @@ export default class OperationsServiceRatesIndexNewController extends Controller
9
9
  @service hostRouter;
10
10
  @service intl;
11
11
  @service notifications;
12
+ @service events;
12
13
  @tracked overlay;
13
14
  @tracked serviceRate = this.serviceRateActions.createNewInstance();
14
15
 
15
16
  @task *save(serviceRate) {
16
17
  try {
17
18
  yield serviceRate.save();
19
+ this.events.trackResourceCreated(serviceRate);
18
20
  this.overlay?.close();
19
21
 
20
22
  yield this.hostRouter.refresh();
@@ -0,0 +1,3 @@
1
+ import Controller from '@ember/controller';
2
+
3
+ export default class SettingsAvatarsController extends Controller {}
@@ -18,11 +18,6 @@ export default {
18
18
  icon: 'location-arrow',
19
19
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'admin/navigator-app'),
20
20
  }),
21
- new MenuItem({
22
- title: 'Avatar Managemenet',
23
- icon: 'images',
24
- component: new ExtensionComponent('@fleetbase/fleetops-engine', 'admin/avatar-management'),
25
- }),
26
21
  ],
27
22
  {
28
23
  slug: 'fleet-ops',
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class SettingsAvatarsRoute extends Route {}
package/addon/routes.js CHANGED
@@ -225,6 +225,7 @@ export default buildRoutes(function () {
225
225
  this.route('navigator-app');
226
226
  this.route('notifications');
227
227
  this.route('custom-fields');
228
+ this.route('avatars');
228
229
  this.route('routing');
229
230
  this.route('payments', function () {
230
231
  this.route('index', { path: '/' });
@@ -9,6 +9,7 @@
9
9
  @onOverlayReady={{fn (mut this.overlay)}}
10
10
  @width="530px"
11
11
  @onOpen={{this.setup}}
12
+ class="new-order-panel"
12
13
  >
13
14
  <Order::Form @resource={{this.order}} @controller={{this}} />
14
15
  <Spacer @height="300px" />
@@ -0,0 +1,10 @@
1
+ <Layout::Section::Header @title={{t "settings.avatar-management"}} />
2
+
3
+ <Layout::Section::Body class="overflow-y-scroll h-full">
4
+ <div class="container mx-auto h-screen">
5
+ <div class="max-w-3xl my-10 mx-auto space-y-6">
6
+ <AvatarManager />
7
+ </div>
8
+ </div>
9
+ <Spacer @height="600px" />
10
+ </Layout::Section::Body>
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/avatar-manager';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/controllers/settings/avatars';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/routes/settings/avatars';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/templates/settings/avatars';
package/composer.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetbase/fleetops-api",
3
- "version": "0.6.35",
3
+ "version": "0.6.36",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "keywords": [
6
6
  "fleetbase-extension",
package/extension.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "Fleet-Ops",
3
- "version": "0.6.35",
3
+ "version": "0.6.36",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "repository": "https://github.com/fleetbase/fleetops",
6
6
  "license": "AGPL-3.0-or-later",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fleetbase/fleetops-engine",
3
- "version": "0.6.35",
3
+ "version": "0.6.36",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "fleetbase": {
6
6
  "route": "fleet-ops"
@@ -42,8 +42,8 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@babel/core": "^7.23.2",
45
- "@fleetbase/ember-core": "^0.3.10",
46
- "@fleetbase/ember-ui": "^0.3.17",
45
+ "@fleetbase/ember-core": "^0.3.12",
46
+ "@fleetbase/ember-ui": "^0.3.21",
47
47
  "@fleetbase/fleetops-data": "^0.1.25",
48
48
  "@fleetbase/leaflet-routing-machine": "^3.2.17",
49
49
  "@fortawesome/ember-fontawesome": "^2.0.0",
@@ -56,7 +56,7 @@ return [
56
56
  |--------------------------------------------------------------------------
57
57
  */
58
58
  'navigator' => [
59
- 'bypass_verification_code' => env('NAVIGATOR_BYPASS_VERIFICATION_CODE', '999000'),
59
+ 'bypass_verification_code' => env('SMS_AUTH_BYPASS_CODE', env('NAVIGATOR_BYPASS_VERIFICATION_CODE')),
60
60
  'app_identifier' => env('NAVIGATOR_APP_IDENTIFIER', 'io.fleetbase.navigator')
61
61
  ],
62
62
 
@@ -117,6 +117,10 @@ class FleetOps
117
117
  'name' => 'custom-field',
118
118
  'actions' => [],
119
119
  ],
120
+ [
121
+ 'name' => 'avatar',
122
+ 'actions' => [],
123
+ ],
120
124
  [
121
125
  'name' => 'navigator-settings', // the navigator mobile app used by drivers
122
126
  'action' => [],
@@ -16,6 +16,37 @@ class UserFilterExpansion implements Expansion
16
16
  return \Fleetbase\Http\Filter\UserFilter::class;
17
17
  }
18
18
 
19
+ /**
20
+ * Filter where user is a driver type or has a driver profile.
21
+ *
22
+ * @return void
23
+ */
24
+ public static function isDriver()
25
+ {
26
+ return function () {
27
+ /** @var \Fleetbase\Http\Filter\UserFilter|\Fleetbase\Http\Filter\Filter $this */
28
+ $this->builder->where(function ($query) {
29
+ $query->where('type', 'driver');
30
+ $query->orwhereHas('driverProfiles', function ($query) {
31
+ $query->where('company_uuid', session('company'));
32
+ });
33
+ });
34
+ };
35
+ }
36
+
37
+ /**
38
+ * Filter where a user is a customer.
39
+ *
40
+ * @return void
41
+ */
42
+ public static function isCustomer()
43
+ {
44
+ return function () {
45
+ /** @var \Fleetbase\Http\Filter\UserFilter|\Fleetbase\Http\Filter\Filter $this */
46
+ $this->builder->where('type', 'customer');
47
+ };
48
+ }
49
+
19
50
  /**
20
51
  * Filter where doesnt have driver within the CURRENT organizations.
21
52
  *
@@ -91,15 +91,18 @@ class ContactController extends FleetOpsController
91
91
  {
92
92
  $disk = $request->input('disk', config('filesystems.default'));
93
93
  $files = $request->resolveFilesFromIds();
94
+ $importedCount = 0;
94
95
 
95
96
  foreach ($files as $file) {
96
97
  try {
97
- Excel::import(new ContactImport(), $file->path, $disk);
98
+ $import = new ContactImport();
99
+ Excel::import($import, $file->path, $disk);
100
+ $importedCount += $import->imported;
98
101
  } catch (\Throwable $e) {
99
102
  return response()->error('Invalid file, unable to proccess.');
100
103
  }
101
104
  }
102
105
 
103
- return response()->json(['status' => 'ok', 'message' => 'Import completed']);
106
+ return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]);
104
107
  }
105
108
  }
@@ -137,6 +137,14 @@ class DriverController extends FleetOpsController
137
137
  if ($input->has('user_uuid')) {
138
138
  $user = User::where('uuid', $input->get('user_uuid'))->first();
139
139
 
140
+ // Check if a driver profile already exists for this user in the current company
141
+ if ($user) {
142
+ $existingDriver = Driver::where(['user_uuid' => $user->uuid, 'company_uuid' => session('company')])->first();
143
+ if ($existingDriver) {
144
+ throw new \Exception('This user account already belongs to a driver.');
145
+ }
146
+ }
147
+
140
148
  // If user doesn't exist with provided UUID, create new user
141
149
  if (!$user) {
142
150
  $userInput = $input
@@ -513,15 +521,18 @@ class DriverController extends FleetOpsController
513
521
  {
514
522
  $disk = $request->input('disk', config('filesystems.default'));
515
523
  $files = $request->resolveFilesFromIds();
524
+ $importedCount = 0;
516
525
 
517
526
  foreach ($files as $file) {
518
527
  try {
519
- Excel::import(new DriverImport(), $file->path, $disk);
528
+ $import = new DriverImport();
529
+ Excel::import($import, $file->path, $disk);
530
+ $importedCount += $import->imported;
520
531
  } catch (\Throwable $e) {
521
532
  return response()->error('Invalid file, unable to proccess.');
522
533
  }
523
534
  }
524
535
 
525
- return response()->json(['status' => 'ok', 'message' => 'Import completed']);
536
+ return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]);
526
537
  }
527
538
  }
@@ -221,15 +221,18 @@ class FleetController extends FleetOpsController
221
221
  {
222
222
  $disk = $request->input('disk', config('filesystems.default'));
223
223
  $files = $request->resolveFilesFromIds();
224
+ $importedCount = 0;
224
225
 
225
226
  foreach ($files as $file) {
226
227
  try {
227
- Excel::import(new FleetImport(), $file->path, $disk);
228
+ $import = new FleetImport();
229
+ Excel::import($import, $file->path, $disk);
230
+ $importedCount += $import->imported;
228
231
  } catch (\Throwable $e) {
229
232
  return response()->error('Invalid file, unable to proccess.');
230
233
  }
231
234
  }
232
235
 
233
- return response()->json(['status' => 'ok', 'message' => 'Import completed']);
236
+ return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]);
234
237
  }
235
238
  }
@@ -50,15 +50,18 @@ class FuelReportController extends FleetOpsController
50
50
  {
51
51
  $disk = $request->input('disk', config('filesystems.default'));
52
52
  $files = $request->resolveFilesFromIds();
53
+ $importedCount = 0;
53
54
 
54
55
  foreach ($files as $file) {
55
56
  try {
56
- Excel::import(new FuelReportImport(), $file->path, $disk);
57
+ $import = new FuelReportImport();
58
+ Excel::import($import, $file->path, $disk);
59
+ $importedCount += $import->imported;
57
60
  } catch (\Throwable $e) {
58
61
  return response()->error('Invalid file, unable to proccess.');
59
62
  }
60
63
  }
61
64
 
62
- return response()->json(['status' => 'ok', 'message' => 'Import completed']);
65
+ return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]);
63
66
  }
64
67
  }
@@ -55,15 +55,18 @@ class IssueController extends FleetOpsController
55
55
  {
56
56
  $disk = $request->input('disk', config('filesystems.default'));
57
57
  $files = $request->resolveFilesFromIds();
58
+ $importedCount = 0;
58
59
 
59
60
  foreach ($files as $file) {
60
61
  try {
61
- Excel::import(new IssueImport(), $file->path, $disk);
62
+ $import = new IssueImport();
63
+ Excel::import($import, $file->path, $disk);
64
+ $importedCount += $import->imported;
62
65
  } catch (\Throwable $e) {
63
66
  return response()->error('Invalid file, unable to proccess.');
64
67
  }
65
68
  }
66
69
 
67
- return response()->json(['status' => 'ok', 'message' => 'Import completed']);
70
+ return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]);
68
71
  }
69
72
  }
@@ -170,15 +170,18 @@ class PlaceController extends FleetOpsController
170
170
  {
171
171
  $disk = $request->input('disk', config('filesystems.default'));
172
172
  $files = $request->resolveFilesFromIds();
173
+ $importedCount = 0;
173
174
 
174
175
  foreach ($files as $file) {
175
176
  try {
176
- Excel::import(new PlaceImport(), $file->path, $disk);
177
+ $import = new PlaceImport();
178
+ Excel::import($import, $file->path, $disk);
179
+ $importedCount += $import->imported;
177
180
  } catch (\Throwable $e) {
178
181
  return response()->error('Invalid file, unable to proccess.');
179
182
  }
180
183
  }
181
184
 
182
- return response()->json(['status' => 'ok', 'message' => 'Import completed']);
185
+ return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]);
183
186
  }
184
187
  }
@@ -59,7 +59,9 @@ class VehicleController extends FleetOpsController
59
59
  */
60
60
  public function avatars()
61
61
  {
62
- $options = Vehicle::getAvatarOptions();
62
+ $options = Vehicle::getAvatarOptions(function ($query) {
63
+ $query->where('company_uuid', session('company'));
64
+ });
63
65
 
64
66
  return response()->json($options);
65
67
  }
@@ -87,15 +89,18 @@ class VehicleController extends FleetOpsController
87
89
  {
88
90
  $disk = $request->input('disk', config('filesystems.default'));
89
91
  $files = $request->resolveFilesFromIds();
92
+ $importedCount = 0;
90
93
 
91
94
  foreach ($files as $file) {
92
95
  try {
93
- Excel::import(new VehicleImport(), $file->path, $disk);
96
+ $import = new VehicleImport();
97
+ Excel::import($import, $file->path, $disk);
98
+ $importedCount += $import->imported;
94
99
  } catch (\Throwable $e) {
95
100
  return response()->error('Invalid file, unable to proccess.');
96
101
  }
97
102
  }
98
103
 
99
- return response()->json(['status' => 'ok', 'message' => 'Import completed']);
104
+ return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]);
100
105
  }
101
106
  }
@@ -112,16 +112,19 @@ class VendorController extends FleetOpsController
112
112
  {
113
113
  $disk = $request->input('disk', config('filesystems.default'));
114
114
  $files = $request->resolveFilesFromIds();
115
+ $importedCount = 0;
115
116
 
116
117
  foreach ($files as $file) {
117
118
  try {
118
- Excel::import(new VendorImport(), $file->path, $disk);
119
+ $import = new VendorImport();
120
+ Excel::import($import, $file->path, $disk);
121
+ $importedCount += $import->imported;
119
122
  } catch (\Throwable $e) {
120
123
  return response()->error('Invalid file, unable to proccess.');
121
124
  }
122
125
  }
123
126
 
124
- return response()->json(['status' => 'ok', 'message' => 'Import completed']);
127
+ return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]);
125
128
  }
126
129
 
127
130
  /**
@@ -9,6 +9,11 @@ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
9
 
10
10
  class ContactImport implements ToCollection, WithHeadingRow
11
11
  {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
12
17
  /**
13
18
  * @return Collection
14
19
  */
@@ -20,6 +25,7 @@ class ContactImport implements ToCollection, WithHeadingRow
20
25
  }
21
26
 
22
27
  Contact::createFromImport($row, true);
28
+ $this->imported++;
23
29
  }
24
30
  }
25
31
  }
@@ -9,6 +9,11 @@ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
9
 
10
10
  class DriverImport implements ToCollection, WithHeadingRow
11
11
  {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
12
17
  /**
13
18
  * @return Collection
14
19
  */
@@ -20,6 +25,7 @@ class DriverImport implements ToCollection, WithHeadingRow
20
25
  }
21
26
 
22
27
  Driver::createFromImport($row, true);
28
+ $this->imported++;
23
29
  }
24
30
  }
25
31
  }
@@ -9,6 +9,11 @@ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
9
 
10
10
  class FleetImport implements ToCollection, WithHeadingRow
11
11
  {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
12
17
  /**
13
18
  * @return Collection
14
19
  */
@@ -20,6 +25,7 @@ class FleetImport implements ToCollection, WithHeadingRow
20
25
  }
21
26
 
22
27
  Fleet::createFromImport($row, true);
28
+ $this->imported++;
23
29
  }
24
30
  }
25
31
  }
@@ -9,6 +9,11 @@ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
9
 
10
10
  class FuelReportImport implements ToCollection, WithHeadingRow
11
11
  {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
12
17
  /**
13
18
  * @return Collection
14
19
  */
@@ -20,6 +25,7 @@ class FuelReportImport implements ToCollection, WithHeadingRow
20
25
  }
21
26
 
22
27
  FuelReport::createFromImport($row, true);
28
+ $this->imported++;
23
29
  }
24
30
  }
25
31
  }
@@ -9,6 +9,11 @@ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
9
 
10
10
  class IssueImport implements ToCollection, WithHeadingRow
11
11
  {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
12
17
  /**
13
18
  * @return Collection
14
19
  */
@@ -20,6 +25,7 @@ class IssueImport implements ToCollection, WithHeadingRow
20
25
  }
21
26
 
22
27
  Issue::createFromImport($row, true);
28
+ $this->imported++;
23
29
  }
24
30
  }
25
31
  }
@@ -9,6 +9,11 @@ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
9
 
10
10
  class PlaceImport implements ToCollection, WithHeadingRow
11
11
  {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
12
17
  /**
13
18
  * @return Collection
14
19
  */
@@ -20,6 +25,7 @@ class PlaceImport implements ToCollection, WithHeadingRow
20
25
  }
21
26
 
22
27
  Place::createFromImport($row, true);
28
+ $this->imported++;
23
29
  }
24
30
  }
25
31
  }
@@ -9,6 +9,11 @@ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
9
 
10
10
  class VehicleImport implements ToCollection, WithHeadingRow
11
11
  {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
12
17
  /**
13
18
  * @return Collection
14
19
  */
@@ -20,6 +25,7 @@ class VehicleImport implements ToCollection, WithHeadingRow
20
25
  }
21
26
 
22
27
  Vehicle::createFromImport($row, true);
28
+ $this->imported++;
23
29
  }
24
30
  }
25
31
  }