Index: src/main/java/apps/spring/reportium/entity/Person.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/Person.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/entity/Person.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -61,3 +61,7 @@
     private String contactPhone;
 
+    @Override
+    public String toString() {
+        return name + ' ' + surname;
+    }
 }
Index: src/main/java/apps/spring/reportium/entity/Report.java
===================================================================
--- src/main/java/apps/spring/reportium/entity/Report.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/entity/Report.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -52,4 +52,3 @@
     @OneToOne(mappedBy = "report", fetch = FetchType.LAZY)
     private CriminalReport criminalReport;
-
 }
Index: src/main/java/apps/spring/reportium/service/AuthenticationService.java
===================================================================
--- src/main/java/apps/spring/reportium/service/AuthenticationService.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/service/AuthenticationService.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -2,19 +2,5 @@
 
 import apps.spring.reportium.entity.ReportiumUser;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
 
-/*
-
-CREATE TABLE ReportiumUser (
-    user_id SERIAL PRIMARY KEY,
-    name varchar(30) NOT NULL,
-    surname varchar(30) NOT NULL,
-    email VARCHAR(100) UNIQUE NOT NULL,
-    password_hash TEXT NOT NULL,
-    is_active BOOLEAN DEFAULT TRUE,
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
- */
 public interface AuthenticationService {
     void register_user(String name, String surname, String email, String password, String password_confirmation);
Index: src/main/java/apps/spring/reportium/service/ReportService.java
===================================================================
--- src/main/java/apps/spring/reportium/service/ReportService.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/service/ReportService.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -2,7 +2,10 @@
 
 import apps.spring.reportium.entity.DTOs.*;
+import apps.spring.reportium.entity.EmploymentReport;
 import apps.spring.reportium.entity.Report;
 import org.springframework.data.domain.Page;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.List;
 
@@ -16,3 +19,5 @@
     Page<Report> findPaginatedReports(int page, int size, String sortField, String sortDir);
     List<Report> getReportsByAdvancedFilter(ReportFilterDTO filter);
+
+    void saveNewEmploymentReport(Long personId, LocalDate startDate, LocalDate endDate,String jobRole, BigDecimal income, String summary);
 }
Index: src/main/java/apps/spring/reportium/service/impl/AuthenticateServiceImplementation.java
===================================================================
--- src/main/java/apps/spring/reportium/service/impl/AuthenticateServiceImplementation.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/service/impl/AuthenticateServiceImplementation.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -1,10 +1,7 @@
 package apps.spring.reportium.service.impl;
+
 import apps.spring.reportium.entity.UserProfileLog;
 import apps.spring.reportium.repository.UserProfileLogRepository;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.servlet.http.HttpSession;
 import apps.spring.reportium.entity.ReportiumUser;
-import apps.spring.reportium.entity.Role;
 import apps.spring.reportium.entity.UserProfile;
 import apps.spring.reportium.entity.exceptions.NoExistingCredentialsException;
@@ -12,5 +9,4 @@
 import apps.spring.reportium.entity.exceptions.UserAlreadyExistsException;
 import apps.spring.reportium.repository.ReportiumUserRepository;
-import apps.spring.reportium.repository.RoleRepository;
 import apps.spring.reportium.repository.UserProfileRepository;
 import apps.spring.reportium.service.AuthenticationService;
@@ -18,5 +14,4 @@
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
@@ -38,5 +33,4 @@
     }
 
-
     @Override
     @Transactional
@@ -48,5 +42,5 @@
             throw new IllegalArgumentException("Passwords do not match. Check the mistake and try again.");
         }
