Index: backend/src/main/java/medora/controller/DoctorController.java
===================================================================
--- backend/src/main/java/medora/controller/DoctorController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/controller/DoctorController.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -63,4 +63,12 @@
                         .body(Map.of("error", "Email is required"));
             }
+            if (request.getUsername() == null || request.getUsername().isBlank()) {
+                return ResponseEntity.badRequest()
+                        .body(Map.of("error", "Username is required"));
+            }
+            if (request.getPassword() == null || request.getPassword().isBlank()) {
+                return ResponseEntity.badRequest()
+                        .body(Map.of("error", "Password is required"));
+            }
 
             Doctors doctor = new Doctors();
@@ -81,5 +89,5 @@
             doctor.setDepartment(department);
 
-            Doctors createdDoctor = doctorService.createDoctor(doctor);
+            Doctors createdDoctor = doctorService.createDoctor(doctor, request.getUsername(), request.getPassword());
             DoctorDTO dto = convertToDTO(createdDoctor);
 
Index: backend/src/main/java/medora/controller/LabController.java
===================================================================
--- backend/src/main/java/medora/controller/LabController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/controller/LabController.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -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);
@@ -164,8 +164,14 @@
             logger.info("Requesting lab test {} for patient {}", request.getTestId(), request.getPatientId());
 
+            if (request.getTechnicianId() == null || request.getTechnicianId() <= 0) {
+                return ResponseEntity.badRequest()
+                        .body(Map.of("error", "Valid lab technician ID is required"));
+            }
+
             PerformedLabTests performedTest = labService.requestLabTestForPatient(
                     request.getPatientId(),
                     request.getDoctorId(),
                     request.getTestId(),
+                    request.getTechnicianId(),
                     request.getTestDate(),
                     request.getNotes()
Index: backend/src/main/java/medora/controller/LabTechnicianController.java
===================================================================
--- backend/src/main/java/medora/controller/LabTechnicianController.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
+++ backend/src/main/java/medora/controller/LabTechnicianController.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -0,0 +1,51 @@
+package medora.controller;
+
+import medora.dto.LabTechnicianDTO;
+import medora.models.domain.LabTechnician;
+import medora.repository.LabTechnicianRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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 java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/api/lab-technicians")
+public class LabTechnicianController {
+
+    private static final Logger logger = LoggerFactory.getLogger(LabTechnicianController.class);
+
+    private final LabTechnicianRepository labTechnicianRepository;
+
+    public LabTechnicianController(LabTechnicianRepository labTechnicianRepository) {
+        this.labTechnicianRepository = labTechnicianRepository;
+    }
+
+    @GetMapping
+    public ResponseEntity<?> getAllLabTechnicians() {
+        try {
+            List<LabTechnicianDTO> technicians = labTechnicianRepository.findAll().stream()
+                    .map(this::convertToDTO)
+                    .collect(Collectors.toList());
+            return ResponseEntity.ok(technicians);
+        } catch (Exception e) {
+            logger.error("Error fetching lab technicians: {}", e.getMessage());
+            return ResponseEntity.internalServerError()
+                    .body(Map.of("error", "Failed to fetch lab technicians: " + e.getMessage()));
+        }
+    }
+
+    private LabTechnicianDTO convertToDTO(LabTechnician technician) {
+        return new LabTechnicianDTO(
+                technician.getTechnicianId(),
+                technician.getName(),
+                technician.getLastname(),
+                technician.getUsername()
+        );
+    }
+}
Index: backend/src/main/java/medora/controller/PatientController.java
===================================================================
--- backend/src/main/java/medora/controller/PatientController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/controller/PatientController.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -57,4 +57,8 @@
                         .body(Map.of("error", "EMBG is required"));
             }
+            if (request.getPassword() == null || request.getPassword().isBlank()) {
+                return ResponseEntity.badRequest()
+                        .body(Map.of("error", "Password is required"));
+            }
 
             Patient patient = new Patient();
@@ -68,5 +72,5 @@
             patient.setEmbg(request.getEmbg());
 
-            Patient createdPatient = patientService.createPatient(patient);
+            Patient createdPatient = patientService.createPatient(patient, request.getPassword());
             PatientDTO dto = convertToDTO(createdPatient);
 
Index: backend/src/main/java/medora/controller/ReferralController.java
===================================================================
--- backend/src/main/java/medora/controller/ReferralController.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/controller/ReferralController.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -13,4 +13,6 @@
 import jakarta.servlet.http.HttpServletRequest;
 
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.List;
 import java.util.Map;
@@ -81,5 +83,5 @@
             );
 
-            ReferralDTO dto = convertToDTO(referral);
+            ReferralDTO dto = convertToDTO(referral, request.getAppointmentDate(), request.getAppointmentTime());
             return ResponseEntity.status(HttpStatus.CREATED).body(dto);
         } catch (RuntimeException e) {
@@ -213,4 +215,13 @@
 
     private ReferralDTO convertToDTO(Referrals referral) {
+        return convertToDTO(referral, null, null);
+    }
+
+    // Referrals no longer stores its own appointment_date/appointment_time
+    // (that data lives on the automatically-created Appointment row instead,
+    // matching the validated design). The create endpoint passes the values
+    // it just used to create that appointment; other endpoints have no
+    // reliable way to reconstruct them and pass null.
+    private ReferralDTO convertToDTO(Referrals referral, LocalDate appointmentDate, LocalTime appointmentTime) {
         String fromDoctorName = "";
         Long fromDoctorId = null;
@@ -250,6 +261,6 @@
                 referral.getReason(),
                 referral.getReferralDate(),
-                referral.getAppointmentDate(),
-                referral.getAppointmentTime()
+                appointmentDate,
+                appointmentTime
         );
     }
Index: backend/src/main/java/medora/dto/CreateDoctorRequest.java
===================================================================
--- backend/src/main/java/medora/dto/CreateDoctorRequest.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/dto/CreateDoctorRequest.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -18,3 +18,5 @@
     private Long specializationId;
     private Long departmentId;
+    private String username;
+    private String password;
 }
Index: backend/src/main/java/medora/dto/CreatePatientRequest.java
===================================================================
--- backend/src/main/java/medora/dto/CreatePatientRequest.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/dto/CreatePatientRequest.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -23,3 +23,4 @@
     private String phoneNumber;
     private String embg;
+    private String password;
 }
Index: backend/src/main/java/medora/dto/LabTechnicianDTO.java
===================================================================
--- backend/src/main/java/medora/dto/LabTechnicianDTO.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
+++ backend/src/main/java/medora/dto/LabTechnicianDTO.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -0,0 +1,17 @@
+package medora.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class LabTechnicianDTO {
+    private Long technicianId;
+    private String name;
+    private String lastname;
+    private String username;
+}
Index: backend/src/main/java/medora/dto/RequestLabTestRequest.java
===================================================================
--- backend/src/main/java/medora/dto/RequestLabTestRequest.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/dto/RequestLabTestRequest.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -16,4 +16,5 @@
     private Long doctorId;
     private Long testId;
+    private Long technicianId;
     private LocalDate testDate;
     private String notes;
Index: backend/src/main/java/medora/exception/DiagnosisProcedureNotFoundException.java
===================================================================
--- backend/src/main/java/medora/exception/DiagnosisProcedureNotFoundException.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package medora.exception;
-
-public class DiagnosisProcedureNotFoundException extends RuntimeException {
-    public DiagnosisProcedureNotFoundException(Long diagnosisId, Long procedureId) {
-        super("Diagnosis procedure relationship with diagnosis id %d and procedure id %d does not exist.".formatted(diagnosisId, procedureId));
-    }
-}
-
Index: backend/src/main/java/medora/exception/DoctorMedicalRecordNotFoundException.java
===================================================================
--- backend/src/main/java/medora/exception/DoctorMedicalRecordNotFoundException.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package medora.exception;
-
-public class DoctorMedicalRecordNotFoundException extends RuntimeException {
-    public DoctorMedicalRecordNotFoundException(Long doctorId, Long recordId) {
-        super("Doctor medical record relationship with doctor id %d and record id %d does not exist.".formatted(doctorId, recordId));
-    }
-}
-
Index: backend/src/main/java/medora/models/domain/Admin.java
===================================================================
--- backend/src/main/java/medora/models/domain/Admin.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/Admin.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -15,21 +15,28 @@
     private Long adminId;
 
+    @Column(name = "username", nullable = false, unique = true)
+    private String username;
+
+    @Column(name = "name", nullable = false)
+    private String name;
+
+    @Column(name = "lastname", nullable = false)
+    private String lastname;
+
+    @Column(name = "email", nullable = false, unique = true)
+    private String email;
+
     @OneToOne(optional = false)
     @JoinColumn(name = "user_id", nullable = false, unique = true)
     private User user;
 
-    @Column(name = "permissions")
-    private String permissions;
-
     public Admin() {}
 
-    public Admin(Long adminId, User user, String permissions) {
+    public Admin(Long adminId, String username, String name, String lastname, String email, User user) {
         this.adminId = adminId;
-        this.user = user;
-        this.permissions = permissions;
-    }
-
-    public Admin(Long adminId, User user) {
-        this.adminId = adminId;
+        this.username = username;
+        this.name = name;
+        this.lastname = lastname;
+        this.email = email;
         this.user = user;
     }
Index: backend/src/main/java/medora/models/domain/Appointment.java
===================================================================
--- backend/src/main/java/medora/models/domain/Appointment.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/Appointment.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -16,6 +16,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "appointment_seq")
-    @SequenceGenerator(name = "appointment_seq", sequenceName = "appointment_id_seq", allocationSize = 1)
     @Column(name = "appointment_id")
     private Long appointmentId;
Index: backend/src/main/java/medora/models/domain/Billing.java
===================================================================
--- backend/src/main/java/medora/models/domain/Billing.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/Billing.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -19,6 +19,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "bill_seq")
-    @SequenceGenerator(name = "bill_seq", sequenceName = "bill_id_seq", allocationSize = 1)
     @Column(name = "bill_id")
     private Long billId;
@@ -39,6 +37,6 @@
     private MedicalRecord medicalRecord;
 
-    @ManyToOne(optional = true)
-    @JoinColumn(name = "admin_id", nullable = true)
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "admin_id", nullable = false)
     private Admin admin;
 
Index: backend/src/main/java/medora/models/domain/Diagnosis.java
===================================================================
--- backend/src/main/java/medora/models/domain/Diagnosis.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/Diagnosis.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -12,6 +12,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "diagnosis_seq")
-    @SequenceGenerator(name = "diagnosis_seq", sequenceName = "diagnosis_id_seq", allocationSize = 1)
     @Column(name = "diagnosis_id")
     private Long diagnosisId;
