management integration start

This commit is contained in:
merdan 2022-06-27 14:05:20 +05:00
parent c5c014b188
commit 6fd883568d
2 changed files with 147 additions and 9 deletions

View File

@ -2,6 +2,9 @@
namespace Sarga\API\Http\Controllers;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
@ -9,11 +12,13 @@ use Webkul\API\Http\Controllers\Shop\Controller;
use Webkul\Core\Contracts\Validations\Slug;
use Sarga\Shop\Repositories\ProductRepository;
use Webkul\Marketplace\Repositories\SellerRepository;
use Webkul\Product\Repositories\ProductAttributeValueRepository;
class IntegrationController extends Controller
{
public function __construct(protected ProductRepository $productRepository,
protected ProductAttributeValueRepository $attributeValueRepository,
protected SellerRepository $sellerRepository){}
public function store(){
@ -63,7 +68,8 @@ class IntegrationController extends Controller
if($product = $this->productRepository->findOneByField('sku',$data['product_group_id']))
{//product_group_id
return $this->updateVariants($product);
$this->updateVariants($product,$data);
return response()->json(['success'=>true,'product_id' => $product->id]);
}
elseif($product = $this->productRepository->createProduct($data)){
@ -93,10 +99,142 @@ class IntegrationController extends Controller
}
}
private function updateVariants($product){
private function updateVariants($product,$data) {
try{
DB::beginTransaction();
if($product->type == 'configurable'){
if (!empty($data['color_variants'])) {
foreach ($data['color_variants'] as $colorVariant) {
$description = implode(array_map(fn($value): string => '<p>' . $value['description'] . '</p>', $colorVariant['descriptions']));
if (!empty($colorVariant['size_variants']))
foreach ($colorVariant['size_variants'] as $sizeVariant) {
$sku = "{$data['product_group_id']}-{$colorVariant['product_number']}-{$sizeVariant['itemNumber']}";
if($variant = $this->productRepository->findOneByField('sku',$sku ))
$this->updateAttribute($variant,$sizeVariant);
else{
$variant = $this->productRepository->createVariant($product,$sku);
$this->productRepository->assignImages($variant,$colorVariant['images']);
$attributes = [
'sku' => $variant->sku,
'product_number' => "{$colorVariant['product_number']}-{$sizeVariant['itemNumber']}",
'color' => $this->productRepository->getAttributeOptionId('color', $colorVariant['color']),
'name' => $colorVariant['name'],
'size' => $this->productRepository->getAttributeOptionId('size', $sizeVariant['attributeValue']),
// 'price' => $sizeVariant['price'],
'weight' => $colorVariant['weight'] ?? 0.45,
'status' => 1,
'visible_individually' => 1,
'url_key' => $variant->sku,
'source' => $colorVariant['url_key'],
'description' => $description,
'short_description' => $description,
'favoritesCount' => $colorVariant['favorite_count']
];
$this->productRepository->assignAttributes($variant, array_merge($attributes,$this->productRepository->calculatePrice($sizeVariant['price'])));
}
}
elseif($variant = $this->productRepository->findOneByField('sku', "{$data['product_group_id']}-{$colorVariant['product_number']}"))
{
$this->updateAttribute($variant,$colorVariant);
}
else{
$variant = $this->productRepository->createVariant($product,"{$data['product_group_id']}-{$colorVariant['product_number']}");
$this->productRepository->assignImages($variant,$colorVariant['images']);
$desc = implode(array_map(fn($value): string => '<p>' . $value['description'] . '</p>', $data['descriptions']));
$attributes = [
'sku' => $variant->sku,
'product_number' => $colorVariant['product_number'],
'color' => $this->productRepository->getAttributeOptionId('color', $colorVariant['color']),
'name' => $colorVariant['name'],
// 'price' => Arr::get($colorVariant, 'price.discountedPrice.value'),
'weight' => $colorVariant['weight'] ?? 0.45,
'status' => 1,
'visible_individually' => 1,
'url_key' => $variant->sku,
'source' => $colorVariant['url_key'],
'description' => $description,
'short_description' => $description,
'favoritesCount' => $colorVariant['favorite_count']
];
$this->assignAttributes($variant, array_merge($attributes,$this->productRepository->calculatePrice($colorVariant['price'])));
}
}
}
elseif (!empty($data['size_variants'])){
foreach ($data['size_variants'] as $sizeVariant) {
$sku = "{$data['product_group_id']}-{$data['product_number']}-{$sizeVariant['itemNumber']}";
if($variant = $this->productRepository->findOneByField('sku', $sku)){
$this->updateAttribute($variant,$sizeVariant);
}else{
$variant = $this->productRepository->createVariant($product,$sku);
$this->productRepository->assignImages($variant,$data['images']);
$desc = implode(array_map(fn($value): string => '<p>' . $value['description'] . '</p>', $data['descriptions']));
$attributes = [
'sku' => $variant->sku,
'size' => $this->productRepository->getAttributeOptionId('size', $sizeVariant['attributeValue']),
'product_number' => "{$data['product_number']}-{$sizeVariant['itemNumber']}",
'name' => $data['name'],
// 'price' => $sizeVariant['price'],
'weight' => $data['weight'] ?? 0.45,
'status' => 1,
'featured'=> 0,
'new' => 0,
'visible_individually' => 1,
'url_key' => $variant->sku,
'source' => $data['url_key'],
'description' => $desc,
'short_description' => $desc,
'favoritesCount' => $data['favorite_count']
];
if (!empty($data['color'])) {
$attributes['color'] = $this->productRepository->getAttributeOptionId('color', $data['color']);
}
$this->assignAttributes($variant, array_merge($attributes,$this->productRepository->calculatePrice($sizeVariant['price'])));
}
}
}
}else if($product->type == 'simple'){
$this->updateAttribute($product,$data);
}
Event::dispatch('catalog.product.update.after', $product);
DB::commit();
}
catch(\Exception $ex){
DB::rollBack();
Log::error($ex);
// Log::info($data);
return false;
}
}
private function updateAttribute($product,$data){
if(isset($data['is_sellable']) && !$data['is_sellable']){
//$attribute = $this->attributeRepository->findOneByField('code', 'status'); status id = 8
$this->attributeValueRepository->updateOrCreate(['product_id'=>$product->id,'attribute_id'=>8],['boolean_value'=>0]);
}else{
$originalPrice = Arr::get($data, 'price.originalPrice.value');
$discountedPrice = Arr::get($data, 'price.discountedPrice.value');
$this->attributeValueRepository->updateOrCreate(['product_id'=>$product->id,'attribute_id'=>8],['boolean_value'=>1]);
if($discountedPrice >= $originalPrice){
$this->attributeValueRepository->updateOrCreate(['product_id'=>$product->id,'attribute_id'=>11],['float_value'=>$discountedPrice]);// price id 11
$this->attributeValueRepository->updateOrCreate(['product_id'=>$product->id,'attribute_id'=>13],['float_value'=>null]);//special price id 13
}else{
$this->attributeValueRepository->updateOrCreate(['product_id'=>$product->id,'attribute_id'=>11],['float_value'=>$originalPrice]);// price id 11
$this->attributeValueRepository->updateOrCreate(['product_id'=>$product->id,'attribute_id'=>13],['float_value'=>$discountedPrice]);//special price id 13
}
}
}
private function createVariant($variant){
}
public function updateOrderStatus(){
Log::info(request()->input());
//todo update order status,

View File

@ -85,7 +85,7 @@ class ProductRepository extends WProductRepository
$repository = app(ProductFlatRepository::class)->scopeQuery(function ($query) use ($params, $categoryId) {
$channel = core()->getRequestedChannelCode();
$locale = core()->getRequestedLocaleCode();
$locale = 'tm';//core()->getRequestedLocaleCode();
$qb = $query->distinct()
->select('product_flat.*')
@ -338,7 +338,7 @@ class ProductRepository extends WProductRepository
return $results;
}
private function calculatePrice($price){
public function calculatePrice($price){
$originalPrice = Arr::get($price, 'originalPrice.value');
$discountedPrice = Arr::get($price, 'discountedPrice.value');
@ -617,7 +617,7 @@ class ProductRepository extends WProductRepository
return false;
}
}
private function updateAttribute($product,$data){
public function updateAttribute($product,$data){
// $flat = $product->
if(isset($data['is_sellable']) && !$data['is_sellable']){
//$attribute = $this->attributeRepository->findOneByField('code', 'status'); status id = 8
@ -786,7 +786,7 @@ class ProductRepository extends WProductRepository
//// $brand->save();
// }
private function assignImages($product,$images){
public function assignImages($product,$images){
foreach($images as $image){
$this->imageRepository->create([
'type' => 'cdn',
@ -867,7 +867,7 @@ class ProductRepository extends WProductRepository
return $results;
}
private function assignAttributes($product, $attributes){
public function assignAttributes($product, $attributes){
foreach($attributes as $code => $value){
if(! $attribute = $this->attributeRepository->findOneByField('code', $code))
{
@ -903,7 +903,7 @@ class ProductRepository extends WProductRepository
}
}
private function createVariant($product, $sku){
public function createVariant($product, $sku){
try{
return $this->getModel()->create([
'parent_id' => $product->id,
@ -973,7 +973,7 @@ class ProductRepository extends WProductRepository
return $options;
}
private function getAttributeOptionId($attr,$value){
public function getAttributeOptionId($attr,$value){
$attribute_id = $this->attributeRepository->getAttributeByCode($attr)->id;
$option = $this->optionRepository->findOneWhere(['attribute_id'=>$attribute_id,'admin_name'=>$value]);