-        if(reportiumUserRepository.findByEmail(email).isPresent()) {
+        if (reportiumUserRepository.findByEmail(email).isPresent()) {
             throw new UserAlreadyExistsException(String.format("User with this email '%s' already exists.", email));
         }
@@ -65,5 +59,5 @@
         userProfileLog.setUserProfile(user_profile);
         userProfileLog.setChangedAt(LocalDateTime.now());
-        String description = String.format("New user <%s %s> with mail '%s' has been registered.", savedUser.getName(), savedUser.getSurname() , savedUser.getEmail());
+        String description = String.format("New user <%s %s> with mail '%s' has been registered.", savedUser.getName(), savedUser.getSurname(), savedUser.getEmail());
         userProfileLog.setChangeDescription(description);
         profileLogRepository.save(userProfileLog);
@@ -84,5 +78,5 @@
         userProfileLog.setUserProfile(up);
         userProfileLog.setChangedAt(LocalDateTime.now());
-        String description = String.format("User <%s %s> with mail '%s' has logged in.", user.getName(), user.getSurname() , user.getEmail());
+        String description = String.format("User <%s %s> with mail '%s' has logged in.", user.getName(), user.getSurname(), user.getEmail());
         userProfileLog.setChangeDescription(description);
         profileLogRepository.save(userProfileLog);
@@ -90,4 +84,5 @@
 
     }
+
     @Override
     public ReportiumUser getCurrentUser() {
@@ -100,6 +95,3 @@
                 .orElseThrow(() -> new NoExistingCredentialsException("Authenticated user not found in the database."));
     }
-
-
-
 }
Index: src/main/java/apps/spring/reportium/service/impl/CustomUserDetailsService.java
===================================================================
--- src/main/java/apps/spring/reportium/service/impl/CustomUserDetailsService.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/service/impl/CustomUserDetailsService.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -5,8 +5,5 @@
 import apps.spring.reportium.security.CustomUserDetails;
 import org.springframework.security.core.userdetails.*;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.stereotype.Service;
-
-import java.util.Collections;
 
 @Service
Index: src/main/java/apps/spring/reportium/service/impl/PersonServiceImplementation.java
===================================================================
--- src/main/java/apps/spring/reportium/service/impl/PersonServiceImplementation.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/service/impl/PersonServiceImplementation.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -5,7 +5,5 @@
 import apps.spring.reportium.repository.*;
 import apps.spring.reportium.service.PersonService;
-import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Service;
-
 import java.time.LocalDate;
 import java.time.Period;
Index: src/main/java/apps/spring/reportium/service/impl/ReportServiceImplementation.java
===================================================================
--- src/main/java/apps/spring/reportium/service/impl/ReportServiceImplementation.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/service/impl/ReportServiceImplementation.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -2,8 +2,11 @@
 
 import apps.spring.reportium.entity.DTOs.*;
+import apps.spring.reportium.entity.EmploymentReport;
 import apps.spring.reportium.entity.Report;
 import apps.spring.reportium.repository.ReportRepository;
 import apps.spring.reportium.service.ReportService;
 import apps.spring.reportium.specifications.ReportFilterSpecificationBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -11,6 +14,12 @@
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.SqlParameterSource;
+import org.springframework.jdbc.core.simple.SimpleJdbcCall;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.List;
 
@@ -18,4 +27,6 @@
 public class ReportServiceImplementation implements ReportService {
     private final ReportRepository reportRepository;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
 
     public ReportServiceImplementation(ReportRepository reportRepository) {
@@ -64,3 +75,33 @@
         return reportRepository.findAll(spec); // from JpaSpecificationExecutor
     }
+
+    @Override
+    public void saveNewEmploymentReport(Long personId,
+                                        LocalDate startDate,
+                                        LocalDate endDate,
+                                        String jobRole,
+                                        BigDecimal income,
+                                        String summary) {
+
+        System.out.println("Calling stored procedure with:");
+        System.out.println("personId = " + personId);
+        System.out.println("startDate = " + startDate);
+        System.out.println("endDate = " + endDate);
+        System.out.println("jobRole = " + jobRole);
+        System.out.println("income = " + income);
+        System.out.println("summary = " + summary);
+
+        jdbcTemplate.update(
+                "CALL insert_employment_report(?::integer, ?::date, ?::date, ?::text, ?::numeric, ?::text)",
+                personId,
+                startDate,
+                endDate,
+                jobRole,
+                income,
+                summary
+        );
+
+
+    }
+
 }
