Notification rework (#3103)

* Move slack integration to laravel5.3 style notifications, part 1.

* Fix consumable tab when active.

* Move the slack notifiable to the settings model.  Move all slack notifications into logCheckout/logCheckin.  Should think about refactoring this as an event at some point still.  Move Asset checkin/checkout to use the general loggable trait rather than it's own solution.

* Fix a logic error where assets with a non deployable status would show checkin instead of no button at all.

* Fix an html formatting error that resulted in us not closing a form.  This would cause the checkin page to try to submit a delete request (related to the modal form) rather than the desired checkin request.  Also fix formatting in this file.
This commit is contained in:
Daniel Meltzer 2016-12-26 18:19:04 -05:00 committed by snipe
parent 06af9311fc
commit cafafe851c
22 changed files with 380 additions and 398 deletions

View file

@ -3,9 +3,7 @@ namespace App\Http\Controllers;
use App\Helpers\Helper; use App\Helpers\Helper;
use App\Models\Accessory; use App\Models\Accessory;
use App\Models\Actionlog;
use App\Models\Company; use App\Models\Company;
use App\Models\Setting;
use App\Models\User; use App\Models\User;
use Auth; use Auth;
use Carbon\Carbon; use Carbon\Carbon;
@ -261,49 +259,17 @@ class AccessoriesController extends Controller
} }
// Update the accessory data // Update the accessory data
$accessory->assigned_to = e(Input::get('assigned_to')); $accessory->assigned_to = e(Input::get('assigned_to'));
$accessory->users()->attach($accessory->id, array( $accessory->users()->attach($accessory->id, [
'accessory_id' => $accessory->id, 'accessory_id' => $accessory->id,
'created_at' => Carbon::now(), 'created_at' => Carbon::now(),
'user_id' => Auth::user()->id, 'user_id' => Auth::id(),
'assigned_to' => e(Input::get('assigned_to')))); 'assigned_to' => $request->get('assigned_to')
]);
$logaction = $accessory->logCheckout(e(Input::get('note'))); $logaction = $accessory->logCheckout(e(Input::get('note')));
$admin_user = Auth::user();
$settings = Setting::getSettings();
if ($settings->slack_endpoint) {
$slack_settings = [
'username' => $settings->botname,
'channel' => $settings->slack_channel,
'link_names' => true
];
$client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings);
try {
$client->attach([
'color' => 'good',
'fields' => [
[
'title' => 'Checked Out:',
'value' => 'Accessory <'.route('accessories.show', $accessory->id).'|'.$accessory->name.'> checked out to <'.route('users.show', $user->id).'|'.$user->present()->fullName().'> by <'.route('users.show', $admin_user->id).'|'.$admin_user->present()->fullName().'>.'
],
[
'title' => 'Note:',
'value' => e(Input::get('note'))
],
]
])->send('Accessory Checked Out');
} catch (Exception $e) {
}
}
DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first(); DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first();
$data['log_id'] = $logaction->id; $data['log_id'] = $logaction->id;
@ -315,8 +281,7 @@ class AccessoriesController extends Controller
$data['expected_checkin'] = ''; $data['expected_checkin'] = '';
$data['note'] = $logaction->note; $data['note'] = $logaction->note;
$data['require_acceptance'] = $accessory->requireAcceptance(); $data['require_acceptance'] = $accessory->requireAcceptance();
// TODO: Port this to new mail notifications
if (($accessory->requireAcceptance()=='1') || ($accessory->getEula())) { if (($accessory->requireAcceptance()=='1') || ($accessory->getEula())) {
Mail::send('emails.accept-accessory', $data, function ($m) use ($user) { Mail::send('emails.accept-accessory', $data, function ($m) use ($user) {
@ -380,46 +345,9 @@ class AccessoriesController extends Controller
$return_to = e($accessory_user->assigned_to); $return_to = e($accessory_user->assigned_to);
$logaction = $accessory->logCheckin(User::find($return_to), e(Input::get('note'))); $logaction = $accessory->logCheckin(User::find($return_to), e(Input::get('note')));
$admin_user = Auth::user();
// Was the accessory updated? // Was the accessory updated?
if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) { if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) {
$settings = Setting::getSettings();
if ($settings->slack_endpoint) {
$slack_settings = [
'username' => e($settings->botname),
'channel' => e($settings->slack_channel),
'link_names' => true
];
$client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings);
try {
$client->attach([
'color' => 'good',
'fields' => [
[
'title' => 'Checked In:',
'value' => class_basename(strtoupper($logaction->item_type)).' <'.route('accessories.show', $accessory->id).'|'.e($accessory->name).'> checked in by <'.route('users.show', $admin_user->id).'|'.e($admin_user->present()->fullName()).'>.'
],
[
'title' => 'Note:',
'value' => e($logaction->note)
],
]
])->send('Accessory Checked In');
} catch (Exception $e) {
}
}
if (!is_null($accessory_user->assigned_to)) { if (!is_null($accessory_user->assigned_to)) {
$user = User::find($accessory_user->assigned_to); $user = User::find($accessory_user->assigned_to);
} }

View file

@ -421,13 +421,14 @@ class AssetsController extends Controller
} }
/** /**
* Validate and process the form data to check out an asset to a user. * Validate and process the form data to check out an asset to a user.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId * @param AssetCheckoutRequest $request
* @since [v1.0] * @param int $assetId
* @return Redirect * @return Redirect
*/ * @since [v1.0]
*/
public function postCheckout(AssetCheckoutRequest $request, $assetId) public function postCheckout(AssetCheckoutRequest $request, $assetId)
{ {
@ -453,9 +454,8 @@ class AssetsController extends Controller
} else { } else {
$expected_checkin = ''; $expected_checkin = '';
} }
if ($asset->checkOutToUser($user, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), e(Input::get('name')))) { if ($asset->checkOutToUser($user, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), e(Input::get('name')))) {
// Redirect to the new asset page // Redirect to the new asset page
return redirect()->to("hardware")->with('success', trans('admin/hardware/message.checkout.success')); return redirect()->to("hardware")->with('success', trans('admin/hardware/message.checkout.success'));
} }
@ -488,13 +488,15 @@ class AssetsController extends Controller
/** /**
* Validate and process the form data to check an asset back into inventory. * Validate and process the form data to check an asset back into inventory.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId * @param AssetCheckinRequest $request
* @since [v1.0] * @param int $assetId
* @return Redirect * @param null $backto
*/ * @return Redirect
* @since [v1.0]
*/
public function postCheckin(AssetCheckinRequest $request, $assetId = null, $backto = null) public function postCheckin(AssetCheckinRequest $request, $assetId = null, $backto = null)
{ {
// Check if the asset exists // Check if the asset exists
@ -525,51 +527,7 @@ class AssetsController extends Controller
} }
// Was the asset updated? // Was the asset updated?
if ($asset->save()) { if ($asset->save()) {
$logaction = $asset->logCheckin($user, e(request('note')));
if ($request->input('checkin_at') == Carbon::now()->format('Y-m-d')) {
$checkin_at = Carbon::now();
} else {
$checkin_at = $request->input('checkin_at').' 00:00:00';
}
$logaction = $asset->createLogRecord('checkin', $asset, $admin, $user, null, e(Input::get('note')), $checkin_at);
$settings = Setting::getSettings();
if ($settings->slack_endpoint) {
$slack_settings = [
'username' => $settings->botname,
'channel' => $settings->slack_channel,
'link_names' => true
];
$client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings);
try {
$client->attach([
'color' => 'good',
'fields' => [
[
'title' => 'Checked In:',
'value' => class_basename(
strtoupper($logaction->item_type))
.' asset <'.route('hardware.show', $asset->id).'|'.e($asset->present()->name())
.'> checked in by <'.route('users.show',Auth::user()->id)
.'|'.e(Auth::user()->present()->fullName()).'>.'
],
[
'title' => 'Note:',
'value' => e($logaction->note)
],
]
])->send('Asset Checked In');
} catch (Exception $e) {
}
}
$data['log_id'] = $logaction->id; $data['log_id'] = $logaction->id;
$data['first_name'] = $user->first_name; $data['first_name'] = $user->first_name;

View file

@ -295,43 +295,7 @@ class ComponentsController extends Controller
'asset_id' => $asset_id 'asset_id' => $asset_id
]); ]);
$logaction = $component->logCheckout(e(Input::get('note')), $asset_id); $component->logCheckout(e(Input::get('note')), $asset_id);
$settings = Setting::getSettings();
if ($settings->slack_endpoint) {
$slack_settings = [
'username' => $settings->botname,
'channel' => $settings->slack_channel,
'link_names' => true
];
$client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings);
try {
$client->attach([
'color' => 'good',
'fields' => [
[
'title' => 'Checked Out:',
'value' => class_basename(strtoupper($logaction->item_type))
.' <'.route('components.show', ['component' => $component->id]).'|'.$component->name
.'> checked out to <'.route('hardware.show', $asset->id).'|'.$asset->present()->name()
.'> by <'.route('users.show', $admin_user->id).'|'.$admin_user->present()->fullName().'>.'
],
[
'title' => 'Note:',
'value' => e($logaction->note)
],
]
])->send('Component Checked Out');
} catch (Exception $e) {
}
}
return redirect()->route('components.index')->with('success', trans('admin/components/message.checkout.success')); return redirect()->route('components.index')->with('success', trans('admin/components/message.checkout.success'));
} }

