Index: src/main/java/finki/db/tasty_tabs/entity/Assignment.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Assignment.java	(revision c1e74d16763495bcb55a80448f8d31c98317baf2)
+++ src/main/java/finki/db/tasty_tabs/entity/Assignment.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
@@ -40,4 +40,11 @@
     private Shift shift;
 
+    public Assignment(LocalDateTime clockInTime, LocalDateTime clockOutTime, Employee employee, Shift shift) {
+        this.clockInTime = clockInTime;
+        this.clockOutTime = clockOutTime;
+        this.employee = employee;
+        this.shift = shift;
+    }
+
     public Assignment(LocalDateTime clockInTime, LocalDateTime clockOutTime, Manager manager, Employee employee, Shift shift) {
         this.clockInTime = clockInTime;
Index: src/main/java/finki/db/tasty_tabs/entity/exceptions/AssignmentNotFoundException.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/exceptions/AssignmentNotFoundException.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
+++ src/main/java/finki/db/tasty_tabs/entity/exceptions/AssignmentNotFoundException.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
@@ -0,0 +1,8 @@
+package finki.db.tasty_tabs.entity.exceptions;
+
+public class AssignmentNotFoundException extends DomainException {
+
+    public AssignmentNotFoundException(Long id) {
+        super(String.format("Assignment with id %d doesnt exist",id));
+    }
+}
Index: src/main/java/finki/db/tasty_tabs/entity/exceptions/EmployeeNotFoundException.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/exceptions/EmployeeNotFoundException.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
+++ src/main/java/finki/db/tasty_tabs/entity/exceptions/EmployeeNotFoundException.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
@@ -0,0 +1,8 @@
+package finki.db.tasty_tabs.entity.exceptions;
+
+public class EmployeeNotFoundException extends DomainException {
+
+    public EmployeeNotFoundException(Long id) {
+        super(String.format("Employee with id %d doesnt exist",id));
+    }
+}
Index: src/main/java/finki/db/tasty_tabs/service/AssignmentService.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/service/AssignmentService.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
+++ src/main/java/finki/db/tasty_tabs/service/AssignmentService.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
@@ -0,0 +1,18 @@
+package finki.db.tasty_tabs.service;
+
+import finki.db.tasty_tabs.entity.Assignment;
+import finki.db.tasty_tabs.web.dto.CreateAssignmentDto;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+public interface AssignmentService {
+    List<Assignment> getAllAssignments();
+    Assignment getAssignmentById(Long id);
+    Assignment createAssignment(CreateAssignmentDto dto, String managerEmail);
+    Assignment updateAssignment(Long id, CreateAssignmentDto dto, String managerEmail);
+    void deleteAssignment(Long id, String managerEmail);
+    // New method for employee to clock in/out
+    Assignment clockInShift(Long assignmentId, String employeeEmail, LocalDateTime clockInTime);
+    Assignment clockOutShift(Long assignmentId, String employeeEmail, LocalDateTime clockOutTime);
+}
Index: src/main/java/finki/db/tasty_tabs/service/impl/AssignmentServiceImpl.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/service/impl/AssignmentServiceImpl.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
+++ src/main/java/finki/db/tasty_tabs/service/impl/AssignmentServiceImpl.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
@@ -0,0 +1,130 @@
+package finki.db.tasty_tabs.service.impl;
+
+import finki.db.tasty_tabs.entity.Assignment;
+import finki.db.tasty_tabs.entity.Employee;
+import finki.db.tasty_tabs.entity.Manager;
+import finki.db.tasty_tabs.entity.Shift;
+import finki.db.tasty_tabs.entity.exceptions.AssignmentNotFoundException;
+import finki.db.tasty_tabs.entity.exceptions.EmployeeNotFoundException;
+import finki.db.tasty_tabs.entity.exceptions.ShiftNotFoundException;
+import finki.db.tasty_tabs.repository.AssignmentRepository;
+import finki.db.tasty_tabs.repository.EmployeeRepository;
+import finki.db.tasty_tabs.repository.ManagerRepository;
+import finki.db.tasty_tabs.repository.ShiftRepository;
+import finki.db.tasty_tabs.service.AssignmentService;
+import finki.db.tasty_tabs.web.dto.CreateAssignmentDto;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+public class AssignmentServiceImpl implements AssignmentService {
+
+    private final AssignmentRepository assignmentRepository;
+    private final ManagerRepository managerRepository;
+    private final EmployeeRepository employeeRepository;
+    private final ShiftRepository shiftRepository;
+
+    public AssignmentServiceImpl(AssignmentRepository assignmentRepository, ManagerRepository managerRepository, EmployeeRepository employeeRepository, ShiftRepository shiftRepository) {
+        this.assignmentRepository = assignmentRepository;
+        this.managerRepository = managerRepository;
+        this.employeeRepository = employeeRepository;
+        this.shiftRepository = shiftRepository;
+    }
+
+    private Manager getManagerByEmail(String email) {
+        return managerRepository.findByEmail(email)
+                .orElseThrow(() -> new AccessDeniedException("Only managers can assign assignments."));
+    }
+
+    @Override
+    public List<Assignment> getAllAssignments() {
+        return assignmentRepository.findAll();
+    }
+
+    @Override
+    public Assignment getAssignmentById(Long id) {
+        return assignmentRepository.findById(id)
+                .orElseThrow(() -> new AssignmentNotFoundException(id));
+    }
+
+    @Override
+    public Assignment createAssignment(CreateAssignmentDto dto, String managerEmail) {
+        Manager manager = getManagerByEmail(managerEmail);
+        Employee employee = employeeRepository.findById(dto.employeeId())
+                .orElseThrow(() -> new EmployeeNotFoundException(dto.employeeId()));
+        Shift shift = shiftRepository.findById(dto.shiftId())
+                .orElseThrow(() -> new ShiftNotFoundException(dto.shiftId()));
+
+        Assignment assignment = new Assignment(
+                dto.clockInTime(),
+                dto.clockOutTime(),
+                manager,
+                employee,
+                shift
+        );
+
+        return assignmentRepository.save(assignment);
+    }
+
+    @Override
+    public Assignment updateAssignment(Long id, CreateAssignmentDto dto, String managerEmail) {
+        Manager manager = getManagerByEmail(managerEmail);
+        Assignment assignment = getAssignmentById(id);
+
+        Employee employee = employeeRepository.findById(dto.employeeId())
+                .orElseThrow(() -> new EmployeeNotFoundException(dto.employeeId()));
+        Shift shift = shiftRepository.findById(dto.shiftId())
+                .orElseThrow(() -> new ShiftNotFoundException(dto.shiftId()));
+
+        assignment.setClockInTime(dto.clockInTime());
+        assignment.setClockOutTime(dto.clockOutTime());
+        assignment.setManager(manager);
+        assignment.setEmployee(employee);
+        assignment.setShift(shift);
+
+        return assignmentRepository.save(assignment);
+    }
+
+    @Override
+    public void deleteAssignment(Long id, String managerEmail) {
+        getManagerByEmail(managerEmail);
+        if (!assignmentRepository.existsById(id)) {
+            throw new AssignmentNotFoundException(id);
+        }
+        assignmentRepository.deleteById(id);
+    }
+    @Override
+    public Assignment clockInShift(Long assignmentId, String employeeEmail, LocalDateTime clockInTime) {
+        Assignment assignment = assignmentRepository.findById(assignmentId)
+                .orElseThrow(() -> new AssignmentNotFoundException( assignmentId));
+
+        // Check if the logged-in employee is assigned to this assignment
+        if (!assignment.getEmployee().getEmail().equals(employeeEmail)) {
+            throw new AccessDeniedException("You can only clock in your own shift.");
+        }
+
+        assignment.setClockInTime(clockInTime);
+        return assignmentRepository.save(assignment);
+    }
+
+    @Override
+    public Assignment clockOutShift(Long assignmentId, String employeeEmail, LocalDateTime clockOutTime) {
+        Assignment assignment = assignmentRepository.findById(assignmentId)
+                .orElseThrow(() -> new AssignmentNotFoundException(assignmentId));
+
+        if (!assignment.getEmployee().getEmail().equals(employeeEmail)) {
+            throw new AccessDeniedException("You can only clock out your own shift.");
+        }
+
+        if (assignment.getClockInTime() == null) {
+            throw new IllegalStateException("Cannot clock out without clocking in first.");
+        }
+
+        assignment.setClockOutTime(clockOutTime);
+        return assignmentRepository.save(assignment);
+    }
+
+}
Index: src/main/java/finki/db/tasty_tabs/web/controllers/AssignmentController.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/controllers/AssignmentController.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
+++ src/main/java/finki/db/tasty_tabs/web/controllers/AssignmentController.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
@@ -0,0 +1,87 @@
+package finki.db.tasty_tabs.web.controllers;
+
+import finki.db.tasty_tabs.entity.Assignment;
+import finki.db.tasty_tabs.service.AssignmentService;
+import finki.db.tasty_tabs.web.dto.AssignmentDto;
+import finki.db.tasty_tabs.web.dto.CreateAssignmentDto;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/assignments")
+@Tag(name = "Assignment API", description = "Endpoints for managing shift assignments (Manager only)")
+public class AssignmentController {
+
+    private final AssignmentService assignmentService;
+
+    public AssignmentController(AssignmentService assignmentService) {
+        this.assignmentService = assignmentService;
+    }
+
+    @Operation(summary = "Get all assignments")
+    @GetMapping
+    public List<Assignment> getAllAssignments() {
+        return assignmentService.getAllAssignments();
+    }
+
+    @Operation(summary = "Get assignment by ID")
+    @GetMapping("/{id}")
+    public Assignment getAssignmentById(@PathVariable Long id) {
+        return assignmentService.getAssignmentById(id);
+    }
+
+    @Operation(summary = "Create assignment (Manager only)")
+    @PostMapping
+    public Assignment createAssignment(@RequestBody CreateAssignmentDto dto, Authentication authentication) {
+        String managerEmail = authentication.getName();
+        return assignmentService.createAssignment(dto, managerEmail);
+    }
+
+    @Operation(summary = "Update assignment (Manager only)")
+    @PutMapping("/{id}")
+    public Assignment updateAssignment(@PathVariable Long id, @RequestBody CreateAssignmentDto dto, Authentication authentication) {
+        String managerEmail = authentication.getName();
+        return assignmentService.updateAssignment(id, dto, managerEmail);
+    }
+
+    @Operation(summary = "Delete assignment (Manager only)")
+    @DeleteMapping("/{id}")
+    public ResponseEntity<Void> deleteAssignment(@PathVariable Long id, Authentication authentication) {
+        String managerEmail = authentication.getName();
+        assignmentService.deleteAssignment(id, managerEmail);
+        return ResponseEntity.noContent().build();
+    }
+
+    @Operation(summary = "Employee clocks in their shift")
+    @PostMapping("/{id}/clockin")
+    public Assignment clockInShift(
+            @PathVariable Long id,
+            @RequestParam(required = false) LocalDateTime clockInTime,
+            Authentication authentication) {
+
+        String employeeEmail = authentication.getName();
+        LocalDateTime timeToSet = clockInTime != null ? clockInTime : LocalDateTime.now();
+        return assignmentService.clockInShift(id, employeeEmail, timeToSet);
+    }
+
+    @Operation(summary = "Employee clocks out their shift")
+    @PostMapping("/{id}/clockout")
+    public Assignment clockOutShift(
+            @PathVariable Long id,
+            @RequestParam(required = false) LocalDateTime clockOutTime,
+            Authentication authentication) {
+
+        String employeeEmail = authentication.getName();
+        LocalDateTime timeToSet = clockOutTime != null ? clockOutTime : LocalDateTime.now();
+        return assignmentService.clockOutShift(id, employeeEmail, timeToSet);
+    }
+
+}
+
Index: src/main/java/finki/db/tasty_tabs/web/dto/CreateAssignmentDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/CreateAssignmentDto.java	(revision c1e74d16763495bcb55a80448f8d31c98317baf2)
+++ src/main/java/finki/db/tasty_tabs/web/dto/CreateAssignmentDto.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
@@ -11,13 +11,11 @@
         LocalDateTime clockInTime,
         LocalDateTime clockOutTime,
-        Long managerId,
         Long employeeId,
         Long shiftId
 ) {
-    public Assignment toAssignment(Manager manager,Employee employee,Shift shift) {
+    public Assignment toAssignment(Employee employee,Shift shift) {
         return new Assignment(
                 clockInTime,
                 clockOutTime,
-                manager,
                 employee,
                 shift
Index: src/main/java/finki/db/tasty_tabs/web/exception/GlobalExceptionHandler.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/exception/GlobalExceptionHandler.java	(revision c1e74d16763495bcb55a80448f8d31c98317baf2)
+++ src/main/java/finki/db/tasty_tabs/web/exception/GlobalExceptionHandler.java	(revision b4df797235607c3eaa1d4cd7e54cb998d3ab8591)
@@ -31,4 +31,8 @@
             errorDetail.setProperty("description", "The username or password is incorrect");
 
+        }
+        if (exception instanceof IllegalStateException) {
+            errorDetail = ProblemDetail.forStatusAndDetail(HttpStatusCode.valueOf(400), exception.getMessage());
+            errorDetail.setProperty("description", "Invalid operation: " + exception.getMessage());
         }
 
