package devopsdistilled.operp.client.stock.panes.controllers.impl;
import java.util.List;
import javax.inject.Inject;
import devopsdistilled.operp.client.exceptions.EntityValidationException;
import devopsdistilled.operp.client.exceptions.NullFieldException;
import devopsdistilled.operp.client.stock.models.StockKeeperModel;
import devopsdistilled.operp.client.stock.models.StockModel;
import devopsdistilled.operp.client.stock.models.WarehouseModel;
import devopsdistilled.operp.client.stock.panes.TransferStockPane;
import devopsdistilled.operp.client.stock.panes.controllers.TransferStockPaneController;
import devopsdistilled.operp.client.stock.panes.models.TransferStockPaneModel;
import devopsdistilled.operp.server.data.entity.stock.Stock;
import devopsdistilled.operp.server.data.entity.stock.StockKeeper;
public class TransferStockPaneControllerImpl implements
TransferStockPaneController {
@Inject
private TransferStockPane view;
@Inject
private WarehouseModel warehouseModel;
@Inject
private TransferStockPaneModel model;
@Inject
private StockModel stockModel;
@Inject
private StockKeeperModel stockKeeperModel;
@Override
public void init() {
view.init();
model.registerObserver(view);
warehouseModel.registerObserver(view);
}
@Override
public void validate() throws EntityValidationException {
if (model.getFromWarehouse() == null)
throw new NullFieldException("Source Warehouse should be selected");
if (model.getItemToTransfer() == null)
throw new NullFieldException("Select Item to transfer");
if (model.getToWarehouse() == null)
throw new NullFieldException(
"Destinatino Warehouse shouldn't be empty");
if (model.getQuantity() == null || model.getQuantity().equals(0L))
throw new NullFieldException("Quantity can't be zero");
Long srcQuantity = stockModel.getService()
.getQuantityOfItemInWarehouse(
model.getItemToTransfer().getItemId(),
model.getFromWarehouse().getWarehouseId());
if (model.getQuantity().compareTo(0L) < 0)
throw new EntityValidationException(
"Can't transfer negative number of items");
if (srcQuantity.compareTo(model.getQuantity()) < 0)
throw new EntityValidationException("Only "
+ srcQuantity.toString() + " " + model.getItemToTransfer()
+ " available in " + model.getFromWarehouse());
if (model.getToWarehouse().compareTo(model.getFromWarehouse()) == 0)
throw new EntityValidationException(
"Source and Destination Warehouses can't be same");
}
@Override
public List<StockKeeper> transfer() {
Stock srcStock = new Stock();
srcStock.setItem(model.getItemToTransfer());
srcStock.setWarehouse(model.getFromWarehouse());
Stock destStock = new Stock();
destStock.setItem(model.getItemToTransfer());
destStock.setWarehouse(model.getToWarehouse());
StockKeeper srcStockKeeper = new StockKeeper();
srcStockKeeper.setStock(srcStock);
srcStockKeeper.setQuantity(model.getQuantity() * (-1));
StockKeeper destStockKeeper = new StockKeeper();
destStockKeeper.setStock(destStock);
destStockKeeper.setQuantity(model.getQuantity());
return stockKeeperModel.saveAndUpdateModel(srcStockKeeper,
destStockKeeper);
}
@Override
public TransferStockPaneModel getModel() {
return model;
}
}