View file

@ -8,6 +8,7 @@ use App\Models\Company;
use App\Models\Consumable; use App\Models\Consumable;
use App\Models\Setting; use App\Models\Setting;
use App\Models\User; use App\Models\User;
use App\Notifications\CheckoutNotification;
use Auth; use Auth;
use Config; use Config;
use DB; use DB;
@ -267,43 +268,6 @@ class ConsumablesController extends Controller
]); ]);
$logaction = $consumable->logCheckout(e(Input::get('note'))); $logaction = $consumable->logCheckout(e(Input::get('note')));
$settings = Setting::getSettings();
if ($settings->slack_endpoint) {
$slack_settings = [
'username' => $settings->botname,
'channel' => $settings->slack_channel,
'link_names' => true
];
$client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings);
try {
$client->attach([
'color' => 'good',
'fields' => [
[
'title' => 'Checked Out:',
'value' => 'Consumable <'.route('consumables.show', $consumable->id).'|'.$consumable->name
.'> checked out to <'.route('users.show', $user->id).'|'.$user->fullName()
.'> by <'.route('users.show', $admin_user->id).'|'.$admin_user->fullName().'>.'
],
[
'title' => 'Note:',
'value' => e($logaction->note)
],
]
])->send('Consumable Checked Out');
} catch (Exception $e) {
}
}
$consumable_user = DB::table('consumables_users')->where('assigned_to', '=', $consumable->assigned_to)->where('consumable_id', '=', $consumable->id)->first();
$data['log_id'] = $logaction->id; $data['log_id'] = $logaction->id;
$data['eula'] = $consumable->getEula(); $data['eula'] = $consumable->getEula();
$data['first_name'] = $user->first_name; $data['first_name'] = $user->first_name;

