April 2026 waren Wirtschaft Feedback
This commit is contained in:
parent
02f2a4c23e
commit
9ce711d6b2
167 changed files with 25278 additions and 8518 deletions
|
|
@ -2,26 +2,23 @@
|
|||
|
||||
namespace App\Repositories;
|
||||
|
||||
|
||||
|
||||
use App\Models\CountryPrice;
|
||||
use App\Models\Attribute;
|
||||
use App\Models\CountryPrice;
|
||||
use App\Models\Ingredient;
|
||||
use App\Models\Product;
|
||||
use App\Models\ProductAttribute;
|
||||
use App\Models\ProductCategory;
|
||||
use App\Models\ProductImage;
|
||||
use App\Models\ProductIngredient;
|
||||
use App\Services\Slim;
|
||||
|
||||
|
||||
class ProductRepository extends BaseRepository {
|
||||
|
||||
|
||||
class ProductRepository extends BaseRepository
|
||||
{
|
||||
public function __construct(Product $model)
|
||||
{
|
||||
$this->model = $model;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* refresh.
|
||||
*/
|
||||
|
|
@ -37,59 +34,211 @@ class ProductRepository extends BaseRepository {
|
|||
$data['max_buy'] = isset($data['max_buy']) ? 1 : 0;
|
||||
$data['show_on'] = isset($data['show_on']) ? $data['show_on'] : null;
|
||||
|
||||
if($data['id'] === "new"){
|
||||
$this->model = Product::create($data);
|
||||
if (array_key_exists('shelf_life_type', $data)) {
|
||||
if ($data['shelf_life_type'] === '' || $data['shelf_life_type'] === null) {
|
||||
$data['shelf_life_type'] = null;
|
||||
$data['shelf_life_months'] = null;
|
||||
} elseif ($data['shelf_life_type'] === 'pao') {
|
||||
$data['shelf_life_months'] = null;
|
||||
} elseif ($data['shelf_life_type'] === 'fixed' && array_key_exists('shelf_life_months', $data) && $data['shelf_life_months'] !== '' && $data['shelf_life_months'] !== null) {
|
||||
$data['shelf_life_months'] = (int) $data['shelf_life_months'];
|
||||
}
|
||||
}
|
||||
else{
|
||||
|
||||
if ($data['id'] === 'new') {
|
||||
$this->model = Product::create($data);
|
||||
} else {
|
||||
$this->model = $this->getById($data['id']);
|
||||
$this->model->fill($data);
|
||||
$this->model->save();
|
||||
}
|
||||
|
||||
|
||||
$this->updateCategories(isset($data['categories']) ? $data['categories'] : []);
|
||||
$this->updateAttributes(isset($data['attributes']) ? $data['attributes'] : []);
|
||||
|
||||
|
||||
$this->updateWLVariants(isset($data['whitelabel_variants']) ? $data['whitelabel_variants'] : []);
|
||||
$this->updateWLImageAttributs(isset($data['image_wl_attributes']) ? $data['image_wl_attributes'] : [] , isset($data['whitelabel_variants']) ? $data['whitelabel_variants'] : []);
|
||||
$this->updateWLImageAttributs(isset($data['image_wl_attributes']) ? $data['image_wl_attributes'] : [], isset($data['whitelabel_variants']) ? $data['whitelabel_variants'] : []);
|
||||
|
||||
$this->updateIngredients(isset($data['product_ingredients']) ? $data['product_ingredients'] : []);
|
||||
$this->updateIngredients($data);
|
||||
$this->updateManufacturerIngredients($data);
|
||||
$this->updatePackagings($data);
|
||||
$this->updateCountryPrices($data);
|
||||
|
||||
|
||||
return $this->model;
|
||||
}
|
||||
|
||||
|
||||
public function updateIngredients($data = array())
|
||||
public function updatePackagings(array $data = []): bool
|
||||
{
|
||||
$ProductIngredient = $this->model->p_ingredients()->pluck('ingredient_id')->toArray();
|
||||
//set attr
|
||||
if(is_array($data)){
|
||||
foreach ($data as $id) {
|
||||
//not use
|
||||
if(!in_array($id, $ProductIngredient)){
|
||||
ProductIngredient::create([
|
||||
'product_id' => $this->model->id,
|
||||
'ingredient_id' => $id,
|
||||
]);
|
||||
}
|
||||
}
|
||||
if (! isset($data['pp_packaging_item_id']) || ! is_array($data['pp_packaging_item_id'])) {
|
||||
$this->model->packagings()->detach();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$ids = $data['pp_packaging_item_id'];
|
||||
$quantities = $data['pp_quantity'] ?? [];
|
||||
$syncData = [];
|
||||
foreach ($ids as $index => $packagingItemId) {
|
||||
$pid = (int) $packagingItemId;
|
||||
if ($pid <= 0) {
|
||||
continue;
|
||||
}
|
||||
$qtyRaw = $quantities[$index] ?? null;
|
||||
$qty = $this->parseNullableDecimal($qtyRaw);
|
||||
if ($qty === null || $qty <= 0) {
|
||||
$qty = 1.0;
|
||||
}
|
||||
$syncData[$pid] = [
|
||||
'quantity' => $qty,
|
||||
'pos' => (int) $index,
|
||||
];
|
||||
}
|
||||
|
||||
$this->model->packagings()->sync($syncData);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function updateCategories($data = array())
|
||||
public function updateIngredients(array $data = []): bool
|
||||
{
|
||||
if (! array_key_exists('product_inci_sync_sent', $data)) {
|
||||
if (isset($data['product_ingredients']) && is_array($data['product_ingredients'])) {
|
||||
$ids = array_values(array_unique(array_filter(array_map('intval', $data['product_ingredients']), fn (int $id) => $id > 0)));
|
||||
$defaults = Ingredient::whereIn('id', $ids)->pluck('default_factor', 'id');
|
||||
|
||||
ProductIngredient::where('product_id', $this->model->id)
|
||||
->where('recipe_type', 'product')
|
||||
->delete();
|
||||
|
||||
foreach ($ids as $index => $ingredientId) {
|
||||
$factor = $defaults[$ingredientId] ?? 1.10;
|
||||
ProductIngredient::create([
|
||||
'product_id' => $this->model->id,
|
||||
'ingredient_id' => $ingredientId,
|
||||
'pos' => $index,
|
||||
'gram' => null,
|
||||
'factor' => $factor,
|
||||
'recipe_type' => 'product',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isset($data['pi_ingredient_id']) && is_array($data['pi_ingredient_id'])) {
|
||||
$ids = $data['pi_ingredient_id'];
|
||||
$grams = $data['pi_gram'] ?? [];
|
||||
$factors = $data['pi_factor'] ?? [];
|
||||
|
||||
ProductIngredient::where('product_id', $this->model->id)
|
||||
->where('recipe_type', 'product')
|
||||
->delete();
|
||||
|
||||
foreach ($ids as $index => $ingredientId) {
|
||||
$ingredientId = (int) $ingredientId;
|
||||
if ($ingredientId <= 0) {
|
||||
continue;
|
||||
}
|
||||
ProductIngredient::create([
|
||||
'product_id' => $this->model->id,
|
||||
'ingredient_id' => $ingredientId,
|
||||
'pos' => $index,
|
||||
'gram' => $this->parseNullableDecimal($grams[$index] ?? null),
|
||||
'factor' => $this->parseFactor($factors[$index] ?? null, $ingredientId),
|
||||
'recipe_type' => 'product',
|
||||
]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ProductIngredient::where('product_id', $this->model->id)
|
||||
->where('recipe_type', 'product')
|
||||
->delete();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function updateManufacturerIngredients(array $data = []): bool
|
||||
{
|
||||
if (! array_key_exists('manufacturer_inci_sync_sent', $data)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isset($data['mfg_ingredient_id']) && is_array($data['mfg_ingredient_id'])) {
|
||||
$ids = $data['mfg_ingredient_id'];
|
||||
$grams = $data['mfg_gram'] ?? [];
|
||||
$factors = $data['mfg_factor'] ?? [];
|
||||
|
||||
ProductIngredient::where('product_id', $this->model->id)
|
||||
->where('recipe_type', 'manufacturer')
|
||||
->delete();
|
||||
|
||||
foreach ($ids as $index => $ingredientId) {
|
||||
$ingredientId = (int) $ingredientId;
|
||||
if ($ingredientId <= 0) {
|
||||
continue;
|
||||
}
|
||||
ProductIngredient::create([
|
||||
'product_id' => $this->model->id,
|
||||
'ingredient_id' => $ingredientId,
|
||||
'pos' => $index,
|
||||
'gram' => $this->parseNullableDecimal($grams[$index] ?? null),
|
||||
'factor' => $this->parseFactor($factors[$index] ?? null, $ingredientId),
|
||||
'recipe_type' => 'manufacturer',
|
||||
]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ProductIngredient::where('product_id', $this->model->id)
|
||||
->where('recipe_type', 'manufacturer')
|
||||
->delete();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function parseNullableDecimal(mixed $value): ?float
|
||||
{
|
||||
if ($value === null || $value === '') {
|
||||
return null;
|
||||
}
|
||||
if (is_numeric($value)) {
|
||||
return (float) $value;
|
||||
}
|
||||
$normalized = reFormatNumber((string) $value);
|
||||
|
||||
return $normalized !== null && $normalized !== '' ? (float) $normalized : null;
|
||||
}
|
||||
|
||||
private function parseFactor(mixed $value, int $ingredientId): float
|
||||
{
|
||||
if ($value === null || $value === '') {
|
||||
$default = Ingredient::whereKey($ingredientId)->value('default_factor');
|
||||
|
||||
return $default !== null ? (float) $default : 1.10;
|
||||
}
|
||||
if (is_numeric($value)) {
|
||||
return (float) $value;
|
||||
}
|
||||
$normalized = reFormatNumber((string) $value);
|
||||
|
||||
return $normalized !== null && $normalized !== '' ? (float) $normalized : 1.10;
|
||||
}
|
||||
|
||||
public function updateCategories($data = [])
|
||||
{
|
||||
foreach ($this->model->categories as $category) {
|
||||
if(($pos = array_search($category->category_id, $data)) !== FALSE){
|
||||
if (($pos = array_search($category->category_id, $data)) !== false) {
|
||||
unset($data[$pos]);
|
||||
}else{
|
||||
} else {
|
||||
$category->delete();
|
||||
}
|
||||
}
|
||||
//set attr
|
||||
if(is_array($data)){
|
||||
// set attr
|
||||
if (is_array($data)) {
|
||||
foreach ($data as $id) {
|
||||
ProductCategory::create([
|
||||
'product_id' => $this->model->id,
|
||||
|
|
@ -97,20 +246,21 @@ class ProductRepository extends BaseRepository {
|
|||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function updateAttributes($data = array())
|
||||
public function updateAttributes($data = [])
|
||||
{
|
||||
foreach ($this->model->attributes as $attribute) {
|
||||
if(($pos = array_search($attribute->attribute_id, $data)) !== FALSE){
|
||||
if (($pos = array_search($attribute->attribute_id, $data)) !== false) {
|
||||
unset($data[$pos]);
|
||||
}else{
|
||||
} else {
|
||||
$attribute->delete();
|
||||
}
|
||||
}
|
||||
//set attr
|
||||
if(is_array($data)){
|
||||
// set attr
|
||||
if (is_array($data)) {
|
||||
foreach ($data as $id) {
|
||||
$attribute = Attribute::findOrFail($id);
|
||||
ProductAttribute::create([
|
||||
|
|
@ -120,20 +270,21 @@ class ProductRepository extends BaseRepository {
|
|||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function updateWLVariants($data = array())
|
||||
public function updateWLVariants($data = [])
|
||||
{
|
||||
foreach ($this->model->attribute_variants as $variant) {
|
||||
if(($pos = array_search($variant->attribute_id, $data)) !== FALSE){
|
||||
if (($pos = array_search($variant->attribute_id, $data)) !== false) {
|
||||
unset($data[$pos]);
|
||||
}else{
|
||||
} else {
|
||||
$variant->delete();
|
||||
}
|
||||
}
|
||||
//set attr
|
||||
if(is_array($data)){
|
||||
// set attr
|
||||
if (is_array($data)) {
|
||||
foreach ($data as $id) {
|
||||
$attribute = Attribute::findOrFail($id);
|
||||
ProductAttribute::create([
|
||||
|
|
@ -143,34 +294,32 @@ class ProductRepository extends BaseRepository {
|
|||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function updateWLImageAttributs($attributes = [], $variants = [])
|
||||
{
|
||||
//abgleich der attributes gegen die variants
|
||||
// abgleich der attributes gegen die variants
|
||||
foreach ($attributes as $image => $value) {
|
||||
foreach ($value as $k => $val) {
|
||||
if(!is_array($variants) || !in_array($val, $variants)){
|
||||
if (! is_array($variants) || ! in_array($val, $variants)) {
|
||||
unset($attributes[$image][$k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($this->model->whitelabel_images as $image) {
|
||||
$image->update([
|
||||
'attributes' => isset($attributes[$image->id]) ? $attributes[$image->id] : NULL,
|
||||
]);
|
||||
$image->update([
|
||||
'attributes' => isset($attributes[$image->id]) ? $attributes[$image->id] : null,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public function updateCountryPrices($data)
|
||||
{
|
||||
if(!isset($data['country_prices']) || !is_array($data['country_prices'])){
|
||||
if (! isset($data['country_prices']) || ! is_array($data['country_prices'])) {
|
||||
return false;
|
||||
}
|
||||
foreach ($data['country_prices'] as $k => $country_id) {
|
||||
|
|
@ -178,61 +327,77 @@ class ProductRepository extends BaseRepository {
|
|||
'country_id' => $country_id,
|
||||
'product_id' => $this->model->id,
|
||||
],
|
||||
[
|
||||
'c_price' => isset($data['c_price'][$country_id]) ? reFormatNumber($data['c_price'][$country_id]) : null,
|
||||
'c_tax' => isset($data['c_tax'][$country_id]) ? reFormatNumber($data['c_tax'][$country_id]) : null,
|
||||
'c_price_old' => isset($data['c_price_old'][$country_id]) ? reFormatNumber($data['c_price_old'][$country_id]) : null,
|
||||
'c_currency' => isset($data['c_currency'][$country_id]) ? reFormatNumber($data['c_currency'][$country_id]) : null,
|
||||
]);
|
||||
[
|
||||
'c_price' => isset($data['c_price'][$country_id]) ? reFormatNumber($data['c_price'][$country_id]) : null,
|
||||
'c_tax' => isset($data['c_tax'][$country_id]) ? reFormatNumber($data['c_tax'][$country_id]) : null,
|
||||
'c_price_old' => isset($data['c_price_old'][$country_id]) ? reFormatNumber($data['c_price_old'][$country_id]) : null,
|
||||
'c_currency' => isset($data['c_currency'][$country_id]) ? reFormatNumber($data['c_currency'][$country_id]) : null,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public function copy($model)
|
||||
{
|
||||
$this->model = $model->replicate();
|
||||
$this->model->name = "Kopie: ".$this->model->name;
|
||||
$this->model->name = 'Kopie: '.$this->model->name;
|
||||
$this->model->wp_number = null;
|
||||
$this->model->save();
|
||||
|
||||
//categories
|
||||
foreach ($model->categories as $category){
|
||||
// categories
|
||||
foreach ($model->categories as $category) {
|
||||
ProductCategory::create([
|
||||
'product_id' => $this->model->id,
|
||||
'category_id' => $category->category_id,
|
||||
]);
|
||||
}
|
||||
|
||||
//attributes
|
||||
foreach ($model->attributes as $attribute){
|
||||
// attributes
|
||||
foreach ($model->attributes as $attribute) {
|
||||
ProductAttribute::create([
|
||||
'product_id' => $this->model->id,
|
||||
'type_id' => $this->model->attribute_type_id,
|
||||
'type_id' => $attribute->type_id,
|
||||
'attribute_id' => $attribute->attribute_id,
|
||||
]);
|
||||
}
|
||||
//INCS
|
||||
$ingredients = $model->p_ingredients()->pluck('ingredient_id')->toArray();
|
||||
if(is_array($ingredients)){
|
||||
foreach ($ingredients as $incs_id){
|
||||
ProductIngredient::create([
|
||||
'product_id' => $this->model->id,
|
||||
'ingredient_id' => $incs_id,
|
||||
]);
|
||||
}
|
||||
foreach ($model->p_ingredients()->orderByPivot('pos')->get() as $ing) {
|
||||
ProductIngredient::create([
|
||||
'product_id' => $this->model->id,
|
||||
'ingredient_id' => $ing->id,
|
||||
'pos' => (int) ($ing->pivot->pos ?? 0),
|
||||
'gram' => $ing->pivot->gram,
|
||||
'factor' => $ing->pivot->factor !== null ? (float) $ing->pivot->factor : 1.10,
|
||||
'recipe_type' => 'product',
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
//images
|
||||
foreach ($model->images as $image){
|
||||
$name = \App\Services\Slim::sanitizeFileName($image->original_name);
|
||||
$name = uniqid() . '_' . $name;
|
||||
foreach ($model->manufacturer_ingredients()->orderByPivot('pos')->get() as $ing) {
|
||||
ProductIngredient::create([
|
||||
'product_id' => $this->model->id,
|
||||
'ingredient_id' => $ing->id,
|
||||
'pos' => (int) ($ing->pivot->pos ?? 0),
|
||||
'gram' => $ing->pivot->gram,
|
||||
'factor' => $ing->pivot->factor !== null ? (float) $ing->pivot->factor : 1.10,
|
||||
'recipe_type' => 'manufacturer',
|
||||
]);
|
||||
}
|
||||
|
||||
//copy
|
||||
$packSync = [];
|
||||
foreach ($model->packagings()->orderByPivot('pos')->get() as $pack) {
|
||||
$packSync[$pack->id] = [
|
||||
'quantity' => $pack->pivot->quantity !== null ? (float) $pack->pivot->quantity : 1.0,
|
||||
'pos' => (int) ($pack->pivot->pos ?? 0),
|
||||
];
|
||||
}
|
||||
$this->model->packagings()->sync($packSync);
|
||||
|
||||
// images
|
||||
foreach ($model->images as $image) {
|
||||
$name = Slim::sanitizeFileName($image->original_name);
|
||||
$name = uniqid().'_'.$name;
|
||||
|
||||
// copy
|
||||
$data = \Storage::disk('public')->copy(
|
||||
'images/product/'.$image->product_id.'/'.$image->filename,
|
||||
'images/product/'.$this->model->id.'/'.$name
|
||||
|
|
@ -246,7 +411,7 @@ class ProductRepository extends BaseRepository {
|
|||
'ext' => $image->ext,
|
||||
'mine' => $image->mine,
|
||||
'size' => $image->size,
|
||||
'attributes' => $image->attributes
|
||||
'attributes' => $image->attributes,
|
||||
|
||||
]);
|
||||
}
|
||||
|
|
@ -254,10 +419,5 @@ class ProductRepository extends BaseRepository {
|
|||
return $this->model;
|
||||
}
|
||||
|
||||
|
||||
public function delete()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
public function delete() {}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue