From 7939c691f787a554c8468e8dcdace312b899bd80 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 7 Mar 2024 22:04:12 +0000 Subject: [PATCH 01/69] Added Brother 18mm label type Signed-off-by: snipe --- app/Models/Labels/Tapes/Brother/TZe_18mm.php | 19 +++++++ .../Labels/Tapes/Brother/TZe_18mm_A.php | 56 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 app/Models/Labels/Tapes/Brother/TZe_18mm.php create mode 100644 app/Models/Labels/Tapes/Brother/TZe_18mm_A.php diff --git a/app/Models/Labels/Tapes/Brother/TZe_18mm.php b/app/Models/Labels/Tapes/Brother/TZe_18mm.php new file mode 100644 index 000000000..38c14c7aa --- /dev/null +++ b/app/Models/Labels/Tapes/Brother/TZe_18mm.php @@ -0,0 +1,19 @@ +getUnit()); } + public function getMarginTop() { return Helper::convertUnit(self::MARGIN_SIDES, 'mm', $this->getUnit()); } + public function getMarginBottom() { return Helper::convertUnit(self::MARGIN_SIDES, 'mm', $this->getUnit());} + public function getMarginLeft() { return Helper::convertUnit(self::MARGIN_ENDS, 'mm', $this->getUnit()); } + public function getMarginRight() { return Helper::convertUnit(self::MARGIN_ENDS, 'mm', $this->getUnit()); } +} \ No newline at end of file diff --git a/app/Models/Labels/Tapes/Brother/TZe_18mm_A.php b/app/Models/Labels/Tapes/Brother/TZe_18mm_A.php new file mode 100644 index 000000000..32156f5ee --- /dev/null +++ b/app/Models/Labels/Tapes/Brother/TZe_18mm_A.php @@ -0,0 +1,56 @@ +getPrintableArea(); + + if ($record->has('barcode1d')) { + static::write1DBarcode( + $pdf, $record->get('barcode1d')->content, $record->get('barcode1d')->type, + $pa->x1, $pa->y1, $pa->w, self::BARCODE_SIZE + ); + } + + $currentY = $pa->y1 + self::BARCODE_SIZE + self::BARCODE_MARGIN; + $usableHeight = $pa->h - self::BARCODE_SIZE - self::BARCODE_MARGIN; + $fontSize = $usableHeight + self::TEXT_SIZE_MOD; + + $tagWidth = $pa->w / 3; + $fieldWidth = $pa->w / 3 * 2; + + static::writeText( + $pdf, $record->get('tag'), + $pa->x1, $currentY, + 'freemono', 'b', $fontSize, 'L', + $tagWidth, $usableHeight, true, 0, 0 + ); + + if ($record->get('fields')->count() >= 1) { + static::writeText( + $pdf, $record->get('fields')->values()->get(0)['value'], + $pa->x1 + ($tagWidth), $currentY, + 'freemono', 'b', $fontSize, 'R', + $fieldWidth, $usableHeight, true, 0, 0 + ); + } + + } +} \ No newline at end of file From 040f826c521d33d9a95b4c341b9ccb436adf8cee Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 26 Mar 2024 08:57:18 -0700 Subject: [PATCH 02/69] removes encrypted fields as a selectable option for labels --- resources/views/partials/label2-field-definitions.blade.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/views/partials/label2-field-definitions.blade.php b/resources/views/partials/label2-field-definitions.blade.php index 8d8c680c9..c16a09ded 100644 --- a/resources/views/partials/label2-field-definitions.blade.php +++ b/resources/views/partials/label2-field-definitions.blade.php @@ -348,7 +348,9 @@ @foreach($customFields as $customField) + @if($customField->field_encrypted != 1) + @endif @endforeach From aa8af2220ce9ff40dfabbebcd343ad89bc8cf0f7 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 26 Mar 2024 16:10:08 -0700 Subject: [PATCH 03/69] trying to remove an encrypted field but not all fields --- app/Http/Controllers/LabelsController.php | 25 +++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/LabelsController.php b/app/Http/Controllers/LabelsController.php index 4fe04dc1c..e1fc55086 100755 --- a/app/Http/Controllers/LabelsController.php +++ b/app/Http/Controllers/LabelsController.php @@ -14,6 +14,7 @@ use App\Models\Setting; use App\Models\Supplier; use App\Models\User; use App\View\Label as LabelView; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; class LabelsController extends Controller @@ -21,12 +22,13 @@ class LabelsController extends Controller /** * Returns the Label view with test data * - * @author Grant Le Roux - * @param string $labelName + * @param string $labelName * @return \Illuminate\Contracts\View\View + * @author Grant Le Roux */ public function show(string $labelName) { + $this->clearEncryptedLabelOptions(); $labelName = str_replace('/', '\\', $labelName); $template = Label::find($labelName); @@ -95,4 +97,23 @@ class LabelsController extends Controller return redirect()->route('home')->with('error', trans('admin/labels/message.does_not_exist')); } + + private function clearEncryptedLabelOptions() + { + + $customfields = CustomField::where('field_encrypted', 1)->get(); + $selected_label_options = Setting::getSettings()->label2_fields; + if($selected_label_options != '') { + } + collect(explode(';', Setting::getSettings()->label2_fields)) + ->filter() + ->each(function ($item) use ($customfields, $selected_label_options) { + if (!str_contains($item, $customfields->db_column)) { + $selected_label_options .= $item; + } + DB::table('Settings')->update(['label2_fields' => $selected_label_options]); + }); + + } + } From 4327653d705a6375302cbb9fc58a9b9d4bc9c172 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 3 Apr 2024 10:57:41 -0700 Subject: [PATCH 04/69] remove db cleaner for encrypted selections --- app/Http/Controllers/LabelsController.php | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/app/Http/Controllers/LabelsController.php b/app/Http/Controllers/LabelsController.php index e1fc55086..461d8c4c3 100755 --- a/app/Http/Controllers/LabelsController.php +++ b/app/Http/Controllers/LabelsController.php @@ -28,7 +28,6 @@ class LabelsController extends Controller */ public function show(string $labelName) { - $this->clearEncryptedLabelOptions(); $labelName = str_replace('/', '\\', $labelName); $template = Label::find($labelName); @@ -97,23 +96,4 @@ class LabelsController extends Controller return redirect()->route('home')->with('error', trans('admin/labels/message.does_not_exist')); } - - private function clearEncryptedLabelOptions() - { - - $customfields = CustomField::where('field_encrypted', 1)->get(); - $selected_label_options = Setting::getSettings()->label2_fields; - if($selected_label_options != '') { - } - collect(explode(';', Setting::getSettings()->label2_fields)) - ->filter() - ->each(function ($item) use ($customfields, $selected_label_options) { - if (!str_contains($item, $customfields->db_column)) { - $selected_label_options .= $item; - } - DB::table('Settings')->update(['label2_fields' => $selected_label_options]); - }); - - } - } From bb2c73348d1032ba14f705fc1b44c5a56d83a8bc Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 3 Apr 2024 11:03:58 -0700 Subject: [PATCH 05/69] only grabs custom Fields that are not encrpyted --- app/Http/Controllers/LabelsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/LabelsController.php b/app/Http/Controllers/LabelsController.php index 461d8c4c3..b5b8740a4 100755 --- a/app/Http/Controllers/LabelsController.php +++ b/app/Http/Controllers/LabelsController.php @@ -67,7 +67,7 @@ class LabelsController extends Controller $exampleAsset->model->category->id = 999999; $exampleAsset->model->category->name = trans('admin/labels/table.example_category'); - $customFieldColumns = CustomField::all()->pluck('db_column'); + $customFieldColumns = CustomField::where('field_encrypted', '=', 0)->pluck('db_column'); collect(explode(';', Setting::getSettings()->label2_fields)) ->filter() From df5cacf8a2814c631f89b94b213a60b5b2789f16 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 3 Apr 2024 11:06:05 -0700 Subject: [PATCH 06/69] removed front end if statement --- resources/views/partials/label2-field-definitions.blade.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/views/partials/label2-field-definitions.blade.php b/resources/views/partials/label2-field-definitions.blade.php index c16a09ded..8d8c680c9 100644 --- a/resources/views/partials/label2-field-definitions.blade.php +++ b/resources/views/partials/label2-field-definitions.blade.php @@ -348,9 +348,7 @@ @foreach($customFields as $customField) - @if($customField->field_encrypted != 1) - @endif @endforeach From e2679852cea3a6d21ba6dbe690c5992ca2470273 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 10 Apr 2024 11:31:30 -0700 Subject: [PATCH 07/69] 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 08/69] 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 09/69] 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 10/69] 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 11/69] 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 12/69] 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 5e122f780ff1268f187bc2ad2ae13bd05462c17a Mon Sep 17 00:00:00 2001 From: akemidx Date: Tue, 16 Apr 2024 14:00:20 -0400 Subject: [PATCH 13/69] sidebar_hover_color --- resources/assets/less/skins/skin-purple-dark.less | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/resources/assets/less/skins/skin-purple-dark.less b/resources/assets/less/skins/skin-purple-dark.less index afb08b385..6826edcd4 100644 --- a/resources/assets/less/skins/skin-purple-dark.less +++ b/resources/assets/less/skins/skin-purple-dark.less @@ -368,8 +368,13 @@ input[type=text], input[type=search] { background-color: #5f5ca8; } .fixed-table-body thead th .th-inner, .skin-purple-dark .sidebar-menu>li.active>a, .skin-purple .sidebar-menu>li:hover>a, .sidebar-toggle:hover { - background-color: var(--header)!important; + background-color: #5f5ca8!important; } + +//.skin-purple-dark .sidebar-menu>li.active>a:hover { +// background-color: #5f5ca8; +//} + .tab-content, .tab-pane { background-color: var(--back-main); color: var(--text-main); From df60045bfe7385d42ffaca30746a34850a4d9252 Mon Sep 17 00:00:00 2001 From: akemidx Date: Tue, 16 Apr 2024 14:21:47 -0400 Subject: [PATCH 14/69] sidebar hover fix --- resources/assets/less/mixins.less | 2 +- resources/assets/less/skins/skin-purple-dark.less | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/resources/assets/less/mixins.less b/resources/assets/less/mixins.less index ff801d415..b6ff57a4e 100755 --- a/resources/assets/less/mixins.less +++ b/resources/assets/less/mixins.less @@ -131,7 +131,7 @@ //Hover and active states &:hover > a, &.active > a { color: @sidebar-dark-hover-color; - background: @sidebar-dark-hover-bg; + background: @link-hover-border-color; border-left-color: @link-hover-border-color; } //First Level Submenu diff --git a/resources/assets/less/skins/skin-purple-dark.less b/resources/assets/less/skins/skin-purple-dark.less index 6826edcd4..590e24f99 100644 --- a/resources/assets/less/skins/skin-purple-dark.less +++ b/resources/assets/less/skins/skin-purple-dark.less @@ -368,13 +368,9 @@ input[type=text], input[type=search] { background-color: #5f5ca8; } .fixed-table-body thead th .th-inner, .skin-purple-dark .sidebar-menu>li.active>a, .skin-purple .sidebar-menu>li:hover>a, .sidebar-toggle:hover { - background-color: #5f5ca8!important; + background-color: var(--header)!important; } -//.skin-purple-dark .sidebar-menu>li.active>a:hover { -// background-color: #5f5ca8; -//} - .tab-content, .tab-pane { background-color: var(--back-main); color: var(--text-main); From f39ba0136cc67cebe96ad5629883ce8fd76d631f Mon Sep 17 00:00:00 2001 From: akemidx Date: Tue, 16 Apr 2024 14:26:18 -0400 Subject: [PATCH 15/69] errant carraige return --- resources/assets/less/skins/skin-purple-dark.less | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/assets/less/skins/skin-purple-dark.less b/resources/assets/less/skins/skin-purple-dark.less index 590e24f99..afb08b385 100644 --- a/resources/assets/less/skins/skin-purple-dark.less +++ b/resources/assets/less/skins/skin-purple-dark.less @@ -370,7 +370,6 @@ input[type=text], input[type=search] { .fixed-table-body thead th .th-inner, .skin-purple-dark .sidebar-menu>li.active>a, .skin-purple .sidebar-menu>li:hover>a, .sidebar-toggle:hover { background-color: var(--header)!important; } - .tab-content, .tab-pane { background-color: var(--back-main); color: var(--text-main); From 25f1167c9d96a525c3637ed84997e2df6a0cbe73 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Mon, 22 Apr 2024 10:38:55 -0700 Subject: [PATCH 16/69] 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 17/69] 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 18/69] 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....', From 96b3af7cbc312b02316f156c136225f2fbe362af Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Mon, 22 Apr 2024 18:27:34 -0700 Subject: [PATCH 19/69] fixed view from sending all custom fields --- app/Http/Controllers/SettingsController.php | 7 +++---- .../views/partials/label2-field-definitions.blade.php | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index b1cb620a8..ddac87688 100755 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -790,10 +790,9 @@ class SettingsController extends Controller */ public function getLabels() { - return view('settings.labels', [ - 'setting' => Setting::getSettings(), - 'customFields' => CustomField::all(), - ]); + return view('settings.labels') + ->with('setting', Setting::getSettings()) + ->with('customFields', CustomField::where('field_encrypted', '=', 0)->get()); } /** diff --git a/resources/views/partials/label2-field-definitions.blade.php b/resources/views/partials/label2-field-definitions.blade.php index 8d8c680c9..26c1fb43a 100644 --- a/resources/views/partials/label2-field-definitions.blade.php +++ b/resources/views/partials/label2-field-definitions.blade.php @@ -348,6 +348,7 @@ @foreach($customFields as $customField) + @endforeach From 783a24eb68aeaa079eff967a47421e00a1499f86 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 24 Apr 2024 17:17:42 -0700 Subject: [PATCH 20/69] Add test for ParseCurrencyMethod --- tests/Unit/Helpers/HelperTest.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/Unit/Helpers/HelperTest.php b/tests/Unit/Helpers/HelperTest.php index 0b5fba986..cfc8c7fac 100644 --- a/tests/Unit/Helpers/HelperTest.php +++ b/tests/Unit/Helpers/HelperTest.php @@ -16,4 +16,13 @@ class HelperTest extends TestCase { $this->assertIsString(Helper::defaultChartColors(-1)); } + + public function testParseCurrencyMethod() + { + $this->settings->set(['default_currency' => 'USD']); + $this->assertSame(12.34, Helper::ParseCurrency('USD 12.34')); + + $this->settings->set(['digit_separator' => '1.234,56']); + $this->assertSame(12.34, Helper::ParseCurrency('12,34')); + } } From 12418ae91b26b395a6af4d64cd35547508e54859 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 24 Apr 2024 17:18:29 -0700 Subject: [PATCH 21/69] WIP: allow EU style purchase cost via api --- app/Http/Requests/StoreAssetRequest.php | 8 +++- tests/Feature/Api/Assets/AssetStoreTest.php | 43 +++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/Http/Requests/StoreAssetRequest.php b/app/Http/Requests/StoreAssetRequest.php index 8e7559673..ff2cf7f2b 100644 --- a/app/Http/Requests/StoreAssetRequest.php +++ b/app/Http/Requests/StoreAssetRequest.php @@ -45,8 +45,14 @@ class StoreAssetRequest extends ImageUploadRequest */ public function rules(): array { + $modelRules = (new Asset)->getRules(); + + $modelRules['purchase_cost'] = array_filter(explode('|', $modelRules['purchase_cost']), function ($rule) { + return $rule !== 'numeric' && $rule !== 'gte:0'; + }); + $rules = array_merge( - (new Asset)->getRules(), + $modelRules, parent::rules(), ); diff --git a/tests/Feature/Api/Assets/AssetStoreTest.php b/tests/Feature/Api/Assets/AssetStoreTest.php index c87474551..790c1a97f 100644 --- a/tests/Feature/Api/Assets/AssetStoreTest.php +++ b/tests/Feature/Api/Assets/AssetStoreTest.php @@ -2,6 +2,7 @@ namespace Tests\Feature\Api\Assets; +use App\Helpers\Helper; use App\Models\Asset; use App\Models\AssetModel; use App\Models\Company; @@ -12,6 +13,7 @@ use App\Models\Supplier; use App\Models\User; use Illuminate\Support\Facades\Crypt; use Illuminate\Testing\Fluent\AssertableJson; +use Illuminate\Testing\TestResponse; use Tests\TestCase; class AssetStoreTest extends TestCase @@ -278,6 +280,47 @@ class AssetStoreTest extends TestCase ->assertStatusMessageIs('error'); } + private function purchaseCosts(): array + { + return [ + 'with decimal' => [ + [ + 'separator' => '1.234.56', + 'input' => 12.34, + 'expectation' => 12.34 + ] + ], + 'EU style' => [ + [ + 'separator' => '1.234,56', + 'input' => "12,34", + 'expectation' => 12.34 + ] + ], + ]; + } + + /** + * @dataProvider purchaseCosts + */ + public function testPurchaseCost($costs) + { + $this->settings->set(['digit_separator' => $costs['separator']]); + + $response = $this->actingAsForApi(User::factory()->superuser()->create()) + ->postJson(route('api.assets.store'), [ + 'asset_tag' => 'random-string', + 'model_id' => AssetModel::factory()->create()->id, + 'status_id' => Statuslabel::factory()->create()->id, + 'purchase_cost' => $costs['input'], + ]) + ->assertStatusMessageIs('success'); + + $asset = Asset::find($response['payload']['id']); + + $this->assertEquals($costs['expectation'], $asset->purchase_cost); + } + public function testUniqueSerialNumbersIsEnforcedWhenEnabled() { $model = AssetModel::factory()->create(); From 3a2eeaea7ae4b02b31f05b8e5ec5f4faa4fe4daa Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 24 Apr 2024 17:40:40 -0700 Subject: [PATCH 22/69] WIP: Future-proof rules being converted to array syntax --- app/Http/Requests/StoreAssetRequest.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/app/Http/Requests/StoreAssetRequest.php b/app/Http/Requests/StoreAssetRequest.php index ff2cf7f2b..38d332562 100644 --- a/app/Http/Requests/StoreAssetRequest.php +++ b/app/Http/Requests/StoreAssetRequest.php @@ -47,9 +47,7 @@ class StoreAssetRequest extends ImageUploadRequest { $modelRules = (new Asset)->getRules(); - $modelRules['purchase_cost'] = array_filter(explode('|', $modelRules['purchase_cost']), function ($rule) { - return $rule !== 'numeric' && $rule !== 'gte:0'; - }); + $modelRules['purchase_cost'] = $this->removeNumericRulesFromPurchaseCost($modelRules['purchase_cost']); $rules = array_merge( $modelRules, @@ -75,4 +73,16 @@ class StoreAssetRequest extends ImageUploadRequest } } } + + private function removeNumericRulesFromPurchaseCost($purchaseCost) + { + // If rule is in "|" format then turn it into an array + if (is_string($purchaseCost)) { + $purchaseCost = explode('|', $purchaseCost); + } + + return array_filter($purchaseCost, function ($rule) { + return $rule !== 'numeric' && $rule !== 'gte:0'; + }); + } } From 4295bad12f627e3bad50803bbb3fc24e52492bd8 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 25 Apr 2024 14:07:56 -0700 Subject: [PATCH 23/69] Separate test cases --- tests/Feature/Api/Assets/AssetStoreTest.php | 57 +++++++++++---------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/tests/Feature/Api/Assets/AssetStoreTest.php b/tests/Feature/Api/Assets/AssetStoreTest.php index 790c1a97f..006a5738f 100644 --- a/tests/Feature/Api/Assets/AssetStoreTest.php +++ b/tests/Feature/Api/Assets/AssetStoreTest.php @@ -280,45 +280,48 @@ class AssetStoreTest extends TestCase ->assertStatusMessageIs('error'); } - private function purchaseCosts(): array + public function testStoresPeriodAsDecimalSeparatorForPurchaseCost() { - return [ - 'with decimal' => [ - [ - 'separator' => '1.234.56', - 'input' => 12.34, - 'expectation' => 12.34 - ] - ], - 'EU style' => [ - [ - 'separator' => '1.234,56', - 'input' => "12,34", - 'expectation' => 12.34 - ] - ], - ]; - } - - /** - * @dataProvider purchaseCosts - */ - public function testPurchaseCost($costs) - { - $this->settings->set(['digit_separator' => $costs['separator']]); + $this->settings->set([ + 'default_currency' => 'USD', + 'digit_separator' => '1,234.56', + ]); $response = $this->actingAsForApi(User::factory()->superuser()->create()) ->postJson(route('api.assets.store'), [ 'asset_tag' => 'random-string', 'model_id' => AssetModel::factory()->create()->id, 'status_id' => Statuslabel::factory()->create()->id, - 'purchase_cost' => $costs['input'], + // API accepts float + 'purchase_cost' => 12.34, ]) ->assertStatusMessageIs('success'); $asset = Asset::find($response['payload']['id']); - $this->assertEquals($costs['expectation'], $asset->purchase_cost); + $this->assertEquals(12.34, $asset->purchase_cost); + } + + public function testStoresPeriodAsCommaSeparatorForPurchaseCost() + { + $this->settings->set([ + 'default_currency' => 'EUR', + 'digit_separator' => '1.234,56', + ]); + + $response = $this->actingAsForApi(User::factory()->superuser()->create()) + ->postJson(route('api.assets.store'), [ + 'asset_tag' => 'random-string', + 'model_id' => AssetModel::factory()->create()->id, + 'status_id' => Statuslabel::factory()->create()->id, + // API also accepts string for comma separated values + 'purchase_cost' => '12,34', + ]) + ->assertStatusMessageIs('success'); + + $asset = Asset::find($response['payload']['id']); + + $this->assertEquals(12.34, $asset->purchase_cost); } public function testUniqueSerialNumbersIsEnforcedWhenEnabled() From 1d5b48b88d4d18a5bcaedbabf00da56bee6c72d7 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 25 Apr 2024 16:22:03 -0700 Subject: [PATCH 24/69] Add comment and improve method --- app/Http/Requests/StoreAssetRequest.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/Http/Requests/StoreAssetRequest.php b/app/Http/Requests/StoreAssetRequest.php index 38d332562..fb23ac8f2 100644 --- a/app/Http/Requests/StoreAssetRequest.php +++ b/app/Http/Requests/StoreAssetRequest.php @@ -47,14 +47,17 @@ class StoreAssetRequest extends ImageUploadRequest { $modelRules = (new Asset)->getRules(); - $modelRules['purchase_cost'] = $this->removeNumericRulesFromPurchaseCost($modelRules['purchase_cost']); + // If purchase_cost was submitted as a string with a comma separator + // then we need to ignore the normal numeric rules. + // Since the original rules still live on the model they will be run + // right before saving (and after purchase_cost has been + // converted to a float via setPurchaseCostAttribute). + $modelRules = $this->removeNumericRulesFromPurchaseCost($modelRules); - $rules = array_merge( + return array_merge( $modelRules, parent::rules(), ); - - return $rules; } private function parseLastAuditDate(): void @@ -74,15 +77,19 @@ class StoreAssetRequest extends ImageUploadRequest } } - private function removeNumericRulesFromPurchaseCost($purchaseCost) + private function removeNumericRulesFromPurchaseCost(array $rules): array { + $purchaseCost = $rules['purchase_cost']; + // If rule is in "|" format then turn it into an array if (is_string($purchaseCost)) { $purchaseCost = explode('|', $purchaseCost); } - return array_filter($purchaseCost, function ($rule) { + $rules['purchase_cost'] = array_filter($purchaseCost, function ($rule) { return $rule !== 'numeric' && $rule !== 'gte:0'; }); + + return $rules; } } From 30bd92049724685999b1b1975c1d76a04de7733f Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 25 Apr 2024 16:24:12 -0700 Subject: [PATCH 25/69] Add conditional --- app/Http/Requests/StoreAssetRequest.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/Http/Requests/StoreAssetRequest.php b/app/Http/Requests/StoreAssetRequest.php index fb23ac8f2..bbf3a9844 100644 --- a/app/Http/Requests/StoreAssetRequest.php +++ b/app/Http/Requests/StoreAssetRequest.php @@ -47,12 +47,14 @@ class StoreAssetRequest extends ImageUploadRequest { $modelRules = (new Asset)->getRules(); - // If purchase_cost was submitted as a string with a comma separator - // then we need to ignore the normal numeric rules. - // Since the original rules still live on the model they will be run - // right before saving (and after purchase_cost has been - // converted to a float via setPurchaseCostAttribute). - $modelRules = $this->removeNumericRulesFromPurchaseCost($modelRules); + if (is_string($this->input('purchase_cost'))) { + // If purchase_cost was submitted as a string with a comma separator + // then we need to ignore the normal numeric rules. + // Since the original rules still live on the model they will be run + // right before saving (and after purchase_cost has been + // converted to a float via setPurchaseCostAttribute). + $modelRules = $this->removeNumericRulesFromPurchaseCost($modelRules); + } return array_merge( $modelRules, From 2a71877becb9ad628f5d36766b5b0ab5d19d7b94 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 25 Apr 2024 17:04:07 -0700 Subject: [PATCH 26/69] Add additional condition --- app/Http/Requests/StoreAssetRequest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Requests/StoreAssetRequest.php b/app/Http/Requests/StoreAssetRequest.php index bbf3a9844..007dd2684 100644 --- a/app/Http/Requests/StoreAssetRequest.php +++ b/app/Http/Requests/StoreAssetRequest.php @@ -4,6 +4,7 @@ namespace App\Http\Requests; use App\Models\Asset; use App\Models\Company; +use App\Models\Setting; use Carbon\Carbon; use Carbon\Exceptions\InvalidFormatException; use Illuminate\Support\Facades\Gate; @@ -47,7 +48,7 @@ class StoreAssetRequest extends ImageUploadRequest { $modelRules = (new Asset)->getRules(); - if (is_string($this->input('purchase_cost'))) { + if (Setting::getSettings()->digit_separator === '1.234,56' && is_string($this->input('purchase_cost'))) { // If purchase_cost was submitted as a string with a comma separator // then we need to ignore the normal numeric rules. // Since the original rules still live on the model they will be run From 27bc7a847bee4d498661cde7e63aa839baabf9d7 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 14:01:11 +0100 Subject: [PATCH 27/69] Updated routes Signed-off-by: snipe --- routes/api.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/routes/api.php b/routes/api.php index 842e6210d..082651a7e 100644 --- a/routes/api.php +++ b/routes/api.php @@ -496,13 +496,22 @@ Route::group(['prefix' => 'v1', 'middleware' => ['api', 'throttle:api']], functi )->name('api.assets.show.byserial') ->where('any', '.*'); - Route::get('audit/{audit}', + // Get assets that are due or overdue for audit + Route::get('audit/{status}', [ Api\AssetsController::class, 'index' ] )->name('api.asset.to-audit'); + // Get assets that are due or overdue for checkin + Route::get('checkins/{status}', + [ + Api\AssetsController::class, + 'index' + ] + )->name('api.asset.to-checkin'); + Route::post('audit', [ Api\AssetsController::class, From bfc30794c5429e913e4cca2f68023090534af248 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 14:01:22 +0100 Subject: [PATCH 28/69] Updated badge styling Signed-off-by: snipe --- resources/views/layouts/default.blade.php | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index a1a4bc30c..b74c6763f 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -437,6 +437,9 @@ {{ trans('general.list_all') }} + + {{ (isset($total_assets)) ? $total_assets : '' }} + @@ -447,7 +450,8 @@ - {{ $status_nav->name }} ({{ $status_nav->asset_count }}) + {{ $status_nav->name }} + {{ $status_nav->asset_count }}) @endforeach @endif @@ -457,7 +461,7 @@ {{ trans('general.all') }} {{ trans('general.deployed') }} - ({{ (isset($total_deployed_sidebar)) ? $total_deployed_sidebar : '' }}) + {{ (isset($total_deployed_sidebar)) ? $total_deployed_sidebar : '' }} @@ -465,7 +469,7 @@ {{ trans('general.all') }} {{ trans('general.ready_to_deploy') }} - ({{ (isset($total_rtd_sidebar)) ? $total_rtd_sidebar : '' }}) + {{ (isset($total_rtd_sidebar)) ? $total_rtd_sidebar : '' }} {{ trans('general.all') }} {{ trans('general.pending') }} - ({{ (isset($total_pending_sidebar)) ? $total_pending_sidebar : '' }}) + {{ (isset($total_pending_sidebar)) ? $total_pending_sidebar : '' }} {{ trans('general.all') }} {{ trans('general.undeployable') }} - ({{ (isset($total_undeployable_sidebar)) ? $total_undeployable_sidebar : '' }}) + {{ (isset($total_undeployable_sidebar)) ? $total_undeployable_sidebar : '' }} {{ trans('general.all') }} {{ trans('general.byod') }} - ({{ (isset($total_byod_sidebar)) ? $total_byod_sidebar : '' }}) + {{ (isset($total_byod_sidebar)) ? $total_byod_sidebar : '' }} {{ trans('general.all') }} {{ trans('admin/hardware/general.archived') }} - ({{ (isset($total_archived_sidebar)) ? $total_archived_sidebar : '' }}) + {{ (isset($total_archived_sidebar)) ? $total_archived_sidebar : '' }} {{ trans('general.audit_due') }} + {{ (isset($total_due_for_audit)) ? $total_due_for_audit : '' }} {{ trans('general.audit_overdue') }} + {{ (isset($total_overdue_for_audit)) ? $total_overdue_for_audit : '' }} @endcan From 2484a9db2c58141b64b8e6e5879adcfcce082141 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 14:01:29 +0100 Subject: [PATCH 29/69] Added tests Signed-off-by: snipe --- tests/Feature/Api/Assets/AssetIndexTest.php | 78 ++++++++++++++++++++- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/tests/Feature/Api/Assets/AssetIndexTest.php b/tests/Feature/Api/Assets/AssetIndexTest.php index 3175db695..3aa90840e 100644 --- a/tests/Feature/Api/Assets/AssetIndexTest.php +++ b/tests/Feature/Api/Assets/AssetIndexTest.php @@ -7,10 +7,10 @@ use App\Models\Company; use App\Models\User; use Illuminate\Testing\Fluent\AssertableJson; use Tests\TestCase; - +use Carbon; class AssetIndexTest extends TestCase { - public function testAssetIndexReturnsExpectedAssets() + public function testAssetApiIndexReturnsExpectedAssets() { Asset::factory()->count(3)->create(); @@ -30,7 +30,79 @@ class AssetIndexTest extends TestCase ->assertJson(fn(AssertableJson $json) => $json->has('rows', 3)->etc()); } - public function testAssetIndexAdheresToCompanyScoping() + public function testAssetApiIndexReturnsDisplayUpcomingAuditsDueToday() + { + $assets = Asset::factory()->count(3)->create(['next_audit_date' => Carbon::now()->format('Y-m-d')]); + + //dd($assets); + + $this->assertTrue(Asset::count() === 3); + + $this->actingAsForApi(User::factory()->superuser()->create()) + ->getJson( + route('api.asset.to-audit', ['status' => 'due'])) + ->assertOk() + ->assertJsonStructure([ + 'total', + 'rows', + ]) + ->assertJson(fn(AssertableJson $json) => $json->has('rows', 3)->etc()); + + } + + public function testAssetApiIndexReturnsOverdueForAudit() + { + Asset::factory()->count(3)->create(['next_audit_date' => Carbon::now()->subDays(1)->format('Y-m-d')]); + + $this->assertTrue(Asset::count() === 3); + + $this->actingAsForApi(User::factory()->superuser()->create()) + ->getJson( + route('api.asset.to-audit', ['status' => 'overdue'])) + ->assertOk() + ->assertJsonStructure([ + 'total', + 'rows', + ]) + ->assertJson(fn(AssertableJson $json) => $json->has('rows', 3)->etc()); + } + + + public function testAssetApiIndexReturnsDueForExpectedCheckinToday() + { + Asset::factory()->count(3)->create(['expected_checkin' => Carbon::now()->format('Y-m-d')]); + + $this->assertTrue(Asset::count() === 3); + + $this->actingAsForApi(User::factory()->superuser()->create()) + ->getJson( + route('api.asset.to-checkin', ['status' => 'due']) + ) + ->assertOk() + ->assertJsonStructure([ + 'total', + 'rows', + ]) + ->assertJson(fn(AssertableJson $json) => $json->has('rows', 3)->etc()); + } + + public function testAssetApiIndexReturnsOverdueForExpectedCheckin() + { + Asset::factory()->count(3)->create(['expected_checkin' => Carbon::now()->subDays(1)->format('Y-m-d')]); + + $this->assertTrue(Asset::count() === 3); + + $this->actingAsForApi(User::factory()->superuser()->create()) + ->getJson(route('api.asset.to-checkin', ['status' => 'overdue'])) + ->assertOk() + ->assertJsonStructure([ + 'total', + 'rows', + ]) + ->assertJson(fn(AssertableJson $json) => $json->has('rows', 3)->etc()); + } + + public function testAssetApiIndexAdheresToCompanyScoping() { [$companyA, $companyB] = Company::factory()->count(2)->create(); From 14b6a75507aef2a0d1e0a3d7aff063dfe4ba5f54 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 14:01:38 +0100 Subject: [PATCH 30/69] Updated routes Signed-off-by: snipe --- resources/views/hardware/audit-due.blade.php | 4 ++-- resources/views/hardware/audit-overdue.blade.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/views/hardware/audit-due.blade.php b/resources/views/hardware/audit-due.blade.php index 0232facd7..3d3674c15 100644 --- a/resources/views/hardware/audit-due.blade.php +++ b/resources/views/hardware/audit-due.blade.php @@ -6,7 +6,7 @@ {{ $company->name }} @endif - {{ trans('general.audit_due') }} + {{ trans('general.audit_due_days', ['days' => $settings->audit_warning_days]) }} @stop @@ -49,7 +49,7 @@ data-bulk-form-id="#assetsBulkForm" id="assetsAuditListingTable" class="table table-striped snipe-table" - data-url="{{ route('api.asset.to-audit', ['audit' => 'due']) }}" + data-url="{{ route('api.asset.to-audit', ['status' => 'due']) }}" data-export-options='{ "fileName": "export-assets-due-audit-{{ date('Y-m-d') }}", "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"] diff --git a/resources/views/hardware/audit-overdue.blade.php b/resources/views/hardware/audit-overdue.blade.php index ddd477fb2..1b9aafd46 100644 --- a/resources/views/hardware/audit-overdue.blade.php +++ b/resources/views/hardware/audit-overdue.blade.php @@ -47,7 +47,7 @@ data-bulk-form-id="#assetsBulkForm" id="assetsAuditListingTable" class="table table-striped snipe-table" - data-url="{{ route('api.asset.to-audit', ['audit' => 'overdue']) }}" + data-url="{{ route('api.asset.to-audit', ['status' => 'overdue']) }}" data-export-options='{ "fileName": "export-assets-due-audit-{{ date('Y-m-d') }}", "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"] From 2e92ee8eee228d9a365ae4b4db392e6a44603f3d Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 14:02:23 +0100 Subject: [PATCH 31/69] Switch to whereBetween so tests run on sqlite Signed-off-by: snipe --- app/Models/Asset.php | 50 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/app/Models/Asset.php b/app/Models/Asset.php index 1f4079e49..dd89efeda 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -1163,10 +1163,15 @@ class Asset extends Depreciable public function scopeDueForAudit($query, $settings) { $interval = $settings->audit_warning_days ?? 0; + $today = Carbon::now(); + $interval_date = $today->copy()->addDays($interval)->format('Y-m-d'); + + \Log::debug($interval); + \Log::debug($today); + \Log::debug($interval_date); return $query->whereNotNull('assets.next_audit_date') - ->where('assets.next_audit_date', '>=', Carbon::now()) - ->whereRaw("DATE_SUB(assets.next_audit_date, INTERVAL $interval DAY) <= '".Carbon::now()."'") + ->whereBetween('assets.next_audit_date', [$today->format('Y-m-d'), $interval_date]) ->where('assets.archived', '=', 0) ->NotArchived(); } @@ -1188,7 +1193,7 @@ class Asset extends Depreciable public function scopeOverdueForAudit($query) { return $query->whereNotNull('assets.next_audit_date') - ->where('assets.next_audit_date', '<', Carbon::now()) + ->where('assets.next_audit_date', '<', Carbon::now()->format('Y-m-d')) ->where('assets.archived', '=', 0) ->NotArchived(); } @@ -1209,10 +1214,47 @@ class Asset extends Depreciable public function scopeDueOrOverdueForAudit($query, $settings) { + $interval = $settings->audit_warning_days ?? 0; + $today = Carbon::now(); + $interval_date = $today->copy()->addDays($interval); return $query->whereNotNull('assets.next_audit_date') - ->whereRaw('DATE_SUB('.DB::getTablePrefix()."assets.next_audit_date, INTERVAL $interval DAY) <= '".Carbon::now()."'") + ->where('assets.next_audit_date', '<=', $interval_date); + } + + + /** + * Query builder scope for Assets that are OVERDUE for checkin, based on the assets.next_audit_date + * and settings.audit_warning_days. It checks to see if assets.expected_checkin is before now + * + * @author A. Gianotto + * @since v6.4.0 + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeOverdueForCheckin($query) + { + return $query->whereNotNull('assets.expected_checkin') + ->where('assets.expected_checkin', '<', Carbon::now()->format('Y-m-d')) + ->where('assets.archived', '=', 0) + ->NotArchived(); + } + + /** + * Query builder scope for Assets that are due for checkin OR overdue, based on the assets.next_audit_date + * and settings.audit_warning_days. + * + * @author A. Gianotto + * @since v6.4.0 + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeDueOrOverdueForCheckin($query, $settings) + { + + return $query->whereNotNull('assets.expected_checkin') + ->where('assets.expected_checkin', '<', Carbon::now()->format('Y-m-d')) ->where('assets.archived', '=', 0) ->NotArchived(); } From 2888dd6fd812e631ff574d4fe30338ebbe0e681e Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 14:02:37 +0100 Subject: [PATCH 32/69] Added translation Signed-off-by: snipe --- resources/lang/en-US/general.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index dc44b22b2..f5eb125d5 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -313,6 +313,7 @@ return [ 'token_expired' => 'Your form session has expired. Please try again.', 'login_enabled' => 'Login Enabled', 'audit_due' => 'Due for Audit', + 'audit_due_days' => 'Assets Due for Audit Within :days Days', 'audit_overdue' => 'Overdue for Audit', 'accept' => 'Accept :asset', 'i_accept' => 'I accept', From dfaf01e8aadcaebd0f77b82927570c802fbd70ab Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 14:02:47 +0100 Subject: [PATCH 33/69] Updated asset counters Signed-off-by: snipe --- app/Http/Middleware/AssetCountForSidebar.php | 29 ++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/Http/Middleware/AssetCountForSidebar.php b/app/Http/Middleware/AssetCountForSidebar.php index 5d9656f5c..0088f9387 100644 --- a/app/Http/Middleware/AssetCountForSidebar.php +++ b/app/Http/Middleware/AssetCountForSidebar.php @@ -5,6 +5,7 @@ namespace App\Http\Middleware; use App\Models\Asset; use Auth; use Closure; +use App\Models\Setting; class AssetCountForSidebar { @@ -24,6 +25,13 @@ class AssetCountForSidebar \Log::debug($e); } + try { + $total_assets = Asset::RTD()->count(); + view()->share('total_assets', $total_assets); + } catch (\Exception $e) { + \Log::debug($e); + } + try { $total_deployed_sidebar = Asset::Deployed()->count(); view()->share('total_deployed_sidebar', $total_deployed_sidebar); @@ -59,6 +67,27 @@ class AssetCountForSidebar \Log::debug($e); } + try { + $settings = Setting::getSettings(); + view()->share('settings', $settings); + } catch (\Exception $e) { + \Log::debug($e); + } + + try { + $total_due_for_audit = Asset::DueForAudit($settings)->count(); + view()->share('total_due_for_audit', $total_due_for_audit); + } catch (\Exception $e) { + \Log::debug($e); + } + + try { + $total_overdue_for_audit = Asset::OverdueForAudit($settings)->count(); + view()->share('total_overdue_for_audit', $total_overdue_for_audit); + } catch (\Exception $e) { + \Log::debug($e); + } + return $next($request); } } From bf058bd5c6e07dae1cb4020fe4ce150ca8f9013b Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 14:02:56 +0100 Subject: [PATCH 34/69] Use updated scopes Signed-off-by: snipe --- app/Http/Controllers/Api/AssetsController.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 57307acbb..47ef7232f 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -159,10 +159,13 @@ class AssetsController extends Controller if (Gate::allows('audit', Asset::class)) { switch ($audit) { case 'due': - $assets->DueOrOverdueForAudit($settings); + $assets->DueForAudit($settings); break; case 'overdue': - $assets->overdueForAudit($settings); + $assets->OverdueForAudit($settings); + break; + case 'duooroverdue': + $assets->DueOrOverdueForAudit($settings); break; } } From 4b6d236eb7362b959663c06a2dea315b8baf0e40 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 15:44:06 +0100 Subject: [PATCH 35/69] Added class for sidebar menu badges Signed-off-by: snipe --- public/css/build/app.css | 5 +++++ public/css/build/overrides.css | 5 +++++ public/css/dist/all.css | 10 ++++++++++ public/mix-manifest.json | 6 +++--- resources/assets/less/mixins.less | 2 +- resources/assets/less/overrides.less | 8 +++++++- 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/public/css/build/app.css b/public/css/build/app.css index 6b9729d7e..e527c35aa 100644 --- a/public/css/build/app.css +++ b/public/css/build/app.css @@ -1154,4 +1154,9 @@ input[type="radio"]:checked::before { .datepicker.dropdown-menu { z-index: 1030 !important; } +.sidebar-menu > li .badge { + margin-top: 0px; + filter: brightness(70%); + font-size: 70%; +} diff --git a/public/css/build/overrides.css b/public/css/build/overrides.css index e879341cf..fe8cb67e8 100644 --- a/public/css/build/overrides.css +++ b/public/css/build/overrides.css @@ -787,4 +787,9 @@ input[type="radio"]:checked::before { .datepicker.dropdown-menu { z-index: 1030 !important; } +.sidebar-menu > li .badge { + margin-top: 0px; + filter: brightness(70%); + font-size: 70%; +} diff --git a/public/css/dist/all.css b/public/css/dist/all.css index 834ade82e..e3032d545 100644 --- a/public/css/dist/all.css +++ b/public/css/dist/all.css @@ -22654,6 +22654,11 @@ input[type="radio"]:checked::before { .datepicker.dropdown-menu { z-index: 1030 !important; } +.sidebar-menu > li .badge { + margin-top: 0px; + filter: brightness(70%); + font-size: 70%; +} .select2-container { @@ -23927,4 +23932,9 @@ input[type="radio"]:checked::before { .datepicker.dropdown-menu { z-index: 1030 !important; } +.sidebar-menu > li .badge { + margin-top: 0px; + filter: brightness(70%); + font-size: 70%; +} diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 32e9266e1..548cc78dd 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,8 +1,8 @@ { "/js/build/app.js": "/js/build/app.js?id=ea5f3edebafdb29b616d23fa89106080", "/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=f677207c6cf9678eb539abecb408c374", - "/css/build/overrides.css": "/css/build/overrides.css?id=3f1125ebfd37987dd0d6e2bf18bb41ce", - "/css/build/app.css": "/css/build/app.css?id=ca42da2140f0b5be6c2d0fa84ae90108", + "/css/build/overrides.css": "/css/build/overrides.css?id=be3c0a217bc6c0e0744f75faed784887", + "/css/build/app.css": "/css/build/app.css?id=a168b0a799aa800ee926bffa1b1a434a", "/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=dc383f8560a8d4adb51d44fb4043e03b", "/css/dist/skins/skin-orange.css": "/css/dist/skins/skin-orange.css?id=6f0563e726c2fe4fab4026daaa5bfdf2", "/css/dist/skins/skin-orange-dark.css": "/css/dist/skins/skin-orange-dark.css?id=620b684d9dd9d3bb5fdda00a3a2467c3", @@ -18,7 +18,7 @@ "/css/dist/skins/skin-green.css": "/css/dist/skins/skin-green.css?id=0a82a6ae6bb4e58fe62d162c4fb50397", "/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=da6c7997d9de2f8329142399f0ce50da", "/css/dist/skins/skin-red.css": "/css/dist/skins/skin-red.css?id=44bf834f2110504a793dadec132a5898", - "/css/dist/all.css": "/css/dist/all.css?id=0836d3b034a9b1de17d797ff35f1983e", + "/css/dist/all.css": "/css/dist/all.css?id=628956bb260b760b56216f01d1d71fd8", "/css/dist/signature-pad.css": "/css/dist/signature-pad.css?id=6a89d3cd901305e66ced1cf5f13147f7", "/css/dist/signature-pad.min.css": "/css/dist/signature-pad.min.css?id=6a89d3cd901305e66ced1cf5f13147f7", "/css/webfonts/fa-brands-400.ttf": "/css/webfonts/fa-brands-400.ttf?id=69e5d8e4e818f05fd882cceb758d1eba", diff --git a/resources/assets/less/mixins.less b/resources/assets/less/mixins.less index b6ff57a4e..ff801d415 100755 --- a/resources/assets/less/mixins.less +++ b/resources/assets/less/mixins.less @@ -131,7 +131,7 @@ //Hover and active states &:hover > a, &.active > a { color: @sidebar-dark-hover-color; - background: @link-hover-border-color; + background: @sidebar-dark-hover-bg; border-left-color: @link-hover-border-color; } //First Level Submenu diff --git a/resources/assets/less/overrides.less b/resources/assets/less/overrides.less index 69bd32a3e..31e85ca26 100644 --- a/resources/assets/less/overrides.less +++ b/resources/assets/less/overrides.less @@ -900,4 +900,10 @@ input[type="radio"]:checked::before { } .datepicker.dropdown-menu { z-index: 1030 !important; -} \ No newline at end of file +} + +.sidebar-menu > li .badge { + margin-top: 0px; + filter: brightness(70%); + font-size: 70%; +} From bd8737d986856bf39697d626c67244882db702d1 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 15:44:21 +0100 Subject: [PATCH 36/69] Changed sidenav badge class Signed-off-by: snipe --- resources/views/layouts/default.blade.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index b74c6763f..60132b378 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -437,7 +437,7 @@ {{ trans('general.list_all') }} - + {{ (isset($total_assets)) ? $total_assets : '' }} @@ -461,7 +461,7 @@ {{ trans('general.all') }} {{ trans('general.deployed') }} - {{ (isset($total_deployed_sidebar)) ? $total_deployed_sidebar : '' }} + {{ (isset($total_deployed_sidebar)) ? $total_deployed_sidebar : '' }} @@ -469,7 +469,7 @@ {{ trans('general.all') }} {{ trans('general.ready_to_deploy') }} - {{ (isset($total_rtd_sidebar)) ? $total_rtd_sidebar : '' }} + {{ (isset($total_rtd_sidebar)) ? $total_rtd_sidebar : '' }} {{ trans('general.all') }} {{ trans('general.pending') }} - {{ (isset($total_pending_sidebar)) ? $total_pending_sidebar : '' }} + {{ (isset($total_pending_sidebar)) ? $total_pending_sidebar : '' }} {{ trans('general.all') }} {{ trans('general.undeployable') }} - {{ (isset($total_undeployable_sidebar)) ? $total_undeployable_sidebar : '' }} + {{ (isset($total_undeployable_sidebar)) ? $total_undeployable_sidebar : '' }} {{ trans('general.all') }} {{ trans('general.byod') }} - {{ (isset($total_byod_sidebar)) ? $total_byod_sidebar : '' }} + {{ (isset($total_byod_sidebar)) ? $total_byod_sidebar : '' }} {{ trans('general.all') }} {{ trans('admin/hardware/general.archived') }} - {{ (isset($total_archived_sidebar)) ? $total_archived_sidebar : '' }} + {{ (isset($total_archived_sidebar)) ? $total_archived_sidebar : '' }} {{ trans('general.audit_due') }} - {{ (isset($total_due_for_audit)) ? $total_due_for_audit : '' }} + {{ (isset($total_due_for_audit)) ? $total_due_for_audit : '' }} {{ trans('general.audit_overdue') }} - {{ (isset($total_overdue_for_audit)) ? $total_overdue_for_audit : '' }} + {{ (isset($total_overdue_for_audit)) ? $total_overdue_for_audit : '' }} @endcan From 2d112f227a87b39a935d866b46bcc9dd89a6c906 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 15:44:37 +0100 Subject: [PATCH 37/69] Call the asset factory directly Signed-off-by: snipe --- tests/Feature/Api/Assets/AssetIndexTest.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/Feature/Api/Assets/AssetIndexTest.php b/tests/Feature/Api/Assets/AssetIndexTest.php index 3aa90840e..f949f0248 100644 --- a/tests/Feature/Api/Assets/AssetIndexTest.php +++ b/tests/Feature/Api/Assets/AssetIndexTest.php @@ -32,9 +32,7 @@ class AssetIndexTest extends TestCase public function testAssetApiIndexReturnsDisplayUpcomingAuditsDueToday() { - $assets = Asset::factory()->count(3)->create(['next_audit_date' => Carbon::now()->format('Y-m-d')]); - - //dd($assets); + Asset::factory()->count(3)->create(['next_audit_date' => Carbon::now()->format('Y-m-d')]); $this->assertTrue(Asset::count() === 3); From 9e440527094e31f14e1397e67df379b32a6e9fd3 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 15:46:58 +0100 Subject: [PATCH 38/69] Switch to plural route name for API endpoint Signed-off-by: snipe --- routes/api.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/routes/api.php b/routes/api.php index 082651a7e..06073b4dc 100644 --- a/routes/api.php +++ b/routes/api.php @@ -496,7 +496,7 @@ Route::group(['prefix' => 'v1', 'middleware' => ['api', 'throttle:api']], functi )->name('api.assets.show.byserial') ->where('any', '.*'); - // Get assets that are due or overdue for audit + // LEGACY URL - Get assets that are due or overdue for audit Route::get('audit/{status}', [ Api\AssetsController::class, @@ -504,8 +504,16 @@ Route::group(['prefix' => 'v1', 'middleware' => ['api', 'throttle:api']], functi ] )->name('api.asset.to-audit'); - // Get assets that are due or overdue for checkin - Route::get('checkins/{status}', + // Get assets that are due or overdue for audit + Route::get('audits/{status}', + [ + Api\AssetsController::class, + 'index' + ] + )->name('api.assets.to-audit'); + + // Get assets that are due or overdue for checkin + Route::get('checkins/{status}', [ Api\AssetsController::class, 'index' From de6d71cc3b360188c993c9999ddbb457790dcab7 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 15:47:19 +0100 Subject: [PATCH 39/69] Use plural api endpoints in blades Signed-off-by: snipe --- resources/views/hardware/audit-due.blade.php | 2 +- resources/views/hardware/audit-overdue.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/hardware/audit-due.blade.php b/resources/views/hardware/audit-due.blade.php index 3d3674c15..9c0793ab6 100644 --- a/resources/views/hardware/audit-due.blade.php +++ b/resources/views/hardware/audit-due.blade.php @@ -49,7 +49,7 @@ data-bulk-form-id="#assetsBulkForm" id="assetsAuditListingTable" class="table table-striped snipe-table" - data-url="{{ route('api.asset.to-audit', ['status' => 'due']) }}" + data-url="{{ route('api.assets.to-audit', ['status' => 'due']) }}" data-export-options='{ "fileName": "export-assets-due-audit-{{ date('Y-m-d') }}", "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"] diff --git a/resources/views/hardware/audit-overdue.blade.php b/resources/views/hardware/audit-overdue.blade.php index 1b9aafd46..87ffefe18 100644 --- a/resources/views/hardware/audit-overdue.blade.php +++ b/resources/views/hardware/audit-overdue.blade.php @@ -47,7 +47,7 @@ data-bulk-form-id="#assetsBulkForm" id="assetsAuditListingTable" class="table table-striped snipe-table" - data-url="{{ route('api.asset.to-audit', ['status' => 'overdue']) }}" + data-url="{{ route('api.assets.to-audit', ['status' => 'overdue']) }}" data-export-options='{ "fileName": "export-assets-due-audit-{{ date('Y-m-d') }}", "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"] From fe4dd23d3904b9ad5c5b4cc007ae7af06d0f3d98 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 15:49:12 +0100 Subject: [PATCH 40/69] =?UTF-8?q?Removed=20=E2=80=9Call=E2=80=9D=20text?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: snipe --- resources/views/layouts/default.blade.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 60132b378..5de011ce1 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -459,7 +459,6 @@ - {{ trans('general.all') }} {{ trans('general.deployed') }} {{ (isset($total_deployed_sidebar)) ? $total_deployed_sidebar : '' }} @@ -467,7 +466,6 @@ - {{ trans('general.all') }} {{ trans('general.ready_to_deploy') }} {{ (isset($total_rtd_sidebar)) ? $total_rtd_sidebar : '' }} @@ -475,7 +473,6 @@ - {{ trans('general.all') }} {{ trans('general.pending') }} {{ (isset($total_pending_sidebar)) ? $total_pending_sidebar : '' }} @@ -483,7 +480,6 @@ - {{ trans('general.all') }} {{ trans('general.undeployable') }} {{ (isset($total_undeployable_sidebar)) ? $total_undeployable_sidebar : '' }} @@ -491,7 +487,6 @@ - {{ trans('general.all') }} {{ trans('general.byod') }} {{ (isset($total_byod_sidebar)) ? $total_byod_sidebar : '' }} @@ -499,7 +494,6 @@ - {{ trans('general.all') }} {{ trans('admin/hardware/general.archived') }} {{ (isset($total_archived_sidebar)) ? $total_archived_sidebar : '' }} From 4b4e3badb75a97dfb92a2a04765988b6aaa9efd1 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 18:53:36 +0100 Subject: [PATCH 41/69] Removed hardware audit overdue blade Signed-off-by: snipe --- .../views/hardware/audit-overdue.blade.php | 69 ------------------- 1 file changed, 69 deletions(-) delete mode 100644 resources/views/hardware/audit-overdue.blade.php diff --git a/resources/views/hardware/audit-overdue.blade.php b/resources/views/hardware/audit-overdue.blade.php deleted file mode 100644 index 87ffefe18..000000000 --- a/resources/views/hardware/audit-overdue.blade.php +++ /dev/null @@ -1,69 +0,0 @@ -@extends('layouts/default') - -@section('title0') - - @if ((Request::get('company_id')) && ($company)) - {{ $company->name }} - @endif - - {{ trans('general.audit_overdue') }} - -@stop - -{{-- Page title --}} -@section('title') - @yield('title0') @parent -@stop - - -{{-- Page content --}} -@section('content') - -
-
-
-
- @include('partials.asset-bulk-actions') -
-
- - -
- -
-
- {{ Form::close() }} -
-
-
-
-@stop - -@section('moar_scripts') - @include('partials.bootstrap-table') - -@stop From 6dc9ccffcdd388e50262489d13ab49a42c639f08 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 18:56:57 +0100 Subject: [PATCH 42/69] Refactor api for handling audit/expected checkins Signed-off-by: snipe --- app/Http/Controllers/Api/AssetsController.php | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 47ef7232f..269735be0 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -59,7 +59,7 @@ class AssetsController extends Controller * @since [v4.0] * @return \Illuminate\Http\JsonResponse */ - public function index(Request $request, $audit = null) + public function index(Request $request, $action = null, $upcoming_status = null) { $filter_non_deprecable_assets = false; @@ -155,20 +155,46 @@ class AssetsController extends Controller $assets->TextSearch($request->input('search')); } - // This is used by the audit reporting routes - if (Gate::allows('audit', Asset::class)) { - switch ($audit) { - case 'due': - $assets->DueForAudit($settings); - break; - case 'overdue': - $assets->OverdueForAudit($settings); - break; - case 'duooroverdue': - $assets->DueOrOverdueForAudit($settings); - break; + + /** + * Handle due and overdue audits and checkin dates + */ + switch ($action) { + case 'audits': + + \Log::debug('audits'); + switch ($upcoming_status) { + case 'due': + $assets->DueForAudit($settings); + break; + case 'overdue': + $assets->OverdueForAudit($settings); + break; + case 'due-or-overdue': + $assets->DueOrOverdueForAudit($settings); + break; + } + break; + + case 'checkins': + + switch ($upcoming_status) { + case 'due': + $assets->DueForCheckin($settings); + break; + case 'overdue': + $assets->OverdueForCheckin($settings); + break; + case 'due-or-overdue': + $assets->DueOrOverdueForCheckin($settings); + break; + } + break; } - } + + /** + * End handling due and overdue audits and checkin dates + */ // This is used by the sidenav, mostly From 9167f8a3ba6313e50886b2ec86030962d7d7ffe9 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 18:57:07 +0100 Subject: [PATCH 43/69] Cleaned up tests Signed-off-by: snipe --- tests/Feature/Api/Assets/AssetIndexTest.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/Feature/Api/Assets/AssetIndexTest.php b/tests/Feature/Api/Assets/AssetIndexTest.php index f949f0248..2c6f26071 100644 --- a/tests/Feature/Api/Assets/AssetIndexTest.php +++ b/tests/Feature/Api/Assets/AssetIndexTest.php @@ -30,7 +30,7 @@ class AssetIndexTest extends TestCase ->assertJson(fn(AssertableJson $json) => $json->has('rows', 3)->etc()); } - public function testAssetApiIndexReturnsDisplayUpcomingAuditsDueToday() + public function testAssetApiIndexReturnsDisplayUpcomingAuditsDue() { Asset::factory()->count(3)->create(['next_audit_date' => Carbon::now()->format('Y-m-d')]); @@ -38,14 +38,13 @@ class AssetIndexTest extends TestCase $this->actingAsForApi(User::factory()->superuser()->create()) ->getJson( - route('api.asset.to-audit', ['status' => 'due'])) + route('api.assets.list-upcoming', ['action' => 'audits', 'upcoming_status' => 'due'])) ->assertOk() ->assertJsonStructure([ 'total', 'rows', ]) ->assertJson(fn(AssertableJson $json) => $json->has('rows', 3)->etc()); - } public function testAssetApiIndexReturnsOverdueForAudit() @@ -56,7 +55,7 @@ class AssetIndexTest extends TestCase $this->actingAsForApi(User::factory()->superuser()->create()) ->getJson( - route('api.asset.to-audit', ['status' => 'overdue'])) + route('api.assets.list-upcoming', ['action' => 'audits', 'upcoming_status' => 'overdue'])) ->assertOk() ->assertJsonStructure([ 'total', @@ -66,7 +65,8 @@ class AssetIndexTest extends TestCase } - public function testAssetApiIndexReturnsDueForExpectedCheckinToday() + + public function testAssetApiIndexReturnsDueForExpectedCheckin() { Asset::factory()->count(3)->create(['expected_checkin' => Carbon::now()->format('Y-m-d')]); @@ -74,7 +74,7 @@ class AssetIndexTest extends TestCase $this->actingAsForApi(User::factory()->superuser()->create()) ->getJson( - route('api.asset.to-checkin', ['status' => 'due']) + route('api.assets.list-upcoming', ['action' => 'checkins', 'upcoming_status' => 'due']) ) ->assertOk() ->assertJsonStructure([ @@ -91,7 +91,7 @@ class AssetIndexTest extends TestCase $this->assertTrue(Asset::count() === 3); $this->actingAsForApi(User::factory()->superuser()->create()) - ->getJson(route('api.asset.to-checkin', ['status' => 'overdue'])) + ->getJson(route('api.assets.list-upcoming', ['action' => 'checkins', 'upcoming_status' => 'overdue'])) ->assertOk() ->assertJsonStructure([ 'total', From 651001bf6e992686cc651731c00ccdf5f830acef Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 18:58:15 +0100 Subject: [PATCH 44/69] Removed duplicate routes Signed-off-by: snipe --- routes/web/hardware.php | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/routes/web/hardware.php b/routes/web/hardware.php index d4f289228..7833f0fda 100644 --- a/routes/web/hardware.php +++ b/routes/web/hardware.php @@ -50,26 +50,10 @@ Route::group( [AssetsController::class, 'dueForAudit'] )->name('assets.audit.due'); - Route::get('audit/overdue', - [AssetsController::class, 'overdueForAudit'] - )->name('assets.audit.overdue'); - - Route::get('audit/due', - [AssetsController::class, 'dueForAudit'] - )->name('assets.audit.due'); - - Route::get('audit/overdue', - [AssetsController::class, 'overdueForAudit'] - )->name('assets.audit.overdue'); - - Route::get('audit/due', - [AssetsController::class, 'dueForAudit'] - )->name('assets.audit.due'); - - Route::get('audit/overdue', - [AssetsController::class, 'overdueForAudit'] - )->name('assets.audit.overdue'); - + Route::get('checkins/due', + [AssetsController::class, 'dueForCheckin'] + )->name('assets.checkins.due'); + Route::get('audit/{id}', [AssetsController::class, 'audit'] )->name('asset.audit.create'); From fbe9daace6e73dd2cb2e9ed4952485bb852421b2 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 18:58:29 +0100 Subject: [PATCH 45/69] Use pattern in API route Signed-off-by: snipe --- routes/api.php | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/routes/api.php b/routes/api.php index 06073b4dc..8adb0af61 100644 --- a/routes/api.php +++ b/routes/api.php @@ -504,21 +504,18 @@ Route::group(['prefix' => 'v1', 'middleware' => ['api', 'throttle:api']], functi ] )->name('api.asset.to-audit'); - // Get assets that are due or overdue for audit - Route::get('audits/{status}', - [ - Api\AssetsController::class, - 'index' - ] - )->name('api.assets.to-audit'); - // Get assets that are due or overdue for checkin - Route::get('checkins/{status}', + + // This gets the "due or overdue" API endpoints for audits and checkins + Route::get('{action}/{upcoming_status}', [ Api\AssetsController::class, 'index' ] - )->name('api.asset.to-checkin'); + )->name('api.assets.list-upcoming') + ->where(['action' => 'audits|checkins', 'upcoming_status' => 'due|overdue|due-or-overdue']); + + Route::post('audit', [ From c661d732b342072c4bcf364d6e30bca1833cdd32 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 18:58:44 +0100 Subject: [PATCH 46/69] Refactored sidenav links for audit Signed-off-by: snipe --- resources/views/layouts/default.blade.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 5de011ce1..f7b610881 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -512,12 +512,15 @@ {{ (isset($total_due_for_audit)) ? $total_due_for_audit : '' }} - - - {{ trans('general.audit_overdue') }} - {{ (isset($total_overdue_for_audit)) ? $total_overdue_for_audit : '' }} - - + @endcan + + @can('checkin', \App\Models\Asset::class) + + + {{ trans('general.checkin_due') }} + {{ (isset($total_overdue_for_checkin)) ? $total_overdue_for_checkin : '' }} + + @endcan
  •  
  • From 9c8411c7ff4bc51e3b1c4dbf0d494db832538ee3 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 18:58:56 +0100 Subject: [PATCH 47/69] Added checkin due blade Signed-off-by: snipe --- .../views/hardware/checkin-due.blade.php | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 resources/views/hardware/checkin-due.blade.php diff --git a/resources/views/hardware/checkin-due.blade.php b/resources/views/hardware/checkin-due.blade.php new file mode 100644 index 000000000..f8c9fdd96 --- /dev/null +++ b/resources/views/hardware/checkin-due.blade.php @@ -0,0 +1,142 @@ +@extends('layouts/default') + +@section('title0') + + @if ((Request::get('company_id')) && ($company)) + {{ $company->name }} + @endif + + {{ trans_choice('general.checkin_due_days', $settings->audit_warning_days, ['days' => $settings->audit_warning_days]) }} + +@stop + +{{-- Page title --}} +@section('title') + @yield('title0') @parent +@stop + + +{{-- Page content --}} +@section('content') + {{-- Page content --}} +
    +
    + + + + +
    +
    + +@stop + +@section('moar_scripts') + @include('partials.bootstrap-table') +@stop From 76129e90118a6fedf8c2c68e4709e3781df8808b Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 18:59:13 +0100 Subject: [PATCH 48/69] Use trans_choice for title Signed-off-by: snipe --- resources/views/hardware/audit-due.blade.php | 109 +++++++++++++++---- 1 file changed, 90 insertions(+), 19 deletions(-) diff --git a/resources/views/hardware/audit-due.blade.php b/resources/views/hardware/audit-due.blade.php index 9c0793ab6..ccc62ae49 100644 --- a/resources/views/hardware/audit-due.blade.php +++ b/resources/views/hardware/audit-due.blade.php @@ -6,7 +6,7 @@ {{ $company->name }} @endif - {{ trans('general.audit_due_days', ['days' => $settings->audit_warning_days]) }} + {{ trans_choice('general.audit_due_days', $settings->audit_warning_days, ['days' => $settings->audit_warning_days]) }} @stop @@ -18,23 +18,51 @@ {{-- Page content --}} @section('content') - + {{-- Page content --}}
    -
    -
    - @include('partials.asset-bulk-actions') + +
    - {{ Form::close() }} -
    -
    - - + @stop @section('moar_scripts') @include('partials.bootstrap-table') - @stop From d40604b574d6ce214cdcc72ca2393afa70a50b0f Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 19:01:05 +0100 Subject: [PATCH 49/69] Removed debugging, added date cast Signed-off-by: snipe --- app/Models/Asset.php | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/app/Models/Asset.php b/app/Models/Asset.php index dd89efeda..a6502d53d 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -74,9 +74,9 @@ class Asset extends Depreciable 'eol_explicit' => 'boolean', 'last_checkout' => 'datetime', 'last_checkin' => 'datetime', - 'expected_checkin' => 'date', + 'expected_checkin' => 'datetime:m-d-Y', 'last_audit_date' => 'datetime', - 'next_audit_date' => 'date', + 'next_audit_date' => 'datetime:m-d-Y', 'model_id' => 'integer', 'status_id' => 'integer', 'company_id' => 'integer', @@ -1166,10 +1166,6 @@ class Asset extends Depreciable $today = Carbon::now(); $interval_date = $today->copy()->addDays($interval)->format('Y-m-d'); - \Log::debug($interval); - \Log::debug($today); - \Log::debug($interval_date); - return $query->whereNotNull('assets.next_audit_date') ->whereBetween('assets.next_audit_date', [$today->format('Y-m-d'), $interval_date]) ->where('assets.archived', '=', 0) @@ -1233,6 +1229,26 @@ class Asset extends Depreciable * @return \Illuminate\Database\Query\Builder Modified query builder */ + public function scopeDueForCheckinToday($query) + { + return $query->whereNotNull('assets.expected_checkin') + ->where('assets.expected_checkin', '=', Carbon::now()->format('Y-m-d')) + ->where('assets.archived', '=', 0) + ->NotArchived(); + } + + public function scopeDueForCheckin($query, $settings) + { + $interval = $settings->audit_warning_days ?? 0; + $today = Carbon::now(); + $interval_date = $today->copy()->addDays($interval)->format('Y-m-d'); + + return $query->whereNotNull('assets.expected_checkin') + ->whereBetween('assets.expected_checkin', [$today->format('Y-m-d'), $interval_date]) + ->where('assets.archived', '=', 0) + ->NotArchived(); + } + public function scopeOverdueForCheckin($query) { return $query->whereNotNull('assets.expected_checkin') @@ -1254,7 +1270,7 @@ class Asset extends Depreciable { return $query->whereNotNull('assets.expected_checkin') - ->where('assets.expected_checkin', '<', Carbon::now()->format('Y-m-d')) + ->where('assets.expected_checkin', '<=', Carbon::now()->format('Y-m-d')) ->where('assets.archived', '=', 0) ->NotArchived(); } From 2117f61e8c04c0d81579932903a7ef9141da8916 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 19:01:15 +0100 Subject: [PATCH 50/69] More view sharing for sidebar Signed-off-by: snipe --- app/Http/Middleware/AssetCountForSidebar.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/Http/Middleware/AssetCountForSidebar.php b/app/Http/Middleware/AssetCountForSidebar.php index 0088f9387..a0b14f8a0 100644 --- a/app/Http/Middleware/AssetCountForSidebar.php +++ b/app/Http/Middleware/AssetCountForSidebar.php @@ -88,6 +88,20 @@ class AssetCountForSidebar \Log::debug($e); } + try { + $total_due_for_checkin = Asset::DueForCheckin($settings)->count(); + view()->share('total_due_for_checkin', $total_due_for_checkin); + } catch (\Exception $e) { + \Log::debug($e); + } + + try { + $total_overdue_for_checkin = Asset::OverdueForCheckin($settings)->count(); + view()->share('total_overdue_for_checkin', $total_overdue_for_checkin); + } catch (\Exception $e) { + \Log::debug($e); + } + return $next($request); } } From 3f04afee5c6979f7c8a55e90d80f56f221930752 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 19:01:26 +0100 Subject: [PATCH 51/69] Removed unused method Signed-off-by: snipe --- app/Http/Controllers/Assets/AssetsController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 6054718e6..ac755fd38 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -854,11 +854,11 @@ class AssetsController extends Controller return view('hardware/audit-due'); } - public function overdueForAudit() + public function dueForCheckin() { - $this->authorize('audit', Asset::class); + $this->authorize('checkin', Asset::class); - return view('hardware/audit-overdue'); + return view('hardware/checkin-due'); } From 8356b57fb4523d8425884e95d6b9f674bc062659 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 19:01:34 +0100 Subject: [PATCH 52/69] Added translations Signed-off-by: snipe --- resources/lang/en-US/general.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index f5eb125d5..0b6f61339 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -313,7 +313,10 @@ return [ 'token_expired' => 'Your form session has expired. Please try again.', 'login_enabled' => 'Login Enabled', 'audit_due' => 'Due for Audit', - 'audit_due_days' => 'Assets Due for Audit Within :days Days', + 'audit_due_days' => 'Assets Due for Audit Within :days Day|Assets Due for Audit Within :days Days', + 'checkin_due' => 'Due for Checkin', + 'checkin_overdue' => 'Overdue for Checkin', + 'checkin_due_days' => 'Assets Due for Checkin Within :days Day|Assets Due for Checkin Within :days Days', 'audit_overdue' => 'Overdue for Audit', 'accept' => 'Accept :asset', 'i_accept' => 'I accept', From 87de67e4a96cd61e1ccb23a68951f36226efe8b8 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 19:06:26 +0100 Subject: [PATCH 53/69] Fixed test for checkin Signed-off-by: snipe --- tests/Feature/Api/Assets/AssetIndexTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Feature/Api/Assets/AssetIndexTest.php b/tests/Feature/Api/Assets/AssetIndexTest.php index 2c6f26071..961ba7f4b 100644 --- a/tests/Feature/Api/Assets/AssetIndexTest.php +++ b/tests/Feature/Api/Assets/AssetIndexTest.php @@ -68,7 +68,7 @@ class AssetIndexTest extends TestCase public function testAssetApiIndexReturnsDueForExpectedCheckin() { - Asset::factory()->count(3)->create(['expected_checkin' => Carbon::now()->format('Y-m-d')]); + Asset::factory()->count(3)->create(['assigned_to' => '1', 'expected_checkin' => Carbon::now()->format('Y-m-d')]); $this->assertTrue(Asset::count() === 3); @@ -86,7 +86,7 @@ class AssetIndexTest extends TestCase public function testAssetApiIndexReturnsOverdueForExpectedCheckin() { - Asset::factory()->count(3)->create(['expected_checkin' => Carbon::now()->subDays(1)->format('Y-m-d')]); + Asset::factory()->count(3)->create(['assigned_to' => '1', 'expected_checkin' => Carbon::now()->subDays(1)->format('Y-m-d')]); $this->assertTrue(Asset::count() === 3); From 52d6a8990af4cca2fac685cef42d11b5b6717ac0 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 19:06:46 +0100 Subject: [PATCH 54/69] Check that the asset is not already checked in Signed-off-by: snipe --- app/Models/Asset.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Models/Asset.php b/app/Models/Asset.php index a6502d53d..98f3dcc06 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -1246,6 +1246,7 @@ class Asset extends Depreciable return $query->whereNotNull('assets.expected_checkin') ->whereBetween('assets.expected_checkin', [$today->format('Y-m-d'), $interval_date]) ->where('assets.archived', '=', 0) + ->whereNotNull('assets.assigned_to') ->NotArchived(); } @@ -1254,6 +1255,7 @@ class Asset extends Depreciable return $query->whereNotNull('assets.expected_checkin') ->where('assets.expected_checkin', '<', Carbon::now()->format('Y-m-d')) ->where('assets.archived', '=', 0) + ->whereNotNull('assets.assigned_to') ->NotArchived(); } @@ -1272,6 +1274,7 @@ class Asset extends Depreciable return $query->whereNotNull('assets.expected_checkin') ->where('assets.expected_checkin', '<=', Carbon::now()->format('Y-m-d')) ->where('assets.archived', '=', 0) + ->whereNotNull('assets.assigned_to') ->NotArchived(); } From 860764a436052f443caec9a59e1dae79d034f662 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 19:12:21 +0100 Subject: [PATCH 55/69] Use totals for sidebar Signed-off-by: snipe --- app/Http/Middleware/AssetCountForSidebar.php | 3 +++ resources/views/layouts/default.blade.php | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Http/Middleware/AssetCountForSidebar.php b/app/Http/Middleware/AssetCountForSidebar.php index a0b14f8a0..f55b72e0d 100644 --- a/app/Http/Middleware/AssetCountForSidebar.php +++ b/app/Http/Middleware/AssetCountForSidebar.php @@ -102,6 +102,9 @@ class AssetCountForSidebar \Log::debug($e); } + view()->share('total_due_and_overdue_for_checkin', ($total_due_for_checkin + $total_overdue_for_checkin)); + view()->share('total_due_and_overdue_for_audit', ($total_due_for_audit + $total_overdue_for_audit)); + return $next($request); } } diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index f7b610881..25f45cbd0 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -509,7 +509,7 @@ {{ trans('general.audit_due') }} - {{ (isset($total_due_for_audit)) ? $total_due_for_audit : '' }} + {{ (isset($total_due_and_overdue_for_audit)) ? $total_due_and_overdue_for_audit : '' }} @endcan @@ -518,7 +518,7 @@ {{ trans('general.checkin_due') }} - {{ (isset($total_overdue_for_checkin)) ? $total_overdue_for_checkin : '' }} + {{ (isset($total_due_and_overdue_for_checkin)) ? $total_due_and_overdue_for_checkin : '' }} @endcan From 50d8b02f8b847e4e5235b2e178dc6f5107016d8c Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 19:23:27 +0100 Subject: [PATCH 56/69] Removed unused scope Signed-off-by: snipe --- app/Models/Asset.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/app/Models/Asset.php b/app/Models/Asset.php index 98f3dcc06..b3972b1c8 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -1221,22 +1221,14 @@ class Asset extends Depreciable /** - * Query builder scope for Assets that are OVERDUE for checkin, based on the assets.next_audit_date - * and settings.audit_warning_days. It checks to see if assets.expected_checkin is before now + * Query builder scope for Assets that are DUE for checkin, based on the assets.expected_checkin + * and settings.audit_warning_days. It checks to see if assets.expected_checkin is now * * @author A. Gianotto * @since v6.4.0 * @return \Illuminate\Database\Query\Builder Modified query builder */ - public function scopeDueForCheckinToday($query) - { - return $query->whereNotNull('assets.expected_checkin') - ->where('assets.expected_checkin', '=', Carbon::now()->format('Y-m-d')) - ->where('assets.archived', '=', 0) - ->NotArchived(); - } - public function scopeDueForCheckin($query, $settings) { $interval = $settings->audit_warning_days ?? 0; From fc61a4b88d83b50e5fb2cddf90d7477a24665f44 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 19:50:58 +0100 Subject: [PATCH 57/69] Fixed badge HTML Signed-off-by: snipe --- resources/views/hardware/audit-due.blade.php | 4 ++-- resources/views/hardware/checkin-due.blade.php | 4 ++-- resources/views/hardware/view.blade.php | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/resources/views/hardware/audit-due.blade.php b/resources/views/hardware/audit-due.blade.php index ccc62ae49..58a944e4a 100644 --- a/resources/views/hardware/audit-due.blade.php +++ b/resources/views/hardware/audit-due.blade.php @@ -31,7 +31,7 @@ - {{ (isset($total_due_for_audit)) ? $total_due_for_audit : '' }} + {{ (isset($total_due_for_audit)) ? $total_due_for_audit : '' }}
  • @@ -39,7 +39,7 @@ - {{ (isset($total_overdue_for_audit)) ? $total_overdue_for_audit : '' }} + {{ (isset($total_overdue_for_audit)) ? $total_overdue_for_audit : '' }}
  • diff --git a/resources/views/hardware/checkin-due.blade.php b/resources/views/hardware/checkin-due.blade.php index f8c9fdd96..d764a5178 100644 --- a/resources/views/hardware/checkin-due.blade.php +++ b/resources/views/hardware/checkin-due.blade.php @@ -31,7 +31,7 @@ - {{ (isset($total_due_for_checkin)) ? $total_due_for_checkin : '' }} + {{ (isset($total_due_for_checkin)) ? $total_due_for_checkin : '' }}
  • @@ -39,7 +39,7 @@ - {{ (isset($total_overdue_for_checkin)) ? $total_overdue_for_checkin : '' }} + {{ (isset($total_overdue_for_checkin)) ? $total_overdue_for_checkin : '' }}
  • diff --git a/resources/views/hardware/view.blade.php b/resources/views/hardware/view.blade.php index a83b006c5..dfb151393 100755 --- a/resources/views/hardware/view.blade.php +++ b/resources/views/hardware/view.blade.php @@ -51,7 +51,7 @@ @@ -62,7 +62,7 @@ @@ -73,7 +73,7 @@ @@ -96,7 +96,7 @@ @@ -107,7 +107,7 @@ @@ -119,7 +119,7 @@ From 494ec5cd9c6aa4fed84b4328c2d2351b565ae719 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 20:59:04 +0100 Subject: [PATCH 58/69] Added tests for due-or-overdue Signed-off-by: snipe --- tests/Feature/Api/Assets/AssetIndexTest.php | 36 +++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/Feature/Api/Assets/AssetIndexTest.php b/tests/Feature/Api/Assets/AssetIndexTest.php index 961ba7f4b..b53fb02fd 100644 --- a/tests/Feature/Api/Assets/AssetIndexTest.php +++ b/tests/Feature/Api/Assets/AssetIndexTest.php @@ -65,6 +65,25 @@ class AssetIndexTest extends TestCase } + public function testAssetApiIndexReturnsDueOrOverdueForAudit() + { + Asset::factory()->count(3)->create(['next_audit_date' => Carbon::now()->format('Y-m-d')]); + Asset::factory()->count(2)->create(['next_audit_date' => Carbon::now()->subDays(1)->format('Y-m-d')]); + + $this->assertTrue(Asset::count() === 5); + + $this->actingAsForApi(User::factory()->superuser()->create()) + ->getJson( + route('api.assets.list-upcoming', ['action' => 'audits', 'upcoming_status' => 'due-or-overdue'])) + ->assertOk() + ->assertJsonStructure([ + 'total', + 'rows', + ]) + ->assertJson(fn(AssertableJson $json) => $json->has('rows', 5)->etc()); + } + + public function testAssetApiIndexReturnsDueForExpectedCheckin() { @@ -100,6 +119,23 @@ class AssetIndexTest extends TestCase ->assertJson(fn(AssertableJson $json) => $json->has('rows', 3)->etc()); } + public function testAssetApiIndexReturnsDueOrOverdueForExpectedCheckin() + { + Asset::factory()->count(3)->create(['assigned_to' => '1', 'expected_checkin' => Carbon::now()->subDays(1)->format('Y-m-d')]); + Asset::factory()->count(2)->create(['assigned_to' => '1', 'expected_checkin' => Carbon::now()->format('Y-m-d')]); + + $this->assertTrue(Asset::count() === 5); + + $this->actingAsForApi(User::factory()->superuser()->create()) + ->getJson(route('api.assets.list-upcoming', ['action' => 'checkins', 'upcoming_status' => 'due-or-overdue'])) + ->assertOk() + ->assertJsonStructure([ + 'total', + 'rows', + ]) + ->assertJson(fn(AssertableJson $json) => $json->has('rows', 5)->etc()); + } + public function testAssetApiIndexAdheresToCompanyScoping() { [$companyA, $companyB] = Company::factory()->count(2)->create(); From bfd0530597ad3e4869e89523f2b6dce5affb1a44 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 20:59:13 +0100 Subject: [PATCH 59/69] Fixed notification Signed-off-by: snipe --- .../notifications/markdown/report-expected-checkins.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/notifications/markdown/report-expected-checkins.blade.php b/resources/views/notifications/markdown/report-expected-checkins.blade.php index 3715188d4..08b81350e 100644 --- a/resources/views/notifications/markdown/report-expected-checkins.blade.php +++ b/resources/views/notifications/markdown/report-expected-checkins.blade.php @@ -10,7 +10,7 @@ @php $checkin = Helper::getFormattedDateObject($asset->expected_checkin, 'date'); @endphp -| [{{ $asset->present()->name }}]({{ route('hardware.show', ['hardware' => $asset->id]) }}) | [{{ $asset->assigned->present()->fullName }}]({{ route($asset->targetShowRoute().'.show', [$asset->assigned->id]) }}) | {{ $checkin['formatted'] }} +| [{{ $asset->present()->name }}]({{ route('hardware.show', ['hardware' => $asset->id]) }}) | [{{ $asset->assignedTo->present()->fullName }}]({{ route($asset->targetShowRoute().'.show', [$asset->assignedTo->id]) }}) | {{ $checkin['formatted'] }} @endforeach @endcomponent From 839db8ef4479f953bf51d7111440b214bf59b2f0 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 20:59:27 +0100 Subject: [PATCH 60/69] Refactored due-or-overdue methods Signed-off-by: snipe --- app/Models/Asset.php | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/app/Models/Asset.php b/app/Models/Asset.php index b3972b1c8..a700a0f36 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -1211,12 +1211,11 @@ class Asset extends Depreciable public function scopeDueOrOverdueForAudit($query, $settings) { - $interval = $settings->audit_warning_days ?? 0; - $today = Carbon::now(); - $interval_date = $today->copy()->addDays($interval); - - return $query->whereNotNull('assets.next_audit_date') - ->where('assets.next_audit_date', '<=', $interval_date); + return $query->where(function ($query) { + $query->OverdueForAudit(); + })->orWhere(function ($query) use ($settings) { + $query->DueForAudit($settings); + }); } @@ -1252,8 +1251,7 @@ class Asset extends Depreciable } /** - * Query builder scope for Assets that are due for checkin OR overdue, based on the assets.next_audit_date - * and settings.audit_warning_days. + * Query builder scope for Assets that are due for checkin OR overdue * * @author A. Gianotto * @since v6.4.0 @@ -1262,12 +1260,11 @@ class Asset extends Depreciable public function scopeDueOrOverdueForCheckin($query, $settings) { - - return $query->whereNotNull('assets.expected_checkin') - ->where('assets.expected_checkin', '<=', Carbon::now()->format('Y-m-d')) - ->where('assets.archived', '=', 0) - ->whereNotNull('assets.assigned_to') - ->NotArchived(); + return $query->where(function ($query) { + $query->OverdueForCheckin(); + })->orWhere(function ($query) use ($settings) { + $query->DueForCheckin($settings); + }); } From a398496dd44e9a98feb5e668078f96a93ae968d8 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 21:01:27 +0100 Subject: [PATCH 61/69] Added comments Signed-off-by: snipe --- app/Models/Asset.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/Models/Asset.php b/app/Models/Asset.php index a700a0f36..c5373a04e 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -1241,6 +1241,13 @@ class Asset extends Depreciable ->NotArchived(); } + /** + * Query builder scope for Assets that are overdue for checkin OR overdue + * + * @author A. Gianotto + * @since v6.4.0 + * @return \Illuminate\Database\Query\Builder Modified query builder + */ public function scopeOverdueForCheckin($query) { return $query->whereNotNull('assets.expected_checkin') @@ -1257,7 +1264,6 @@ class Asset extends Depreciable * @since v6.4.0 * @return \Illuminate\Database\Query\Builder Modified query builder */ - public function scopeDueOrOverdueForCheckin($query, $settings) { return $query->where(function ($query) { From 103809b65f1c59c999cb36e6a687ba1397a9cd55 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 21:01:43 +0100 Subject: [PATCH 62/69] Removed debugging Signed-off-by: snipe --- app/Http/Controllers/Api/AssetsController.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 269735be0..2556b483c 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -162,7 +162,6 @@ class AssetsController extends Controller switch ($action) { case 'audits': - \Log::debug('audits'); switch ($upcoming_status) { case 'due': $assets->DueForAudit($settings); @@ -177,13 +176,12 @@ class AssetsController extends Controller break; case 'checkins': - switch ($upcoming_status) { case 'due': $assets->DueForCheckin($settings); break; case 'overdue': - $assets->OverdueForCheckin($settings); + $assets->OverdueForCheckin(); break; case 'due-or-overdue': $assets->DueOrOverdueForCheckin($settings); From fe147adec3775381de15ad8554012b328cc56962 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 21:10:54 +0100 Subject: [PATCH 63/69] Refactor checkin alert Signed-off-by: snipe --- .../Commands/SendExpectedCheckinAlerts.php | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/app/Console/Commands/SendExpectedCheckinAlerts.php b/app/Console/Commands/SendExpectedCheckinAlerts.php index 34e9609ce..409d3de3e 100644 --- a/app/Console/Commands/SendExpectedCheckinAlerts.php +++ b/app/Console/Commands/SendExpectedCheckinAlerts.php @@ -42,26 +42,32 @@ class SendExpectedCheckinAlerts extends Command */ public function handle() { - $settings = Setting::getSettings(); - $whenNotify = Carbon::now(); - $assets = Asset::with('assignedTo')->whereNotNull('assigned_to')->whereNotNull('expected_checkin')->where('expected_checkin', '<=', $whenNotify)->get(); + $interval = $settings->audit_warning_days ?? 0; + $today = Carbon::now(); + $interval_date = $today->copy()->addDays($interval); + + $settings = Setting::getSettings(); + $assets = Asset::whereNull('deleted_at')->DueOrOverdueForCheckin($settings)->orderBy('assets.expected_checkin', 'desc')->get(); + + $this->info($assets->count().' assets must be checked in on or before '.$interval_date.' is deadline'); - $this->info($whenNotify.' is deadline'); - $this->info($assets->count().' assets'); foreach ($assets as $asset) { - if ($asset->assigned && $asset->checkedOutToUser()) { - Log::info('Sending ExpectedCheckinNotification to ' . $asset->assigned->email); - $asset->assigned->notify((new ExpectedCheckinNotification($asset))); + if ($asset->assignedTo && (isset($asset->assignedTo->email)) && ($asset->assignedTo->email!='') && $asset->checkedOutToUser()) { + $this->info('Sending User ExpectedCheckinNotification to: '.$asset->assignedTo->email); + $asset->assignedTo->notify((new ExpectedCheckinNotification($asset))); } } if (($assets) && ($assets->count() > 0) && ($settings->alert_email != '')) { // Send a rollup to the admin, if settings dictate - $recipients = collect(explode(',', $settings->alert_email))->map(function ($item, $key) { + $recipients = collect(explode(',', $settings->alert_email))->map(function ($item) { return new AlertRecipient($item); }); + + $this->info('Sending Admin ExpectedCheckinNotification to: '.$recipients); \Notification::send($recipients, new ExpectedCheckinAdminNotification($assets)); + } } } From 848e1fe1f66227dc54a75eb803d9d33b9e956184 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 26 Apr 2024 21:26:00 +0100 Subject: [PATCH 64/69] Refactored audit alerts Signed-off-by: snipe --- .../Commands/SendExpectedCheckinAlerts.php | 3 +- .../Commands/SendUpcomingAuditReport.php | 44 ++++++------------- 2 files changed, 15 insertions(+), 32 deletions(-) diff --git a/app/Console/Commands/SendExpectedCheckinAlerts.php b/app/Console/Commands/SendExpectedCheckinAlerts.php index 409d3de3e..665dca4df 100644 --- a/app/Console/Commands/SendExpectedCheckinAlerts.php +++ b/app/Console/Commands/SendExpectedCheckinAlerts.php @@ -9,7 +9,6 @@ use App\Notifications\ExpectedCheckinAdminNotification; use App\Notifications\ExpectedCheckinNotification; use Carbon\Carbon; use Illuminate\Console\Command; -use Illuminate\Support\Facades\Log; class SendExpectedCheckinAlerts extends Command { @@ -65,7 +64,7 @@ class SendExpectedCheckinAlerts extends Command return new AlertRecipient($item); }); - $this->info('Sending Admin ExpectedCheckinNotification to: '.$recipients); + $this->info('Sending Admin ExpectedCheckinNotification to: '.$settings->alert_email); \Notification::send($recipients, new ExpectedCheckinAdminNotification($assets)); } diff --git a/app/Console/Commands/SendUpcomingAuditReport.php b/app/Console/Commands/SendUpcomingAuditReport.php index e9cba106c..fc06785cf 100644 --- a/app/Console/Commands/SendUpcomingAuditReport.php +++ b/app/Console/Commands/SendUpcomingAuditReport.php @@ -3,10 +3,8 @@ namespace App\Console\Commands; use App\Models\Asset; -use App\Models\License; -use App\Models\Recipients; +use App\Models\Recipients\AlertRecipient; use App\Models\Setting; -use App\Notifications\ExpiringAssetsNotification; use App\Notifications\SendUpcomingAuditNotification; use Carbon\Carbon; use DB; @@ -45,40 +43,26 @@ class SendUpcomingAuditReport extends Command */ public function handle() { + + $interval = $settings->audit_warning_days ?? 0; + $today = Carbon::now(); + $interval_date = $today->copy()->addDays($interval); + $settings = Setting::getSettings(); + $assets = Asset::whereNull('deleted_at')->DueOrOverdueForAudit($settings)->orderBy('assets.next_audit_date', 'desc')->get(); + $this->info($assets->count().' assets must be audited in on or before '.$interval_date.' is deadline'); - if (($settings->alert_email != '') && ($settings->audit_warning_days) && ($settings->alerts_enabled == 1)) { + if (($assets) && ($assets->count() > 0) && ($settings->alert_email != '')) { // Send a rollup to the admin, if settings dictate - $recipients = collect(explode(',', $settings->alert_email))->map(function ($item, $key) { - return new \App\Models\Recipients\AlertRecipient($item); + $recipients = collect(explode(',', $settings->alert_email))->map(function ($item) { + return new AlertRecipient($item); }); - // Assets due for auditing + $this->info('Sending Admin SendUpcomingAuditNotification to: '.$settings->alert_email); + \Notification::send($recipients, new SendUpcomingAuditNotification($assets, $settings->audit_warning_days)); - $assets = Asset::whereNotNull('next_audit_date') - ->DueOrOverdueForAudit($settings) - ->orderBy('last_audit_date', 'asc')->get(); - - if ($assets->count() > 0) { - $this->info(trans_choice('mail.upcoming-audits', $assets->count(), - ['count' => $assets->count(), 'threshold' => $settings->audit_warning_days])); - \Notification::send($recipients, new SendUpcomingAuditNotification($assets, $settings->audit_warning_days)); - $this->info('Audit report sent to '.$settings->alert_email); - } else { - $this->info('No assets to be audited. No report sent.'); - } - } elseif ($settings->alert_email == '') { - $this->error('Could not send email. No alert email configured in settings'); - } elseif (! $settings->audit_warning_days) { - $this->error('No audit warning days set in Admin Notifications. No mail will be sent.'); - } elseif ($settings->alerts_enabled != 1) { - $this->info('Alerts are disabled in the settings. No mail will be sent'); - } else { - $this->error('Something went wrong. :( '); - $this->error('Admin Notifications Email Setting: '.$settings->alert_email); - $this->error('Admin Audit Warning Setting: '.$settings->audit_warning_days); - $this->error('Admin Alerts Emnabled: '.$settings->alerts_enabled); } + } } From 53cadf80fa64a669548dbbd3f275154316dc6524 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 2 May 2024 12:24:31 +0100 Subject: [PATCH 65/69] Removed assertions for factories Signed-off-by: snipe --- tests/Feature/Api/Assets/AssetIndexTest.php | 23 ++++++--------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/tests/Feature/Api/Assets/AssetIndexTest.php b/tests/Feature/Api/Assets/AssetIndexTest.php index b53fb02fd..0a21e13f2 100644 --- a/tests/Feature/Api/Assets/AssetIndexTest.php +++ b/tests/Feature/Api/Assets/AssetIndexTest.php @@ -7,7 +7,7 @@ use App\Models\Company; use App\Models\User; use Illuminate\Testing\Fluent\AssertableJson; use Tests\TestCase; -use Carbon; +use Carbon\Carbon; class AssetIndexTest extends TestCase { public function testAssetApiIndexReturnsExpectedAssets() @@ -34,7 +34,6 @@ class AssetIndexTest extends TestCase { Asset::factory()->count(3)->create(['next_audit_date' => Carbon::now()->format('Y-m-d')]); - $this->assertTrue(Asset::count() === 3); $this->actingAsForApi(User::factory()->superuser()->create()) ->getJson( @@ -50,9 +49,7 @@ class AssetIndexTest extends TestCase public function testAssetApiIndexReturnsOverdueForAudit() { Asset::factory()->count(3)->create(['next_audit_date' => Carbon::now()->subDays(1)->format('Y-m-d')]); - - $this->assertTrue(Asset::count() === 3); - + $this->actingAsForApi(User::factory()->superuser()->create()) ->getJson( route('api.assets.list-upcoming', ['action' => 'audits', 'upcoming_status' => 'overdue'])) @@ -69,9 +66,7 @@ class AssetIndexTest extends TestCase { Asset::factory()->count(3)->create(['next_audit_date' => Carbon::now()->format('Y-m-d')]); Asset::factory()->count(2)->create(['next_audit_date' => Carbon::now()->subDays(1)->format('Y-m-d')]); - - $this->assertTrue(Asset::count() === 5); - + $this->actingAsForApi(User::factory()->superuser()->create()) ->getJson( route('api.assets.list-upcoming', ['action' => 'audits', 'upcoming_status' => 'due-or-overdue'])) @@ -88,9 +83,7 @@ class AssetIndexTest extends TestCase public function testAssetApiIndexReturnsDueForExpectedCheckin() { Asset::factory()->count(3)->create(['assigned_to' => '1', 'expected_checkin' => Carbon::now()->format('Y-m-d')]); - - $this->assertTrue(Asset::count() === 3); - + $this->actingAsForApi(User::factory()->superuser()->create()) ->getJson( route('api.assets.list-upcoming', ['action' => 'checkins', 'upcoming_status' => 'due']) @@ -106,9 +99,7 @@ class AssetIndexTest extends TestCase public function testAssetApiIndexReturnsOverdueForExpectedCheckin() { Asset::factory()->count(3)->create(['assigned_to' => '1', 'expected_checkin' => Carbon::now()->subDays(1)->format('Y-m-d')]); - - $this->assertTrue(Asset::count() === 3); - + $this->actingAsForApi(User::factory()->superuser()->create()) ->getJson(route('api.assets.list-upcoming', ['action' => 'checkins', 'upcoming_status' => 'overdue'])) ->assertOk() @@ -123,9 +114,7 @@ class AssetIndexTest extends TestCase { Asset::factory()->count(3)->create(['assigned_to' => '1', 'expected_checkin' => Carbon::now()->subDays(1)->format('Y-m-d')]); Asset::factory()->count(2)->create(['assigned_to' => '1', 'expected_checkin' => Carbon::now()->format('Y-m-d')]); - - $this->assertTrue(Asset::count() === 5); - + $this->actingAsForApi(User::factory()->superuser()->create()) ->getJson(route('api.assets.list-upcoming', ['action' => 'checkins', 'upcoming_status' => 'due-or-overdue'])) ->assertOk() From 8c65880504cfad92cf176a2acfed1b461c47df41 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 2 May 2024 12:35:41 +0100 Subject: [PATCH 66/69] Changed badge to span in default blade Signed-off-by: snipe --- resources/views/layouts/default.blade.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 25f45cbd0..c22118161 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -437,9 +437,9 @@ {{ trans('general.list_all') }} - + {{ (isset($total_assets)) ? $total_assets : '' }} - + @@ -451,7 +451,7 @@ {{ $status_nav->name }} - {{ $status_nav->asset_count }}) + {{ $status_nav->asset_count }}) @endforeach @endif @@ -460,42 +460,42 @@ {{ trans('general.deployed') }} - {{ (isset($total_deployed_sidebar)) ? $total_deployed_sidebar : '' }} + {{ (isset($total_deployed_sidebar)) ? $total_deployed_sidebar : '' }} {{ trans('general.ready_to_deploy') }} - {{ (isset($total_rtd_sidebar)) ? $total_rtd_sidebar : '' }} + {{ (isset($total_rtd_sidebar)) ? $total_rtd_sidebar : '' }} {{ trans('general.pending') }} - {{ (isset($total_pending_sidebar)) ? $total_pending_sidebar : '' }} + {{ (isset($total_pending_sidebar)) ? $total_pending_sidebar : '' }} {{ trans('general.undeployable') }} - {{ (isset($total_undeployable_sidebar)) ? $total_undeployable_sidebar : '' }} + {{ (isset($total_undeployable_sidebar)) ? $total_undeployable_sidebar : '' }} {{ trans('general.byod') }} - {{ (isset($total_byod_sidebar)) ? $total_byod_sidebar : '' }} + {{ (isset($total_byod_sidebar)) ? $total_byod_sidebar : '' }} {{ trans('admin/hardware/general.archived') }} - {{ (isset($total_archived_sidebar)) ? $total_archived_sidebar : '' }} + {{ (isset($total_archived_sidebar)) ? $total_archived_sidebar : '' }} {{ trans('general.audit_due') }} - {{ (isset($total_due_and_overdue_for_audit)) ? $total_due_and_overdue_for_audit : '' }} + {{ (isset($total_due_and_overdue_for_audit)) ? $total_due_and_overdue_for_audit : '' }} @endcan @@ -518,7 +518,7 @@ {{ trans('general.checkin_due') }} - {{ (isset($total_due_and_overdue_for_checkin)) ? $total_due_and_overdue_for_checkin : '' }} + {{ (isset($total_due_and_overdue_for_checkin)) ? $total_due_and_overdue_for_checkin : '' }} @endcan From f893b2312942d7e85e26d79f9794849a18d9d2e8 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 2 May 2024 12:35:52 +0100 Subject: [PATCH 67/69] Refactored title blade areas Signed-off-by: snipe --- resources/views/hardware/audit-due.blade.php | 13 ++----------- resources/views/hardware/checkin-due.blade.php | 13 +------------ 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/resources/views/hardware/audit-due.blade.php b/resources/views/hardware/audit-due.blade.php index 58a944e4a..0ee17ec23 100644 --- a/resources/views/hardware/audit-due.blade.php +++ b/resources/views/hardware/audit-due.blade.php @@ -1,21 +1,12 @@ @extends('layouts/default') -@section('title0') - - @if ((Request::get('company_id')) && ($company)) - {{ $company->name }} - @endif - - {{ trans_choice('general.audit_due_days', $settings->audit_warning_days, ['days' => $settings->audit_warning_days]) }} - -@stop - {{-- Page title --}} @section('title') - @yield('title0') @parent + {{ trans_choice('general.audit_due_days', $settings->audit_warning_days, ['days' => $settings->audit_warning_days]) }} @stop + {{-- Page content --}} @section('content') {{-- Page content --}} diff --git a/resources/views/hardware/checkin-due.blade.php b/resources/views/hardware/checkin-due.blade.php index d764a5178..6ed7cf42c 100644 --- a/resources/views/hardware/checkin-due.blade.php +++ b/resources/views/hardware/checkin-due.blade.php @@ -1,21 +1,10 @@ @extends('layouts/default') -@section('title0') - - @if ((Request::get('company_id')) && ($company)) - {{ $company->name }} - @endif - - {{ trans_choice('general.checkin_due_days', $settings->audit_warning_days, ['days' => $settings->audit_warning_days]) }} - -@stop - {{-- Page title --}} @section('title') - @yield('title0') @parent + {{ trans_choice('general.checkin_due_days', $settings->audit_warning_days, ['days' => $settings->audit_warning_days]) }} @stop - {{-- Page content --}} @section('content') {{-- Page content --}} From 4224bc0c43c906980985c3786a724dc9e330cb97 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 2 May 2024 12:36:57 +0100 Subject: [PATCH 68/69] Removed extra settings param Signed-off-by: snipe --- app/Http/Controllers/Api/AssetsController.php | 2 +- app/Http/Middleware/AssetCountForSidebar.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 2556b483c..b234e9cbf 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -167,7 +167,7 @@ class AssetsController extends Controller $assets->DueForAudit($settings); break; case 'overdue': - $assets->OverdueForAudit($settings); + $assets->OverdueForAudit(); break; case 'due-or-overdue': $assets->DueOrOverdueForAudit($settings); diff --git a/app/Http/Middleware/AssetCountForSidebar.php b/app/Http/Middleware/AssetCountForSidebar.php index f55b72e0d..2bc3f950f 100644 --- a/app/Http/Middleware/AssetCountForSidebar.php +++ b/app/Http/Middleware/AssetCountForSidebar.php @@ -82,7 +82,7 @@ class AssetCountForSidebar } try { - $total_overdue_for_audit = Asset::OverdueForAudit($settings)->count(); + $total_overdue_for_audit = Asset::OverdueForAudit()->count(); view()->share('total_overdue_for_audit', $total_overdue_for_audit); } catch (\Exception $e) { \Log::debug($e); @@ -96,7 +96,7 @@ class AssetCountForSidebar } try { - $total_overdue_for_checkin = Asset::OverdueForCheckin($settings)->count(); + $total_overdue_for_checkin = Asset::OverdueForCheckin()->count(); view()->share('total_overdue_for_checkin', $total_overdue_for_checkin); } catch (\Exception $e) { \Log::debug($e); From eb9a654cc3c1bb745cdb03d326cea883285e3c99 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 2 May 2024 12:37:41 +0100 Subject: [PATCH 69/69] Moved settings call higher Signed-off-by: snipe --- app/Console/Commands/SendExpectedCheckinAlerts.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/SendExpectedCheckinAlerts.php b/app/Console/Commands/SendExpectedCheckinAlerts.php index 665dca4df..e042e8b08 100644 --- a/app/Console/Commands/SendExpectedCheckinAlerts.php +++ b/app/Console/Commands/SendExpectedCheckinAlerts.php @@ -41,11 +41,11 @@ class SendExpectedCheckinAlerts extends Command */ public function handle() { + $settings = Setting::getSettings(); $interval = $settings->audit_warning_days ?? 0; $today = Carbon::now(); $interval_date = $today->copy()->addDays($interval); - - $settings = Setting::getSettings(); + $assets = Asset::whereNull('deleted_at')->DueOrOverdueForCheckin($settings)->orderBy('assets.expected_checkin', 'desc')->get(); $this->info($assets->count().' assets must be checked in on or before '.$interval_date.' is deadline');