mirror of
https://github.com/snipe/snipe-it.git
synced 2024-12-24 21:24:13 -08:00
Merge remote-tracking branch 'origin/develop'
This commit is contained in:
commit
0a9c2e354f
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -35,6 +35,27 @@
|
|||
@endif
|
||||
</div>
|
||||
|
||||
<!-- Name -->
|
||||
<div class="form-group {{ $errors->has('name') ? ' has-error' : '' }}">
|
||||
<label for="name" class="col-md-3 control-label">
|
||||
{{ trans('admin/hardware/form.name') }}
|
||||
</label>
|
||||
<div class="col-md-4">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control" name="name" id="name" value="{{ old('name') }}" maxlength="100" >
|
||||
</div>
|
||||
{!! $errors->first('name', '<span class="alert-msg" aria-hidden="true">
|
||||
<i class="fas fa-times" aria-hidden="true"></i> :message</span>') !!}
|
||||
</div>
|
||||
<div class="col-md-5">
|
||||
<label class="form-control">
|
||||
{{ Form::checkbox('null_name', '1', false) }}
|
||||
{{ trans_choice('general.set_to_null', count($assets), ['asset_count' => count($assets)]) }}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Purchase Date -->
|
||||
<div class="form-group {{ $errors->has('purchase_date') ? ' has-error' : '' }}">
|
||||
<label for="purchase_date" class="col-md-3 control-label">{{ trans('admin/hardware/form.date') }}</label>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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() } }} |
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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]));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
namespace Tests\Feature\Console;
|
||||
|
||||
use App\Models\Asset;
|
||||
use App\Models\User;
|
||||
|
@ -10,7 +10,6 @@ class FixupAssignedToAssignedTypeTest extends TestCase
|
|||
{
|
||||
public function testEmptyAssignedType()
|
||||
{
|
||||
$this->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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue