117 lines
3.6 KiB
PHP
117 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Collection;
|
|
|
|
use App\Models\{Product,ProductTranslate};
|
|
|
|
class ProductController extends Controller
|
|
{
|
|
/**
|
|
* Get a list of products that meet a type
|
|
*
|
|
* @param Request $request
|
|
* @return Collection
|
|
* @throws \Exception
|
|
*/
|
|
public function api_supplier_products(Request $request): Collection
|
|
{
|
|
switch ($request->type) {
|
|
case 'App\Models\Product\Broadband':
|
|
return Product\Broadband::select(['id','supplier_item_id'])
|
|
->with(['supplied.supplier_detail.supplier'])
|
|
->get()
|
|
->map(function($item) { return ['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier_detail->supplier->name,$item->supplied->name)]; })
|
|
->sortBy('name')
|
|
->values();
|
|
|
|
case 'App\Models\Product\Email':
|
|
return Product\Email::select(['id','supplier_item_id'])
|
|
->with(['supplied.supplier_detail.supplier'])
|
|
->get()
|
|
->map(function($item) { return ['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier_detail->supplier->name,$item->supplied->name)]; })
|
|
->sortBy('name')
|
|
->values();
|
|
|
|
case 'App\Models\Product\Host':
|
|
return Product\Host::select(['id','supplier_item_id'])
|
|
->with(['supplied.supplier_detail.supplier'])
|
|
->get()
|
|
->map(function($item) { return ['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier_detail->supplier->name,$item->supplied->name)]; })
|
|
->sortBy('name')
|
|
->values();
|
|
|
|
case 'App\Models\Product\Phone':
|
|
return Product\Phone::select(['id','supplier_item_id'])
|
|
->with(['supplied.supplier_detail.supplier'])
|
|
->get()
|
|
->map(function($item) { return ['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier_detail->supplier->name,$item->supplied->name)]; })
|
|
->sortBy('name')
|
|
->values();
|
|
|
|
default:
|
|
throw new \Exception('Unknown type: '.$request->type);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update a suppliers details
|
|
*
|
|
* @param Request $request
|
|
* @param Product $o
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function details(Request $request,Product $o)
|
|
{
|
|
if ($request->post()) {
|
|
$validation = $request->validate([
|
|
'description.name' => 'required|string|min:2|max:255',
|
|
'active' => 'sometimes|accepted',
|
|
'model' => 'sometimes|string', // @todo Check that it is a valid model type
|
|
'model_id' => 'sometimes|int', // @todo Check that it is a valid model type
|
|
]);
|
|
|
|
foreach (collect($validation)->except('description') as $key => $item)
|
|
$o->{$key} = $item;
|
|
|
|
$o->active = (bool)$request->active;
|
|
|
|
try {
|
|
$o->save();
|
|
} catch (\Exception $e) {
|
|
return redirect()->back()->withErrors($e->getMessage())->withInput();
|
|
}
|
|
|
|
$o->load(['description']);
|
|
$oo = $o->description ?: new ProductTranslate;
|
|
|
|
foreach (collect($validation)->get('description',[]) as $key => $item)
|
|
$oo->{$key} = $item;
|
|
|
|
$o->description()->save($oo);
|
|
|
|
return redirect()->back()
|
|
->with('success','Product saved');
|
|
}
|
|
|
|
if (! $o->exists && $request->name)
|
|
$o = Product::where('name',$request->name)->firstOrNew();
|
|
|
|
return view('product.details')
|
|
->with('breadcrumb',collect(['Products'=>url('a/product')]))
|
|
->with('o',$o);
|
|
}
|
|
|
|
/**
|
|
* Manage products for a site
|
|
*
|
|
* @note This method is protected by the routes
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
|
|
*/
|
|
public function home()
|
|
{
|
|
return view('product.home');
|
|
}
|
|
} |