Reservation.java

package com.deveagles.be15_deveagles_be.features.schedules.command.domain.aggregate;

import com.deveagles.be15_deveagles_be.common.exception.BusinessException;
import com.deveagles.be15_deveagles_be.common.exception.ErrorCode;
import jakarta.persistence.*;
import java.time.LocalDateTime;
import lombok.*;

@Entity
@Table(name = "reservation")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
public class Reservation {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "reservation_id")
  private Long reservationId;

  @Column(name = "staff_id", nullable = false)
  private Long staffId;

  @Column(name = "shop_id", nullable = false)
  private Long shopId;

  @Column(name = "customer_id")
  private Long customerId;

  @Enumerated(EnumType.STRING)
  @Column(name = "reservation_status_name")
  private ReservationStatusName reservationStatusName;

  @Column(name = "staff_memo")
  private String staffMemo;

  @Column(name = "reservation_memo")
  private String reservationMemo;

  @Column(name = "reservation_start_at", nullable = false)
  private LocalDateTime reservationStartAt;

  @Column(name = "reservation_end_at", nullable = false)
  private LocalDateTime reservationEndAt;

  @Column(name = "created_at", nullable = false, updatable = false)
  private LocalDateTime createdAt;

  @Column(name = "modified_at", nullable = false)
  private LocalDateTime modifiedAt;

  @Setter
  @Column(name = "deleted_at")
  private LocalDateTime deletedAt;

  @PrePersist
  public void prePersist() {
    this.createdAt = LocalDateTime.now();
    this.modifiedAt = LocalDateTime.now();
  }

  @PreUpdate
  public void preUpdate() {
    this.modifiedAt = LocalDateTime.now();
  }

  public void update(
      Long staffId,
      ReservationStatusName reservationStatusName,
      String staffMemo,
      String reservationMemo,
      LocalDateTime reservationStartAt,
      LocalDateTime reservationEndAt) {
    this.staffId = staffId;
    this.reservationStatusName = reservationStatusName;
    this.staffMemo = staffMemo;
    this.reservationMemo = reservationMemo;
    this.reservationStartAt = reservationStartAt;
    this.reservationEndAt = reservationEndAt;
  }

  public void changeStatus(ReservationStatusName newStatus) {
    if (this.reservationStatusName == ReservationStatusName.PAID) {
      throw new BusinessException(ErrorCode.MODIFY_NOT_ALLOWED_FOR_PAID_RESERVATION);
    }
    this.reservationStatusName = newStatus;
  }
}