This commit is contained in:
2024-04-21 14:42:52 +02:00
parent 4b69674ede
commit 8a25f53c99
10700 changed files with 55767 additions and 14201 deletions

View File

@ -0,0 +1,172 @@
<?php
namespace App\Presenters;
/**
* Class AccessoryPresenter
*/
class AccessoryPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'image',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/hardware/table.image'),
'visible' => true,
'formatter' => 'imageFormatter',
], [
'field' => 'company',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/companies/table.title'),
'visible' => false,
'formatter' => 'companiesLinkObjFormatter',
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('general.name'),
'formatter' => 'accessoriesLinkFormatter',
], [
'field' => 'category',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/accessories/general.accessory_category'),
'formatter' => 'categoriesLinkObjFormatter',
], [
'field' => 'model_number',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/models/table.modelnumber'),
'formatter' => 'accessoriesLinkFormatter',
], [
'field' => 'manufacturer',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.manufacturer'),
'visible' => false,
'formatter' => 'manufacturersLinkObjFormatter',
], [
'field' => 'supplier',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.supplier'),
'visible' => false,
'formatter' => 'suppliersLinkObjFormatter',
], [
'field' => 'location',
'searchable' => true,
'sortable' => true,
'title' => trans('general.location'),
'formatter' => 'locationsLinkObjFormatter',
], [
'field' => 'qty',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/accessories/general.total'),
], [
'field' => 'remaining_qty',
'searchable' => false,
'sortable' => false,
'visible' => false,
'title' => trans('admin/accessories/general.remaining'),
],[
'field' => 'users_count',
'searchable' => false,
'sortable' => true,
'visible' => true,
'title' => trans('general.checked_out'),
], [
'field' => 'min_qty',
'searchable' => false,
'sortable' => true,
'title' => trans('general.min_amt'),
], [
'field' => 'purchase_date',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.purchase_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'purchase_cost',
'searchable' => true,
'sortable' => true,
'title' => trans('general.purchase_cost'),
'footerFormatter' => 'sumFormatterQuantity',
'class' => 'text-right',
], [
'field' => 'order_number',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.order_number'),
],[
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.notes'),
'formatter' => 'notesFormatter'
], [
'field' => 'change',
'searchable' => false,
'sortable' => false,
'visible' => true,
'title' => trans('general.change'),
'formatter' => 'accessoriesInOutFormatter',
], [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'accessoriesActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Pregenerated link to this accessories view page.
* @return string
*/
public function nameUrl()
{
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);
}
public function name()
{
return $this->model->name;
}
}

View File

@ -0,0 +1,141 @@
<?php
namespace App\Presenters;
/**
* Class CompanyPresenter
*/
class ActionlogPresenter extends Presenter
{
public function admin()
{
if ($user = $this->model->user) {
if (empty($user->deleted_at)) {
return $user->present()->nameUrl();
}
// The user was deleted
return '<del>'.$user->getFullNameAttribute().'</del> (deleted)';
}
return '';
}
public function item()
{
if ($this->action_type == 'uploaded') {
return (string) link_to_route('show/userfile', $this->model->filename, [$this->model->item->id, $this->model->id]);
}
if ($item = $this->model->item) {
if (empty($item->deleted_at)) {
return $this->model->item->present()->nameUrl();
}
// The item was deleted
return '<del>'.$item->name.'</del> (deleted)';
}
return '';
}
public function icon()
{
// User related icons
if ($this->itemType() == 'user') {
if ($this->actionType()=='2fa reset') {
return 'fa-solid fa-mobile-screen';
}
if ($this->actionType()=='create new') {
return 'fa-solid fa-user-plus';
}
if ($this->actionType()=='merged') {
return 'fa-solid fa-people-arrows';
}
if ($this->actionType()=='delete') {
return 'fa-solid fa-user-minus';
}
if ($this->actionType()=='delete') {
return 'fa-solid fa-user-minus';
}
if ($this->actionType()=='update') {
return 'fa-solid fa-user-pen';
}
return 'fa-solid fa-user';
}
// Everything else
if ($this->actionType()=='create new') {
return 'fa-solid fa-plus';
}
if ($this->actionType()=='delete') {
return 'fa-solid fa-user-xmark';
}
if ($this->actionType()=='update') {
return 'fa-solid fa-pen';
}
if ($this->actionType()=='restore') {
return 'fa-solid fa-trash-arrow-up';
}
if ($this->actionType()=='upload') {
return 'fas fa-paperclip';
}
if ($this->actionType()=='checkout') {
return 'fa-solid fa-rotate-left';
}
if ($this->actionType()=='checkin from') {
return 'fa-solid fa-rotate-right';
}
return 'fa-solid fa-rotate-right';
}
public function actionType()
{
return mb_strtolower(trans('general.'.str_replace(' ', '_', $this->action_type)));
}
public function target()
{
$target = null;
// Target is messy.
// On an upload, the target is the item we are uploading to, stored as the "item" in the log.
if ($this->action_type == 'uploaded') {
$target = $this->model->item;
} elseif (($this->action_type == 'accepted') || ($this->action_type == 'declined')) {
// If we are logging an accept/reject, the target is not stored directly,
// so we access it through who the item is assigned to.
// FIXME: On a reject it's not assigned to anyone.
$target = $this->model->item->assignedTo;
} elseif ($this->action_type == 'requested') {
if ($this->model->user) {
$target = $this->model->user;
}
} elseif ($this->model->target) {
// Otherwise, we'll just take the target of the log.
$target = $this->model->target;
}
if ($target) {
if (empty($target->deleted_at)) {
return $target->present()->nameUrl();
}
return '<del>'.$target->present()->name().'</del>';
}
return '';
}
}

View File

@ -0,0 +1,272 @@
<?php
namespace App\Presenters;
use App\Models\CustomField;
use DateTime;
/**
* Class AssetPresenter
*/
class AssetAuditPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'checkbox',
'checkbox' => true,
],
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'company',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.company'),
'visible' => false,
'formatter' => 'assetCompanyObjFilterFormatter',
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.name'),
'visible' => true,
'formatter' => 'hardwareLinkFormatter',
], [
'field' => 'file',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/hardware/table.image'),
'visible' => false,
'formatter' => 'auditImageFormatter',
], [
'field' => 'asset_tag',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/table.asset_tag'),
'visible' => true,
'formatter' => 'hardwareLinkFormatter',
], [
'field' => 'serial',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.serial'),
'visible' => true,
'formatter' => 'hardwareLinkFormatter',
], [
'field' => 'model',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.model'),
'visible' => true,
'formatter' => 'modelsLinkObjFormatter',
], [
'field' => 'model_number',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/models/table.modelnumber'),
'visible' => false,
], [
'field' => 'category',
'searchable' => true,
'sortable' => true,
'title' => trans('general.category'),
'visible' => false,
'formatter' => 'categoriesLinkObjFormatter',
], [
'field' => 'status_label',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/table.status'),
'visible' => true,
'formatter' => 'statuslabelsLinkObjFormatter',
], [
'field' => 'assigned_to',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.checkedout_to'),
'visible' => true,
'formatter' => 'polymorphicItemFormatter',
], [
'field' => 'location',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/table.location'),
'visible' => true,
'formatter' => 'deployedLocationFormatter',
], [
'field' => 'rtd_location',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.default_location'),
'visible' => false,
'formatter' => 'deployedLocationFormatter',
], [
'field' => 'manufacturer',
'searchable' => true,
'sortable' => true,
'title' => trans('general.manufacturer'),
'visible' => false,
'formatter' => 'manufacturersLinkObjFormatter',
], [
'field' => 'purchase_date',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.purchase_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'purchase_cost',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.purchase_cost'),
'footerFormatter' => 'sumFormatter',
'class' => 'text-right',
], [
'field' => 'order_number',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.order_number'),
'formatter' => 'orderNumberObjFilterFormatter',
], [
'field' => 'eol',
'searchable' => false,
'sortable' => false,
'visible' => false,
'title' => trans('general.eol'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'warranty_months',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/form.warranty'),
], [
'field' => 'warranty_expires',
'searchable' => false,
'sortable' => false,
'visible' => false,
'title' => trans('admin/hardware/form.warranty_expires'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.notes'),
], [
'field' => 'checkout_counter',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.checkouts_count'),
], [
'field' => 'checkin_counter',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.checkins_count'),
], [
'field' => 'requests_counter',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.user_requests_count'),
], [
'field' => 'created_at',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.created_at'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'updated_at',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.updated_at'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'last_checkout',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/table.checkout_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'expected_checkin',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/form.expected_checkin'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'last_audit_date',
'searchable' => false,
'sortable' => true,
'visible' => true,
'title' => trans('general.last_audit'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'next_audit_date',
'searchable' => false,
'sortable' => true,
'visible' => true,
'title' => trans('general.next_audit_date'),
'formatter' => 'dateDisplayFormatter',
],
];
// This looks complicated, but we have to confirm that the custom fields exist in custom fieldsets
// *and* those fieldsets are associated with models, otherwise we'll trigger
// javascript errors on the bootstrap tables side of things, since we're asking for properties
// on fields that will never be passed through the REST API since they're not associated with
// models. We only pass the fieldsets that pertain to each asset (via their model) so that we
// don't junk up the REST API with tons of custom fields that don't apply
$fields = CustomField::whereHas('fieldset', function ($query) {
$query->whereHas('models');
})->get();
foreach ($fields as $field) {
$layout[] = [
'field' => 'custom_fields.'.$field->db_column,
'searchable' => true,
'sortable' => true,
'visible' => false,
'switchable' => true,
'title' => ($field->field_encrypted == '1') ? '<i class="fas fa-lock"></i> '.e($field->name) : e($field->name),
'formatter' => 'customFieldsFormatter',
];
}
$layout[] = [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'hardwareAuditFormatter',
];
return json_encode($layout);
}
}

