package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.usecase;
import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants;
import io.oasp.gastronomy.restaurant.general.logic.api.UseCase;
import io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc;
import io.oasp.gastronomy.restaurant.salesmanagement.common.api.exception.ChangeTableIllegalStateCombinationException;
import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement;
import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto;
import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcChangeTable;
import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState;
import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.Tablemanagement;
import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto;
import javax.annotation.security.RolesAllowed;
import javax.inject.Inject;
import javax.inject.Named;
/**
* UseCase: The guests can change a table to get a better table.
*
*/
@Named
@UseCase
public class UcChangeTableImpl extends AbstractUc implements UcChangeTable {
private Tablemanagement tableManagement;
private Salesmanagement salesManagement;
@Override
@RolesAllowed(PermissionConstants.SAVE_TABLE)
public void changeTable(long orderId, long newTableId) {
OrderEto order = this.salesManagement.findOrder(orderId);
// save old table data
long oldTableId = order.getTableId();
if (oldTableId == newTableId) {
return; // nothing to do...
}
TableEto oldTable = this.tableManagement.findTable(oldTableId);
TableState oldTableState = oldTable.getState();
// throw exception if the newTableState is occupied
TableEto newTable = this.tableManagement.findTable(newTableId);
if (newTable.getState().isOccupied()) {
throw new ChangeTableIllegalStateCombinationException(order, newTable);
}
// update order
order.setTableId(newTableId);
// marks new table with copied status
newTable.setState(oldTableState);
this.tableManagement.saveTable(newTable);
// saves Order for the new table
this.salesManagement.saveOrder(order);
// change table status:
// marks old table as free
oldTable.setState(TableState.FREE);
this.tableManagement.saveTable(oldTable);
}
/**
* @param tableManagement the {@link Tablemanagement} to {@link Inject}.
*/
@Inject
public void setTableManagement(Tablemanagement tableManagement) {
this.tableManagement = tableManagement;
}
/**
* @param salesManagement the {@link Salesmanagement} to {@link Inject}.
*/
@Inject
public void setSalesManagement(Salesmanagement salesManagement) {
this.salesManagement = salesManagement;
}
}