"""Service métier unique pour créer des équipements. Les formulaires historiques (fiche avancée et wizard) délèguent ici la construction de l'objet. Le lot reste facultatif : un inventaire incomplet est valide et pourra être complété plus tard. """ from datetime import date from ...extensions import db from ..models.equipment import Equipment def create_equipment(*, name, category_id=None, lot_id=None, room_id=None, quantity=1, is_group=False, parent_id=None, tracked_individually=False, mobility="non_precise", status="en_service", code=None, description=None, management_mode=None, serial_number=None, manufacturer=None, model_reference=None, supplier_id=None, supplier_reference=None, purchase_price=None, purchase_date=None, recurrence_monitoring=False, position=None, individual_number=None, create_schedule=True): """Construit, ajoute et flush un équipement sans recherche par nom. Retourne l'instance persistable et son identifiant est disponible dès le retour. La génération préventive est déclenchée uniquement si un lot est effectivement renseigné. """ name = (name or "").strip() if not name: raise ValueError("Le nom de l'équipement est obligatoire.") quantity = int(quantity or 1) if quantity < 1: raise ValueError("La quantité doit être positive.") equipment = Equipment( name=name, category_id=category_id or None, lot_id=lot_id or None, room_id=room_id or None, quantity=quantity, is_group=bool(is_group), parent_id=parent_id or None, tracked_individually=bool(tracked_individually), mobility=mobility or "non_precise", status=status or "en_service", code=code or None, description=description or None, management_mode=management_mode or None, serial_number=serial_number or None, manufacturer=manufacturer or None, model_reference=model_reference or None, supplier_id=supplier_id or None, supplier_reference=supplier_reference or None, purchase_price=purchase_price or None, purchase_date=purchase_date, recurrence_monitoring=bool(recurrence_monitoring), position=position or None, individual_number=individual_number, ) db.session.add(equipment) db.session.flush() if create_schedule and equipment.lot_id: equipment.create_scheduled_tasks_from_lot(commit=False) return equipment