/home/techb158/immovalet.com/platform/plugins/ecommerce/src/Traits
Edit: /home/techb158/immovalet.com/platform/plugins/ecommerce/src/Traits/ProductActionsTrait.php (30481B)
productRepository = $productRepository;
$this->productCategoryRepository = $productCategoryRepository;
$this->productCollectionRepository = $productCollectionRepository;
$this->brandRepository = $brandRepository;
$this->productAttributeRepository = $productAttributeRepository;
}
/**
* @param array $versionInRequest
* @param ProductVariationInterface $productVariation
* @param int $id
* @param BaseHttpResponse $response
* @param bool $isUpdateProduct
* @return BaseHttpResponse
*/
public function postSaveAllVersions(
$versionInRequest,
ProductVariationInterface $productVariation,
$id,
BaseHttpResponse $response,
$isUpdateProduct = true
) {
$product = $this->productRepository->findOrFail($id);
foreach ($versionInRequest as $variationId => $version) {
$variation = $productVariation->findById($variationId);
if (!$variation->product_id || $isUpdateProduct) {
$isNew = false;
$productRelatedToVariation = $this->productRepository->findById($variation->product_id);
if (!$productRelatedToVariation) {
$productRelatedToVariation = $this->productRepository->getModel();
$isNew = true;
}
$productRelatedToVariation->fill($version);
$productRelatedToVariation->name = $product->name;
$productRelatedToVariation->status = $product->status;
$productRelatedToVariation->category_id = $product->category_id;
$productRelatedToVariation->brand_id = $product->brand_id;
$productRelatedToVariation->is_variation = 1;
$productRelatedToVariation->sku = Arr::get($version, 'sku');
if (!$productRelatedToVariation->sku && Arr::get($version, 'auto_generate_sku')) {
$productRelatedToVariation->sku = $product->sku;
if (isset($version['attribute_sets']) && is_array($version['attribute_sets'])) {
foreach ($version['attribute_sets'] as $attributeId) {
$attribute = $this->productAttributeRepository->findById($attributeId);
if ($attribute) {
$productRelatedToVariation->sku .= '-' . Str::upper($attribute->slug);
}
}
}
}
$productRelatedToVariation->price = Arr::get($version, 'price', $product->price);
$productRelatedToVariation->sale_price = Arr::get($version, 'sale_price', $product->sale_price);
$productRelatedToVariation->description = Arr::get($version, 'description');
$productRelatedToVariation->length = Arr::get($version, 'length', $product->length);
$productRelatedToVariation->wide = Arr::get($version, 'wide', $product->wide);
$productRelatedToVariation->height = Arr::get($version, 'height', $product->height);
$productRelatedToVariation->weight = Arr::get($version, 'weight', $product->weight);
$productRelatedToVariation->with_storehouse_management = Arr::get($version,
'with_storehouse_management', 0);
$productRelatedToVariation->stock_status = Arr::get($version,
'stock_status', StockStatusEnum::IN_STOCK);
$productRelatedToVariation->quantity = Arr::get($version, 'quantity', $product->quantity);
$productRelatedToVariation->allow_checkout_when_out_of_stock = Arr::get($version,
'allow_checkout_when_out_of_stock', 0);
$productRelatedToVariation->sale_type = (int)Arr::get($version, 'sale_type', $product->sale_type);
if ($productRelatedToVariation->sale_type == 0) {
$productRelatedToVariation->start_date = null;
$productRelatedToVariation->end_date = null;
} else {
$productRelatedToVariation->start_date = Arr::get($version, 'start_date', $product->start_date);
$productRelatedToVariation->end_date = Arr::get($version, 'end_date', $product->end_date);
}
if ($isNew) {
$productRelatedToVariation->images = json_encode(array_values(array_filter(Arr::get($version,
'images') ? Arr::get($version, 'images') : [])));
}
$productRelatedToVariation = $this->productRepository->createOrUpdate($productRelatedToVariation);
if (!$productRelatedToVariation->is_variation) {
if ($isNew) {
event(new CreatedContentEvent(PRODUCT_MODULE_SCREEN_NAME, request(), $productRelatedToVariation));
} else {
event(new UpdatedContentEvent(PRODUCT_MODULE_SCREEN_NAME, request(), $productRelatedToVariation));
}
}
$variation->product_id = $productRelatedToVariation->id;
}
$variation->is_default = Arr::get($version, 'variation_default_id', 0) == $variation->id;
$productVariation->createOrUpdate($variation);
if (isset($version['attribute_sets']) && is_array($version['attribute_sets'])) {
$variation->productAttributes()->sync($version['attribute_sets']);
}
}
return $response->setMessage(trans('core/base::notices.update_success_message'));
}
/**
* @param int $id
* @param Request $request
* @param ProductVariationInterface $variationRepository
* @param BaseHttpResponse $response
* @param StoreAttributesOfProductService $storeAttributesOfProductService
* @return BaseHttpResponse
* @throws Exception
*/
public function postAddAttributeToProduct(
$id,
Request $request,
ProductVariationInterface $variationRepository,
BaseHttpResponse $response,
StoreAttributesOfProductService $storeAttributesOfProductService
) {
$product = $this->productRepository->findOrFail($id);
$addedAttributes = $request->input('added_attributes', []);
if ($addedAttributes) {
foreach ($addedAttributes as $key => $addedAttribute) {
if (empty($addedAttribute)) {
unset($addedAttributes[$key]);
}
}
if (!empty($addedAttributes)) {
$result = $variationRepository->getVariationByAttributesOrCreate($id, $addedAttributes);
$addedAttributeSets = $request->input('added_attribute_sets', []);
foreach ($addedAttributeSets as $key => $addedAttributeSet) {
if (empty($addedAttributeSet)) {
unset($addedAttributeSets[$key]);
}
}
$storeAttributesOfProductService->execute($product, $addedAttributeSets);
$variation = $result['variation']->toArray();
$variation['variation_default_id'] = $variation['id'];
$variation['auto_generate_sku'] = true;
$this->postSaveAllVersions([$variation['id'] => $variation], $variationRepository, $id, $response);
}
}
return $response->setMessage(trans('core/base::notices.update_success_message'));
}
/**
* @param int $id
* @param Request $request
* @param BaseHttpResponse $response
* @return BaseHttpResponse
*/
public function destroy($id, Request $request, BaseHttpResponse $response)
{
$product = $this->productRepository->findOrFail($id);
try {
$this->productRepository->deleteBy(['id' => $id]);
event(new DeletedContentEvent(PRODUCT_MODULE_SCREEN_NAME, $request, $product));
return $response->setMessage(trans('core/base::notices.delete_success_message'));
} catch (Exception $exception) {
return $response
->setError()
->setMessage($exception->getMessage());
}
}
/**
* @param Request $request
* @param BaseHttpResponse $response
* @return BaseHttpResponse
*/
public function deletes(Request $request, BaseHttpResponse $response)
{
$ids = $request->input('ids');
if (empty($ids)) {
return $response
->setError()
->setMessage(trans('core/base::notices.no_select'));
}
foreach ($ids as $id) {
$product = $this->productRepository->findOrFail($id);
$this->productRepository->delete($product);
event(new DeletedContentEvent(PRODUCT_MODULE_SCREEN_NAME, $request, $product));
}
return $response->setMessage(trans('core/base::notices.delete_success_message'));
}
/**
* @param ProductVariationInterface $productVariation
* @param ProductVariationItemInterface $productVariationItem
* @param int $variationId
* @param BaseHttpResponse $response
* @return BaseHttpResponse
* @throws Exception
*/
public function deleteVersion(
ProductVariationInterface $productVariation,
ProductVariationItemInterface $productVariationItem,
$variationId,
BaseHttpResponse $response
) {
$result = $this->deleteVersionItem($productVariation, $productVariationItem, $variationId);
if ($result) {
return $response->setMessage(trans('core/base::notices.delete_success_message'));
}
return $response
->setError()
->setMessage(trans('core/base::notices.delete_error_message'));
}
/**
* @param Request $request
* @param ProductVariationInterface $productVariation
* @param ProductVariationItemInterface $productVariationItem
* @param BaseHttpResponse $response
* @return BaseHttpResponse
* @throws Exception
*/
public function deleteVersions(
Request $request,
ProductVariationInterface $productVariation,
ProductVariationItemInterface $productVariationItem,
BaseHttpResponse $response
) {
$ids = (array)$request->input('ids');
if (empty($ids)) {
return $response
->setError()
->setMessage(trans('core/base::notices.no_select'));
}
foreach ($ids as $id) {
$this->deleteVersionItem($productVariation, $productVariationItem, $id);
}
return $response->setMessage(trans('core/base::notices.delete_success_message'));
}
/**
* @param ProductVariationInterface $productVariation
* @param ProductVariationItemInterface $productVariationItem
* @param int $variationId
* @return bool
* @throws Exception
*/
protected function deleteVersionItem(
ProductVariationInterface $productVariation,
ProductVariationItemInterface $productVariationItem,
$variationId
) {
$variation = $productVariation->findOrFail($variationId);
$productVariationItem->deleteBy(['variation_id' => $variationId]);
$productRelatedToVariation = $this->productRepository->findById($variation->product_id);
if ($productRelatedToVariation) {
event(new DeletedContentEvent(PRODUCT_MODULE_SCREEN_NAME, request(), $productRelatedToVariation));
}
$this->productRepository->deleteBy(['id' => $variation->product_id]);
$result = $productVariation->delete($variation);
if ($variation->is_default) {
$latestVariation = $productVariation->getFirstBy(['configurable_product_id' => $variation->configurable_product_id]);
$originProduct = $this->productRepository->findById($variation->configurable_product_id);
if ($latestVariation) {
$latestVariation->is_default = 1;
$productVariation->createOrUpdate($latestVariation);
if ($originProduct && $latestVariation->product->id) {
$originProduct->sku = $latestVariation->product->sku;
$originProduct->price = $latestVariation->product->price;
$originProduct->length = $latestVariation->product->length;
$originProduct->wide = $latestVariation->product->wide;
$originProduct->height = $latestVariation->product->height;
$originProduct->weight = $latestVariation->product->weight;
$originProduct->with_storehouse_management = $latestVariation->product->with_storehouse_management;
$originProduct->stock_status = $latestVariation->product->stock_status;
$originProduct->quantity = $latestVariation->product->quantity;
$originProduct->allow_checkout_when_out_of_stock = $latestVariation->product->allow_checkout_when_out_of_stock;
$originProduct->sale_price = $latestVariation->product->sale_price;
$originProduct->sale_type = $latestVariation->product->sale_type;
$originProduct->start_date = $latestVariation->product->start_date;
$originProduct->end_date = $latestVariation->product->end_date;
$this->productRepository->createOrUpdate($originProduct);
}
} else {
$originProduct->productAttributeSets()->detach();
$originProduct->productAttributes()->detach();
}
}
return $result;
}
/**
* @param ProductVersionRequest $request
* @param ProductVariationRepository|ProductVariationInterface $productVariation
* @param int $id
* @param BaseHttpResponse $response
* @return BaseHttpResponse
*/
public function postAddVersion(
ProductVersionRequest $request,
ProductVariationInterface $productVariation,
$id,
BaseHttpResponse $response
) {
$addedAttributes = $request->input('attribute_sets', []);
if ($addedAttributes && !empty($addedAttributes) && is_array($addedAttributes)) {
$result = $productVariation->getVariationByAttributesOrCreate($id, $addedAttributes);
if (!$result['created']) {
return $response
->setError()
->setMessage(trans('plugins/ecommerce::products.form.variation_existed'));
}
$this->postSaveAllVersions([$result['variation']->id => $request->input()], $productVariation, $id,
$response);
return $response->setMessage(trans('plugins/ecommerce::products.form.added_variation_success'));
}
return $response
->setError()
->setMessage(trans('plugins/ecommerce::products.form.no_attributes_selected'));
}
/**
* @param int $id
* @param Request $request
* @param ProductVariationInterface $productVariation
* @param BaseHttpResponse $response
* @param ProductAttributeSetInterface $productAttributeSetRepository
* @param ProductVariationItemInterface $productVariationItemRepository
* @return BaseHttpResponse
*/
public function getVersionForm(
$id,
Request $request,
ProductVariationInterface $productVariation,
BaseHttpResponse $response,
ProductAttributeSetInterface $productAttributeSetRepository,
ProductVariationItemInterface $productVariationItemRepository
) {
$product = null;
$variation = null;
$productVariationsInfo = collect([]);
if ($id) {
$variation = $productVariation->findOrFail($id);
$product = $this->productRepository->findOrFail($variation->product_id);
$productVariationsInfo = $productVariationItemRepository->getVariationsInfo([$id]);
}
$productId = $variation ? $variation->configurable_product_id : $request->input('product_id');
if ($productId) {
$productAttributeSets = $productAttributeSetRepository->getByProductId($productId);
} else {
$productAttributeSets = $productAttributeSetRepository->getAllWithSelected($productId);
}
$originalProduct = $product;
return $response
->setData(
view('plugins/ecommerce::products.partials.product-variation-form', compact(
'productAttributeSets',
'product',
'productVariationsInfo',
'originalProduct'
))->render()
);
}
/**
* @param Request $request
* @param ProductVariationRepository|ProductVariationInterface $productVariation
* @param int $id
* @param BaseHttpResponse $response
* @return BaseHttpResponse
* @throws Exception
*/
public function postUpdateVersion(
ProductVersionRequest $request,
ProductVariationInterface $productVariation,
$id,
BaseHttpResponse $response
) {
$variation = $productVariation->findOrFail($id);
$addedAttributes = $request->input('attribute_sets', []);
if ($addedAttributes && !empty($addedAttributes) && is_array($addedAttributes)) {
$result = $productVariation->getVariationByAttributesOrCreate($variation->configurable_product_id,
$addedAttributes);
if (!$result['created'] && $result['variation']->id !== $variation->id) {
return $response
->setError()
->setMessage(trans('plugins/ecommerce::products.form.variation_existed'));
}
if ($variation->is_default) {
$request->merge([
'variation_default_id' => $variation->id,
]);
}
$this->postSaveAllVersions(
[$variation->id => $request->input()],
$productVariation,
$variation->configurable_product_id,
$response
);
$productVariation->deleteBy(['product_id' => null]);
return $response->setMessage(trans('plugins/ecommerce::products.form.updated_variation_success'));
}
return $response
->setError()
->setMessage(trans('plugins/ecommerce::products.form.no_attributes_selected'));
}
/**
* @param CreateProductVariationsService $service
* @param ProductVariationInterface $productVariation
* @param int $id
* @param BaseHttpResponse $response
* @return BaseHttpResponse
*/
public function postGenerateAllVersions(
CreateProductVariationsService $service,
ProductVariationInterface $productVariation,
$id,
BaseHttpResponse $response
) {
$product = $this->productRepository->findOrFail($id);
$variations = $service->execute($product);
$variationInfo = [];
foreach ($variations as $variation) {
/**
* @var Collection $variation
*/
$data = $variation->toArray();
if ((int)$variation->is_default === 1) {
$data['variation_default_id'] = $variation->id;
}
$variationInfo[$variation->id] = $data;
}
$this->postSaveAllVersions($variationInfo, $productVariation, $id, $response, false);
return $response->setMessage(trans('plugins/ecommerce::products.form.created_all_variation_success'));
}
/**
* @param Request $request
* @param StoreAttributesOfProductService $service
* @param int $id
* @param BaseHttpResponse $response
* @return BaseHttpResponse
* @throws Exception
*/
public function postStoreRelatedAttributes(
Request $request,
StoreAttributesOfProductService $service,
$id,
BaseHttpResponse $response
) {
$product = $this->productRepository->findOrFail($id);
$attributeSets = $request->input('attribute_sets', []);
$service->execute($product, $attributeSets);
return $response->setMessage(trans('plugins/ecommerce::products.form.updated_product_attributes_success'));
}
/**
* @param int $id
* @param Request $request
* @param BaseHttpResponse $response
* @return BaseHttpResponse
* @throws Throwable
*/
public function getListProductForSearch(Request $request, BaseHttpResponse $response)
{
$availableProducts = $this->productRepository
->advancedGet([
'condition' => [
'status' => BaseStatusEnum::PUBLISHED,
['is_variation', '<>', 1],
['id', '<>', $request->input('product_id', 0)],
['name', 'LIKE', '%' . $request->input('keyword') . '%'],
],
'select' => [
'id',
'name',
'images',
],
'paginate' => [
'per_page' => 5,
'type' => 'simplePaginate',
'current_paged' => (int)$request->input('page', 1),
],
]);
$includeVariation = $request->input('include_variation', 0);
return $response->setData(
view('plugins/ecommerce::products.partials.panel-search-data', compact(
'availableProducts',
'includeVariation'
))->render()
);
}
/**
* @param int $id
* @param BaseHttpResponse $response
* @return BaseHttpResponse
* @throws Throwable
*/
public function getRelationBoxes($id, BaseHttpResponse $response)
{
$product = null;
if ($id) {
$product = $this->productRepository->findById($id);
}
$dataUrl = route('products.get-list-product-for-search', ['product_id' => $product ? $product->id : 0]);
return $response->setData(view('plugins/ecommerce::products.partials.extras',
compact('product', 'dataUrl'))->render());
}
/**
* @param Request $request
* @param BaseHttpResponse $response
* @return BaseHttpResponse
*/
public function getListProductForSelect(Request $request, BaseHttpResponse $response)
{
$availableProducts = $this->productRepository
->getModel()
->where('status', BaseStatusEnum::PUBLISHED)
->where('is_variation', '<>', 1)
->where('name', 'LIKE', '%' . $request->input('keyword') . '%')
->select([
'ec_products.*',
])
->distinct('ec_products.id');
$includeVariation = $request->input('include_variation', 0);
if ($includeVariation) {
/**
* @var Builder $availableProducts
*/
$availableProducts = $availableProducts
->join('ec_product_variations', 'ec_product_variations.configurable_product_id', '=', 'ec_products.id')
->join('ec_product_variation_items', 'ec_product_variation_items.variation_id', '=',
'ec_product_variations.id');
}
$availableProducts = $availableProducts->simplePaginate(5);
if ($includeVariation) {
foreach ($availableProducts as &$availableProduct) {
$availableProduct->image_url = RvMedia::getImageUrl(Arr::first($availableProduct->images) ?? null,
'thumb', false, RvMedia::getDefaultImage());
$availableProduct->price = $availableProduct->front_sale_price;
foreach ($availableProduct->variations as &$variation) {
$variation->price = $variation->product->front_sale_price;
foreach ($variation->variationItems as &$variationItem) {
$variationItem->attribute_title = $variationItem->attribute->title;
}
}
}
}
return $response->setData($availableProducts);
}
/**
* @param CreateProductWhenCreatingOrderRequest $request
* @param BaseHttpResponse $response
* @return BaseHttpResponse
*/
public function postCreateProductWhenCreatingOrder(
CreateProductWhenCreatingOrderRequest $request,
BaseHttpResponse $response
) {
$product = $this->productRepository->createOrUpdate($request->input());
event(new CreatedContentEvent(PRODUCT_MODULE_SCREEN_NAME, $request, $product));
$product->image_url = RvMedia::getImageUrl(Arr::first($product->images) ?? null, 'thumb', false,
RvMedia::getDefaultImage());
$product->price = $product->front_sale_price;
$product->select_qty = 1;
return $response
->setData($product)
->setMessage(trans('core/base::notices.create_success_message'));
}
/**
* @param Request $request
* @param BaseHttpResponse $response
* @return BaseHttpResponse
*/
public function getAllProductAndVariations(Request $request, BaseHttpResponse $response)
{
$availableProducts = $this->productRepository
->getModel()
->where('status', BaseStatusEnum::PUBLISHED)
->where('is_variation', '<>', 1)
->where('name', 'LIKE', '%' . $request->input('keyword') . '%')
->select([
'ec_products.*',
])
->distinct('ec_products.id')
->leftJoin('ec_product_variations', 'ec_product_variations.configurable_product_id', '=', 'ec_products.id')
->leftJoin('ec_product_variation_items', 'ec_product_variation_items.variation_id', '=',
'ec_product_variations.id')
->simplePaginate(5);
foreach ($availableProducts as &$availableProduct) {
/**
* @var Product $availableProduct
*/
$availableProduct->image_url = RvMedia::getImageUrl(Arr::first($availableProduct->images) ?? null, 'thumb',
false, RvMedia::getDefaultImage());
$availableProduct->price = $availableProduct->front_sale_price;
$availableProduct->is_out_of_stock = $availableProduct->isOutOfStock();
foreach ($availableProduct->variations as &$variation) {
$variation->price = $variation->product->front_sale_price;
$variation->is_out_of_stock = $variation->product->isOutOfStock();
$variation->quantity = $variation->product->quantity;
foreach ($variation->variationItems as &$variationItem) {
$variationItem->attribute_title = $variationItem->attribute->title;
}
}
}
return $response->setData($availableProducts);
}
/**
* @param ProductUpdateOrderByRequest $request
* @param BaseHttpResponse $response
* @return BaseHttpResponse
*/
public function postUpdateOrderBy(ProductUpdateOrderByRequest $request, BaseHttpResponse $response)
{
$product = $this->productRepository->findOrFail($request->input('pk'));
$product->order = $request->input('value', 0);
$this->productRepository->createOrUpdate($product);
return $response->setMessage(trans('core/base::notices.update_success_message'));
}
}