From e2679852cea3a6d21ba6dbe690c5992ca2470273 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 10 Apr 2024 11:31:30 -0700 Subject: [PATCH 1/9] added export button, half the logic for export method --- .../Licenses/LicensesController.php | 98 +++++++++++++++++++ resources/views/licenses/index.blade.php | 3 + routes/web/licenses.php | 7 ++ 3 files changed, 108 insertions(+) diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index c55181c51..0570e0ce7 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -11,6 +11,7 @@ use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; +use Symfony\Component\HttpFoundation\StreamedResponse; /** * This controller handles all actions related to Licenses for @@ -289,4 +290,101 @@ class LicensesController extends Controller ->with('item', $license) ->with('maintained_list', $maintained_list); } + + /** + * Exports users to CSV + * + * @author [A. Gianotto] [] + * @since [v3.5] + * @return StreamedResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function getExportLicensesCsv() + { + $this->authorize('view', License::class); + \Debugbar::disable(); + + $response = new StreamedResponse(function () { + // Open output stream + $handle = fopen('php://output', 'w'); + + License::all() + ->orderBy('created_at', 'DESC')->get() + ->chunk(500, function ($licenses) use ($handle) { + $headers = [ + // strtolower to prevent Excel from trying to open it as a SYLK file + strtolower(trans('general.id')), + trans('admin/companies/table.title'), + trans('admin/users/table.title'), + trans('admin/users/table.name'), + trans('admin/users/table.username'), + trans('admin/users/table.email'), + trans('admin/users/table.manager'), + trans('admin/users/table.location'), + trans('general.department'), + trans('general.assets'), + trans('general.licenses'), + trans('general.accessories'), + trans('general.consumables'), + trans('admin/users/table.groups'), + trans('general.notes'), + trans('admin/users/table.activated'), + trans('general.created_at'), + trans('general.created_at'), + trans('general.created_at'), + trans('general.created_at'), + trans('general.created_at'), + trans('general.created_at'), + trans('general.created_at'), + trans('general.created_at'), + ]; + + fputcsv($handle, $headers); + + foreach ($licenses as $license) { + // Add a new row with data + $values = [ + $license->id, + $license->company->name, + $license->name, + $license->serial, + $license->purchase_date, + $license->purchase_cost, + $license->order_number, + $license->seats, + $license->notes, + $license->user->id, + $license->depreciation->name, + $license->updated_at, + $license->deleted_at, + $license->license_name, + $license->email, + $license->depreciate, + $license->supplier->name, + $license->expiration_date, + $license->purchase_order, + $license->termination_date, + $license->maintained, + $license->reassignable, + $license->manufacturer->name, + $license->category->name, + $license->min_amt, + + ( $license->reassignable == '1') ? trans('general.yes') : trans('general.no'), + $license->created_at, + ]; + + fputcsv($handle, $values); + } + }); + + // Close the output stream + fclose($handle); + }, 200, [ + 'Content-Type' => 'text/csv; charset=UTF-8', + 'Content-Disposition' => 'attachment; filename="users-'.date('Y-m-d-his').'.csv"', + ]); + + return $response; + } } diff --git a/resources/views/licenses/index.blade.php b/resources/views/licenses/index.blade.php index 8fa52fd1f..fe13df3c7 100755 --- a/resources/views/licenses/index.blade.php +++ b/resources/views/licenses/index.blade.php @@ -13,6 +13,9 @@ {{ trans('general.create') }} @endcan +@can('view', \App\Models\User::class) + {{ trans('general.export') }} +@endcan @stop {{-- Page content --}} diff --git a/routes/web/licenses.php b/routes/web/licenses.php index b70347793..7212a4764 100644 --- a/routes/web/licenses.php +++ b/routes/web/licenses.php @@ -48,6 +48,13 @@ Route::group(['prefix' => 'licenses', 'middleware' => ['auth']], function () { '{licenseId}/showfile/{fileId}/{download?}', [Licenses\LicenseFilesController::class, 'show'] )->name('show.licensefile'); + Route::get( + 'export', + [ + Licenses\LicensesController::class, + 'getExportLicensesCsv' + ] + )->name('licenses.export'); }); Route::resource('licenses', Licenses\LicensesController::class, [ From f42ae4633887afc1f2a3a4ee0e0ed6941b25c382 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 10 Apr 2024 12:14:44 -0700 Subject: [PATCH 2/9] exports all licenses --- .../Licenses/LicensesController.php | 72 +++++++++---------- resources/lang/en-US/admin/licenses/table.php | 3 + 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index 0570e0ce7..b06e1c5be 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -308,35 +308,36 @@ class LicensesController extends Controller // Open output stream $handle = fopen('php://output', 'w'); - License::all() - ->orderBy('created_at', 'DESC')->get() + License::with('company','manufacturer','category', 'supplier', 'adminuser') + ->orderBy('created_at', 'DESC') ->chunk(500, function ($licenses) use ($handle) { $headers = [ // strtolower to prevent Excel from trying to open it as a SYLK file strtolower(trans('general.id')), - trans('admin/companies/table.title'), - trans('admin/users/table.title'), - trans('admin/users/table.name'), - trans('admin/users/table.username'), - trans('admin/users/table.email'), - trans('admin/users/table.manager'), - trans('admin/users/table.location'), - trans('general.department'), - trans('general.assets'), - trans('general.licenses'), - trans('general.accessories'), - trans('general.consumables'), - trans('admin/users/table.groups'), + trans('general.company'), + trans('general.name'), + trans('general.serial_number'), + trans('general.purchase_date'), + trans('general.purchase_cost'), + trans('general.order_number'), + trans('admin/licenses/table.seats'), + trans('admin/licenses/table.created_by'), + trans('general.depreciation'), + trans('admin/licenses/table.updated_at'), + trans('admin/licenses/table.deleted_at'), + trans('general.email'), + trans('admin/hardware/form.fully_depreciated'), + trans('general.supplier'), + trans('admin/licenses/form.expiration'), + trans('admin/licenses/form.purchase_order'), + trans('admin/licenses/form.termination_date'), + trans('admin/licenses/form.maintained'), + trans('general.manufacturer'), + trans('general.category'), + trans('general.min_amt'), + trans('admin/licenses/form.reassignable'), trans('general.notes'), - trans('admin/users/table.activated'), - trans('general.created_at'), - trans('general.created_at'), - trans('general.created_at'), - trans('general.created_at'), - trans('general.created_at'), - trans('general.created_at'), - trans('general.created_at'), - trans('general.created_at'), + trans('general_created_at'), ]; fputcsv($handle, $headers); @@ -345,32 +346,29 @@ class LicensesController extends Controller // Add a new row with data $values = [ $license->id, - $license->company->name, + $license->company ? $license->company->name: '', $license->name, $license->serial, $license->purchase_date, $license->purchase_cost, $license->order_number, $license->seats, - $license->notes, - $license->user->id, - $license->depreciation->name, + $license->adminuser->present()->fullName(), + $license->depreciation ? $license->depreciation->name: '', $license->updated_at, $license->deleted_at, - $license->license_name, $license->email, - $license->depreciate, - $license->supplier->name, + ( $license->depreciate == '1') ? trans('general.yes') : trans('general.no'), + ($license->supplier) ? $license->supplier->name: '', $license->expiration_date, $license->purchase_order, $license->termination_date, - $license->maintained, - $license->reassignable, - $license->manufacturer->name, - $license->category->name, + ( $license->maintained == '1') ? trans('general.yes') : trans('general.no'), + $license->manufacturer ? $license->manufacturer->name: '', + $license->category ? $license->category->name: '', $license->min_amt, - ( $license->reassignable == '1') ? trans('general.yes') : trans('general.no'), + $license->notes, $license->created_at, ]; @@ -382,7 +380,7 @@ class LicensesController extends Controller fclose($handle); }, 200, [ 'Content-Type' => 'text/csv; charset=UTF-8', - 'Content-Disposition' => 'attachment; filename="users-'.date('Y-m-d-his').'.csv"', + 'Content-Disposition' => 'attachment; filename="licenses-'.date('Y-m-d-his').'.csv"', ]); return $response; diff --git a/resources/lang/en-US/admin/licenses/table.php b/resources/lang/en-US/admin/licenses/table.php index dfce4136c..b480cbb33 100644 --- a/resources/lang/en-US/admin/licenses/table.php +++ b/resources/lang/en-US/admin/licenses/table.php @@ -4,6 +4,7 @@ return array( 'assigned_to' => 'Assigned To', 'checkout' => 'In/Out', + 'deleted_at' => 'Deleted at', 'id' => 'ID', 'license_email' => 'License Email', 'license_name' => 'Licensed To', @@ -13,5 +14,7 @@ return array( 'hardware' => 'Hardware', 'serial' => 'Serial', 'title' => 'License', + 'updated_at' => 'Updated at', + 'created_by' => 'Created By', ); From 17095feb33af5a264af64cd2abdc23648e432b59 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 10 Apr 2024 12:15:48 -0700 Subject: [PATCH 3/9] fix typo --- app/Http/Controllers/Licenses/LicensesController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index b06e1c5be..5b4a9cf38 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -337,7 +337,7 @@ class LicensesController extends Controller trans('general.min_amt'), trans('admin/licenses/form.reassignable'), trans('general.notes'), - trans('general_created_at'), + trans('general.created_at'), ]; fputcsv($handle, $headers); From 0849262243c720eed8f156b8d96ffe73f7fca136 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 10 Apr 2024 12:19:34 -0700 Subject: [PATCH 4/9] fixed notes --- app/Http/Controllers/Licenses/LicensesController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index 5b4a9cf38..c658c081d 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -294,8 +294,8 @@ class LicensesController extends Controller /** * Exports users to CSV * - * @author [A. Gianotto] [] - * @since [v3.5] + * @author [G. Martinez] + * @since [v6.3] * @return StreamedResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ From 133fdd7a375c218f593a10aa0c243ebdf7749403 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 10 Apr 2024 12:31:04 -0700 Subject: [PATCH 5/9] fix conditional --- resources/views/licenses/index.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/licenses/index.blade.php b/resources/views/licenses/index.blade.php index fe13df3c7..82e34b190 100755 --- a/resources/views/licenses/index.blade.php +++ b/resources/views/licenses/index.blade.php @@ -13,7 +13,7 @@ {{ trans('general.create') }} @endcan -@can('view', \App\Models\User::class) +@can('view', \App\Models\License::class) {{ trans('general.export') }} @endcan @stop From a2bca0e358173750a518d10238f2dafc5c095587 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 10 Apr 2024 15:05:21 -0700 Subject: [PATCH 6/9] fixed comments --- app/Http/Controllers/Licenses/LicensesController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index c658c081d..28680d440 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -292,7 +292,7 @@ class LicensesController extends Controller } /** - * Exports users to CSV + * Exports Licenses to CSV * * @author [G. Martinez] * @since [v6.3] From 25f1167c9d96a525c3637ed84997e2df6a0cbe73 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Mon, 22 Apr 2024 10:38:55 -0700 Subject: [PATCH 7/9] adds company scoping to license export --- app/Http/Controllers/Licenses/LicensesController.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index 28680d440..3f61a1bd3 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -308,8 +308,13 @@ class LicensesController extends Controller // Open output stream $handle = fopen('php://output', 'w'); - License::with('company','manufacturer','category', 'supplier', 'adminuser') - ->orderBy('created_at', 'DESC') + $licenses= License::with('company', + 'manufacturer', + 'category', + 'supplier', + 'adminuser') + ->orderBy('created_at', 'DESC'); + Company::scopeCompanyables($licenses) ->chunk(500, function ($licenses) use ($handle) { $headers = [ // strtolower to prevent Excel from trying to open it as a SYLK file From 14ddf36d46004849b59d7ca9723c1b0234952386 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Mon, 22 Apr 2024 10:43:11 -0700 Subject: [PATCH 8/9] removed two duplicate translations --- app/Http/Controllers/Licenses/LicensesController.php | 4 ++-- resources/lang/en-US/admin/licenses/table.php | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index 3f61a1bd3..53b91e571 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -326,9 +326,9 @@ class LicensesController extends Controller trans('general.purchase_cost'), trans('general.order_number'), trans('admin/licenses/table.seats'), - trans('admin/licenses/table.created_by'), + trans('general.created_by'), trans('general.depreciation'), - trans('admin/licenses/table.updated_at'), + trans('general.updated_at'), trans('admin/licenses/table.deleted_at'), trans('general.email'), trans('admin/hardware/form.fully_depreciated'), diff --git a/resources/lang/en-US/admin/licenses/table.php b/resources/lang/en-US/admin/licenses/table.php index b480cbb33..9cabf9c88 100644 --- a/resources/lang/en-US/admin/licenses/table.php +++ b/resources/lang/en-US/admin/licenses/table.php @@ -14,7 +14,5 @@ return array( 'hardware' => 'Hardware', 'serial' => 'Serial', 'title' => 'License', - 'updated_at' => 'Updated at', - 'created_by' => 'Created By', ); From 5fc677154308eb056cbb642288d13a4005cfe131 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Mon, 22 Apr 2024 17:58:49 -0700 Subject: [PATCH 9/9] adds licenses available, updated teranslations --- .../Licenses/LicensesController.php | 6 +++-- app/Models/License.php | 22 +++++++++++++++++-- resources/lang/en-US/general.php | 2 +- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index 53b91e571..268c3f8b6 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -307,12 +307,12 @@ class LicensesController extends Controller $response = new StreamedResponse(function () { // Open output stream $handle = fopen('php://output', 'w'); - $licenses= License::with('company', 'manufacturer', 'category', 'supplier', - 'adminuser') + 'adminuser', + 'assignedusers') ->orderBy('created_at', 'DESC'); Company::scopeCompanyables($licenses) ->chunk(500, function ($licenses) use ($handle) { @@ -325,6 +325,7 @@ class LicensesController extends Controller trans('general.purchase_date'), trans('general.purchase_cost'), trans('general.order_number'), + trans('general.licenses_available'), trans('admin/licenses/table.seats'), trans('general.created_by'), trans('general.depreciation'), @@ -357,6 +358,7 @@ class LicensesController extends Controller $license->purchase_date, $license->purchase_cost, $license->order_number, + $license->free_seat_count, $license->seats, $license->adminuser->present()->fullName(), $license->depreciation ? $license->depreciation->name: '', diff --git a/app/Models/License.php b/app/Models/License.php index 7fb4f9e4c..deb1221e7 100755 --- a/app/Models/License.php +++ b/app/Models/License.php @@ -81,6 +81,7 @@ class License extends Depreciable 'serial', 'supplier_id', 'termination_date', + 'free_seat_count', 'user_id', 'min_amt', ]; @@ -114,6 +115,7 @@ class License extends Depreciable 'category' => ['name'], 'depreciation' => ['name'], ]; + protected $appends = ['free_seat_count']; /** * Update seat counts when the license is updated @@ -280,6 +282,16 @@ class License extends Depreciable } $this->attributes['termination_date'] = $value; } + /** + * Sets free_seat_count attribute + * + * @author G. Martinez + * @since [v6.3] + * @return mixed + */ + public function getFreeSeatCountAttribute(){ + return $this->attributes['free_seat_count'] = $this->remaincount(); + } /** * Establishes the license -> company relationship @@ -502,7 +514,13 @@ class License extends Depreciable ->whereNull('deleted_at') ->count(); } - + /** + * Returns the available seats remaining + * + * @author A. Gianotto + * @since [v2.0] + * @return int + */ /** * Returns the number of total available seats for this license @@ -579,7 +597,7 @@ class License extends Depreciable $taken = $this->assigned_seats_count; $diff = ($total - $taken); - return $diff; + return (int) $diff; } /** diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index 9f9a0e08c..57cf41e29 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -176,7 +176,7 @@ return [ 'last_name' => 'Last Name', 'license' => 'License', 'license_report' => 'License Report', - 'licenses_available' => 'licenses available', + 'licenses_available' => 'Licenses available', 'licenses' => 'Licenses', 'list_all' => 'List All', 'loading' => 'Loading... please wait....',