year)) { $attributes->year = year(); } }); } protected $fillable = [ 'year', 'user_id', 'district_id', 'area_id', 'object_address', 'object_type_id', 'contract_date', 'contract_number', 'comment', 'installation_date', 'ready_date', 'brigadier_id', 'order_status_id', 'tg_group_name', 'tg_group_link', 'ready_to_mount', ]; public $appends = ['common_name', 'products_with_count']; public function products_sku(): HasMany { return $this->hasMany(ProductSKU::class, 'order_id', 'id'); } public function products(): HasManyThrough { return $this->hasManyThrough( Product::class, ProductSKU::class, 'order_id', 'id', 'id', 'product_id'); } public function user(): BelongsTo { return $this->belongsTo(User::class, 'user_id', 'id'); } public function district(): BelongsTo { return $this->belongsTo(District::class); } public function area(): BelongsTo { return $this->belongsTo(Area::class); } public function objectType(): BelongsTo { return $this->belongsTo(ObjectType::class); } public function brigadier(): BelongsTo { return $this->belongsTo(User::class, 'brigadier_id', 'id'); } public function orderStatus(): BelongsTo { return $this->belongsTo(OrderStatus::class); } public function getNeeds(): array { $needs = []; foreach ($this->products_sku as $sku) { $needs[$sku->product_id]['needs'] = (isset($needs[$sku->product_id])) ? $needs[$sku->product_id]['needs'] + 1 : 1; } foreach ($needs as $productId => $quantity) { $needs[$productId]['sku'] = MafOrder::query() ->where('maf_orders.product_id', $productId) ->sum('maf_orders.in_stock'); } return $needs; } public function recalculateReadyToMount(): void { $result = true; foreach ($this->getNeeds() as $need) { if($need['sku'] < $need['needs']) { $result = false; break; } } if($this->order_status_id > self::STATUS_NEW) { $result = true; } $this->update(['ready_to_mount' => ($result) ? 'Да' : 'Нет']); } public function commonName(): Attribute { return Attribute::make( get: fn($value) => (string) $this->district->shortname . ', ' . $this->area->name . ', ' . $this->object_address, ); } public function productsWithCount(): Attribute { $products = $this->products_sku; $ret = []; foreach ($products as $product) { if(isset($ret[$product->product->id])) { $ret[$product->product->id]['count'] += 1; } else { $ret[$product->product->id] = [ 'name' => $product->product->article, 'count' => 1, ]; } if($product->maf_order?->order_number) { $ret[$product->product->id]['order_numbers'][] = $product->maf_order?->order_number; } } $s = ''; foreach ($ret as $product) { ; $order_numbers = (isset($product['order_numbers'])) ? ' (' . implode(', ', array_unique($product['order_numbers'])) . ')' : ''; $s .= '
' . $product['name'] . ' - ' . $product['count'] . $order_numbers . '
'; } return Attribute::make( get: fn($value) => (string) $s, ); } }