Repository: rfnobando/hibernate-tickets
Pull request #3: Create Base Model Classes
Author: login: Emi3Dart
Created: 2025-04-28T17:47:03Z | Merged: 2025-04-29T02:44:14Z

This PR introduces the initial base classes for the project, including models and a simple controller.
Created under the src/model and src/controller directories, these classes establish the foundational structure for the application's data and basic interactions.

 Included model classes:
- AttachedPhoto
- Client
- Employee
- ProfilePhoto
- Status
- Ticket
- TicketCategory
- TicketMessage
- User



Diff:
diff --git a/app/src/controller/Test.java b/app/src/controller/Test.java
index c46f370..83f7c2d 100644
--- a/app/src/controller/Test.java
+++ b/app/src/controller/Test.java
@@ -4,6 +4,7 @@ public class Test {
 
 	public static void main(String[] args) {
 		System.out.println("OK");
+		System.out.println(System.getProperty("java.version"));
 	}
 
 }
diff --git a/app/src/model/AttachedPicture.java b/app/src/model/AttachedPicture.java
new file mode 100644
index 0000000..07fe5b4
--- /dev/null
+++ b/app/src/model/AttachedPicture.java
@@ -0,0 +1,37 @@
+package model;
+
+public class AttachedPicture {
+	private long id;
+	private String fileName;
+	
+	public AttachedPicture(){}
+	
+	public AttachedPicture(String fileName) {
+		super();
+		this.fileName = fileName;
+	}
+	public long getId() {
+		return id;
+	}
+	private void setId(long id) {
+		this.id = id;
+	}
+	
+	public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	@Override
+	public String toString() {
+		return "AttachedPicture [id=" + id + ", fileName=" + fileName + "]";
+	}
+	
+	public boolean equals(AttachedPicture picture) {
+		return this.fileName.equals(picture.getFileName());
+	}
+	
+}
diff --git a/app/src/model/Customer.java b/app/src/model/Customer.java
new file mode 100644
index 0000000..ecf1110
--- /dev/null
+++ b/app/src/model/Customer.java
@@ -0,0 +1,31 @@
+package model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Customer extends User {
+	private List<Ticket> createdTickets;
+
+	
+	public Customer(){}
+	
+	public Customer(String name, String surname, String email, String password, ProfilePicture profilePhoto) {
+		super(name, surname, email, password, profilePhoto);
+		this.createdTickets = new ArrayList<Ticket>();
+	}
+
+	public List<Ticket> getCreatedTickets() {
+		return createdTickets;
+	}
+
+	public void setCreatedTickets(List<Ticket> createdTickets) {
+		this.createdTickets = createdTickets;
+	}
+
+	@Override
+	public String toString() {
+		return "Customer [createdTickets=" + createdTickets + "]" +"]";
+	}
+	
+	
+}
diff --git a/app/src/model/Employee.java b/app/src/model/Employee.java
new file mode 100644
index 0000000..a5733d7
--- /dev/null
+++ b/app/src/model/Employee.java
@@ -0,0 +1,30 @@
+package model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Employee extends User {
+	private List<Ticket> managedTickets;
+
+	public Employee(){}
+	
+	public Employee(String name, String surname, String email, String password, ProfilePicture profilePhoto) {
+		super(name, surname, email, password, profilePhoto);
+		this.managedTickets = new ArrayList<Ticket>();
+	}
+
+	public List<Ticket> getManagedTickets() {
+		return managedTickets;
+	}
+
+	public void setManagedTickets(List<Ticket> managedTickets) {
+		this.managedTickets = managedTickets;
+	}
+
+	@Override
+	public String toString() {
+		return "Employee [managedTickets=" + managedTickets + "]"+ "]";
+	}
+	
+	
+}
diff --git a/app/src/model/ProfilePicture.java b/app/src/model/ProfilePicture.java
new file mode 100644
index 0000000..ce2b667
--- /dev/null
+++ b/app/src/model/ProfilePicture.java
@@ -0,0 +1,36 @@
+package model;
+
+public class ProfilePicture {
+	private long id;
+	private String fileName;
+	
+	public ProfilePicture(){}
+	
+	public ProfilePicture(String fileName) {
+		super();
+		this.fileName = fileName;
+	}
+	public long getId() {
+		return id;
+	}
+	private void setId(long id) {
+		this.id = id;
+	}
+	
+	public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	@Override
+	public String toString() {
+		return "ProfilePhoto [id=" + id + ", fileName=" + fileName + "]";
+	}
+	
+	public boolean equals(ProfilePicture picture) {
+		return this.fileName.equals(picture.getFileName());
+	}
+}
diff --git a/app/src/model/Status.java b/app/src/model/Status.java
new file mode 100644
index 0000000..f2e3aa1
--- /dev/null
+++ b/app/src/model/Status.java
@@ -0,0 +1,34 @@
+package model;
+
+public class Status {
+	private long id;
+	private String name;
+	
+	public Status(){}
+	
+	public Status(String name) {
+		super();
+		this.name = name;
+	}
+	public long getId() {
+		return id;
+	}
+	private void setId(long id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	@Override
+	public String toString() {
+		return "Status [id=" + id + ", name=" + name + "]";
+	}
+	
+	public boolean equals(Status status) {
+		return this.name.equals(status.getName());
+	}
+	
+}
diff --git a/app/src/model/Ticket.java b/app/src/model/Ticket.java
new file mode 100644
index 0000000..83d13c0
--- /dev/null
+++ b/app/src/model/Ticket.java
@@ -0,0 +1,117 @@
+package model;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Ticket {
+	private long id;
+	private String title;
+	private LocalDateTime createdAt;
+	private LocalDateTime updatedAt;
+	private Customer customer;
+	private List<Employee> employees;
+	private TicketCategory ticketCategory;
+	private Status status;
+	private List<TicketMessage> messages;
+	
+	public Ticket(){}
+	
+	public Ticket(String title, LocalDateTime createdAt, LocalDateTime updatedAt, Customer customer,
+			TicketCategory ticketCategory, Status status) {
+		super();
+		this.title = title;
+		this.createdAt = createdAt;
+		this.updatedAt = updatedAt;
+		this.customer = customer;
+		this.employees = new ArrayList<Employee>();
+		this.ticketCategory = ticketCategory;
+		this.status = status;
+		this.messages = new ArrayList<TicketMessage>();
+		
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	private void setId(long id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public LocalDateTime getCreatedAt() {
+		return createdAt;
+	}
+
+	public void setCreatedAt(LocalDateTime createdAt) {
+		this.createdAt = createdAt;
+	}
+	
+	public LocalDateTime getUpdatedAt() {
+		return updatedAt;
+	}
+
+	public void setUpdatedAt(LocalDateTime updatedAt) {
+		this.updatedAt = updatedAt;
+	}
+
+	public Customer getCustomer() {
+		return customer;
+	}
+
+	public void setCustomer(Customer customer) {
+		this.customer = customer;
+	}
+
+	public List<Employee> getEmployees() {
+		return employees;
+	}
+
+	public void setEmployees(List<Employee> employees) {
+		this.employees = employees;
+	}
+
+	public TicketCategory getTicketCategory() {
+		return ticketCategory;
+	}
+
+	public void setTicketCategory(TicketCategory ticketCategory) {
+		this.ticketCategory = ticketCategory;
+	}
+
+	public Status getStatus() {
+		return status;
+	}
+
+	public void setStatus(Status status) {
+		this.status = status;
+	}
+
+	public List<TicketMessage> getMessages() {
+		return messages;
+	}
+
+	public void setMessages(List<TicketMessage> messages) {
+		this.messages = messages;
+	}
+
+	@Override
+	public String toString() {
+		return "Ticket [id=" + id + ", title=" + title + ", createdAt=" + createdAt + ", updatedAt=" + updatedAt
+				+ ", customer=" + customer.getId() + ", employees=" + (employees != null ? employees.stream().map(c -> c.getId()).collect(Collectors.toList()) : null) + ", ticketCategory=" + ticketCategory + ", status="
+				+ status + ", messages=" + messages + "]";
+	}
+	
+	public boolean equals(Ticket ticket) {
+		return this.id == ticket.getId(); 
+	}
+}
diff --git a/app/src/model/TicketCategory.java b/app/src/model/TicketCategory.java
new file mode 100644
index 0000000..0994a13
--- /dev/null
+++ b/app/src/model/TicketCategory.java
@@ -0,0 +1,44 @@
+package model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TicketCategory {
+	private long id;
+	private String name;
+	private List<Ticket> tickets;
+	
+	public TicketCategory(){}
+	
+	public TicketCategory(String name) {
+		super();
+		this.name = name;
+		this.tickets = new ArrayList<Ticket>();
+	}
+	public long getId() {
+		return id;
+	}
+	private void setId(long id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public List<Ticket> getTickets() {
+		return tickets;
+	}
+	public void setTickets(List<Ticket> tickets) {
+		this.tickets = tickets;
+	}
+	@Override
+	public String toString() {
+		return "TicketCategory [id=" + id + ", name=" + name + ", tickets=" + tickets + "]";
+	}
+	
+	public boolean equals(TicketCategory ticketCategory) {
+		return this.name.equals(ticketCategory.getName());
+	}
+}
diff --git a/app/src/model/TicketMessage.java b/app/src/model/TicketMessage.java
new file mode 100644
index 0000000..00fe701
--- /dev/null
+++ b/app/src/model/TicketMessage.java
@@ -0,0 +1,69 @@
+package model;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TicketMessage {
+	private long id;
+	private String body;
+	private LocalDateTime createdAt;
+	private User user;
+	private List<AttachedPicture> attachedPictures;
+	
+	public TicketMessage() {}
+	 
+	public TicketMessage(String body, LocalDateTime createdAt, User user) {
+		super();
+		this.body = body;
+		this.createdAt = createdAt;
+		this.user = user;
+		this.attachedPictures = new ArrayList<AttachedPicture>();
+	}
+	public long getId() {
+		return id;
+	}
+	private void setId(long id) {
+		this.id = id;
+	}
+
+	public String getBody() {
+		return body;
+	}
+
+	public void setBody(String body) {
+		this.body = body;
+	}
+
+	public LocalDateTime getCreatedAt() {
+		return createdAt;
+	}
+
+	public void setCreatedAt(LocalDateTime createdAt) {
+		this.createdAt = createdAt;
+	}
+
+	public User getUser() {
+		return user;
+	}
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public List<AttachedPicture> getAttachedPictures() {
+		return attachedPictures;
+	}
+
+	public void setAttachedPictures(List<AttachedPicture> attachedPictures) {
+		this.attachedPictures = attachedPictures;
+	}
+
+	@Override
+	public String toString() {
+		return "TicketMessage [id=" + id + ", body=" + body + ", createdAt=" + createdAt + ", user=" + user
+				+ ", attachedPictures=" + attachedPictures + "]";
+	}
+	
+	
+	
+}
diff --git a/app/src/model/User.java b/app/src/model/User.java
new file mode 100644
index 0000000..84a8695
--- /dev/null
+++ b/app/src/model/User.java
@@ -0,0 +1,81 @@
+package model;
+
+public abstract class User {
+	
+	protected long id;
+	protected String name;
+	protected String surname;
+	protected String email;
+	protected String password;
+	protected ProfilePicture profilePicture;
+	
+	public User(){}
+	
+	public User(String name, String surname, String email, String password, ProfilePicture profilePicture) {
+		super();
+		this.name = name;
+		this.surname = surname;
+		this.email = email;
+		this.password = password;
+		this.profilePicture = profilePicture;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	private void setId(long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getSurname() {
+		return surname;
+	}
+
+	public void setSurname(String surname) {
+		this.surname = surname;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	
+
+	public ProfilePicture getProfilePicture() {
+		return profilePicture;
+	}
+
+	public void setProfilePicture(ProfilePicture profilePicture) {
+		this.profilePicture = profilePicture;
+	}
+
+	@Override
+	public String toString() {
+		return "User [id=" + id + ", name=" + name + ", surname=" + surname + ", email=" + email + ", profilePicture=" + profilePicture;
+	}
+	
+	public boolean equals(User user) {
+		return this.id == user.getId();
+	}
+}


Reviews:
user: login: rfnobando
body: A no-args constructor is required for Hibernate to function properly, as it is used internally by Hibernate to instantiate objects when loading data from the database. Even though it may not be directly used in the code, this constructor is essential for the framework to work correctly.
state: CHANGES_REQUESTED
author_association: OWNER
submitted_at: 2025-04-28T17:59:05Z
user: login: AlanLeonelMaciel
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-28T18:49:38Z
user: login: SantiZurlo
body: Hay dos errores que veo, son pequeños pero habria que solucionarlos. En la clase Status en el toString esta la palabra State cuando deberia ser Status, por otro lado en la clase Ticket en los get pusiste getState cuando con el cambio deberia ser getStatus lo mismo en setState con setStatus, y en el toString de esta clase tambien esta la palabra "state"
state: CHANGES_REQUESTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T20:13:03Z
user: login: rfnobando
state: CHANGES_REQUESTED
author_association: OWNER
submitted_at: 2025-04-28T21:31:06Z
user: login: AlanLeonelMaciel
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T21:49:11Z
user: login: rfnobando
state: CHANGES_REQUESTED
author_association: OWNER
submitted_at: 2025-04-28T21:54:02Z
user: login: rfnobando
state: CHANGES_REQUESTED
author_association: OWNER
submitted_at: 2025-04-29T01:56:04Z
user: login: rfnobando
state: CHANGES_REQUESTED
author_association: OWNER
submitted_at: 2025-04-29T02:14:34Z
user: login: rfnobando
body: ![bien-hecho-puerco](https://github.com/user-attachments/assets/ed997718-c449-4f7f-925a-05c1aaf32429)

state: APPROVED
author_association: OWNER
submitted_at: 2025-04-29T02:29:14Z
user: login: SantiZurlo
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-29T02:40:11Z
user: login: AlanLeonelMaciel
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-29T20:09:34Z

Review comments:
diff_hunk: @@ -0,0 +1,78 @@
+package model;
+
+public abstract class User {
+	
+	protected long id;
+	protected String name;
+	protected String surname;
+	protected String email;
+	protected String password;
+	protected ProfilePhoto profilePhoto;
+	
+	public User(){}
+	
+	public User(String name, String surname, String email, String password, ProfilePhoto profilePhoto) {
+		super();
+		this.name = name;
+		this.surname = surname;
+		this.email = email;
+		this.password = password;
+		this.profilePhoto = profilePhoto;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getSurname() {
+		return surname;
+	}
+
+	public void setSurname(String surname) {
+		this.surname = surname;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public ProfilePhoto getProfilePhoto() {
+		return profilePhoto;
+	}
+
+	public void setProfilePhoto(ProfilePhoto profilePhoto) {
+		this.profilePhoto = profilePhoto;
+	}
+
+	@Override
+	public String toString() {
path: app/src/model/User.java
user: login: AlanLeonelMaciel
body: Acá no se debería exponer datos sensibles como el password en el toString.
created_at: 2025-04-28T18:35:52Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,32 @@
+package model;
+
+public class AttachedPhoto {
path: app/src/model/AttachedPhoto.java
user: login: rfnobando
body: AttachedPhoto no concuerda con la tabla attached_pictures, debe ser AttachedPicture el nombre de la clase.
created_at: 2025-04-28T21:06:51Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,31 @@
+package model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Client extends User {
path: app/src/model/Client.java
user: login: rfnobando
body: Acá pasa lo mismo que en la clase AttachedPhoto, la tabla es `customers`, por lo tanto la clase debería llamarse Customer.
created_at: 2025-04-28T21:08:06Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,32 @@
+package model;
+
+public class AttachedPhoto {
+	public long id;
+	public String name;
+	
+	public AttachedPhoto(){}
+	
+	public AttachedPhoto(String name) {
+		super();
+		this.name = name;
+	}
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	@Override
+	public String toString() {
+		return "AttachedPhoto [id=" + id + ", name=" + name + "]";
+	}
+	
path: app/src/model/AttachedPhoto.java
user: login: rfnobando
body: Falta sobrescribir equals (comparar por fileName que es un valor unique).
created_at: 2025-04-28T21:09:20Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,31 @@
+package model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Client extends User {
+	public List<Ticket> ticketsCreated;
path: app/src/model/Client.java
user: login: rfnobando
body: En inglés, primero va el modificador del sujeto. La propiedad debería llamarse 'createdTickets'.
created_at: 2025-04-28T21:11:23Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,30 @@
+package model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Employee extends User {
+	protected List<Ticket> ticketsManaged;
path: app/src/model/Employee.java
user: login: rfnobando
body: Lo mismo que en Customer, lo ideal sería 'managedTickets'.
created_at: 2025-04-28T21:12:06Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,31 @@
+package model;
+
+public class ProfilePhoto {
path: app/src/model/ProfilePhoto.java
user: login: rfnobando
body: Lo mismo que en el caso de `attached_pictures`, en este caso la tabla se llama `profile_pictures`, por lo tanto la clase debería llamarse ProfilePicture.
created_at: 2025-04-28T21:13:43Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,32 @@
+package model;
+
+public class AttachedPhoto {
+	public long id;
+	public String name;
path: app/src/model/AttachedPhoto.java
user: login: rfnobando
body: La propiedad debería llamarse fileName para concordar con la columna `attached_pictures.file_name`.
created_at: 2025-04-28T21:15:01Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,31 @@
+package model;
+
+public class ProfilePhoto {
+	public long id;
+	public String name;
path: app/src/model/ProfilePhoto.java
user: login: rfnobando
body: Lo mismo que en AttachedPicture, debe llamarse fileName.
created_at: 2025-04-28T21:15:40Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,31 @@
+package model;
+
+public class ProfilePhoto {
+	public long id;
+	public String name;
+	
+	public ProfilePhoto(){}
+	
+	public ProfilePhoto(String name) {
+		super();
+		this.name = name;
+	}
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	@Override
+	public String toString() {
+		return "ProfilePhoto [id=" + id + ", name=" + name + "]";
+	}
+	
path: app/src/model/ProfilePhoto.java
user: login: rfnobando
body: Falta sobrescribir equals, comparar por fileName que es unique.
created_at: 2025-04-28T21:16:59Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,31 @@
+package model;
+
+public class Status {
+	public long id;
+	public String name;
+	
+	public Status(){}
+	
+	public Status(String name) {
+		super();
+		this.name = name;
+	}
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	@Override
+	public String toString() {
+		return "State [id=" + id + ", name=" + name + "]";
+	}
+	
path: app/src/model/Status.java
user: login: rfnobando
body: Falta sobrescribir equals, comparar por name que es unique.
created_at: 2025-04-28T21:17:27Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,114 @@
+package model;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Ticket {
+	public long id;
+	public String title;
+	public LocalDate creationDate;
+	public LocalDate updateDate;
path: app/src/model/Ticket.java
user: login: rfnobando
body: Las propiedades creationDate y updateDate, deben ser de tipo Timestamp, y deben llamarse 'createdAt' y 'updatedAt' respectivamente, para coincidir con la db.
created_at: 2025-04-28T21:20:36Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,114 @@
+package model;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Ticket {
+	public long id;
+	public String title;
+	public LocalDate creationDate;
+	public LocalDate updateDate;
+	public Client client;
+	public List<Employee> employees;
+	public TicketCategory ticketCategory;
+	public Status status;
+	public List<TicketMessage> messages;
+	
+	public Ticket(){}
+	
+	public Ticket(String title, LocalDate creationDate, LocalDate updateDate, Client client,
+			TicketCategory ticketCategory, Status status) {
+		super();
+		this.title = title;
+		this.creationDate = creationDate;
+		this.updateDate = updateDate;
+		this.client = client;
+		this.employees = new ArrayList<Employee>();
+		this.ticketCategory = ticketCategory;
+		this.status = status;
+		this.messages = new ArrayList<TicketMessage>();
+		
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public LocalDate getCreationDate() {
+		return creationDate;
+	}
+
+	public void setCreationDate(LocalDate creationDate) {
+		this.creationDate = creationDate;
+	}
+
+	public LocalDate getUpdateDate() {
+		return updateDate;
+	}
+
+	public void setUpdateDate(LocalDate updateDate) {
+		this.updateDate = updateDate;
+	}
+
+	public Client getClient() {
+		return client;
+	}
+
+	public void setClient(Client client) {
+		this.client = client;
+	}
+
+	public List<Employee> getEmployees() {
+		return employees;
+	}
+
+	public void setEmployees(List<Employee> employees) {
+		this.employees = employees;
+	}
+
+	public TicketCategory getTicketCategory() {
+		return ticketCategory;
+	}
+
+	public void setTicketCategory(TicketCategory ticketCategory) {
+		this.ticketCategory = ticketCategory;
+	}
+
+	public Status getState() {
+		return status;
+	}
+
+	public void setState(Status state) {
+		this.status = state;
+	}
+
+	public List<TicketMessage> getMessages() {
+		return messages;
+	}
+
+	public void setMessages(List<TicketMessage> messages) {
+		this.messages = messages;
+	}
+
+	@Override
+	public String toString() {
+		return "Ticket [id=" + id + ", title=" + title + ", creationDate=" + creationDate + ", updateDate=" + updateDate
+				+ ", client=" + client + ", employees=" + employees + ", ticketCategory=" + ticketCategory + ", state="
+				+ status + ", messages=" + messages + "]";
+	}
+	
path: app/src/model/Ticket.java
user: login: rfnobando
body: Sobrescribir equals comparando por id.
created_at: 2025-04-28T21:21:11Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,40 @@
+package model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TicketCategory {
+	public long id;
+	public String name;
+	public List<Ticket> tickets;
+	
+	public TicketCategory(){}
+	
+	public TicketCategory(String name) {
+		super();
+		this.name = name;
+		this.tickets = new ArrayList<Ticket>();
+	}
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public List<Ticket> getTickets() {
+		return tickets;
+	}
+	public void setTickets(List<Ticket> tickets) {
+		this.tickets = tickets;
+	}
+	@Override
+	public String toString() {
+		return "TicketCategory [id=" + id + ", name=" + name + ", tickets=" + tickets + "]";
+	}
path: app/src/model/TicketCategory.java
user: login: rfnobando
body: Sobrescribir equals comparando por name, ya que es un campo unique en la db.
created_at: 2025-04-28T21:21:35Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,61 @@
+package model;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TicketMessage {
+	public long id;
+	public String text;
+	public LocalDate createDate;
+	public User user;
+	public List<AttachedPhoto> photos;
path: app/src/model/TicketMessage.java
user: login: rfnobando
body: Cambiar por AttachedPicture.
created_at: 2025-04-28T21:22:07Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,61 @@
+package model;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TicketMessage {
+	public long id;
+	public String text;
+	public LocalDate createDate;
path: app/src/model/TicketMessage.java
user: login: rfnobando
body: Cambiar nombre y tipo de dato por LocalDateTime createdAt.
created_at: 2025-04-28T21:22:52Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,61 @@
+package model;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TicketMessage {
+	public long id;
+	public String text;
path: app/src/model/TicketMessage.java
user: login: rfnobando
body: Cambiar nombre por body para que coincida con la db.
created_at: 2025-04-28T21:23:07Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,78 @@
+package model;
+
+public abstract class User {
+	
+	protected long id;
+	protected String name;
+	protected String surname;
+	protected String email;
+	protected String password;
+	protected ProfilePhoto profilePhoto;
+	
+	public User(){}
+	
+	public User(String name, String surname, String email, String password, ProfilePhoto profilePhoto) {
+		super();
+		this.name = name;
+		this.surname = surname;
+		this.email = email;
+		this.password = password;
+		this.profilePhoto = profilePhoto;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getSurname() {
+		return surname;
+	}
+
+	public void setSurname(String surname) {
+		this.surname = surname;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public ProfilePhoto getProfilePhoto() {
+		return profilePhoto;
+	}
+
+	public void setProfilePhoto(ProfilePhoto profilePhoto) {
+		this.profilePhoto = profilePhoto;
+	}
+
+	@Override
+	public String toString() {
+		return "User [id=" + id + ", name=" + name + ", surname=" + surname + ", email=" + email + ", password="
+				+ password + ", profilePhoto=" + profilePhoto;
+	}
+	
path: app/src/model/User.java
user: login: rfnobando
body: Sobrescribir equals, comparar por id.
created_at: 2025-04-28T21:24:06Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,31 @@
+package model;
+
+public class Status {
+	public long id;
path: app/src/model/Status.java
user: login: rfnobando
body: Emi, tenés que cerrar el estadio, ponele private jaja.
created_at: 2025-04-28T21:25:35Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,114 @@
+package model;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Ticket {
+	public long id;
+	public String title;
+	public LocalDate creationDate;
+	public LocalDate updateDate;
path: app/src/model/Ticket.java
user: login: AlanLeonelMaciel
body: Yo lo pondría como LocalDateTime que hibernate lo mapea automáticamente como Timestamp en la bd, y manejaría ese registro desde la misma bd ( para que se ponga fecha y hora actuales cuando se crea un registro) asi evitamos lógica innecesaria del lado del codigo. Tiene mas sinergia con hibernate...
created_at: 2025-04-28T21:49:11Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,114 @@
+package model;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Ticket {
+	public long id;
+	public String title;
+	public LocalDate creationDate;
+	public LocalDate updateDate;
path: app/src/model/Ticket.java
user: login: rfnobando
body: Estoy de acuerdo, usemos LocalDateTime entonces.
created_at: 2025-04-28T21:52:54Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,30 @@
+package model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Customer extends User {
+	protected List<Ticket> managedTickets;
+
path: app/src/model/Customer.java
user: login: rfnobando
body: La prop managedTickets debe ser private.
created_at: 2025-04-29T01:53:40Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,117 @@
+package model;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Ticket {
+	private long id;
+	private String title;
+	private LocalDateTime createdAt;
+	private LocalDateTime updatedAt;
+	private Customer customer;
+	private List<Employee> employee;
path: app/src/model/Ticket.java
user: login: rfnobando
body: 'employee' sería si solo tuviera un empleado que lo gestione, pero como es una lista, puede ser 'assignedEmployees' o simplemente, 'employees'
created_at: 2025-04-29T02:09:55Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,69 @@
+package model;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TicketMessage {
+	private long id;
+	private String body;
+	private LocalDateTime createdAt;
+	private User user;
+	private List<AttachedPicture> pictures;
path: app/src/model/TicketMessage.java
user: login: rfnobando
body: 'attachedPictures' podría ser más semántico, pero si querés dejarlo en 'pictures' por mi está bien.
created_at: 2025-04-29T02:12:28Z
author_association: OWNER

PR comments:
user: login: AlanLeonelMaciel
created_at: 2025-04-28T18:48:36Z
body: Hay que tener cuidado con las referencias bidireccionales en el toString. Lo mas probable es que generen un StackOverflowError por ejemplo un cliente muestra sus tickets y los tickets muestran sus clientes, generando un toString ciclico e indefinido desbordando la memoria. Aun así apruebo el request y lo testeamos ya que es una sospecha.
author_association: COLLABORATOR