diff --git a/app/Http/Controllers/Account/AcceptanceController.php b/app/Http/Controllers/Account/AcceptanceController.php index 2c9d29fc16..6d84861fb0 100644 --- a/app/Http/Controllers/Account/AcceptanceController.php +++ b/app/Http/Controllers/Account/AcceptanceController.php @@ -218,6 +218,7 @@ class AcceptanceController extends Controller 'item_tag' => $item->asset_tag, 'item_model' => $display_model, 'item_serial' => $item->serial, + 'item_status' => $item->assetstatus?->name, 'eula' => $item->getEula(), 'note' => $request->input('note'), 'check_out_date' => Carbon::parse($acceptance->created_at)->format('Y-m-d'), @@ -308,6 +309,7 @@ class AcceptanceController extends Controller 'item_tag' => $item->asset_tag, 'item_model' => $display_model, 'item_serial' => $item->serial, + 'item_status' => $item->assetstatus?->name, 'note' => $request->input('note'), 'declined_date' => Carbon::parse($acceptance->declined_at)->format('Y-m-d'), 'signature' => ($sig_filename) ? storage_path() . '/private_uploads/signatures/' . $sig_filename : null, diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index 287bc0611b..d58edbacab 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -227,7 +227,8 @@ class BulkAssetsController extends Controller * its checkout status. */ - if (($request->filled('purchase_date')) + if (($request->filled('name')) + || ($request->filled('purchase_date')) || ($request->filled('expected_checkin')) || ($request->filled('purchase_cost')) || ($request->filled('supplier_id')) @@ -239,6 +240,7 @@ class BulkAssetsController extends Controller || ($request->filled('status_id')) || ($request->filled('model_id')) || ($request->filled('next_audit_date')) + || ($request->filled('null_name')) || ($request->filled('null_purchase_date')) || ($request->filled('null_expected_checkin_date')) || ($request->filled('null_next_audit_date')) @@ -251,13 +253,14 @@ class BulkAssetsController extends Controller $this->update_array = []; /** - * Leave out model_id and status here because we do math on that later. We have to do some extra - * validation and checks on those two. + * Leave out model_id and status here because we do math on that later. We have to do some + * extra validation and checks on those two. * * It's tempting to make these match the request check above, but some of these values require * extra work to make sure the data makes sense. */ - $this->conditionallyAddItem('purchase_date') + $this->conditionallyAddItem('name') + ->conditionallyAddItem('purchase_date') ->conditionallyAddItem('expected_checkin') ->conditionallyAddItem('order_number') ->conditionallyAddItem('requestable') @@ -271,6 +274,11 @@ class BulkAssetsController extends Controller /** * Blank out fields that were requested to be blanked out via checkbox */ + if ($request->input('null_name')=='1') { + + $this->update_array['name'] = null; + } + if ($request->input('null_purchase_date')=='1') { $this->update_array['purchase_date'] = null; } diff --git a/app/Notifications/AcceptanceAssetAcceptedNotification.php b/app/Notifications/AcceptanceAssetAcceptedNotification.php index db1555b574..7798dbc0d5 100644 --- a/app/Notifications/AcceptanceAssetAcceptedNotification.php +++ b/app/Notifications/AcceptanceAssetAcceptedNotification.php @@ -24,6 +24,7 @@ class AcceptanceAssetAcceptedNotification extends Notification $this->item_tag = $params['item_tag']; $this->item_model = $params['item_model']; $this->item_serial = $params['item_serial']; + $this->item_status = $params['item_status']; $this->accepted_date = Helper::getFormattedDateObject($params['accepted_date'], 'date', false); $this->assigned_to = $params['assigned_to']; $this->note = $params['note']; @@ -65,6 +66,7 @@ class AcceptanceAssetAcceptedNotification extends Notification 'item_tag' => $this->item_tag, 'item_model' => $this->item_model, 'item_serial' => $this->item_serial, + 'item_status' => $this->item_status, 'note' => $this->note, 'accepted_date' => $this->accepted_date, 'assigned_to' => $this->assigned_to, diff --git a/app/Notifications/AcceptanceAssetDeclinedNotification.php b/app/Notifications/AcceptanceAssetDeclinedNotification.php index abdfbbf0c0..0a9d6c211f 100644 --- a/app/Notifications/AcceptanceAssetDeclinedNotification.php +++ b/app/Notifications/AcceptanceAssetDeclinedNotification.php @@ -24,6 +24,7 @@ class AcceptanceAssetDeclinedNotification extends Notification $this->item_tag = $params['item_tag']; $this->item_model = $params['item_model']; $this->item_serial = $params['item_serial']; + $this->item_status = $params['item_status']; $this->declined_date = Helper::getFormattedDateObject($params['declined_date'], 'date', false); $this->note = $params['note']; $this->assigned_to = $params['assigned_to']; @@ -63,6 +64,7 @@ class AcceptanceAssetDeclinedNotification extends Notification 'item_tag' => $this->item_tag, 'item_model' => $this->item_model, 'item_serial' => $this->item_serial, + 'item_status' => $this->item_status, 'note' => $this->note, 'declined_date' => $this->declined_date, 'assigned_to' => $this->assigned_to, diff --git a/app/Notifications/CheckinAssetNotification.php b/app/Notifications/CheckinAssetNotification.php index 54b96777fe..77cd6d9b5a 100644 --- a/app/Notifications/CheckinAssetNotification.php +++ b/app/Notifications/CheckinAssetNotification.php @@ -162,6 +162,7 @@ class CheckinAssetNotification extends Notification $message = (new MailMessage)->markdown('notifications.markdown.checkin-asset', [ 'item' => $this->item, + 'status' => $this->item->assetstatus?->name, 'admin' => $this->admin, 'note' => $this->note, 'target' => $this->target, diff --git a/app/Notifications/CheckoutAssetNotification.php b/app/Notifications/CheckoutAssetNotification.php index 1c8c901b52..5ebde7e4f7 100644 --- a/app/Notifications/CheckoutAssetNotification.php +++ b/app/Notifications/CheckoutAssetNotification.php @@ -209,6 +209,7 @@ public function toGoogleChat() [ 'item' => $this->item, 'admin' => $this->admin, + 'status' => $this->item->assetstatus?->name, 'note' => $this->note, 'target' => $this->target, 'fields' => $fields, diff --git a/resources/views/hardware/bulk.blade.php b/resources/views/hardware/bulk.blade.php index 371f0c2549..248b18e400 100755 --- a/resources/views/hardware/bulk.blade.php +++ b/resources/views/hardware/bulk.blade.php @@ -35,6 +35,27 @@ @endif + +
+ +
+
+ +
+ {!! $errors->first('name', '') !!} +
+
+ +
+
+ +
diff --git a/resources/views/notifications/markdown/asset-acceptance.blade.php b/resources/views/notifications/markdown/asset-acceptance.blade.php index 93292375a5..c5c2a2fa27 100644 --- a/resources/views/notifications/markdown/asset-acceptance.blade.php +++ b/resources/views/notifications/markdown/asset-acceptance.blade.php @@ -16,6 +16,9 @@ @if (isset($note)) | **{{ trans('general.notes') }}** | {{ $note }} | @endif +@if (isset($item_status)) +| **{{ trans('general.status') }}** | {{ $item_status }} | +@endif @if ((isset($item_tag)) && ($item_tag!='')) | **{{ trans('mail.asset_tag') }}** | {{ $item_tag }} | @endif diff --git a/resources/views/notifications/markdown/checkin-asset.blade.php b/resources/views/notifications/markdown/checkin-asset.blade.php index 74a4381707..523ba66aa1 100644 --- a/resources/views/notifications/markdown/checkin-asset.blade.php +++ b/resources/views/notifications/markdown/checkin-asset.blade.php @@ -31,6 +31,9 @@ @if (isset($last_checkout)) | **{{ trans('mail.checkout_date') }}** | {{ $last_checkout }} | @endif +@if (isset($status)) +| **{{ trans('general.status') }}** | {{ $status }} | +@endif @foreach($fields as $field) @if (($item->{ $field->db_column_name() }!='') && ($field->show_in_email) && ($field->field_encrypted=='0')) | **{{ $field->name }}** | {{ $item->{ $field->db_column_name() } }} | diff --git a/resources/views/notifications/markdown/checkout-asset.blade.php b/resources/views/notifications/markdown/checkout-asset.blade.php index 4646cef482..9b5fc26dc2 100644 --- a/resources/views/notifications/markdown/checkout-asset.blade.php +++ b/resources/views/notifications/markdown/checkout-asset.blade.php @@ -31,6 +31,9 @@ @if (isset($last_checkout)) | **{{ trans('mail.checkout_date') }}** | {{ $last_checkout }} | @endif +@if (isset($status)) +| **{{ trans('general.status') }}** | {{ $status }} | +@endif @if ((isset($expected_checkin)) && ($expected_checkin!='')) | **{{ trans('mail.expecting_checkin_date') }}** | {{ $expected_checkin }} | @endif diff --git a/tests/Feature/Assets/Ui/BulkEditAssetsTest.php b/tests/Feature/Assets/Ui/BulkEditAssetsTest.php index 76d0a9c345..44e9052482 100644 --- a/tests/Feature/Assets/Ui/BulkEditAssetsTest.php +++ b/tests/Feature/Assets/Ui/BulkEditAssetsTest.php @@ -57,6 +57,7 @@ class BulkEditAssetsTest extends TestCase $company1 = Company::factory()->create(); $company2 = Company::factory()->create(); $assets = Asset::factory()->count(10)->create([ + 'name' => 'Old Asset Name', 'purchase_date' => '2023-01-01', 'expected_checkin' => '2023-01-01', 'status_id' => $status1->id, @@ -77,6 +78,7 @@ class BulkEditAssetsTest extends TestCase // submits the ids and new values for each attribute $this->actingAs(User::factory()->editAssets()->create())->post(route('hardware/bulksave'), [ 'ids' => $id_array, + 'name' => 'New Asset Name', 'purchase_date' => '2024-01-01', 'expected_checkin' => '2024-01-01', 'status_id' => $status2->id, @@ -97,6 +99,7 @@ class BulkEditAssetsTest extends TestCase $this->assertEquals('2024-01-01', $asset->purchase_date->format('Y-m-d')); $this->assertEquals('2024-01-01', $asset->expected_checkin->format('Y-m-d')); $this->assertEquals($status2->id, $asset->status_id); + $this->assertEquals('New Asset Name', $asset->name); $this->assertEquals($model2->id, $asset->model_id); $this->assertEquals(5678.92, $asset->purchase_cost); $this->assertEquals($supplier2->id, $asset->supplier_id); @@ -109,6 +112,59 @@ class BulkEditAssetsTest extends TestCase }); } + public function testBulkEditAssetsNullsOutFieldsIfSelected() + { + // sets up all needed models and attributes on the assets + // this test does not deal with custom fields - will be dealt with in separate cases + $status1 = Statuslabel::factory()->create(); + $status2 = Statuslabel::factory()->create(); + $model1 = AssetModel::factory()->create(); + $model2 = AssetModel::factory()->create(); + $supplier1 = Supplier::factory()->create(); + $supplier2 = Supplier::factory()->create(); + $company1 = Company::factory()->create(); + $company2 = Company::factory()->create(); + $assets = Asset::factory()->count(10)->create([ + 'name' => 'Old Asset Name', + 'purchase_date' => '2023-01-01', + 'expected_checkin' => '2023-01-01', + 'status_id' => $status1->id, + 'model_id' => $model1->id, + // skipping locations on this test, it deserves it's own test + 'purchase_cost' => 1234.90, + 'supplier_id' => $supplier1->id, + 'company_id' => $company1->id, + 'order_number' => '123456', + 'warranty_months' => 24, + 'next_audit_date' => '2024-06-01', + 'requestable' => false + ]); + + // gets the ids together to submit to the endpoint + $id_array = $assets->pluck('id')->toArray(); + + // submits the ids and new values for each attribute + $this->actingAs(User::factory()->editAssets()->create())->post(route('hardware/bulksave'), [ + 'ids' => $id_array, + 'null_name' => '1', + 'null_purchase_date' => '1', + 'null_expected_checkin_date' => '1', + 'null_next_audit_date' => '1', + 'status_id' => $status2->id, + 'model_id' => $model2->id, + ]) + ->assertStatus(302) + ->assertSessionHasNoErrors(); + + // asserts that each asset has the updated values + Asset::findMany($id_array)->each(function (Asset $asset) use ($status2, $model2, $supplier2, $company2) { + $this->assertNull($asset->name); + $this->assertNull($asset->purchase_date); + $this->assertNull($asset->expected_checkin); + $this->assertNull($asset->next_audit_date); + }); + } + public function testBulkEditAssetsAcceptsAndUpdatesUnencryptedCustomFields() { $this->markIncompleteIfMySQL('Custom Fields tests do not work on MySQL'); diff --git a/tests/Feature/Checkins/Ui/ComponentCheckinTest.php b/tests/Feature/Checkins/Ui/ComponentCheckinTest.php index 1213d65252..06754d33c0 100644 --- a/tests/Feature/Checkins/Ui/ComponentCheckinTest.php +++ b/tests/Feature/Checkins/Ui/ComponentCheckinTest.php @@ -4,27 +4,35 @@ namespace Tests\Feature\Checkins\Ui; use App\Models\Component; use App\Models\User; +use Illuminate\Support\Facades\DB; use Tests\TestCase; class ComponentCheckinTest extends TestCase { public function testCheckingInComponentRequiresCorrectPermission() { + $component = Component::factory()->checkedOutToAsset()->create(); + + $componentAsset = DB::table('components_assets')->where('component_id', $component->id)->first(); + $this->actingAs(User::factory()->create()) ->post(route('components.checkin.store', [ - 'componentID' => Component::factory()->checkedOutToAsset()->create()->id, + 'componentID' => $componentAsset->id, ])) ->assertForbidden(); } - public function testComponentCheckinPagePostIsRedirectedIfRedirectSelectionIsIndex() { $component = Component::factory()->checkedOutToAsset()->create(); + $componentAsset = DB::table('components_assets')->where('component_id', $component->id)->first(); + $this->actingAs(User::factory()->admin()->create()) ->from(route('components.index')) - ->post(route('components.checkin.store', $component), [ + ->post(route('components.checkin.store', [ + 'componentID' => $componentAsset->id, + ]), [ 'redirect_option' => 'index', 'checkin_qty' => 1, ]) @@ -36,9 +44,13 @@ class ComponentCheckinTest extends TestCase { $component = Component::factory()->checkedOutToAsset()->create(); + $componentAsset = DB::table('components_assets')->where('component_id', $component->id)->first(); + $this->actingAs(User::factory()->admin()->create()) ->from(route('components.index')) - ->post(route('components.checkin.store', $component), [ + ->post(route('components.checkin.store', [ + 'componentID' => $componentAsset->id, + ]), [ 'redirect_option' => 'item', 'checkin_qty' => 1, ]) @@ -46,6 +58,4 @@ class ComponentCheckinTest extends TestCase ->assertSessionHasNoErrors() ->assertRedirect(route('components.show', ['component' => $component->id])); } - - } diff --git a/tests/Feature/Console/FixupAssignedToAssignedTypeTest.php b/tests/Feature/Console/FixupAssignedToAssignedTypeTest.php index d4420145d2..2b5f9b415d 100644 --- a/tests/Feature/Console/FixupAssignedToAssignedTypeTest.php +++ b/tests/Feature/Console/FixupAssignedToAssignedTypeTest.php @@ -1,6 +1,6 @@ markTestIncomplete(); $asset = Asset::factory()->create(); $user = User::factory()->create(); $admin = User::factory()->admin()->create(); @@ -18,15 +17,10 @@ class FixupAssignedToAssignedTypeTest extends TestCase $asset->checkOut($user, $admin); $asset->assigned_type=null; //blank out the assigned type $asset->save(); - print "Okay we set everything up~!!!\n"; - $output = $this->artisan('snipeit:assigned-to-fixup --debug')->assertExitCode(0); - print "artisan ran!\n"; - dump($output); - $asset = Asset::find($asset->id); - print "\n we refreshed the asset?"; - dump($asset); - $this->assertEquals(User::class, $asset->assigned_type); + $this->artisan('snipeit:assigned-to-fixup --debug')->assertExitCode(0); + + $this->assertEquals(User::class, $asset->fresh()->assigned_type); } public function testInvalidAssignedTo() @@ -37,21 +31,15 @@ class FixupAssignedToAssignedTypeTest extends TestCase $admin = User::factory()->admin()->create(); $asset->checkOut($user, $admin); -// $asset->checkIn($user, $admin); //no such method btw $asset->assigned_type=null; $asset->assigned_to=null; $asset->saveOrFail(); //*should* generate a 'checkin'? $asset->assigned_to=$user->id; //incorrectly mark asset as partially checked-out $asset->saveOrFail(); - print "Okay we set everything up for test TWO~!!!\n"; - $output = $this->artisan('snipeit:assigned-to-fixup --debug')->assertExitCode(0); - print "artisan ran TWO!\n"; - dump($output); - $asset = Asset::find($asset->id); - print "\n we refreshed the asset?"; - dump($asset); - $this->assertNull($asset->assigned_to); + $this->artisan('snipeit:assigned-to-fixup --debug')->assertExitCode(0); + + $this->assertNull($asset->fresh()->assigned_to); } }