$attribute_variants * @property-read int|null $attribute_variants_count * @property-read Collection $whitelabel_images * @property-read int|null $whitelabel_images_count * * @method static \Illuminate\Database\Eloquent\Builder|Product whereExcludeStatsSales($value) * @method static \Illuminate\Database\Eloquent\Builder|Product whereWhitelabel($value) * @method static \Illuminate\Database\Eloquent\Builder|Product whereWhitelabelName($value) * * @mixin \Eloquent */ class Product extends Model { /*identifiers show_upgrade # in membership payment can upgrade this package to show order show_order # in membership payment show always upgrade # need upgrade_to_id set user->payment_order_id to the package in the payment api */ protected $table = 'products'; protected $casts = [ 'trans_name' => 'array', 'trans_title' => 'array', 'trans_copy' => 'array', 'icons' => 'array', 'trans_description' => 'array', 'trans_usage' => 'array', 'trans_ingredients' => 'array', 'show_on' => 'array', 'action' => 'array', 'wp_number' => 'int', 'single_commission' => 'bool', 'amount_commission' => 'bool', 'exclude_stats_sales' => 'bool', 'active' => 'bool', 'shipping_addon' => 'bool', 'max_buy' => 'bool', 'max_buy_num' => 'int', 'whitelabel' => 'bool', ]; use Sluggable; use SoftDeletes; protected $dates = ['deleted_at']; protected $fillable = [ 'name', 'whitelabel', 'whitelabel_name', 'title', 'copy', 'short_copy', 'price', 'price_ek', 'tax', 'price_old', 'points', 'weight', 'contents', 'contents_total', 'unit', 'number', 'wp_number', 'icons', 'description', 'usage', 'ingredients', 'pos', 'amount', 'active', 'show_at', 'show_on', 'single_commission', 'amount_commission', 'value_commission', 'partner_commission', 'exclude_stats_sales', 'identifier', 'action', 'upgrade_to_id', 'shipping_addon', 'max_buy', 'max_buy_num', 'shelf_life_type', 'shelf_life_months', ]; public $identifiers_types = [ '' => '-', 'show_upgrade' => 'Kann geupdatet werden', 'show_order' => 'Wird immer als Option angezeigt', 'upgrade' => 'Produktupgrade zur Produkt ID', 'upgrade_member' => 'Vertriebspartnerupgrade zur Karriere ID', // 'proportional_voucher' => 'Anteiliger Gutschein Vertriebspartner', ]; public $unitTypes = [ 0 => '', 1 => 'ml', 2 => 'g', 3 => 'Liter', 4 => 'KG', ]; public $actions = [ 0 => 'payment_for_account', 1 => 'charging_credits', // 1 => 'payment_for_shop', // 2 => 'payment_for_shop_upgrade', // 4 => 'payment_for_lead_upgrade', ]; public function sluggable(): array { return [ 'slug' => [ 'source' => 'name', ], ]; } public function attributes() { return $this->hasMany(ProductAttribute::class, 'product_id', 'id')->where('type_id', '!=', 1); } public function attribute_variants() { return $this->hasMany(ProductAttribute::class, 'product_id', 'id')->where('type_id', '=', 1); } public function categories() { return $this->hasMany('App\Models\ProductCategory', 'product_id', 'id'); } public function images() { return $this->hasMany(ProductImage::class, 'product_id', 'id')->where('type', '=', 'product')->orderBy('pos'); } public function imagesActive() { return $this->hasMany(ProductImage::class, 'product_id', 'id')->where('type', '=', 'product')->where('active', true)->orderBy('pos'); } public function whitelabel_images() { return $this->hasMany(ProductImage::class, 'product_id', 'id')->where('type', '=', 'wllogo')->orderBy('pos'); } public function country_prices() { return $this->hasMany(CountryPrice::class, 'product_id'); } public function product_buys() { return $this->hasMany(ProductBuy::class, 'product_id'); } public function p_ingredients() { return $this->belongsToMany(Ingredient::class, 'product_ingredients') ->withPivot('id', 'pos', 'gram', 'factor', 'recipe_type') ->withTimestamps() ->wherePivot('recipe_type', 'product') ->orderByPivot('pos'); } public function manufacturer_ingredients() { return $this->belongsToMany(Ingredient::class, 'product_ingredients') ->withPivot('id', 'pos', 'gram', 'factor', 'recipe_type') ->withTimestamps() ->wherePivot('recipe_type', 'manufacturer') ->orderByPivot('pos'); } public function product_ingredients() { return $this->hasMany(ProductIngredient::class, 'product_id'); } /** * Verpackungs-Stückliste (BOM) am Produkt mit Menge und Reihenfolge. * * @return BelongsToMany */ public function packagings() { return $this->belongsToMany(PackagingItem::class, 'product_packagings') ->withPivot('quantity', 'pos') ->withTimestamps() ->orderByPivot('pos'); } /** * @return HasMany */ public function productions(): HasMany { return $this->hasMany(Production::class); } public function getShortCopy($clean = false, $len = false) { $ret = $this->short_copy ? $this->short_copy : $this->description; if ($len && $clean) { return substr_ellipsis($ret, $len, $clean); } return $ret; } public function getActionName($id = 0) { if (isset($this->actions[$id])) { return $this->actions[$id]; } return false; } public function getWhiteLableName($id = 0) { return $this->whitelabel_name ? $this->whitelabel_name : $this->name; } public function _format_number($value) { return preg_replace('/[^0-9,]/', '', $value); } public function setPriceAttribute($value) { $this->attributes['price'] = $value ? Util::reFormatNumber($value) : null; } public function setPriceEkAttribute($value) { $this->attributes['price_ek'] = $value ? Util::reFormatNumber($value) : null; } public function setTaxAttribute($value) { $this->attributes['tax'] = $value != '' ? Util::reFormatNumber($value) : null; } public function setPriceOldAttribute($value) { $this->attributes['price_old'] = $value ? Util::reFormatNumber($value) : null; } public function setValueCommissionAttribute($value) { $this->attributes['value_commission'] = $value ? Util::reFormatNumber($value) : 0; } public function setPartnerCommissionAttribute($value) { $this->attributes['partner_commission'] = $value ? Util::reFormatNumber($value) : 0; } public function getFormattedPrice() { return isset($this->attributes['price']) ? Util::formatNumber($this->attributes['price']) : ''; } public function getFormattedPriceEk() { return isset($this->attributes['price_ek']) ? Util::formatNumber($this->attributes['price_ek']) : ''; } public function getFormattedTax($country = null) { return isset($this->attributes['tax']) ? Util::formatNumber($this->getTaxWith($country), 0) : ''; } public function getFormattedPriceOld() { return isset($this->attributes['price_old']) ? Util::formatNumber($this->attributes['price_old']) : ''; } public function getFormattedValueCommission() { return isset($this->attributes['value_commission']) ? Util::formatNumber($this->attributes['value_commission']) : 0; } public function getFormattedPartnerCommission() { return isset($this->attributes['partner_commission']) ? Util::formatNumber($this->attributes['partner_commission']) : 0; } /* price by user Factor */ private function calcPriceUserFactor($price) { /* Nicht in benutzung, die margin errechnet sich im Warenkorb, wegen der Staffelprovision if(\Auth::user() && \Auth::user()->user_level){ $margin = ((\Auth::user()->user_level->margin -100)*-1) / 100; $price = $price * $margin; } */ return $price; } /* price net */ private function calcPriceNet($price, $country = null) { $tax = $this->getTaxWith($country); $tax_rate = ($tax + 100) / 100; return $price / $tax_rate; } // price calu with public function getPriceWith(bool $net = true, bool $ufactor = true, $country = null, $commission = false) { $price = isset($this->attributes['price']) ? $this->attributes['price'] : null; /*$cprice = $country ? $this->getCPrice($country) : null; //eigener Preis für Land $price = $cprice ? $cprice : $price; */ $price = $net ? $this->calcPriceNet($price, $country) : $price; $price = $ufactor ? $this->calcPriceUserFactor($price) : $price; $price = $commission ? $this->calcPriceUserCommission($price) : $price; return round($price, 2); } /* out */ public function getFormattedPriceWith(bool $net = true, bool $ufactor = true) { return isset($this->attributes['price']) ? Util::formatNumber($this->getPriceWith($net, $ufactor)) : ''; } public function getTaxWith($country = null) { $tax = isset($this->attributes['tax']) ? $this->attributes['tax'] : null; $ctax = $country ? $this->getCTax($country) : null; return $ctax !== null ? $ctax : $tax; } public function getBasePriceFormattedFull() { if ($price = $this->getBasePrice()) { $unit = $this->attributes['unit']; // ml g if ($unit === 1 || $unit === 2) { return Util::formatNumber($price).' € / 100 '.$this->getUnitType(); } // l kg if ($unit === 3 || $unit === 4) { return Util::formatNumber($price).' € / 1 '.$this->getUnitType(); } } return ''; } public function getBasePriceFormatted() { if ($price = $this->getBasePrice()) { return Util::formatNumber($price); } return ''; } public function getBasePrice() { if (isset($this->attributes['unit']) && isset($this->attributes['contents_total']) && $this->attributes['contents_total'] != 0) { $unit = $this->attributes['unit']; // ml g if ($unit === 1 || $unit === 2) { return $this->attributes['price'] * 100 / $this->attributes['contents_total']; } // l kg if ($unit === 3 || $unit === 4) { return $this->attributes['price'] * 1000 / $this->attributes['contents_total']; } } return ''; } public function getUnitType() { return isset($this->unitTypes[$this->unit]) ? $this->unitTypes[$this->unit] : '-'; } public function getShowAtType() { return isset(Type::$showATs[$this->show_at]) ? Type::$showATs[$this->show_at] : '-'; } public function getShowOnTypes($seperator = false) { $ret = []; if ($this->show_on && is_array($this->show_on)) { foreach ($this->show_on as $show) { $ret[] = isset(Type::$showONs[$show]) ? Type::$showONs[$show] : '-'; } } return $seperator ? implode($seperator, $ret) : $ret; } public function setPosAttribute($value) { $this->attributes['pos'] = is_numeric($value) ? $value : null; } public function getLang($key) { $lang = \App::getLocale(); if ($lang == 'de') { return $this->{$key}; } $trans = $this->getTrans($key, $lang); if (! $trans || $trans == '') { return $this->{$key}; } return $trans; } public function getTrans($key, $lang) { $key = 'trans_'.$key; if (! empty($this->{$key}[$lang])) { return $this->{$key}[$lang]; } } public function getTranNames() { $ret = ''; foreach ((array) $this->trans_name as $value) { $ret .= $value.', '; } return rtrim($ret, ', '); } public function getCountryPrice($country_id) { return $this->country_prices->where('country_id', '=', $country_id)->first() ?: new CountryPrice; } public function getCPrice($country_id) { return $this->getCountryPrice($country_id)->c_price; } public function getCTax($country_id) { return $this->getCountryPrice($country_id)->c_tax; } public function getCPriceOld($country_id) { return $this->getCountryPrice($country_id)->c_price_old; } public function getCCurrency($country_id) { return $this->getCountryPrice($country_id)->c_currency; } public function getRealPrice(Country $country) { if ($country->own_eur && $this->getCPrice($country->id)) { return $this->getCPrice($country->id); } return $this->price; } public function getFormattedPriceCurrencyWith(bool $net = true, bool $ufactor = true, ?Country $country = null, $commission = false) { $ret = ''; if ($country && isset($country->currency) && $country->currency) { $price = $this->getPriceWith($net, $ufactor, $country, $commission); $ret = formatNumber($price * $country->currency_faktor).' '.$country->currency_unit; return '
~'.$ret.''; } return ''; } }