View file

@ -2,6 +2,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Assets; use Assets;
use Illuminate\Support\Facades\Session;
use Input; use Input;
use Lang; use Lang;
use App\Models\License; use App\Models\License;
@ -9,18 +10,13 @@ use App\Models\Asset;
use App\Models\User; use App\Models\User;
use App\Models\Actionlog; use App\Models\Actionlog;
use DB; use DB;
use Redirect;
use App\Models\LicenseSeat; use App\Models\LicenseSeat;
use App\Models\Depreciation;
use App\Models\Company; use App\Models\Company;
use App\Models\Setting;
use App\Models\Supplier;
use Validator; use Validator;
use View; use View;
use Response; use Response;
use Slack; use Slack;
use Config; use Config;
use Session;
use App\Helpers\Helper; use App\Helpers\Helper;
use Auth; use Auth;
use Gate; use Gate;
@ -350,7 +346,6 @@ class LicensesController extends Controller
$licenseSeat = LicenseSeat::find($seatId); $licenseSeat = LicenseSeat::find($seatId);
$assigned_to = e($request->input('assigned_to')); $assigned_to = e($request->input('assigned_to'));
$asset_id = e($request->input('asset_id')); $asset_id = e($request->input('asset_id'));
$user = Auth::user();
$this->authorize('checkout', $licenseSeat); $this->authorize('checkout', $licenseSeat);
@ -414,53 +409,6 @@ class LicensesController extends Controller
$data['license_id'] =$licenseSeat->license_id; $data['license_id'] =$licenseSeat->license_id;
$data['note'] = $request->input('note'); $data['note'] = $request->input('note');
$license = License::find($licenseSeat->license_id);
$settings = Setting::getSettings();
// Update the asset data
if ($request->input('assigned_to') == '') {
$slack_msg = 'License <'.route('licenses.show', $license->id).'|'.$license->name
.'> checked out to <'.route('hardware.show',$asset->id) .'|'.$asset->present()->name()
.'> by <'.route('users.show', $user->id).'|'.$user->present()->fullName().'>.';
} else {
$slack_msg = 'License <'.route('licenses.show', $license->id).'|'.$license->name
.'> checked out to <'.route('users.show', $user->id).'|'.$is_assigned_to->present()->fullName()
.'> by <'.route('users.show', $user->id) .'|'.$user->present()->fullName().'>.';
}
if ($settings->slack_endpoint) {
$slack_settings = [
'username' => $settings->botname,
'channel' => $settings->slack_channel,
'link_names' => true
];
$client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings);
try {
$client->attach([
'color' => 'good',
'fields' => [
[
'title' => 'Checked Out:',
'value' => $slack_msg
],
[
'title' => 'Note:',
'value' => e($request->input('note'))
],
]
])->send('License Checked Out');
} catch (Exception $e) {
}
}
// Redirect to the new asset page // Redirect to the new asset page
return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.checkout.success')); return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.checkout.success'));
} }
@ -541,51 +489,15 @@ class LicensesController extends Controller
$licenseSeat->assigned_to = null; $licenseSeat->assigned_to = null;
$licenseSeat->asset_id = null; $licenseSeat->asset_id = null;
$user = Auth::user();
// Was the asset updated? // Was the asset updated?
if ($licenseSeat->save()) { if ($licenseSeat->save()) {
$licenseSeat->logCheckin($return_to, e($request->input('note'))); $licenseSeat->logCheckin($return_to, e(request('note')));
$settings = Setting::getSettings();
if ($settings->slack_endpoint) {
$slack_settings = [
'username' => $settings->botname,
'channel' => $settings->slack_channel,
'link_names' => true
];
$client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings);
try {
$client->attach([
'color' => 'good',
'fields' => [
[
'title' => 'Checked In:',
'value' => 'License: <'.route('licenses.show', $license->id).'|'.$license->name
.'> checked in by <'.route('users.show', $user->id).'|'.$user->present()->fullName().'>.'
],
[
'title' => 'Note:',
'value' => e($request->input('note'))
],
]
])->send('License Checked In');
} catch (Exception $e) {
}
}
if ($backTo=='user') { if ($backTo=='user') {
return redirect()->route("users.show", $return_to->id)->with('success', trans('admin/licenses/message.checkin.success')); return redirect()->route("users.show", $return_to->id)->with('success', trans('admin/licenses/message.checkin.success'));
} }
redirect()->route("licenses.show", $licenseSeat->license_id)->with('success', trans('admin/licenses/message.checkin.success')); return redirect()->route("licenses.show", $licenseSeat->license_id)->with('success', trans('admin/licenses/message.checkin.success'));
} }
// Redirect to the license page with error // Redirect to the license page with error
return redirect()->route("licenses.index")->with('error', trans('admin/licenses/message.checkin.error')); return redirect()->route("licenses.index")->with('error', trans('admin/licenses/message.checkin.error'));
} }

