query("SELECT movementNumber FROM WarehouseMovement WHERE movementNumber LIKE '{$prefix}%' ORDER BY movementNumber DESC LIMIT 1"); if ($row = $result->fetch_assoc()) { $lastNumber = intval(substr($row['movementNumber'], -6)); $nextNumber = $lastNumber + 1; } else { $nextNumber = 1; } return $prefix . str_pad((string)$nextNumber, 6, '0', STR_PAD_LEFT); } /** * Get reason categories for a movement type */ public static function getReasonCategories(?string $type = null): array { $categories = [ 'IN' => [ 'Warenlieferung' => 'Warenlieferung', 'Rueckgabe' => 'Rückgabe', 'Gefunden' => 'Gefunden/Inventurdifferenz', 'UmlagerungEingang' => 'Umlagerung (Eingang)', 'Erstbestand' => 'Erstbestand', 'Sonstiges' => 'Sonstiges' ], 'OUT' => [ 'Verbrauch' => 'Verbrauch', 'Beschaedigung' => 'Beschädigung/Defekt', 'Verlust' => 'Verlust/Schwund', 'UmlagerungAusgang' => 'Umlagerung (Ausgang)', 'Entsorgung' => 'Entsorgung', 'Sonstiges' => 'Sonstiges' ], 'ADJUSTMENT' => [ 'Inventurkorrektur' => 'Inventurkorrektur', 'Buchungsfehler' => 'Buchungsfehler', 'Systemkorrektur' => 'Systemkorrektur', 'SonstigeKorrektur' => 'Sonstige Korrektur' ] ]; if ($type && isset($categories[$type])) { return $categories[$type]; } return $categories; } /** * Get movement type labels */ public static function getMovementTypes(): array { return [ 'IN' => 'Einbuchung', 'OUT' => 'Ausbuchung', 'ADJUSTMENT' => 'Korrektur' ]; } public function getArticle(): ?WarehouseArticleModel { return WarehouseArticleModel::get($this->articleId); } /** * Get location object */ public function getLocation(): ?WarehouseLocationModel { return WarehouseLocationModel::get($this->warehouseLocationId); } /** * Get user who made the movement */ public function getUser(): ?UserModel { return UserModel::get($this->userId); } /** * Get warehouse item if linked */ public function getWarehouseItem(): ?WarehouseItemModel { if (!$this->warehouseItemId) return null; return WarehouseItemModel::get($this->warehouseItemId); } /** * Get linked order if this movement was created from an order delivery */ public function getLinkedOrder(): ?WarehouseOrderModel { if (!$this->linkedOrderId) return null; return WarehouseOrderModel::get($this->linkedOrderId); } /** * Get formatted movement type label */ public function getMovementTypeLabel(): string { $types = self::getMovementTypes(); return $types[$this->movementType] ?? $this->movementType; } /** * Get formatted reason category label */ public function getReasonCategoryLabel(): string { $allCategories = self::getReasonCategories(); foreach ($allCategories as $typeCategories) { if (isset($typeCategories[$this->reasonCategory])) { return $typeCategories[$this->reasonCategory]; } } return $this->reasonCategory; } }