From 91fc13b0a34d67308a071de3df25bddeb604f55a Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Thu, 5 Mar 2026 11:01:09 -0800 Subject: [PATCH 01/14] add getExpiringAssetsReport method --- app/Http/Controllers/ReportsController.php | 16 ++++++++++++++++ resources/views/reports/expiring_items.blade.php | 1 + 2 files changed, 17 insertions(+) create mode 100644 resources/views/reports/expiring_items.blade.php diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index fb0fc3c2254e..9226dc36e7be 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -127,6 +127,22 @@ public function getDeprecationReport() : View return view('reports/depreciation')->with('depreciations',$depreciations); } + public function getExpiringAssetsReport() : View + { + $this->authorize('reports.view'); + $settings = Setting::getSettings(); + $alert_interval = $settings->alert_interval; + $assets = Asset::getExpiringWarrantyOrEol($alert_interval); + $assets->load(['assignedTo', 'supplier']); + + $licenses = License::query()->ExpiringLicenses($alert_interval, $this->option('expired-licenses')) + ->with('manufacturer','category') + ->orderBy('expiration_date', 'ASC') + ->orderBy('termination_date', 'ASC') + ->get(); + + return view('reports.expiring_items', compact('assets', 'licenses')); + } /** * Exports the depreciations to CSV * diff --git a/resources/views/reports/expiring_items.blade.php b/resources/views/reports/expiring_items.blade.php new file mode 100644 index 000000000000..b3d9bbc7f371 --- /dev/null +++ b/resources/views/reports/expiring_items.blade.php @@ -0,0 +1 @@ + Date: Thu, 5 Mar 2026 11:08:12 -0800 Subject: [PATCH 02/14] add route and blade for expiring items --- app/Http/Controllers/ReportsController.php | 4 +- .../views/reports/expiring_items.blade.php | 67 ++++++++++++++++++- routes/web.php | 7 +- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 9226dc36e7be..0279c40479dd 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -127,7 +127,7 @@ public function getDeprecationReport() : View return view('reports/depreciation')->with('depreciations',$depreciations); } - public function getExpiringAssetsReport() : View + public function getExpiringItemsReport() : View { $this->authorize('reports.view'); $settings = Setting::getSettings(); @@ -135,7 +135,7 @@ public function getExpiringAssetsReport() : View $assets = Asset::getExpiringWarrantyOrEol($alert_interval); $assets->load(['assignedTo', 'supplier']); - $licenses = License::query()->ExpiringLicenses($alert_interval, $this->option('expired-licenses')) + $licenses = License::query()->ExpiringLicenses($alert_interval) ->with('manufacturer','category') ->orderBy('expiration_date', 'ASC') ->orderBy('termination_date', 'ASC') diff --git a/resources/views/reports/expiring_items.blade.php b/resources/views/reports/expiring_items.blade.php index b3d9bbc7f371..7fae5ae71418 100644 --- a/resources/views/reports/expiring_items.blade.php +++ b/resources/views/reports/expiring_items.blade.php @@ -1 +1,66 @@ - +

{{ trans('admin/hardware/general.expiring_assets') }}

+ + + + + + + + + + + + + + + + + + + + @foreach($assets as $asset) + + + + + + + + + + + + + + + + + + + + + @endforeach + + +
{{ trans('general.id') }}{{ trans('admin/hardware/form.tag') }}{{ trans('admin/hardware/form.model') }}{{ trans('general.model_no') }}{{ trans('general.purchase_date') }}{{ trans('admin/hardware/form.eol_rate') }}{{ trans('admin/hardware/form.eol_date') }}{{ trans('admin/hardware/form.warranty_expires') }}
{{ $asset->id }}{{ $asset->asset_tag }}{{ $asset->model->name ?? '' }}{{ $asset->model->model_number ?? '' }}{{ $asset->purchase_date_formatted }}{{ $asset->model->eol ?? '' }} + @if($asset->eol_date) + {{ $asset->eol_formatted_date }} ({{ $asset->eol_diff_for_humans }}) + @endif + + @if($asset->warranty_expires) + {{ $asset->warranty_expires_formatted_date }} ({{ $asset->warranty_expires_diff_for_humans }}) + @endif +
diff --git a/routes/web.php b/routes/web.php index 1aadba06bb54..3322c4f98782 100644 --- a/routes/web.php +++ b/routes/web.php @@ -493,7 +493,12 @@ $trail->parent('home') ->push(trans('general.depreciation_report'), route('reports/depreciation'))); - + Route::get( + 'expiring-items', [ReportsController::class, 'getExpiringItemsReport']) + ->name('reports/expiring-items') + ->breadcrumbs(fn (Trail $trail) => + $trail->parent('home') + ->push(trans('mail.Expiring_Assets_Report'), route('reports/expiring-items'))); // Is this still used?? Route::get( 'export/depreciation', [ReportsController::class, 'exportDeprecationReport']) From 33392237c6f85d346843ae0a94d198e1fd3bc2a9 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Thu, 5 Mar 2026 11:52:19 -0800 Subject: [PATCH 03/14] add report to sidebar menu --- app/Http/Controllers/ReportsController.php | 5 +- resources/views/layouts/default.blade.php | 5 + .../views/reports/expiring_items.blade.php | 180 ++++++++++++++---- 3 files changed, 150 insertions(+), 40 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 0279c40479dd..bbd1ed83788b 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -135,8 +135,9 @@ public function getExpiringItemsReport() : View $assets = Asset::getExpiringWarrantyOrEol($alert_interval); $assets->load(['assignedTo', 'supplier']); - $licenses = License::query()->ExpiringLicenses($alert_interval) - ->with('manufacturer','category') + $licenses = License::query() + ->expiringLicenses($alert_interval) // <-- this is the right call + ->with(['manufacturer', 'category']) ->orderBy('expiration_date', 'ASC') ->orderBy('termination_date', 'ASC') ->get(); diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 1974986e8412..a8f25c0b5898 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -1644,6 +1644,11 @@ {{ trans('general.depreciation_report') }} +
  • is('reports/expiring-items') ? ' class="active"' : '') !!}}> + + {{ trans('general.expiriing_items_report') }} + +
  • is('reports/licenses') ? ' class="active"' : '') !!}}> {{ trans('general.license_report') }} diff --git a/resources/views/reports/expiring_items.blade.php b/resources/views/reports/expiring_items.blade.php index 7fae5ae71418..5fa7606cf22a 100644 --- a/resources/views/reports/expiring_items.blade.php +++ b/resources/views/reports/expiring_items.blade.php @@ -1,62 +1,165 @@ -
    -

    {{ trans('admin/hardware/general.expiring_assets') }}

    + +@extends('layouts/default') + +@section('title') + {{ trans('mail.') }} + @parent +@stop + +@section('header_right') +
    +@stop +@section('content') +
    +

    {{ trans('mail.Expiring_Assets_Report') }}

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + @foreach($assets as $asset) + + + + + + + + + + + @endforeach + +
    {{ trans('general.id') }}{{ trans('admin/hardware/form.tag') }}{{ trans('admin/hardware/form.model') }}{{ trans('general.model_no') }}{{ trans('general.purchase_date') }}{{ trans('admin/hardware/form.eol_rate') }}{{ trans('admin/hardware/form.eol_date') }}{{ trans('admin/hardware/form.warranty_expires') }}
    {{ $asset->id }}{{ $asset->asset_tag }}{{ $asset->model->name ?? '' }}{{ $asset->model->model_number ?? '' }}{{ $asset->purchase_date_formatted }}{{ $asset->model->eol ?? '' }} + @if($asset->eol_date) + {{ $asset->eol_formatted_date }} ({{ $asset->eol_diff_for_humans }}) + @endif + + @if($asset->warranty_expires) + {{ $asset->warranty_expires_formatted_date }} ({{ $asset->warranty_expires_diff_for_humans }}) + @endif +
    +
    +
    +
    +
    +
    +

    {{ trans('mail.Expiring_Licenses_Report') }}

    - +
    - - - - - - - + + + + + + + + + + + + - @foreach($assets as $asset) + @foreach($licenses as $license) - - - + - + - + - - - + - + + + @@ -64,3 +167,4 @@ class="snipe-table table table-striped inventory"
    {{ trans('general.id') }}{{ trans('admin/hardware/form.tag') }}{{ trans('admin/hardware/form.model') }}{{ trans('general.model_no') }}{{ trans('general.purchase_date') }}{{ trans('admin/hardware/form.eol_rate') }}{{ trans('admin/hardware/form.eol_date') }}{{ trans('admin/hardware/form.warranty_expires') }}{{ trans('general.name') }} + {{ trans('general.purchase_date') }} + + {{ trans('admin/licenses/form.expiration') }} + + {{ trans('mail.expires') }} + + {{ trans('admin/licenses/form.termination_date') }} + + {{ trans('mail.terminates') }} +
    {{ $asset->id }}{{ $asset->asset_tag }}{{ $license->id }}{{ $asset->model->name ?? '' }}{{ $license->name }}{{ $asset->model->model_number ?? '' }}{{ $license->purchase_date_formatted }}{{ $asset->purchase_date_formatted }}{{ $asset->model->eol ?? '' }}{{ $license->expires_formatted_date }} - @if($asset->eol_date) - {{ $asset->eol_formatted_date }} ({{ $asset->eol_diff_for_humans }}) + @if($license->expires_formatted_date) + {{ $license->expires_diff_for_humans }} @endif - @if($asset->warranty_expires) - {{ $asset->warranty_expires_formatted_date }} ({{ $asset->warranty_expires_diff_for_humans }}) - @endif - {{ $license->terminates_formatted_date }}{{ $license->terminates_diff_for_humans }}
    + @stop From c04e89b686b68303beb4b7412edeae216656f8b3 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 11 Mar 2026 12:09:50 -0700 Subject: [PATCH 04/14] add translations, fix breadcrumbs, add expiring asset and licenses tabs --- app/Providers/BreadcrumbsServiceProvider.php | 3 - resources/lang/en-US/general.php | 1 + resources/views/layouts/default.blade.php | 2 +- .../views/reports/expiring_items.blade.php | 290 +++++++++--------- routes/web.php | 2 +- 5 files changed, 145 insertions(+), 153 deletions(-) diff --git a/app/Providers/BreadcrumbsServiceProvider.php b/app/Providers/BreadcrumbsServiceProvider.php index d8a1af677110..d270830a14b5 100644 --- a/app/Providers/BreadcrumbsServiceProvider.php +++ b/app/Providers/BreadcrumbsServiceProvider.php @@ -608,9 +608,6 @@ public function boot() $trail->parent('users.index', route('users.index')) ->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $user->name]), route('users.edit', $user)) ); - - - } diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index 7f2348876c59..1bc5d9d0d21b 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -142,6 +142,7 @@ 'exclude_archived' => 'Exclude Archived Assets', 'exclude_deleted' => 'Exclude Deleted Assets', 'example' => 'Example: ', + 'Expiring_Items_Report' => "Expiring Items Report", 'files' => 'Files', 'file_name' => 'File Name', 'file_type' => 'File Type', diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index a8f25c0b5898..15eb8812a12a 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -1646,7 +1646,7 @@
  • is('reports/expiring-items') ? ' class="active"' : '') !!}}> - {{ trans('general.expiriing_items_report') }} + {{ trans('general.Expiring_Items_Report') }}
  • is('reports/licenses') ? ' class="active"' : '') !!}}> diff --git a/resources/views/reports/expiring_items.blade.php b/resources/views/reports/expiring_items.blade.php index 5fa7606cf22a..24e45952a393 100644 --- a/resources/views/reports/expiring_items.blade.php +++ b/resources/views/reports/expiring_items.blade.php @@ -3,19 +3,13 @@ @extends('layouts/default') @section('title') - {{ trans('mail.') }} + {{ trans('general.Expiring_Items_Report') }} @parent @stop @section('header_right') @stop + @section('content') -
    -

    {{ trans('mail.Expiring_Assets_Report') }}

    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - @foreach($assets as $asset) - - - - - - - - - - - @endforeach - -
    {{ trans('general.id') }}{{ trans('admin/hardware/form.tag') }}{{ trans('admin/hardware/form.model') }}{{ trans('general.model_no') }}{{ trans('general.purchase_date') }}{{ trans('admin/hardware/form.eol_rate') }}{{ trans('admin/hardware/form.eol_date') }}{{ trans('admin/hardware/form.warranty_expires') }}
    {{ $asset->id }}{{ $asset->asset_tag }}{{ $asset->model->name ?? '' }}{{ $asset->model->model_number ?? '' }}{{ $asset->purchase_date_formatted }}{{ $asset->model->eol ?? '' }} - @if($asset->eol_date) - {{ $asset->eol_formatted_date }} ({{ $asset->eol_diff_for_humans }}) - @endif - - @if($asset->warranty_expires) - {{ $asset->warranty_expires_formatted_date }} ({{ $asset->warranty_expires_diff_for_humans }}) - @endif -
    +
    +
    +
    -
    -
    -

    {{ trans('mail.Expiring_Licenses_Report') }}

    -
    - - - - - - - - - - - - - - - - - - - - - - - - @foreach($licenses as $license) - - - - - - - - - - - - - - - - - - - @endforeach - - -
    {{ trans('general.id') }}{{ trans('general.name') }} - {{ trans('general.purchase_date') }} - - {{ trans('admin/licenses/form.expiration') }} - - {{ trans('mail.expires') }} - - {{ trans('admin/licenses/form.termination_date') }} - - {{ trans('mail.terminates') }} -
    {{ $license->id }}{{ $license->name }}{{ $license->purchase_date_formatted }}{{ $license->expires_formatted_date }} - @if($license->expires_formatted_date) - {{ $license->expires_diff_for_humans }} - @endif - {{ $license->terminates_formatted_date }}{{ $license->terminates_diff_for_humans }}
    - @stop +@stop \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 3322c4f98782..ed5ec759cd2b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -498,7 +498,7 @@ ->name('reports/expiring-items') ->breadcrumbs(fn (Trail $trail) => $trail->parent('home') - ->push(trans('mail.Expiring_Assets_Report'), route('reports/expiring-items'))); + ->push(trans('general.Expiring_Items_Report'), route('reports/expiring-items'))); // Is this still used?? Route::get( 'export/depreciation', [ReportsController::class, 'exportDeprecationReport']) From 7b37a73a99511b789ec3a212ca33eb625897555e Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 11 Mar 2026 12:50:09 -0700 Subject: [PATCH 05/14] able to export assets --- app/Http/Controllers/ReportsController.php | 79 +++++++++++++++++++ .../views/reports/expiring_items.blade.php | 2 +- routes/web.php | 4 + 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index bbd1ed83788b..90653763e47a 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -144,6 +144,85 @@ public function getExpiringItemsReport() : View return view('reports.expiring_items', compact('assets', 'licenses')); } + public function postExpiringItemsReport() : Response + { + $this->authorize('reports.view'); + + $settings = Setting::getSettings(); + $alert_interval = $settings->alert_interval; + + $assets = Asset::getExpiringWarrantyOrEol($alert_interval); + $assets->load(['assignedTo', 'supplier']); + + $licenses = License::query() + ->expiringLicenses($alert_interval) // <-- this is the right call + ->with(['manufacturer', 'category']) + ->orderBy('expiration_date', 'ASC') + ->orderBy('termination_date', 'ASC') + ->get(); + + $header = [ + trans('general.id'), + trans('admin/hardware/form.tag'), + trans('admin/hardware/form.model'), + trans('general.model_no'), + trans('general.purchase_date'), + trans('admin/hardware/form.eol_rate'), + trans('admin/hardware/form.eol_date'), + trans('admin/hardware/form.warranty_expires'), + ]; + + $header = array_map('trim', $header); + $rows[] = implode(',', $header); + + foreach ($assets as $asset) { + $eol_date = e($asset->eol_date ? $asset->eol_formatted_date : ''); + $warranty_date = e($asset->warranty_expires ? $asset->warranty_expires_formatted_date : ''); + $purchase_date = e(Helper::getFormattedDateObject($asset->purchase_date, 'date', false)); + $row = []; + + $row[] = e($asset->id); + $row[] = e($asset->asset_tag); + $row[] = e($asset->model->name ?? ''); + $row[] = e($asset->model->model_number ?? ''); + $row[] = '"'.str_replace('"', '""', $purchase_date).'"'; + $row[] = e($asset->model->eol ?? ''); + $row[] = '"'.str_replace('"', '""', $eol_date).'"';; + $row[] = '"'.str_replace('"', '""', $warranty_date).'"'; + $rows[] = implode(',', $row); + } + + $csv = implode("\n", $rows); + + $response = response()->make($csv, 200); + $response->header('Content-Type', 'text/csv; charset=UTF-8'); + $response->header('Content-Disposition', 'attachment; filename=expiring-items-report.csv'); + + return $response; + + + /* + |--------------------------------------- + | Licenses + |--------------------------------------- + */ + +// foreach ($licenses as $license) { +// +// $row = []; +// +// $row[] = e($license->id); +// $row[] = e($license->name); +// $row[] = Helper::getFormattedDateObject($license->purchase_date, 'date', false); +// $row[] = Helper::getFormattedDateObject($license->expiration_date, 'date', false); +// $row[] = $license->expires_formatted_date ? e($license->expires_diff_for_humans) : ''; +// $row[] = Helper::getFormattedDateObject($license->termination_date, 'date', false); +// $row[] = e($license->terminates_diff_for_humans); +// +// $csv->insertOne($row); +// } + } + /** * Exports the depreciations to CSV * diff --git a/resources/views/reports/expiring_items.blade.php b/resources/views/reports/expiring_items.blade.php index 24e45952a393..6f48890fff14 100644 --- a/resources/views/reports/expiring_items.blade.php +++ b/resources/views/reports/expiring_items.blade.php @@ -11,7 +11,7 @@
    -@stop \ No newline at end of file +@stop + +@section('moar_scripts') + @include ('partials.bootstrap-table', ['search' => true, 'show-export' => false,]) +@endsection \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index dbb9348f7e4a..cd548eacf061 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1299,7 +1299,19 @@ 'index' ] )->name('api.activity.index'); - }); // end reports api routes + }); + + Route::group(['prefix' => 'reports'], function () { + Route::get('expiring-assets', [ + Api\ReportsController::class, + 'expiringAssetsReport', + ])->name('api.expiring-assets'); + + Route::get('expiring-licenses', [ + Api\ReportsController::class, + 'expiringLicensesReport', + ])->name('api.expiring-licenses'); + });// end reports api routes From fea92bd185c07fc0283ad7cfef4fa3b8ccc7a23e Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 17 Mar 2026 12:05:32 -0700 Subject: [PATCH 08/14] clean up unused and commented out code --- app/Http/Controllers/ReportsController.php | 2 +- app/Presenters/ExpiringItemsPresenter.php | 1 - .../lang/en-US/admin/reports/general.php | 1 - resources/lang/en-US/general.php | 1 - .../views/reports/expiring_items.blade.php | 3 --- routes/api.php | 26 ++++++++++--------- 6 files changed, 15 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 1c57be42bf6a..abbb7a0e3c56 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -136,7 +136,7 @@ public function getExpiringItemsReport() : View $assets->load(['assignedTo', 'supplier']); $licenses = License::query() - ->expiringLicenses($alert_interval) // <-- this is the right call + ->expiringLicenses($alert_interval) ->with(['manufacturer', 'category']) ->orderBy('expiration_date', 'ASC') ->orderBy('termination_date', 'ASC') diff --git a/app/Presenters/ExpiringItemsPresenter.php b/app/Presenters/ExpiringItemsPresenter.php index 19705d42d445..8659255377e1 100644 --- a/app/Presenters/ExpiringItemsPresenter.php +++ b/app/Presenters/ExpiringItemsPresenter.php @@ -74,7 +74,6 @@ public static function assetsDataTableLayout() 'sortable' => true, 'title' => trans('admin/hardware/form.warranty_expires'), 'visible' => true, -// 'formatter' => 'dateDisplayFormatter', ], ]; diff --git a/resources/lang/en-US/admin/reports/general.php b/resources/lang/en-US/admin/reports/general.php index 2a9544aadbf0..ed8bf1a15685 100644 --- a/resources/lang/en-US/admin/reports/general.php +++ b/resources/lang/en-US/admin/reports/general.php @@ -20,5 +20,4 @@ 'select_a_template' => 'Select a Template', 'template_name' => 'Template Name', 'update_template' => 'Update Template', - 'no_expiring_items' => 'No expiring :items found.', ]; diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index 7e37556287ae..1bc5d9d0d21b 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -133,7 +133,6 @@ 'details' => 'Details', 'download' => 'Download', 'download_all' => 'Download All', - 'download_selected' => 'Download :selected', 'editprofile' => 'Edit Profile', 'eol' => 'EOL', 'email_domain' => 'Email Domain', diff --git a/resources/views/reports/expiring_items.blade.php b/resources/views/reports/expiring_items.blade.php index 3a1be0a7d3c8..68edfb1a8e42 100644 --- a/resources/views/reports/expiring_items.blade.php +++ b/resources/views/reports/expiring_items.blade.php @@ -7,9 +7,6 @@ @parent @stop -@section('header_right') -@stop - @section('content')
    diff --git a/routes/api.php b/routes/api.php index cd548eacf061..b7b28844566f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1299,19 +1299,21 @@ 'index' ] )->name('api.activity.index'); - }); - Route::group(['prefix' => 'reports'], function () { - Route::get('expiring-assets', [ - Api\ReportsController::class, - 'expiringAssetsReport', - ])->name('api.expiring-assets'); - - Route::get('expiring-licenses', [ - Api\ReportsController::class, - 'expiringLicensesReport', - ])->name('api.expiring-licenses'); - });// end reports api routes + Route::get('expiring-assets', + [ + Api\ReportsController::class, + 'expiringAssetsReport', + ])->name('api.expiring-assets'); + + Route::get('expiring-licenses', + [ + Api\ReportsController::class, + 'expiringLicensesReport', + ])->name('api.expiring-licenses'); + });// end reports api routes + + From ba58abd4d30c1c4c1dc5f3f37c1b5a298ca4d705 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 17 Mar 2026 12:08:13 -0700 Subject: [PATCH 09/14] remove unnecessary csv export method --- app/Http/Controllers/ReportsController.php | 86 ---------------------- 1 file changed, 86 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index abbb7a0e3c56..e4329cf2dea9 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -144,92 +144,6 @@ public function getExpiringItemsReport() : View return view('reports.expiring_items', compact('assets', 'licenses')); } - public function postExpiringItemsReport() : Response - { - $this->authorize('reports.view'); - - $settings = Setting::getSettings(); - $alert_interval = $settings->alert_interval; - $activeTab = request('active_tab'); - $rows = []; - - if($activeTab == 'assets') { - $assets = Asset::getExpiringWarrantyOrEol($alert_interval); - $assets->load(['assignedTo', 'supplier']); - - $header = [ - trans('general.id'), - trans('admin/hardware/form.tag'), - trans('admin/hardware/form.model'), - trans('general.model_no'), - trans('general.purchase_date'), - trans('admin/hardware/form.eol_rate'), - trans('admin/hardware/form.eol_date'), - trans('admin/hardware/form.warranty_expires'), - ]; - - $header = array_map('trim', $header); - $rows[] = implode(',', $header); - - foreach ($assets as $asset) { - $purchase_date = e(Helper::getFormattedDateObject($asset->purchase_date, 'date', false)); - $expiration_date = e($asset->eol_date ? $asset->eol_formatted_date : ''); - $warranty_date = e($asset->warranty_expires ? $asset->warranty_expires_formatted_date : ''); - - $row = []; - $row[] = e($asset->id); - $row[] = e($asset->asset_tag); - $row[] = e($asset->model->name ?? ''); - $row[] = e($asset->model->model_number ?? ''); - $row[] = '"' . str_replace('"', '""', $purchase_date) . '"'; - $row[] = e($asset->model->eol ?? ''); - $row[] = '"' . str_replace('"', '""', $expiration_date) . '"'; - $row[] = '"' . str_replace('"', '""', $warranty_date) . '"'; - $rows[] = implode(',', $row); - } - } - - if($activeTab == 'licenses') { - $licenses = License::query() - ->expiringLicenses($alert_interval) - ->with(['manufacturer', 'category']) - ->orderBy('expiration_date', 'ASC') - ->orderBy('termination_date', 'ASC') - ->get(); - $header = [ - trans('general.id'), - trans('general.name'), - trans('general.purchase_date'), - trans('admin/licenses/form.expiration'), - trans('admin/licenses/form.termination_date'), - ]; - $header = array_map('trim', $header); - $rows[] = implode(',', $header); - - foreach ($licenses as $license) { - $purchase_date = e($license->purchase_date ? $license->purchase_date_formatted : ''); - $expiration_date = e($license->expires_formatted_date ?? ''); - $termination_date = e($license->termination_date ? $license->terminates_formatted_date : ''); - - $row = []; - $row[] = e($license->id); - $row[] = e($license->name); - $row[] = '"' . str_replace('"', '""', $purchase_date) . '"'; - $row[] = '"' . str_replace('"', '""', $expiration_date) . '"'; - $row[] = '"' . str_replace('"', '""', $termination_date) . '"'; - $rows[] = implode(',', $row); - } - } - - $csv = implode("\n", $rows); - - $response = response()->make($csv, 200); - $response->header('Content-Type', 'text/csv; charset=UTF-8'); - $response->header('Content-Disposition', 'attachment; filename=expiring-'.$activeTab.'-report.csv'); - - return $response; - - } /** * Exports the depreciations to CSV From 6c7e7b658d680a63feb3b532e7be48d135ceb41b Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 17 Mar 2026 12:09:58 -0700 Subject: [PATCH 10/14] remove unnecessary route --- routes/web.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/routes/web.php b/routes/web.php index 71ac9c877a23..ed5ec759cd2b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -545,10 +545,6 @@ Route::post('custom', [ReportsController::class, 'postCustom']) ->name('reports.post-custom'); - Route::post( - 'export/expiring-items', [ReportsController::class, 'postExpiringItemsReport']) - ->name('reports.export.expiring_items'); - Route::prefix('templates') ->group(function () { From 2896b746922a44a6312dcae18e536f406b372148 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 17 Mar 2026 15:38:39 -0700 Subject: [PATCH 11/14] adds tests, repurpose queries to count --- .../Controllers/Api/ReportsController.php | 8 ++-- app/Http/Controllers/ReportsController.php | 11 +++-- .../views/reports/expiring_items.blade.php | 4 +- tests/Feature/Reporting/ExpiringItemsTest.php | 45 +++++++++++++++++++ 4 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 tests/Feature/Reporting/ExpiringItemsTest.php diff --git a/app/Http/Controllers/Api/ReportsController.php b/app/Http/Controllers/Api/ReportsController.php index 94b202ecccf3..3089e3f4e796 100644 --- a/app/Http/Controllers/Api/ReportsController.php +++ b/app/Http/Controllers/Api/ReportsController.php @@ -2,11 +2,12 @@ namespace App\Http\Controllers\Api; -use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Http\Transformers\ActionlogsTransformer; use App\Http\Transformers\ExpiringItemsTransformer; use App\Models\Actionlog; +use App\Models\Asset; +use App\Models\License; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -102,6 +103,7 @@ public function index(Request $request): JsonResponse|array return response()->json((new ActionlogsTransformer)->transformActionlogs($actionlogs, $total), 200, ['Content-Type' => 'application/json;charset=utf8'], JSON_UNESCAPED_UNICODE); } + public function expiringAssetsReport(Request $request) { $this->authorize('reports.view'); @@ -109,7 +111,7 @@ public function expiringAssetsReport(Request $request) $assets = Asset::getExpiringWarrantyOrEol($days); return response()->json( - (new ExpiringItemsTransformer())->transformAssets($assets, $assets->count()) + (new ExpiringItemsTransformer)->transformAssets($assets, $assets->count()) ); } @@ -125,7 +127,7 @@ public function expiringLicensesReport(Request $request) ->get(); return response()->json( - (new ExpiringItemsTransformer())->transformLicenses($licenses, $licenses->count()) + (new ExpiringItemsTransformer)->transformLicenses($licenses, $licenses->count()) ); } } diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index ec30b5be2623..86b13aeeaad8 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -128,22 +128,21 @@ public function getDeprecationReport(): View return view('reports/depreciation')->with('depreciations', $depreciations); } - public function getExpiringItemsReport() : View + public function getExpiringItemsReport(): View { $this->authorize('reports.view'); $settings = Setting::getSettings(); $alert_interval = $settings->alert_interval; - $assets = Asset::getExpiringWarrantyOrEol($alert_interval); - $assets->load(['assignedTo', 'supplier']); + $assets_count = Asset::getExpiringWarrantyOrEol($alert_interval)->count(); - $licenses = License::query() + $licenses_count = License::query() ->expiringLicenses($alert_interval) ->with(['manufacturer', 'category']) ->orderBy('expiration_date', 'ASC') ->orderBy('termination_date', 'ASC') - ->get(); + ->count(); - return view('reports.expiring_items', compact('assets', 'licenses')); + return view('reports.expiring_items', compact('assets_count', 'licenses_count')); } /** diff --git a/resources/views/reports/expiring_items.blade.php b/resources/views/reports/expiring_items.blade.php index 68edfb1a8e42..9c718de518b2 100644 --- a/resources/views/reports/expiring_items.blade.php +++ b/resources/views/reports/expiring_items.blade.php @@ -19,7 +19,7 @@
  • @@ -31,7 +31,7 @@ diff --git a/tests/Feature/Reporting/ExpiringItemsTest.php b/tests/Feature/Reporting/ExpiringItemsTest.php new file mode 100644 index 000000000000..32c0ab5e9b31 --- /dev/null +++ b/tests/Feature/Reporting/ExpiringItemsTest.php @@ -0,0 +1,45 @@ +create(); + + $this->actingAsForApi($user) + ->getJson(route('api.expiring-assets')) + ->assertForbidden(); + } + + public function test_user_with_reports_view_can_access_expiring_assets_api() + { + $user = User::factory()->canViewReports()->create(); + + $this->actingAsForApi($user) + ->getJson(route('api.expiring-assets')) + ->assertOk(); + } + + public function test_user_without_reports_view_cannot_access_expiring_licenses_api() + { + $user = User::factory()->create(); + + $this->actingAsForApi($user) + ->getJson(route('api.expiring-licenses')) + ->assertForbidden(); + } + + public function test_user_with_reports_view_can_access_expiring_licenses_api() + { + $user = User::factory()->canViewReports()->create(); + + $this->actingAsForApi($user) + ->getJson(route('api.expiring-licenses')) + ->assertOk(); + } +} \ No newline at end of file From e7bf398507d05ac2617f4e35fb3850344a8527d7 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 17 Mar 2026 22:20:59 -0700 Subject: [PATCH 12/14] change get to input change eol_rate in transformer --- app/Http/Controllers/Api/ReportsController.php | 4 ++-- app/Http/Transformers/ExpiringItemsTransformer.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Api/ReportsController.php b/app/Http/Controllers/Api/ReportsController.php index 3089e3f4e796..59ad1dc0024d 100644 --- a/app/Http/Controllers/Api/ReportsController.php +++ b/app/Http/Controllers/Api/ReportsController.php @@ -107,7 +107,7 @@ public function index(Request $request): JsonResponse|array public function expiringAssetsReport(Request $request) { $this->authorize('reports.view'); - $days = $request->get('days', 30); + $days = $request->input('days', 30); $assets = Asset::getExpiringWarrantyOrEol($days); return response()->json( @@ -119,7 +119,7 @@ public function expiringLicensesReport(Request $request) { $this->authorize('reports.view'); - $days = (int) $request->get('days', 30); + $days = (int)$request->input('days', 30); $includeExpired = $request->boolean('include_expired', false); $licenses = License::query() diff --git a/app/Http/Transformers/ExpiringItemsTransformer.php b/app/Http/Transformers/ExpiringItemsTransformer.php index 4fdac140bf1b..6e19bf05dff5 100644 --- a/app/Http/Transformers/ExpiringItemsTransformer.php +++ b/app/Http/Transformers/ExpiringItemsTransformer.php @@ -18,7 +18,7 @@ public function transformAssets($assets, $total) 'model' => $asset->model->name ?? '', 'model_number' => $asset->model->model_number ?? '', 'purchase_date' => Helper::getFormattedDateObject($asset->purchase_date, 'date'), - 'eol_rate' => $asset->model->eol ?? '', + 'eol_rate' => (($asset->asset_eol_date != '') && ($asset->purchase_date != '')) ? (int)Carbon::parse($asset->asset_eol_date)->diffInMonths($asset->purchase_date, true) . ' months' : null, 'eol_date' => Helper::getFormattedDateObject($asset->eol_date, 'date'), 'warranty_expires' => $asset->warranty_expires ? $asset->warranty_expires_formatted_date .' ('.$asset->warranty_expires_diff_for_humans.')' : '', ]; From c479b8d177d9446e995242a3cfb74506abf86835 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 7 Apr 2026 11:16:59 -0700 Subject: [PATCH 13/14] remove unnecessary code, merged develop --- app/Http/Controllers/Api/ReportsController.php | 1 + resources/views/reports/expiring_items.blade.php | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Http/Controllers/Api/ReportsController.php b/app/Http/Controllers/Api/ReportsController.php index fc33fd77b9a2..e71f336eb9f2 100644 --- a/app/Http/Controllers/Api/ReportsController.php +++ b/app/Http/Controllers/Api/ReportsController.php @@ -11,6 +11,7 @@ use App\Models\Asset; use App\Models\License; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; class ReportsController extends Controller diff --git a/resources/views/reports/expiring_items.blade.php b/resources/views/reports/expiring_items.blade.php index 9c718de518b2..bb883852935e 100644 --- a/resources/views/reports/expiring_items.blade.php +++ b/resources/views/reports/expiring_items.blade.php @@ -1,5 +1,3 @@ - @extends('layouts/default') @section('title') From 142fb771b9460da23c3d6c16aec24e2322d49b8e Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 10 Jun 2026 11:41:17 -0700 Subject: [PATCH 14/14] remove duplicate uses" --- app/Http/Controllers/Api/ReportsController.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/Http/Controllers/Api/ReportsController.php b/app/Http/Controllers/Api/ReportsController.php index e8d9c49e5a4b..24836f39ca0a 100644 --- a/app/Http/Controllers/Api/ReportsController.php +++ b/app/Http/Controllers/Api/ReportsController.php @@ -11,10 +11,8 @@ use App\Models\Actionlog; use App\Models\Asset; use App\Models\License; -use App\Models\Asset; use App\Models\Component; use App\Models\Consumable; -use App\Models\License; use App\Models\LicenseSeat; use App\Models\Maintenance; use App\Models\User;