View file

@ -105,13 +105,10 @@ class Asset extends Depreciable
$this->assigneduser()->associate($user); $this->assigneduser()->associate($user);
if($name != null) if($name != null) {
{
$this->name = $name; $this->name = $name;
} }
$settings = Setting::getSettings();
if ($this->requireAcceptance()) { if ($this->requireAcceptance()) {
$this->accepted="pending"; $this->accepted="pending";
} }
@ -119,19 +116,11 @@ class Asset extends Depreciable
if ($this->save()) { if ($this->save()) {
$this->logCheckout($note);
// $action, $admin, $user, $expected_checkin = null, $note = null, $checkout_at = null
$log = $this->createLogRecord('checkout', $this, $admin, $user, $expected_checkin, $note, $checkout_at);
if ((($this->requireAcceptance()=='1') || ($this->getEula())) && ($user->email!='')) { if ((($this->requireAcceptance()=='1') || ($this->getEula())) && ($user->email!='')) {
$this->checkOutNotifyMail($log->id, $user, $checkout_at, $expected_checkin, $note); $this->checkOutNotifyMail($log->id, $user, $checkout_at, $expected_checkin, $note);
} }
if ($settings->slack_endpoint) {
$this->checkOutNotifySlack($settings, $admin, $note);
}
return true; return true;
} }
return false; return false;
@ -161,43 +150,6 @@ class Asset extends Depreciable
} }
public function checkOutNotifySlack($settings, $admin, $note = null)
{
if ($settings->slack_endpoint) {
$slack_settings = [
'username' => $settings->botname,
'channel' => $settings->slack_channel,
'link_names' => true
];
$client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings);
try {
$client->attach([
'color' => 'good',
'fields' => [
[
'title' => 'Checked Out:',
'value' => 'HARDWARE asset <'.route('hardware.show', $this->id).'|'.$this->present()->name()
.'> checked out to <'.route('users.show', $this->assigned_to).'|'.$this->assigneduser->present()->fullName()
.'> by <'.route('users.show', Auth::user()->id).'|'.$admin->present()->fullName().'>.'
],
[
'title' => 'Note:',
'value' => e($note)
],
]
])->send('Asset Checked Out');
} catch (Exception $e) {
LOG::error($e);
}
}
}
public function getDetailedNameAttribute() public function getDetailedNameAttribute()
{ {
@ -214,38 +166,6 @@ class Asset extends Depreciable
} }
public function createLogRecord($action, $asset, $admin, $user, $expected_checkin = null, $note = null, $checkout_at = null)
{
$logaction = new Actionlog();
$logaction->item_type = Asset::class;
$logaction->item_id = $this->id;
$logaction->target_type = User::class;
// On Checkin, this is the user that previously had the asset.
$logaction->target_id = $user->id;
$logaction->note = $note;
$logaction->user_id = $admin->id;
if ($checkout_at!='') {
$logaction->created_at = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', date('Y-m-d H:i:s', strtotime($checkout_at)));
} else {
$logaction->created_at = \Carbon\Carbon::now();
}
if ($action=="checkout") {
if ($user) {
$logaction->location_id = $user->location_id;
}
} else {
// Update the asset data to null, since it's being checked in
$logaction->location_id = null;
}
$logaction->user()->associate($admin);
$log = $logaction->logaction($action);
return $logaction;
}
/** /**
* Set depreciation relationship * Set depreciation relationship
*/ */

