ReservationEntity.java

package sk.iway.iwcm.components.reservation.jpa;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.Getter;
import lombok.Setter;
import sk.iway.iwcm.system.adminlog.EntityListenersType;
import sk.iway.iwcm.system.datatable.DataTableColumnType;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumn;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnNested;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditor;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditorAttr;

@Entity
@Table(name = "reservation")
@Getter
@Setter
@EntityListeners(sk.iway.iwcm.system.adminlog.AuditEntityListener.class)
@EntityListenersType(sk.iway.iwcm.Adminlog.TYPE_RESERVATION)
public class ReservationEntity implements Serializable {

    @Id
    @Column(name = "reservation_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "S_reservation")
    @DataTableColumn(inputType = DataTableColumnType.ID, title="ID")
    private Long id;

    @Column(name = "name")
    @NotBlank
    @DataTableColumn(
        inputType = DataTableColumnType.OPEN_EDITOR,
        title="components.reservation.reservation_list.name",
        tab = "personalInfo"
    )
    @Size(max = 150)
    private String name;

    @Column(name = "surname")
    @NotBlank
    @DataTableColumn(
        inputType = DataTableColumnType.OPEN_EDITOR,
        title="components.reservation.reservation_list.surname",
        tab = "personalInfo"
    )
    @Size(max = 155)
    private String surname;

    @Column(name = "email")
    @NotBlank
    @DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="components.reservation.reservation_list.email",
        tab = "personalInfo"
    )
    @Size(max = 100)
    private String email;

    @DataTableColumn(
        inputType = DataTableColumnType.SELECT,
        title="components.reservation.reservationObjectList",
        visible = false,
        sortAfter = "editorFields.selectedReservation"
    )
    @Column(name = "reservation_object_id")
    private Long reservationObjectId;

    @Column(name = "date_from")
    @Temporal(TemporalType.TIMESTAMP)
    @NotNull
	@DataTableColumn(
        inputType = DataTableColumnType.DATE,
        title="components.reservation.reservation_list.date_from2",
        tab = "basic"
    )
	private Date dateFrom;

    @Column(name = "date_to")
    @Temporal(TemporalType.TIMESTAMP)
    @NotNull
	@DataTableColumn(
        inputType = DataTableColumnType.DATE,
        title="components.reservation.reservation_list.date_to2",
        tab = "basic"
    )
	private Date dateTo;

    @Column(name = "purpose")
    @DataTableColumn(
        inputType = DataTableColumnType.TEXTAREA,
        title="components.reservation.reservation_list.purpose",
        visible = false,
        tab = "basic"
    )
    private String purpose;

    @Column(name = "accepted")
    @DataTableColumn(
        inputType = DataTableColumnType.SELECT,
        title="reservation.reservations.status",
        className = "disabled hide-on-create",
        editor = {
			@DataTableColumnEditor(
				options = {
                    @DataTableColumnEditorAttr(key = "reservation.reservations.status.waiting", value = "null"),
					@DataTableColumnEditorAttr(key = "reservation.reservations.status.accepted", value = "true"),
					@DataTableColumnEditorAttr(key = "reservation.reservations.status.denied", value = "false")
				},
                attr = {
                    @DataTableColumnEditorAttr(key = "disabled", value = "disabled")
                }
			)
		}
    )
    private Boolean accepted;

    @Column(name = "phone_number")
    @DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="components.formsimple.label.telefon",
        visible = false,
        tab = "personalInfo"
    )
    @Size(max = 255)
    private String phoneNumber;

    @Column(name = "hash_value")
    @Size(max = 60)
    private String hashValue;

    @Column(name = "price")
    @DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        renderFormat = "dt-format-number--decimal",
        title="components.reservation.reservations.price",
        tab = "basic",
        sortAfter = "editorFields.reservationTimeTo",
        editor = {
            @DataTableColumnEditor(
                attr = { @DataTableColumnEditorAttr(key = "disabled", value = "disabled") }
            )
        }
    )
    private BigDecimal price;

    @DataTableColumn(inputType = DataTableColumnType.HIDDEN, className = "not-export")
    @Column(name = "domain_id")
    private Integer domainId;

    @Column(name = "user_id")
    @DataTableColumn(inputType = DataTableColumnType.HIDDEN)
    private Integer userId;

    @Transient
    @DataTableColumnNested
    private transient ReservationEditorFields editorFields = null;

    @ManyToOne
    @JsonBackReference(value="reservationObjectForReservation")
    @JoinColumn(name="reservation_object_id", insertable = false, updatable = false)
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private ReservationObjectEntity reservationObjectForReservation;

    public String getReservationObjectName() {
        return reservationObjectForReservation != null ? reservationObjectForReservation.getName() : "";
    }

    //For date-book-app
    @Transient
    @JsonIgnore
    private String actualDate;
}