1 package org.petify.backend.models; 2 3 import com.fasterxml.jackson.annotation.JsonBackReference; 4 import jakarta.persistence.Column; 5 import jakarta.persistence.Entity; 6 import jakarta.persistence.GeneratedValue; 7 import jakarta.persistence.GenerationType; 8 import jakarta.persistence.Id; 9 import jakarta.persistence.JoinColumn; 10 import jakarta.persistence.ManyToOne; 11 import jakarta.persistence.Table; 12 import jakarta.persistence.Transient; 13 import lombok.Getter; 14 import lombok.Setter; 15 16 import java.time.LocalDateTime; 17 18 @Entity 19 @Table(name = "user_achievements") 20 @Getter 21 @Setter 22 public class UserAchievement { 23 @Id 24 @GeneratedValue(strategy = GenerationType.IDENTITY) 25 private Long id; 26 27 @ManyToOne 28 @JoinColumn(name = "user_id", nullable = false) 29 @JsonBackReference 30 private ApplicationUser user; 31 32 @ManyToOne 33 @JoinColumn(name = "achievement_id", nullable = false) 34 private Achievement achievement; 35 36 @Column(name = "current_progress") 37 private Integer currentProgress = 0; 38 39 @Column(name = "completed") 40 private Boolean completed = false; 41 42 @Column(name = "completion_date") 43 private LocalDateTime completionDate; 44 45 @Transient 46 public Integer getProgressPercentage() { 47 if (achievement != null && achievement.getRequiredActions() > 0) { 48 return (int) ((double) currentProgress / achievement.getRequiredActions() * 100); 49 } 50 return 0; 51 } 52 }