View file

@ -6,6 +6,8 @@ use App\Models\Actionlog;
use App\Models\Asset; use App\Models\Asset;
use App\Models\CheckoutRequest; use App\Models\CheckoutRequest;
use App\Models\User; use App\Models\User;
use App\Notifications\CheckinNotification;
use App\Notifications\CheckoutNotification;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
trait Loggable trait Loggable
@ -55,6 +57,14 @@ trait Loggable
$log->note = $note; $log->note = $note;
$log->logaction('checkout'); $log->logaction('checkout');
$params = [
'item' => $log->item,
'target' => $log->target,
'admin' => $log->user,
'note' => $note
];
Setting::getSettings()->notify(new CheckoutNotification($params));
return $log; return $log;
} }
@ -80,6 +90,13 @@ trait Loggable
$log->user_id = Auth::user()->id; $log->user_id = Auth::user()->id;
$log->logaction('checkin from'); $log->logaction('checkin from');
$params = [
'item' => $log->item,
'admin' => $log->user,
'note' => $note
];
Setting::getSettings()->notify(new CheckinNotification($params));
return $log; return $log;
} }

View file

@ -2,11 +2,13 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Watson\Validating\ValidatingTrait; use Watson\Validating\ValidatingTrait;
use Schema; use Schema;
class Setting extends Model class Setting extends Model
{ {
use Notifiable;
protected $injectUniqueIdentifier = true; protected $injectUniqueIdentifier = true;
use ValidatingTrait; use ValidatingTrait;
@ -143,4 +145,16 @@ class Setting extends Model
} }
return $result; return $result;
} }
/**
* The url for slack notifications.
* Used by Notifiable trait.
* @return mixed
*/
public function routeNotificationForSlack()
{
// At this point the endpoint is the same for everything.
// In the future this may want to be adapted for individual notifications.
return $this->slack_endpoint;
}
} }

