54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
||
|
|
"""Service Layer für Mitarbeiterverwaltung."""
|
||
|
|
|
||
|
|
from typing import Optional
|
||
|
|
|
||
|
|
from sqlalchemy.orm import Session
|
||
|
|
|
||
|
|
from ..core.models import Employee
|
||
|
|
from ..core.schemas import EmployeeCreate, EmployeeUpdate, EmployeeRead
|
||
|
|
from .repository import EmployeeRepository
|
||
|
|
|
||
|
|
|
||
|
|
class EmployeeService:
|
||
|
|
def __init__(self, db: Session):
|
||
|
|
self.db = db
|
||
|
|
self.repo = EmployeeRepository(db)
|
||
|
|
|
||
|
|
def create_employee(self, data: EmployeeCreate) -> Employee:
|
||
|
|
if data.email:
|
||
|
|
existing = self.repo.get_by_email(data.email)
|
||
|
|
if existing:
|
||
|
|
raise ValueError(f"E-Mail {data.email} ist bereits vergeben")
|
||
|
|
emp = self.repo.create(data)
|
||
|
|
self.db.commit()
|
||
|
|
return emp
|
||
|
|
|
||
|
|
def update_employee(self, employee_id: str, data: EmployeeUpdate) -> Optional[Employee]:
|
||
|
|
if data.email:
|
||
|
|
existing = self.repo.get_by_email(data.email)
|
||
|
|
if existing and existing.id != employee_id:
|
||
|
|
raise ValueError(f"E-Mail {data.email} ist bereits vergeben")
|
||
|
|
emp = self.repo.update(employee_id, data)
|
||
|
|
if emp:
|
||
|
|
self.db.commit()
|
||
|
|
return emp
|
||
|
|
|
||
|
|
def delete_employee(self, employee_id: str) -> bool:
|
||
|
|
ok = self.repo.delete(employee_id)
|
||
|
|
if ok:
|
||
|
|
self.db.commit()
|
||
|
|
return ok
|
||
|
|
|
||
|
|
def deactivate_employee(self, employee_id: str) -> Optional[Employee]:
|
||
|
|
return self.update_employee(employee_id, EmployeeUpdate(is_active=False))
|
||
|
|
|
||
|
|
def get_employee(self, employee_id: str) -> Optional[Employee]:
|
||
|
|
return self.repo.get_by_id(employee_id)
|
||
|
|
|
||
|
|
def list_employees(self, active_only: bool = True) -> list[Employee]:
|
||
|
|
return self.repo.list_all(active_only)
|
||
|
|
|
||
|
|
def list_by_department(self, department: str) -> list[Employee]:
|
||
|
|
return self.repo.list_by_department(department)
|