'decimal:4', 'supply_amount' => 'decimal:2', 'tax_amount' => 'decimal:2', 'total_amount' => 'decimal:2', 'discount_rate' => 'decimal:2', 'discount_amount' => 'decimal:2', 'received_at' => 'datetime', 'delivery_date' => 'date', 'created_at' => 'datetime', 'updated_at' => 'datetime', 'deleted_at' => 'datetime', ]; /** * 수주 상세 품목 */ public function items(): HasMany { return $this->hasMany(OrderItem::class)->orderBy('sort_order'); } /** * 수주 이력 */ public function histories(): HasMany { return $this->hasMany(OrderHistory::class); } /** * 수주 버전 */ public function versions(): HasMany { return $this->hasMany(OrderVersion::class); } /** * 원본 견적 */ public function quote(): BelongsTo { return $this->belongsTo(Quote::class); } /** * 거래처 */ public function client(): BelongsTo { return $this->belongsTo(Client::class); } /** * 품목 (통합 items 테이블) */ public function item(): BelongsTo { return $this->belongsTo(Item::class, 'item_id'); } /** * 품목들로부터 금액 합계 재계산 */ public function recalculateTotals(): self { $this->supply_amount = $this->items->sum('supply_amount'); $this->tax_amount = $this->items->sum('tax_amount'); $this->total_amount = $this->items->sum('total_amount'); $this->quantity = $this->items->sum('quantity'); return $this; } /** * 견적에서 수주 생성 */ public static function createFromQuote(Quote $quote, string $orderNo): self { return new self([ 'tenant_id' => $quote->tenant_id, 'quote_id' => $quote->id, 'order_no' => $orderNo, 'order_type_code' => self::TYPE_ORDER, 'status_code' => self::STATUS_DRAFT, 'client_id' => $quote->client_id, 'client_name' => $quote->client?->name, 'client_contact' => $quote->contact_person, 'site_name' => $quote->site_name, 'quantity' => $quote->items->sum('calculated_quantity'), 'supply_amount' => $quote->total_amount, 'tax_amount' => round($quote->total_amount * 0.1, 2), 'total_amount' => round($quote->total_amount * 1.1, 2), 'delivery_date' => $quote->delivery_date, 'memo' => $quote->remarks, 'remarks' => $quote->internal_notes, ]); } }