Index: backend/src/main/java/medora/Medora5Application.java
===================================================================
--- backend/src/main/java/medora/Medora5Application.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package medora;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class Medora5Application {
-
-    public static void main(String[] args) {
-        SpringApplication.run(Medora5Application.class, args);
-    }
-
-}
Index: backend/src/main/java/medora/MedoraApplication.java
===================================================================
--- backend/src/main/java/medora/MedoraApplication.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/MedoraApplication.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -0,0 +1,16 @@
+package medora;
+
+import medora.service.AuthService;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class MedoraApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(MedoraApplication.class, args);
+    }
+
+}
Index: backend/src/main/java/medora/config/AuthorizationInterceptor.java
===================================================================
--- backend/src/main/java/medora/config/AuthorizationInterceptor.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/config/AuthorizationInterceptor.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,9 +1,10 @@
 package medora.config;
+
+import medora.util.SecurityUtil;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
 
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
-import medora.util.SecurityUtil;
-import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.HandlerInterceptor;
 
 /**
@@ -18,8 +19,4 @@
  */
 @Component
-
-
-
-
 public class AuthorizationInterceptor implements HandlerInterceptor {
 
Index: backend/src/main/java/medora/config/SecurityConfig.java
===================================================================
--- backend/src/main/java/medora/config/SecurityConfig.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/config/SecurityConfig.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -14,8 +14,8 @@
     public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
         http
-                .csrf(csrf -> csrf.disable())
-                .authorizeHttpRequests(auth -> auth
-                        .anyRequest().permitAll()
-                );
+            .csrf(csrf -> csrf.disable())
+            .authorizeHttpRequests(auth -> auth
+                .anyRequest().permitAll()
+            );
 
         return http.build();
Index: backend/src/main/java/medora/config/WebConfig.java
===================================================================
--- backend/src/main/java/medora/config/WebConfig.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/config/WebConfig.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -32,6 +32,6 @@
         Path uploadPath = Path.of("uploads").toAbsolutePath().normalize();
         registry
-                .addResourceHandler("/uploads/**")
-                .addResourceLocations(uploadPath.toUri().toString() + "/");
+            .addResourceHandler("/uploads/**")
+            .addResourceLocations(uploadPath.toUri().toString() + "/");
     }
 
Index: backend/src/main/java/medora/controller/AuthController.java
===================================================================
--- backend/src/main/java/medora/controller/AuthController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/AuthController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -3,4 +3,5 @@
 import medora.dto.LoginRequest;
 import medora.service.AuthService;
+import medora.util.SecurityUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -8,6 +9,8 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
+import jakarta.servlet.http.HttpServletRequest;
 
 import java.util.Map;
+import java.util.HashMap;
 
 @RestController
@@ -19,7 +22,9 @@
 
     private final AuthService authService;
+    private final SecurityUtil securityUtil;
 
-    public AuthController(AuthService authService) {
+    public AuthController(AuthService authService, SecurityUtil securityUtil) {
         this.authService = authService;
+        this.securityUtil = securityUtil;
     }
 
@@ -69,3 +74,36 @@
         return ResponseEntity.ok(Map.of("status", "healthy"));
     }
+
+    /**
+     * Debug endpoint to test token validation
+     */
+    @GetMapping("/debug/token")
+    public ResponseEntity<?> debugToken(HttpServletRequest httpRequest) {
+        String role = securityUtil.getRoleFromRequest(httpRequest);
+        String username = securityUtil.getUsernameFromRequest(httpRequest);
+        Long userId = securityUtil.getUserIdFromRequest(httpRequest);
+
+        Map<String, Object> debug = new HashMap<>();
+        debug.put("role", role);
+        debug.put("username", username);
+        debug.put("userId", userId);
+        debug.put("isValid", role != null);
+
+        if (role == null) {
+            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(debug);
+        }
+        return ResponseEntity.ok(debug);
+    }
+
+    /**
+     * Test endpoint - no auth required, returns test token
+     */
+    @GetMapping("/test/generate-token")
+    public ResponseEntity<?> generateTestToken() {
+        String testToken = authService.generateTestToken();
+        Map<String, Object> response = new HashMap<>();
+        response.put("token", testToken);
+        response.put("message", "Copy this token and try it");
+        return ResponseEntity.ok(response);
+    }
 }
