ClassEnrollment.java
package com.wavii.model;
import jakarta.persistence.*;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;
/**
* Entidad que representa la matriculación de un alumno con un profesor.
* Gestiona el seguimiento de horas compradas/usadas, pagos de Stripe y modalidad de clase.
*/
@Entity
@Table(name = "class_enrollments")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ClassEnrollment {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "teacher_id", nullable = false)
private User teacher;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "student_id", nullable = false)
private User student;
@Column(length = 300)
private String teacherName;
@Column(length = 300)
private String studentName;
@Column(length = 120)
private String instrument;
@Column(length = 120)
private String city;
@Column(length = 120)
private String province;
@Column(length = 20)
private String modality;
@Column(length = 20)
private String requestedModality;
@Column(name = "unit_price", precision = 10, scale = 2)
private BigDecimal unitPrice;
@Column(name = "payment_status", length = 30)
private String paymentStatus;
@Column(name = "request_message", length = 1000)
private String requestMessage;
@Column(name = "request_availability", length = 500)
private String requestAvailability;
@Column(nullable = false)
@Builder.Default
private Integer hoursPurchased = 1;
@Column(nullable = false)
@Builder.Default
private Integer hoursUsed = 0;
@Column(length = 120)
private String stripePaymentIntentId;
@Column(length = 300)
private String paymentReceiptNumber;
@Column(length = 300)
private String classLink;
@Column(nullable = false, updatable = false)
@Builder.Default
private LocalDateTime createdAt = LocalDateTime.now();
}