Index: src/main/java/apps/spring/reportium/service/impl/ReportiumUserServiceImplementation.java
===================================================================
--- src/main/java/apps/spring/reportium/service/impl/ReportiumUserServiceImplementation.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/service/impl/ReportiumUserServiceImplementation.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -4,5 +4,4 @@
 import apps.spring.reportium.entity.UserProfile;
 import apps.spring.reportium.repository.ReportiumUserRepository;
-import apps.spring.reportium.repository.RoleRepository;
 import apps.spring.reportium.service.ReportiumUserService;
 import apps.spring.reportium.service.RoleService;
Index: src/main/java/apps/spring/reportium/web/ReportsController.java
===================================================================
--- src/main/java/apps/spring/reportium/web/ReportsController.java	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/java/apps/spring/reportium/web/ReportsController.java	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -1,12 +1,14 @@
 package apps.spring.reportium.web;
+import apps.spring.reportium.entity.Person;
 import apps.spring.reportium.entity.Report;
+import apps.spring.reportium.service.PersonService;
 import apps.spring.reportium.service.ReportService;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.List;
 
@@ -15,7 +17,8 @@
 public class ReportsController {
     private final ReportService reportService;
-
-    public ReportsController(ReportService reportService) {
+    private final PersonService personService;
+    public ReportsController(ReportService reportService, PersonService personService) {
         this.reportService = reportService;
+        this.personService = personService;
     }
     @GetMapping
@@ -37,3 +40,29 @@
     }
 
+    @GetMapping("/add/employment")
+    public String createEmploymentReport(@RequestParam Long personId, Model model) {
+        Person person = personService.findById(personId.intValue());
+        model.addAttribute("person", person);
+        System.out.println(personId);
+        return "new_employment_report";
+    }
+    @PostMapping("/add/employment")
+    public String submitEmploymentData(@RequestParam Long personId,
+                                       @RequestParam LocalDate startDate,
+                                       @RequestParam (required = false) LocalDate endDate,
+                                       @RequestParam String jobRole,
+                                       @RequestParam BigDecimal income,
+                                       @RequestParam String summary) {
+        System.out.printf(
+                "EMPLOYMENT FORM DATA%nPerson ID: %d%nStart Date: %s%nEnd Date: %s%nJob Role: %s%nIncome: %s%nSummary: %s%n%n",
+                personId,
+                startDate,
+                endDate != null ? endDate.toString() : "null",
+                jobRole,
+                income.toString(),
+                summary
+        );
+        reportService.saveNewEmploymentReport(personId, startDate, endDate, jobRole, income, summary);
+        return "redirect:/" + personId;
+    }
 }