View file

@ -0,0 +1,96 @@
<?php
namespace App\Notifications;
use App\Models\Setting;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\SlackMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
class CheckinNotification extends Notification
{
use Queueable;
/**
* @var
*/
private $params;
/**
* Create a new notification instance.
*
* @param $params
*/
public function __construct($params)
{
//
$this->params = $params;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
$notifyBy = [];
if(Setting::getSettings()->slack_endpoint) {
$notifyBy[] = 'slack';
}
$item = $this->params['item'];
if (
(method_exists($item, 'requireAcceptance') && ($item->requireAcceptance()=='1'))
|| (method_exists($item, 'getEula') && ($item->getEula()))
) {
$notifyBy[] = 'mail';
}
return $notifyBy;
}
public function toSlack($notifiable)
{
return (new SlackMessage)
->success()
->content(class_basename(get_class($this->params['item'])) . " Checked In")
->attachment(function ($attachment) use ($notifiable) {
$item = $this->params['item'];
$admin_user = $this->params['admin'];
$fields = [
'By' => '<'.$admin_user->present()->viewUrl().'|'.$admin_user->present()->fullName().'>',
];
array_key_exists('note', $this->params) && $fields['Notes'] = $this->params['note'];
$attachment->title($item->name, $item->present()->viewUrl() )
->fields($fields);
});
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\sMessages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', 'https://laravel.com')
->line('Thank you for using our application!');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
}

View file

@ -0,0 +1,101 @@
<?php
namespace App\Notifications;
use App\Models\Setting;
use App\Models\SnipeModel;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\SlackMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
class CheckoutNotification extends Notification
{
use Queueable;
/**
* @var
*/
private $params;
/**
* Create a new notification instance.
*
* @param $params
*/
public function __construct($params)
{
//
$this->params = $params;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
$notifyBy = [];
if(Setting::getSettings()->slack_endpoint) {
$notifyBy[] = 'slack';
}
$item = $this->params['item'];
if (
(method_exists($item, 'requireAcceptance') && ($item->requireAcceptance()=='1'))
|| (method_exists($item, 'getEula') && ($item->getEula()))
) {
$notifyBy[] = 'mail';
}
return $notifyBy;
}
public function toSlack($notifiable)
{
return (new SlackMessage)
->success()
->content(class_basename(get_class($this->params['item'])) . " Checked Out")
->attachment(function ($attachment) use ($notifiable) {
$item = $this->params['item'];
$admin_user = $this->params['admin'];
$target = $this->params['target'];
$fields = [
'To' => '<'.$target->present()->viewUrl().'|'.$target->present()->fullName().'>',
'By' => '<'.$admin_user->present()->viewUrl().'|'.$admin_user->present()->fullName().'>'
];
array_key_exists('note', $this->params) && $fields['Notes'] = $this->params['note'];
$attachment->title($item->name, $item->present()->viewUrl() )
->fields($fields);
});
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', 'https://laravel.com')
->line('Thank you for using our application!');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
}

View file

@ -159,4 +159,13 @@ class AccessoryPresenter extends Presenter
{ {
return (string) link_to_route('accessories.show', $this->name, $this->id); return (string) link_to_route('accessories.show', $this->name, $this->id);
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('accessories.show', $this->id);
}
} }

View file

@ -115,4 +115,13 @@ class AssetModelPresenter extends Presenter
} }
return ''; return '';
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('models.show', $this->id);
}
} }

