Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions app/Console/Commands/SyncAssetCounters.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\Asset;

class SyncAssetCounters extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'snipeit:counter-sync';

/**
* The console command description.
*
* @var string
*/
protected $description = 'Syncs checkedout, checked in, and requested counters for assets';

/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}

/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$start = microtime(true);
$assets = Asset::withCount('checkins', 'checkouts', 'userRequests')
->withTrashed()->get();

if ($assets) {
if ($assets->count() > 0) {
$bar = $this->output->createProgressBar($assets->count());

foreach ($assets as $asset) {
$asset->checkin_counter = (int) $asset->checkins_count;
$asset->checkout_counter = (int) $asset->checkouts_count;
$asset->requests_counter = (int) $asset->user_requests_count;
$asset->unsetEventDispatcher();
$asset->save();
$output['info'][] = 'Asset: ' . $asset->id . ' has ' . $asset->checkin_counter . ' checkins, ' . $asset->checkout_counter . ' checkouts, and ' . $asset->requests_counter . ' requests';
$bar->advance();
}
$bar->finish();

foreach ($output['info'] as $key => $output_text) {
$this->info($output_text);
}

$time_elapsed_secs = microtime(true) - $start;
$this->info('Sync executed in ' . $time_elapsed_secs . ' seconds');

} else {
$this->info('No assets to sync');
}

}



}
}
1 change: 1 addition & 0 deletions app/Console/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class Kernel extends ConsoleKernel
Commands\ResetDemoSettings::class,
Commands\SyncAssetLocations::class,
Commands\RegenerateAssetTags::class,
Commands\SyncAssetCounters::class,
];

/**
Expand Down
8 changes: 4 additions & 4 deletions app/Http/Controllers/Api/AssetsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ public function index(Request $request)
'last_audit_date',
'next_audit_date',
'warranty_months',
'checkouts_count',
'checkins_count',
'user_requests_count',
'checkout_counter',
'checkin_counter',
'requests_counter',
];

$filter = array();
Expand All @@ -95,7 +95,7 @@ public function index(Request $request)

$assets = Company::scopeCompanyables(Asset::select('assets.*'),"company_id","assets")
->with('location', 'assetstatus', 'assetlog', 'company', 'defaultLoc','assignedTo',
'model.category', 'model.manufacturer', 'model.fieldset','supplier')->withCount('checkins', 'checkouts', 'userRequests');
'model.category', 'model.manufacturer', 'model.fieldset','supplier');


// These are used by the API to query against specific ID numbers.
Expand Down
4 changes: 3 additions & 1 deletion app/Http/Controllers/ViewAssetsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -181,15 +181,17 @@ public function getRequestAsset($assetId = null)
// If it's already requested, cancel the request.
if ($asset->isRequestedBy(Auth::user())) {
$asset->cancelRequest();
$asset->decrement('requests_counter', 1);

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is requests_count the number of times it's ever been requested or the number of times it's currently requested?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ever been requested - unless a user actively cancels that request

$logaction->logaction('request canceled');
$settings->notify(new RequestAssetCancelationNotification($data));
return redirect()->route('requestable-assets')
->with('success')->with('success', trans('admin/hardware/message.requests.cancel-success'));
} else {

$logaction->logaction('requested');

$asset->request();
$asset->increment('requests_counter', 1);
$settings->notify(new RequestAssetNotification($data));


Expand Down
6 changes: 3 additions & 3 deletions app/Http/Transformers/AssetsTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ public function transformAsset(Asset $asset)
'last_checkout' => Helper::getFormattedDateObject($asset->last_checkout, 'datetime'),
'expected_checkin' => Helper::getFormattedDateObject($asset->expected_checkin, 'date'),
'purchase_cost' => Helper::formatCurrencyOutput($asset->purchase_cost),
'checkins_count' => (int) $asset->checkins_count,
'checkouts_count' => (int) $asset->checkouts_count,
'user_requests_count' => (int) $asset->user_requests_count,
'checkin_counter' => (int) $asset->checkin_counter,
'checkout_counter' => (int) $asset->checkout_counter,
'requests_counter' => (int) $asset->requests_counter,
'user_can_checkout' => (bool) $asset->availableForCheckout(),
];

Expand Down
2 changes: 2 additions & 0 deletions app/Models/Asset.php
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,8 @@ public function checkOut($target, $admin = null, $checkout_at = null, $expected_

if ($this->save()) {
$this->logCheckout($note, $target);
\Log::debug('Increment the checkout count for asset: '.$this->id);
$this->increment('checkout_counter', 1);
return true;
}
return false;
Expand Down
11 changes: 10 additions & 1 deletion app/Models/Loggable.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function logCheckout($note, $target /* What are we checking out to? */)
if ($log->target_type == Location::class) {
$log->location_id = $target->id;
} elseif ($log->target_type == Asset::class) {
$log->location_id = $target->rtd_location_id;
$log->location_id = $target->location_id;
} else {
$log->location_id = $target->location_id;
}
Expand Down Expand Up @@ -121,8 +121,17 @@ public function logCheckin($target, $note)
$log->item_type = License::class;
$log->item_id = $this->license_id;
} else {

$log->item_type = static::class;
$log->item_id = $this->id;

if (static::class == Asset::class) {
if ($asset = Asset::find($log->item_id)) {
\Log::debug('Increment the checkin count for asset: '.$log->item_id);
$asset->increment('checkin_counter', 1);
}
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd say the same thing here, but I don't know if we ever finished extracting a checkin function.... I thought I had but I may have gotten distracted.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same - not sure.

}


Expand Down
6 changes: 3 additions & 3 deletions app/Presenters/AssetPresenter.php
Original file line number Diff line number Diff line change
Expand Up @@ -182,21 +182,21 @@ public static function dataTableLayout()
"title" => trans('general.notes'),

], [
"field" => "checkouts_count",
"field" => "checkout_counter",
"searchable" => false,
"sortable" => true,
"visible" => false,
"title" => trans('general.checkouts_count')

],[
"field" => "checkins_count",
"field" => "checkin_counter",
"searchable" => false,
"sortable" => true,
"visible" => false,
"title" => trans('general.checkins_count')

], [
"field" => "user_requests_count",
"field" => "requests_counter",
"searchable" => false,
"sortable" => true,
"visible" => false,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class DenormCountersOnAssets extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('assets', function (Blueprint $table) {
$table->integer('checkin_counter')->default(0);
$table->integer('checkout_counter')->default(0);
$table->integer('requests_counter')->default(0);
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('assets', function (Blueprint $table) {
$table->dropColumn('checkin_counter');
$table->dropColumn('checkout_counter');
$table->dropColumn('requests_counter');
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use App\Models\Asset;

class AddFirstCounterTotalsToAssets extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// This artisan call may take a while
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to put some console output here from the migration warning users about the delay? Not sure..

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Things don't always output as expected in migrations. Could try tho.

\Log::info('This could take a while.... ');
Artisan::call('snipeit:counter-sync');
$output = Artisan::output();
\Log::info($output);

}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}