diff --git a/app/Console/Commands/FixupAssignedToWithoutAssignedType.php b/app/Console/Commands/FixupAssignedToWithoutAssignedType.php new file mode 100644 index 0000000000..ea3a55439a --- /dev/null +++ b/app/Console/Commands/FixupAssignedToWithoutAssignedType.php @@ -0,0 +1,66 @@ +whereNotNull("assigned_to")->withTrashed(); + $this->withProgressBar($assets->get(), function (Asset $asset) { + //now check each action log, from the most recent backwards, to find the last checkin or checkout + foreach($asset->log()->orderBy("id","desc")->get() as $action_log) { + if($this->option("debug")) { + $this->info("Asset id: " . $asset->id . " action log, action type is: " . $action_log->action_type); + } + switch($action_log->action_type) { + case 'checkin from': + if($this->option("debug")) { + $this->info("Doing a checkin for ".$asset->id); + } + $asset->assigned_to = null; + // if you have a required custom field, we still want to save, and we *don't* want an action_log + $asset->saveQuietly(); + return; + + case 'checkout': + if($this->option("debug")) { + $this->info("Doing a checkout for " . $asset->id . " picking target type: " . $action_log->target_type); + } + if($asset->assigned_to != $action_log->target_id) { + $this->error("Asset's assigned_to does *NOT* match Action Log's target_id. \$asset->assigned_to=".$asset->assigned_to." vs. \$action_log->target_id=".$action_log->target_id); + //FIXME - do we abort here? Do we try to keep looking? I don't know, this means your data is *really* messed up... + } + $asset->assigned_type = $action_log->target_type; + $asset->saveQuietly(); // see above + return; + } + } + $asset->assigned_to = null; //asset was never checked in or out in its lifetime - it stays 'checked in' + $asset->saveQuietly(); //see above + }); + $this->newLine(); + $this->info("Assets assigned_type are fixed"); + } +} diff --git a/public/js/dist/all.js b/public/js/dist/all.js index a8dbd199aa..bfc702306d 100644 Binary files a/public/js/dist/all.js and b/public/js/dist/all.js differ diff --git a/public/js/dist/bootstrap-table.js b/public/js/dist/bootstrap-table.js index bdc1127c52..842161053b 100644 Binary files a/public/js/dist/bootstrap-table.js and b/public/js/dist/bootstrap-table.js differ diff --git a/public/mix-manifest.json b/public/mix-manifest.json index f9a49f7725..8f472fd964 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,24 +1,25 @@ { - "/js/build/app.js": "/js/build/app.js?id=842cc33168d973ac10d35eb664be2a2c", - "/css/dist/skins/skin-red.css": "/css/dist/skins/skin-red.css?id=44bf834f2110504a793dadec132a5898", - "/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=f677207c6cf9678eb539abecb408c374", - "/css/build/overrides.css": "/css/build/overrides.css?id=004835e70ed3ae2e2340162b7a37c752", - "/css/build/app.css": "/css/build/app.css?id=7ecac57fc8cf6fdbe447c18d5f2ae7bc", - "/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=4ea0068716c1bb2434d87a16d51b98c9", - "/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=4fa7aa3ba499c8f4e390eb8549da3f74", - "/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=0640e45bad692dcf62873c6e85904899", - "/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=393aaa7b368b0670fc42434c8cca7dc7", - "/css/dist/skins/skin-yellow.css": "/css/dist/skins/skin-yellow.css?id=7b315b9612b8fde8f9c5b0ddb6bba690", - "/css/dist/skins/skin-purple-dark.css": "/css/dist/skins/skin-purple-dark.css?id=f8b26018a1533b9db864247daaf06daa", - "/css/dist/skins/skin-purple.css": "/css/dist/skins/skin-purple.css?id=6fe68325d5356197672c27bc77cedcb4", - "/css/dist/skins/skin-red-dark.css": "/css/dist/skins/skin-red-dark.css?id=ad39859637dafa781288630f9d6d6523", - "/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=f0b08873a06bb54daeee176a9459f4a9", - "/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=76482123f6c70e866d6b971ba91de7bb", - "/css/dist/skins/skin-green-dark.css": "/css/dist/skins/skin-green-dark.css?id=553ee68741b5a392037abcf04da80adc", - "/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/all.css": "/css/dist/all.css?id=656b0a0561a4be447c195846c3de3558", + "/js/dist/all.js": "/js/dist/all.js?id=44444198b0c91f004faf9d51d69d26fe", + "/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=39f0ae2a385a76e527ed692b5c4ca270", + "/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=65173850010ba0aa4cf51ebdc7018eaf", + "/css/build/overrides.css": "/css/build/overrides.css?id=235b489fb2b190c77b3157210708d9c7", + "/css/build/app.css": "/css/build/app.css?id=436103f24893060ddb7a1dc084c73c50", + "/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=bdf169bc2141f453390614c138cdce95", + "/css/dist/skins/skin-yellow.css": "/css/dist/skins/skin-yellow.css?id=e1e6e1c64cf14fc350585aaeb0e42f6b", + "/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=14e0dc1b38f18795f6b7ad4bf431bef2", + "/css/dist/skins/skin-red.css": "/css/dist/skins/skin-red.css?id=fe8365eda6947fae76b6891d8de23e57", + "/css/dist/skins/skin-red-dark.css": "/css/dist/skins/skin-red-dark.css?id=6ee47e1bc9b1ae43651cb85d9881cfcd", + "/css/dist/skins/skin-purple.css": "/css/dist/skins/skin-purple.css?id=0853b7f7da3d6bfda0738df5574d9892", + "/css/dist/skins/skin-purple-dark.css": "/css/dist/skins/skin-purple-dark.css?id=6f18b01e9beb8f90619660caa9bc8f1f", + "/css/dist/skins/skin-orange.css": "/css/dist/skins/skin-orange.css?id=23f6b19fc0add02e020cbb9e4f6f9272", + "/css/dist/skins/skin-orange-dark.css": "/css/dist/skins/skin-orange-dark.css?id=dbc358eb4ef5ed4057dd4a7e35b31566", + "/css/dist/skins/skin-green.css": "/css/dist/skins/skin-green.css?id=d68df5bc23ddddc710f7acf2201b2caf", + "/css/dist/skins/skin-green-dark.css": "/css/dist/skins/skin-green-dark.css?id=33cfbb093373058361c806006094285c", + "/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=8c61ef8889d392838fb977c7a1b1f6bb", + "/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=9b2341353423cb430b8a318e4c23ce84", + "/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=6b475470c1dfdb81c5043fb2452a8e23", + "/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=84e2ee950ae04444988b37038e5a3951", + "/css/dist/all.css": "/css/dist/all.css?id=c9d1a6d5bf471b0bd6b2bbd4111a5a1f", "/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", "/js/select2/i18n/af.js": "/js/select2/i18n/af.js?id=4f6fcd73488ce79fae1b7a90aceaecde", @@ -91,23 +92,23 @@ "/css/webfonts/fa-v4compatibility.woff2": "/css/webfonts/fa-v4compatibility.woff2?id=111e341dba724e1df946e8d1f406a7bd", "/js/dist/bootstrap-table-locale-all.min.js": "/js/dist/bootstrap-table-locale-all.min.js?id=27eb00f47f9bae70cd630d184b7969f1", "/js/dist/bootstrap-table-en-US.min.js": "/js/dist/bootstrap-table-en-US.min.js?id=57bdb4770b2924f5efeda100caf3c9b7", + "/js/dist/Chart.min.js": "/js/dist/Chart.min.js?id=9b1ae20c4c7048d6e4a1b2e1aee7fb31", + "/css/dist/skins/_all-skins.min.css": "/css/dist/skins/_all-skins.min.css?id=65173850010ba0aa4cf51ebdc7018eaf", + "/css/dist/skins/skin-black-dark.min.css": "/css/dist/skins/skin-black-dark.min.css?id=39f0ae2a385a76e527ed692b5c4ca270", + "/css/dist/skins/skin-black.min.css": "/css/dist/skins/skin-black.min.css?id=84e2ee950ae04444988b37038e5a3951", + "/css/dist/skins/skin-blue-dark.min.css": "/css/dist/skins/skin-blue-dark.min.css?id=6b475470c1dfdb81c5043fb2452a8e23", + "/css/dist/skins/skin-blue.min.css": "/css/dist/skins/skin-blue.min.css?id=9b2341353423cb430b8a318e4c23ce84", + "/css/dist/skins/skin-contrast.min.css": "/css/dist/skins/skin-contrast.min.css?id=8c61ef8889d392838fb977c7a1b1f6bb", + "/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=33cfbb093373058361c806006094285c", + "/css/dist/skins/skin-green.min.css": "/css/dist/skins/skin-green.min.css?id=d68df5bc23ddddc710f7acf2201b2caf", + "/css/dist/skins/skin-orange-dark.min.css": "/css/dist/skins/skin-orange-dark.min.css?id=dbc358eb4ef5ed4057dd4a7e35b31566", + "/css/dist/skins/skin-orange.min.css": "/css/dist/skins/skin-orange.min.css?id=23f6b19fc0add02e020cbb9e4f6f9272", + "/css/dist/skins/skin-purple-dark.min.css": "/css/dist/skins/skin-purple-dark.min.css?id=6f18b01e9beb8f90619660caa9bc8f1f", + "/css/dist/skins/skin-purple.min.css": "/css/dist/skins/skin-purple.min.css?id=0853b7f7da3d6bfda0738df5574d9892", + "/css/dist/skins/skin-red-dark.min.css": "/css/dist/skins/skin-red-dark.min.css?id=6ee47e1bc9b1ae43651cb85d9881cfcd", + "/css/dist/skins/skin-red.min.css": "/css/dist/skins/skin-red.min.css?id=fe8365eda6947fae76b6891d8de23e57", + "/css/dist/skins/skin-yellow-dark.min.css": "/css/dist/skins/skin-yellow-dark.min.css?id=14e0dc1b38f18795f6b7ad4bf431bef2", + "/css/dist/skins/skin-yellow.min.css": "/css/dist/skins/skin-yellow.min.css?id=e1e6e1c64cf14fc350585aaeb0e42f6b", "/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=8abbb6aea625ec64cd7ebdad77ebf6e5", - "/js/build/vendor.js": "/js/build/vendor.js?id=e27070bdbc5fce3bfd132b952d641fd6", - "/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=859e11e4e6b05c84e4b7302de29bac5e", - "/js/dist/all.js": "/js/dist/all.js?id=01108f9d8f4f67b20669f0c25a64eb5d", - "/css/dist/skins/skin-green.min.css": "/css/dist/skins/skin-green.min.css?id=0a82a6ae6bb4e58fe62d162c4fb50397", - "/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=553ee68741b5a392037abcf04da80adc", - "/css/dist/skins/skin-black.min.css": "/css/dist/skins/skin-black.min.css?id=76482123f6c70e866d6b971ba91de7bb", - "/css/dist/skins/skin-black-dark.min.css": "/css/dist/skins/skin-black-dark.min.css?id=f0b08873a06bb54daeee176a9459f4a9", - "/css/dist/skins/skin-blue.min.css": "/css/dist/skins/skin-blue.min.css?id=f677207c6cf9678eb539abecb408c374", - "/css/dist/skins/skin-blue-dark.min.css": "/css/dist/skins/skin-blue-dark.min.css?id=0640e45bad692dcf62873c6e85904899", - "/css/dist/skins/skin-yellow.min.css": "/css/dist/skins/skin-yellow.min.css?id=7b315b9612b8fde8f9c5b0ddb6bba690", - "/css/dist/skins/skin-yellow-dark.min.css": "/css/dist/skins/skin-yellow-dark.min.css?id=393aaa7b368b0670fc42434c8cca7dc7", - "/css/dist/skins/skin-red.min.css": "/css/dist/skins/skin-red.min.css?id=44bf834f2110504a793dadec132a5898", - "/css/dist/skins/skin-red-dark.min.css": "/css/dist/skins/skin-red-dark.min.css?id=ad39859637dafa781288630f9d6d6523", - "/css/dist/skins/skin-purple.min.css": "/css/dist/skins/skin-purple.min.css?id=6fe68325d5356197672c27bc77cedcb4", - "/css/dist/skins/skin-purple-dark.min.css": "/css/dist/skins/skin-purple-dark.min.css?id=f8b26018a1533b9db864247daaf06daa", - "/css/dist/skins/skin-orange.min.css": "/css/dist/skins/skin-orange.min.css?id=6f0563e726c2fe4fab4026daaa5bfdf2", - "/css/dist/skins/skin-orange-dark.min.css": "/css/dist/skins/skin-orange-dark.min.css?id=4fa7aa3ba499c8f4e390eb8549da3f74", - "/css/dist/skins/skin-contrast.min.css": "/css/dist/skins/skin-contrast.min.css?id=da6c7997d9de2f8329142399f0ce50da" + "/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=859e11e4e6b05c84e4b7302de29bac5e" } diff --git a/tests/Feature/Console/FixupAssignedToAssignedTypeTest.php b/tests/Feature/Console/FixupAssignedToAssignedTypeTest.php new file mode 100644 index 0000000000..db6fbe2a2d --- /dev/null +++ b/tests/Feature/Console/FixupAssignedToAssignedTypeTest.php @@ -0,0 +1,55 @@ +create(); + $user = User::factory()->create(); + $admin = User::factory()->admin()->create(); + + $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); + } + + public function testInvalidAssignedTo() + { + $asset = Asset::factory()->create(); + $user = User::factory()->create(); + $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); + } +}