d2d.emegrendeles.hu/app/Http/Controllers/Admin/ProductController.php
2026-07-05 06:37:45 +02:00

473 lines
18 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Enums\BasicUnitEnum;
use App\Enums\ProductUnitEnum;
use App\Http\Controllers\Controller;
use App\Models\Producer;
use App\Models\Product;
use App\Models\ProductGroup;
use App\Models\ProfitCenter;
use App\Models\Supplier;
use App\Services\ProductService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\View\View;
class ProductController extends Controller
{
protected ProductService $service;
private bool $testMode = false;
public function __construct(ProductService $service)
{
$this->service = $service;
}
/**
* Display a listing of the resource.
*/
public function index(): View
{
$suppliers = Supplier::orderBy('name')->get(['id', 'name'])->toArray();
$profitCenters = ProfitCenter::orderBy('name')->get(['id', 'name'])->toArray();
$productGroups = ProductGroup::orderBy('name')->get(['id', 'name'])->toArray();
$producer = Producer::orderBy('name')->get(['id', 'name'])->toArray();
DB::statement("SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));");
$hooreycaNames = Product::orderBy('buyerProductName')->where('buyerProductName', '!=', '')->groupBy('buyerProductName')->get(['id', 'buyerProductName as name'])->toArray();
DB::statement("SET sql_mode=(SELECT CONCAT(@@sql_mode, ',ONLY_FULL_GROUP_BY'));");
// dd($hooreycaNames);
// dd(json_encode($service->getAvailableFilters()));
return view('admin.product.index')->with(
[
'suppliers' => $suppliers,
'profitCenters' => $profitCenters,
'productGroups' => $productGroups,
'producer' => $producer,
'hooreycaNames' => $hooreycaNames,
'testMode' => $this->testMode,
'init' => (bool) \request()->get('init', true),
// 'formUUID'=>\Str::uuid(),
// 'availableFilters'=>json_encode(['Product'=>['suppliers','date','dateFrom','dateTo','productGroups','products','hooreycaNames','producers']]),
'availableFilters'=>json_encode(['Product'=>['suppliers','productGroups','products','hooreycaNames','producers','specialOffer']]),
]
);
$retData = [];
// $retData['testMode']=($this->testMode)?'true':'false';
$retData['testMode'] = $this->testMode;
$retData['init'] = (bool) \request()->get('init', true);
return view('admin.product.index')->with($retData);
/*
$ProductGroup=new \App\Models\ProductGroup();
$productGroupArray=$ProductGroup->allWithParents(2);
return view('admin.product.edit')->with(
['productGroup'=>$productGroupArray,
'productUnit'=>ProductUnitEnum::getValues(),
'producer'=>[
['id'=>11,'name'=>'Voyagex'],
['id'=>12,'name'=>'Győri előre'],
['id'=>13,'name'=>'Elmar'],
['id'=>14,'name'=>'Gramellini'],
]
]);
*/
}
/**
* Show the form for creating a new resource.
*/
public function create(Request $request): View
{
$supplierId = $request->integer('supplierId');
$ProductGroup = new \App\Models\ProductGroup;
$productGroupArray = $ProductGroup->allWithParents(3);
$Product = new Product();
$Product->supplier_id = $supplierId;
$Product->setAttribute('price', 0);
$supplier = Supplier::find($supplierId);
$Product->setRelation('Supplier', $supplier);
$Product->setRelation('supplier', $supplier);
$Producer = [];
foreach (Producer::orderBy('name')->get() as $producer) {
$Producer[] = ['id' => $producer->id, 'name' => $producer->name];
}
return view('admin.product.edit')->with([
'Product' => $Product,
'productGroup' => $productGroupArray,
'productUnit' => BasicUnitEnum::getValues(),
'sellerUnit' => ProductUnitEnum::getValues(),
'producer' => $Producer,
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): Response|JsonResponse
{
$validated = $request->validate($this->productValidationRules());
$validated = $this->transformValidated($validated);
$price = $validated['price'];
unset($validated['price']);
$productId = $this->service->add($validated);
if (! $productId) {
return \response()->json([
'success' => false,
'errors' => ['create' => 'Nem sikerült a termék létrehozása!'],
])->setStatusCode(422);
}
$supplierId = $validated['supplier_id'];
$today = \Carbon\Carbon::today()->format('Y-m-d');
$priceList = \App\Models\PriceList::where('supplier_id', $supplierId)
->where('available', '<=', $today)
->whereNull('deleted_at')
->orderBy('available', 'desc')
->orderBy('id', 'asc')
->first();
if ($priceList) {
$priceList->products()->attach($productId, ['price' => $price]);
}
return \response()->json([
'status' => 'ok',
'message' => 'Product created successfully!',
'success' => true,
'id' => $productId,
]);
}
/**
* Display the specified resource.
*/
public function show(int $ProductId): Response|JsonResponse
{
return response('ez show');
}
/**
* Show the form for editing the specified resource.
*
* @param int $ProductId
*/
public function prof_flag($str)
{
global $prof_timing, $prof_names;
$prof_timing[] = microtime(true);
$prof_names[] = $str;
}
// Call this when you're done and want to see the results
public function prof_print()
{
global $prof_timing, $prof_names;
$size = count($prof_timing);
if ($size == 0) {
return;
}
for ($i = 0; $i < $size - 1; $i++) {
echo "<b>{$prof_names[$i]}</b><br>";
echo sprintf('&nbsp;&nbsp;&nbsp;%f<br>', $prof_timing[$i + 1] - $prof_timing[$i]);
}
echo "<b>{$prof_names[$size - 1]}</b><br>";
}
public function edit(int $ProductId): View
{
// $this->prof_flag('Start');
$ProductGroup = new \App\Models\ProductGroup;
// @todo:too slow, change other methode
$productGroupArray = $ProductGroup->allWithParents(3);
$Product = Product::with(['Supplier', 'Producer', 'ProductGroup', 'picture', 'specification'])->find($ProductId);
$Product->setAttributePrice();
// $this->prof_flag(__LINE__);
$Producer = [];
foreach (Producer::orderBy('name')->get() as $producer) {
$Producer[] = ['id' => $producer->id, 'name' => $producer->name];
}
// $this->prof_flag(__LINE__);
if (! \request()->ajax()) {
// $this->prof_print();
dd($productGroupArray, $Product, $Product->toArray());
}
//
return view('admin.product.edit')->with(
['Product' => $Product,
'productGroup' => $productGroupArray,
'productUnit' => BasicUnitEnum::getValues(),
'sellerUnit' => ProductUnitEnum::getValues(),
// 'productUnit'=>ProductUnitEnum::getValues(),
'producer' => $Producer,
]);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, int $ProductId): Response|JsonResponse
{
$validated = $request->validate($this->productValidationRules());
$validated = $this->transformValidated($validated);
$ret = [];
if (! $this->service->update($ProductId, $validated)) {
if ($this->service->hasError()) {
$ret['success'] = false;
$ret['errors'] = $this->service->getError();
}
return \response()->json($ret)->setStatusCode(422);
}
if (! $this->service->updatePrice($ProductId, $validated['price'])) {
if ($this->service->hasError()) {
$ret['success'] = false;
$ret['errors'] = $this->service->getError();
}
return \response()->json($ret)->setStatusCode(422);
}
/**@todo: save picture, specification, price
* save picture
* save specification
*/
$ret = ['status' => 'ok', 'message' => 'Product save successfully!'];
$ret['success'] = true;
return \response()->json($ret);
}
/**
* @return array<string, string>
*/
protected function productValidationRules(): array
{
return [
'name' => 'required|string|max:255',
'supplierId' => 'required|integer|exists:suppliers,id',
'producer' => 'nullable|exists:producers,id',
'packaging' => 'required|numeric|min:0',
'unitValue' => 'required|numeric|min:0',
'productUnit' => 'required|string|in:'.implode(',', BasicUnitEnum::getValues()),
'sellerUnit' => 'required|string|in:'.implode(',', ProductUnitEnum::getValues()),
'unitMultiplier' => 'required|numeric|min:0',
'amountUnit' => 'required|string|in:'.implode(',', ProductUnitEnum::getValues()),
'vat' => 'required|numeric|min:0',
'supplierProductNumber' => 'nullable|string|max:255',
'buyerProductName' => 'nullable|string|max:255',
'productGroup' => 'required|exists:product_groups,id',
'hooreycaId' => 'nullable|string|max:255',
'HooreycaUnit' => 'nullable|string|max:255',
'HooreycaMultiplier' => 'nullable|numeric|min:0',
'note' => 'nullable|string',
'canSee' => 'boolean',
'krel' => 'boolean',
'specialOffer' => 'boolean',
'price' => 'required|numeric|min:0',
];
}
/**
* @param array<string, mixed> $validated
* @return array<string, mixed>
*/
protected function transformValidated(array $validated): array
{
$validated['producer_id'] = isset($validated['producer']) ? $validated['producer'][0] : null;
$validated['product_group_id'] = $validated['productGroup'][0];
$validated['supplier_id'] = $validated['supplierId'];
$validated['packing'] = $validated['packaging'];
unset($validated['producer'], $validated['productGroup'], $validated['supplierId'], $validated['packaging']);
$validated['note'] = str_replace("\r\n", "\n", $validated['note'] ?? '');
return $validated;
}
/**
* Remove the specified resource from storage.
*/
public function destroy(int $ProductId): Response|JsonResponse
{
//
return response()->noContent();
}
public function getDataTableContent(Request $request): JsonResponse
{
$searchParameter = json_decode($request->input('ajaxData'), true);
$Product = Product::with(['Supplier', 'Producer', 'ProductGroup']);
if ($request->input('search.value')) {
$Product->where('name', 'like', '%'.$request->input('search.value').'%');
}
if (isset($searchParameter['products[]'])) {
if (! is_array($searchParameter['products[]'])) {
$searchParameter['products[]'] = [$searchParameter['products[]']];
}
$Product->whereIn('name', $searchParameter['products[]']);
}
if (isset($searchParameter['hooreycaNames[]'])) {
if (! is_array($searchParameter['hooreycaNames[]'])) {
$searchParameter['hooreycaNames[]'] = [$searchParameter['hooreycaNames[]']];
}
$Product->whereIn('buyerProductName', $searchParameter['hooreycaNames[]']);
}
if (isset($searchParameter['producers[]'])) {
if (! is_array($searchParameter['producers[]'])) {
$searchParameter['producers[]'] = [$searchParameter['producers[]']];
}
$Product->whereIn('producer_id', $searchParameter['producers[]']);
}
if (isset($searchParameter['suppliers[]'])) {
if (! is_array($searchParameter['suppliers[]'])) {
$searchParameter['suppliers[]'] = [$searchParameter['suppliers[]']];
}
$Product->whereIn('supplier_id', $searchParameter['suppliers[]']);
}
if (isset($searchParameter['productGroups[]'])) {
if (! is_array($searchParameter['productGroups[]'])) {
$searchParameter['productGroups[]'] = [$searchParameter['productGroups[]']];
}
foreach ($searchParameter['productGroups[]'] as $productGroupId) {
$productGroup = ProductGroup::find($productGroupId);
// $children=$productGroup->getChildNodesArray($productGroup);
$nodeDepth = ProductGroup::where('id', $productGroupId)->withDepth()->first()->depth;
if ($nodeDepth == 2) {
$childrenId = $productGroup->descendants()->withDepth()->having('depth', '=', $nodeDepth + 1)->get()->pluck('id');
// $searchParameter['productGroups[]']=array_merge($searchParameter['productGroups[]'],$childrenId->toArray());
}
// dd($productGroupId,$nodeDepth,$children);
}
$Product->whereIn('product_group_id', $searchParameter['productGroups[]']);
}
// Akciós szűrő (specialOffer): '1' = Igen, '0' = Nem, '' vagy hiányzik = Mindegy
if(isset($searchParameter['specialOffer']) && $searchParameter['specialOffer'] !== ''){
$val = $searchParameter['specialOffer'] == '1' ? 1 : 0;
$Product->where('specialOffer', $val);
}
// Csak az utolsó (legfrissebb) aktív árlistában szereplő termékek szűrő
// Per supplier: a legfrissebb, de még ma előtti available dátumú árlista az érvényes
if (isset($searchParameter['onlyActivePriceList']) && $searchParameter['onlyActivePriceList'] == '1') {
$today = \Carbon\Carbon::today()->format('Y-m-d');
$latestPriceListIds = DB::table('price_lists as pl')
->joinSub(
DB::table('price_lists')
->where('available', '<=', $today)
->whereNull('deleted_at')
->select('supplier_id', DB::raw('MAX(available) as max_available'))
->groupBy('supplier_id'),
'latest',
function ($join) {
$join->on('pl.supplier_id', '=', 'latest.supplier_id')
->on('pl.available', '=', 'latest.max_available');
}
)
->whereNull('pl.deleted_at')
->pluck('pl.id');
$Product->whereHas('PriceList', function ($query) use ($latestPriceListIds) {
$query->whereIn('price_lists.id', $latestPriceListIds);
});
}
if (! $request->ajax()) {
// dd($searchParameter,$Product->toSql(), $request->input());
}
// dd($request->input('order.0.dir'));
if ($request->input('order.0')) {
// dd($request->input('order.0'));
$pointer = $request->input('order.0.column');
$orderName = $request->input('columns')[$pointer]['data'];
$orderDirection = $request->input('order.0.dir');
$Product->orderBy($orderName, $orderDirection);
}
// if($request->get('search.value'))
$count = $Product->count('id');
$Product->limit($request->get('length'));
$Product->offset($request->get('start'));
$ProductDD = $Product->toSql();
// dd($request->all(),$ProductDD);
// $ProductDD=$Product->get()->first()->LastPrice;
$ret = [
'draw' => $request->get('draw'),
'recordsTotal' => Product::count(),
'recordsFiltered' => $count,
'data' => [],
];
if (! $request->ajax()) {
// dd($Product->get()->toArray() );
}
foreach ($Product->get() as $item) {
$data['id'] = $item->id;
$data['name'] = $item->name;
$data['buyerProductName'] = $item->buyerProductName;
$data['hooreycaId'] = $item->hooreycaId;
$data['productGroup'] = $item->ProductGroup->name;
if (isset($item->Supplier->name)) {
$data['supplierName'] = $item->Supplier->name;
} else {
$data['supplierName'] = '-';
}
if (is_numeric($item->Price())) {
$data['price'] = $item->Price();
} else {
$data['price'] = '-';
}
$data['created_at'] = formatterDateTime($item->created_at);
$ret['data'][] = $data;
}
$ProductDD = $ret['data'];
if (! $request->ajax()) {
dd($searchParameter, getSql($Product), $request->input(), $ret['data']);
}
return \response()->json($ret);
dd($request->all(), $ProductDD);
}
}