Index: backend/src/main/java/medora/controller/BillingController.java
===================================================================
--- backend/src/main/java/medora/controller/BillingController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/BillingController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -244,6 +244,6 @@
     @PatchMapping("/{billId}/payment-status")
     public ResponseEntity<?> updatePaymentStatus(@PathVariable Long billId,
-                                                 @RequestBody UpdateBillingRequest request,
-                                                 HttpServletRequest httpRequest) {
+                                                @RequestBody UpdateBillingRequest request,
+                                                HttpServletRequest httpRequest) {
         try {
             String role = securityUtil.getRoleFromRequest(httpRequest);
@@ -344,5 +344,5 @@
         if (billing.getMedicalRecord() != null && billing.getMedicalRecord().getPatient() != null) {
             patientName = billing.getMedicalRecord().getPatient().getFirstName() + " " +
-                    billing.getMedicalRecord().getPatient().getLastName();
+                         billing.getMedicalRecord().getPatient().getLastName();
         }
         return new BillingDTO(
Index: backend/src/main/java/medora/controller/DepartmentController.java
===================================================================
--- backend/src/main/java/medora/controller/DepartmentController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/DepartmentController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -162,6 +162,6 @@
     @PutMapping("/{departmentId}")
     public ResponseEntity<?> updateDepartment(@PathVariable Long departmentId,
-                                              @RequestBody Map<String, String> request,
-                                              HttpServletRequest httpRequest) {
+                                             @RequestBody Map<String, String> request,
+                                             HttpServletRequest httpRequest) {
         try {
             String role = securityUtil.getRoleFromRequest(httpRequest);
Index: backend/src/main/java/medora/controller/DiagnosisController.java
===================================================================
--- backend/src/main/java/medora/controller/DiagnosisController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/DiagnosisController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,6 +1,6 @@
 package medora.controller;
 
+import medora.dto.DiagnosisDTO;
 import medora.dto.CreateDiagnosisRequest;
-import medora.dto.DiagnosisDTO;
 import medora.models.domain.Diagnosis;
 import medora.service.DiagnosisService;
Index: backend/src/main/java/medora/controller/DiagnosticController.java
===================================================================
--- backend/src/main/java/medora/controller/DiagnosticController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/controller/DiagnosticController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -0,0 +1,136 @@
+package medora.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/diagnostic")
+public class DiagnosticController {
+
+    @Autowired
+    private DataSource dataSource;
+
+    @GetMapping("/referrals-count")
+    public ResponseEntity<?> getReferralsCount() {
+        try (Connection conn = dataSource.getConnection();
+             Statement stmt = conn.createStatement();
+             ResultSet rs = stmt.executeQuery("SELECT COUNT(*) as count FROM referrals")) {
+
+            if (rs.next()) {
+                Map<String, Object> result = new HashMap<>();
+                result.put("total_referrals", rs.getInt("count"));
+                return ResponseEntity.ok(result);
+            }
+        } catch (Exception e) {
+            return ResponseEntity.internalServerError()
+                    .body(Map.of("error", e.getMessage()));
+        }
+        return ResponseEntity.ok(Map.of("total_referrals", 0));
+    }
+
+    @GetMapping("/referrals-recent")
+    public ResponseEntity<?> getRecentReferrals() {
+        List<Map<String, Object>> results = new ArrayList<>();
+        try (Connection conn = dataSource.getConnection();
+             Statement stmt = conn.createStatement();
+             ResultSet rs = stmt.executeQuery(
+                     "SELECT referral_id, reason, referral_date, appointment_date, appointment_time " +
+                     "FROM referrals " +
+                     "ORDER BY referral_id DESC " +
+                     "LIMIT 20")) {
+
+            while (rs.next()) {
+                Map<String, Object> row = new HashMap<>();
+                row.put("referral_id", rs.getLong("referral_id"));
+                row.put("reason", rs.getString("reason"));
+                row.put("referral_date", rs.getDate("referral_date"));
+                row.put("appointment_date", rs.getDate("appointment_date"));
+                row.put("appointment_time", rs.getTime("appointment_time"));
+                results.add(row);
+            }
+        } catch (Exception e) {
+            return ResponseEntity.internalServerError()
+                    .body(Map.of("error", e.getMessage()));
+        }
+        return ResponseEntity.ok(results);
+    }
+
+    @GetMapping("/referrals-128-129-130")
+    public ResponseEntity<?> checkSpecificReferrals() {
+        List<Map<String, Object>> results = new ArrayList<>();
+        try (Connection conn = dataSource.getConnection();
+             Statement stmt = conn.createStatement();
+             ResultSet rs = stmt.executeQuery(
+                     "SELECT referral_id, reason, referral_date, appointment_date, appointment_time " +
+                     "FROM referrals " +
+                     "WHERE referral_id IN (128, 129, 130) " +
+                     "ORDER BY referral_id")) {
+
+            while (rs.next()) {
+                Map<String, Object> row = new HashMap<>();
+                row.put("referral_id", rs.getLong("referral_id"));
+                row.put("reason", rs.getString("reason"));
+                row.put("referral_date", rs.getDate("referral_date"));
+                row.put("appointment_date", rs.getDate("appointment_date"));
+                row.put("appointment_time", rs.getTime("appointment_time"));
+                results.add(row);
+            }
+        } catch (Exception e) {
+            return ResponseEntity.internalServerError()
+                    .body(Map.of("error", e.getMessage()));
+        }
+        return ResponseEntity.ok(results);
+    }
+
+    @GetMapping("/database-info")
+    public ResponseEntity<?> getDatabaseInfo() {
+        Map<String, Object> info = new HashMap<>();
+        try (Connection conn = dataSource.getConnection()) {
+            info.put("database", conn.getCatalog());
+            info.put("url", conn.getMetaData().getURL());
+            info.put("username", conn.getMetaData().getUserName());
+            info.put("driver", conn.getMetaData().getDriverName());
+            info.put("schema", conn.getSchema());
+        } catch (Exception e) {
+            info.put("error", e.getMessage());
+        }
+        return ResponseEntity.ok(info);
+    }
+
+    @GetMapping("/table-columns")
+    public ResponseEntity<?> getTableColumns() {
+        List<Map<String, Object>> columns = new ArrayList<>();
+        try (Connection conn = dataSource.getConnection();
+             Statement stmt = conn.createStatement();
+             ResultSet rs = stmt.executeQuery(
+                     "SELECT column_name, data_type, is_nullable " +
+                     "FROM information_schema.columns " +
+                     "WHERE table_name = 'referrals' " +
+                     "ORDER BY ordinal_position")) {
+
+            while (rs.next()) {
+                Map<String, Object> col = new HashMap<>();
+                col.put("column_name", rs.getString("column_name"));
+                col.put("data_type", rs.getString("data_type"));
+                col.put("is_nullable", rs.getString("is_nullable"));
+                columns.add(col);
+            }
+        } catch (Exception e) {
+            return ResponseEntity.internalServerError()
+                    .body(Map.of("error", e.getMessage()));
+        }
+        return ResponseEntity.ok(columns);
+    }
+}
Index: backend/src/main/java/medora/controller/DoctorController.java
===================================================================
--- backend/src/main/java/medora/controller/DoctorController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/DoctorController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -212,6 +212,6 @@
     @PutMapping("/{doctorId}")
     public ResponseEntity<?> updateDoctor(@PathVariable Long doctorId,
-                                          @RequestBody CreateDoctorRequest request,
-                                          HttpServletRequest httpRequest) {
+                                         @RequestBody CreateDoctorRequest request,
+                                         HttpServletRequest httpRequest) {
         try {
             String role = securityUtil.getRoleFromRequest(httpRequest);
Index: backend/src/main/java/medora/controller/LabController.java
===================================================================
--- backend/src/main/java/medora/controller/LabController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/LabController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -125,5 +125,5 @@
     @PutMapping("/{testId}")
     public ResponseEntity<?> updateLabTest(@PathVariable Long testId,
-                                           @RequestBody CreateLabTestRequest request) {
+                                          @RequestBody CreateLabTestRequest request) {
         try {
             logger.info("Updating lab test with ID: {}", testId);
Index: backend/src/main/java/medora/controller/MedicalRecordController.java
===================================================================
--- backend/src/main/java/medora/controller/MedicalRecordController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/MedicalRecordController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,7 +1,7 @@
 package medora.controller;
 
-import medora.dto.AllergyDTO;
 import medora.dto.ComprehensiveMedicalRecordDTO;
 import medora.dto.MedicalRecordDTO;
+import medora.dto.AllergyDTO;
 import medora.dto.SymptomDTO;
 import medora.models.domain.*;
Index: backend/src/main/java/medora/controller/MedicalReportController.java
===================================================================
--- backend/src/main/java/medora/controller/MedicalReportController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/MedicalReportController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -13,4 +13,5 @@
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
Index: backend/src/main/java/medora/controller/PatientController.java
===================================================================
--- backend/src/main/java/medora/controller/PatientController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/PatientController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -207,6 +207,6 @@
     @PutMapping("/{patientId}")
     public ResponseEntity<?> updatePatient(@PathVariable Long patientId,
-                                           @RequestBody CreatePatientRequest request,
-                                           HttpServletRequest httpRequest) {
+                                          @RequestBody CreatePatientRequest request,
+                                          HttpServletRequest httpRequest) {
         try {
             String role = securityUtil.getRoleFromRequest(httpRequest);
Index: backend/src/main/java/medora/controller/PrescriptionController.java
===================================================================
--- backend/src/main/java/medora/controller/PrescriptionController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/PrescriptionController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,6 +1,6 @@
 package medora.controller;
 
+import medora.dto.PrescriptionDTO;
 import medora.dto.CreatePrescriptionRequest;
-import medora.dto.PrescriptionDTO;
 import medora.models.domain.PrescriptionMedicalRecord;
 import medora.service.PrescriptionService;
Index: backend/src/main/java/medora/controller/ProcedureController.java
===================================================================
--- backend/src/main/java/medora/controller/ProcedureController.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/controller/ProcedureController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -334,11 +334,10 @@
     private Map<String, Object> convertResultToDTO(ProcedureResults result) {
         return Map.of(
-                "resultId", result.getResultId(),
-                "procedureId", result.getProcedure().getProcedureId(),
-                "procedureType", result.getProcedure().getProcedureType(),
-                "resultDescription", result.getResultDescription() != null ? result.getResultDescription() : "",
-                "resultDate", result.getResultDate()
+            "resultId", result.getResultId(),
+            "procedureId", result.getProcedure().getProcedureId(),
+            "procedureType", result.getProcedure().getProcedureType(),
+            "resultDescription", result.getResultDescription() != null ? result.getResultDescription() : "",
+            "resultDate", result.getResultDate()
         );
     }
 }
-
Index: backend/src/main/java/medora/dto/BillingDetailDTO.java
===================================================================
--- backend/src/main/java/medora/dto/BillingDetailDTO.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/dto/BillingDetailDTO.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -21,6 +21,6 @@
 
     public BillingDetailDTO(Long billId, Long patientId, String patientName, String patientEmbg, String patientPhone,
-                            BigDecimal totalCost, String paymentStatus, LocalDate paymentDate,
-                            LocalDate billDate, List<BillingItemDTO> procedures, List<BillingItemDTO> labTests) {
+                           BigDecimal totalCost, String paymentStatus, LocalDate paymentDate,
+                           LocalDate billDate, List<BillingItemDTO> procedures, List<BillingItemDTO> labTests) {
         this.billId = billId;
         this.patientId = patientId;
Index: backend/src/main/java/medora/dto/CreateDoctorRequest.java
===================================================================
--- backend/src/main/java/medora/dto/CreateDoctorRequest.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/dto/CreateDoctorRequest.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -10,5 +10,6 @@
 @NoArgsConstructor
 @AllArgsConstructor
-public class CreateDoctorRequest {
+public class
+CreateDoctorRequest {
     private String firstName;
     private String lastName;
Index: backend/src/main/java/medora/dto/LabResultDTO.java
===================================================================
--- backend/src/main/java/medora/dto/LabResultDTO.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/dto/LabResultDTO.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -5,5 +5,4 @@
 import lombok.NoArgsConstructor;
 import lombok.Setter;
-
 import java.time.LocalDate;
 
Index: backend/src/main/java/medora/dto/MedicalRecordDTO.java
===================================================================
--- backend/src/main/java/medora/dto/MedicalRecordDTO.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/dto/MedicalRecordDTO.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -5,4 +5,6 @@
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+
+import java.time.LocalDate;
 
 @Getter
Index: backend/src/main/java/medora/dto/PrescriptionDTO.java
===================================================================
--- backend/src/main/java/medora/dto/PrescriptionDTO.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/dto/PrescriptionDTO.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -5,4 +5,6 @@
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+
+import java.time.LocalDate;
 
 @Getter
Index: backend/src/main/java/medora/dto/ProcedureRequestDTO.java
===================================================================
--- backend/src/main/java/medora/dto/ProcedureRequestDTO.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/dto/ProcedureRequestDTO.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -5,5 +5,4 @@
 import lombok.NoArgsConstructor;
 import lombok.Setter;
-
 import java.time.LocalDate;
 
Index: backend/src/main/java/medora/dto/ProcedureResultDTO.java
===================================================================
--- backend/src/main/java/medora/dto/ProcedureResultDTO.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/dto/ProcedureResultDTO.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -5,5 +5,4 @@
 import lombok.NoArgsConstructor;
 import lombok.Setter;
-
 import java.time.LocalDate;
 
Index: backend/src/main/java/medora/dto/RequestLabTestRequest.java
===================================================================
--- backend/src/main/java/medora/dto/RequestLabTestRequest.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/dto/RequestLabTestRequest.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -5,5 +5,4 @@
 import lombok.NoArgsConstructor;
 import lombok.Setter;
-
 import java.time.LocalDate;
 
Index: backend/src/main/java/medora/dto/SubmitLabResultRequest.java
===================================================================
--- backend/src/main/java/medora/dto/SubmitLabResultRequest.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/dto/SubmitLabResultRequest.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -5,5 +5,4 @@
 import lombok.NoArgsConstructor;
 import lombok.Setter;
-
 import java.time.LocalDate;
 
Index: backend/src/main/java/medora/models/domain/Admin.java
===================================================================
--- backend/src/main/java/medora/models/domain/Admin.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/Admin.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,10 +1,5 @@
 package medora.models.domain;
 
-
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.Id;
-import jakarta.persistence.Table;
-import jakarta.validation.constraints.Pattern;
+import jakarta.persistence.*;
 import lombok.Getter;
 import lombok.Setter;
@@ -20,25 +15,22 @@
     private Long adminId;
 
-    @Column(name = "username", nullable = false, unique = true)
-    private String username;
+    @OneToOne(optional = false)
+    @JoinColumn(name = "user_id", nullable = false, unique = true)
+    private User user;
 
-    @Column(name = "name", nullable = false)
-    private String name;
-
-    @Column(name = "lastname", nullable = false)
-    private String lastname;
-
-    @Pattern(regexp = ".*@adminmedora.*")
-    @Column(name = "email", nullable = false, unique = true)
-    private String email;
+    @Column(name = "permissions")
+    private String permissions;
 
     public Admin() {}
 
-    public Admin(Long adminId, String username, String name, String lastname, String email) {
+    public Admin(Long adminId, User user, String permissions) {
         this.adminId = adminId;
-        this.username = username;
-        this.name = name;
-        this.lastname = lastname;
-        this.email = email;
+        this.user = user;
+        this.permissions = permissions;
+    }
+
+    public Admin(Long adminId, User user) {
+        this.adminId = adminId;
+        this.user = user;
     }
 }
Index: backend/src/main/java/medora/models/domain/Billing.java
===================================================================
--- backend/src/main/java/medora/models/domain/Billing.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/Billing.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -4,4 +4,5 @@
 import jakarta.persistence.*;
 import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Getter;
 import lombok.Setter;
@@ -38,6 +39,6 @@
     private MedicalRecord medicalRecord;
 
-    @ManyToOne(optional = false)
-    @JoinColumn(name = "admin_id", nullable = false)
+    @ManyToOne(optional = true)
+    @JoinColumn(name = "admin_id", nullable = true)
     private Admin admin;
 
Index: backend/src/main/java/medora/models/domain/Departments.java
===================================================================
--- backend/src/main/java/medora/models/domain/Departments.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/Departments.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,8 +1,4 @@
 package medora.models.domain;
-
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.Id;
-import jakarta.persistence.Table;
+import jakarta.persistence.*;
 import lombok.Getter;
 import lombok.Setter;
Index: backend/src/main/java/medora/models/domain/DoctorLevel.java
===================================================================
--- backend/src/main/java/medora/models/domain/DoctorLevel.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/DoctorLevel.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,8 +1,4 @@
 package medora.models.domain;
-
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.Id;
-import jakarta.persistence.Table;
+import jakarta.persistence.*;
 import lombok.Getter;
 import lombok.Setter;
Index: backend/src/main/java/medora/models/domain/DoctorSpecialization.java
===================================================================
--- backend/src/main/java/medora/models/domain/DoctorSpecialization.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/DoctorSpecialization.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,8 +1,4 @@
 package medora.models.domain;
-
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.Id;
-import jakarta.persistence.Table;
+import jakarta.persistence.*;
 import lombok.Getter;
 import lombok.Setter;
Index: backend/src/main/java/medora/models/domain/LabTechnician.java
===================================================================
--- backend/src/main/java/medora/models/domain/LabTechnician.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/LabTechnician.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,10 +1,5 @@
 package medora.models.domain;
 
-
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.Id;
-import jakarta.persistence.Table;
-import jakarta.validation.constraints.Pattern;
+import jakarta.persistence.*;
 import lombok.Getter;
 import lombok.Setter;
@@ -20,25 +15,22 @@
     private Long technicianId;
 
-    @Column(name = "username", nullable = false, unique = true)
-    private String username;
+    @OneToOne(optional = false)
+    @JoinColumn(name = "user_id", nullable = false, unique = true)
+    private User user;
 
-    @Column(name = "name", nullable = false)
-    private String name;
-
-    @Column(name = "lastname", nullable = false)
-    private String lastname;
-
-    @Pattern(regexp = ".*@labmedora.*")
-    @Column(name = "email", nullable = false, unique = true)
-    private String email;
+    @Column(name = "certification")
+    private String certification;
 
     public LabTechnician() {}
 
-    public LabTechnician(Long technicianId, String username, String name, String lastname, String email) {
+    public LabTechnician(Long technicianId, User user, String certification) {
         this.technicianId = technicianId;
-        this.username = username;
-        this.name = name;
-        this.lastname = lastname;
-        this.email = email;
+        this.user = user;
+        this.certification = certification;
+    }
+
+    public LabTechnician(Long technicianId, User user) {
+        this.technicianId = technicianId;
+        this.user = user;
     }
 }
Index: backend/src/main/java/medora/models/domain/MedicalRecordSymptoms.java
===================================================================
--- backend/src/main/java/medora/models/domain/MedicalRecordSymptoms.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/MedicalRecordSymptoms.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -20,4 +20,5 @@
     @Id
     @ManyToOne(optional = false, fetch = FetchType.LAZY)
+    @JoinColumn(name = "symptom_id")
     private Symptoms symptom;
 
Index: backend/src/main/java/medora/models/domain/MedicalReport.java
===================================================================
--- backend/src/main/java/medora/models/domain/MedicalReport.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/MedicalReport.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -7,4 +7,6 @@
 
 import java.time.LocalDate;
+import java.util.List;
+import java.util.ArrayList;
 
 @Getter
Index: backend/src/main/java/medora/models/domain/Patient.java
===================================================================
--- backend/src/main/java/medora/models/domain/Patient.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/Patient.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -2,5 +2,4 @@
 
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import jakarta.persistence.*;
 import lombok.Getter;
@@ -8,4 +7,5 @@
 import medora.models.enums.BloodType;
 import medora.models.enums.Gender;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import java.time.LocalDate;
Index: backend/src/main/java/medora/models/domain/PerformedLabTests.java
===================================================================
--- backend/src/main/java/medora/models/domain/PerformedLabTests.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/PerformedLabTests.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -48,10 +48,10 @@
 
     public PerformedLabTests(Long performedTestId,
-                             LabTests labTest,
-                             Patient patient,
-                             Doctors doctor,
-                             LabTechnician technician,
-                             LocalDate testDate,
-                             String notes) {
+                            LabTests labTest,
+                            Patient patient,
+                            Doctors doctor,
+                            LabTechnician technician,
+                            LocalDate testDate,
+                            String notes) {
         this.performedTestId = performedTestId;
         this.labTest = labTest;
Index: backend/src/main/java/medora/models/domain/ProcedureResults.java
===================================================================
--- backend/src/main/java/medora/models/domain/ProcedureResults.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/ProcedureResults.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -3,4 +3,5 @@
 
 import jakarta.persistence.*;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Getter;
 import lombok.Setter;
Index: backend/src/main/java/medora/models/domain/Referrals.java
===================================================================
--- backend/src/main/java/medora/models/domain/Referrals.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/Referrals.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -50,11 +50,11 @@
 
     public Referrals(Long referralId,
-                     String reason,
-                     LocalDate referralDate,
-                     LocalDate appointmentDate,
-                     LocalTime appointmentTime,
-                     MedicalRecord medicalRecord,
-                     Doctors fromDoctor,
-                     Doctors toDoctor) {
+                    String reason,
+                    LocalDate referralDate,
+                    LocalDate appointmentDate,
+                    LocalTime appointmentTime,
+                    MedicalRecord medicalRecord,
+                    Doctors fromDoctor,
+                    Doctors toDoctor) {
 
         this.referralId = referralId;
Index: backend/src/main/java/medora/models/domain/Symptoms.java
===================================================================
--- backend/src/main/java/medora/models/domain/Symptoms.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/Symptoms.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -2,8 +2,5 @@
 
 
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.Id;
-import jakarta.persistence.Table;
+import jakarta.persistence.*;
 import jakarta.validation.constraints.NotBlank;
 import lombok.Getter;
Index: backend/src/main/java/medora/models/domain/User.java
===================================================================
--- backend/src/main/java/medora/models/domain/User.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/models/domain/User.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -34,11 +34,11 @@
     private Boolean isActive = true;
 
-    // Foreign key to patient  for PATIENT role
-    @OneToOne(fetch = jakarta.persistence.FetchType.LAZY)
+    // Foreign key to patient (only for PATIENT role)
+    @OneToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "patient_id")
     private Patient patient;
 
-    // Foreign key to doctor for DOCTOR role
-    @OneToOne(fetch = jakarta.persistence.FetchType.LAZY)
+    // Foreign key to doctor (only for DOCTOR role)
+    @OneToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "doctor_id")
     private Doctors doctor;
Index: backend/src/main/java/medora/repository/BillingRepository.java
===================================================================
--- backend/src/main/java/medora/repository/BillingRepository.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/repository/BillingRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -116,5 +116,5 @@
         WHERE bp.bill_id = :billId
     """, nativeQuery = true)
-    java.util.List<Object[]> findProceduresForBilling(@Param("billId") Long billId);
+    List<Object[]> findProceduresForBilling(@Param("billId") Long billId);
 
     // UC020 – Get lab tests for a billing record
@@ -125,5 +125,5 @@
         WHERE blt.bill_id = :billId
     """, nativeQuery = true)
-    java.util.List<Object[]> findLabTestsForBilling(@Param("billId") Long billId);
+    List<Object[]> findLabTestsForBilling(@Param("billId") Long billId);
 
     // Cleanup: Delete test records
Index: backend/src/main/java/medora/repository/ProcedureResultRepository.java
===================================================================
--- backend/src/main/java/medora/repository/ProcedureResultRepository.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/repository/ProcedureResultRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -30,3 +30,13 @@
     """)
     List<ProcedureResults> findLatestResultsByProcedure(@Param("procedureId") Long procedureId);
+
+    @Query("""
+        SELECT pr FROM ProcedureResults pr
+        WHERE pr IN (
+            SELECT mrpr.procedureResult FROM MedicalRecordProcedureResults mrpr
+            WHERE mrpr.medicalRecord.recordId = :recordId
+        )
+        AND pr.procedure.procedureId = :procedureId
+    """)
+    List<ProcedureResults> findByMedicalRecordAndProcedure(@Param("recordId") Long recordId, @Param("procedureId") Long procedureId);
 }
Index: backend/src/main/java/medora/service/AppointmentService.java
===================================================================
--- backend/src/main/java/medora/service/AppointmentService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/AppointmentService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -181,5 +181,7 @@
     }
 
-
+    /**
+     * Mark appointment as completed
+     */
     @Transactional
     public Appointment completeAppointment(Long appointmentId) {
@@ -208,4 +210,7 @@
     }
 
+    /**
+     * Get appointment by ID
+     */
     @Transactional(readOnly = true)
     public Optional<Appointment> getAppointmentById(Long appointmentId) {
@@ -220,5 +225,7 @@
     }
 
-
+    /**
+     * Get appointments for patient
+     */
     @Transactional(readOnly = true)
     public List<Appointment> getAppointmentsForPatient(Long patientId) {
@@ -242,5 +249,7 @@
     }
 
-
+    /**
+     * Get appointments for doctor
+     */
     @Transactional(readOnly = true)
     public List<Appointment> getAppointmentsForDoctor(Long doctorId) {
@@ -264,5 +273,7 @@
     }
 
-
+    /**
+     * Get doctor's schedule for a specific date
+     */
     @Transactional(readOnly = true)
     public List<Appointment> getDoctorSchedule(Long doctorId,
@@ -290,5 +301,7 @@
     }
 
-
+    /**
+     * Get all appointments
+     */
     @Transactional(readOnly = true)
     public List<Appointment> getAllAppointments() {
@@ -299,5 +312,8 @@
     }
 
-
+    /**
+     * Find next available appointment slot for a doctor on a given date
+     * Returns a LocalTime for the next available slot, or null if no slots available
+     */
     public LocalTime findNextAvailableSlot(Long doctorId, LocalDate appointmentDate) {
         LocalTime[] timeSlots = {
Index: backend/src/main/java/medora/service/AuthService.java
===================================================================
--- backend/src/main/java/medora/service/AuthService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/AuthService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -6,8 +6,10 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -20,8 +22,10 @@
     private final UserRepository userRepository;
     private final JwtUtil jwtUtil;
+    private final PasswordEncoder passwordEncoder;
 
-    public AuthService(UserRepository userRepository, JwtUtil jwtUtil) {
+    public AuthService(UserRepository userRepository, JwtUtil jwtUtil, PasswordEncoder passwordEncoder) {
         this.userRepository = userRepository;
         this.jwtUtil = jwtUtil;
+        this.passwordEncoder = passwordEncoder;
     }
 
@@ -48,6 +52,6 @@
         }
 
-        // Simple password check (in production, use BCrypt)
-        if (!user.getPassword().equals(password)) {
+        // Verify password using BCrypt
+        if (!passwordEncoder.matches(password, user.getPassword())) {
             logger.warn("Failed login attempt for user: {}", username);
             throw new RuntimeException("Invalid username or password");
@@ -72,4 +76,8 @@
     }
 
+    public String generateTestToken() {
+        return jwtUtil.generateTokenWithDoctorId("admin", "ADMIN", 1L, null, null);
+    }
+
     @Transactional
     public void createUser(String username, String password, String role, String firstName, String lastName) {
@@ -78,7 +86,39 @@
         }
 
-        User user = new User(username, password, role, firstName, lastName);
+        // Hash password before storing
+        String hashedPassword = passwordEncoder.encode(password);
+        User user = new User(username, hashedPassword, role, firstName, lastName);
         userRepository.save(user);
         logger.info("User created: {} with role: {}", username, role);
     }
+
+    /**
+     * One-time migration: re-hashes any user whose stored password is still
+     * plaintext (i.e. not already a BCrypt hash) into a proper BCrypt hash.
+     * Safe to call more than once — already-hashed users are skipped.
+     *
+     * Intended to be run once via a temporary CommandLineRunner bean, then
+     * the bean should be removed so this doesn't run on every startup.
+     */
+    @Transactional
+    public int migratePlaintextPasswords() {
+        List<User> allUsers = userRepository.findAll();
+        int migratedCount = 0;
+
+        for (User user : allUsers) {
+            String currentPassword = user.getPassword();
+
+            // BCrypt hashes always start with $2a$, $2b$, or $2y$ — anything
+            // else is assumed to still be plaintext and needs migrating
+            if (currentPassword != null && !currentPassword.startsWith("$2")) {
+                user.setPassword(passwordEncoder.encode(currentPassword));
+                userRepository.save(user);
+                migratedCount++;
+                logger.info("Migrated password for user: {}", user.getUsername());
+            }
+        }
+
+        logger.info("Password migration complete: {} of {} users migrated", migratedCount, allUsers.size());
+        return migratedCount;
+    }
 }
Index: backend/src/main/java/medora/service/BillingService.java
===================================================================
--- backend/src/main/java/medora/service/BillingService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/BillingService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -221,5 +221,5 @@
         }
 
-        logger.info("Total billing cost for bill ID {}: procedures={}, lab tests={}",
+        logger.info("Total billing cost for bill ID {}: procedures={}, lab tests={}", 
                 billId, procedureCost, labTestCost);
         return procedureCost.add(labTestCost);
@@ -244,5 +244,5 @@
         // This is a placeholder - adjust based on your actual Procedure entity
         logger.info("Adding procedure {} to billing record {}", procedureId, billId);
-
+        
         return null; // Will be implemented with ProcedureRepository injection
     }
@@ -464,8 +464,8 @@
             billingRepository.deleteAll();
 
-            logger.info(" Deleted {} billing records successfully", billingCount);
+            logger.info("✅ Deleted {} billing records successfully", billingCount);
             return billingCount;
         } catch (Exception e) {
-            logger.error(" Error deleting billing records: {}", e.getMessage());
+            logger.error("❌ Error deleting billing records: {}", e.getMessage());
             e.printStackTrace();
             throw e;
Index: backend/src/main/java/medora/service/DepartmentService.java
===================================================================
--- backend/src/main/java/medora/service/DepartmentService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/DepartmentService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -32,5 +32,8 @@
     }
 
-
+    /**
+     * UC023 – View Departments
+     * Get all departments
+     */
     @Transactional(readOnly = true)
     public List<Departments> getAllDepartments() {
@@ -39,5 +42,7 @@
     }
 
-
+    /**
+     * Get department by ID
+     */
     @Transactional(readOnly = true)
     public Optional<Departments> getDepartmentById(Long departmentId) {
@@ -49,5 +54,7 @@
     }
 
-
+    /**
+     * Get department by name
+     */
     @Transactional(readOnly = true)
     public Optional<Departments> getDepartmentByName(String departmentName) {
@@ -59,5 +66,8 @@
     }
 
-
+    /**
+     * UC024 – View Doctors by Department
+     * Get all doctors in a specific department
+     */
     @Transactional(readOnly = true)
     public List<Doctors> getDoctorsByDepartment(Long departmentId) {
@@ -75,5 +85,7 @@
     }
 
-
+    /**
+     * Create a new department
+     */
     @Transactional
     public Departments createDepartment(Departments department) {
@@ -87,5 +99,7 @@
     }
 
-
+    /**
+     * Update department
+     */
     @Transactional
     public Departments updateDepartment(Long departmentId, Departments departmentDetails) {
Index: backend/src/main/java/medora/service/DiagnosisService.java
===================================================================
--- backend/src/main/java/medora/service/DiagnosisService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/DiagnosisService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -2,9 +2,9 @@
 
 import medora.models.domain.Diagnosis;
+import medora.models.domain.Patient;
 import medora.models.domain.Doctors;
-import medora.models.domain.Patient;
 import medora.repository.DiagnosisRepository;
+import medora.repository.PatientRepository;
 import medora.repository.DoctorRepository;
-import medora.repository.PatientRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -69,4 +69,7 @@
     }
 
+    /**
+     * Get diagnosis by ID
+     */
     @Transactional(readOnly = true)
     public Optional<Diagnosis> getDiagnosisById(Long diagnosisId) {
@@ -78,5 +81,7 @@
     }
 
-
+    /**
+     * Get diagnoses for patient
+     */
     @Transactional(readOnly = true)
     public List<Diagnosis> getDiagnosesForPatient(Long patientId) {
@@ -91,5 +96,7 @@
     }
 
-
+    /**
+     * Get diagnoses by doctor
+     */
     @Transactional(readOnly = true)
     public List<Diagnosis> getDiagnosesByDoctor(Long doctorId) {
@@ -105,22 +112,3 @@
 
 
-    @Transactional
-    public Diagnosis updateDiagnosis(Long diagnosisId,
-                                     String diagnosisName,
-                                     String description) {
-
-        if (diagnosisId == null || diagnosisId <= 0)
-            throw new IllegalArgumentException("Diagnosis ID must be valid");
-
-        Diagnosis diagnosis = diagnosisRepository.findById(diagnosisId)
-                .orElseThrow(() -> new RuntimeException("Diagnosis not found"));
-
-        if (diagnosisName != null && !diagnosisName.isBlank())
-            diagnosis.setName(diagnosisName);
-
-        if (description != null)
-            diagnosis.setDescription(description);
-
-        return diagnosisRepository.save(diagnosis);
-    }
 }
Index: backend/src/main/java/medora/service/DoctorService.java
===================================================================
--- backend/src/main/java/medora/service/DoctorService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/DoctorService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,8 +1,8 @@
 package medora.service;
 
+import medora.models.domain.Doctors;
 import medora.models.domain.Departments;
-import medora.models.domain.Doctors;
+import medora.repository.DoctorRepository;
 import medora.repository.DepartmentRepository;
-import medora.repository.DoctorRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,5 +46,7 @@
     }
 
-
+    /**
+     * Get doctor by email
+     */
     @Transactional(readOnly = true)
     public Doctors getDoctorByEmail(String emailAddress) {
@@ -59,5 +61,7 @@
     }
 
-
+    /**
+     * UC024 – View Doctors by Department
+     */
     @Transactional(readOnly = true)
     public List<Doctors> getDoctorsByDepartment(Long departmentId) {
@@ -74,5 +78,7 @@
     }
 
-
+    /**
+     * Get doctors by specialization
+     */
     @Transactional(readOnly = true)
     public List<Doctors> getDoctorsBySpecialization(Long specializationId) {
@@ -86,5 +92,7 @@
     }
 
-
+    /**
+     * Get doctors by level
+     */
     @Transactional(readOnly = true)
     public List<Doctors> getDoctorsByLevel(Long levelId) {
@@ -98,5 +106,7 @@
     }
 
-
+    /**
+     * Get all doctors
+     */
     @Transactional(readOnly = true)
     public List<Doctors> getAllDoctors() {
@@ -105,5 +115,7 @@
     }
 
-
+    /**
+     * Create doctor
+     */
     @Transactional
     public Doctors createDoctor(Doctors doctor) {
@@ -146,5 +158,7 @@
     }
 
-
+    /**
+     * Update doctor
+     */
     @Transactional
     public Doctors updateDoctor(Long doctorId, Doctors doctorDetails) {
Index: backend/src/main/java/medora/service/LabService.java
===================================================================
--- backend/src/main/java/medora/service/LabService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/LabService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -223,25 +223,6 @@
     @Transactional(readOnly = true)
     public List<PerformedLabTests> getPendingLabTests() {
-        // Get all performed tests and filter to only those without results
-        List<PerformedLabTests> allTests = performedLabTestRepository.findAll();
-
-        return allTests.stream()
-                .filter(test -> {
-                    // Get the patient's medical record
-                    Optional<MedicalRecord> recordOpt = medicalRecordRepository.findByPatientPatientId(test.getPatient().getPatientId());
-                    if (recordOpt.isEmpty()) {
-                        return true; // No medical record, so no results possible
-                    }
-
-                    MedicalRecord record = recordOpt.get();
-                    // Check if this test has results in this medical record
-                    List<MedicalRecordLabResults> results = medicalRecordLabResultRepository
-                            .findByMedicalRecordRecordId(record.getRecordId());
-
-                    // Filter to only results for this specific test
-                    return results.stream()
-                            .noneMatch(r -> r.getLabResult().getLabTest().getTestId().equals(test.getLabTest().getTestId()));
-                })
-                .toList();
+        logger.info("Fetching all pending lab test requests");
+        return performedLabTestRepository.findAll();
     }
 
Index: backend/src/main/java/medora/service/MedicalObservationsService.java
===================================================================
--- backend/src/main/java/medora/service/MedicalObservationsService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/MedicalObservationsService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -2,6 +2,14 @@
 
 
-import medora.models.domain.*;
-import medora.repository.*;
+import medora.models.domain.MedicalRecordSymptoms;
+import medora.models.domain.MedicalRecordAllergies;
+import medora.models.domain.Symptoms;
+import medora.models.domain.Allergies;
+import medora.models.domain.MedicalRecord;
+import medora.repository.SymptomRepository;
+import medora.repository.AllergyRepository;
+import medora.repository.MedicalRecordSymptomRepository;
+import medora.repository.MedicalRecordAllergyRepository;
+import medora.repository.MedicalRecordRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -61,5 +69,5 @@
                 .orElseThrow(() -> new RuntimeException("Symptom not found with ID: " + symptomId));
 
-
+        // Check if symptom is already recorded
         if (medicalRecordSymptomRepository.existsByMedicalRecordRecordIdAndSymptomSymptomId(
                 medicalRecordId, symptomId)) {
@@ -93,5 +101,5 @@
 
    
-    // For ALLERGIES
+    // ================= ALLERGIES OPERATIONS =================
 
     /**
@@ -128,5 +136,7 @@
     }
 
-
+    /**
+     * Get all allergies for a patient's medical record
+     */
     @Transactional(readOnly = true)
     public List<MedicalRecordAllergies> getAllergiesForMedicalRecord(Long medicalRecordId) {
@@ -143,5 +153,9 @@
     }
 
+    
 
+    /**
+     * Get all available symptoms
+     */
     @Transactional(readOnly = true)
     public List<Symptoms> getAllSymptoms() {
@@ -150,5 +164,7 @@
     }
 
-
+    /**
+     * Get all available allergies
+     */
     @Transactional(readOnly = true)
     public List<Allergies> getAllAllergies() {
Index: backend/src/main/java/medora/service/MedicalRecordService.java
===================================================================
--- backend/src/main/java/medora/service/MedicalRecordService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/MedicalRecordService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,10 +1,21 @@
 package medora.service;
 
-import medora.models.domain.*;
+import medora.models.domain.Allergies;
+import medora.models.domain.MedicalRecord;
+import medora.models.domain.MedicalRecordAllergies;
+import medora.models.domain.MedicalRecordSymptoms;
+import medora.models.domain.Symptoms;
 import medora.models.domain.id.MedicalRecordAllergyId;
 import medora.models.domain.id.MedicalRecordLabResultId;
 import medora.models.domain.id.MedicalRecordProcedureId;
 import medora.models.domain.id.MedicalRecordSymptomId;
-import medora.repository.*;
+import medora.repository.AllergyRepository;
+import medora.repository.MedicalRecordAllergyRepository;
+import medora.repository.MedicalRecordLabResultRepository;
+import medora.repository.MedicalRecordProcedureRepository;
+import medora.repository.MedicalRecordRepository;
+import medora.repository.MedicalRecordSymptomRepository;
+import medora.repository.PatientRepository;
+import medora.repository.SymptomRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -94,5 +105,5 @@
     }
 
-    // UC015 – Link Medical Data to Medical Record
+    // UC015 – Link Medical Data to Medical Record ⭐ (IMPORTANT FIX)
     @Transactional
     public MedicalRecord linkMedicalData(Long recordId, MedicalRecord updatedData) {
@@ -109,4 +120,8 @@
                 .orElseThrow(() -> new RuntimeException("Medical record not found"));
 
+        // Safely link many-to-many/join-table rows.
+        // The project currently models join-tables as explicit entities (e.g. MedicalRecordProcedures),
+        // but `MedicalRecord` entity in this codebase doesn't expose collection getters yet.
+        // To avoid compile problems and still support DTOs that may contain collections, use reflection:
 
         try {
@@ -126,5 +141,5 @@
                 }
             } catch (NoSuchMethodException ignored) {
-
+                // updatedData has no getProcedures() — nothing to do
             }
 
@@ -144,5 +159,5 @@
                 }
             } catch (NoSuchMethodException ignored) {
-
+                // updatedData has no getLabResults() — nothing to do
             }
 
@@ -157,9 +172,10 @@
                         MedicalRecordAllergyId mraId = new MedicalRecordAllergyId(recordId, allergyId);
                         if (medicalRecordAllergyRepository.findById(mraId).isEmpty()) {
-
+                            // Create allergy join entity manually and save
                             MedicalRecordAllergies allergyJoin =
                                 new MedicalRecordAllergies();
                             allergyJoin.setMedicalRecord(record);
-
+                            // Load allergy entity would require allergyRepo, which we don't have injected yet
+                            // For now, just save the join if it doesn't exist (via repository direct save)
                             logger.debug("Allergy {} linking deferred (missing allergyRepo)", allergyId);
                         }
@@ -167,5 +183,5 @@
                 }
             } catch (NoSuchMethodException ignored) {
-
+                // updatedData has no getAllergies() — nothing to do
             }
 
@@ -185,8 +201,8 @@
                 }
             } catch (NoSuchMethodException ignored) {
-
+                // updatedData has no getSymptoms() — nothing to do
             }
         } catch (ReflectiveOperationException e) {
-
+            // If reflection fails for unexpected reasons, log and rethrow as runtime to avoid silent data loss.
             throw new RuntimeException("Failed to link medical data via reflection", e);
         }
@@ -196,4 +212,5 @@
     }
 
+    // UPDATE medical record
     @Transactional
     public MedicalRecord updateMedicalRecord(Long recordId, MedicalRecord recordDetails) {
@@ -214,4 +231,5 @@
     }
 
+    // helper
     @Transactional(readOnly = true)
     public List<MedicalRecord> getAllMedicalRecords() {
@@ -273,5 +291,5 @@
     }
 
-
+    // Reflection helper: try to extract an id from an object using common getter names
     private Long extractId(Object obj, String... candidateGetters) {
         if (obj == null) return null;
@@ -282,5 +300,5 @@
                 if (val instanceof Number) return ((Number) val).longValue();
             } catch (ReflectiveOperationException ignored) {
-
+                // try next
             }
         }
Index: backend/src/main/java/medora/service/MedicalReportService.java
===================================================================
--- backend/src/main/java/medora/service/MedicalReportService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/MedicalReportService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,6 +1,6 @@
 package medora.service;
 
+import medora.models.domain.*;
 import medora.dto.*;
-import medora.models.domain.*;
 import medora.repository.*;
 import org.slf4j.Logger;
@@ -10,6 +10,8 @@
 
 import java.time.LocalDate;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
Index: backend/src/main/java/medora/service/PatientService.java
===================================================================
--- backend/src/main/java/medora/service/PatientService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/PatientService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -2,8 +2,8 @@
 
 
+import medora.models.domain.Patient;
 import medora.models.domain.MedicalRecord;
-import medora.models.domain.Patient;
+import medora.repository.PatientRepository;
 import medora.repository.MedicalRecordRepository;
-import medora.repository.PatientRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
Index: backend/src/main/java/medora/service/PrescriptionService.java
===================================================================
--- backend/src/main/java/medora/service/PrescriptionService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/PrescriptionService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -1,10 +1,10 @@
 package medora.service;
 
+import medora.models.domain.Prescriptions;
+import medora.models.domain.PrescriptionMedicalRecord;
 import medora.models.domain.MedicalRecord;
-import medora.models.domain.PrescriptionMedicalRecord;
-import medora.models.domain.Prescriptions;
+import medora.repository.PrescriptionRepository;
+import medora.repository.PrescriptionMedicalRecordRepository;
 import medora.repository.MedicalRecordRepository;
-import medora.repository.PrescriptionMedicalRecordRepository;
-import medora.repository.PrescriptionRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
Index: backend/src/main/java/medora/service/ProcedureService.java
===================================================================
--- backend/src/main/java/medora/service/ProcedureService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/ProcedureService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -297,17 +297,32 @@
                 .orElseThrow(() -> new RuntimeException("Procedure not found"));
 
-        ProcedureResults result = new ProcedureResults();
-        result.setProcedure(procedure);
-        result.setResultDescription(resultDescription);
-        result.setResultDate(resultDate);
-
-        ProcedureResults savedResult = procedureResultRepository.save(result);
-
-        // Link to medical record
-        MedicalRecordProcedureResults link = new MedicalRecordProcedureResults(record, savedResult);
-        medicalRecordProcedureResultRepository.save(link);
-
-        logger.info("Stored procedure result {} for medical record {}", savedResult.getResultId(), medicalRecordId);
-        return savedResult;
+        // Check if result already exists for this medical record and procedure
+        List<ProcedureResults> existingResults = procedureResultRepository.findByMedicalRecordAndProcedure(medicalRecordId, procedureId);
+
+        ProcedureResults result;
+        if (!existingResults.isEmpty()) {
+            // Update existing result
+            result = existingResults.get(0);
+            result.setResultDescription(resultDescription);
+            result.setResultDate(resultDate);
+            ProcedureResults savedResult = procedureResultRepository.save(result);
+            logger.info("Updated procedure result {} for medical record {}", savedResult.getResultId(), medicalRecordId);
+            return savedResult;
+        } else {
+            // Create new result
+            result = new ProcedureResults();
+            result.setProcedure(procedure);
+            result.setResultDescription(resultDescription);
+            result.setResultDate(resultDate);
+
+            // Save result first to generate ID
+            ProcedureResults savedResult = procedureResultRepository.save(result);
+
+            // Then link to medical record
+            MedicalRecordProcedureResults link = new MedicalRecordProcedureResults(record, savedResult);
+            medicalRecordProcedureResultRepository.save(link);
+            logger.info("Created new procedure result {} for medical record {}", savedResult.getResultId(), medicalRecordId);
+            return savedResult;
+        }
     }
 
Index: backend/src/main/java/medora/service/ReferralService.java
===================================================================
--- backend/src/main/java/medora/service/ReferralService.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/service/ReferralService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -106,5 +106,7 @@
     }
 
-
+    /**
+     * Get referral by ID
+     */
     @Transactional(readOnly = true)
     public Optional<Referrals> getReferralById(Long referralId) {
@@ -116,5 +118,7 @@
     }
 
-
+    /**
+     * Get referrals for a patient
+     */
     @Transactional(readOnly = true)
     public List<Referrals> getReferralsForPatient(Long patientId) {
@@ -131,5 +135,7 @@
     }
 
-
+    /**
+     * Get referrals made by a doctor
+     */
     @Transactional(readOnly = true)
     public List<Referrals> getReferralsByFromDoctor(Long doctorId) {
@@ -146,4 +152,7 @@
     }
 
+    /**
+     * Get referrals received by a doctor
+     */
     @Transactional(readOnly = true)
     public List<Referrals> getReferralsToDoctor(Long doctorId) {
@@ -160,5 +169,8 @@
     }
 
-
+    /**
+     * Create appointment for referral in a separate transaction
+     * Using REQUIRES_NEW ensures appointment creation failures don't rollback the referral
+     */
     @Transactional(propagation = org.springframework.transaction.annotation.Propagation.REQUIRES_NEW)
     private void createAppointmentForReferral(Long patientId, Long doctorId, LocalDate appointmentDate, LocalTime appointmentTime) {
Index: backend/src/main/java/medora/util/JwtUtil.java
===================================================================
--- backend/src/main/java/medora/util/JwtUtil.java	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ backend/src/main/java/medora/util/JwtUtil.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
@@ -30,5 +30,5 @@
     public void init() {
         logger.info("JwtUtil initialized - JWT Secret length: {}, Expiration: {}ms",
-                jwtSecret != null ? jwtSecret.length() : 0, jwtExpirationMs);
+            jwtSecret != null ? jwtSecret.length() : 0, jwtExpirationMs);
         if (jwtSecret == null || jwtSecret.isEmpty()) {
             logger.error("⚠️ JWT_SECRET is not set or empty!");
@@ -123,5 +123,5 @@
 
             logger.info("🔐 Validating token - secret hash: {}, secret length: {}, token length: {}",
-                    jwtSecret.hashCode(), jwtSecret.length(), token.length());
+                jwtSecret.hashCode(), jwtSecret.length(), token.length());
 
             Jwts.parser()