Index: backend/src/main/java/medora/models/domain/DiagnosisProcedure.java
===================================================================
--- backend/src/main/java/medora/models/domain/DiagnosisProcedure.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package medora.models.domain;
-
-import jakarta.persistence.*;
-import lombok.Getter;
-import lombok.Setter;
-import medora.models.domain.id.DiagnosisProcedureId;
-
-@Getter
-@Setter
-@Entity
-@Table(name = "diagnosis_procedures")
-@IdClass(DiagnosisProcedureId.class)
-public class DiagnosisProcedure {
-
-    @Id
-    @ManyToOne(optional = false, fetch = FetchType.LAZY)
-    @JoinColumn(name = "diagnosis_id", nullable = false)
-    private Diagnosis diagnosis;
-
-    @Id
-    @ManyToOne(optional = false, fetch = FetchType.LAZY)
-    @JoinColumn(name = "procedure_id", nullable = false)
-    private Procedure procedure;
-
-    public DiagnosisProcedure() {
-    }
-
-    public DiagnosisProcedure(Diagnosis diagnosis, Procedure procedure) {
-        this.diagnosis = diagnosis;
-        this.procedure = procedure;
-    }
-}
Index: backend/src/main/java/medora/models/domain/DoctorMedicalRecord.java
===================================================================
--- backend/src/main/java/medora/models/domain/DoctorMedicalRecord.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package medora.models.domain;
-
-import jakarta.persistence.*;
-import lombok.Getter;
-import lombok.Setter;
-import medora.models.domain.id.DoctorMedicalRecordId;
-
-@Getter
-@Setter
-@Entity
-@Table(name = "doctor_medical_records")
-@IdClass(DoctorMedicalRecordId.class)
-public class DoctorMedicalRecord {
-
-    @Id
-    @ManyToOne(optional = false, fetch = FetchType.LAZY)
-    @JoinColumn(name = "doctor_id", nullable = false)
-    private Doctors doctor;
-
-    @Id
-    @ManyToOne(optional = false, fetch = FetchType.LAZY)
-    @JoinColumn(name = "record_id", nullable = false)
-    private MedicalRecord medicalRecord;
-
-    public DoctorMedicalRecord() {
-    }
-
-    public DoctorMedicalRecord(Doctors doctor, MedicalRecord medicalRecord) {
-        this.doctor = doctor;
-        this.medicalRecord = medicalRecord;
-    }
-}
Index: backend/src/main/java/medora/models/domain/Doctors.java
===================================================================
--- backend/src/main/java/medora/models/domain/Doctors.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/Doctors.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -12,6 +12,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "doctor_seq")
-    @SequenceGenerator(name = "doctor_seq", sequenceName = "doctor_id_seq", allocationSize = 1)
     @Column(name = "doctor_id")
     private Long doctorId;
@@ -38,8 +36,13 @@
     private Departments department;
 
+    @OneToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "user_id", nullable = false, unique = true)
+    private User user;
+
     public Doctors() {}
 
     public Doctors(Long doctorId, String firstName, String lastName, String emailAddress,
-                  DoctorLevel level, DoctorSpecialization specialization, Departments department) {
+                  DoctorLevel level, DoctorSpecialization specialization, Departments department,
+                  User user) {
         this.doctorId = doctorId;
         this.firstName = firstName;
@@ -49,4 +52,5 @@
         this.specialization = specialization;
         this.department = department;
+        this.user = user;
     }
 }
Index: backend/src/main/java/medora/models/domain/LabResults.java
===================================================================
--- backend/src/main/java/medora/models/domain/LabResults.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/LabResults.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -15,6 +15,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "result_seq")
-    @SequenceGenerator(name = "result_seq", sequenceName = "result_id_seq", allocationSize = 1)
     @Column(name = "result_id")
     private Long resultId;
Index: backend/src/main/java/medora/models/domain/LabTechnician.java
===================================================================
--- backend/src/main/java/medora/models/domain/LabTechnician.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/LabTechnician.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -15,21 +15,28 @@
     private Long technicianId;
 
+    @Column(name = "username", nullable = false, unique = true)
+    private String username;
+
+    @Column(name = "name", nullable = false)
+    private String name;
+
+    @Column(name = "lastname", nullable = false)
+    private String lastname;
+
+    @Column(name = "email", nullable = false, unique = true)
+    private String email;
+
     @OneToOne(optional = false)
     @JoinColumn(name = "user_id", nullable = false, unique = true)
     private User user;
 
-    @Column(name = "certification")
-    private String certification;
-
     public LabTechnician() {}
 
-    public LabTechnician(Long technicianId, User user, String certification) {
+    public LabTechnician(Long technicianId, String username, String name, String lastname, String email, User user) {
         this.technicianId = technicianId;
-        this.user = user;
-        this.certification = certification;
-    }
-
-    public LabTechnician(Long technicianId, User user) {
-        this.technicianId = technicianId;
+        this.username = username;
+        this.name = name;
+        this.lastname = lastname;
+        this.email = email;
         this.user = user;
     }
Index: backend/src/main/java/medora/models/domain/LabTests.java
===================================================================
--- backend/src/main/java/medora/models/domain/LabTests.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/LabTests.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -17,6 +17,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "test_seq")
-    @SequenceGenerator(name = "test_seq", sequenceName = "test_id_seq", allocationSize = 1)
     @Column(name = "test_id")
     private Long testId;
Index: backend/src/main/java/medora/models/domain/MedicalRecord.java
===================================================================
--- backend/src/main/java/medora/models/domain/MedicalRecord.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/MedicalRecord.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -13,6 +13,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "record_seq")
-    @SequenceGenerator(name = "record_seq", sequenceName = "record_id_seq", allocationSize = 1)
     @Column(name = "record_id")
     private Long recordId;
Index: backend/src/main/java/medora/models/domain/MedicalRecordProcedureResults.java
===================================================================
--- backend/src/main/java/medora/models/domain/MedicalRecordProcedureResults.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package medora.models.domain;
-
-import jakarta.persistence.*;
-import lombok.Getter;
-import lombok.Setter;
-import medora.models.domain.id.MedicalRecordProcedureResultId;
-
-@Getter
-@Setter
-@Entity
-@Table(name = "medical_record_procedure_results")
-@IdClass(MedicalRecordProcedureResultId.class)
-public class MedicalRecordProcedureResults {
-
-    @Id
-    @ManyToOne(optional = false, fetch = FetchType.LAZY)
-    @JoinColumn(name = "record_id", nullable = false)
-    private MedicalRecord medicalRecord;
-
-    @Id
-    @ManyToOne(optional = false, fetch = FetchType.LAZY)
-    @JoinColumn(name = "result_id", nullable = false)
-    private ProcedureResults procedureResult;
-
-    public MedicalRecordProcedureResults() {
-    }
-
-    public MedicalRecordProcedureResults(MedicalRecord medicalRecord, ProcedureResults procedureResult) {
-        this.medicalRecord = medicalRecord;
-        this.procedureResult = procedureResult;
-    }
-}
Index: backend/src/main/java/medora/models/domain/MedicalReport.java
===================================================================
--- backend/src/main/java/medora/models/domain/MedicalReport.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/MedicalReport.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -17,6 +17,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "medical_report_seq")
-    @SequenceGenerator(name = "medical_report_seq", sequenceName = "medical_report_id_seq", initialValue = 100000, allocationSize = 1)
     @Column(name = "report_id")
     private Long reportId;
Index: backend/src/main/java/medora/models/domain/Patient.java
===================================================================
--- backend/src/main/java/medora/models/domain/Patient.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/Patient.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -20,6 +20,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "patient_seq")
-    @SequenceGenerator(name = "patient_seq", sequenceName = "patient_id_seq", allocationSize = 1)
     @Column(name = "patient_id")
     private Long patientId;
@@ -55,4 +53,8 @@
     private List<MedicalRecord> medicalRecords;
 
+    @OneToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "user_id", nullable = false, unique = true)
+    private User user;
+
     public Patient() {}
 
@@ -65,5 +67,6 @@
                    Gender gender,
                    String phoneNumber,
-                   String embg) {
+                   String embg,
+                   User user) {
 
         this.patientId = patientId;
@@ -76,4 +79,5 @@
         this.phoneNumber = phoneNumber;
         this.embg = embg;
+        this.user = user;
     }
 }
Index: backend/src/main/java/medora/models/domain/PerformedLabTests.java
===================================================================
--- backend/src/main/java/medora/models/domain/PerformedLabTests.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/PerformedLabTests.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -15,6 +15,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "performed_test_seq")
-    @SequenceGenerator(name = "performed_test_seq", sequenceName = "performed_test_id_seq", allocationSize = 1)
     @Column(name = "performed_test_id")
     private Long performedTestId;
@@ -32,6 +30,6 @@
     private Doctors doctor;
 
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "technician_id")
+    @ManyToOne(optional = false, fetch = FetchType.LAZY)
+    @JoinColumn(name = "technician_id", nullable = false)
     private LabTechnician technician;
 
Index: backend/src/main/java/medora/models/domain/PerformedProcedures.java
===================================================================
--- backend/src/main/java/medora/models/domain/PerformedProcedures.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/PerformedProcedures.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -14,6 +14,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "performed_id_seq")
-    @SequenceGenerator(name = "performed_id_seq", sequenceName = "performed_procedures_performed_id_seq", allocationSize = 1)
     @Column(name = "performed_id")
     private Long performedId;
Index: backend/src/main/java/medora/models/domain/Prescriptions.java
===================================================================
--- backend/src/main/java/medora/models/domain/Prescriptions.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/Prescriptions.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -13,6 +13,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "prescription_seq")
-    @SequenceGenerator(name = "prescription_seq", sequenceName = "prescription_id_seq", allocationSize = 1)
     @Column(name = "prescription_id")
     private Long prescriptionId;
Index: backend/src/main/java/medora/models/domain/Procedure.java
===================================================================
--- backend/src/main/java/medora/models/domain/Procedure.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/Procedure.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -8,4 +8,5 @@
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 
 @Getter
@@ -16,6 +17,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "procedure_seq")
-    @SequenceGenerator(name = "procedure_seq", sequenceName = "procedure_id_seq", allocationSize = 1)
     @Column(name = "procedure_id")
     private Long procedureId;
@@ -24,4 +23,7 @@
     @Column(name = "procedure_type", nullable = false)
     private String procedureType;
+
+    @Column(name = "procedure_date", nullable = false)
+    private LocalDate procedureDate;
 
     @Column(name = "description", columnDefinition = "TEXT")
@@ -32,15 +34,23 @@
     private BigDecimal cost;
 
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "doctor_id", nullable = false)
+    private Doctors doctor;
+
     public Procedure() {}
 
     public Procedure(Long procedureId,
                      String procedureType,
+                     LocalDate procedureDate,
                      String description,
-                     BigDecimal cost) {
+                     BigDecimal cost,
+                     Doctors doctor) {
 
         this.procedureId = procedureId;
         this.procedureType = procedureType;
+        this.procedureDate = procedureDate;
         this.description = description;
         this.cost = cost;
+        this.doctor = doctor;
     }
 }