View File

@ -0,0 +1,138 @@
<?php
namespace App\Presenters;
/**
* Class AssetModelPresenter
*/
class AssetMaintenancesPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'company',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/companies/table.title'),
'visible' => false,
'formatter' => 'companiesLinkObjFormatter',
], [
'field' => 'asset_name',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/asset_maintenances/table.asset_name'),
'formatter' => 'assetNameLinkFormatter',
], [
'field' => 'asset_tag',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/table.asset_tag'),
'formatter' => 'assetTagLinkFormatter',
], [
'field' => 'serial',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/table.serial'),
'formatter' => 'assetSerialLinkFormatter',
], [
'field' => 'status_label',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/table.status'),
'visible' => true,
'formatter' => 'statuslabelsLinkObjFormatter',
], [
'field' => 'model',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/hardware/form.model'),
'visible' => false,
'formatter' => 'modelsLinkObjFormatter',
], [
'field' => 'supplier',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.supplier'),
'visible' => false,
'formatter' => 'suppliersLinkObjFormatter',
], [
'field' => 'location',
'searchable' => true,
'sortable' => true,
'title' => trans('general.location'),
'formatter' => 'locationsLinkObjFormatter',
], [
'field' => 'asset_maintenance_type',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/asset_maintenances/form.asset_maintenance_type'),
], [
'field' => 'title',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('admin/asset_maintenances/form.title'),
], [
'field' => 'start_date',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/asset_maintenances/form.start_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'completion_date',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/asset_maintenances/form.completion_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/asset_maintenances/form.notes'),
], [
'field' => 'is_warranty',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/asset_maintenances/table.is_warranty'),
'formatter' => 'trueFalseFormatter'
], [
'field' => 'cost',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/asset_maintenances/form.cost'),
'class' => 'text-right',
], [
'field' => 'user_id',
'searchable' => true,
'sortable' => true,
'title' => trans('general.admin'),
'formatter' => 'usersLinkObjFormatter',
], [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'visible' => true,
'formatter' => 'maintenancesActionsFormatter',
],
];
return json_encode($layout);
}
}

View File

@ -0,0 +1,250 @@
<?php
namespace App\Presenters;
use App\Helpers\Helper;
/**
* Class AssetModelPresenter
*/
class AssetModelPresenter extends Presenter
{
public static function dataTableLayout()
{
$layout = [
[
'field' => 'checkbox',
'checkbox' => true,
],
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'company',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/companies/table.title'),
'visible' => false,
'formatter' => 'companiesLinkObjFormatter',
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'visible' => true,
'title' => trans('general.name'),
'formatter' => 'modelsLinkFormatter',
],
[
'field' => 'image',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.image'),
'visible' => true,
'formatter' => 'imageFormatter',
],
[
'field' => 'manufacturer',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.manufacturer'),
'visible' => false,
'formatter' => 'manufacturersLinkObjFormatter',
],
[
'field' => 'model_number',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/models/table.modelnumber'),
'visible' => true,
],
[
'field' => 'min_amt',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('mail.min_QTY'),
'visible' => true,
],
[
'field' => 'assets_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/models/table.numassets'),
'visible' => true,
],
[
'field' => 'depreciation',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.depreciation'),
'visible' => false,
'formatter' => 'depreciationsLinkObjFormatter',
],
[
'field' => 'category',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.category'),
'visible' => true,
'formatter' => 'categoriesLinkObjFormatter',
],
[
'field' => 'eol',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/hardware/form.eol_rate'),
'visible' => true,
],
[
'field' => 'fieldset',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/models/general.fieldset'),
'visible' => true,
'formatter' => 'fieldsetsLinkObjFormatter',
],
[
'field' => 'requestable',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/general.requestable'),
'formatter' => 'trueFalseFormatter',
],
[
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.notes'),
'visible' => false,
'formatter' => 'notesFormatter',
],
[
'field' => 'created_at',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.created_at'),
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'updated_at',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.updated_at'),
'formatter' => 'dateDisplayFormatter',
],
];
$layout[] = [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'modelsActionsFormatter',
];
return json_encode($layout);
}
/**
* Formatted note for this model
* @return string
*/
public function note()
{
if ($this->model->note) {
return Helper::parseEscapedMarkedown($this->model->note);
}
}
public function eolText()
{
if ($this->eol) {
return $this->eol.' '.trans('general.months');
}
return '';
}
/**
* Pretty name for this model
* @return string
*/
public function modelName()
{
$name = '';
if ($this->model->manufacturer) {
$name .= $this->model->manufacturer->name.' ';
}
$name .= $this->name;
if ($this->model_number) {
$name .= ' (#'.$this->model_number.')';
}
return $name;
}
/**
* Standard url for use to view page.
* @return string
*/
public function nameUrl()
{
return (string) link_to_route('models.show', $this->name, $this->id);
}
/**
* Generate img tag to this models image.
* @return string
*/
public function imageUrl()
{
if (! empty($this->image)) {
return '<img src="'.config('app.url').'/uploads/models/'.$this->image.'" alt="'.$this->name.'" height="50" width="50">';
}
return '';
}
/**
* Generate img tag to this models image.
* @return string
*/
public function imageSrc()
{
if (! empty($this->image)) {
return config('app.url').'/uploads/models/'.$this->image;
}
return '';
}
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('models.show', $this->id);
}
}

View File

