] * @see ComponentsController::getDatatable() method that generates the JSON response * @since [v3.0] * @return View */ public function index() { $this->authorize('view', Component::class); return View::make('components/index'); } /** * Returns a form to create a new component. * * @author [A. Gianotto] [] * @see ComponentsController::postCreate() method that stores the data * @since [v3.0] * @return View */ public function create() { $this->authorize('create', Component::class); // Show the page $category_list = Helper::categoryList('component'); $company_list = Helper::companyList(); $location_list = Helper::locationsList(); return View::make('components/edit') ->with('item', new Component) ->with('category_list', $category_list) ->with('company_list', $company_list) ->with('location_list', $location_list); } /** * Validate and store data for new component. * * @author [A. Gianotto] [] * @see ComponentsController::getCreate() method that generates the view * @since [v3.0] * @return Redirect */ public function store() { $this->authorize('create', Component::class); // create a new model instance $component = new Component(); // Update the component data $component->name = e(Input::get('name')); $component->category_id = e(Input::get('category_id')); $component->location_id = e(Input::get('location_id')); $component->company_id = Company::getIdForCurrentUser(Input::get('company_id')); $component->order_number = e(Input::get('order_number')); $component->min_amt = e(Input::get('min_amt')); $component->serial = e(Input::get('serial')); if (e(Input::get('purchase_date')) == '') { $component->purchase_date = null; } else { $component->purchase_date = e(Input::get('purchase_date')); } if (e(Input::get('purchase_cost')) == '0.00') { $component->purchase_cost = null; } else { $component->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); } $component->qty = e(Input::get('qty')); $component->user_id = Auth::user()->id; // Was the component created? if ($component->save()) { $component->logCreate(); // Redirect to the new component page return redirect()->route('components.index')->with('success', trans('admin/components/message.create.success')); } return redirect()->back()->withInput()->withErrors($component->getErrors()); } /** * Return a view to edit a component. * * @author [A. Gianotto] [] * @see ComponentsController::postEdit() method that stores the data. * @since [v3.0] * @param int $componentId * @return View */ public function edit($componentId = null) { // Check if the component exists if (is_null($item = Component::find($componentId))) { // Redirect to the blogs management page return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); } $this->authorize('update', $item); $category_list = Helper::categoryList('component'); $company_list = Helper::companyList(); $location_list = Helper::locationsList(); return View::make('components/edit', compact('item')) ->with('category_list', $category_list) ->with('company_list', $company_list) ->with('location_list', $location_list); } /** * Return a view to edit a component. * * @author [A. Gianotto] [] * @see ComponentsController::getEdit() method presents the form. * @param int $componentId * @since [v3.0] * @return Redirect */ public function update($componentId = null) { // Check if the blog post exists if (is_null($component = Component::find($componentId))) { // Redirect to the blogs management page return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); } $this->authorize('update', $component); // Update the component data $component->name = e(Input::get('name')); $component->category_id = e(Input::get('category_id')); $component->location_id = e(Input::get('location_id')); $component->company_id = Company::getIdForCurrentUser(Input::get('company_id')); $component->order_number = e(Input::get('order_number')); $component->min_amt = e(Input::get('min_amt')); $component->serial = e(Input::get('serial')); if (e(Input::get('purchase_date')) == '') { $component->purchase_date = null; } else { $component->purchase_date = e(Input::get('purchase_date')); } if (e(Input::get('purchase_cost')) == '0.00') { $component->purchase_cost = null; } else { $component->purchase_cost = Helper::ParseFloat(e(Input::get('purchase_cost'))); } $component->qty = e(Input::get('qty')); if ($component->save()) { return redirect()->route('components.index')->with('success', trans('admin/components/message.update.success')); } return redirect()->back()->withInput()->withErrors($component->getErrors()); } /** * Delete a component. * * @author [A. Gianotto] [] * @since [v3.0] * @param int $componentId * @return Redirect */ public function destroy($componentId) { if (is_null($component = Component::find($componentId))) { return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } $this->authorize('delete', $component); $component->delete(); return redirect()->route('components.index')->with('success', trans('admin/components/message.delete.success')); } public function postBulk($componentId = null) { //$this->authorize('checkout', $component) echo 'Stubbed - not yet complete'; } public function postBulkSave($componentId = null) { //$this->authorize('edit', Component::class); echo 'Stubbed - not yet complete'; } /** * Return a view to display component information. * * @author [A. Gianotto] [] * @see ComponentsController::getDataView() method that generates the JSON response * @since [v3.0] * @param int $componentId * @return View */ public function show($componentId = null) { $component = Component::find($componentId); if (isset($component->id)) { $this->authorize('view', $component); return View::make('components/view', compact('component')); } // Prepare the error message $error = trans('admin/components/message.does_not_exist', compact('id')); // Redirect to the user management page return redirect()->route('components')->with('error', $error); } /** * Returns a view that allows the checkout of a component to an asset. * * @author [A. Gianotto] [] * @see ComponentsController::postCheckout() method that stores the data. * @since [v3.0] * @param int $componentId * @return View */ public function getCheckout($componentId) { // Check if the component exists if (is_null($component = Component::find($componentId))) { // Redirect to the component management page with error return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } $this->authorize('checkout', $component); // Get the dropdown of assets and then pass it to the checkout view $assets_list = Helper::detailedAssetList(); return View::make('components/checkout', compact('component'))->with('assets_list', $assets_list); } /** * Validate and store checkout data. * * @author [A. Gianotto] [] * @see ComponentsController::getCheckout() method that returns the form. * @since [v3.0] * @param int $componentId * @return Redirect */ public function postCheckout(Request $request, $componentId) { // Check if the component exists if (is_null($component = Component::find($componentId))) { // Redirect to the component management page with error return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } $this->authorize('checkout', $component); $max_to_checkout = $component->numRemaining(); $validator = Validator::make($request->all(),[ "asset_id" => "required", "assigned_qty" => "required|numeric|between:1,$max_to_checkout" ]); if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput(); } $admin_user = Auth::user(); $asset_id = e(Input::get('asset_id')); // Check if the user exists if (is_null($asset = Asset::find($asset_id))) { // Redirect to the component management page with error return redirect()->route('components.index')->with('error', trans('admin/components/message.asset_does_not_exist')); } // Update the component data $component->asset_id = $asset_id; $component->assets()->attach($component->id, array( 'component_id' => $component->id, 'user_id' => $admin_user->id, 'created_at' => date('Y-m-d H:i:s'), 'assigned_qty' => e(Input::get('assigned_qty')), 'asset_id' => $asset_id)); $logaction = $component->logCheckout(e(Input::get('note')), $asset_id); $settings = Setting::getSettings(); if ($settings->slack_endpoint) { $slack_settings = [ 'username' => $settings->botname, 'channel' => $settings->slack_channel, 'link_names' => true ]; $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); try { $client->attach([ 'color' => 'good', 'fields' => [ [ 'title' => 'Checked Out:', 'value' => class_basename(strtoupper($logaction->item_type)) .' <'.route('components.show', ['component' => $component->id]).'|'.$component->name .'> checked out to <'.route('hardware.show', $asset->id).'|'.$asset->showAssetName() .'> by <'.route('users.show', $admin_user->id).'|'.$admin_user->fullName().'>.' ], [ 'title' => 'Note:', 'value' => e($logaction->note) ], ] ])->send('Component Checked Out'); } catch (Exception $e) { } } return redirect()->route('components.index')->with('success', trans('admin/components/message.checkout.success')); } /** * Generates the JSON response for accessories listing view. * * For debugging, see at /api/accessories/list * * @author [A. Gianotto] [] * @since [v3.0] * @return string JSON **/ public function getDatatable() { $this->authorize('view', Component::class); $components = Company::scopeCompanyables(Component::select('components.*')->whereNull('components.deleted_at') ->with('company', 'location', 'category')); if (Input::has('search')) { $components = $components->TextSearch(Input::get('search')); } if (Input::has('offset')) { $offset = e(Input::get('offset')); } else { $offset = 0; } if (Input::has('limit')) { $limit = e(Input::get('limit')); } else { $limit = 50; } $allowed_columns = ['id','name','min_amt','order_number','serial','purchase_date','purchase_cost','companyName','category','total_qty']; $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; switch ($sort) { case 'category': $components = $components->OrderCategory($order); break; case 'location': $components = $components->OrderLocation($order); break; case 'companyName': $components = $components->OrderCompany($order); break; default: $components = $components->orderBy($sort, $order); break; } $consumCount = $components->count(); $components = $components->skip($offset)->take($limit)->get(); $rows = array(); foreach ($components as $component) { $actions = ''; if (Gate::allows('checkout', $component)) { $actions .= 'numRemaining() > 0) ? '' : ' disabled') . '>' . trans('general.checkout') . ''; } if (Gate::allows('edit', $component)) { $actions .= ''; } if (Gate::allows('delete', $component)) { $actions .= ''; } $actions .=''; $company = $component->company; $rows[] = array( 'checkbox' =>'
', 'id' => $component->id, 'name' => (string)link_to_route('components.show', e($component->name), ['component' => $component->id]), 'serial_number' => $component->serial, 'location' => ($component->location) ? e($component->location->name) : '', 'qty' => number_format($component->qty), 'min_amt' => e($component->min_amt), 'category' => ($component->category) ? e($component->category->name) : 'Missing category', 'order_number' => e($component->order_number), 'purchase_date' => e($component->purchase_date), 'purchase_cost' => Helper::formatCurrencyOutput($component->purchase_cost), 'numRemaining' => $component->numRemaining(), 'actions' => $actions, 'companyName' => is_null($company) ? '' : e($company->name), ); } $data = array('total' => $consumCount, 'rows' => $rows); return $data; } /** * Return JSON data to populate the components view, * * @author [A. Gianotto] [] * @see ComponentsController::getView() method that returns the view. * @since [v3.0] * @param int $componentId * @return string JSON */ public function getDataView($componentId) { if (is_null($component = Component::with('assets')->find($componentId))) { // Redirect to the component management page with error return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } if (!Company::isCurrentUserHasAccess($component)) { return ['total' => 0, 'rows' => []]; } $this->authorize('view', $component); $rows = array(); foreach ($component->assets as $component_assignment) { $rows[] = array( 'name' => (string)link_to_route('hardware.show', e($component_assignment->showAssetName()), ['hardware' => $component_assignment->id]), 'qty' => e($component_assignment->pivot->assigned_qty), 'created_at' => ($component_assignment->created_at->format('Y-m-d H:i:s')=='-0001-11-30 00:00:00') ? '' : $component_assignment->created_at->format('Y-m-d H:i:s'), ); } $componentCount = $component->assets->count(); $data = array('total' => $componentCount, 'rows' => $rows); return $data; } }