Index: backend/src/main/java/medora/models/domain/ProcedureResults.java
===================================================================
--- backend/src/main/java/medora/models/domain/ProcedureResults.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/ProcedureResults.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -16,6 +16,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "result_seq")
-    @SequenceGenerator(name = "result_seq", sequenceName = "procedure_results_result_id_seq", allocationSize = 1)
     @Column(name = "result_id")
     private Long resultId;
Index: backend/src/main/java/medora/models/domain/Referrals.java
===================================================================
--- backend/src/main/java/medora/models/domain/Referrals.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/Referrals.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -8,5 +8,4 @@
 
 import java.time.LocalDate;
-import java.time.LocalTime;
 
 @Getter
@@ -17,6 +16,4 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "referral_seq")
-    @SequenceGenerator(name = "referral_seq", sequenceName = "referral_id_seq", allocationSize = 1)
     @Column(name = "referral_id")
     private Long referralId;
@@ -28,10 +25,4 @@
     @Column(name = "referral_date", nullable = false)
     private LocalDate referralDate;
-
-    @Column(name = "appointment_date")
-    private LocalDate appointmentDate;
-
-    @Column(name = "appointment_time")
-    private LocalTime appointmentTime;
 
     @ManyToOne(optional = false)
@@ -52,6 +43,4 @@
                     String reason,
                     LocalDate referralDate,
-                    LocalDate appointmentDate,
-                    LocalTime appointmentTime,
                     MedicalRecord medicalRecord,
                     Doctors fromDoctor,
@@ -61,6 +50,4 @@
         this.reason = reason;
         this.referralDate = referralDate;
-        this.appointmentDate = appointmentDate;
-        this.appointmentTime = appointmentTime;
         this.medicalRecord = medicalRecord;
         this.fromDoctor = fromDoctor;
Index: backend/src/main/java/medora/models/domain/ReportAllergy.java
===================================================================
--- backend/src/main/java/medora/models/domain/ReportAllergy.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package medora.models.domain;
-
-import jakarta.persistence.*;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@Entity
-@Table(name = "report_allergy")
-@IdClass(medora.models.domain.id.ReportAllergyId.class)
-public class ReportAllergy {
-
-    @Id
-    @ManyToOne(optional = false)
-    @JoinColumn(name = "report_id", nullable = false)
-    private MedicalReport report;
-
-    @Id
-    @ManyToOne(optional = false)
-    @JoinColumn(name = "allergy_id", nullable = false)
-    private Allergies allergy;
-
-    public ReportAllergy() {}
-
-    public ReportAllergy(MedicalReport report, Allergies allergy) {
-        this.report = report;
-        this.allergy = allergy;
-    }
-}
Index: backend/src/main/java/medora/models/domain/ReportDiagnosis.java
===================================================================
--- backend/src/main/java/medora/models/domain/ReportDiagnosis.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package medora.models.domain;
-
-import jakarta.persistence.*;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@Entity
-@Table(name = "report_diagnosis")
-@IdClass(medora.models.domain.id.ReportDiagnosisId.class)
-public class ReportDiagnosis {
-
-    @Id
-    @ManyToOne(optional = false)
-    @JoinColumn(name = "report_id", nullable = false)
-    private MedicalReport report;
-
-    @Id
-    @ManyToOne(optional = false)
-    @JoinColumn(name = "diagnosis_id", nullable = false)
-    private Diagnosis diagnosis;
-
-    public ReportDiagnosis() {}
-
-    public ReportDiagnosis(MedicalReport report, Diagnosis diagnosis) {
-        this.report = report;
-        this.diagnosis = diagnosis;
-    }
-}
Index: backend/src/main/java/medora/models/domain/ReportPrescription.java
===================================================================
--- backend/src/main/java/medora/models/domain/ReportPrescription.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package medora.models.domain;
-
-import jakarta.persistence.*;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@Entity
-@Table(name = "report_prescription")
-@IdClass(medora.models.domain.id.ReportPrescriptionId.class)
-public class ReportPrescription {
-
-    @Id
-    @ManyToOne(optional = false)
-    @JoinColumn(name = "report_id", nullable = false)
-    private MedicalReport report;
-
-    @Id
-    @ManyToOne(optional = false)
-    @JoinColumn(name = "prescription_id", nullable = false)
-    private Prescriptions prescription;
-
-    public ReportPrescription() {}
-
-    public ReportPrescription(MedicalReport report, Prescriptions prescription) {
-        this.report = report;
-        this.prescription = prescription;
-    }
-}
Index: backend/src/main/java/medora/models/domain/ReportSymptom.java
===================================================================
--- backend/src/main/java/medora/models/domain/ReportSymptom.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package medora.models.domain;
-
-import jakarta.persistence.*;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@Entity
-@Table(name = "report_symptom")
-@IdClass(medora.models.domain.id.ReportSymptomId.class)
-public class ReportSymptom {
-
-    @Id
-    @ManyToOne(optional = false)
-    @JoinColumn(name = "report_id", nullable = false)
-    private MedicalReport report;
-
-    @Id
-    @ManyToOne(optional = false)
-    @JoinColumn(name = "symptom_id", nullable = false)
-    private Symptoms symptom;
-
-    public ReportSymptom() {}
-
-    public ReportSymptom(MedicalReport report, Symptoms symptom) {
-        this.report = report;
-        this.symptom = symptom;
-    }
-}
Index: backend/src/main/java/medora/models/domain/User.java
===================================================================
--- backend/src/main/java/medora/models/domain/User.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/domain/User.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -34,14 +34,4 @@
     private Boolean isActive = true;
 
-    // Foreign key to patient (only for PATIENT role)
-    @OneToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "patient_id")
-    private Patient patient;
-
-    // Foreign key to doctor (only for DOCTOR role)
-    @OneToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "doctor_id")
-    private Doctors doctor;
-
     public User() {}
 
Index: backend/src/main/java/medora/models/domain/id/DiagnosisProcedureId.java
===================================================================
--- backend/src/main/java/medora/models/domain/id/DiagnosisProcedureId.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package medora.models.domain.id;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-public class DiagnosisProcedureId implements Serializable {
-
-    private Long diagnosis;
-    private Long procedure;
-
-    public DiagnosisProcedureId() {
-    }
-
-    public DiagnosisProcedureId(Long diagnosis, Long procedure) {
-        this.diagnosis = diagnosis;
-        this.procedure = procedure;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof DiagnosisProcedureId that)) return false;
-
-        return Objects.equals(diagnosis, that.diagnosis)
-                && Objects.equals(procedure, that.procedure);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(diagnosis, procedure);
-    }
-}
Index: backend/src/main/java/medora/models/domain/id/DoctorMedicalRecordId.java
===================================================================
--- backend/src/main/java/medora/models/domain/id/DoctorMedicalRecordId.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package medora.models.domain.id;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-public class DoctorMedicalRecordId implements Serializable {
-
-    private Long doctor;
-    private Long medicalRecord;
-
-    public DoctorMedicalRecordId() {
-    }
-
-    public DoctorMedicalRecordId(Long doctor, Long medicalRecord) {
-        this.doctor = doctor;
-        this.medicalRecord = medicalRecord;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof DoctorMedicalRecordId that)) return false;
-
-        return Objects.equals(doctor, that.doctor)
-                && Objects.equals(medicalRecord, that.medicalRecord);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(doctor, medicalRecord);
-    }
-}
Index: backend/src/main/java/medora/models/domain/id/MedicalRecordProcedureResultId.java
===================================================================
--- backend/src/main/java/medora/models/domain/id/MedicalRecordProcedureResultId.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package medora.models.domain.id;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-public class MedicalRecordProcedureResultId implements Serializable {
-
-    private Long medicalRecord;
-    private Long procedureResult;
-
-    public MedicalRecordProcedureResultId() {
-    }
-
-    public MedicalRecordProcedureResultId(Long medicalRecord, Long procedureResult) {
-        this.medicalRecord = medicalRecord;
-        this.procedureResult = procedureResult;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof MedicalRecordProcedureResultId that)) return false;
-
-        return Objects.equals(medicalRecord, that.medicalRecord)
-                && Objects.equals(procedureResult, that.procedureResult);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(medicalRecord, procedureResult);
-    }
-}
Index: backend/src/main/java/medora/models/domain/id/ReportAllergyId.java
===================================================================
--- backend/src/main/java/medora/models/domain/id/ReportAllergyId.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,29 +1,0 @@
-package medora.models.domain.id;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-public class ReportAllergyId implements Serializable {
-    private Long report;
-    private Long allergy;
-
-    public ReportAllergyId() {}
-
-    public ReportAllergyId(Long report, Long allergy) {
-        this.report = report;
-        this.allergy = allergy;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        ReportAllergyId that = (ReportAllergyId) o;
-        return Objects.equals(report, that.report) && Objects.equals(allergy, that.allergy);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(report, allergy);
-    }
-}
Index: backend/src/main/java/medora/models/domain/id/ReportDiagnosisId.java
===================================================================
--- backend/src/main/java/medora/models/domain/id/ReportDiagnosisId.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,29 +1,0 @@
-package medora.models.domain.id;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-public class ReportDiagnosisId implements Serializable {
-    private Long report;
-    private Long diagnosis;
-
-    public ReportDiagnosisId() {}
-
-    public ReportDiagnosisId(Long report, Long diagnosis) {
-        this.report = report;
-        this.diagnosis = diagnosis;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        ReportDiagnosisId that = (ReportDiagnosisId) o;
-        return Objects.equals(report, that.report) && Objects.equals(diagnosis, that.diagnosis);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(report, diagnosis);
-    }
-}
Index: backend/src/main/java/medora/models/domain/id/ReportPrescriptionId.java
===================================================================
--- backend/src/main/java/medora/models/domain/id/ReportPrescriptionId.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,29 +1,0 @@
-package medora.models.domain.id;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-public class ReportPrescriptionId implements Serializable {
-    private Long report;
-    private Long prescription;
-
-    public ReportPrescriptionId() {}
-
-    public ReportPrescriptionId(Long report, Long prescription) {
-        this.report = report;
-        this.prescription = prescription;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        ReportPrescriptionId that = (ReportPrescriptionId) o;
-        return Objects.equals(report, that.report) && Objects.equals(prescription, that.prescription);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(report, prescription);
-    }
-}
Index: backend/src/main/java/medora/models/domain/id/ReportSymptomId.java
===================================================================
--- backend/src/main/java/medora/models/domain/id/ReportSymptomId.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,29 +1,0 @@
-package medora.models.domain.id;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-public class ReportSymptomId implements Serializable {
-    private Long report;
-    private Long symptom;
-
-    public ReportSymptomId() {}
-
-    public ReportSymptomId(Long report, Long symptom) {
-        this.report = report;
-        this.symptom = symptom;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        ReportSymptomId that = (ReportSymptomId) o;
-        return Objects.equals(report, that.report) && Objects.equals(symptom, that.symptom);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(report, symptom);
-    }
-}
Index: backend/src/main/java/medora/models/enums/AppointmentStatus.java
===================================================================
--- backend/src/main/java/medora/models/enums/AppointmentStatus.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/models/enums/AppointmentStatus.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -5,4 +5,5 @@
     COMPLETED,
     CANCELLED,