@ -0,0 +1,585 @@
<?php
namespace App\Presenters;
use App\Models\CustomField;
use Carbon\CarbonImmutable;
use DateTime;
/**
* Class AssetPresenter
*/
class AssetPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'checkbox',
'checkbox' => true,
], [
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'company',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.company'),
'visible' => false,
'formatter' => 'assetCompanyObjFilterFormatter',
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.name'),
'visible' => true,
'formatter' => 'hardwareLinkFormatter',
], [
'field' => 'image',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/hardware/table.image'),
'visible' => true,
'formatter' => 'imageFormatter',
], [
'field' => 'asset_tag',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('admin/hardware/table.asset_tag'),
'visible' => true,
'formatter' => 'hardwareLinkFormatter',
], [
'field' => 'serial',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.serial'),
'visible' => true,
'formatter' => 'hardwareLinkFormatter',
], [
'field' => 'model',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.model'),
'visible' => true,
'formatter' => 'modelsLinkObjFormatter',
], [
'field' => 'model_number',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/models/table.modelnumber'),
'visible' => false,
], [
'field' => 'category',
'searchable' => true,
'sortable' => true,
'title' => trans('general.category'),
'visible' => true,
'formatter' => 'categoriesLinkObjFormatter',
], [
'field' => 'status_label',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/table.status'),
'visible' => true,
'formatter' => 'statuslabelsLinkObjFormatter',
], [
'field' => 'assigned_to',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.checkedout_to'),
'visible' => true,
'formatter' => 'polymorphicItemFormatter',
], [
'field' => 'employee_number',
'searchable' => false,
'sortable' => false,
'title' => trans('general.employee_number'),
'visible' => false,
'formatter' => 'employeeNumFormatter',
], [
'field' => 'location',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/table.location'),
'visible' => true,
'formatter' => 'deployedLocationFormatter',
], [
'field' => 'rtd_location',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.default_location'),
'visible' => false,
'formatter' => 'deployedLocationFormatter',
], [
'field' => 'manufacturer',
'searchable' => true,
'sortable' => true,
'title' => trans('general.manufacturer'),
'visible' => false,
'formatter' => 'manufacturersLinkObjFormatter',
], [
'field' => 'supplier',
'searchable' => true,
'sortable' => true,
'title' => trans('general.supplier'),
'visible' => false,
'formatter' => 'suppliersLinkObjFormatter',
], [
'field' => 'purchase_date',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.purchase_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'age',
'searchable' => false,
'sortable' => false,
'visible' => false,
'title' => trans('general.age'),
], [
'field' => 'purchase_cost',
'searchable' => true,
'sortable' => true,
'title' => trans('general.purchase_cost'),
'footerFormatter' => 'sumFormatter',
'class' => 'text-right',
], [
"field" => "book_value",
"searchable" => false,
"sortable" => false,
"title" => trans('admin/hardware/table.book_value'),
"footerFormatter" => 'sumFormatter',
"class" => "text-right",
],[
'field' => 'order_number',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.order_number'),
'formatter' => 'orderNumberObjFilterFormatter',
], [
'field' => 'eol',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/form.eol_rate'),
],
[
'field' => 'asset_eol_date',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/form.eol_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'warranty_months',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/form.warranty'),
], [
'field' => 'warranty_expires',
'searchable' => false,
'sortable' => false,
'visible' => false,
'title' => trans('admin/hardware/form.warranty_expires'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'requestable',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/general.requestable'),
'formatter' => 'trueFalseFormatter',
], [
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.notes'),
], [
'field' => 'checkout_counter',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.checkouts_count'),
], [
'field' => 'checkin_counter',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.checkins_count'),
], [
'field' => 'requests_counter',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.user_requests_count'),
], [
'field' => 'created_at',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.created_at'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'updated_at',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.updated_at'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'last_checkout',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/table.checkout_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'last_checkin',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/table.last_checkin_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'expected_checkin',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/form.expected_checkin'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'last_audit_date',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.last_audit'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'next_audit_date',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.next_audit_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'byod',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.byod'),
'formatter' => 'trueFalseFormatter',
],
];
// This looks complicated, but we have to confirm that the custom fields exist in custom fieldsets
// *and* those fieldsets are associated with models, otherwise we'll trigger
// javascript errors on the bootstrap tables side of things, since we're asking for properties
// on fields that will never be passed through the REST API since they're not associated with
// models. We only pass the fieldsets that pertain to each asset (via their model) so that we
// don't junk up the REST API with tons of custom fields that don't apply
$fields = CustomField::whereHas('fieldset', function ($query) {
$query->whereHas('models');
})->get();
// Note: We do not need to e() escape the field names here, as they are already escaped when
// they are presented in the blade view. If we escape them here, custom fields with quotes in their
// name can break the listings page. - snipe
foreach ($fields as $field) {
$layout[] = [
'field' => 'custom_fields.'.$field->db_column,
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => $field->name,
'formatter'=> 'customFieldsFormatter',
'escape' => true,
'class' => ($field->field_encrypted == '1') ? 'css-padlock' : '',
'visible' => ($field->show_in_listview == '1') ? true : false,
];
}
$layout[] = [
'field' => 'checkincheckout',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('general.checkin').'/'.trans('general.checkout'),
'visible' => true,
'formatter' => 'hardwareInOutFormatter',
];
$layout[] = [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'hardwareActionsFormatter',
];
return json_encode($layout);
}
/**
* Generate html link to this items name.
* @return string
*/
public function nameUrl()
{
return (string) link_to_route('hardware.show', e($this->name), $this->id);
}
public function modelUrl()
{
if ($this->model->model) {
return $this->model->model->present()->nameUrl();
}
return '';
}
/**
* Generate img tag to this items image.
* @return mixed|string
*/
public function imageUrl()
{
$imagePath = '';
if ($this->image && ! empty($this->image)) {
$imagePath = $this->image;
$imageAlt = $this->name;
} elseif ($this->model && ! empty($this->model->image)) {
$imagePath = $this->model->image;
$imageAlt = $this->model->name;
}
$url = config('app.url');
if (! empty($imagePath)) {
$imagePath = '<img src="'.$url.'/uploads/assets/'.$imagePath.' height="50" width="50" alt="'.$imageAlt.'">';
}
return $imagePath;
}
/**
* Generate img tag to this items image.
* @return mixed|string
*/
public function imageSrc()
{
$imagePath = '';
if ($this->image && ! empty($this->image)) {
$imagePath = $this->image;
} elseif ($this->model && ! empty($this->model->image)) {
$imagePath = $this->model->image;
}
if (! empty($imagePath)) {
return config('app.url').'/uploads/assets/'.$imagePath;
}
return $imagePath;
}
/**
* Get Displayable Name
* @return string
*
* @todo this should be factored out - it should be subsumed by fullName (below)
*
**/
public function name()
{
return $this->fullName;
}
/**
* Helper for notification polymorphism.
* @return mixed
*/
public function fullName()
{
$str = '';
// Asset name
if ($this->model->name) {
$str .= $this->model->name;
}
// Asset tag
if ($this->asset_tag) {
$str .= ' ('.$this->model->asset_tag.')';
}
// Asset Model name
if ($this->model->model) {
$str .= ' - '.$this->model->model->name;
}
return $str;
}
/**
* Returns the date this item hits EOL.
* @return false|string
*/
public function eol_date()
{
if (($this->purchase_date) && ($this->model->model) && ($this->model->model->eol)) {
return CarbonImmutable::parse($this->purchase_date)->addMonths($this->model->model->eol)->format('Y-m-d');
}
}
/**
* How many months until this asset hits EOL.
* @return null
*/
public function months_until_eol()
{
$today = date('Y-m-d');
$d1 = new DateTime($today);
$d2 = new DateTime($this->eol_date());
if ($this->eol_date() > $today) {
$interval = $d2->diff($d1);
} else {
$interval = null;
}
return $interval;
}
/**
* @return string
* This handles the status label "meta" status of "deployed" if
* it's assigned. Should maybe deprecate.
*/
public function statusMeta()
{
if ($this->model->assigned) {
return 'deployed';
}
return $this->model->assetstatus->getStatuslabelType();
}
/**
* @return string
* This handles the status label "meta" status of "deployed" if
* it's assigned. Should maybe deprecate.
*/
public function statusText()
{
if ($this->model->assigned) {
return trans('general.deployed');
}
return $this->model->assetstatus->name;
}
/**
* @return string
* This handles the status label "meta" status of "deployed" if
* it's assigned. Results look like:
*
* (if assigned and the status label is "Ready to Deploy"):
* (Deployed)
*
* (f assigned and status label is not "Ready to Deploy":)
* Deployed (Another Status Label)
*
* (if not deployed:)
* Another Status Label
*/
public function fullStatusText()
{
// Make sure the status is valid
if ($this->assetstatus) {
// If the status is assigned to someone or something...
if ($this->model->assigned) {
// If it's assigned and not set to the default "ready to deploy" status
if ($this->assetstatus->name != trans('general.ready_to_deploy')) {
return trans('general.deployed').' ('.$this->model->assetstatus->name.')';
}
// If it's assigned to the default "ready to deploy" status, just
// say it's deployed - otherwise it's confusing to have a status that is
// both "ready to deploy" and deployed at the same time.
return trans('general.deployed');
}
// Return just the status name
return $this->model->assetstatus->name;
}
// This status doesn't seem valid - either data has been manually edited or
// the status label was deleted.
return 'Invalid status';
}
/**
* Date the warranty expires.
* @return false|string
*/
public function warranty_expires()
{
if (($this->purchase_date) && ($this->warranty_months)) {
$date = date_create($this->purchase_date);
date_add($date, date_interval_create_from_date_string($this->warranty_months.' months'));
return date_format($date, 'Y-m-d');
}
return false;
}
/**
* Used to take user created warranty URL and dynamically fill in the needed values per asset
* @return string
*/
public function dynamicWarrantyUrl()
{
$warranty_lookup_url = $this->model->model->manufacturer->warranty_lookup_url;
$url = (str_replace('{LOCALE}',\App\Models\Setting::getSettings()->locale, $warranty_lookup_url));
$url = (str_replace('{SERIAL}', urlencode($this->model->serial), $url));
$url = (str_replace('{MODEL_NAME}', urlencode($this->model->model->name), $url));
$url = (str_replace('{MODEL_NUMBER}', urlencode($this->model->model->model_number), $url));
return $url;
}
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('hardware.show', $this->id);
}
public function glyph()
{
return '<i class="fas fa-barcode" aria-hidden="true"></i>';
}
}

