'Новая', self::STATUS_NOT_READY => 'Не готова', self::STATUS_READY_NO_MAF => 'Готова, нет МАФ', self::STATUS_READY_TO_MOUNT => 'Готова к монтажу', self::STATUS_IN_MOUNT => 'В монтаже', self::STATUS_DUTY => 'Долг', self::STATUS_READY_TO_HAND_OVER => 'Готова к сдаче', self::STATUS_NOT_HANDED_OVER_WITH_NOTES => 'Не сдана, замечания', self::STATUS_HANDED_OVER_WITH_NOTES => 'Сдана с замечаниями', self::STATUS_HANDED_OVER => 'Сдана', self::STATUS_NO_MAF => 'Отсутствуют МАФ', self::STATUS_PROBLEM => 'Проблема', ]; const STATUS_COLOR = [ self::STATUS_NEW => 'dark', self::STATUS_NOT_READY => 'dark', self::STATUS_READY_NO_MAF => '', self::STATUS_READY_TO_MOUNT => 'primary', self::STATUS_IN_MOUNT => 'info', self::STATUS_DUTY => 'warning', self::STATUS_READY_TO_HAND_OVER => 'primary', self::STATUS_NOT_HANDED_OVER_WITH_NOTES => 'warning', self::STATUS_HANDED_OVER_WITH_NOTES => 'info', self::STATUS_HANDED_OVER => 'success', self::STATUS_NO_MAF => 'secondary', self::STATUS_PROBLEM => 'danger', ]; // set year attribute to current selected year protected static function boot(): void { parent::boot(); static::creating(function($attributes) { if(!isset($attributes->year)) { $attributes->year = year(); } }); } protected $fillable = [ 'year', 'name', 'user_id', 'district_id', 'area_id', 'object_address', 'object_type_id', '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 photos(): BelongsToMany { return $this->belongsToMany(File::class, 'order_photo'); } public function documents(): BelongsToMany { return $this->belongsToMany(File::class, 'order_document'); } public function statements(): BelongsToMany { return $this->belongsToMany(File::class, 'order_statement'); } public function reclamations(): HasMany { return $this->hasMany(Reclamation::class); } public function getNeeds(): array { $needs = []; foreach ($this->products_sku as $sku) { if($sku->maf_order) continue; $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; } } $this->update(['ready_to_mount' => ($result) ? 'Да' : 'Нет']); } public function autoChangeStatus(): void { if(($this->products_sku->count() < 1) && ($this->order_status_id !== self::STATUS_NEW) ) { $this->update(['order_status_id' => self::STATUS_NO_MAF]); return; } if(($this->order_status_id === self::STATUS_READY_TO_MOUNT) && ($this->brigadier_id !== null) && ($this->installation_date !== null) ) { $allMafConnected = true; foreach ($this->products_sku as $sku) { if($sku->maf_order) continue; $allMafConnected = false; } if($allMafConnected) { $this->update(['order_status_id' => self::STATUS_IN_MOUNT]); } } } public function commonName(): Attribute { return Attribute::make( get: fn($value) => (string) $this->object_address . ', ' . $this->area->name . ', ' . $this->district->shortname, ); } 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 = ''; $openTag = '
'; $closeTag = '
'; foreach ($ret as $product) { $order_numbers = (isset($product['order_numbers'])) ? ' (' . implode(', ', array_unique($product['order_numbers'])) . ')' : ''; $s .= $openTag . $product['name'] . ' - ' . $product['count'] . $order_numbers . $closeTag; } return Attribute::make( get: fn($value) => (string) $s, ); } public function isAllMafConnected(): bool { foreach($this->products_sku as $sku) { if($sku->maf_order_id) continue; return false; } return true; } public function canCreateHandover(): bool { if($this->photos->count() === 0) { return false; } foreach($this->products_sku as $sku) { if($sku->maf_order_id === null) return false; if($sku->passport_id === null) return false; if($sku->rfid === null) return false; if($sku->manufacture_date === null) return false; if($sku->factory_number === null) return false; if($sku->product->passport_name === null) return false; if($sku->product->statement_name === null) return false; if($sku->product->certificate_id === null) return false; if($sku->product->service_life === null) return false; if($sku->product->certificate_number === null) return false; if($sku->product->certificate_date === null) return false; if($sku->product->certificate_issuer === null) return false; if($sku->product->certificate_type === null) return false; } return true; } }