package fr.mch.mdo.restaurant.services.business.utils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import fr.mch.mdo.logs.ILogger;
import fr.mch.mdo.restaurant.beans.IMdoBean;
import fr.mch.mdo.restaurant.beans.dto.DinnerTableDto;
import fr.mch.mdo.restaurant.beans.dto.OrderLineDto;
import fr.mch.mdo.restaurant.beans.dto.ProductDto;
import fr.mch.mdo.restaurant.beans.dto.ProductSpecialCodeDto;
import fr.mch.mdo.restaurant.dao.beans.DinnerTable;
import fr.mch.mdo.restaurant.dao.beans.OrderLine;
import fr.mch.mdo.restaurant.dao.beans.Product;
import fr.mch.mdo.restaurant.dao.beans.ProductLabel;
import fr.mch.mdo.restaurant.dao.beans.ProductSpecialCode;
import fr.mch.mdo.restaurant.dao.beans.ProductSpecialCodeLabel;
import fr.mch.mdo.restaurant.dao.beans.Restaurant;
import fr.mch.mdo.restaurant.dao.beans.TableType;
import fr.mch.mdo.restaurant.dao.beans.UserAuthentication;
import fr.mch.mdo.restaurant.dao.beans.ValueAddedTax;
import fr.mch.mdo.restaurant.dto.beans.MdoTableAsEnumDto;
import fr.mch.mdo.restaurant.services.business.managers.assembler.ManagedTableType;
import fr.mch.mdo.restaurant.services.logs.LoggerServiceImpl;
public class DefaultOrdersDtoHelper implements IOrdersDtoHelper
{
private ILogger logger;
private static class LazyHolder {
private static IOrdersDtoHelper instance = new DefaultOrdersDtoHelper(
LoggerServiceImpl.getInstance().getLogger(DefaultOrdersDtoHelper.class.getName()));
}
private DefaultOrdersDtoHelper(ILogger logger) {
this.setLogger(logger);
}
public static IOrdersDtoHelper getInstance() {
return LazyHolder.instance;
}
/**
* This constructor is used by ioc
*/
public DefaultOrdersDtoHelper() {
}
/**
* @return the logger
*/
public ILogger getLogger() {
return logger;
}
/**
* @param logger the logger to set
*/
public void setLogger(ILogger logger) {
this.logger = logger;
}
@Override
public List<DinnerTableDto> findAllTablesFactoring(List<DinnerTable> daoBeans) {
List<DinnerTableDto> result = new ArrayList<DinnerTableDto>();
for (IMdoBean iMdoBean : daoBeans) {
DinnerTable dinnerTable = (DinnerTable) iMdoBean;
DinnerTableDto DinnerTableDto = new DinnerTableDto();
DinnerTableDto.setAmountPay(dinnerTable.getAmountPay());
if (dinnerTable.getCashing() != null) {
DinnerTableDto.setCashingDate(dinnerTable.getCashing().getCashingDate());
}
DinnerTableDto.setCustomersNumber(dinnerTable.getCustomersNumber());
DinnerTableDto.setId(dinnerTable.getId());
DinnerTableDto.setPrintingDate(dinnerTable.getPrintingDate());
DinnerTableDto.setQuantitiesSum(dinnerTable.getQuantitiesSum());
DinnerTableDto.setNumber(dinnerTable.getNumber());
String typeCodeName = null;
if (dinnerTable.getType() != null && dinnerTable.getType().getCode() != null) {
typeCodeName = dinnerTable.getType().getCode().getName();
}
DinnerTableDto.setTakeaway(TableTypeEnum.TAKE_AWAY.name().equals(typeCodeName));
result.add(DinnerTableDto);
}
return result;
}
@Override
public DinnerTableDto findTableHeader(DinnerTable table) {
DinnerTableDto result = new DinnerTableDto();
result.setCustomersNumber(table.getCustomersNumber());
result.setId(table.getId());
result.setNumber(table.getNumber());
result.setTakeaway(this.isTakeaway(table.getType()));
return result;
}
@Override
public DinnerTableDto findTable(DinnerTable table) {
DinnerTableDto result = new DinnerTableDto();
result.setId(table.getId());
result.setNumber(table.getNumber());
result.setCustomersNumber(table.getCustomersNumber());
result.setTakeaway(this.isTakeaway(table.getType()));
result.setRegistrationDate(table.getRegistrationDate());
result.setPrintingDate(table.getPrintingDate());
result.setReductionRatio(table.getReductionRatio());
result.setReductionRatioManuallyChanged(table.getReductionRatioChanged());
BigDecimal quantitiesSum = BigDecimal.ZERO;
BigDecimal amountsSum = BigDecimal.ZERO;
List<OrderLineDto> orders = new ArrayList<OrderLineDto>();
if (table.getOrders() != null) {
for (OrderLine orderLine : table.getOrders()) {
OrderLineDto orderLineDto = new OrderLineDto();
orderLineDto.setAmount(orderLine.getAmount());
String code = this.getCode(orderLine);
orderLineDto.setCode(code);
orderLineDto.setId(orderLine.getId());
orderLineDto.setLabel(orderLine.getLabel());
orderLineDto.setQuantity(orderLine.getQuantity());
orderLineDto.setUnitPrice(orderLine.getUnitPrice());
ProductDto product = this.productToProductDto(orderLine.getProduct());
orderLineDto.setProduct(product);
orders.add(orderLineDto);
quantitiesSum = quantitiesSum.add(orderLineDto.getQuantity());
amountsSum = amountsSum.add(orderLineDto.getAmount());
}
}
result.setOrders(orders);
// result.setAmountsSum(table.getAmountsSum());
result.setAmountsSum(amountsSum);
// result.setQuantitiesSum(table.getQuantitiesSum());
result.setQuantitiesSum(quantitiesSum);
//amountPay = dtb_amounts_sum-dtb_amounts_sum*dtb_reduction_ratio/100
BigDecimal reduction = amountsSum.multiply(result.getReductionRatio()).divide(BigDecimal.TEN.multiply(BigDecimal.TEN));
BigDecimal amountPay = amountsSum.subtract(reduction);
result.setReduction(reduction);
result.setAmountPay(amountPay);
return result;
}
private ProductDto productToProductDto(Product product) {
ProductDto result = null;
if (product != null) {
result = new ProductDto();
// Maybe useless
//result.setId(product.getId());
result.setColorRGB(product.getColorRGB());
}
return result;
}
private String getCode(OrderLine orderLine) {
String result = null;
ProductSpecialCode psc = orderLine.getProductSpecialCode();
if (psc != null) {
result = psc.getShortCode();
}
if (orderLine.getProduct() != null) {
result += orderLine.getProduct().getCode();
}
return result;
}
@Override
public Boolean isTakeaway(TableType type) {
Boolean result = Boolean.FALSE;
// The type is never null because of restaurant default table type.
if (ManagedTableType.TAKE_AWAY.name().equals(type.getCode().getName())) {
result = Boolean.TRUE;
}
return result;
}
@Override
public DinnerTable buildTableReset(Long dinnerTableId, Long restaurantId, Long userAuthenticationId, String number, Integer customersNumber) {
DinnerTable result = new DinnerTable();
result.setId(dinnerTableId);
Restaurant restaurant = new Restaurant();
restaurant.setId(restaurantId);
result.setRestaurant(restaurant);
UserAuthentication userAuthentication = new UserAuthentication();
userAuthentication.setId(userAuthenticationId);
result.setUser(userAuthentication);
result.setRegistrationDate(new Date());
result.setCustomersNumber(customersNumber);
result.setNumber(number);
return result;
}
@Override
public ProductSpecialCodeDto fromProductSpecialCode(ProductSpecialCodeLabel productSpecialCode) {
ProductSpecialCodeDto result = new ProductSpecialCodeDto();
if (productSpecialCode != null) {
result.setId(productSpecialCode.getId());
result.setShortCode(productSpecialCode.getShortCode());
String codeName = productSpecialCode.getCode().getName();
MdoTableAsEnumDto code = new MdoTableAsEnumDto();
code.setName(codeName);
result.setCode(code);
result.setLabel(productSpecialCode.getLabel());
if (productSpecialCode.getVat() != null) {
result.setVatId(productSpecialCode.getVat().getId());
}
}
return result;
}
@Override
public ProductDto fromProduct(ProductLabel product) {
ProductDto result = new ProductDto();
if (product != null) {
result.setId(product.getId());
result.setCode(product.getCode());
result.setColorRGB(product.getColorRGB());
result.setLabel(product.getLabel());
result.setPrice(product.getPrice());
result.setVatId(product.getVat().getId());
}
return result;
}
@Override
public OrderLine toOrderLine(OrderLineDto orderLine) {
OrderLine result = new OrderLine();
if (orderLine != null) {
result.setId(orderLine.getId());
DinnerTable dinnerTable = new DinnerTable();
dinnerTable.setId(orderLine.getDinnerTableId());
result.setDinnerTable(dinnerTable);
ValueAddedTax vat = new ValueAddedTax();
vat.setId(orderLine.getVatId());
result.setVat(vat);
result.setQuantity(orderLine.getQuantity());
result.setLabel(orderLine.getLabel());
result.setUnitPrice(orderLine.getUnitPrice());
result.setAmount(orderLine.getAmount());
result.setQuantity(orderLine.getQuantity());
if (orderLine.getProductSpecialCode() != null) {
ProductSpecialCode productSpecialCode = new ProductSpecialCode();
productSpecialCode.setId(orderLine.getProductSpecialCode().getId());
result.setProductSpecialCode(productSpecialCode);
}
if (orderLine.getProduct() != null) {
Product product = new Product();
product.setId(orderLine.getProduct().getId());
result.setProduct(product);
}
}
return result;
}
}