View File

@ -0,0 +1,124 @@
<?php
namespace App\Presenters;
/**
* Class CategoryPresenter
*/
class CategoryPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('general.name'),
'visible' => true,
'formatter' => 'categoriesLinkFormatter',
], [
'field' => 'image',
'searchable' => false,
'sortable' => true,
'title' => trans('general.image'),
'visible' => true,
'formatter' => 'imageFormatter',
], [
'field' => 'category_type',
'searchable' => true,
'sortable' => true,
'title' => trans('general.type'),
'visible' => true,
], [
'field' => 'item_count',
'searchable' => false,
'sortable' => true,
'title' => trans('general.qty'),
'visible' => true,
], [
'field' => 'has_eula',
'searchable' => false,
'sortable' => false,
'title' => trans('admin/categories/table.eula_text'),
'visible' => false,
'formatter' => 'trueFalseFormatter',
], [
'field' => 'checkin_email',
'searchable' => false,
'sortable' => true,
'class' => 'css-envelope',
'title' => 'Send Email',
'visible' => true,
'formatter' => 'trueFalseFormatter',
], [
'field' => 'require_acceptance',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/categories/table.require_acceptance'),
'visible' => true,
'formatter' => 'trueFalseFormatter',
], [
"field" => "use_default_eula",
"searchable" => false,
"sortable" => true,
"title" => trans('admin/categories/general.use_default_eula_column'),
'visible' => true,
"formatter" => 'trueFalseFormatter',
], [
'field' => 'created_at',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.created_at'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'updated_at',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.updated_at'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'categoriesActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Link to this categories name
* @return string
*/
public function nameUrl()
{
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

@ -0,0 +1,147 @@
<?php
namespace App\Presenters;
/**
* Class CompanyPresenter
*/
class CompanyPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('admin/companies/table.name'),
'visible' => true,
'formatter' => 'companiesLinkFormatter',
], [
'field' => 'phone',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/table.phone'),
'visible' => false,
'formatter' => 'phoneFormatter',
], [
'field' => 'fax',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/suppliers/table.fax'),
'visible' => false,
'formatter' => 'phoneFormatter',
], [
'field' => 'email',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/suppliers/table.email'),
'visible' => true,
'formatter' => 'emailFormatter',
], [
'field' => 'image',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.image'),
'visible' => true,
'formatter' => 'imageFormatter',
], [
'field' => 'users_count',
'searchable' => false,
'sortable' => true,
'title' => '<span class="hidden-xs"><i class="fas fa-users"></i></span><span class="hidden-md hidden-lg">'.trans('general.users').'</span></th>',
'visible' => true,
], [
'field' => 'assets_count',
'searchable' => false,
'sortable' => true,
'title' => '<span class="hidden-xs"><i class="fas fa-barcode" aria-hidden="true"></i></span><span class="hidden-md hidden-lg">'.trans('general.assets').'</span>',
'visible' => true,
], [
'field' => 'licenses_count',
'searchable' => false,
'sortable' => true,
'visible' => true,
'title' => ' <span class="hidden-xs"><i class="far fa-save"></i></span><span class="hidden-md hidden-lg">'.trans('general.licenses').'</span>',
], [
'field' => 'accessories_count',
'searchable' => false,
'sortable' => true,
'visible' => true,
'title' => ' <span class="hidden-xs"><i class="far fa-keyboard"></i></span><span class="hidden-md hidden-lg">'.trans('general.accessories').'</span>',
], [
'field' => 'consumables_count',
'searchable' => false,
'sortable' => true,
'visible' => true,
'title' => ' <span class="hidden-xs"><i class="fas fa-tint"></i></span><span class="hidden-md hidden-lg">'.trans('general.consumables').'</span>',
], [
'field' => 'components_count',
'searchable' => false,
'sortable' => true,
'visible' => true,
'title' => ' <span class="hidden-xs"><i class="far fa-hdd"></i></span><span class="hidden-md hidden-lg">'.trans('general.components').'</span>',
], [
'field' => 'updated_at',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.updated_at'),
'formatter' => 'createdAtFormatter',
], [
'field' => 'created_at',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.created_at'),
'formatter' => 'createdAtFormatter',
], [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'visible' => true,
'formatter' => 'companiesActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Link to this companies name
* @return string
*/
public function nameUrl()
{
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

@ -0,0 +1,164 @@
<?php
namespace App\Presenters;
/**
* Class ComponentPresenter
*/
class ComponentPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
],
[
'field' => 'company',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.company'),
'visible' => false,
'formatter' => 'companiesLinkObjFormatter',
],
[
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('general.name'),
'visible' => true,
'formatter' => 'componentsLinkFormatter',
], [
'field' => 'image',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.image'),
'visible' => false,
'formatter' => 'imageFormatter',
], [
'field' => 'serial',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/hardware/form.serial'),
'formatter' => 'componentsLinkFormatter',
], [
'field' => 'category',
'searchable' => true,
'sortable' => true,
'title' => trans('general.category'),
'formatter' => 'categoriesLinkObjFormatter',
], [
'field' => 'supplier',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.supplier'),
'visible' => false,
'formatter' => 'suppliersLinkObjFormatter',
],
[
'field' => 'qty',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/components/general.total'),
'visible' => true,
], [
'field' => 'remaining',
'searchable' => false,
'sortable' => false,
'title' => trans('admin/components/general.remaining'),
'visible' => true,
], [
'field' => 'min_amt',
'searchable' => false,
'sortable' => false,
'title' => trans('general.min_amt'),
'visible' => true,
], [
'field' => 'location',
'searchable' => true,
'sortable' => true,
'title' => trans('general.location'),
'formatter' => 'locationsLinkObjFormatter',
], [
'field' => 'order_number',
'searchable' => true,
'sortable' => true,
'title' => trans('general.order_number'),
'visible' => true,
], [
'field' => 'purchase_date',
'searchable' => true,
'sortable' => true,
'title' => trans('general.purchase_date'),
'visible' => true,
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'purchase_cost',
'searchable' => true,
'sortable' => true,
'title' => trans('general.purchase_cost'),
'visible' => true,
'footerFormatter' => 'sumFormatterQuantity',
'class' => 'text-right',
], [
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.notes'),
'formatter' => 'notesFormatter',
],
];
$layout[] = [
'field' => 'checkincheckout',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('general.checkin').'/'.trans('general.checkout'),
'visible' => true,
'formatter' => 'componentsInOutFormatter',
];
$layout[] = [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'componentsActionsFormatter',
];
return json_encode($layout);
}
/**
* Generate html link to this items name.
* @return string
*/
public function nameUrl()
{
return (string) link_to_route('consumables.show', e($this->name), $this->id);
}
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('accessories.show', $this->id);
}
}

View File

