Index: 01.init.sql
===================================================================
--- 01.init.sql	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ 01.init.sql	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,263 @@
+CREATE TABLE IF NOT EXISTS users (
+                                     id BIGSERIAL PRIMARY KEY,
+                                     email VARCHAR(255) NOT NULL UNIQUE,
+    password VARCHAR(255) NOT NULL,
+    phone_number VARCHAR(50) UNIQUE,
+    street VARCHAR(255),
+    city VARCHAR(255)
+    );
+
+CREATE TABLE IF NOT EXISTS employees (
+                                         user_id BIGSERIAL PRIMARY KEY,
+                                         net_salary DECIMAL(10,2),
+    gross_salary DECIMAL(10,2),
+    FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS customers (
+                                         user_id BIGSERIAL PRIMARY KEY,
+                                         FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS staff_roles (
+                                           id BIGSERIAL PRIMARY KEY,
+                                           name VARCHAR(255) NOT NULL
+    );
+
+CREATE TABLE IF NOT EXISTS front_staff (
+                                           employee_id BIGSERIAL PRIMARY KEY,
+                                           tip_percent DECIMAL(10,2),
+    staff_role_id BIGINT NOT NULL,
+    FOREIGN KEY (employee_id) REFERENCES employees (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (staff_role_id) REFERENCES staff_roles (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS back_staff (
+                                          employee_id BIGSERIAL PRIMARY KEY,
+                                          staff_role_id BIGINT NOT NULL,
+                                          FOREIGN KEY (employee_id) REFERENCES employees (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (staff_role_id) REFERENCES staff_roles (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS managers (
+                                        employee_id BIGSERIAL PRIMARY KEY,
+                                        FOREIGN KEY (employee_id) REFERENCES employees (user_id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS shifts (
+                                      id BIGSERIAL PRIMARY KEY,
+                                      date DATE NOT NULL,
+                                      start_time TIME NOT NULL,
+                                      end_time TIME NOT NULL,
+                                      manager_id BIGINT NOT NULL,
+                                      FOREIGN KEY (manager_id) REFERENCES managers (employee_id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS assignments (
+                                           id BIGSERIAL PRIMARY KEY,
+                                           clock_in_time TIME,
+                                           clock_out_time TIME,
+                                           manager_id BIGINT NOT NULL,
+                                           employee_id BIGINT NOT NULL,
+                                           shift_id BIGINT NOT NULL,
+                                           FOREIGN KEY (manager_id) REFERENCES managers (employee_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (employee_id) REFERENCES employees (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (shift_id) REFERENCES shifts (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS tables (
+                                      table_number BIGSERIAL PRIMARY KEY,
+                                      seat_capacity INT NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS reservations (
+                                            id BIGSERIAL PRIMARY KEY,
+                                            user_id BIGINT NOT NULL,
+                                            creation_timestamp TIMESTAMP NOT NULL,
+                                            datetime TIMESTAMP NOT NULL,
+                                            number_of_people BIGINT NOT NULL,
+                                            stay_length DECIMAL(10,2) NULL, --hours
+    FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS frontstaff_managed_reservations (
+                                                               id BIGSERIAL PRIMARY KEY,
+                                                               reservation_id BIGINT NOT NULL,
+                                                               front_staff_id BIGINT NOT NULL,
+                                                               table_number BIGINT NOT NULL,
+                                                               FOREIGN KEY (reservation_id) REFERENCES reservations (id) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (front_staff_id) REFERENCES front_staff (employee_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (table_number) REFERENCES tables (table_number) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS categories (
+                                          id BIGSERIAL PRIMARY KEY,
+                                          name VARCHAR(255) NOT NULL,
+    is_available BOOLEAN NOT NULL DEFAULT TRUE
+    );
+
+CREATE TABLE IF NOT EXISTS products (
+                                        id BIGSERIAL PRIMARY KEY,
+                                        name VARCHAR(255) NOT NULL,
+    description VARCHAR(1000) NOT NULL,
+    price DECIMAL(10,2) NOT NULL,
+    category_id BIGINT NOT NULL,
+    manage_inventory BOOLEAN NOT NULL DEFAULT FALSE,
+    tax_class VARCHAR(4) NOT NULL,
+    FOREIGN KEY (category_id) REFERENCES categories (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS inventories (
+                                           product_id BIGSERIAL PRIMARY KEY,
+                                           quantity INT NOT NULL,
+                                           restock_level  INT NULL,
+                                           FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS orders (
+                                      id BIGSERIAL PRIMARY KEY,
+                                      status VARCHAR(255) NOT NULL DEFAULT 'PENDING',
+    datetime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+    );
+
+CREATE TABLE IF NOT EXISTS order_items (
+                                           id BIGSERIAL PRIMARY KEY,
+                                           order_id BIGINT NOT NULL,
+                                           product_id BIGINT NOT NULL,
+                                           is_processed BOOLEAN NOT NULL DEFAULT FALSE,
+                                           quantity INT NOT NULL,
+                                           price DECIMAL(10,2) NOT NULL,
+    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS tab_orders (
+                                          order_id BIGSERIAL PRIMARY KEY,
+                                          front_staff_id BIGINT NOT NULL,
+                                          table_number BIGINT NOT NULL,
+                                          FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (table_number) REFERENCES tables (table_number) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (front_staff_id) REFERENCES front_staff (employee_id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS online_orders (
+                                             order_id BIGSERIAL PRIMARY KEY,
+                                             delivery_address VARCHAR(255) NOT NULL,
+    customer_id BIGINT NOT NULL,
+    FOREIGN KEY (customer_id) REFERENCES customers (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+CREATE TABLE IF NOT EXISTS payments (
+                                        id BIGSERIAL PRIMARY KEY,
+                                        order_id BIGINT NOT NULL,
+                                        amount DECIMAL(10,2) NOT NULL,
+    payment_type VARCHAR(32) NOT NULL,
+    tip_amount DECIMAL(10,2) NOT NULL DEFAULT 0,
+    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE ON UPDATE CASCADE
+    );
+
+-- DML
+INSERT INTO users(id, email, password, phone_number, street, city)
+VALUES
+    (1, 'test@hotmail.com', 'password1', '070003005', 'Mladinska 3', 'Strumica'),
+    (2, 'test2@hotmail.com', 'password2', '070001002', 'Marsal Tito 10', 'Strumica'),
+    (3, 'test3@hotmail.com', 'password1', '070003003', 'Mladinska 5', 'Strumica'),
+    (4, 'test4@hotmail.com', 'password2', '070004004', 'Marsal Tito 11', 'Strumica'),
+    (5, 'test5@hotmail.com', 'password1', '070005005', 'Mladinska 12', 'Strumica');
+
+INSERT INTO employees(user_id, net_salary, gross_salary)
+VALUES
+    (1, 30000, 40000),
+    (3, 50000, 62000),
+    (4, 35000, 46000),
+    (5, 28000, 37000);
+
+INSERT INTO managers(employee_id)
+VALUES
+    (3);
+
+INSERT INTO staff_roles(id, name)
+VALUES
+    (1, 'Server'),
+    (2, 'Chef'),
+    (3, 'Bartender'),
+    (4, 'Hostess');
+
+INSERT INTO front_staff(employee_id, tip_percent, staff_role_id)
+VALUES
+    (1, .4, 1),
+    (5, 0.1, 4);
+
+INSERT INTO back_staff(employee_id, staff_role_id)
+VALUES
+    (4, 2);
+
+INSERT INTO customers(user_id)
+VALUES
+    (2);
+
+INSERT INTO shifts (id, date, start_time, end_time, manager_id)
+VALUES
+    (1, current_date, '09:00:00', '17:00:00', 3);
+
+INSERT INTO assignments(id, clock_in_time, clock_out_time, manager_id, employee_id, shift_id)
+VALUES
+    (1, NULL, NULL, 3, 1, 1);
+
+INSERT INTO tables(table_number, seat_capacity)
+VALUES
+    (1, 4),
+    (2, 8);
+
+INSERT INTO  reservations(id, user_id, creation_timestamp, datetime, stay_length, number_of_people)
+VALUES
+    (1, 2, now(), now(), NULL, 4);
+
+INSERT INTO frontstaff_managed_reservations(id, reservation_id, front_staff_id, table_number)
+VALUES
+    (1, 1, 5, 1);
+
+INSERT INTO categories(id, name)
+VALUES
+    (1, 'Drinks'),
+    (2, 'Appetizers'),
+    (3, 'Entrees');
+
+INSERT INTO products(id, name, description, price, category_id, manage_inventory, tax_class)
+VALUES
+    (1, 'Coca Cola', 'A classic carbonated soft drink.', 100, 1, TRUE, 'A'),
+    (2, 'Pomfrit so sirenje', 'Crispy french fries topped with melted cheese.', 250, 2, FALSE, 'A');
+
+INSERT INTO inventories(product_id, quantity)
+VALUES
+    (1, 100);
+
+INSERT INTO orders(id, status, datetime)
+VALUES
+    (1, 'PENDING', '2025-01-05 10:00:00'),
+    (2, 'ACCEPTED', '2025-01-05 10:00:00'),
+    (3, 'CONFIRMED', '2025-01-05 11:00:00');
+
+INSERT INTO order_items (id, order_id, product_id, is_processed, quantity, price)
+SELECT 1, 1, 1, TRUE, 3, price FROM products WHERE id = 1
+UNION ALL
+SELECT 2, 1, 2, FALSE, 1, price FROM products WHERE id = 2
+UNION ALL
+SELECT 3, 3, 2, FALSE, 2, price FROM products WHERE id = 2
+UNION ALL
+SELECT 4, 3, 1, FALSE, 2, price FROM products WHERE id = 1;
+
+INSERT INTO tab_orders(order_id, front_staff_id, table_number)
+VALUES
+    (1, 1, 1);
+
+INSERT INTO online_orders(order_id, delivery_address, customer_id)
+VALUES
+    (3, 'Leninova 5', 2);
+
+INSERT INTO payments(id, order_id, amount, payment_type, tip_amount)
+VALUES
+    (1, 3, 700, 'cash', 10);
Index: docker-compose.yml
===================================================================
--- docker-compose.yml	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ docker-compose.yml	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,18 @@
+version: '3.8'
+
+services:
+  db:
+    image: postgres:15.5
+    restart: always
+    environment:
+      POSTGRES_USER: springuser
+      POSTGRES_PASSWORD: springpassword
+      POSTGRES_DB: spring_boot_db
+    volumes:
+      - db_data:/var/lib/postgresql/data
+      - ./01.init.sql:/docker-entrypoint-initdb.d/init.sql
+    ports:
+      - "5435:5432"
+
+volumes:
+  db_data:
Index: pom.xml
===================================================================
--- pom.xml	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ pom.xml	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -3,4 +3,5 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.springframework.boot</groupId>
@@ -9,4 +10,5 @@
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
+
     <groupId>finki.db</groupId>
     <artifactId>Tasty_Tabs</artifactId>
@@ -14,20 +16,9 @@
     <name>Tasty Tabs</name>
     <description>Tasty Tabs</description>
-    <url/>
-    <licenses>
-        <license/>
-    </licenses>
-    <developers>
-        <developer/>
-    </developers>
-    <scm>
-        <connection/>
-        <developerConnection/>
-        <tag/>
-        <url/>
-    </scm>
+
     <properties>
         <java.version>17</java.version>
     </properties>
+
     <dependencies>
         <dependency>
@@ -55,5 +46,4 @@
             <artifactId>flyway-database-postgresql</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -72,9 +62,13 @@
             <optional>true</optional>
         </dependency>
+
+        <!-- ✅ Fixed Lombok dependency -->
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
-            <optional>true</optional>
+            <version>1.18.34</version>
+            <scope>provided</scope>
         </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -117,7 +111,9 @@
     <build>
         <plugins>
+            <!-- ✅ Added version and ensured Lombok is included in annotation processing -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.11.0</version>
                 <configuration>
                     <annotationProcessorPaths>
@@ -129,19 +125,13 @@
                             <groupId>org.projectlombok</groupId>
                             <artifactId>lombok</artifactId>
+                            <version>1.18.34</version>
                         </path>
                     </annotationProcessorPaths>
                 </configuration>
             </plugin>
+
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>
-                            <groupId>org.projectlombok</groupId>
-                            <artifactId>lombok</artifactId>
-                        </exclude>
-                    </excludes>
-                </configuration>
             </plugin>
         </plugins>
Index: src/main/java/finki/db/tasty_tabs/config/OpenApiConfig.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/config/OpenApiConfig.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/config/OpenApiConfig.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -21,7 +21,4 @@
 @Configuration
 public class OpenApiConfig {
-    private static final List<ParameterItem> GLOBAL_PARAMETERS = List.of(
-            new ParameterItem("Accept-Language", "Response Language", false, "header", "string")
-    );
 
     @Bean
@@ -32,16 +29,7 @@
     @Bean
     public OpenApiCustomizer globalHeaderCustomizer() {
-        return openApi -> openApi.getPaths().values().forEach(pathItem ->
-                pathItem.readOperations().forEach(operation -> {
-                    GLOBAL_PARAMETERS.forEach(parameterItem -> {
-                        Parameter parameter = new Parameter()
-                                .in(parameterItem.getIn())
-                                .name(parameterItem.getName())
-                                .description(parameterItem.getDescription())
-                                .required(parameterItem.isRequired())
-                                .schema(new StringSchema());
-                        operation.addParametersItem(parameter);
-                    });
-                }));
+        return openApi -> {
+            // No action is performed here, effectively removing the global parameter
+        };
     }
 
@@ -60,14 +48,3 @@
                 .addServersItem(new Server().url("http://localhost:8080").description("Local server"));
     }
-
-    @Data
-    @AllArgsConstructor
-    private static class ParameterItem {
-        private String name;
-        private String description;
-        private boolean required;
-        private String in;
-        private String type;
-
-    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/Assignment.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Assignment.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Assignment.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -13,5 +13,5 @@
  */
 @Entity
-@Table(name = "assignment")
+@Table(name = "assignments")
 @Data
 @NoArgsConstructor
@@ -54,3 +54,51 @@
         this.shift = shift;
     }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public LocalDateTime getClockInTime() {
+        return clockInTime;
+    }
+
+    public void setClockInTime(LocalDateTime clockInTime) {
+        this.clockInTime = clockInTime;
+    }
+
+    public LocalDateTime getClockOutTime() {
+        return clockOutTime;
+    }
+
+    public void setClockOutTime(LocalDateTime clockOutTime) {
+        this.clockOutTime = clockOutTime;
+    }
+
+    public Manager getManager() {
+        return manager;
+    }
+
+    public void setManager(Manager manager) {
+        this.manager = manager;
+    }
+
+    public Employee getEmployee() {
+        return employee;
+    }
+
+    public void setEmployee(Employee employee) {
+        this.employee = employee;
+    }
+
+    public Shift getShift() {
+        return shift;
+    }
+
+    public void setShift(Shift shift) {
+        this.shift = shift;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/Category.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Category.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Category.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,5 +1,6 @@
 package finki.db.tasty_tabs.entity;
+
+import com.fasterxml.jackson.annotation.JsonManagedReference;
 import jakarta.persistence.*;
-import jakarta.persistence.Table;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -9,5 +10,4 @@
 /**
  * Entity: Category
- * Description: Represents product categories.
  */
 @Entity
@@ -21,5 +21,5 @@
     private Long id;
 
-    @Column(name = "name", nullable = false, unique = true)
+    @Column(nullable = false, unique = true)
     private String name;
 
@@ -27,10 +27,11 @@
     private Boolean isAvailable;
 
-    @OneToMany(mappedBy = "category")
+    @OneToMany(mappedBy = "category", fetch = FetchType.LAZY)
+    @JsonManagedReference
     private List<Product> products;
 
     public Category(String name, Boolean isAvailable) {
-        this.name=name;
-        this.isAvailable=isAvailable;
+        this.name = name;
+        this.isAvailable = isAvailable;
     }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/Customer.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Customer.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Customer.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -12,5 +12,5 @@
  */
 @Entity
-@Table(name = "customer")
+@Table(name = "customers")
 @Data
 @NoArgsConstructor
Index: src/main/java/finki/db/tasty_tabs/entity/Employee.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Employee.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Employee.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -12,7 +12,6 @@
  */
 @Entity
-@Table(name = "employee")
+@Table(name = "employees")
 @Data
-@NoArgsConstructor
 @PrimaryKeyJoinColumn(name = "user_id") // Links to the User table
 public class Employee extends User {
@@ -27,3 +26,41 @@
     @OneToMany(mappedBy = "employee")
     private List<Assignment> assignments;
+
+    public Employee() {
+    }
+    public Employee(Double netSalary, Double grossSalary) {
+        this.netSalary = netSalary;
+        this.grossSalary = grossSalary;
+    }
+
+    public Employee(Long id, String email, String street, String city, String phoneNumber, Double netSalary, Double grossSalary, List<Assignment> assignments) {
+        super(id, email, street, city, phoneNumber);
+        this.netSalary = netSalary;
+        this.grossSalary = grossSalary;
+        this.assignments = assignments;
+    }
+
+    public Double getNetSalary() {
+        return netSalary;
+    }
+
+    public List<Assignment> getAssignments() {
+        return assignments;
+    }
+
+    public void setAssignments(List<Assignment> assignments) {
+        this.assignments = assignments;
+    }
+
+    public void setNetSalary(Double netSalary) {
+        this.netSalary = netSalary;
+    }
+
+    public Double getGrossSalary() {
+        return grossSalary;
+    }
+
+    public void setGrossSalary(Double grossSalary) {
+        this.grossSalary = grossSalary;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/FrontStaff.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/FrontStaff.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/FrontStaff.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -31,3 +31,35 @@
     @OneToMany(mappedBy = "frontStaff")
     private List<ReservationManagedFrontStaff> managedReservations;
+
+    public Double getTipPercent() {
+        return tipPercent;
+    }
+
+    public void setTipPercent(Double tipPercent) {
+        this.tipPercent = tipPercent;
+    }
+
+    public StaffRole getStaffRole() {
+        return staffRole;
+    }
+
+    public void setStaffRole(StaffRole staffRole) {
+        this.staffRole = staffRole;
+    }
+
+    public List<TabOrder> getTabOrders() {
+        return tabOrders;
+    }
+
+    public void setTabOrders(List<TabOrder> tabOrders) {
+        this.tabOrders = tabOrders;
+    }
+
+    public List<ReservationManagedFrontStaff> getManagedReservations() {
+        return managedReservations;
+    }
+
+    public void setManagedReservations(List<ReservationManagedFrontStaff> managedReservations) {
+        this.managedReservations = managedReservations;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/Inventory.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Inventory.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Inventory.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -29,8 +29,41 @@
     private Integer restockLevel;
 
-    public Inventory(Long id, Integer quantity, Integer restockLevel) {
-        this.productId=id;
-        this.quantity=quantity;
-        this.restockLevel=restockLevel;
+    public Inventory(Product product, Integer quantity, Integer restockLevel) {
+        this.product = product;  // @MapsId ќе го земе id-то
+        this.quantity = quantity;
+        this.restockLevel = restockLevel;
+    }
+
+
+    public Long getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Long productId) {
+        this.productId = productId;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public Integer getQuantity() {
+        return quantity;
+    }
+
+    public void setQuantity(Integer quantity) {
+        this.quantity = quantity;
+    }
+
+    public Integer getRestockLevel() {
+        return restockLevel;
+    }
+
+    public void setRestockLevel(Integer restockLevel) {
+        this.restockLevel = restockLevel;
     }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/Manager.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Manager.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Manager.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -12,5 +12,5 @@
  */
 @Entity
-@Table(name = "manager")
+@Table(name = "managers")
 @Data
 @NoArgsConstructor
@@ -25,3 +25,4 @@
     @OneToMany(mappedBy = "manager")
     private List<Assignment> createdAssignments;
+
 }
Index: src/main/java/finki/db/tasty_tabs/entity/OnlineOrder.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/OnlineOrder.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/OnlineOrder.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -9,5 +9,5 @@
  */
 @Entity
-@Table(name = "online_order")
+@Table(name = "online_orders")
 @Data
 @NoArgsConstructor
@@ -21,3 +21,19 @@
     @Column(name = "delivery_address", nullable = false)
     private String deliveryAddress;
+
+    public Customer getCustomer() {
+        return customer;
+    }
+
+    public void setCustomer(Customer customer) {
+        this.customer = customer;
+    }
+
+    public String getDeliveryAddress() {
+        return deliveryAddress;
+    }
+
+    public void setDeliveryAddress(String deliveryAddress) {
+        this.deliveryAddress = deliveryAddress;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/Order.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Order.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Order.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -23,5 +23,5 @@
     private Long id;
 
-    @Column(name = "timestamp", nullable = false)
+    @Column(name = "datetime", nullable = false)
     private LocalDateTime timestamp;
 
@@ -34,3 +34,43 @@
     @OneToOne(mappedBy = "order", cascade = CascadeType.ALL)
     private Payment payment;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public LocalDateTime getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(LocalDateTime timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public List<OrderItem> getOrderItems() {
+        return orderItems;
+    }
+
+    public void setOrderItems(List<OrderItem> orderItems) {
+        this.orderItems = orderItems;
+    }
+
+    public Payment getPayment() {
+        return payment;
+    }
+
+    public void setPayment(Payment payment) {
+        this.payment = payment;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/OrderItem.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/OrderItem.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/OrderItem.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -12,5 +12,5 @@
  */
 @Entity
-@Table(name = "order_item")
+@Table(name = "order_items")
 @Data
 @NoArgsConstructor
@@ -30,5 +30,5 @@
     private Boolean isProcessed;
 
-    @Column(name = "timestamp", nullable = false)
+    @Column(name = "created_at", nullable = false)
     private LocalDateTime timestamp;
 
Index: src/main/java/finki/db/tasty_tabs/entity/Payment.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Payment.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Payment.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -12,5 +12,5 @@
  */
 @Entity
-@Table(name = "payment")
+@Table(name = "payments")
 @Data
 @NoArgsConstructor
@@ -24,5 +24,5 @@
     private Double tipAmount;
 
-    @Column(name = "timestamp", nullable = false)
+    @Column(name = "created_at", nullable = false)
     private LocalDateTime timestamp;
 
@@ -36,3 +36,52 @@
     @JoinColumn(name = "order_id", referencedColumnName = "id", nullable = false, unique = true)
     private Order order;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Double getTipAmount() {
+        return tipAmount;
+    }
+
+    public void setTipAmount(Double tipAmount) {
+        this.tipAmount = tipAmount;
+    }
+
+    public LocalDateTime getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(LocalDateTime timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getPaymentType() {
+        return paymentType;
+    }
+
+    public void setPaymentType(String paymentType) {
+        this.paymentType = paymentType;
+    }
+
+    public Double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public Order getOrder() {
+        return order;
+    }
+
+    public void setOrder(Order order) {
+        this.order = order;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/Product.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Product.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Product.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,5 +1,6 @@
 package finki.db.tasty_tabs.entity;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
 import jakarta.persistence.*;
-import jakarta.persistence.Table;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -9,5 +10,4 @@
 /**
  * Entity: Product
- * Description: Represents items that can be purchased in the system.
  */
 @Entity
@@ -21,8 +21,8 @@
     private Long id;
 
-    @Column(name = "name", nullable = false)
+    @Column(nullable = false)
     private String name;
 
-    @Column(name = "price", nullable = false)
+    @Column(nullable = false)
     private Double price;
 
@@ -30,9 +30,10 @@
     private String taxClass;
 
-    @Column(name = "description", length = 1024)
+    @Column(length = 1024)
     private String description;
 
-    @ManyToOne
-    @JoinColumn(name = "category_id", referencedColumnName = "id", nullable = false)
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "category_id", nullable = false)
+    @JsonBackReference
     private Category category;
 
Index: src/main/java/finki/db/tasty_tabs/entity/Reservation.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Reservation.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Reservation.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -13,5 +13,5 @@
  */
 @Entity
-@Table(name = "reservation")
+@Table(name = "reservations")
 @Data
 @NoArgsConstructor
@@ -40,3 +40,59 @@
     @OneToMany(mappedBy = "reservation")
     private List<ReservationManagedFrontStaff> managedReservations;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getStayLength() {
+        return stayLength;
+    }
+
+    public void setStayLength(Integer stayLength) {
+        this.stayLength = stayLength;
+    }
+
+    public LocalDateTime getDatetime() {
+        return datetime;
+    }
+
+    public void setDatetime(LocalDateTime datetime) {
+        this.datetime = datetime;
+    }
+
+    public LocalDateTime getCreationTimestamp() {
+        return creationTimestamp;
+    }
+
+    public void setCreationTimestamp(LocalDateTime creationTimestamp) {
+        this.creationTimestamp = creationTimestamp;
+    }
+
+    public Integer getNumberOfPeople() {
+        return numberOfPeople;
+    }
+
+    public void setNumberOfPeople(Integer numberOfPeople) {
+        this.numberOfPeople = numberOfPeople;
+    }
+
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public List<ReservationManagedFrontStaff> getManagedReservations() {
+        return managedReservations;
+    }
+
+    public void setManagedReservations(List<ReservationManagedFrontStaff> managedReservations) {
+        this.managedReservations = managedReservations;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/ReservationManagedFrontStaff.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/ReservationManagedFrontStaff.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/ReservationManagedFrontStaff.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,28 +1,29 @@
-package finki.db.tasty_tabs.entity;
-
-import finki.db.tasty_tabs.entity.composite_keys.ReservationManagedFrontStaffId;
+package finki.db.tasty_tabs.entity;// finki.db.tasty_tabs.entity.ReservationManagedFrontStaff
 import jakarta.persistence.*;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import finki.db.tasty_tabs.entity.composite_keys.ReservationManagedFrontStaffId;
 
 @Entity
-@Table(name = "reservation_managed_frontstaff")
+@Table(name = "frontstaff_managed_reservations")
 @Data
 @NoArgsConstructor
-@IdClass(ReservationManagedFrontStaffId.class)
 public class ReservationManagedFrontStaff {
 
-    @Id
+    @EmbeddedId
+    private ReservationManagedFrontStaffId id;
+
     @ManyToOne
+    @MapsId("reservationId")
     @JoinColumn(name = "reservation_id", referencedColumnName = "id")
     private Reservation reservation;
 
-    @Id
     @ManyToOne
-    @JoinColumn(name = "frontstaff_id", referencedColumnName = "employee_id")
+    @MapsId("frontstaffId")
+    @JoinColumn(name = "front_staff_id", referencedColumnName = "employee_id")
     private FrontStaff frontStaff;
 
-    @Id
     @ManyToOne
+    @MapsId("tableNumber")
     @JoinColumn(name = "table_number", referencedColumnName = "table_number")
     private RestaurantTable restaurantTable;
Index: src/main/java/finki/db/tasty_tabs/entity/RestaurantTable.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/RestaurantTable.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/RestaurantTable.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -23,5 +23,5 @@
     private Integer seatCapacity;
 
-    @OneToMany(mappedBy = "table")
+    @OneToMany(mappedBy = "restaurantTable")
     private List<TabOrder> tabOrders;
 
Index: src/main/java/finki/db/tasty_tabs/entity/Shift.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Shift.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/Shift.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -51,3 +51,51 @@
         this.end = end;
     }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public LocalDate getDate() {
+        return date;
+    }
+
+    public void setDate(LocalDate date) {
+        this.date = date;
+    }
+
+    public LocalDateTime getStart() {
+        return start;
+    }
+
+    public void setStart(LocalDateTime start) {
+        this.start = start;
+    }
+
+    public LocalDateTime getEnd() {
+        return end;
+    }
+
+    public void setEnd(LocalDateTime end) {
+        this.end = end;
+    }
+
+    public Manager getManager() {
+        return manager;
+    }
+
+    public void setManager(Manager manager) {
+        this.manager = manager;
+    }
+
+    public List<Assignment> getAssignments() {
+        return assignments;
+    }
+
+    public void setAssignments(List<Assignment> assignments) {
+        this.assignments = assignments;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/StaffRole.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/StaffRole.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/StaffRole.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -12,5 +12,5 @@
  */
 @Entity
-@Table(name = "staff_role")
+@Table(name = "staff_roles")
 @Data
 @NoArgsConstructor
Index: src/main/java/finki/db/tasty_tabs/entity/TabOrder.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/TabOrder.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/TabOrder.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -9,5 +9,5 @@
  */
 @Entity
-@Table(name = "tab_order")
+@Table(name = "tab_orders")
 @Data
 @NoArgsConstructor
@@ -20,5 +20,21 @@
 
     @ManyToOne
-    @JoinColumn(name = "frontstaff_id", referencedColumnName = "employee_id", nullable = false)
+    @JoinColumn(name = "front_staff_id", referencedColumnName = "employee_id", nullable = false)
     private FrontStaff frontStaff;
+
+    public RestaurantTable getRestaurantTable() {
+        return restaurantTable;
+    }
+
+    public void setRestaurantTable(RestaurantTable restaurantTable) {
+        this.restaurantTable = restaurantTable;
+    }
+
+    public FrontStaff getFrontStaff() {
+        return frontStaff;
+    }
+
+    public void setFrontStaff(FrontStaff frontStaff) {
+        this.frontStaff = frontStaff;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/User.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/User.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/User.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -3,5 +3,7 @@
 import jakarta.persistence.Table;
 import lombok.Data;
+import lombok.Getter;
 import lombok.NoArgsConstructor;
+import lombok.Setter;
 
 import java.util.List;
@@ -14,4 +16,6 @@
 @Table(name = "users") // "user" is often a reserved keyword in SQL
 @Data
+@Getter
+@Setter
 @NoArgsConstructor
 @Inheritance(strategy = InheritanceType.JOINED) // Strategy to allow for Employee/Customer subtypes
@@ -40,3 +44,66 @@
     @OneToMany(mappedBy = "user")
     private List<Reservation> reservations;
+    public User(Long id, String email, String street, String city, String phoneNumber) {
+        this.id = id;
+        this.email = email;
+        this.street = street;
+        this.city = city;
+        this.phoneNumber = phoneNumber;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getStreet() {
+        return street;
+    }
+
+    public void setStreet(String street) {
+        this.street = street;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public List<Reservation> getReservations() {
+        return reservations;
+    }
+
+    public void setReservations(List<Reservation> reservations) {
+        this.reservations = reservations;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/composite_keys/ReservationManagedFrontStaffId.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/composite_keys/ReservationManagedFrontStaffId.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/entity/composite_keys/ReservationManagedFrontStaffId.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,10 +1,9 @@
 package finki.db.tasty_tabs.entity.composite_keys;
-
 import jakarta.persistence.Column;
 import jakarta.persistence.Embeddable;
 import java.io.Serializable;
-import java.util.Objects;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import java.util.Objects;
 
 @Embeddable
@@ -16,9 +15,9 @@
     private Long reservationId;
 
-    @Column(name = "frontstaff_id")
+    @Column(name = "front_staff_id")
     private Long frontstaffId;
 
     @Column(name = "table_number")
-    private Integer tableNumber;
+    private Long tableNumber;
 
     @Override
Index: src/main/java/finki/db/tasty_tabs/entity/exceptions/PaymentNotFoundException.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/exceptions/PaymentNotFoundException.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/entity/exceptions/PaymentNotFoundException.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,8 @@
+package finki.db.tasty_tabs.entity.exceptions;
+
+public class PaymentNotFoundException extends DomainException {
+
+    public PaymentNotFoundException(Long id) {
+        super(String.format("Payment with id %d doesnt exist",id));
+    }
+}
Index: src/main/java/finki/db/tasty_tabs/repository/PaymentRepository.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/repository/PaymentRepository.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/repository/PaymentRepository.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,12 @@
+package finki.db.tasty_tabs.repository;
+
+import finki.db.tasty_tabs.entity.Payment;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+@Repository
+public interface PaymentRepository extends JpaRepository<Payment, Long> {
+    // Find a payment by its associated order ID
+    Optional<Payment> findByOrderId(Long orderId);
+}
Index: src/main/java/finki/db/tasty_tabs/repository/ReservationManagedFrontStaffRepository.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/repository/ReservationManagedFrontStaffRepository.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/repository/ReservationManagedFrontStaffRepository.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,5 +1,4 @@
 package finki.db.tasty_tabs.repository;
 
-import finki.db.tasty_tabs.entity.Product;
 import finki.db.tasty_tabs.entity.ReservationManagedFrontStaff;
 import finki.db.tasty_tabs.entity.composite_keys.ReservationManagedFrontStaffId;
Index: src/main/java/finki/db/tasty_tabs/service/PaymentService.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/service/PaymentService.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/service/PaymentService.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,14 @@
+package finki.db.tasty_tabs.service;
+
+import finki.db.tasty_tabs.entity.Payment;
+import finki.db.tasty_tabs.web.dto.CreatePaymentDto;
+
+import java.util.List;
+
+public interface PaymentService {
+    Payment createPayment(CreatePaymentDto dto);
+    Payment findPaymentById(Long id);
+    Payment findPaymentByOrderId(Long orderId);
+    List<Payment> findAllPayments();
+    Payment updatePayment(Long id, CreatePaymentDto dto);
+}
Index: src/main/java/finki/db/tasty_tabs/service/ProductService.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/service/ProductService.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/service/ProductService.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,10 +1,8 @@
 package finki.db.tasty_tabs.service;
 
-import finki.db.tasty_tabs.entity.Category;
 import finki.db.tasty_tabs.entity.Product;
 import finki.db.tasty_tabs.web.dto.CreateProductDto;
 
 import java.util.List;
-import java.util.Optional;
 
 public interface ProductService {
Index: src/main/java/finki/db/tasty_tabs/service/impl/PaymentServiceImpl.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/service/impl/PaymentServiceImpl.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/service/impl/PaymentServiceImpl.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,71 @@
+package finki.db.tasty_tabs.service.impl;
+
+
+import finki.db.tasty_tabs.entity.Order;
+import finki.db.tasty_tabs.entity.Payment;
+import finki.db.tasty_tabs.entity.exceptions.OrderNotFoundException;
+import finki.db.tasty_tabs.entity.exceptions.PaymentNotFoundException;
+import finki.db.tasty_tabs.repository.OrderRepository;
+import finki.db.tasty_tabs.repository.PaymentRepository;
+import finki.db.tasty_tabs.service.PaymentService;
+import finki.db.tasty_tabs.web.dto.CreatePaymentDto;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import jakarta.transaction.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class PaymentServiceImpl implements PaymentService {
+
+    private final PaymentRepository paymentRepository;
+    private final OrderRepository orderRepository;
+
+    @Override
+    @Transactional
+    public Payment createPayment(CreatePaymentDto dto) {
+        Order order = orderRepository.findById(dto.orderId())
+                .orElseThrow(() -> new OrderNotFoundException(dto.orderId()));
+
+        Payment payment = new Payment();
+        payment.setAmount(dto.amount());
+        payment.setTipAmount(dto.tipAmount());
+        payment.setPaymentType(dto.paymentType());
+        payment.setTimestamp(LocalDateTime.now());
+        payment.setOrder(order);
+
+        return paymentRepository.save(payment);
+    }
+
+    @Override
+    public Payment findPaymentById(Long id) {
+        return paymentRepository.findById(id)
+                .orElseThrow(() -> new PaymentNotFoundException(id));
+    }
+
+    @Override
+    public Payment findPaymentByOrderId(Long orderId) {
+        return paymentRepository.findByOrderId(orderId)
+                .orElseThrow(() -> new PaymentNotFoundException(orderId));
+    }
+
+    @Override
+    public List<Payment> findAllPayments() {
+        return paymentRepository.findAll();
+    }
+
+    @Override
+    @Transactional
+    public Payment updatePayment(Long id, CreatePaymentDto dto) {
+        Payment existingPayment = findPaymentById(id);
+
+        existingPayment.setAmount(dto.amount());
+        existingPayment.setTipAmount(dto.tipAmount());
+        existingPayment.setPaymentType(dto.paymentType());
+
+        return paymentRepository.save(existingPayment);
+    }
+
+}
Index: src/main/java/finki/db/tasty_tabs/service/impl/ProductServiceImpl.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/service/impl/ProductServiceImpl.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/service/impl/ProductServiceImpl.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -4,5 +4,4 @@
 import finki.db.tasty_tabs.entity.Inventory;
 import finki.db.tasty_tabs.entity.Product;
-import finki.db.tasty_tabs.entity.exceptions.CategoryNotFoundException;
 import finki.db.tasty_tabs.entity.exceptions.ProductNotFoundException;
 import finki.db.tasty_tabs.repository.InventoryRepository;
@@ -43,38 +42,53 @@
     @Override
     public Product updateProduct(Long id, CreateProductDto dto) {
-        Optional<Product> productTmp=productRepository.findById(id);
-        if(productTmp.isEmpty()){
-            throw new ProductNotFoundException(id);
+        Product existingProduct = productRepository.findById(id)
+                .orElseThrow(() -> new ProductNotFoundException(id));
+
+        // Update product fields
+        if (dto.name() != null) {
+            existingProduct.setName(dto.name());
+        }
+        if (dto.price() != null) {
+            existingProduct.setPrice(dto.price());
+        }
+        if (dto.taxClass() != null) {
+            existingProduct.setTaxClass(dto.taxClass());
+        }
+        if (dto.categoryId() != null) {
+            existingProduct.setCategory(categoryService.findById(dto.categoryId()));
+        }
+        if (dto.description() != null) {
+            existingProduct.setDescription(dto.description());
         }
 
+        // Manage inventory
+        if (Boolean.TRUE.equals(dto.manageInventory())) {
+            // ако производот претходно не менаџирал inventory -> креирај нов
+            if (Boolean.FALSE.equals(existingProduct.getManageInventory())) {
+                Inventory inventory = new Inventory(existingProduct, dto.quantity(), dto.restockLevel());
+                inventoryRepository.save(inventory);
+            } else {
+                // ако веќе постои -> update
+                Inventory inventory = inventoryRepository.findById(id)
+                        .orElseThrow(() -> new RuntimeException("Inventory not found for product " + id));
+                if (dto.quantity() != null) {
+                    inventory.setQuantity(dto.quantity());
+                }
+                if (dto.restockLevel() != null) {
+                    inventory.setRestockLevel(dto.restockLevel());
+                }
+                inventoryRepository.save(inventory);
+            }
+        } else if (Boolean.FALSE.equals(dto.manageInventory())) {
+            // ако од TRUE се префрла на FALSE -> бриши го inventory-то
+            inventoryRepository.findById(id).ifPresent(inventoryRepository::delete);
+        }
 
-        return productRepository.findById(id).map(existingProduct -> {
-            if (dto.name() != null) {
-                existingProduct.setName(dto.name());
-            }
-            if (dto.price() != null) {
-                existingProduct.setPrice(dto.price());
-            }
-            if(dto.taxClass()!=null){
-                existingProduct.setTaxClass(dto.taxClass());
-            }
-            existingProduct.setCategory(categoryService.findById(dto.categoryId()));
-            existingProduct.setDescription(dto.description());
-            if(dto.manageInventory()==Boolean.TRUE){
-                if(existingProduct.getManageInventory()==Boolean.FALSE){
-                    inventoryRepository.save(new Inventory(id,dto.quantity(),dto.restockLevel()));
-                }
-                else{
-                    Inventory inventorytmp=inventoryRepository.findById(id).get();
-                    inventorytmp.setQuantity(dto.quantity());
-                    inventorytmp.setRestockLevel(dto.restockLevel());
-                    inventoryRepository.save(inventorytmp);
-                }
-            }
-            if(dto.manageInventory()!=null){
-                existingProduct.setManageInventory(dto.manageInventory());
-            }
-            return productRepository.save(existingProduct);
-        }).orElseThrow(()-> new ProductNotFoundException(id));
+        // на крај секогаш го сетирај manageInventory флагот
+        if (dto.manageInventory() != null) {
+            existingProduct.setManageInventory(dto.manageInventory());
+        }
+
+        return productRepository.save(existingProduct);
     }
 
@@ -110,5 +124,6 @@
         Product product=productRepository.save(productTmp);
         if(product.getManageInventory()==Boolean.TRUE){
-            inventoryRepository.save(new Inventory(product.getId(),dto.quantity(),dto.restockLevel()));
+            Inventory inventory = new Inventory(product, dto.quantity(), dto.restockLevel());
+            inventoryRepository.save(inventory);
         }
         return product;
Index: src/main/java/finki/db/tasty_tabs/web/controllers/AssignmentController.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/controllers/AssignmentController.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/controllers/AssignmentController.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -7,11 +7,11 @@
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.core.Authentication;
 import org.springframework.web.bind.annotation.*;
-
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @RestController
@@ -28,26 +28,39 @@
     @Operation(summary = "Get all assignments")
     @GetMapping
-    public List<Assignment> getAllAssignments() {
-        return assignmentService.getAllAssignments();
+    public List<AssignmentDto> getAllAssignments() {
+        return assignmentService.getAllAssignments()
+                .stream()
+                .map(AssignmentDto::fromAssignment)
+                .collect(Collectors.toList());
     }
 
     @Operation(summary = "Get assignment by ID")
     @GetMapping("/{id}")
-    public Assignment getAssignmentById(@PathVariable Long id) {
-        return assignmentService.getAssignmentById(id);
+    public ResponseEntity<AssignmentDto> getAssignmentById(@PathVariable Long id) {
+        return ResponseEntity.ok(AssignmentDto.fromAssignment(assignmentService.getAssignmentById(id)));
     }
 
     @Operation(summary = "Create assignment (Manager only)")
     @PostMapping
-    public Assignment createAssignment(@RequestBody CreateAssignmentDto dto, Authentication authentication) {
-        String managerEmail = authentication.getName();
-        return assignmentService.createAssignment(dto, managerEmail);
+    public ResponseEntity<AssignmentDto> createAssignment(@RequestBody CreateAssignmentDto dto, Authentication authentication) {
+        try {
+            String managerEmail = authentication.getName();
+            Assignment assignment = assignmentService.createAssignment(dto, managerEmail);
+            return ResponseEntity.status(HttpStatus.CREATED).body(AssignmentDto.fromAssignment(assignment));
+        } catch (SecurityException e) {
+            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+        }
     }
 
     @Operation(summary = "Update assignment (Manager only)")
     @PutMapping("/{id}")
-    public Assignment updateAssignment(@PathVariable Long id, @RequestBody CreateAssignmentDto dto, Authentication authentication) {
-        String managerEmail = authentication.getName();
-        return assignmentService.updateAssignment(id, dto, managerEmail);
+    public ResponseEntity<AssignmentDto> updateAssignment(@PathVariable Long id, @RequestBody CreateAssignmentDto dto, Authentication authentication) {
+        try {
+            String managerEmail = authentication.getName();
+            Assignment updated = assignmentService.updateAssignment(id, dto, managerEmail);
+            return ResponseEntity.ok(AssignmentDto.fromAssignment(updated));
+        } catch (SecurityException e) {
+            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+        }
     }
 
@@ -55,33 +68,43 @@
     @DeleteMapping("/{id}")
     public ResponseEntity<Void> deleteAssignment(@PathVariable Long id, Authentication authentication) {
-        String managerEmail = authentication.getName();
-        assignmentService.deleteAssignment(id, managerEmail);
-        return ResponseEntity.noContent().build();
+        try {
+            String managerEmail = authentication.getName();
+            assignmentService.deleteAssignment(id, managerEmail);
+            return ResponseEntity.noContent().build();
+        } catch (SecurityException e) {
+            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+        }
     }
 
     @Operation(summary = "Employee clocks in their shift")
     @PostMapping("/{id}/clockin")
-    public Assignment clockInShift(
+    public ResponseEntity<AssignmentDto> clockInShift(
             @PathVariable Long id,
             @RequestParam(required = false) LocalDateTime clockInTime,
             Authentication authentication) {
-
-        String employeeEmail = authentication.getName();
-        LocalDateTime timeToSet = clockInTime != null ? clockInTime : LocalDateTime.now();
-        return assignmentService.clockInShift(id, employeeEmail, timeToSet);
+        try {
+            String employeeEmail = authentication.getName();
+            LocalDateTime timeToSet = clockInTime != null ? clockInTime : LocalDateTime.now();
+            Assignment assignment = assignmentService.clockInShift(id, employeeEmail, timeToSet);
+            return ResponseEntity.ok(AssignmentDto.fromAssignment(assignment));
+        } catch (SecurityException e) {
+            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+        }
     }
 
     @Operation(summary = "Employee clocks out their shift")
     @PostMapping("/{id}/clockout")
-    public Assignment clockOutShift(
+    public ResponseEntity<AssignmentDto> clockOutShift(
             @PathVariable Long id,
             @RequestParam(required = false) LocalDateTime clockOutTime,
             Authentication authentication) {
-
-        String employeeEmail = authentication.getName();
-        LocalDateTime timeToSet = clockOutTime != null ? clockOutTime : LocalDateTime.now();
-        return assignmentService.clockOutShift(id, employeeEmail, timeToSet);
+        try {
+            String employeeEmail = authentication.getName();
+            LocalDateTime timeToSet = clockOutTime != null ? clockOutTime : LocalDateTime.now();
+            Assignment assignment = assignmentService.clockOutShift(id, employeeEmail, timeToSet);
+            return ResponseEntity.ok(AssignmentDto.fromAssignment(assignment));
+        } catch (SecurityException e) {
+            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+        }
     }
-
 }
-
Index: src/main/java/finki/db/tasty_tabs/web/controllers/CategoryController.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/controllers/CategoryController.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/controllers/CategoryController.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -3,11 +3,14 @@
 import finki.db.tasty_tabs.entity.Category;
 import finki.db.tasty_tabs.service.CategoryService;
+import finki.db.tasty_tabs.web.dto.CategoryDto;
 import finki.db.tasty_tabs.web.dto.CreateCategoryDto;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 @RestController
@@ -24,32 +27,37 @@
     @Operation(summary = "Get all categories")
     @GetMapping
-    public List<Category> findAll() {
-        return categoryService.getAllCategories();
+    public ResponseEntity<List<CategoryDto>> findAll() {
+        List<CategoryDto> categories = categoryService.getAllCategories().stream()
+                .map(CategoryDto::from)
+                .collect(Collectors.toList());
+        return ResponseEntity.ok(categories);
     }
 
     @Operation(summary = "Get category by ID")
     @GetMapping("/{id}")
-    public Category findById(@PathVariable Long id) {
-        return categoryService.findById(id);
+    public ResponseEntity<CategoryDto> findById(@PathVariable Long id) {
+        Category category = categoryService.findById(id);
+        return ResponseEntity.ok(CategoryDto.from(category));
     }
 
     @Operation(summary = "Create category")
     @PostMapping("/add")
-    @ResponseStatus(HttpStatus.CREATED)
-    public Category save(@RequestBody CreateCategoryDto createCategoryDto) {
-        return categoryService.createCategory(createCategoryDto.toCategory());
+    public ResponseEntity<CategoryDto> save(@RequestBody CreateCategoryDto createCategoryDto) {
+        Category saved = categoryService.createCategory(createCategoryDto.toCategory());
+        return ResponseEntity.status(HttpStatus.CREATED).body(CategoryDto.from(saved));
     }
 
     @Operation(summary = "Update category")
     @PutMapping("/edit/{id}")
-    public Category update(@PathVariable Long id, @RequestBody CreateCategoryDto createCategoryDto) {
-        return categoryService.updateCategory(id, createCategoryDto.toCategory());
+    public ResponseEntity<CategoryDto> update(@PathVariable Long id, @RequestBody CreateCategoryDto createCategoryDto) {
+        Category updated = categoryService.updateCategory(id, createCategoryDto.toCategory());
+        return ResponseEntity.ok(CategoryDto.from(updated));
     }
 
     @Operation(summary = "Delete category")
     @DeleteMapping("/delete/{id}")
-    @ResponseStatus(HttpStatus.NO_CONTENT)
-    public void deleteById(@PathVariable Long id) {
+    public ResponseEntity<Void> deleteById(@PathVariable Long id) {
         categoryService.deleteCategory(id);
+        return ResponseEntity.noContent().build();
     }
 }
Index: src/main/java/finki/db/tasty_tabs/web/controllers/PaymentController.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/controllers/PaymentController.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/web/controllers/PaymentController.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,61 @@
+package finki.db.tasty_tabs.web.controllers;
+
+
+import finki.db.tasty_tabs.entity.Payment;
+import finki.db.tasty_tabs.service.PaymentService;
+import finki.db.tasty_tabs.web.dto.CreatePaymentDto;
+import finki.db.tasty_tabs.web.dto.PaymentDto;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/api/payments")
+@Tag(name = "Payment API", description = "Endpoints for managing payments")
+@RequiredArgsConstructor
+public class PaymentController {
+
+    private final PaymentService paymentService;
+
+    @Operation(summary = "Create a new payment for an order")
+    @PostMapping
+    public ResponseEntity<PaymentDto> createPayment(@RequestBody CreatePaymentDto dto) {
+        Payment newPayment = paymentService.createPayment(dto);
+        return ResponseEntity.ok(PaymentDto.from(newPayment));
+    }
+
+    @Operation(summary = "Get a payment by its ID")
+    @GetMapping("/{id}")
+    public ResponseEntity<PaymentDto> getPaymentById(@PathVariable Long id) {
+        Payment payment = paymentService.findPaymentById(id);
+        return ResponseEntity.ok(PaymentDto.from(payment));
+    }
+
+    @Operation(summary = "Get a payment by its associated order ID")
+    @GetMapping("/order/{orderId}")
+    public ResponseEntity<PaymentDto> getPaymentByOrderId(@PathVariable Long orderId) {
+        Payment payment = paymentService.findPaymentByOrderId(orderId);
+        return ResponseEntity.ok(PaymentDto.from(payment));
+    }
+
+    @Operation(summary = "Get all payments")
+    @GetMapping
+    public List<PaymentDto> getAllPayments() {
+        return paymentService.findAllPayments().stream()
+                .map(PaymentDto::from)
+                .collect(Collectors.toList());
+    }
+
+    @Operation(summary = "Update an existing payment")
+    @PutMapping("/{id}")
+    public ResponseEntity<PaymentDto> updatePayment(@PathVariable Long id, @RequestBody CreatePaymentDto dto) {
+        Payment updatedPayment = paymentService.updatePayment(id, dto);
+        return ResponseEntity.ok(PaymentDto.from(updatedPayment));
+    }
+
+}
Index: src/main/java/finki/db/tasty_tabs/web/controllers/ProductController.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/controllers/ProductController.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/controllers/ProductController.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -4,10 +4,13 @@
 import finki.db.tasty_tabs.service.ProductService;
 import finki.db.tasty_tabs.web.dto.CreateProductDto;
+import finki.db.tasty_tabs.web.dto.ProductDto;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 @RestController
@@ -24,38 +27,44 @@
     @Operation(summary = "Get all products")
     @GetMapping
-    public List<Product> findAll() {
-        return productService.getAllProducts();
+    public ResponseEntity<List<ProductDto>> findAll() {
+        List<ProductDto> products = productService.getAllProducts().stream()
+                .map(ProductDto::from)
+                .collect(Collectors.toList());
+        return ResponseEntity.ok(products);
     }
 
     @Operation(summary = "Get product by ID")
     @GetMapping("/{id}")
-    public Product findById(@PathVariable Long id) {
-        return productService.findById(id);
+    public ResponseEntity<ProductDto> findById(@PathVariable Long id) {
+        return ResponseEntity.ok(ProductDto.from(productService.findById(id)));
     }
 
     @Operation(summary = "Search products by name")
     @GetMapping("/search")
-    public List<Product> findByName(@RequestParam String name) {
-        return productService.getProductsByName(name);
+    public ResponseEntity<List<ProductDto>> findByName(@RequestParam String name) {
+        List<ProductDto> products = productService.getProductsByName(name).stream()
+                .map(ProductDto::from)
+                .collect(Collectors.toList());
+        return ResponseEntity.ok(products);
     }
 
     @Operation(summary = "Create new product")
     @PostMapping("/add")
-    @ResponseStatus(HttpStatus.CREATED)
-    public Product save(@RequestBody CreateProductDto dto) {
-        return productService.createProduct(dto);
+    public ResponseEntity<ProductDto> save(@RequestBody CreateProductDto dto) {
+        return ResponseEntity.status(HttpStatus.CREATED).body(ProductDto.from(productService.createProduct(dto)));
     }
 
     @Operation(summary = "Update product")
     @PutMapping("/edit/{id}")
-    public Product update(@PathVariable Long id, @RequestBody CreateProductDto dto) {
-        return productService.updateProduct(id, dto);
+    public ResponseEntity<ProductDto> update(@PathVariable Long id, @RequestBody CreateProductDto dto) {
+        var updatedProduct = productService.updateProduct(id, dto);
+        return ResponseEntity.ok(ProductDto.from(updatedProduct));
     }
 
     @Operation(summary = "Delete product")
     @DeleteMapping("/delete/{id}")
-    @ResponseStatus(HttpStatus.NO_CONTENT)
-    public void delete(@PathVariable Long id) {
+    public ResponseEntity<Void> delete(@PathVariable Long id) {
         productService.deleteProduct(id);
+        return ResponseEntity.noContent().build();
     }
 }
Index: src/main/java/finki/db/tasty_tabs/web/controllers/RestaurantTableController.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/controllers/RestaurantTableController.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/controllers/RestaurantTableController.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -4,10 +4,13 @@
 import finki.db.tasty_tabs.service.RestaurantTableService;
 import finki.db.tasty_tabs.web.dto.CreateRestaurantTableDto;
+import finki.db.tasty_tabs.web.dto.RestaurantTableDto;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.http.HttpStatus;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 @RestController
@@ -24,27 +27,32 @@
     @Operation(summary = "Get all tables", description = "Retrieves a list of all restaurant tables.")
     @GetMapping
-    public List<RestaurantTable> findAll() {
-        return restaurantTableService.getAll();
+    public List<RestaurantTableDto> findAll() {
+        return restaurantTableService.getAll()
+                .stream()
+                .map(RestaurantTableDto::from)
+                .collect(Collectors.toList());
     }
 
     @Operation(summary = "Get a table by table number", description = "Finds a table by its table number.")
     @GetMapping("/{tableNumber}")
-    public RestaurantTable findById(@PathVariable Integer tableNumber) {
-        return restaurantTableService.findById(tableNumber);
-    }
+    public ResponseEntity<RestaurantTableDto> findById(@PathVariable Integer tableNumber) {
+        return ResponseEntity.ok(RestaurantTableDto.from(restaurantTableService.findById(tableNumber)));
+                }
 
     @Operation(summary = "Add a new table", description = "Creates a new restaurant table.")
     @PostMapping("/add")
-    public RestaurantTable save(@RequestBody CreateRestaurantTableDto dto) {
-        return restaurantTableService.createTable(dto.toRestaurantTable());
+    public ResponseEntity<RestaurantTableDto> save(@RequestBody CreateRestaurantTableDto dto) {
+        RestaurantTable newTable = restaurantTableService.createTable(dto.toRestaurantTable());
+        return ResponseEntity.status(HttpStatus.CREATED).body(RestaurantTableDto.from(newTable));
     }
 
     @Operation(summary = "Update an existing table", description = "Updates a restaurant table by its table number.")
     @PutMapping("/edit/{tableNumber}")
-    public RestaurantTable update(
+    public ResponseEntity<RestaurantTableDto> update(
             @PathVariable Integer tableNumber,
             @RequestBody CreateRestaurantTableDto dto
     ) {
-        return restaurantTableService.updateTable(tableNumber, dto.toRestaurantTable());
+        RestaurantTable updatedTable = restaurantTableService.updateTable(tableNumber, dto.toRestaurantTable());
+        return ResponseEntity.ok(RestaurantTableDto.from(updatedTable));
     }
 
Index: src/main/java/finki/db/tasty_tabs/web/controllers/ShiftController.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/controllers/ShiftController.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/controllers/ShiftController.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -7,5 +7,5 @@
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.core.Authentication;
@@ -13,4 +13,5 @@
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 @RestController
@@ -27,26 +28,32 @@
     @Operation(summary = "Get all shifts")
     @GetMapping
-    public List<Shift> getAllShifts() {
-        return shiftService.getAllShifts();
+    public List<ShiftDto> getAllShifts() {
+        return shiftService.getAllShifts()
+                .stream()
+                .map(ShiftDto::fromShift)
+                .collect(Collectors.toList());
     }
 
     @Operation(summary = "Get shift by ID")
     @GetMapping("/{id}")
-    public Shift getShiftById(@PathVariable Long id) {
-        return shiftService.getShiftById(id);
+    public ResponseEntity<ShiftDto> getShiftById(@PathVariable Long id) {
+        Shift shift = shiftService.getShiftById(id);
+        return ResponseEntity.ok(ShiftDto.fromShift(shift));
     }
 
     @Operation(summary = "Create a shift (Manager only)")
     @PostMapping
-    public Shift createShift(@RequestBody CreateShiftDto dto, Authentication authentication) {
+    public ResponseEntity<ShiftDto> createShift(@RequestBody CreateShiftDto dto, Authentication authentication) {
         String username = authentication.getName();
-        return shiftService.createShift(dto, username);
+        Shift shift = shiftService.createShift(dto, username);
+        return new ResponseEntity<>(ShiftDto.fromShift(shift), HttpStatus.CREATED);
     }
 
     @Operation(summary = "Update a shift (Manager only)")
     @PutMapping("/{id}")
-    public Shift updateShift(@PathVariable Long id, @RequestBody CreateShiftDto dto, Authentication authentication) {
+    public ResponseEntity<ShiftDto> updateShift(@PathVariable Long id, @RequestBody CreateShiftDto dto, Authentication authentication) {
         String username = authentication.getName();
-        return shiftService.updateShift(id, dto, username);
+        Shift updatedShift = shiftService.updateShift(id, dto, username);
+        return ResponseEntity.ok(ShiftDto.fromShift(updatedShift));
     }
 
Index: src/main/java/finki/db/tasty_tabs/web/dto/AssignmentDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/AssignmentDto.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/dto/AssignmentDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -11,6 +11,6 @@
         LocalDateTime clockInTime,
         LocalDateTime clockOutTime,
-        Manager manager,
-        Employee employee
+        ManagerDto manager,
+        EmployeeDto employee
 ) {
     public static AssignmentDto fromAssignment(Assignment assignment) {
@@ -19,6 +19,6 @@
                 assignment.getClockInTime(),
                 assignment.getClockOutTime(),
-                assignment.getManager(),
-                assignment.getEmployee()
+                ManagerDto.from(assignment.getManager()),
+                EmployeeDto.from(assignment.getEmployee())
         );
     }
Index: src/main/java/finki/db/tasty_tabs/web/dto/CategoryDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/CategoryDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/web/dto/CategoryDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,13 @@
+package finki.db.tasty_tabs.web.dto;
+
+import finki.db.tasty_tabs.entity.Category;
+
+public record CategoryDto(
+        Long id,
+        String name,
+        Boolean isAvailable
+) {
+    public static CategoryDto from(Category category) {
+        return new CategoryDto(category.getId(), category.getName(), category.getIsAvailable());
+    }
+}
Index: src/main/java/finki/db/tasty_tabs/web/dto/CreatePaymentDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/CreatePaymentDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/web/dto/CreatePaymentDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,8 @@
+package finki.db.tasty_tabs.web.dto;
+
+public record CreatePaymentDto(
+        Double tipAmount,
+        String paymentType,
+        Double amount,
+        Long orderId
+) {}
Index: src/main/java/finki/db/tasty_tabs/web/dto/EmployeeDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/EmployeeDto.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/dto/EmployeeDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,9 +1,27 @@
 package finki.db.tasty_tabs.web.dto;
-import lombok.Data;
+
+import finki.db.tasty_tabs.entity.Employee;
+
 import java.time.LocalDateTime;
-import java.util.List;
-@Data
-class EmployeeDto extends UserDto {
-    private Double netSalary;
-    private Double grossSalary;
+
+public record EmployeeDto(
+        Long id,
+        String email,
+        String street,
+        String city,
+        String phoneNumber,
+        Double netSalary,
+        Double grossSalary
+) {
+    public static EmployeeDto from(Employee employee) {
+        return new EmployeeDto(
+                employee.getId(),
+                employee.getEmail(),
+                employee.getStreet(),
+                employee.getCity(),
+                employee.getPhoneNumber(),
+                employee.getNetSalary(),
+                employee.getGrossSalary()
+        );
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/web/dto/FrontStaffDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/FrontStaffDto.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/dto/FrontStaffDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,9 +1,29 @@
 package finki.db.tasty_tabs.web.dto;
-import lombok.Data;
-import java.time.LocalDateTime;
-import java.util.List;
-@Data
-class FrontStaffDto extends EmployeeDto {
-    private Double tipPercent;
-    private String staffRoleName;
+
+import finki.db.tasty_tabs.entity.FrontStaff;
+
+public record FrontStaffDto(
+        Long id,
+        String email,
+        String street,
+        String city,
+        String phoneNumber,
+        Double netSalary,
+        Double grossSalary,
+        Double tipPercent,
+        String staffRoleName
+) {
+    public static FrontStaffDto from(FrontStaff user) {
+        return new FrontStaffDto(
+                user.getId(),
+                user.getEmail(),
+                user.getStreet(),
+                user.getCity(),
+                user.getPhoneNumber(),
+                user.getNetSalary(),
+                user.getGrossSalary(),
+                user.getTipPercent(),     // Предпоставуваме дека User има tipPercent
+                user.getStaffRole().getName()   // Предпоставуваме дека User има staffRoleName
+        );
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/web/dto/ManagerDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/ManagerDto.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/dto/ManagerDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,6 +1,13 @@
 package finki.db.tasty_tabs.web.dto;
+import finki.db.tasty_tabs.entity.Manager;
 import lombok.Data;
 import java.time.LocalDateTime;
 import java.util.List;
-@Data
-class ManagerDto extends EmployeeDto {}
+public record ManagerDto(
+        Long id,
+        String email
+        ){
+    public static ManagerDto from(Manager manager){
+        return new ManagerDto(manager.getId(), manager.getEmail());
+    }
+}
Index: src/main/java/finki/db/tasty_tabs/web/dto/OrderItemDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/OrderItemDto.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/dto/OrderItemDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -11,5 +11,6 @@
         Boolean isProcessed,
         LocalDateTime timestamp,
-        Long productId
+        Long productId,
+        String productName
 ) {
     public static OrderItemDto from(OrderItem orderItem) {
@@ -20,5 +21,6 @@
                 orderItem.getIsProcessed(),
                 orderItem.getTimestamp(),
-                orderItem.getProduct().getId()
+                orderItem.getProduct().getId(),
+                orderItem.getProduct().getName()
         );
     }
Index: src/main/java/finki/db/tasty_tabs/web/dto/PaymentDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/PaymentDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/web/dto/PaymentDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,25 @@
+package finki.db.tasty_tabs.web.dto;
+
+import finki.db.tasty_tabs.entity.Payment;
+
+import java.time.LocalDateTime;
+
+public record PaymentDto(
+        Long id,
+        Double tipAmount,
+        LocalDateTime timestamp,
+        String paymentType,
+        Double amount,
+        Long orderId
+) {
+    public static PaymentDto from(Payment payment) {
+        return new PaymentDto(
+                payment.getId(),
+                payment.getTipAmount(),
+                payment.getTimestamp(),
+                payment.getPaymentType(),
+                payment.getAmount(),
+                payment.getOrder().getId()
+        );
+    }
+}
Index: src/main/java/finki/db/tasty_tabs/web/dto/ProductDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/ProductDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/web/dto/ProductDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,25 @@
+package finki.db.tasty_tabs.web.dto;
+
+import finki.db.tasty_tabs.entity.Product;
+
+public record ProductDto(
+        Long id,
+        String name,
+        Double price,
+        String taxClass,
+        String description,
+        Boolean manageInventory,
+        CategoryDto category
+) {
+    public static ProductDto from(Product product) {
+        return new ProductDto(product.getId(),
+                product.getName(),
+                product.getPrice(),
+                product.getTaxClass(),
+                product.getDescription(),
+                product.getManageInventory(),
+                CategoryDto.from(product.getCategory())
+                );
+    }
+}
+
Index: src/main/java/finki/db/tasty_tabs/web/dto/RestaurantTableDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/RestaurantTableDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/java/finki/db/tasty_tabs/web/dto/RestaurantTableDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,12 @@
+package finki.db.tasty_tabs.web.dto;
+
+import finki.db.tasty_tabs.entity.RestaurantTable;
+
+public record RestaurantTableDto(
+        Integer tableNumber,
+        Integer seatCapacity
+) {
+    public static RestaurantTableDto from(RestaurantTable table){
+        return new RestaurantTableDto(table.getTableNumber(), table.getSeatCapacity());
+    }
+}
Index: src/main/java/finki/db/tasty_tabs/web/dto/ShiftDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/ShiftDto.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/dto/ShiftDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -12,5 +12,5 @@
         LocalDateTime start,
         LocalDateTime end,
-        Manager manager,
+        ManagerDto manager,
         List<AssignmentDto> assignments
 ) {
@@ -21,5 +21,5 @@
                 shift.getStart(),
                 shift.getEnd(),
-                shift.getManager(),
+                ManagerDto.from(shift.getManager()),
                 shift.getAssignments().stream()
                         .map(AssignmentDto::fromAssignment)
Index: src/main/java/finki/db/tasty_tabs/web/dto/UserDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/UserDto.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/dto/UserDto.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,18 +1,13 @@
 package finki.db.tasty_tabs.web.dto;
+
 import finki.db.tasty_tabs.entity.User;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import java.time.LocalDateTime;
-import java.util.List;
 
-@Data
-@AllArgsConstructor
-public class UserDto {
-    private Long id;
-    private String email;
-    private String street;
-    private String city;
-    private String phoneNumber;
-
+public record UserDto(
+        Long id,
+        String email,
+        String street,
+        String city,
+        String phoneNumber
+) {
     public static UserDto from(User user) {
         return new UserDto(
Index: src/main/java/finki/db/tasty_tabs/web/exception/FilterExceptionHandler.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/exception/FilterExceptionHandler.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/exception/FilterExceptionHandler.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -67,5 +67,5 @@
         }
 
-        log.warn("An exception occurred: {}", exception.getMessage(), exception);
+//        log.warn("An exception occurred: {}", exception.getMessage(), exception);
 
         return detail;
Index: src/main/java/finki/db/tasty_tabs/web/exception/GlobalExceptionHandler.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/exception/GlobalExceptionHandler.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/exception/GlobalExceptionHandler.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -26,5 +26,5 @@
         ProblemDetail errorDetail = null;
 
-        log.warn("Security exception: {}", exception.getMessage());
+//        log.warn("Security exception: {}", exception.getMessage());
         if (exception instanceof BadCredentialsException) {
             errorDetail = ProblemDetail.forStatusAndDetail(HttpStatusCode.valueOf(401), exception.getMessage());
@@ -78,5 +78,5 @@
         ProblemDetail errorDetail = null;
 
-        log.warn("Domain exception: {}", exception.getMessage());
+//        log.warn("Domain exception: {}", exception.getMessage());
 
         if (errorDetail == null) {
@@ -94,5 +94,5 @@
         errorDetail.setProperty("description", "Unknown internal server error.");
 
-        log.error("Unexpected exception: {}", exception.getMessage(), exception);
+//        log.error("Unexpected exception: {}", exception.getMessage(), exception);
 
         return errorDetail;
Index: src/main/java/finki/db/tasty_tabs/web/filter/HttpLoggingFilter.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/filter/HttpLoggingFilter.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/filter/HttpLoggingFilter.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -37,10 +37,10 @@
 
             // — log it —
-            log.info("Request: {} {} {} from {} – {}ms",
-                    resp.getStatus(),
-                    req.getMethod(),
-                    req.getRequestURI(),
-                    req.getRemoteAddr(),
-                    timeMs);
+//            log.info("Request: {} {} {} from {} – {}ms",
+//                    resp.getStatus(),
+//                    req.getMethod(),
+//                    req.getRequestURI(),
+//                    req.getRemoteAddr(),
+//                    timeMs);
 
             // — cleanup —
Index: src/main/java/finki/db/tasty_tabs/web/filter/JwtAuthenticationFilter.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/filter/JwtAuthenticationFilter.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/filter/JwtAuthenticationFilter.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -63,15 +63,15 @@
 
                 SecurityContextHolder.getContext().setAuthentication(authentication);
-                log.debug("JWT token validated");
+//                log.debug("JWT token validated");
             }
             filterChain.doFilter(request, response);
         } catch (ExpiredJwtException e) {
-            log.debug("JWT token expired: {}", e.getMessage());
+//            log.debug("JWT token expired: {}", e.getMessage());
             FilterExceptionHandler.handleException(request, response, e);
         } catch (AuthorizationDeniedException e) {
-            log.debug("Authorization denied: {}", e.getMessage());
+//            log.debug("Authorization denied: {}", e.getMessage());
             FilterExceptionHandler.handleException(request, response, e);
         } catch (JwtException e) {
-            log.debug("JWT token invalid: {}", e.getMessage());
+//            log.debug("JWT token invalid: {}", e.getMessage());
             filterChain.doFilter(request, response);
         } catch (Exception e) {
Index: src/main/java/finki/db/tasty_tabs/web/security/PublicUrlProvider.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/security/PublicUrlProvider.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/security/PublicUrlProvider.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -10,5 +10,7 @@
     private static final List<String> PUBLIC_PATHS = List.of(
             "/swagger-ui/**",
-            "/v3/api-docs/**"
+            "/v3/api-docs/**",
+            "/api/categories/**",
+            "/api/**"
     );
 
Index: src/main/java/finki/db/tasty_tabs/web/security/UserDetailsServiceImpl.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/security/UserDetailsServiceImpl.java	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/java/finki/db/tasty_tabs/web/security/UserDetailsServiceImpl.java	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -22,5 +22,5 @@
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-        log.debug("Loading user by username: {}", username);
+//        log.debug("Loading user by username: {}", username);
         User user = userRepository.findByEmail(username)
                 .orElseThrow(() -> new UsernameNotFoundException("User not found with email: " + username));
Index: src/main/resources/application-test.properties
===================================================================
--- src/main/resources/application-test.properties	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
+++ src/main/resources/application-test.properties	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -0,0 +1,7 @@
+spring.datasource.url=jdbc:postgresql://localhost:5435/spring_boot_db
+spring.datasource.username=springuser
+spring.datasource.password=springpassword
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.jpa.hibernate.ddl-auto=none
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+spring.flyway.enabled=false
Index: src/main/resources/application.properties
===================================================================
--- src/main/resources/application.properties	(revision 07aed49d8bfab3550a488b63c9872cd86c74257c)
+++ src/main/resources/application.properties	(revision 4ad4646e4264693b211e17884536e5a0c24f6535)
@@ -1,4 +1,9 @@
 spring.application.name=Tasty Tabs
-spring.datasource.url=jdbc:postgresql://localhost:5433/your_db
-spring.datasource.username=your_db_user
-spring.datasource.password=your_db_password
+#spring.datasource.url=jdbc:postgresql://localhost:5433/your_db
+#spring.datasource.username=your_db_user
+#spring.datasource.password=your_db_password
+spring.profiles.active=test
+springdoc.api-docs.enabled=true
+springdoc.swagger-ui.enabled=true
+jwt.secret=e249a8adbb3572a23f1520e69573aab8bc4b2eaf0bfab9c7a8d118a0c5d799aa
+jwt.expiration=86400000