Index: src/main/resources/sql_queries/procedure_new_empl_report.sql
===================================================================
--- src/main/resources/sql_queries/procedure_new_empl_report.sql	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
+++ src/main/resources/sql_queries/procedure_new_empl_report.sql	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -0,0 +1,42 @@
+CREATE OR REPLACE PROCEDURE insert_employment_report(
+    IN param_person_id INT,
+    IN param_start_date DATE,
+    IN param_end_date DATE,
+    IN param_job_role TEXT,
+    IN param_income NUMERIC,
+    IN param_summary TEXT
+)
+    LANGUAGE plpgsql
+AS
+$$
+DECLARE
+    new_report_id INT;
+BEGIN
+    --check if the person exists in the database
+    IF NOT EXISTS (SELECT 1
+                   FROM person
+                   WHERE person_id = param_person_id) THEN
+        RAISE EXCEPTION 'Person with ID % does not exist', param_person_id;
+    END IF;
+    --check if end date is before start date
+    IF param_end_date is not null and param_end_date < param_start_date then
+        raise exception 'End date can not be before starting date';
+    end if;
+    --checks if the income is positive value
+    IF param_income is not null and param_income <= 0 then
+        raise exception 'Income must be greater than 0';
+    end if;
+    -- Insert into report (superclass)
+    INSERT INTO report (report_type, summary, created_at, person_id)
+    VALUES ('Employment', param_summary, CURRENT_TIMESTAMP, param_person_id)
+    RETURNING report_id INTO new_report_id;
+
+    -- Insert into employment_report (subclass)
+    INSERT INTO employmentreport (report_id, start_date, end_date, job_role, income_per_month)
+    VALUES (new_report_id,
+            param_start_date,
+            param_end_date,
+            param_job_role,
+            param_income);
+END;
+$$;
Index: src/main/resources/templates/new_employment_report.html
===================================================================
--- src/main/resources/templates/new_employment_report.html	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
+++ src/main/resources/templates/new_employment_report.html	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -0,0 +1,41 @@
+<!doctype html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Add Employment Report</title>
+    <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}">
+</head>
+<body class="container py-4">
+<form th:action="@{/reports/add/employment}" method="post" class="mt-4">
+    <!-- Hidden person ID -->
+    <input type="hidden" name="personId" th:value="${person.getPersonId()}"/>
+    <!-- Start Date -->
+    <div class="mb-3">
+        <label for="startDate" class="form-label">Start Date</label>
+        <input type="date" class="form-control" name="startDate" id="startDate" required>
+    </div>
+    <!-- End Date -->
+    <div class="mb-3">
+        <label for="endDate" class="form-label">End Date</label>
+        <input type="date" class="form-control" name="endDate" id="endDate">
+    </div>
+    <!-- Job Role -->
+    <div class="mb-3">
+        <label for="jobRole" class="form-label">Job Role</label>
+        <input type="text" class="form-control" name="jobRole" id="jobRole" required>
+    </div>
+    <!-- Income -->
+    <div class="mb-3">
+        <label for="income" class="form-label">Monthly Income (in euros)</label>
+        <input min="1" type="number" step="0.01" class="form-control" name="income" id="income" required>
+    </div>
+    <!-- Report Summary -->
+    <div class="mb-3">
+        <label for="summary" class="form-label">Write a short Summary for the report:</label>
+        <textarea class="form-control" name="summary" id="summary" rows="4" required></textarea>
+    </div>
+    <button type="submit" class="btn btn-primary">Submit Report</button>
+    <a th:href="@{/person/{id}(id=${person.getPersonId()})}" class="btn btn-secondary">Cancel</a>
+</form>
+</body>
+</html>
Index: src/main/resources/templates/person_reports.html
===================================================================
--- src/main/resources/templates/person_reports.html	(revision 7ef8fdbf77f56c14cd7d38d8f0f0bae06aedfad4)
+++ src/main/resources/templates/person_reports.html	(revision b8f72241fcdb78c32de26f5e71ce67c8aa84a4b1)
@@ -380,8 +380,37 @@
 
 <div class="container">
-    <!-- Page Title -->
     <h1 class="page-title" th:text="'Reports for ' + ${person.name} + ' ' + ${person.surname}">
         Reports for Person
     </h1>
+    <div class="px-2 py-3 rounded-2 border border-secondary-subtle mb-4">
+        <h4 class="text-secondary mb-3 text-center">Add a New Report</h4>
+        <div class="row row-cols-2 row-cols-md-4 g-3 w-100 py-3">
+            <div class="col">
+                <a class="btn btn-outline-warning fw-bolder w-100"
+                   th:href="@{/reports/add/medical(personId=${person.getPersonId()})}">
+                    <i class="bi bi-plus-lg"></i> New Medical Report
+                </a>
+            </div>
+            <div class="col">
+                <a class="btn btn-outline-danger fw-bolder w-100"
+                   th:href="@{/reports/add/criminal(personId=${person.getPersonId()})}">
+                    <i class="bi bi-plus-lg"></i> New Criminal Report
+                </a>
+            </div>
+            <div class="col">
+                <a class="btn btn-outline-success fw-bolder w-100"
+                   th:href="@{/reports/add/academic(personId=${person.getPersonId()})}">
+                    <i class="bi bi-plus-lg"></i> New Academic Report
+                </a>
+            </div>
+            <div class="col">
+                <a class="btn btn-outline-primary fw-bolder w-100"
+                   th:href="@{/reports/add/employment(personId=${person.getPersonId()})}">
+                    <i class="bi bi-plus-lg"></i> New Employment Report
+                </a>
+            </div>
+        </div>
+    </div>
+
 
     <!-- Criminal Reports -->
