ReservationObjectEntity.java
package sk.iway.iwcm.components.reservation.jpa;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;
import sk.iway.iwcm.Logger;
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.DataTableColumnEditor;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditorAttr;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnNested;
import sk.iway.iwcm.system.jpa.DefaultTimeValueConverter;
@Entity
@Table(name = "reservation_object")
@Getter
@Setter
@EntityListeners(sk.iway.iwcm.system.adminlog.AuditEntityListener.class)
@EntityListenersType(sk.iway.iwcm.Adminlog.TYPE_RESERVATION_OBJECT)
public class ReservationObjectEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "S_reservation_object")
@Column(name = "reservation_object_id")
@DataTableColumn(inputType = DataTableColumnType.ID, title="ID")
private Long id;
@Column(name = "name")
@DataTableColumn(
inputType = DataTableColumnType.OPEN_EDITOR,
title="components.reservation.admin_addObject.name",
tab = "basic"
)
@Size(max = 100)
@NotBlank
private String name;
@Column(name = "max_reservations")
@DataTableColumn(
inputType = DataTableColumnType.NUMBER,
title="components.reservation.admin_addObject.max_pocet_rezeracii",
visible = false,
tab = "basic"
)
@Min(value = 1)
private Integer maxReservations;
@Column(name = "cancel_time_befor")
@DataTableColumn(
inputType = DataTableColumnType.NUMBER,
title="reservation.reservation_object.cancel_time_before",
visible = false,
tab = "basic"
)
private Integer cancelTimeBefor;
@Column(name = "reservation_for_all_day")
@DataTableColumn(
inputType = DataTableColumnType.BOOLEAN,
title="components.reservation.admin_addObject.reservation_for_all_day",
visible = false,
tab = "basic"
)
private Boolean reservationForAllDay;
@Column(name = "price_for_day")
@DataTableColumn(
inputType = DataTableColumnType.NUMBER,
title="reservation.reservation_object.price_for_day",
visible = false,
tab = "basic"
)
private BigDecimal priceForDay;
@Column(name = "time_unit")
@DataTableColumn(
inputType = DataTableColumnType.NUMBER,
title="reservation.reservation_object.time_unit",
visible = false,
tab = "basic"
)
private Integer timeUnit;
@Column(name = "price_for_hour")
@DataTableColumn(
inputType = DataTableColumnType.NUMBER,
title="components.reservation.admin_addObject.price_for_hour",
visible = false,
tab = "basic"
)
private BigDecimal priceForHour;
@Column(name = "photo_link")
@DataTableColumn(
inputType = DataTableColumnType.ELFINDER,
title="components.reservation.admin_addObject.photo_link",
visible = false,
tab = "basic"
)
@Size(max = 255)
private String photoLink;
@Column(name = "description")
@DataTableColumn(
inputType = DataTableColumnType.TEXTAREA,
title="components.reservation.admin_addObject.description",
tab = "basic"
)
@Size(max = 2000)
@NotBlank
private String description;
@Column(name = "reservation_time_from")
@DataTableColumn(
inputType = DataTableColumnType.TIME_HM,
title="components.reservation.reservation_objects.date_from",
visible = false,
tab = "basic",
editor = {
@DataTableColumnEditor(
attr = {
@DataTableColumnEditorAttr(key = "data-dt-field-headline", value = "components.reservation.admin_addObject.kedy_mozne_rezervovat"),
@DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "before"),
}
)
}
)
@Convert(converter = DefaultTimeValueConverter.class)
private Date reservationTimeFrom;
@Column(name = "reservation_time_to")
@DataTableColumn(
inputType = DataTableColumnType.TIME_HM,
title="components.reservation.reservation_objects.date_to",
visible = false,
tab = "basic"
)
@Convert(converter = DefaultTimeValueConverter.class)
private Date reservationTimeTo;
@Column(name = "must_accepted")
@DataTableColumn(
inputType = DataTableColumnType.BOOLEAN,
title="components.reservation.admin_addObject.accept",
tab = "advanced"
)
private Boolean mustAccepted;
@Column(name = "email_accepter")
@DataTableColumn(
inputType = DataTableColumnType.TEXT,
title="components.reservation.admin_addObject.email",
tab = "advanced"
)
@Size(max = 150)
private String emailAccepter;
@Column(name = "notif_emails")
@DataTableColumn(
inputType = DataTableColumnType.TEXTAREA,
title="components.reservation.reservation_object.notifEmails",
tab = "advanced",
sortAfter = "emailAccepter"
)
private String notifEmails;
@Column(name = "passwd")
private String password;
@Column(name = "domain_id")
private Integer domainId;
//Used in cases when we need included reservationObjectTimes values in variable
//Key (Integer) is day of week 1,2 ... 7
//Value (String) is combination timeFrom + "-" + timeTo
@Transient
private HashMap<Integer, String> objectTimesInfo;
@Transient
@DataTableColumnNested
private ReservationObjectEditorFields editorFields = null;
@JsonManagedReference(value="reservationObjectForTime")
@OneToMany(mappedBy="reservationObjectForTime", fetch=FetchType.LAZY)
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private List<ReservationObjectTimesEntity> reservationObjectTimeEntities;
@JsonManagedReference(value="reservationObjectForPrice")
@OneToMany(mappedBy="reservationObjectForPrice", fetch=FetchType.LAZY)
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private List<ReservationObjectPriceEntity> reservationObjectPriceEntities;
public void setPassword(String password) {
this.password = getHashPassword(password);
}
private String getHashPassword(String passwd) {
String hashPasswd = "";
try {
if(passwd == null || passwd.isEmpty()) return "";
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(passwd.getBytes());
BigInteger hash = new BigInteger(1, md5.digest());
hashPasswd = hash.toString(16);
}
catch (NoSuchAlgorithmException nsae) {
Logger.error(nsae);
}
return hashPasswd;
}
public boolean checkPasswordAndHashEquality(String passwd, String passwdHash) {
return getHashPassword(passwd).equals(passwdHash) ? true : false;
}
}