productService = $productService; $this->productRepo = $productRepo; } /** * @return \Illuminate\Http\RedirectResponse */ public function index() { return View::make('list_wrapper', [ 'entityType' => ENTITY_PRODUCT, 'datatable' => new ProductDatatable(), 'title' => trans('texts.products'), 'statuses' => Product::getStatuses(), ]); } public function show($publicId) { Session::reflash(); return Redirect::to("products/$publicId/edit"); } /** * @return \Illuminate\Http\JsonResponse */ public function getDatatable() { return $this->productService->getDatatable(Auth::user()->account_id, Input::get('sSearch')); } public function cloneProduct(ProductRequest $request, $publicId) { return self::edit($request, $publicId, true); } /** * @param $publicId * * @return \Illuminate\Contracts\View\View */ public function edit(ProductRequest $request, $publicId, $clone = false) { Auth::user()->can('view', [ENTITY_PRODUCT, $request->entity()]); $account = Auth::user()->account; $product = Product::scope($publicId)->withTrashed()->firstOrFail(); if ($clone) { $product->id = null; $product->public_id = null; $product->deleted_at = null; $url = 'products'; $method = 'POST'; } else { $url = 'products/'.$publicId; $method = 'PUT'; } $data = [ 'account' => $account, 'taxRates' => $account->invoice_item_taxes ? TaxRate::scope()->whereIsInclusive(false)->get() : null, 'product' => $product, 'entity' => $product, 'method' => $method, 'url' => $url, 'title' => trans('texts.edit_product'), ]; return View::make('accounts.product', $data); } /** * @return \Illuminate\Contracts\View\View */ public function create(ProductRequest $request) { $account = Auth::user()->account; $data = [ 'account' => $account, 'taxRates' => $account->invoice_item_taxes ? TaxRate::scope()->whereIsInclusive(false)->get(['id', 'name', 'rate']) : null, 'product' => null, 'method' => 'POST', 'url' => 'products', 'title' => trans('texts.create_product'), ]; return View::make('accounts.product', $data); } /** * @return \Illuminate\Http\RedirectResponse */ public function store(CreateProductRequest $request) { return $this->save(); } /** * @param $publicId * * @return \Illuminate\Http\RedirectResponse */ public function update(UpdateProductRequest $request, $publicId) { return $this->save($publicId); } /** * @param bool $productPublicId * * @return \Illuminate\Http\RedirectResponse */ private function save($productPublicId = false) { if ($productPublicId) { $product = Product::scope($productPublicId)->withTrashed()->firstOrFail(); } else { $product = Product::createNew(); } $this->productRepo->save(Input::all(), $product); $message = $productPublicId ? trans('texts.updated_product') : trans('texts.created_product'); Session::flash('message', $message); $action = request('action'); if (in_array($action, ['archive', 'delete', 'restore', 'invoice'])) { return self::bulk(); } if ($action == 'clone') { return redirect()->to(sprintf('products/%s/clone', $product->public_id)); } else { return redirect()->to("products/{$product->public_id}/edit"); } } /** * @return \Illuminate\Http\RedirectResponse */ public function bulk() { $action = Input::get('action'); $ids = Input::get('public_id') ? Input::get('public_id') : Input::get('ids'); if ($action == 'invoice') { $products = Product::scope($ids)->get(); $data = []; foreach ($products as $product) { $data[] = $product->product_key; } return redirect("invoices/create")->with('selectedProducts', $data); } else { $count = $this->productService->bulk($ids, $action); } $message = Utils::pluralize($action.'d_product', $count); Session::flash('message', $message); return $this->returnBulk(ENTITY_PRODUCT, $action, $ids); } }