-    IN_PROGRESS
+    IN_PROGRESS,
+    NO_SHOW
 }
Index: backend/src/main/java/medora/repository/AdminRepository.java
===================================================================
--- backend/src/main/java/medora/repository/AdminRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/AdminRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -3,6 +3,12 @@
 import medora.models.domain.Admin;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 
 public interface AdminRepository extends JpaRepository<Admin, Long> {
+
+    // adminId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new Admin.
+    @Query("SELECT COALESCE(MAX(e.adminId), 0) FROM Admin e")
+    Long findMaxAdminId();
 }
 
Index: backend/src/main/java/medora/repository/AppointmentRepository.java
===================================================================
--- backend/src/main/java/medora/repository/AppointmentRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/AppointmentRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -14,4 +14,9 @@
 
 public interface AppointmentRepository extends JpaRepository<Appointment, Long> {
+
+    // appointmentId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new Appointment.
+    @Query("SELECT COALESCE(MAX(e.appointmentId), 0) FROM Appointment e")
+    Long findMaxAppointmentId();
 
     /**
Index: backend/src/main/java/medora/repository/BillingLabTestsRepository.java
===================================================================
--- backend/src/main/java/medora/repository/BillingLabTestsRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/BillingLabTestsRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -19,4 +19,6 @@
     List<BillingLabTests> findByBillingBillId(@Param("billId") Long billId);
 
+    boolean existsByBillingBillIdAndLabTestTestId(Long billId, Long testId);
+
     // Calculate total cost of lab tests for a billing record
     @Query("""
@@ -26,3 +28,2 @@
     BigDecimal calculateTotalCostForBilling(@Param("billId") Long billId);
 }
-
Index: backend/src/main/java/medora/repository/BillingProceduresRepository.java
===================================================================
--- backend/src/main/java/medora/repository/BillingProceduresRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/BillingProceduresRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -19,4 +19,6 @@
     List<BillingProcedures> findByBillingBillId(@Param("billId") Long billId);
 
+    boolean existsByBillingBillIdAndProcedureProcedureId(Long billId, Long procedureId);
+
     // Calculate total cost of procedures for a billing record
     @Query("""
@@ -26,3 +28,2 @@
     BigDecimal calculateTotalCostForBilling(@Param("billId") Long billId);
 }
-
Index: backend/src/main/java/medora/repository/BillingRepository.java
===================================================================
--- backend/src/main/java/medora/repository/BillingRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/BillingRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -13,4 +13,9 @@
 
 public interface BillingRepository extends JpaRepository<Billing, Long> {
+
+    // billId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new Billing.
+    @Query("SELECT COALESCE(MAX(e.billId), 0) FROM Billing e")
+    Long findMaxBillId();
 
     // UC020 – Generate Billing Record
Index: backend/src/main/java/medora/repository/DiagnosisRepository.java
===================================================================
--- backend/src/main/java/medora/repository/DiagnosisRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/DiagnosisRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -10,4 +10,10 @@
 
 public interface DiagnosisRepository extends JpaRepository<Diagnosis, Long> {
+
+    // diagnosis_id is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new Diagnosis.
+    @Query("SELECT COALESCE(MAX(d.diagnosisId), 0) FROM Diagnosis d")
+    Long findMaxDiagnosisId();
+
 //UC009 – Record Diagnosis
    // A doctor adds a diagnosis to a patient’s medical record.
Index: backend/src/main/java/medora/repository/DoctorRepository.java
===================================================================
--- backend/src/main/java/medora/repository/DoctorRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/DoctorRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -11,4 +11,13 @@
 
 public interface DoctorRepository extends JpaRepository<Doctors, Long> {
+
+    // doctorId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new Doctors.
+    @Query("SELECT COALESCE(MAX(e.doctorId), 0) FROM Doctors e")
+    Long findMaxDoctorId();
+
+    // Login lookup: find the doctor profile linked to a given user account
+    // (Doctors.user_id is the foreign key, the reverse of Users->Doctors)
+    Optional<Doctors> findByUserUserId(Long userId);
 
     // UC023 – View Departments (see DepartmentRepository)
Index: backend/src/main/java/medora/repository/LabResultsRepository.java
===================================================================
--- backend/src/main/java/medora/repository/LabResultsRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/LabResultsRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -9,4 +9,9 @@
 
 public interface LabResultsRepository extends JpaRepository<LabResults, Long> {
+
+    // resultId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new LabResults.
+    @Query("SELECT COALESCE(MAX(e.resultId), 0) FROM LabResults e")
+    Long findMaxResultId();
 
     // UC014 – Store Lab Results
Index: backend/src/main/java/medora/repository/LabTechnicianRepository.java
===================================================================
--- backend/src/main/java/medora/repository/LabTechnicianRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/LabTechnicianRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -3,5 +3,11 @@
 import medora.models.domain.LabTechnician;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 
 public interface LabTechnicianRepository extends JpaRepository<LabTechnician, Long> {
+
+    // technicianId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new LabTechnician.
+    @Query("SELECT COALESCE(MAX(e.technicianId), 0) FROM LabTechnician e")
+    Long findMaxTechnicianId();
 }
Index: backend/src/main/java/medora/repository/LabTestRepository.java
===================================================================
--- backend/src/main/java/medora/repository/LabTestRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/LabTestRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -10,4 +10,9 @@
 
 public interface LabTestRepository extends JpaRepository<LabTests, Long> {
+
+    // testId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new LabTests.
+    @Query("SELECT COALESCE(MAX(e.testId), 0) FROM LabTests e")
+    Long findMaxTestId();
 
     // UC013 – Record Lab Test Request
Index: backend/src/main/java/medora/repository/MedicalRecordProcedureResultRepository.java
===================================================================
--- backend/src/main/java/medora/repository/MedicalRecordProcedureResultRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,24 +1,0 @@
-package medora.repository;
-
-import medora.models.domain.MedicalRecordProcedureResults;
-import medora.models.domain.id.MedicalRecordProcedureResultId;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-
-import java.util.List;
-
-public interface MedicalRecordProcedureResultRepository extends JpaRepository<MedicalRecordProcedureResults, MedicalRecordProcedureResultId> {
-
-    // Find all procedure results for a medical record
-    List<MedicalRecordProcedureResults> findByMedicalRecordRecordId(Long recordId);
-
-    // Check if a procedure result is already linked to a medical record
-    @Query("""
-        SELECT CASE WHEN COUNT(mrpr) > 0 THEN true ELSE false END
-        FROM MedicalRecordProcedureResults mrpr
-        WHERE mrpr.medicalRecord.recordId = :recordId
-        AND mrpr.procedureResult.resultId = :resultId
-    """)
-    boolean existsByMedicalRecordAndProcedureResult(@Param("recordId") Long recordId, @Param("resultId") Long resultId);
-}
Index: backend/src/main/java/medora/repository/MedicalRecordRepository.java
===================================================================
--- backend/src/main/java/medora/repository/MedicalRecordRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/MedicalRecordRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -11,4 +11,9 @@
 
 public interface MedicalRecordRepository extends JpaRepository<MedicalRecord, Long> {
+
+    // recordId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new MedicalRecord.
+    @Query("SELECT COALESCE(MAX(e.recordId), 0) FROM MedicalRecord e")
+    Long findMaxRecordId();
 
     // UC005 – View Medical Record (Full history)
Index: backend/src/main/java/medora/repository/MedicalReportRepository.java
===================================================================
--- backend/src/main/java/medora/repository/MedicalReportRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/MedicalReportRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -15,4 +15,9 @@
     // This properly manages entity lifecycle and relationships
 
+    // report_id is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new MedicalReport.
+    @Query("SELECT COALESCE(MAX(mr.reportId), 0) FROM MedicalReport mr")
+    Long findMaxReportId();
+
     // UC005 – Retrieve medical reports for a medical record
     List<MedicalReport> findByMedicalRecordRecordId(Long recordId);
Index: backend/src/main/java/medora/repository/PatientRepository.java
===================================================================
--- backend/src/main/java/medora/repository/PatientRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/PatientRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -10,4 +10,13 @@
 
 public interface PatientRepository extends JpaRepository<Patient, Long> {
+
+    // patientId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new Patient.
+    @Query("SELECT COALESCE(MAX(e.patientId), 0) FROM Patient e")
+    Long findMaxPatientId();
+
+    // Login lookup: find the patient profile linked to a given user account
+    // (Patient.user_id is the foreign key, the reverse of Users->Patient)
+    Optional<Patient> findByUserUserId(Long userId);
 
     // UC004 – View Patient Profile
Index: backend/src/main/java/medora/repository/PerformedLabTestRepository.java
===================================================================
--- backend/src/main/java/medora/repository/PerformedLabTestRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/PerformedLabTestRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -10,4 +10,9 @@
 
 public interface PerformedLabTestRepository extends JpaRepository<PerformedLabTests, Long> {
+
+    // performedTestId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new PerformedLabTests.
+    @Query("SELECT COALESCE(MAX(e.performedTestId), 0) FROM PerformedLabTests e")
+    Long findMaxPerformedTestId();
 
     List<PerformedLabTests> findByPatientPatientId(Long patientId);
Index: backend/src/main/java/medora/repository/PerformedProcedureRepository.java
===================================================================
--- backend/src/main/java/medora/repository/PerformedProcedureRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/PerformedProcedureRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -13,4 +13,9 @@
 
 public interface PerformedProcedureRepository extends JpaRepository<PerformedProcedures, Long> {
+
+    // performedId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new PerformedProcedures.
+    @Query("SELECT COALESCE(MAX(e.performedId), 0) FROM PerformedProcedures e")
+    Long findMaxPerformedId();
 
     // UC016 – Record Procedure Entry
Index: backend/src/main/java/medora/repository/PrescriptionRepository.java
===================================================================
--- backend/src/main/java/medora/repository/PrescriptionRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/PrescriptionRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -11,4 +11,9 @@
 
 public interface PrescriptionRepository extends JpaRepository<Prescriptions, Long> {
+
+    // prescriptionId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new Prescriptions.
+    @Query("SELECT COALESCE(MAX(e.prescriptionId), 0) FROM Prescriptions e")
+    Long findMaxPrescriptionId();
 
     // UC012 – Record Prescription
Index: backend/src/main/java/medora/repository/ProcedureRepository.java
===================================================================
--- backend/src/main/java/medora/repository/ProcedureRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/ProcedureRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -3,6 +3,12 @@
 import medora.models.domain.Procedure;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 
 public interface ProcedureRepository extends JpaRepository<Procedure, Long> {
+
+    // procedureId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new Procedure.
+    @Query("SELECT COALESCE(MAX(e.procedureId), 0) FROM Procedure e")
+    Long findMaxProcedureId();
 }
 
Index: backend/src/main/java/medora/repository/ProcedureResultRepository.java
===================================================================
--- backend/src/main/java/medora/repository/ProcedureResultRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/ProcedureResultRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -10,13 +10,22 @@
 public interface ProcedureResultRepository extends JpaRepository<ProcedureResults, Long> {
 
+    // result_id is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new ProcedureResults.
+    @Query("SELECT COALESCE(MAX(pr.resultId), 0) FROM ProcedureResults pr")
+    Long findMaxResultId();
+
     // UC017 – Record Procedure Outcome
     List<ProcedureResults> findByProcedureProcedureId(Long procedureId);
 
-    // Find results for a specific medical record
+    // Find results for a specific medical record.
+    // The schema links a medical record to a procedure (medical_record_procedures),
+    // and a procedure to its results (procedure_results) — there is no direct
+    // record-to-result table, so this joins through the procedure in between,
+    // matching the pattern already validated for UseCase09.
     @Query("""
         SELECT pr FROM ProcedureResults pr
-        WHERE pr IN (
-            SELECT mrpr.procedureResult FROM MedicalRecordProcedureResults mrpr
-            WHERE mrpr.medicalRecord.recordId = :recordId
+        WHERE pr.procedure.procedureId IN (
+            SELECT mrp.procedure.procedureId FROM MedicalRecordProcedures mrp
+            WHERE mrp.medicalRecord.recordId = :recordId
         )
     """)
@@ -33,9 +42,9 @@
     @Query("""
         SELECT pr FROM ProcedureResults pr
-        WHERE pr IN (
-            SELECT mrpr.procedureResult FROM MedicalRecordProcedureResults mrpr
-            WHERE mrpr.medicalRecord.recordId = :recordId
+        WHERE pr.procedure.procedureId = :procedureId
+        AND pr.procedure.procedureId IN (
+            SELECT mrp.procedure.procedureId FROM MedicalRecordProcedures mrp
+            WHERE mrp.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/repository/ReferralRepository.java
===================================================================
--- backend/src/main/java/medora/repository/ReferralRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/repository/ReferralRepository.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -9,4 +9,9 @@
 
 public interface ReferralRepository extends JpaRepository<Referrals, Long> {
+
+    // referralId is NOT auto-generated by the database (supplied by the application),
+    // so callers must compute the next free ID before saving a new Referrals.
+    @Query("SELECT COALESCE(MAX(e.referralId), 0) FROM Referrals e")
+    Long findMaxReferralId();
 
     // UC019 – Create Referral Record
Index: backend/src/main/java/medora/repository/ReportAllergyRepository.java
===================================================================
--- backend/src/main/java/medora/repository/ReportAllergyRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package medora.repository;
-
-import medora.models.domain.ReportAllergy;
-import medora.models.domain.id.ReportAllergyId;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public interface ReportAllergyRepository extends JpaRepository<ReportAllergy, ReportAllergyId> {
-    List<ReportAllergy> findByReportReportId(Long reportId);
-}
Index: backend/src/main/java/medora/repository/ReportDiagnosisRepository.java
===================================================================
--- backend/src/main/java/medora/repository/ReportDiagnosisRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package medora.repository;
-
-import medora.models.domain.ReportDiagnosis;
-import medora.models.domain.id.ReportDiagnosisId;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public interface ReportDiagnosisRepository extends JpaRepository<ReportDiagnosis, ReportDiagnosisId> {
-    List<ReportDiagnosis> findByReportReportId(Long reportId);
-}
Index: backend/src/main/java/medora/repository/ReportPrescriptionRepository.java
===================================================================
--- backend/src/main/java/medora/repository/ReportPrescriptionRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package medora.repository;
-
-import medora.models.domain.ReportPrescription;
-import medora.models.domain.id.ReportPrescriptionId;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public interface ReportPrescriptionRepository extends JpaRepository<ReportPrescription, ReportPrescriptionId> {
-    List<ReportPrescription> findByReportReportId(Long reportId);
-}
Index: backend/src/main/java/medora/repository/ReportSymptomRepository.java
===================================================================
--- backend/src/main/java/medora/repository/ReportSymptomRepository.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package medora.repository;
-
-import medora.models.domain.ReportSymptom;
-import medora.models.domain.id.ReportSymptomId;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public interface ReportSymptomRepository extends JpaRepository<ReportSymptom, ReportSymptomId> {
-    List<ReportSymptom> findByReportReportId(Long reportId);
-}
Index: backend/src/main/java/medora/service/AppointmentService.java
===================================================================
--- backend/src/main/java/medora/service/AppointmentService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/AppointmentService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -121,4 +121,5 @@
         Appointment appointment = new Appointment();
 
+        appointment.setAppointmentId(appointmentRepository.findMaxAppointmentId() + 1);
         appointment.setPatient(patient);
         appointment.setDoctor(doctor);
Index: backend/src/main/java/medora/service/AuthService.java
===================================================================
--- backend/src/main/java/medora/service/AuthService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/AuthService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -3,4 +3,6 @@
 import medora.models.domain.User;
 import medora.repository.UserRepository;
+import medora.repository.DoctorRepository;
+import medora.repository.PatientRepository;
 import medora.util.JwtUtil;
 import org.slf4j.Logger;
@@ -21,9 +23,17 @@
 
     private final UserRepository userRepository;
+    private final DoctorRepository doctorRepository;
+    private final PatientRepository patientRepository;
     private final JwtUtil jwtUtil;
     private final PasswordEncoder passwordEncoder;
 
-    public AuthService(UserRepository userRepository, JwtUtil jwtUtil, PasswordEncoder passwordEncoder) {
+    public AuthService(UserRepository userRepository,
+                       DoctorRepository doctorRepository,
+                       PatientRepository patientRepository,
+                       JwtUtil jwtUtil,
+                       PasswordEncoder passwordEncoder) {
         this.userRepository = userRepository;
+        this.doctorRepository = doctorRepository;
+        this.patientRepository = patientRepository;
         this.jwtUtil = jwtUtil;
         this.passwordEncoder = passwordEncoder;
@@ -58,6 +68,13 @@
         }
 
-        Long patientId = user.getPatient() != null ? user.getPatient().getPatientId() : null;
-        Long doctorId = user.getDoctor() != null ? user.getDoctor().getDoctorId() : null;
+        // Patient/Doctor no longer carry a reverse pointer on User — the FK
+        // lives the other way round (Patient.user_id / Doctors.user_id), so
+        // the linked profile (if any) is looked up by user_id instead.
+        Long patientId = patientRepository.findByUserUserId(user.getUserId())
+                .map(p -> p.getPatientId())
+                .orElse(null);
+        Long doctorId = doctorRepository.findByUserUserId(user.getUserId())
+                .map(d -> d.getDoctorId())
+                .orElse(null);
         String token = jwtUtil.generateTokenWithDoctorId(user.getUsername(), user.getRole(), user.getUserId(), patientId, doctorId);
 
Index: backend/src/main/java/medora/service/BillingService.java
===================================================================
--- backend/src/main/java/medora/service/BillingService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/BillingService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -91,11 +91,9 @@
 
         Billing billing = new Billing();
+        billing.setBillId(billingRepository.findMaxBillId() + 1);
         billing.setMedicalRecord(medicalRecord);
+        billing.setTotalCost(totalCost);
         billing.setAdmin(admin);
-        billing.setTotalCost(totalCost);
         billing.setPaymentStatus(PaymentStatus.PENDING);
-
-        logger.info("Generating billing record for medical record ID: {} with total cost: {}",
-                medicalRecordId, totalCost);
         return billingRepository.save(billing);
     }
@@ -292,4 +290,5 @@
                         logger.info("Creating new medical record for patient {}", patientId);
                         MedicalRecord newRecord = new MedicalRecord();
+                        newRecord.setRecordId(medicalRecordRepository.findMaxRecordId() + 1);
                         newRecord.setPatient(patientRepository.findById(patientId)
                                 .orElseThrow(() -> new RuntimeException("Patient not found with ID: " + patientId)));
@@ -354,4 +353,5 @@
                 // Create new billing record
                 billing = new Billing();
+                billing.setBillId(billingRepository.findMaxBillId() + 1);
                 billing.setMedicalRecord(medicalRecord);
                 billing.setAdmin(admin);
@@ -369,10 +369,9 @@
             // Link procedures to billing (only if not already linked)
             for (PerformedProcedures procedure : procedures) {
-                try {
+                if (!billingProceduresRepository.existsByBillingBillIdAndProcedureProcedureId(
+                        savedBilling.getBillId(), procedure.getProcedure().getProcedureId())) {
                     BillingProcedures billingProcedure = new BillingProcedures(savedBilling, procedure.getProcedure());
                     billingProceduresRepository.save(billingProcedure);
                     logger.debug("Linked procedure {} to billing {}", procedure.getProcedure().getProcedureId(), savedBilling.getBillId());
-                } catch (Exception e) {
-                    logger.debug("Procedure {} already linked to billing {}", procedure.getProcedure().getProcedureId(), savedBilling.getBillId());
                 }
             }
@@ -380,10 +379,9 @@
             // Link lab tests to billing (only if not already linked)
             for (PerformedLabTests labTest : labTests) {
-                try {
+                if (!billingLabTestsRepository.existsByBillingBillIdAndLabTestTestId(
+                        savedBilling.getBillId(), labTest.getLabTest().getTestId())) {
                     BillingLabTests billingLabTest = new BillingLabTests(savedBilling, labTest.getLabTest());
                     billingLabTestsRepository.save(billingLabTest);
                     logger.debug("Linked lab test {} to billing {}", labTest.getLabTest().getTestId(), savedBilling.getBillId());
-                } catch (Exception e) {
-                    logger.debug("Lab test {} already linked to billing {}", labTest.getLabTest().getTestId(), savedBilling.getBillId());
                 }
             }
Index: backend/src/main/java/medora/service/DiagnosisService.java
===================================================================
--- backend/src/main/java/medora/service/DiagnosisService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/DiagnosisService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -60,4 +60,5 @@
 
         Diagnosis diagnosis = new Diagnosis();
+        diagnosis.setDiagnosisId(diagnosisRepository.findMaxDiagnosisId() + 1);
         diagnosis.setName(diagnosisName);
         diagnosis.setDescription(description);
Index: backend/src/main/java/medora/service/DoctorService.java
===================================================================
--- backend/src/main/java/medora/service/DoctorService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/DoctorService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -3,8 +3,11 @@
 import medora.models.domain.Doctors;
 import medora.models.domain.Departments;
+import medora.models.domain.User;
 import medora.repository.DoctorRepository;
 import medora.repository.DepartmentRepository;
+import medora.repository.UserRepository;
 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;
@@ -24,9 +27,15 @@
     private final DoctorRepository doctorRepository;
     private final DepartmentRepository departmentRepository;
+    private final UserRepository userRepository;
+    private final PasswordEncoder passwordEncoder;
 
     public DoctorService(DoctorRepository doctorRepository,
-                         DepartmentRepository departmentRepository) {
+                         DepartmentRepository departmentRepository,
+                         UserRepository userRepository,
+                         PasswordEncoder passwordEncoder) {
         this.doctorRepository = doctorRepository;
         this.departmentRepository = departmentRepository;
+        this.userRepository = userRepository;
+        this.passwordEncoder = passwordEncoder;
     }
 
@@ -119,5 +128,5 @@
      */
     @Transactional
-    public Doctors createDoctor(Doctors doctor) {
+    public Doctors createDoctor(Doctors doctor, String username, String rawPassword) {
 
         if (doctor == null) {
@@ -139,4 +148,12 @@
         if (doctor.getDepartment() == null || doctor.getDepartment().getDepartmentId() == null) {
             throw new IllegalArgumentException("Doctor department is required");
+        }
+
+        if (username == null || username.isBlank()) {
+            throw new IllegalArgumentException("Username is required");
+        }
+
+        if (rawPassword == null || rawPassword.isBlank()) {
+            throw new IllegalArgumentException("Password is required");
         }
 
@@ -144,4 +161,8 @@
         if (doctorRepository.findByEmailAddress(doctor.getEmailAddress()).isPresent()) {
             throw new RuntimeException("Doctor with this email already exists");
+        }
+
+        if (userRepository.existsByUsername(username)) {
+            throw new RuntimeException("Username already taken");
         }
 
@@ -153,4 +174,18 @@
         doctor.setDepartment(department);
 
+        // Create the login account first (user_id is DB-generated), since
+        // Doctors.user_id is a required foreign key pointing to it.
+        User user = new User();
+        user.setUsername(username);
+        user.setPassword(passwordEncoder.encode(rawPassword));
+        user.setRole("DOCTOR");
+        user.setFirstName(doctor.getFirstName());
+        user.setLastName(doctor.getLastName());
+        user.setIsActive(true);
+        User savedUser = userRepository.save(user);
+
+        doctor.setUser(savedUser);
+        doctor.setDoctorId(doctorRepository.findMaxDoctorId() + 1);
+
         logger.info("Creating new doctor: {} {}", doctor.getFirstName(), doctor.getLastName());
 
Index: backend/src/main/java/medora/service/LabService.java
===================================================================
--- backend/src/main/java/medora/service/LabService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/LabService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -66,4 +66,5 @@
 
         LabTests labTest = new LabTests();
+        labTest.setTestId(labTestRepository.findMaxTestId() + 1);
         labTest.setTestName(testName);
         labTest.setDescription(description);
@@ -113,4 +114,5 @@
                                                       Long doctorId,
                                                       Long testId,
+                                                      Long technicianId,
                                                       LocalDate testDate,
                                                       String notes) {
@@ -124,4 +126,7 @@
             throw new IllegalArgumentException("Invalid test ID");
 
+        if (technicianId == null || technicianId <= 0)
+            throw new IllegalArgumentException("Invalid lab technician ID");
+
         Patient patient = patientRepository.findById(patientId)
                 .orElseThrow(() -> new RuntimeException("Patient not found"));
@@ -133,8 +138,13 @@
                 .orElseThrow(() -> new RuntimeException("Lab test not found"));
 
+        LabTechnician technician = labTechnicianRepository.findById(technicianId)
+                .orElseThrow(() -> new RuntimeException("Lab technician not found"));
+
         PerformedLabTests performedTest = new PerformedLabTests();
+        performedTest.setPerformedTestId(performedLabTestRepository.findMaxPerformedTestId() + 1);
         performedTest.setPatient(patient);
         performedTest.setDoctor(doctor);
         performedTest.setLabTest(test);
+        performedTest.setTechnician(technician);
         LocalDate finalTestDate = testDate != null ? testDate : LocalDate.now();
         performedTest.setTestDate(finalTestDate);
@@ -189,4 +199,8 @@
             throw new IllegalArgumentException("Results required");
 
+        LocalDate finalResultDate = resultDate != null ? resultDate : LocalDate.now();
+        if (finalResultDate.isAfter(LocalDate.now()))
+            throw new IllegalArgumentException("Result date cannot be in the future");
+
         MedicalRecord medicalRecord = medicalRecordRepository.findById(medicalRecordId)
                 .orElseThrow(() -> new RuntimeException("Medical record not found"));
@@ -196,6 +210,7 @@
 
         LabResults labResult = new LabResults();
+        labResult.setResultId(labResultsRepository.findMaxResultId() + 1);
         labResult.setResults(results);
-        labResult.setResultDate(resultDate);
+        labResult.setResultDate(finalResultDate);
         labResult.setLabTest(labTest);
 
Index: backend/src/main/java/medora/service/MedicalReportService.java
===================================================================
--- backend/src/main/java/medora/service/MedicalReportService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/MedicalReportService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -10,8 +10,6 @@
 
 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;
 
@@ -20,4 +18,13 @@
  * UC018 – Create Medical Report
  * OPTIONAL - Use only if needed
+ *
+ * NOTE: This service was refactored to match the final database schema, which
+ * has no report_diagnosis / report_prescription / report_allergy / report_symptom
+ * junction tables. A medical report therefore no longer stores its own
+ * per-report subset of diagnoses/prescriptions/allergies/symptoms — instead,
+ * a "comprehensive report" simply reflects everything already linked to the
+ * report's underlying medical record (via Diagnosis.patient, PrescriptionMedicalRecord,
+ * MedicalRecordAllergies, and MedicalRecordSymptoms), the same way the record's
+ * data is shown elsewhere in the application.
  */
 @Service
@@ -33,11 +40,4 @@
     private final MedicalRecordAllergyRepository medicalRecordAllergyRepository;
     private final MedicalRecordSymptomRepository symptomRepository;
-    private final ReportDiagnosisRepository reportDiagnosisRepository;
-    private final ReportPrescriptionRepository reportPrescriptionRepository;
-    private final ReportAllergyRepository reportAllergyRepository;
-    private final ReportSymptomRepository reportSymptomRepository;
-    private final PrescriptionRepository prescriptionRepository;
-    private final AllergyRepository allergyRepository;
-    private final SymptomRepository symptomDbRepository;
 
     public MedicalReportService(MedicalReportRepository medicalReportRepository,
@@ -47,12 +47,5 @@
                                 PrescriptionMedicalRecordRepository prescriptionMedicalRecordRepository,
                                 MedicalRecordAllergyRepository medicalRecordAllergyRepository,
-                                MedicalRecordSymptomRepository symptomRepository,
-                                ReportDiagnosisRepository reportDiagnosisRepository,
-                                ReportPrescriptionRepository reportPrescriptionRepository,
-                                ReportAllergyRepository reportAllergyRepository,
-                                ReportSymptomRepository reportSymptomRepository,
-                                PrescriptionRepository prescriptionRepository,
-                                AllergyRepository allergyRepository,
-                                SymptomRepository symptomDbRepository) {
+                                MedicalRecordSymptomRepository symptomRepository) {
         this.medicalReportRepository = medicalReportRepository;
         this.doctorRepository = doctorRepository;
@@ -62,16 +55,10 @@
         this.medicalRecordAllergyRepository = medicalRecordAllergyRepository;
         this.symptomRepository = symptomRepository;
-        this.reportDiagnosisRepository = reportDiagnosisRepository;
-        this.reportPrescriptionRepository = reportPrescriptionRepository;
-        this.reportAllergyRepository = reportAllergyRepository;
-        this.reportSymptomRepository = reportSymptomRepository;
-        this.prescriptionRepository = prescriptionRepository;
-        this.allergyRepository = allergyRepository;
-        this.symptomDbRepository = symptomDbRepository;
     }
 
     /**
      * UC018 – Create Medical Report
-     * Create a medical report describing a patient's visit and condition
+     * Create a medical report describing a patient's visit and condition.
+     * report_id is not database-generated, so the next free ID is computed here.
      */
     @Transactional
@@ -98,6 +85,6 @@
 
         MedicalReport report = new MedicalReport();
-        // Let JPA auto-generate the ID using the sequence
-        report.setReportId(null);
+        Long nextReportId = medicalReportRepository.findMaxReportId() + 1;
+        report.setReportId(nextReportId);
         report.setDoctor(doctor);
         report.setMedicalRecord(medicalRecord);
@@ -111,5 +98,10 @@
 
     /**
-     * Create a medical report with selected diagnoses, prescriptions, allergies, and symptoms
+     * Create a medical report, optionally validating that the given diagnosis,
+     * prescription, allergy, and symptom IDs are actually linked to the medical
+     * record. The schema has no table to persist a report-specific subset of
+     * these items, so they are only used here as a validation step — the
+     * resulting comprehensive report will reflect everything on the record,
+     * not just the IDs passed in.
      */
     @Transactional
@@ -119,49 +111,55 @@
             List<Long> selectedAllergyIds, List<Long> selectedSymptomIds) {
 
-        // Create the base report
-        MedicalReport report = createMedicalReport(doctorId, medicalRecordId, description, reportDate);
-
-        // Store selected diagnoses
+        MedicalRecord medicalRecord = medicalRecordRepository.findById(medicalRecordId)
+                .orElseThrow(() -> new RuntimeException("Medical record not found with ID: " + medicalRecordId));
+
         if (selectedDiagnosisIds != null) {
             for (Long diagnosisId : selectedDiagnosisIds) {
-                Diagnosis diagnosis = diagnosisRepository.findById(diagnosisId)
+                diagnosisRepository.findById(diagnosisId)
                         .orElseThrow(() -> new RuntimeException("Diagnosis not found with ID: " + diagnosisId));
-                ReportDiagnosis reportDiagnosis = new ReportDiagnosis(report, diagnosis);
-                reportDiagnosisRepository.save(reportDiagnosis);
             }
         }
 
-        // Store selected prescriptions
         if (selectedPrescriptionIds != null) {
             for (Long prescriptionId : selectedPrescriptionIds) {
-                Prescriptions prescription = prescriptionRepository.findById(prescriptionId)
-                        .orElseThrow(() -> new RuntimeException("Prescription not found with ID: " + prescriptionId));
-                ReportPrescription reportPrescription = new ReportPrescription(report, prescription);
-                reportPrescriptionRepository.save(reportPrescription);
+                PrescriptionMedicalRecord pmr = prescriptionMedicalRecordRepository
+                        .findByMedicalRecordAndPrescription(medicalRecordId, prescriptionId);
+                if (pmr == null) {
+                    throw new RuntimeException("Prescription " + prescriptionId
+                            + " is not linked to medical record " + medicalRecordId);
+                }
             }
         }
 
-        // Store selected allergies
         if (selectedAllergyIds != null) {
             for (Long allergyId : selectedAllergyIds) {
-                Allergies allergy = allergyRepository.findById(allergyId)
-                        .orElseThrow(() -> new RuntimeException("Allergy not found with ID: " + allergyId));
-                ReportAllergy reportAllergy = new ReportAllergy(report, allergy);
-                reportAllergyRepository.save(reportAllergy);
+                boolean exists = medicalRecordAllergyRepository
+                        .existsByMedicalRecordRecordIdAndAllergyAllergyId(medicalRecordId, allergyId);
+                if (!exists) {
+                    throw new RuntimeException("Allergy " + allergyId
+                            + " is not linked to medical record " + medicalRecordId);
+                }
             }
         }
 
-        // Store selected symptoms
         if (selectedSymptomIds != null) {
             for (Long symptomId : selectedSymptomIds) {
-                Symptoms symptom = symptomDbRepository.findById(symptomId)
-                        .orElseThrow(() -> new RuntimeException("Symptom not found with ID: " + symptomId));
-                ReportSymptom reportSymptom = new ReportSymptom(report, symptom);
-                reportSymptomRepository.save(reportSymptom);
+                boolean exists = symptomRepository
+                        .existsByMedicalRecordRecordIdAndSymptomSymptomId(medicalRecordId, symptomId);
+                if (!exists) {
+                    throw new RuntimeException("Symptom " + symptomId
+                            + " is not linked to medical record " + medicalRecordId);
+                }
             }
         }
 
-        logger.info("Created medical report with selected items for record ID: {}", medicalRecordId);
-        return report;
+        logger.info("Creating medical report for record ID: {} (validated {} diagnoses, {} prescriptions, "
+                        + "{} allergies, {} symptoms already on the record)", medicalRecordId,
+                selectedDiagnosisIds == null ? 0 : selectedDiagnosisIds.size(),
+                selectedPrescriptionIds == null ? 0 : selectedPrescriptionIds.size(),
+                selectedAllergyIds == null ? 0 : selectedAllergyIds.size(),
+                selectedSymptomIds == null ? 0 : selectedSymptomIds.size());
+
+        return createMedicalReport(doctorId, medicalRecordId, description, reportDate);
     }
 
@@ -279,5 +277,7 @@
 
     /**
-     * Build a comprehensive report DTO with all medical data
+     * Build a comprehensive report DTO with all medical data linked to the
+     * report's underlying medical record (diagnoses by patient, prescriptions,
+     * allergies, and symptoms already recorded on that record).
      */
     private ComprehensiveMedicalReportDTO buildComprehensiveReport(MedicalReport report) {
@@ -285,9 +285,7 @@
         Patient patient = report.getMedicalRecord().getPatient();
 
-        // Get selected diagnoses from linking table
-        List<ReportDiagnosis> reportDiagnoses = reportDiagnosisRepository.findByReportReportId(report.getReportId());
-        List<Diagnosis> diagnoses = reportDiagnoses.stream()
-                .map(ReportDiagnosis::getDiagnosis)
-                .collect(Collectors.toList());
+        // Diagnoses: diagnosis links directly to a patient in this schema,
+        // there is no separate report-specific selection table.
+        List<Diagnosis> diagnoses = diagnosisRepository.findByPatientPatientId(patient.getPatientId());
 
         List<DiagnosisDTO> diagnosisDTOs = diagnoses.stream()
@@ -303,13 +301,7 @@
                 .collect(Collectors.toList());
 
-        // Get selected prescriptions from linking table
-        List<ReportPrescription> reportPrescriptions = reportPrescriptionRepository.findByReportReportId(report.getReportId());
-        List<PrescriptionMedicalRecord> prescriptions = new java.util.ArrayList<>();
-        for (ReportPrescription rp : reportPrescriptions) {
-            // Find the corresponding PrescriptionMedicalRecord entry
-            List<PrescriptionMedicalRecord> pmr = prescriptionMedicalRecordRepository.findByMedicalRecordRecordIdAndPrescriptionPrescriptionId(
-                    medicalRecordId, rp.getPrescription().getPrescriptionId());
-            prescriptions.addAll(pmr);
-        }
+        // Prescriptions already linked to this medical record.
+        List<PrescriptionMedicalRecord> prescriptions =
+                prescriptionMedicalRecordRepository.findByMedicalRecordRecordId(medicalRecordId);
 
         List<PrescriptionDTO> prescriptionDTOs = prescriptions.stream()
@@ -325,13 +317,7 @@
                 .collect(Collectors.toList());
 
-        // Get selected allergies from linking table
-        List<ReportAllergy> reportAllergies = reportAllergyRepository.findByReportReportId(report.getReportId());
-        List<MedicalRecordAllergies> allergies = new java.util.ArrayList<>();
-        for (ReportAllergy ra : reportAllergies) {
-            // Find the corresponding MedicalRecordAllergies entry
-            List<MedicalRecordAllergies> mra = medicalRecordAllergyRepository.findByMedicalRecordRecordIdAndAllergyAllergyId(
-                    medicalRecordId, ra.getAllergy().getAllergyId());
-            allergies.addAll(mra);
-        }
+        // Allergies already linked to this medical record.
+        List<MedicalRecordAllergies> allergies =
+                medicalRecordAllergyRepository.findByMedicalRecordRecordId(medicalRecordId);
 
         List<AllergyDTO> allergyDTOs = allergies.stream()
@@ -344,13 +330,7 @@
                 .collect(Collectors.toList());
 
-        // Get selected symptoms from linking table
-        List<ReportSymptom> reportSymptoms = reportSymptomRepository.findByReportReportId(report.getReportId());
-        List<MedicalRecordSymptoms> symptoms = new java.util.ArrayList<>();
-        for (ReportSymptom rs : reportSymptoms) {
-            // Find the corresponding MedicalRecordSymptoms entry
-            List<MedicalRecordSymptoms> mrs = symptomRepository.findByMedicalRecordRecordIdAndSymptomSymptomId(
-                    medicalRecordId, rs.getSymptom().getSymptomId());
-            symptoms.addAll(mrs);
-        }
+        // Symptoms already linked to this medical record.
+        List<MedicalRecordSymptoms> symptoms =
+                symptomRepository.findByMedicalRecordRecordId(medicalRecordId);
 
         List<SymptomDTO> symptomDTOs = symptoms.stream()
Index: backend/src/main/java/medora/service/PatientService.java
===================================================================
--- backend/src/main/java/medora/service/PatientService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/PatientService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -4,8 +4,11 @@
 import medora.models.domain.Patient;
 import medora.models.domain.MedicalRecord;
+import medora.models.domain.User;
 import medora.repository.PatientRepository;
 import medora.repository.MedicalRecordRepository;
+import medora.repository.UserRepository;
 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;
@@ -26,9 +29,15 @@
     private final PatientRepository patientRepository;
     private final MedicalRecordRepository medicalRecordRepository;
+    private final UserRepository userRepository;
+    private final PasswordEncoder passwordEncoder;
 
     public PatientService(PatientRepository patientRepository,
-                         MedicalRecordRepository medicalRecordRepository) {
+                         MedicalRecordRepository medicalRecordRepository,
+                         UserRepository userRepository,
+                         PasswordEncoder passwordEncoder) {
         this.patientRepository = patientRepository;
         this.medicalRecordRepository = medicalRecordRepository;
+        this.userRepository = userRepository;
+        this.passwordEncoder = passwordEncoder;
     }
 
@@ -85,5 +94,5 @@
      */
     @Transactional
-    public Patient createPatient(Patient patient) {
+    public Patient createPatient(Patient patient, String rawPassword) {
         if (patient == null || patient.getEmbg() == null || patient.getEmbg().isBlank()) {
             throw new IllegalArgumentException("Patient EMBG is required");
@@ -95,4 +104,27 @@
             throw new IllegalArgumentException("Patient last name is required");
         }
+        if (rawPassword == null || rawPassword.isBlank()) {
+            throw new IllegalArgumentException("Password is required");
+        }
+
+        // Patients log in using their EMBG as username, matching the
+        // convention already established across the application.
+        if (userRepository.existsByUsername(patient.getEmbg())) {
+            throw new RuntimeException("A user account for this EMBG already exists");
+        }
+
+        // Create the login account first (user_id is DB-generated), since
+        // Patient.user_id is a required foreign key pointing to it.
+        User user = new User();
+        user.setUsername(patient.getEmbg());
+        user.setPassword(passwordEncoder.encode(rawPassword));
+        user.setRole("PATIENT");
+        user.setFirstName(patient.getFirstName());
+        user.setLastName(patient.getLastName());
+        user.setIsActive(true);
+        User savedUser = userRepository.save(user);
+
+        patient.setUser(savedUser);
+        patient.setPatientId(patientRepository.findMaxPatientId() + 1);
 
         logger.info("Creating new patient with EMBG: {}", patient.getEmbg());
@@ -102,9 +134,11 @@
         try {
             MedicalRecord medicalRecord = new MedicalRecord();
+            medicalRecord.setRecordId(medicalRecordRepository.findMaxRecordId() + 1);
             medicalRecord.setPatient(savedPatient);
             medicalRecordRepository.save(medicalRecord);
             logger.info("Created medical record for patient ID: {}", savedPatient.getPatientId());
         } catch (Exception e) {
-            logger.error("Failed to create medical record for patient: {}", e.getMessage());
+            logger.error("Failed to create medical record for patient {}", savedPatient.getPatientId(), e);
+            throw e;
         }
 
@@ -156,4 +190,5 @@
                 if (!hasRecord) {
                     MedicalRecord medicalRecord = new MedicalRecord();
+                    medicalRecord.setRecordId(medicalRecordRepository.findMaxRecordId() + 1);
                     medicalRecord.setPatient(patient);
                     medicalRecordRepository.save(medicalRecord);
Index: backend/src/main/java/medora/service/PrescriptionService.java
===================================================================
--- backend/src/main/java/medora/service/PrescriptionService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/PrescriptionService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -58,4 +58,5 @@
 
         Prescriptions prescription = new Prescriptions();
+        prescription.setPrescriptionId(prescriptionRepository.findMaxPrescriptionId() + 1);
         prescription.setMedicationName(medicationName);
 
Index: backend/src/main/java/medora/service/ProcedureService.java
===================================================================
--- backend/src/main/java/medora/service/ProcedureService.java	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/ProcedureService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -27,5 +27,4 @@
     private final MedicalRecordProcedureRepository medicalRecordProcedureRepository;
     private final ProcedureResultRepository procedureResultRepository;
-    private final MedicalRecordProcedureResultRepository medicalRecordProcedureResultRepository;
     private final EntityManager entityManager;
     private final BillingService billingService;
@@ -39,5 +38,4 @@
                             MedicalRecordProcedureRepository medicalRecordProcedureRepository,
                             ProcedureResultRepository procedureResultRepository,
-                            MedicalRecordProcedureResultRepository medicalRecordProcedureResultRepository,
                             EntityManager entityManager,
                             BillingService billingService) {
@@ -51,5 +49,4 @@
         this.medicalRecordProcedureRepository = medicalRecordProcedureRepository;
         this.procedureResultRepository = procedureResultRepository;
-        this.medicalRecordProcedureResultRepository = medicalRecordProcedureResultRepository;
         this.entityManager = entityManager;
         this.billingService = billingService;
@@ -87,4 +84,5 @@
 
         PerformedProcedures performed = new PerformedProcedures();
+        performed.setPerformedId(performedProcedureRepository.findMaxPerformedId() + 1);
         performed.setProcedure(procedure);
         performed.setDoctor(doctor);
@@ -138,4 +136,5 @@
 
         PerformedProcedures performed = new PerformedProcedures();
+        performed.setPerformedId(performedProcedureRepository.findMaxPerformedId() + 1);
         performed.setProcedure(procedure);
         performed.setDoctor(doctor);
@@ -312,14 +311,23 @@
             // Create new result
             result = new ProcedureResults();
+            Long nextResultId = procedureResultRepository.findMaxResultId() + 1;
+            result.setResultId(nextResultId);
             result.setProcedure(procedure);
             result.setResultDescription(resultDescription);
             result.setResultDate(resultDate);
 
-            // Save result first to generate ID
+            // Save result
             ProcedureResults savedResult = procedureResultRepository.save(result);
 
-            // Then link to medical record
-            MedicalRecordProcedureResults link = new MedicalRecordProcedureResults(record, savedResult);
-            medicalRecordProcedureResultRepository.save(link);
+            // Ensure the catalog procedure is linked to this medical record, so the
+            // result becomes visible there (procedure_results only carries a
+            // procedure_id, not a record_id — the schema has no direct link between
+            // a medical record and a specific result, only between a medical record
+            // and the catalog procedure, matching the pattern validated for UseCase09).
+            boolean alreadyLinked = medicalRecordProcedureRepository
+                    .existsByMedicalRecordRecordIdAndProcedureProcedureId(medicalRecordId, procedureId);
+            if (!alreadyLinked) {
+                medicalRecordProcedureRepository.linkProcedure(medicalRecordId, procedureId);
+            }
             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 cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/java/medora/service/ReferralService.java	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -88,4 +88,5 @@
 
         Referrals referral = new Referrals();
+        referral.setReferralId(referralRepository.findMaxReferralId() + 1);
         referral.setMedicalRecord(medicalRecord);
         referral.setFromDoctor(fromDoctor);
@@ -93,6 +94,4 @@
         referral.setReason(reason);
         referral.setReferralDate(referralDate);
-        referral.setAppointmentDate(appointmentDate);
-        referral.setAppointmentTime(appointmentTime);
 
         logger.info("Creating referral for medical record ID: {} from doctor ID: {} to doctor ID: {}",
Index: backend/src/main/resources/application-local.properties
===================================================================
--- backend/src/main/resources/application-local.properties	(revision 48d2bedc68ea10341495edcd217325613e05065f)
+++ backend/src/main/resources/application-local.properties	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -0,0 +1,5 @@
+# PostgreSQL via Docker/local environment
+spring.datasource.url=jdbc:postgresql://localhost:5433/${DB_LOCAL_NAME}
+spring.datasource.username=${DB_LOCAL_USERNAME}
+spring.datasource.password=${DB_LOCAL_PASSWORD}
+spring.datasource.driver-class-name=org.postgresql.Driver
Index: backend/src/main/resources/application-remote.properties
===================================================================
--- backend/src/main/resources/application-remote.properties	(revision 48d2bedc68ea10341495edcd217325613e05065f)
+++ backend/src/main/resources/application-remote.properties	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -0,0 +1,5 @@
+# Remote PostgreSQL environment
+spring.datasource.url=jdbc:postgresql://localhost:9999/${DB_REMOTE_NAME}
+spring.datasource.username=${DB_REMOTE_USERNAME}
+spring.datasource.password=${DB_REMOTE_PASSWORD}
+spring.datasource.driver-class-name=org.postgresql.Driver
Index: backend/src/main/resources/application.properties
===================================================================
--- backend/src/main/resources/application.properties	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ backend/src/main/resources/application.properties	(revision 48d2bedc68ea10341495edcd217325613e05065f)
@@ -1,12 +1,13 @@
 spring.application.name=medora
+server.port=8081
+spring.profiles.active=remote
+spring.config.import=optional:file:.env.properties
+
+spring.servlet.multipart.max-file-size=5MB
+spring.servlet.multipart.max-request-size=6MB
 
 # Spring Security - Development credentials
 spring.security.user.name=admin
-spring.security.user.password=admin123
-
-spring.datasource.url=jdbc:postgresql://localhost:5432/medora
-spring.datasource.username=medora_app
-spring.datasource.password=postgres
-spring.datasource.driver-class-name=org.postgresql.Driver
+spring.security.user.password=${DB_PASSWORD}
 
 # JWT Configuration
@@ -15,8 +16,18 @@
 
 # JPA / Hibernate settings
-spring.jpa.hibernate.ddl-auto=update
+spring.jpa.hibernate.ddl-auto=none
 spring.jpa.show-sql=true
+spring.jpa.open-in-view=true
 spring.jpa.properties.hibernate.format_sql=true
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+
+# HikariCP connection pool settings
+spring.datasource.hikari.maximum-pool-size=20
+spring.datasource.hikari.minimum-idle=5
+spring.datasource.hikari.connection-timeout=20000
+spring.datasource.hikari.idle-timeout=300000
+spring.datasource.hikari.max-lifetime=1200000
+spring.datasource.hikari.auto-commit=true
+spring.datasource.hikari.leak-detection-threshold=60000
 
 # Jackson serialization settings
Index: backend/src/main/resources/db/phase7/verify_section2_deployment.sql
===================================================================
--- backend/src/main/resources/db/phase7/verify_section2_deployment.sql	(revision cdcff72e9765342b84a5e4b5d98ca5cb050a5500)
+++ 	(revision )
@@ -1,130 +1,0 @@
--- ============================================================================
--- Section 2: Appointment Scheduling Integrity - Deployment Verification
--- ============================================================================
-
--- 1. Check triggers on appointments table
--- ============================================================================
--- === 1. TRIGGERS ON APPOINTMENTS TABLE ===
-SELECT
-    tgname as trigger_name,
-    CASE WHEN tgdisabled = 0 THEN 'ENABLED' ELSE 'DISABLED' END as status
-FROM pg_trigger
-WHERE tgrelid = 'appointments'::regclass
-ORDER BY tgname;
-
--- 2. Check trigger functions
--- ============================================================================
--- === 2. TRIGGER FUNCTIONS ===
-SELECT
-    proname as function_name,
-    pronargs as parameter_count,
-    prokind as kind
-FROM pg_proc
-WHERE proname IN ('trigger_appointments_enforce', 'trigger_appointments_no_overlap', 'is_valid_appointment_transition')
-ORDER BY proname;
-
--- 3. Check background job procedure
--- ============================================================================
--- === 3. BACKGROUND JOB PROCEDURE ===
-SELECT
-    proname as procedure_name,
-    prokind as kind,
-    'PL/pgSQL' as language
-FROM pg_proc
-WHERE proname = 'job_mark_no_show';
-
--- 4. Check view
--- ============================================================================
--- === 4. VIEWS ===
-SELECT
-    viewname as view_name,
-    schemaname as schema_name
-FROM pg_views
-WHERE viewname = 'v_overdue_appointments';
-
--- 5. Check appointment status constraint
--- ============================================================================
--- === 5. STATUS CONSTRAINT (CHECK) ===
-SELECT
-    constraint_name,
-    constraint_type,
-    table_name
-FROM information_schema.table_constraints
-WHERE table_name = 'appointments'
-  AND constraint_type = 'CHECK'
-  AND constraint_name LIKE '%status%';
-
--- 6. Verify constraint includes NO_SHOW
--- ============================================================================
--- === 6. CONSTRAINT DEFINITION ===
-SELECT
-    constraint_name,
-    check_clause
-FROM information_schema.check_constraints
-WHERE constraint_name = 'appointments_status_chk';
-
--- 7. Test appointment status values
--- ============================================================================
--- === 7. VALID APPOINTMENT STATUSES ===
-SELECT 'SCHEDULED' as status
-UNION ALL
-SELECT 'IN_PROGRESS'
-UNION ALL
-SELECT 'COMPLETED'
-UNION ALL
-SELECT 'CANCELLED'
-UNION ALL
-SELECT 'NO_SHOW'
-ORDER BY status;
-
--- 8. Summary Statistics
--- ============================================================================
--- === 8. DEPLOYMENT SUMMARY ===
-SELECT
-    'Triggers' as component,
-    COUNT(*) as count
-FROM pg_trigger
-WHERE tgrelid = 'appointments'::regclass
-UNION ALL
-SELECT
-    'Trigger Functions' as component,
-    COUNT(*) as count
-FROM pg_proc
-WHERE proname IN ('trigger_appointments_enforce', 'trigger_appointments_no_overlap')
-UNION ALL
-SELECT
-    'Validation Functions' as component,
-    COUNT(*) as count
-FROM pg_proc
-WHERE proname = 'is_valid_appointment_transition'
-UNION ALL
-SELECT
-    'Background Procedures' as component,
-    COUNT(*) as count
-FROM pg_proc
-WHERE proname = 'job_mark_no_show'
-UNION ALL
-SELECT
-    'Views' as component,
-    COUNT(*) as count
-FROM pg_views
-WHERE viewname = 'v_overdue_appointments'
-ORDER BY component;
-
--- 9. Test the transition validation function
--- ============================================================================
--- === 9. STATUS TRANSITION VALIDATION TEST ===
-SELECT
-    'SCHEDULED → IN_PROGRESS' as transition,
-    is_valid_appointment_transition('SCHEDULED', 'IN_PROGRESS') as valid
-UNION ALL
-SELECT 'SCHEDULED → COMPLETED', is_valid_appointment_transition('SCHEDULED', 'COMPLETED')
-UNION ALL
-SELECT 'SCHEDULED → CANCELLED', is_valid_appointment_transition('SCHEDULED', 'CANCELLED')
-UNION ALL
-SELECT 'IN_PROGRESS → COMPLETED', is_valid_appointment_transition('IN_PROGRESS', 'COMPLETED')
-UNION ALL
-SELECT 'COMPLETED → SCHEDULED', is_valid_appointment_transition('COMPLETED', 'SCHEDULED')
-UNION ALL
-SELECT 'COMPLETED → COMPLETED', is_valid_appointment_transition('COMPLETED', 'COMPLETED')
-ORDER BY transition;