View file

@ -56,9 +56,11 @@ class AssetPresenter extends Presenter
} }
} else { } else {
if (Gate::allows('checkin', $this->model)) { if (!empty($this->model->assigned_to)) {
$inout = '<a href="' . route('checkin/hardware', if (Gate::allows('checkin', $this->model)) {
$this->model->id) . '" class="btn btn-primary btn-sm" title="Checkin this asset" data-toggle="tooltip">' . trans('general.checkin') . '</a>'; $inout = '<a href="' . route('checkin/hardware',
$this->model->id) . '" class="btn btn-primary btn-sm" title="Checkin this asset" data-toggle="tooltip">' . trans('general.checkin') . '</a>';
}
} }
} }
@ -202,6 +204,14 @@ class AssetPresenter extends Presenter
} }
} }
/**
* Helper for notification polymorphism.
* @return mixed
*/
public function fullName()
{
return $this->name();
}
/** /**
* Returns the date this item hits EOL. * Returns the date this item hits EOL.
* @return false|string * @return false|string
@ -247,4 +257,13 @@ class AssetPresenter extends Presenter
date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months')); date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months'));
return date_format($date, 'Y-m-d'); return date_format($date, 'Y-m-d');
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('hardware.show', $this->id);
}
} }

View file

@ -45,4 +45,13 @@ class CategoryPresenter extends Presenter
{ {
return (string) link_to_route('categories.show', $this->name, $this->id); return (string) link_to_route('categories.show', $this->name, $this->id);
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('categories.show', $this->id);
}
} }

View file

@ -17,4 +17,13 @@ class CompanyPresenter extends Presenter
{ {
return (string) link_to_route('companies.show', $this->name, $this->id); return (string) link_to_route('companies.show', $this->name, $this->id);
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('companies.show', $this->id);
}
} }

View file

@ -68,4 +68,12 @@ class ComponentPresenter extends Presenter
{ {
return (string) link_to_route('components.show', $this->name, $this->id); return (string) link_to_route('components.show', $this->name, $this->id);
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('components.show', $this->id);
}
} }

View file

@ -66,4 +66,13 @@ class ConsumablePresenter extends Presenter
{ {
return (string)link_to_route('consumables.show', $this->name, $this->id); return (string)link_to_route('consumables.show', $this->name, $this->id);
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('consumables.show', $this->id);
}
} }

View file

@ -84,4 +84,13 @@ class LicensePresenter extends Presenter
{ {
return (string) link_to('/licenses/'.$this->id, mb_strimwidth($this->serial, 0, 50, "...")); return (string) link_to('/licenses/'.$this->id, mb_strimwidth($this->serial, 0, 50, "..."));
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('licenses.show', $this->id);
}
} }

View file

@ -55,4 +55,13 @@ class LocationPresenter extends Presenter
{ {
return (string)link_to_route('locations.show', $this->name, $this->id); return (string)link_to_route('locations.show', $this->name, $this->id);
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('locations.show', $this->id);
}
} }

View file

@ -50,4 +50,13 @@ class ManufacturerPresenter extends Presenter
{ {
return (string) link_to_route('manufacturers.show', $this->name, $this->id); return (string) link_to_route('manufacturers.show', $this->name, $this->id);
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('manufacturers.show', $this->id);
}
} }

View file

@ -138,4 +138,13 @@ class UserPresenter extends Presenter
{ {
return (string) link_to_route('users.show', $this->fullName(), $this->id); return (string) link_to_route('users.show', $this->fullName(), $this->id);
} }
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('users.show', $this->id);
}
} }

View file

@ -27,7 +27,7 @@
<div class="box box-default"> <div class="box box-default">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title"> {{ $licenseseat->license->name }}</h3> <h3 class="box-title"> {{ $licenseSeat->license->name }}</h3>
</div> </div>
<div class="box-body"> <div class="box-body">
@ -37,7 +37,7 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label> <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<p class="form-control-static">{{ $licenseseat->license->name }}</p> <p class="form-control-static">{{ $licenseSeat->license->name }}</p>
</div> </div>
</div> </div>
@ -45,7 +45,7 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label">{{ trans('admin/hardware/form.serial') }}</label> <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.serial') }}</label>
<div class="col-md-10"> <div class="col-md-10">
<p class="form-control-static" style="word-wrap: break-word;">{{ $licenseseat->license->serial }}</p> <p class="form-control-static" style="word-wrap: break-word;">{{ $licenseSeat->license->serial }}</p>
</div> </div>
</div> </div>
@ -55,7 +55,7 @@
</label> </label>
<div class="col-md-10"> <div class="col-md-10">
{{ Form::select('asset_id', $asset_list , Input::old('asset_id', $licenseseat->asset_id), array('class'=>'select2', 'style'=>'min-width:600px')) }} {{ Form::select('asset_id', $asset_list , Input::old('asset_id', $licenseSeat->asset_id), array('class'=>'select2', 'style'=>'min-width:600px')) }}
{!! $errors->first('asset_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!} {!! $errors->first('asset_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
</div> </div>
</div> </div>
@ -67,7 +67,7 @@
</label> </label>
<div class="col-md-9"> <div class="col-md-9">
{{ Form::select('assigned_to', $users_list , Input::old('assigned_to', $licenseseat->assigned_to), array('class'=>'select2', 'style'=>'min-width:350px')) }} {{ Form::select('assigned_to', $users_list , Input::old('assigned_to', $licenseSeat->assigned_to), array('class'=>'select2', 'style'=>'min-width:350px')) }}
{!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!} {!! $errors->first('assigned_to', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
<p class="help-block"> <p class="help-block">
@ -82,7 +82,7 @@
<div class="form-group {{ $errors->has('note') ? 'error' : '' }}"> <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
<label for="note" class="col-md-2 control-label">{{ trans('admin/hardware/form.notes') }}</label> <label for="note" class="col-md-2 control-label">{{ trans('admin/hardware/form.notes') }}</label>
<div class="col-md-7"> <div class="col-md-7">
<textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $licenseseat->note) }}</textarea> <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $licenseSeat->note) }}</textarea>
{!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!} {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
</div> </div>
</div> </div>