@ -0,0 +1,172 @@
<?php
namespace App\Presenters;
/**
* Class ComponentPresenter
*/
class ConsumablePresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
],
[
'field' => 'company',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.company'),
'visible' => false,
'formatter' => 'companiesLinkObjFormatter',
],
[
'field' => 'name',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('general.name'),
'visible' => true,
'formatter' => 'consumablesLinkFormatter',
],
[
'field' => 'image',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.image'),
'visible' => false,
'formatter' => 'imageFormatter',
], [
'field' => 'category',
'searchable' => true,
'sortable' => true,
'title' => trans('general.category'),
'formatter' => 'categoriesLinkObjFormatter',
], [
'field' => 'supplier',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.supplier'),
'visible' => false,
'formatter' => 'suppliersLinkObjFormatter',
], [
'field' => 'model_number',
'searchable' => true,
'sortable' => true,
'title' => trans('general.model_no'),
], [
'field' => 'item_no',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/consumables/general.item_no'),
], [
'field' => 'qty',
'searchable' => false,
'sortable' => false,
'title' => trans('admin/components/general.total'),
'visible' => true,
], [
'field' => 'remaining',
'searchable' => false,
'sortable' => false,
'title' => trans('admin/components/general.remaining'),
'visible' => true,
], [
'field' => 'min_amt',
'searchable' => false,
'sortable' => false,
'title' => trans('general.min_amt'),
'visible' => true,
], [
'field' => 'location',
'searchable' => true,
'sortable' => true,
'title' => trans('general.location'),
'formatter' => 'locationsLinkObjFormatter',
], [
'field' => 'manufacturer',
'searchable' => true,
'sortable' => true,
'title' => trans('general.manufacturer'),
'visible' => false,
'formatter' => 'manufacturersLinkObjFormatter',
], [
'field' => 'order_number',
'searchable' => true,
'sortable' => true,
'title' => trans('general.order_number'),
'visible' => true,
], [
'field' => 'purchase_date',
'searchable' => true,
'sortable' => true,
'title' => trans('general.purchase_date'),
'visible' => true,
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'purchase_cost',
'searchable' => true,
'sortable' => true,
'title' => trans('general.purchase_cost'),
'visible' => true,
'footerFormatter' => 'sumFormatterQuantity',
'class' => 'text-right',
], [
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.notes'),
'formatter' => 'notesFormatter',
], [
'field' => 'change',
'searchable' => false,
'sortable' => false,
'visible' => true,
'title' => trans('general.change'),
'formatter' => 'consumablesInOutFormatter',
], [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'visible' => true,
'formatter' => 'consumablesActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('consumables.show', $this->id);
}
/**
* Generate html link to this items name.
* @return string
*/
public function nameUrl()
{
return (string) link_to_route('consumables.show', e($this->name), $this->id);
}
}

View File

@ -0,0 +1,62 @@
<?php
namespace App\Presenters;
/**
* Class DepreciationPresenter
*/
class DepreciationPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('general.name'),
'visible' => true,
'formatter' => 'depreciationsLinkFormatter',
],
[
'field' => 'months',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/depreciations/table.term'),
'visible' => true,
],
[
"field" => 'depreciation_min',
"searchable" => false,
"sortable" => true,
"title" => trans('admin/depreciations/table.depreciation_min'),
"visible" => true,
],
[
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'visible' => true,
'formatter' => 'depreciationsActionsFormatter',
],
];
return json_encode($layout);
}
}

View File

@ -0,0 +1,399 @@
<?php
namespace App\Presenters;
use DateTime;
/**
* Class DepreciationReportPresenter
* @package App\Presenters
*/
class DepreciationReportPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
"field" => "company",
"searchable" => true,
"sortable" => true,
"switchable" => true,
"title" => trans('general.company'),
"visible" => false,
], [
"field" => "category",
"searchable" => true,
"sortable" => true,
"title" => trans('general.category'),
"visible" => true,
], [
"field" => "name",
"searchable" => true,
"sortable" => true,
'switchable' => false,
"title" => trans('admin/hardware/form.name'),
"visible" => false,
], [
"field" => "asset_tag",
"searchable" => true,
"sortable" => true,
"title" => trans('general.asset_tag'),
"visible" => true,
],[
"field" => "model",
"searchable" => true,
"sortable" => true,
"title" => trans('general.asset_model'),
"visible" => true,
], [
"field" => "model_number",
"searchable" => true,
"sortable" => true,
"title" => trans('admin/models/table.modelnumber'),
"visible" => false
], [
"field" => "serial",
"searchable" => true,
"sortable" => true,
"title" => trans('admin/hardware/form.serial'),
"visible" => true,
], [
"field" => "depreciation",
"searchable" => true,
"sortable" => true,
"title" => trans('general.depreciation'),
"visible" => true,
], [
"field" => "number_of_months",
"searchable" => true,
"sortable" => true,
"title" => trans('admin/depreciations/general.number_of_months'),
"visible" => true,
], [
"field" => "status",
"searchable" => true,
"sortable" => true,
"title" => trans('admin/hardware/table.status'),
"visible" => true,
], [
"field" => "checked_out_to",
"searchable" => true,
"sortable" => true,
"title" => trans('admin/hardware/table.checkoutto'),
"visible" => false,
], [
"field" => "location",
"searchable" => true,
"sortable" => true,
"title" => trans('admin/hardware/table.location'),
"visible" => true,
], [
"field" => "manufacturer",
"searchable" => true,
"sortable" => true,
"title" => trans('general.manufacturer'),
"visible" => false,
],[
"field" => "supplier",
"searchable" => true,
"sortable" => true,
"title" => trans('general.supplier'),
"visible" => false,
], [
"field" => "purchase_date",
"searchable" => true,
"sortable" => true,
"visible" => true,
"title" => trans('general.purchase_date'),
"formatter" => "dateDisplayFormatter"
], [
"field" => "currency",
"searchable" => false,
"sortable" => false,
"visible" => false,
"title" => 'Currency',
], [
"field" => "purchase_cost",
"searchable" => true,
"sortable" => true,
"visible" => true,
"title" => trans('general.purchase_cost'),
"footerFormatter" => 'sumFormatter',
"class" => "text-right",
], [
"field" => "order_number",
"searchable" => true,
"sortable" => true,
"visible" => false,
"title" => trans('general.order_number'),
], [
"field" => "eol",
"searchable" => false,
"sortable" => false,
"visible" => false,
"title" => trans('general.eol'),
"formatter" => "dateDisplayFormatter"
], [
"field" => "book_value",
"searchable" => true,
"sortable" => true,
"visible" => true,
"title" => trans('admin/hardware/table.book_value'),
"footerFormatter" => 'sumFormatter',
"class" => "text-right",
], [
"field" => "monthly_depreciation",
"searchable" => true,
"sortable" => true,
"visible" => true,
"title" => trans('admin/hardware/table.monthly_depreciation')
],[
"field" => "diff",
"searchable" => false,
"sortable" => false,
"visible" => true,
"title" => trans('admin/hardware/table.diff'),
"footerFormatter" => 'sumFormatter',
"class" => "text-right",
],[
"field" => "warranty_expires",
"searchable" => false,
"sortable" => false,
"visible" => false,
"title" => trans('admin/hardware/form.warranty_expires'),
"formatter" => "dateDisplayFormatter"
],
];
return json_encode($layout);
}
/**
* Generate html link to this items name.
* @return string
*/
public function nameUrl()
{
return (string) link_to_route('hardware.show', e($this->name), $this->id);
}
public function modelUrl()
{
if ($this->model->model) {
return $this->model->model->present()->nameUrl();
}
return '';
}
/**
* Generate img tag to this items image.
* @return mixed|string
*/
public function imageUrl()
{
$imagePath = '';
if ($this->image && !empty($this->image)) {
$imagePath = $this->image;
$imageAlt = $this->name;
} elseif ($this->model && !empty($this->model->image)) {
$imagePath = $this->model->image;
$imageAlt = $this->model->name;
}
$url = config('app.url');
if (!empty($imagePath)) {
$imagePath = '<img src="'.$url.'/uploads/assets/'.$imagePath.' height="50" width="50" alt="'.$imageAlt.'">';
}
return $imagePath;
}
/**
* Generate img tag to this items image.
* @return mixed|string
*/
public function imageSrc()
{
$imagePath = '';
if ($this->image && !empty($this->image)) {
$imagePath = $this->image;
} elseif ($this->model && !empty($this->model->image)) {
$imagePath = $this->model->image;
}
if (!empty($imagePath)) {
return config('app.url').'/uploads/assets/'.$imagePath;
}
return $imagePath;
}
/**
* Get Displayable Name
* @return string
*
* @todo this should be factored out - it should be subsumed by fullName (below)
*
**/
public function name()
{
return $this->fullName;
}
/**
* Helper for notification polymorphism.
* @return mixed
*/
public function fullName()
{
$str = '';
// Asset name
if ($this->model->name) {
$str .= $this->model->name;
}
// Asset tag
if ($this->asset_tag) {
$str .= ' ('.$this->model->asset_tag.')';
}
// Asset Model name
if ($this->model->model) {
$str .= ' - '.$this->model->model->name;
}
return $str;
}
/**
* Returns the date this item hits EOL.
* @return false|string
*/
public function eol_date()
{
if (( $this->purchase_date ) && ( $this->model->model ) && ($this->model->model->eol) ) {
$date = date_create($this->purchase_date);
date_add($date, date_interval_create_from_date_string($this->model->model->eol . ' months'));
return date_format($date, 'Y-m-d');
}
}
/**
* How many months until this asset hits EOL.
* @return null
*/
public function months_until_eol()
{
$today = date("Y-m-d");
$d1 = new DateTime($today);
$d2 = new DateTime($this->eol_date());
if ($this->eol_date() > $today) {
$interval = $d2->diff($d1);
} else {
$interval = null;
}
return $interval;
}
/**
* @return string
* This handles the status label "meta" status of "deployed" if
* it's assigned. Should maybe deprecate.
*/
public function statusMeta()
{
if ($this->model->assigned) {
return 'deployed';
}
return $this->model->assetstatus->getStatuslabelType();
}
/**
* @return string
* This handles the status label "meta" status of "deployed" if
* it's assigned. Should maybe deprecate.
*/
public function statusText()
{
if ($this->model->assigned) {
return trans('general.deployed');
}
return $this->model->assetstatus->name;
}
/**
* @return string
* This handles the status label "meta" status of "deployed" if
* it's assigned. Results look like:
*
* (if assigned and the status label is "Ready to Deploy"):
* (Deployed)
*
* (f assigned and status label is not "Ready to Deploy":)
* Deployed (Another Status Label)
*
* (if not deployed:)
* Another Status Label
*/
public function fullStatusText() {
// Make sure the status is valid
if ($this->assetstatus) {
// If the status is assigned to someone or something...
if ($this->model->assigned) {
// If it's assigned and not set to the default "ready to deploy" status
if ($this->assetstatus->name != trans('general.ready_to_deploy')) {
return trans('general.deployed'). ' (' . $this->model->assetstatus->name.')';
}
// If it's assigned to the default "ready to deploy" status, just
// say it's deployed - otherwise it's confusing to have a status that is
// both "ready to deploy" and deployed at the same time.
return trans('general.deployed');
}
// Return just the status name
return $this->model->assetstatus->name;
}
// This status doesn't seem valid - either data has been manually edited or
// the status label was deleted.
return 'Invalid status';
}
/**
* Date the warantee expires.
* @return false|string
*/
public function warranty_expires()
{
if (($this->purchase_date) && ($this->warranty_months)) {
$date = date_create($this->purchase_date);
date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months'));
return date_format($date, 'Y-m-d');
}
return false;
}
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('hardware.show', $this->id);
}
public function glyph()
{
return '<i class="fas fa-barcode" aria-hidden="true"></i>';
}
}

