From 039c9be1c676c6a77916dd02365e943373ca6dba Mon Sep 17 00:00:00 2001 From: Manus AI Date: Wed, 11 Feb 2026 05:28:25 -0500 Subject: [PATCH] feat: Add resource count tracking to import responses Implements import count tracking across all import operations to enable accurate analytics event tracking in PostHog. Changes: Import Classes (8 files): - Added public $imported counter property to track successfully imported rows - Incremented counter for each processed row in collection() method - Files: ContactImport, DriverImport, FleetImport, FuelReportImport, IssueImport, PlaceImport, VehicleImport, VendorImport Controllers (8 files): - Added $importedCount variable to accumulate counts across multiple files - Instantiate import class to access the counter - Return 'imported' field in JSON response with total count - Files: ContactController, DriverController, FleetController, FuelReportController, IssueController, PlaceController, VehicleController, VendorController Response Format: { "status": "ok", "message": "Import completed", "imported": 47 } Benefits: - Frontend can now track exact import counts in PostHog analytics - Better UX - users see how many records were imported - Consistent with existing patterns (OrderController.importFromFiles) - Enables accurate resource.imported event tracking Related: - Complements ember-core events service implementation - Supports PostHog analytics integration in internals --- .../Http/Controllers/Internal/v1/ContactController.php | 7 +++++-- .../src/Http/Controllers/Internal/v1/DriverController.php | 7 +++++-- .../src/Http/Controllers/Internal/v1/FleetController.php | 7 +++++-- .../Http/Controllers/Internal/v1/FuelReportController.php | 7 +++++-- .../src/Http/Controllers/Internal/v1/IssueController.php | 7 +++++-- .../src/Http/Controllers/Internal/v1/PlaceController.php | 7 +++++-- .../Http/Controllers/Internal/v1/VehicleController.php | 7 +++++-- .../src/Http/Controllers/Internal/v1/VendorController.php | 7 +++++-- server/src/Imports/ContactImport.php | 7 +++++++ server/src/Imports/DriverImport.php | 7 +++++++ server/src/Imports/FleetImport.php | 7 +++++++ server/src/Imports/FuelReportImport.php | 8 ++++++++ server/src/Imports/IssueImport.php | 8 ++++++++ server/src/Imports/PlaceImport.php | 8 ++++++++ server/src/Imports/VehicleImport.php | 8 ++++++++ server/src/Imports/VendorImport.php | 8 ++++++++ 16 files changed, 101 insertions(+), 16 deletions(-) diff --git a/server/src/Http/Controllers/Internal/v1/ContactController.php b/server/src/Http/Controllers/Internal/v1/ContactController.php index ff3b54ea..3b6a1564 100644 --- a/server/src/Http/Controllers/Internal/v1/ContactController.php +++ b/server/src/Http/Controllers/Internal/v1/ContactController.php @@ -91,15 +91,18 @@ public function import(ImportRequest $request) { $disk = $request->input('disk', config('filesystems.default')); $files = $request->resolveFilesFromIds(); + $importedCount = 0; foreach ($files as $file) { try { - Excel::import(new ContactImport(), $file->path, $disk); + $import = new ContactImport(); + Excel::import($import, $file->path, $disk); + $importedCount += $import->imported; } catch (\Throwable $e) { return response()->error('Invalid file, unable to proccess.'); } } - return response()->json(['status' => 'ok', 'message' => 'Import completed']); + return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]); } } diff --git a/server/src/Http/Controllers/Internal/v1/DriverController.php b/server/src/Http/Controllers/Internal/v1/DriverController.php index 6e7968e3..48a9eb93 100644 --- a/server/src/Http/Controllers/Internal/v1/DriverController.php +++ b/server/src/Http/Controllers/Internal/v1/DriverController.php @@ -513,15 +513,18 @@ public function import(ImportRequest $request) { $disk = $request->input('disk', config('filesystems.default')); $files = $request->resolveFilesFromIds(); + $importedCount = 0; foreach ($files as $file) { try { - Excel::import(new DriverImport(), $file->path, $disk); + $import = new DriverImport(); + Excel::import($import, $file->path, $disk); + $importedCount += $import->imported; } catch (\Throwable $e) { return response()->error('Invalid file, unable to proccess.'); } } - return response()->json(['status' => 'ok', 'message' => 'Import completed']); + return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]); } } diff --git a/server/src/Http/Controllers/Internal/v1/FleetController.php b/server/src/Http/Controllers/Internal/v1/FleetController.php index a9c9fbab..b5d3d5bc 100644 --- a/server/src/Http/Controllers/Internal/v1/FleetController.php +++ b/server/src/Http/Controllers/Internal/v1/FleetController.php @@ -221,15 +221,18 @@ public function import(ImportRequest $request) { $disk = $request->input('disk', config('filesystems.default')); $files = $request->resolveFilesFromIds(); + $importedCount = 0; foreach ($files as $file) { try { - Excel::import(new FleetImport(), $file->path, $disk); + $import = new FleetImport(); + Excel::import($import, $file->path, $disk); + $importedCount += $import->imported; } catch (\Throwable $e) { return response()->error('Invalid file, unable to proccess.'); } } - return response()->json(['status' => 'ok', 'message' => 'Import completed']); + return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]); } } diff --git a/server/src/Http/Controllers/Internal/v1/FuelReportController.php b/server/src/Http/Controllers/Internal/v1/FuelReportController.php index 94228df2..57f90265 100644 --- a/server/src/Http/Controllers/Internal/v1/FuelReportController.php +++ b/server/src/Http/Controllers/Internal/v1/FuelReportController.php @@ -50,15 +50,18 @@ public function import(ImportRequest $request) { $disk = $request->input('disk', config('filesystems.default')); $files = $request->resolveFilesFromIds(); + $importedCount = 0; foreach ($files as $file) { try { - Excel::import(new FuelReportImport(), $file->path, $disk); + $import = new FuelReportImport(); + Excel::import($import, $file->path, $disk); + $importedCount += $import->imported; } catch (\Throwable $e) { return response()->error('Invalid file, unable to proccess.'); } } - return response()->json(['status' => 'ok', 'message' => 'Import completed']); + return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]); } } diff --git a/server/src/Http/Controllers/Internal/v1/IssueController.php b/server/src/Http/Controllers/Internal/v1/IssueController.php index 6da6050b..1fa1d723 100644 --- a/server/src/Http/Controllers/Internal/v1/IssueController.php +++ b/server/src/Http/Controllers/Internal/v1/IssueController.php @@ -55,15 +55,18 @@ public function import(ImportRequest $request) { $disk = $request->input('disk', config('filesystems.default')); $files = $request->resolveFilesFromIds(); + $importedCount = 0; foreach ($files as $file) { try { - Excel::import(new IssueImport(), $file->path, $disk); + $import = new IssueImport(); + Excel::import($import, $file->path, $disk); + $importedCount += $import->imported; } catch (\Throwable $e) { return response()->error('Invalid file, unable to proccess.'); } } - return response()->json(['status' => 'ok', 'message' => 'Import completed']); + return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]); } } diff --git a/server/src/Http/Controllers/Internal/v1/PlaceController.php b/server/src/Http/Controllers/Internal/v1/PlaceController.php index 4636eaae..37f6aac8 100644 --- a/server/src/Http/Controllers/Internal/v1/PlaceController.php +++ b/server/src/Http/Controllers/Internal/v1/PlaceController.php @@ -170,15 +170,18 @@ public function import(ImportRequest $request) { $disk = $request->input('disk', config('filesystems.default')); $files = $request->resolveFilesFromIds(); + $importedCount = 0; foreach ($files as $file) { try { - Excel::import(new PlaceImport(), $file->path, $disk); + $import = new PlaceImport(); + Excel::import($import, $file->path, $disk); + $importedCount += $import->imported; } catch (\Throwable $e) { return response()->error('Invalid file, unable to proccess.'); } } - return response()->json(['status' => 'ok', 'message' => 'Import completed']); + return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]); } } diff --git a/server/src/Http/Controllers/Internal/v1/VehicleController.php b/server/src/Http/Controllers/Internal/v1/VehicleController.php index 3ef7a930..1f3c65a9 100644 --- a/server/src/Http/Controllers/Internal/v1/VehicleController.php +++ b/server/src/Http/Controllers/Internal/v1/VehicleController.php @@ -87,15 +87,18 @@ public function import(ImportRequest $request) { $disk = $request->input('disk', config('filesystems.default')); $files = $request->resolveFilesFromIds(); + $importedCount = 0; foreach ($files as $file) { try { - Excel::import(new VehicleImport(), $file->path, $disk); + $import = new VehicleImport(); + Excel::import($import, $file->path, $disk); + $importedCount += $import->imported; } catch (\Throwable $e) { return response()->error('Invalid file, unable to proccess.'); } } - return response()->json(['status' => 'ok', 'message' => 'Import completed']); + return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]); } } diff --git a/server/src/Http/Controllers/Internal/v1/VendorController.php b/server/src/Http/Controllers/Internal/v1/VendorController.php index 57d1e9e1..eba85875 100644 --- a/server/src/Http/Controllers/Internal/v1/VendorController.php +++ b/server/src/Http/Controllers/Internal/v1/VendorController.php @@ -112,16 +112,19 @@ public function import(ImportRequest $request) { $disk = $request->input('disk', config('filesystems.default')); $files = $request->resolveFilesFromIds(); + $importedCount = 0; foreach ($files as $file) { try { - Excel::import(new VendorImport(), $file->path, $disk); + $import = new VendorImport(); + Excel::import($import, $file->path, $disk); + $importedCount += $import->imported; } catch (\Throwable $e) { return response()->error('Invalid file, unable to proccess.'); } } - return response()->json(['status' => 'ok', 'message' => 'Import completed']); + return response()->json(['status' => 'ok', 'message' => 'Import completed', 'imported' => $importedCount]); } /** diff --git a/server/src/Imports/ContactImport.php b/server/src/Imports/ContactImport.php index c921efb6..44e5a88b 100644 --- a/server/src/Imports/ContactImport.php +++ b/server/src/Imports/ContactImport.php @@ -9,6 +9,12 @@ class ContactImport implements ToCollection, WithHeadingRow { + /** + * Counter for successfully imported rows. + * + * @var int + */ + public int $imported = 0; /** * @return Collection */ @@ -20,6 +26,7 @@ public function collection(Collection $rows) } Contact::createFromImport($row, true); + $this->imported++; } } } diff --git a/server/src/Imports/DriverImport.php b/server/src/Imports/DriverImport.php index fa4efc7f..23933ef0 100644 --- a/server/src/Imports/DriverImport.php +++ b/server/src/Imports/DriverImport.php @@ -9,6 +9,12 @@ class DriverImport implements ToCollection, WithHeadingRow { + /** + * Counter for successfully imported rows. + * + * @var int + */ + public int $imported = 0; /** * @return Collection */ @@ -20,6 +26,7 @@ public function collection(Collection $rows) } Driver::createFromImport($row, true); + $this->imported++; } } } diff --git a/server/src/Imports/FleetImport.php b/server/src/Imports/FleetImport.php index da6c8ce5..d89b99ea 100644 --- a/server/src/Imports/FleetImport.php +++ b/server/src/Imports/FleetImport.php @@ -9,6 +9,12 @@ class FleetImport implements ToCollection, WithHeadingRow { + /** + * Counter for successfully imported rows. + * + * @var int + */ + public int $imported = 0; /** * @return Collection */ @@ -20,6 +26,7 @@ public function collection(Collection $rows) } Fleet::createFromImport($row, true); + $this->imported++; } } } diff --git a/server/src/Imports/FuelReportImport.php b/server/src/Imports/FuelReportImport.php index 0bc54bcf..8c28a245 100644 --- a/server/src/Imports/FuelReportImport.php +++ b/server/src/Imports/FuelReportImport.php @@ -9,6 +9,13 @@ class FuelReportImport implements ToCollection, WithHeadingRow { + /** + * Counter for successfully imported rows. + * + * @var int + */ + public int $imported = 0; + /** * @return Collection */ @@ -20,6 +27,7 @@ public function collection(Collection $rows) } FuelReport::createFromImport($row, true); + $this->imported++; } } } diff --git a/server/src/Imports/IssueImport.php b/server/src/Imports/IssueImport.php index b9697de7..5f6d9873 100644 --- a/server/src/Imports/IssueImport.php +++ b/server/src/Imports/IssueImport.php @@ -9,6 +9,13 @@ class IssueImport implements ToCollection, WithHeadingRow { + /** + * Counter for successfully imported rows. + * + * @var int + */ + public int $imported = 0; + /** * @return Collection */ @@ -20,6 +27,7 @@ public function collection(Collection $rows) } Issue::createFromImport($row, true); + $this->imported++; } } } diff --git a/server/src/Imports/PlaceImport.php b/server/src/Imports/PlaceImport.php index 31bec267..138e3b5e 100644 --- a/server/src/Imports/PlaceImport.php +++ b/server/src/Imports/PlaceImport.php @@ -9,6 +9,13 @@ class PlaceImport implements ToCollection, WithHeadingRow { + /** + * Counter for successfully imported rows. + * + * @var int + */ + public int $imported = 0; + /** * @return Collection */ @@ -20,6 +27,7 @@ public function collection(Collection $rows) } Place::createFromImport($row, true); + $this->imported++; } } } diff --git a/server/src/Imports/VehicleImport.php b/server/src/Imports/VehicleImport.php index 9e6f7f32..91bc11e0 100644 --- a/server/src/Imports/VehicleImport.php +++ b/server/src/Imports/VehicleImport.php @@ -9,6 +9,13 @@ class VehicleImport implements ToCollection, WithHeadingRow { + /** + * Counter for successfully imported rows. + * + * @var int + */ + public int $imported = 0; + /** * @return Collection */ @@ -20,6 +27,7 @@ public function collection(Collection $rows) } Vehicle::createFromImport($row, true); + $this->imported++; } } } diff --git a/server/src/Imports/VendorImport.php b/server/src/Imports/VendorImport.php index 3f05ec09..d25d95b1 100644 --- a/server/src/Imports/VendorImport.php +++ b/server/src/Imports/VendorImport.php @@ -9,6 +9,13 @@ class VendorImport implements ToCollection, WithHeadingRow { + /** + * Counter for successfully imported rows. + * + * @var int + */ + public int $imported = 0; + /** * @return Collection */ @@ -20,6 +27,7 @@ public function collection(Collection $rows) } Vendor::createFromImport($row, true); + $this->imported++; } } }