'입고', self::TYPE_OUT => '출고', self::TYPE_RESERVE => '예약', self::TYPE_RELEASE => '예약해제', ]; // 사유 상수 public const REASON_RECEIVING = 'receiving'; public const REASON_WORK_ORDER_INPUT = 'work_order_input'; public const REASON_SHIPMENT = 'shipment'; public const REASON_ORDER_CONFIRM = 'order_confirm'; public const REASON_ORDER_CANCEL = 'order_cancel'; public const REASONS = [ self::REASON_RECEIVING => '입고', self::REASON_WORK_ORDER_INPUT => '생산투입', self::REASON_SHIPMENT => '출하', self::REASON_ORDER_CONFIRM => '수주확정', self::REASON_ORDER_CANCEL => '수주취소', ]; protected $fillable = [ 'tenant_id', 'stock_id', 'stock_lot_id', 'type', 'qty', 'balance_qty', 'reference_type', 'reference_id', 'lot_no', 'reason', 'remark', 'item_code', 'item_name', 'created_by', ]; protected $casts = [ 'stock_id' => 'integer', 'stock_lot_id' => 'integer', 'qty' => 'decimal:3', 'balance_qty' => 'decimal:3', 'reference_id' => 'integer', 'created_by' => 'integer', 'created_at' => 'datetime', ]; // ===== 관계 ===== public function stock(): BelongsTo { return $this->belongsTo(Stock::class); } public function stockLot(): BelongsTo { return $this->belongsTo(StockLot::class); } public function creator(): BelongsTo { return $this->belongsTo(\App\Models\Members\User::class, 'created_by'); } // ===== Accessors ===== public function getTypeLabelAttribute(): string { return self::TYPES[$this->type] ?? $this->type; } public function getReasonLabelAttribute(): string { return self::REASONS[$this->reason] ?? ($this->reason ?? '-'); } }