From 384652b3df38ce81e7a571777530e44def1c24be Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 16 Sep 2025 10:10:49 -0700 Subject: [PATCH 1/5] add total cost to accessories --- app/Http/Transformers/AccessoriesTransformer.php | 1 + app/Models/Accessory.php | 4 ++++ app/Presenters/AccessoryPresenter.php | 6 ++++++ resources/lang/en-US/general.php | 1 + resources/views/accessories/view.blade.php | 12 ++++++++++++ 5 files changed, 24 insertions(+) diff --git a/app/Http/Transformers/AccessoriesTransformer.php b/app/Http/Transformers/AccessoriesTransformer.php index 491871e122..c7af414d08 100644 --- a/app/Http/Transformers/AccessoriesTransformer.php +++ b/app/Http/Transformers/AccessoriesTransformer.php @@ -36,6 +36,7 @@ class AccessoriesTransformer 'qty' => ($accessory->qty) ? (int) $accessory->qty : null, 'purchase_date' => ($accessory->purchase_date) ? Helper::getFormattedDateObject($accessory->purchase_date, 'date') : null, 'purchase_cost' => Helper::formatCurrencyOutput($accessory->purchase_cost), + 'total_cost' => Helper::formatCurrencyOutput($accessory->totalCostSum()), 'order_number' => ($accessory->order_number) ? e($accessory->order_number) : null, 'min_qty' => ($accessory->min_amt) ? (int) $accessory->min_amt : null, // Legacy - should phase out - replaced by below, for the bootstrap table formatter 'min_amt' => ($accessory->min_amt) ? (int) $accessory->min_amt : null, diff --git a/app/Models/Accessory.php b/app/Models/Accessory.php index 29984a1c2b..8efd68ef7e 100755 --- a/app/Models/Accessory.php +++ b/app/Models/Accessory.php @@ -357,6 +357,10 @@ class Accessory extends SnipeModel $accessory_checkout->limit(1)->delete(); } + public function totalCostSum() { + + return $this->purchase_cost !== null ? $this->qty * $this->purchase_cost : null; + } /** * ----------------------------------------------- diff --git a/app/Presenters/AccessoryPresenter.php b/app/Presenters/AccessoryPresenter.php index 6d04e18b6a..d4aaa768c3 100644 --- a/app/Presenters/AccessoryPresenter.php +++ b/app/Presenters/AccessoryPresenter.php @@ -121,6 +121,12 @@ class AccessoryPresenter extends Presenter 'searchable' => true, 'sortable' => true, 'title' => trans('general.unit_cost'), + 'class' => 'text-right text-padding-number-cell', + ], [ + 'field' => 'total_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.total_cost'), 'footerFormatter' => 'sumFormatterQuantity', 'class' => 'text-right text-padding-number-cell', ], [ diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index b7c62a8aa7..61b7c9f809 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -309,6 +309,7 @@ return [ 'total_licenses' => 'total licenses', 'total_accessories' => 'total accessories', 'total_consumables' => 'total consumables', + 'total_cost' => 'Total Cost', 'type' => 'Type', 'undeployable' => 'Un-deployable', 'unknown_admin' => 'Unknown Admin', diff --git a/resources/views/accessories/view.blade.php b/resources/views/accessories/view.blade.php index e0f276e755..9851d46140 100644 --- a/resources/views/accessories/view.blade.php +++ b/resources/views/accessories/view.blade.php @@ -244,6 +244,18 @@ @endif + @if ($accessory->purchase_cost) +
+
+ + {{ trans('general.total_cost') }} + +
+
+ {{ Helper::formatCurrencyOutput($accessory->totalCostSum()) }} +
+
+ @endif
From 14b829aa30fe9a5027d769360378c9ae48ed854e Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 16 Sep 2025 10:37:32 -0700 Subject: [PATCH 2/5] add total cost to components and consumables --- .../Transformers/ComponentsTransformer.php | 1 + .../Transformers/ConsumablesTransformer.php | 1 + app/Models/Component.php | 3 + app/Models/Consumable.php | 3 + app/Presenters/ComponentPresenter.php | 46 ++++++++------ app/Presenters/ConsumablePresenter.php | 62 ++++++++++--------- resources/views/components/view.blade.php | 7 +++ resources/views/consumables/view.blade.php | 12 ++++ 8 files changed, 85 insertions(+), 50 deletions(-) diff --git a/app/Http/Transformers/ComponentsTransformer.php b/app/Http/Transformers/ComponentsTransformer.php index f7f8c337bf..82e4448277 100644 --- a/app/Http/Transformers/ComponentsTransformer.php +++ b/app/Http/Transformers/ComponentsTransformer.php @@ -43,6 +43,7 @@ class ComponentsTransformer 'order_number' => e($component->order_number), 'purchase_date' => Helper::getFormattedDateObject($component->purchase_date, 'date'), 'purchase_cost' => Helper::formatCurrencyOutput($component->purchase_cost), + 'total_cost' => Helper::formatCurrencyOutput($component->totalCostSum()), 'remaining' => (int) $component->numRemaining(), 'company' => ($component->company) ? [ 'id' => (int) $component->company->id, diff --git a/app/Http/Transformers/ConsumablesTransformer.php b/app/Http/Transformers/ConsumablesTransformer.php index 4c7dbf9cc5..2739b3b8f0 100644 --- a/app/Http/Transformers/ConsumablesTransformer.php +++ b/app/Http/Transformers/ConsumablesTransformer.php @@ -37,6 +37,7 @@ class ConsumablesTransformer 'remaining' => $consumable->numRemaining(), 'order_number' => e($consumable->order_number), 'purchase_cost' => Helper::formatCurrencyOutput($consumable->purchase_cost), + 'total_cost' => Helper::formatCurrencyOutput($consumable->totalCostSum()), 'purchase_date' => Helper::getFormattedDateObject($consumable->purchase_date, 'date'), 'qty' => (int) $consumable->qty, 'notes' => ($consumable->notes) ? Helper::parseEscapedMarkedownInline($consumable->notes) : null, diff --git a/app/Models/Component.php b/app/Models/Component.php index ddcb3ad575..6352981418 100644 --- a/app/Models/Component.php +++ b/app/Models/Component.php @@ -288,7 +288,10 @@ class Component extends SnipeModel return $this->qty - $this->numCheckedOut(); } + public function totalCostSum() { + return $this->purchase_cost !== null ? $this->qty * $this->purchase_cost : null; + } /** * ----------------------------------------------- * BEGIN MUTATORS diff --git a/app/Models/Consumable.php b/app/Models/Consumable.php index 8c6e43c490..806b10d317 100644 --- a/app/Models/Consumable.php +++ b/app/Models/Consumable.php @@ -312,7 +312,10 @@ class Consumable extends SnipeModel return $remaining; } + public function totalCostSum() { + return $this->purchase_cost !== null ? $this->qty * $this->purchase_cost : null; + } /** * ----------------------------------------------- * BEGIN MUTATORS diff --git a/app/Presenters/ComponentPresenter.php b/app/Presenters/ComponentPresenter.php index be15144623..5e33d72d1c 100644 --- a/app/Presenters/ComponentPresenter.php +++ b/app/Presenters/ComponentPresenter.php @@ -79,6 +79,25 @@ class ComponentPresenter extends Presenter 'title' => trans('general.manufacturer'), 'visible' => false, 'formatter' => 'manufacturersLinkObjFormatter', + ], [ + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.location'), + 'formatter' => 'locationsLinkObjFormatter', + ], [ + 'field' => 'order_number', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.order_number'), + 'visible' => true, + ], [ + 'field' => 'purchase_date', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.purchase_date'), + 'visible' => true, + 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'min_amt', 'searchable' => false, @@ -103,33 +122,20 @@ class ComponentPresenter extends Presenter 'visible' => true, 'class' => 'text-right text-padding-number-cell', 'footerFormatter' => 'qtySumFormatter', - ], [ - 'field' => 'location', - 'searchable' => true, - 'sortable' => true, - 'title' => trans('general.location'), - 'formatter' => 'locationsLinkObjFormatter', - ], [ - 'field' => 'order_number', - 'searchable' => true, - 'sortable' => true, - 'title' => trans('general.order_number'), - 'visible' => true, - ], [ - 'field' => 'purchase_date', - 'searchable' => true, - 'sortable' => true, - 'title' => trans('general.purchase_date'), - 'visible' => true, - 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'purchase_cost', 'searchable' => true, 'sortable' => true, 'title' => trans('general.unit_cost'), 'visible' => true, - 'footerFormatter' => 'sumFormatterQuantity', 'class' => 'text-right', + ], [ + 'field' => 'total_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.total_cost'), + 'footerFormatter' => 'sumFormatterQuantity', + 'class' => 'text-right text-padding-number-cell', ], [ 'field' => 'notes', 'searchable' => true, diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php index da167c0d2c..3a5ff2cad3 100644 --- a/app/Presenters/ConsumablePresenter.php +++ b/app/Presenters/ConsumablePresenter.php @@ -73,36 +73,7 @@ class ConsumablePresenter extends Presenter 'sortable' => true, 'title' => trans('admin/consumables/general.item_no'), ], [ - 'field' => 'qty', - 'searchable' => false, - 'sortable' => true, - 'title' => trans('admin/components/general.total'), - 'visible' => true, - 'class' => 'text-right text-padding-number-cell', - 'footerFormatter' => 'qtySumFormatter', - ], [ - 'field' => 'remaining', - 'searchable' => false, - 'sortable' => true, - 'title' => trans('admin/components/general.remaining'), - 'visible' => true, - 'class' => 'text-right text-padding-number-cell', - 'footerFormatter' => 'qtySumFormatter', - ], [ - 'field' => 'min_amt', - 'searchable' => false, - 'sortable' => true, - 'title' => trans('general.min_amt'), - 'visible' => true, - 'formatter' => 'minAmtFormatter', - 'class' => 'text-right text-padding-number-cell', - ], [ - 'field' => 'location', - 'searchable' => true, - 'sortable' => true, - 'title' => trans('general.location'), - 'formatter' => 'locationsLinkObjFormatter', - ], [ + 'field' => 'manufacturer', 'searchable' => true, 'sortable' => true, @@ -122,6 +93,30 @@ class ConsumablePresenter extends Presenter 'title' => trans('general.purchase_date'), 'visible' => true, 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'min_amt', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.min_amt'), + 'visible' => true, + 'formatter' => 'minAmtFormatter', + 'class' => 'text-right text-padding-number-cell', + ], [ + 'field' => 'qty', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('admin/components/general.total'), + 'visible' => true, + 'class' => 'text-right text-padding-number-cell', + 'footerFormatter' => 'qtySumFormatter', + ], [ + 'field' => 'remaining', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('admin/components/general.remaining'), + 'visible' => true, + 'class' => 'text-right text-padding-number-cell', + 'footerFormatter' => 'qtySumFormatter', ], [ 'field' => 'purchase_cost', 'searchable' => true, @@ -130,6 +125,13 @@ class ConsumablePresenter extends Presenter 'visible' => true, 'footerFormatter' => 'sumFormatterQuantity', 'class' => 'text-right text-padding-number-cell', + ], [ + 'field' => 'total_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.total_cost'), + 'footerFormatter' => 'sumFormatterQuantity', + 'class' => 'text-right text-padding-number-cell', ], [ 'field' => 'notes', 'searchable' => true, diff --git a/resources/views/components/view.blade.php b/resources/views/components/view.blade.php index 6c0d8840ad..dfce30e796 100644 --- a/resources/views/components/view.blade.php +++ b/resources/views/components/view.blade.php @@ -207,6 +207,13 @@ {{ Helper::formatCurrencyOutput($component->purchase_cost) }}
@endif + @if ($component->purchase_cost) +
{{ trans('general.total_cost') }}: + {{ $snipeSettings->default_currency }} + + {{ Helper::formatCurrencyOutput($component->totalCostSum()) }}
+ @endif + @if ($component->order_number)
{{ trans('general.order_number') }}: {{ $component->order_number }}
diff --git a/resources/views/consumables/view.blade.php b/resources/views/consumables/view.blade.php index 376a4ddfed..a38ecaf7a4 100644 --- a/resources/views/consumables/view.blade.php +++ b/resources/views/consumables/view.blade.php @@ -281,6 +281,18 @@
@endif + @if ($consumable->purchase_cost) +
+
+ {{ trans('general.total_cost') }} +
+
+ {{ $snipeSettings->default_currency }} + {{ Helper::formatCurrencyOutput($consumable->totalCostSum()) }} +
+
+ @endif + @if ($consumable->order_number)
From 4ca1db8a1bd65f8e6568cc4501e7e04b49d60c12 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 16 Sep 2025 10:43:02 -0700 Subject: [PATCH 3/5] remove footer formatter from consumable purchase cost --- app/Presenters/ConsumablePresenter.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php index 3a5ff2cad3..9d79a97178 100644 --- a/app/Presenters/ConsumablePresenter.php +++ b/app/Presenters/ConsumablePresenter.php @@ -123,7 +123,6 @@ class ConsumablePresenter extends Presenter 'sortable' => true, 'title' => trans('general.unit_cost'), 'visible' => true, - 'footerFormatter' => 'sumFormatterQuantity', 'class' => 'text-right text-padding-number-cell', ], [ 'field' => 'total_cost', From 11e5f851f00786bbc910fa5d0a81375472cd9bf4 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 16 Sep 2025 10:49:33 -0700 Subject: [PATCH 4/5] typo --- app/Presenters/ConsumablePresenter.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php index 9d79a97178..2b2eec5b2e 100644 --- a/app/Presenters/ConsumablePresenter.php +++ b/app/Presenters/ConsumablePresenter.php @@ -67,6 +67,12 @@ class ConsumablePresenter extends Presenter 'searchable' => true, 'sortable' => true, 'title' => trans('general.model_no'), + ], [ + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.location'), + 'formatter' => 'locationsLinkObjFormatter', ], [ 'field' => 'item_no', 'searchable' => true, From e81f63f46b5103a9f7dc3c5b382c532ff8232cc2 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Sep 2025 14:03:48 +0100 Subject: [PATCH 5/5] Fixed #8859 - adds purchase sums on model view --- resources/views/models/view.blade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/views/models/view.blade.php b/resources/views/models/view.blade.php index 19101cb568..359b947efa 100755 --- a/resources/views/models/view.blade.php +++ b/resources/views/models/view.blade.php @@ -90,6 +90,7 @@ data-cookie-id-table="assetListingTable" data-id-table="assetListingTable" data-side-pagination="server" + data-show-footer="true" data-toolbar="#assetsBulkEditToolbar" data-bulk-button-id="#bulkAssetEditButton" data-bulk-form-id="#assetsBulkForm"