View File

@ -0,0 +1,96 @@
<?php
namespace App\Presenters;
/**
* Class LabelPresenter
*/
class LabelPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'radio',
'radio' => true,
'formatter' => 'labelRadioFormatter'
], [
'field' => 'name',
'searchable' => true,
'sortable' => false,
'switchable' => true,
'title' => trans('general.name'),
'visible' => true,
], [
'field' => 'size',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/settings/table.size'),
'visible' => true,
'formatter' => 'labelSizeFormatter'
], [
'field' => 'labels_per_page',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/labels/table.labels_per_page'),
'visible' => true,
'formatter' => 'labelPerPageFormatter'
], [
'field' => 'support_fields',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/labels/table.support_fields'),
'visible' => true
], [
'field' => 'support_asset_tag',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/labels/table.support_asset_tag'),
'visible' => true,
'formatter' => 'trueFalseFormatter'
], [
'field' => 'support_1d_barcode',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/labels/table.support_1d_barcode'),
'visible' => true,
'formatter' => 'trueFalseFormatter'
], [
'field' => 'support_2d_barcode',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/labels/table.support_2d_barcode'),
'visible' => true,
'formatter' => 'trueFalseFormatter'
], [
'field' => 'support_logo',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/labels/table.support_logo'),
'visible' => true,
'formatter' => 'trueFalseFormatter'
], [
'field' => 'support_title',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/labels/table.support_title'),
'visible' => true,
'formatter' => 'trueFalseFormatter'
]
];
return json_encode($layout);
}
}

View File

