package com.tap5.hotelbooking.pages;
import java.util.Calendar;
import org.apache.tapestry5.Block;
import org.apache.tapestry5.EventConstants;
import org.apache.tapestry5.PersistenceConstants;
import org.apache.tapestry5.SelectModel;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.annotations.PageActivationContext;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SessionState;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import com.tap5.hotelbooking.dal.CrudServiceDAO;
import com.tap5.hotelbooking.data.BedType;
import com.tap5.hotelbooking.data.Months;
import com.tap5.hotelbooking.data.UserWorkspace;
import com.tap5.hotelbooking.data.Years;
import com.tap5.hotelbooking.entities.Booking;
import com.tap5.hotelbooking.entities.Hotel;
/**
* This page implements booking process for a give hotel.
*
* @author ccordenier
*/
public class Book
{
@SessionState
@Property
private UserWorkspace userWorkspace;
@SuppressWarnings("unused")
@Property
@PageActivationContext
private Hotel hotel;
@Inject
private Block bookBlock;
@Inject
private Block confirmBlock;
@Inject
private Messages messages;
@Inject
private CrudServiceDAO dao;
@InjectComponent
private Form bookingForm;
@Property
@Persist(PersistenceConstants.FLASH)
private Booking booking;
@Persist
private boolean confirmationStep;
@SuppressWarnings("unused")
@Property
private SelectModel bedType = new BedType();
@SuppressWarnings("unused")
@Property
private SelectModel years = new Years();
@SuppressWarnings("unused")
@Property
private SelectModel months = new Months();
/**
* Get the current step
*
* @return confirmation or booking bloc
*/
public Block getStep()
{
return confirmationStep ? confirmBlock : bookBlock;
}
public String getSecuredCardNumber()
{
return booking.getCreditCardNumber().substring(12);
}
@Log
public Object onActivate(Long hotelId)
{
booking = userWorkspace.restoreBooking(hotelId);
if (booking == null)
{
return Search.class;
}
else
{
confirmationStep = booking.getStatus();
return null;
}
}
@OnEvent(value = EventConstants.ACTIVATE)
@Log
public void setupBooking()
{
booking = userWorkspace.getCurrent();
confirmationStep = booking.getStatus();
}
@OnEvent(value = EventConstants.VALIDATE, component = "bookingForm")
public void validateBooking()
{
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -1);
if (booking.getCheckinDate().before(calendar.getTime()))
{
bookingForm.recordError(messages.get("booking_checkInNotFutureDate"));
return;
}
else if (!booking.getCheckinDate().before(booking.getCheckoutDate()))
{
bookingForm.recordError(messages.get("booking_checkOutBeforeCheckIn"));
return;
}
userWorkspace.getCurrent().setStatus(true);
}
@OnEvent(value = EventConstants.FAILURE, component = "bookingForm")
public void onFailureFromBookingForm() {
booking.setStatus(false);
}
@OnEvent(value = EventConstants.SUCCESS, component = "confirmForm")
public Object confirm()
{
// Create
dao.create(booking);
userWorkspace.confirmCurrentBooking(booking);
booking = null;
// Return to search
return Search.class;
}
@OnEvent(value = "cancelConfirm")
@Log
public void cancelConfim()
{
booking.setStatus(false);
}
@OnEvent(value = "cancelBooking")
@Log
public Object cancelBooking()
{
userWorkspace.cancelCurrentBooking(booking);
booking = null;
return Search.class;
}
}