$this->barcode_id, 'material_name' => $this->material_name, 'user_id' => $this->user_id, // detect type model 'type' => $this->detectType(), // serialized only 'serial_number' => $this->when( $this->isSerialized(), $this->serial_number ), // consumable only 'qty' => $this->when( $this->isConsumable(), [ 'received' => $this->qty_received ?? null, 'used' => $this->qty_used ?? null, 'remaining' => $this->qty_remaining ?? null, 'unit' => $this->unit ?? null, ] ), // status (beda logic tapi tetap dipakai keduanya) 'status' => $this->status ?? null, // optional tracking info 'assigned_at' => $this->assigned_at ?? null, ]; } private function detectType(): string { // kalau punya qty field → consumable if (isset($this->qty_received) || isset($this->qty_remaining)) { return 'consumable'; } return 'serialized'; } private function isSerialized(): bool { return !isset($this->qty_received); } private function isConsumable(): bool { return isset($this->qty_received); } }