@ -0,0 +1,329 @@
<?php
namespace App\Presenters;
/**
* Class LicensePresenter
*/
class LicensePresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'company',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/companies/table.title'),
'visible' => false,
'formatter' => 'companiesLinkObjFormatter',
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('general.name'),
'formatter' => 'licensesLinkFormatter',
], [
'field' => 'product_key',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/licenses/form.license_key'),
'formatter' => 'licensesLinkFormatter',
], [
'field' => 'expiration_date',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/licenses/form.expiration'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'license_email',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/licenses/form.to_email'),
], [
'field' => 'license_name',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/licenses/form.to_name'),
], [
'field' => 'category',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.category'),
'visible' => false,
'formatter' => 'categoriesLinkObjFormatter',
], [
'field' => 'supplier',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.supplier'),
'visible' => false,
'formatter' => 'suppliersLinkObjFormatter',
], [
'field' => 'manufacturer',
'searchable' => true,
'sortable' => true,
'title' => trans('general.manufacturer'),
'formatter' => 'manufacturersLinkObjFormatter',
], [
'field' => 'seats',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/accessories/general.total'),
], [
'field' => 'free_seats_count',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/accessories/general.remaining'),
],
[
'field' => 'min_amt',
'searchable' => false,
'sortable' => true,
'title' => trans('mail.min_QTY'),
'formatter' => 'minAmtFormatter',
],[
'field' => 'purchase_date',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.purchase_date'),
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'termination_date',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('admin/licenses/form.termination_date'),
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'depreciation',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/hardware/form.depreciation'),
'visible' => false,
'formatter' => 'depreciationsLinkObjFormatter',
],
[
'field' => 'maintained',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/licenses/form.maintained'),
'formatter' => 'trueFalseFormatter',
], [
'field' => 'reassignable',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/licenses/form.reassignable'),
'formatter' => 'trueFalseFormatter',
],
[
'field' => 'purchase_cost',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.purchase_cost'),
'footerFormatter' => 'sumFormatterQuantity',
'class' => 'text-right',
], [
'field' => 'purchase_order',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('admin/licenses/form.purchase_order'),
], [
'field' => 'order_number',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.order_number'),
], [
'field' => 'created_at',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.created_at'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'updated_at',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.updated_at'),
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.notes'),
'formatter' => 'notesFormatter',
],
];
$layout[] = [
'field' => 'checkincheckout',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('general.checkin').'/'.trans('general.checkout'),
'visible' => true,
'formatter' => 'licensesInOutFormatter',
];
$layout[] = [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'licensesActionsFormatter',
];
return json_encode($layout);
}
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayoutSeats()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
],
[
'field' => 'name',
'searchable' => false,
'sortable' => false,
'sorter' => 'numericOnly',
'switchable' => true,
'title' => trans('admin/licenses/general.seat'),
'visible' => true,
], [
'field' => 'assigned_user',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/licenses/general.user'),
'visible' => true,
'formatter' => 'usersLinkObjFormatter',
], [
'field' => 'assigned_user.email',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/users/table.email'),
'visible' => true,
'formatter' => 'emailFormatter',
], [
'field' => 'department',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.department'),
'visible' => false,
'formatter' => 'departmentNameLinkFormatter',
], [
'field' => 'assigned_asset',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('admin/licenses/form.asset'),
'visible' => true,
'formatter' => 'hardwareLinkObjFormatter',
], [
'field' => 'location',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('general.location'),
'visible' => true,
'formatter' => 'locationsLinkObjFormatter',
],
[
'field' => 'notes',
'searchable' => false,
'sortable' => false,
'visible' => false,
'title' => trans('general.notes'),
'formatter' => 'notesFormatter'
],
[
'field' => 'checkincheckout',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('general.checkin').'/'.trans('general.checkout'),
'visible' => true,
'formatter' => 'licenseSeatInOutFormatter',
],
];
return json_encode($layout);
}
/**
* Link to this licenses Name
* @return string
*/
public function nameUrl()
{
return (string) link_to_route('licenses.show', $this->name, $this->id);
}
/**
* Link to this licenses Name
* @return string
*/
public function fullName()
{
return $this->name;
}
/**
* Link to this licenses serial
* @return string
*/
public function serialUrl()
{
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

@ -0,0 +1,14 @@
<?php
namespace App\Presenters;
/**
* Class LicensePresenter
*/
class LicenseSeatPresenter extends Presenter
{
public function name()
{
return $this->model->license->name;
}
}

View File

@ -0,0 +1,245 @@
<?php
namespace App\Presenters;
/**
* Class LocationPresenter
*/
class LocationPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'bulk_selectable',
'checkbox' => true,
'formatter' => 'checkboxEnabledFormatter',
],
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
],
[
'field' => 'name',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('admin/locations/table.name'),
'visible' => true,
'formatter' => 'locationsLinkFormatter',
],
[
'field' => 'image',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.image'),
'visible' => true,
'formatter' => 'imageFormatter',
],
[
'field' => 'parent',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/table.parent'),
'visible' => true,
'formatter' => 'locationsLinkObjFormatter',
],
[
'field' => 'assets_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/message.current_location'),
'visible' => true,
],
[
'field' => 'rtd_assets_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/hardware/form.default_location'),
'visible' => false,
],
[
'field' => 'assigned_assets_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/message.assigned_assets'),
'visible' => true,
],
[
'field' => 'users_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.people'),
'visible' => true,
],
[
'field' => 'currency',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.currency'),
'visible' => true,
],
[
'field' => 'address',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/table.address'),
'visible' => true,
],
[
'field' => 'address2',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/table.address2'),
'visible' => false,
],
[
'field' => 'city',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/table.city'),
'visible' => true,
],
[
'field' => 'state',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/table.state'),
'visible' => true,
],
[
'field' => 'zip',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/table.zip'),
'visible' => false,
],
[
'field' => 'country',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/table.country'),
'visible' => false,
],
[
'field' => 'phone',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/table.phone'),
'visible' => false,
'formatter' => 'phoneFormatter',
],
[
'field' => 'fax',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/suppliers/table.fax'),
'visible' => false,
'formatter' => 'phoneFormatter',
],
[
'field' => 'ldap_ou',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/locations/table.ldap_ou'),
'visible' => false,
],
[
'field' => 'manager',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/table.manager'),
'visible' => false,
'formatter' => 'usersLinkObjFormatter',
],
[
'field' => 'created_at',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.created_at'),
'visible' => false,
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'visible' => true,
'formatter' => 'locationsActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Link to this locations name
* @return string
*/
public function nameUrl()
{
return (string) link_to_route('locations.show', $this->name, $this->id);
}
/**
* Getter for Polymorphism.
* @return mixed
*/
public function name()
{
return $this->model->name;
}
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('locations.show', $this->id);
}
public function glyph()
{
return '<i class="fas fa-map-marker-alt" aria-hidden="true"></i>';
}
public function fullName()
{
return $this->name;
}
}

View File

@ -0,0 +1,169 @@
<?php
namespace App\Presenters;
/**
* Class ManufacturerPresenter
*/
class ManufacturerPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
],
[
'field' => 'name',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('admin/manufacturers/table.name'),
'visible' => true,
'formatter' => 'manufacturersLinkFormatter',
],
[
'field' => 'image',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.image'),
'visible' => true,
'formatter' => 'imageFormatter',
],
[
'field' => 'url',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.url'),
'visible' => true,
'formatter' => 'externalLinkFormatter',
],
[
'field' => 'support_url',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/manufacturers/table.support_url'),
'visible' => true,
'formatter' => 'externalLinkFormatter',
],
[
'field' => 'support_phone',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/manufacturers/table.support_phone'),
'visible' => true,
'formatter' => 'phoneFormatter',
],
[
'field' => 'support_email',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/manufacturers/table.support_email'),
'visible' => true,
'formatter' => 'emailFormatter',
],
[
'field' => 'warranty_lookup_url',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/manufacturers/table.warranty_lookup_url'),
'visible' => false,
'formatter' => 'externalLinkFormatter',
],
[
'field' => 'assets_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => ' <span class="hidden-md hidden-lg">Assets</span>'
.'<span class="hidden-xs"><i class="fas fa-barcode fa-lg"></i></span>',
'visible' => true,
],
[
'field' => 'licenses_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => ' <span class="hidden-md hidden-lg">Licenses</span>'
.'<span class="hidden-xs"><i class="far fa-save fa-lg"></i></span>',
'visible' => true,
],
[
'field' => 'consumables_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => ' <span class="hidden-md hidden-lg">Consumables</span>'
.'<span class="hidden-xs"><i class="fas fa-tint fa-lg"></i></span>',
'visible' => true,
],
[
'field' => 'accessories_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => ' <span class="hidden-md hidden-lg">Accessories</span>'
.'<span class="hidden-xs"><i class="far fa-keyboard fa-lg"></i></span>',
'visible' => true,
],
[
'field' => 'created_at',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.created_at'),
'visible' => false,
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'visible' => true,
'formatter' => 'manufacturersActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Link to this manufacturers name
* @return string
*/
public function nameUrl()
{
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

@ -0,0 +1,288 @@
<?php
namespace App\Presenters;
/**
* Class LicensePresenter
*/
class PredefinedKitPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table of kits
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('general.name'),
'formatter' => 'kitsLinkFormatter',
],
];
$layout[] = [
'field' => 'checkincheckout',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('general.checkin').'/'.trans('general.checkout'),
'visible' => true,
'formatter' => 'kitsInOutFormatter',
];
$layout[] = [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'kitsActionsFormatter',
];
return json_encode($layout);
}
/**
* Json Column Layout for bootstrap table of kit models
* @return string
*/
public static function dataTableModels()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'pivot_id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'owner_id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('general.name'),
'formatter' => 'modelsLinkFormatter',
], [
'field' => 'quantity',
'searchable' => false,
'sortable' => false,
'title' => trans('general.quantity'),
], [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'kits_modelsActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Json Column Layout for bootstrap table of kit licenses
* @return string
*/
public static function dataTableLicenses()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'pivot_id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'owner_id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('general.name'),
'formatter' => 'licensesLinkFormatter',
], [
'field' => 'quantity',
'searchable' => false,
'sortable' => false,
'title' => trans('general.quantity'),
], [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'kits_licensesActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Json Column Layout for bootstrap table of kit accessories
* @return string
*/
public static function dataTableAccessories()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'pivot_id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'owner_id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('general.name'),
'formatter' => 'accessoriesLinkFormatter',
], [
'field' => 'quantity',
'searchable' => false,
'sortable' => false,
'title' => trans('general.quantity'),
], [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'kits_accessoriesActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Json Column Layout for bootstrap table of kit consumables
* @return string
*/
public static function dataTableConsumables()
{
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'pivot_id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'owner_id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('general.name'),
'formatter' => 'consumablesLinkFormatter',
], [
'field' => 'quantity',
'searchable' => false,
'sortable' => false,
'title' => trans('general.quantity'),
], [
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'formatter' => 'kits_consumablesActionsFormatter',
],
];
return json_encode($layout);
}
/**
* Link to this kit Name
* @return string
*/
public function nameUrl()
{
return (string) link_to_route('kits.show', $this->name, $this->id);
}
/**
* @return string
*/
public function fullName()
{
return $this->name;
}
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('kits.show', $this->id);
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace App\Presenters;
trait Presentable
{
protected $presenterInterface;
public function present()
{
if (! $this->presenter || ! class_exists($this->presenter)) {
throw new \Exception('Presenter class does not exist');
}
if (! isset($this->presenterInterface)) {
$this->presenterInterface = new $this->presenter($this);
}
return $this->presenterInterface;
}
}

