/*
* This file is part of LibrePlan
*
* Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
* Copyright (C) 2010-2011 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libreplan.business.materials.entities;
import java.math.BigDecimal;
import java.util.Date;
import javax.validation.Valid;
import org.libreplan.business.common.BaseEntity;
import org.libreplan.business.orders.entities.OrderElement;
/**
*
* Note: this class has a natural ordering that is inconsistent with equals.
*
* @author Diego Pino Garcia <dpino@igalia.com>
*/
public class MaterialAssignment extends BaseEntity implements Comparable {
private MaterialInfo materialInfo = new MaterialInfo();
private Date estimatedAvailability;
private MaterialStatusEnum status = MaterialStatusEnum.PENDING;
private OrderElement orderElement;
public static MaterialAssignment create() {
return BaseEntity.create(new MaterialAssignment());
}
protected MaterialAssignment() {
}
public static MaterialAssignment create(Material material) {
MaterialAssignment materialAssignment = create();
materialAssignment.setUnitPrice(material.getDefaultUnitPrice());
materialAssignment.setMaterial(material);
return materialAssignment;
}
public static MaterialAssignment create(MaterialAssignment materialAssignment) {
MaterialAssignment result = create();
result.setMaterial(materialAssignment.getMaterial());
result.setUnits(materialAssignment.getUnits());
result.setUnitPrice(materialAssignment.getUnitPrice());
result.setEstimatedAvailability(materialAssignment.getEstimatedAvailability());
result.setStatus(materialAssignment.getStatus());
return result;
}
public static MaterialAssignment createFrom(MaterialInfo materialInfo,
OrderElement element) {
MaterialAssignment result = create();
result.materialInfo = materialInfo.copy();
result.orderElement = element;
return result;
}
@Valid
public MaterialInfo getMaterialInfo() {
if (materialInfo == null) {
materialInfo = new MaterialInfo();
}
return materialInfo;
}
public Material getMaterial() {
return getMaterialInfo().getMaterial();
}
public void setMaterial(Material material) {
getMaterialInfo().setMaterial(material);
}
public BigDecimal getUnits() {
return getMaterialInfo().getUnits();
}
public void setUnits(BigDecimal units) {
getMaterialInfo().setUnits(units);
}
public void setUnitsWithoutNullCheck(BigDecimal units) {
this.materialInfo.setUnitsWithoutNullCheck(units);
}
public BigDecimal getUnitPrice() {
return getMaterialInfo().getUnitPrice();
}
public void setUnitPrice(BigDecimal unitPrice) {
getMaterialInfo().setUnitPrice(unitPrice);
}
public void setUnitPriceWithoutNullCheck(BigDecimal unitPrice) {
this.materialInfo.setUnitPriceWithoutNullCheck(unitPrice);
}
public BigDecimal getTotalPrice() {
return getMaterialInfo().getTotalPrice();
}
public Date getEstimatedAvailability() {
return estimatedAvailability;
}
public void setEstimatedAvailability(Date estimatedAvailability) {
this.estimatedAvailability = estimatedAvailability;
}
public MaterialStatusEnum getStatus() {
return status;
}
public void setStatus(MaterialStatusEnum status) {
this.status = status;
}
public OrderElement getOrderElement() {
return orderElement;
}
public void setOrderElement(OrderElement orderElement) {
this.orderElement = orderElement;
}
@Override
public int compareTo(Object arg0) {
final MaterialAssignment materialAssignment = (MaterialAssignment) arg0;
return materialAssignment.getMaterial().compareTo(getMaterial());
}
public static MaterialAssignment copy(MaterialAssignment origin,
OrderElement orderElement) {
MaterialAssignment copy = MaterialAssignment.createFrom(
origin.materialInfo, orderElement);
copy.estimatedAvailability = origin.estimatedAvailability;
copy.status = origin.status;
return copy;
}
}