RentalEquipment.java

package com.github.jenkaby.bikerental.rental.domain.model;

import com.github.jenkaby.bikerental.shared.domain.model.vo.Money;
import lombok.*;

import java.time.LocalDateTime;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class RentalEquipment {

    private Long id;
    private Long equipmentId;
    private String equipmentUid;
    private String equipmentType;

    private RentalEquipmentStatus status;
    private LocalDateTime startedAt;
    private LocalDateTime expectedReturnAt;
    private LocalDateTime actualReturnAt;

    private Long tariffId;
    private Money estimatedCost;
    private Money finalCost;

    public RentalEquipment activateForRental(Rental rental) {
        if (rental.getStartedAt() == null) {
            throw new IllegalArgumentException("Rental must have a start date to activate equipment");
        }
        if (rental.getExpectedReturnAt() == null) {
            throw new IllegalArgumentException("Rental must have a Expected return at to activate equipment");
        }
        this.setStatus(RentalEquipmentStatus.ACTIVE);
        this.setStartedAt(rental.getStartedAt());
        this.setExpectedReturnAt(rental.getExpectedReturnAt());
        return this;
    }

    public RentalEquipment markReturned(LocalDateTime returnAt) {
        this.setStatus(RentalEquipmentStatus.RETURNED);
        this.setActualReturnAt(returnAt);
        return this;
    }

    public static RentalEquipment assigned(Long equipmentId, String equipmentUid, String equipmentType) {
        return RentalEquipment.builder()
                .equipmentId(equipmentId)
                .equipmentUid(equipmentUid)
                .status(RentalEquipmentStatus.ASSIGNED)
                .equipmentType(equipmentType)
                .build();
    }
}