View File

@ -0,0 +1,90 @@
<?php
namespace App\Presenters;
use App\Models\SnipeModel;
abstract class Presenter
{
/**
* @var SnipeModel
*/
protected $model;
/**
* Presenter constructor.
* @param SnipeModel $model
*/
public function __construct(SnipeModel $model)
{
$this->model = $model;
}
// Convenience functions for datatables stuff
public function categoryUrl()
{
$model = $this->model;
// Category of Asset belongs to model.
if ($model->model) {
$model = $this->model->model;
}
if ($model->category) {
return $model->category->present()->nameUrl();
}
return '';
}
public function locationUrl()
{
if ($this->model->location) {
return $this->model->location->present()->nameUrl();
}
return '';
}
public function companyUrl()
{
if ($this->model->company) {
return $this->model->company->present()->nameUrl();
}
return '';
}
public function manufacturerUrl()
{
$model = $this->model;
// Category of Asset belongs to model.
if ($model->model) {
$model = $this->model->model;
}
if ($model->manufacturer) {
return $model->manufacturer->present()->nameUrl();
}
return '';
}
public function name()
{
return $this->model->name;
}
public function __get($property)
{
if (method_exists($this, $property)) {
return $this->{$property}();
}
return e($this->model->{$property});
}
public function __call($method, $args)
{
return $this->model->$method($args);
}
}

View File

@ -0,0 +1,461 @@
<?php
namespace App\Presenters;
use App\Helpers\Helper;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
/**
* Class UserPresenter
*/
class UserPresenter extends Presenter
{
/**
* Json Column Layout for bootstrap table
* @return string
*/
public static function dataTableLayout()
{
$layout = [
[
'field' => 'checkbox',
'checkbox' => true,
],
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
],
[
'field' => 'avatar',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('general.importer.avatar'),
'visible' => false,
'formatter' => 'imageFormatter',
],
[
'field' => 'company',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/companies/table.title'),
'visible' => false,
'formatter' => 'companiesLinkObjFormatter',
],
[
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/users/table.name'),
'visible' => true,
'formatter' => 'usersLinkFormatter',
],
[
'field' => 'first_name',
'searchable' => true,
'sortable' => true,
'title' => trans('general.first_name'),
'visible' => false,
'formatter' => 'usersLinkFormatter',
],
[
'field' => 'last_name',
'searchable' => true,
'sortable' => true,
'title' => trans('general.last_name'),
'visible' => false,
'formatter' => 'usersLinkFormatter',
],
[
'field' => 'jobtitle',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/table.title'),
'visible' => true,
'formatter' => 'usersLinkFormatter',
],
[
'field' => 'vip',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/general.vip_label'),
'visible' => false,
'formatter' => 'trueFalseFormatter',
],
[
'field' => 'remote',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/general.remote'),
'visible' => false,
'formatter' => 'trueFalseFormatter',
],
[
'field' => 'email',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/table.email'),
'visible' => true,
'formatter' => 'emailFormatter',
],
[
'field' => 'phone',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/table.phone'),
'visible' => true,
'formatter' => 'phoneFormatter',
],
[
'field' => 'website',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.website'),
'visible' => false,
'formatter' => 'externalLinkFormatter',
],
[
'field' => 'address',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.address'),
'visible' => false,
],
[
'field' => 'city',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.city'),
'visible' => false,
],
[
'field' => 'state',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.state'),
'visible' => false,
],
[
'field' => 'country',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.country'),
'visible' => false,
],
[
'field' => 'zip',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.zip'),
'visible' => false,
],
[
'field' => 'username',
'searchable' => true,
'sortable' => true,
'switchable' => false,
'title' => trans('admin/users/table.username'),
'visible' => true,
'formatter' => 'usersLinkFormatter',
],
[
'field' => 'employee_num',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.employee_number'),
'visible' => false,
],
[
'field' => 'department',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.department'),
'visible' => true,
'formatter' => 'departmentsLinkObjFormatter',
],
[
'field' => 'location',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/table.location'),
'visible' => true,
'formatter' => 'locationsLinkObjFormatter',
],
[
'field' => 'manager',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/users/table.manager'),
'visible' => true,
'formatter' => 'usersLinkObjFormatter',
],
[
'field' => 'assets_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'escape' => true,
'class' => 'css-barcode',
'title' => 'Assets',
'visible' => true,
],
[
'field' => 'licenses_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'class' => 'css-license',
'title' => 'License',
'visible' => true,
],
[
'field' => 'consumables_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'class' => 'css-consumable',
'title' => 'Consumables',
'visible' => true,
],
[
'field' => 'accessories_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'class' => 'css-accessory',
'title' => 'Accessories',
'visible' => true,
],
[
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.notes'),
'visible' => true,
],
[
'field' => 'groups',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('general.groups'),
'visible' => true,
'formatter' => 'groupsFormatter',
],
[
'field' => 'ldap_import',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/settings/general.ldap_enabled'),
'visible' => false,
'formatter' => 'trueFalseFormatter',
],
[
'field' => 'two_factor_enrolled',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/general.two_factor_enrolled'),
'visible' => false,
'formatter' => 'trueFalseFormatter',
],
[
'field' => 'two_factor_optin',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/users/general.two_factor_active'),
'visible' => false,
'formatter' => 'trueFalseFormatter',
],
[
'field' => 'activated',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.login_enabled'),
'visible' => true,
'formatter' => 'trueFalseFormatter',
],
[
'field' => 'autoassign_licenses',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.autoassign_licenses'),
'visible' => false,
'formatter' => 'trueFalseFormatter',
],
[
'field' => 'created_by',
'searchable' => false,
'sortable' => true,
'title' => trans('general.created_by'),
'visible' => false,
'formatter' => 'usersLinkObjFormatter',
],
[
'field' => 'created_at',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.created_at'),
'visible' => false,
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'start_date',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.start_date'),
'visible' => false,
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'end_date',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.end_date'),
'visible' => false,
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'last_login',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.last_login'),
'visible' => false,
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('table.actions'),
'visible' => true,
'formatter' => 'usersActionsFormatter',
],
];
return json_encode($layout);
}
public function emailLink()
{
if ($this->email) {
return '<a href="mailto:'.$this->email.'">'.$this->email.'</a><a href="mailto:'.$this->email.'" class="hidden-xs hidden-sm"><i class="far fa-envelope"></i></a>';
}
return '';
}
/**
* Returns the user full name, it simply concatenates
* the user first and last name.
*
* @return string
*/
public function fullName()
{
return html_entity_decode($this->first_name.' '.$this->last_name, ENT_QUOTES | ENT_XML1, 'UTF-8');
}
/**
* Standard accessor.
* @TODO Remove presenter::fullName() entirely?
* @return string
*/
public function name()
{
return $this->fullName();
}
/**
* Returns the user Gravatar image url.
*
* @return string
*/
public function gravatar()
{
if ($this->avatar) {
// Check if it's a google avatar or some external avatar
if (Str::startsWith($this->avatar, ['http://', 'https://'])) {
return $this->avatar;
}
// Otherwise assume it's an uploaded image
return Storage::disk('public')->url('avatars/'.e($this->avatar));
}
if (Setting::getSettings()->load_remote == '1') {
if ($this->model->gravatar != '') {
$gravatar = md5(strtolower(trim($this->model->gravatar)));
return '//gravatar.com/avatar/'.$gravatar;
} elseif ($this->email != '') {
$gravatar = md5(strtolower(trim($this->email)));
return '//gravatar.com/avatar/'.$gravatar;
}
}
// Set a fun, gender-neutral default icon
return config('app.url').'/img/default-sm.png';
}
/**
* Formatted url for use in tables.
* @return string
*/
public function nameUrl()
{
return (string) link_to_route('users.show', $this->getFullNameAttribute(), $this->id);
}
/**
* Url to view this item.
* @return string
*/
public function viewUrl()
{
return route('users.show', $this->id);
}
public function glyph()
{
return '<i class="fas fa-user" aria-hidden="true"></i>';
}
}