Implemented method to obtain criterion cost on HourCostDAO

FEA: ItEr77S17AutomaticBudgeting

Several components were using Criteria collections not initialized on the
planning state, so when adding dinamically new CriterionRequirements
or HourGroups the group hours were not attached.
This commit is contained in:
Lorenzo Tilve Álvaro 2013-06-17 19:44:19 +02:00
parent 25d359d653
commit 37858bb491
3 changed files with 32 additions and 19 deletions

View file

@ -27,8 +27,10 @@ import org.hibernate.Query;
import org.joda.time.LocalDate;
import org.libreplan.business.common.daos.IntegrationEntityDAO;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.costcategories.entities.CostCategory;
import org.libreplan.business.costcategories.entities.HourCost;
import org.libreplan.business.costcategories.entities.TypeOfWorkHours;
import org.libreplan.business.resources.entities.Criterion;
import org.libreplan.business.resources.entities.Resource;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
@ -78,4 +80,18 @@ public class HourCostDAO extends IntegrationEntityDAO<HourCost> implements
return (BigDecimal) query.uniqueResult();
}
@Override
@Transactional(readOnly = true)
public BigDecimal getPriceCostFromCriterionAndType(CostCategory category,
TypeOfWorkHours type) {
String strQuery = "SELECT priceCost " + "FROM HourCost "
+ "WHERE category = :category" + " AND type = :type ";
Query query = getSession().createQuery(strQuery);
query.setParameter("category", category);
query.setParameter("type", type);
return (BigDecimal) query.uniqueResult();
}
}

View file

@ -60,4 +60,6 @@ public interface IHourCostDAO extends IIntegrationEntityDAO<HourCost> {
BigDecimal getPriceCostFromResourceDateAndType(Resource resource,
LocalDate date, TypeOfWorkHours type);
public BigDecimal getPriceCostFromCriterionAndType(
CostCategory category, TypeOfWorkHours type);
}

View file

@ -57,6 +57,7 @@ import org.libreplan.business.common.entities.Configuration;
import org.libreplan.business.common.entities.PredefinedConnectorProperties;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.costcategories.daos.IHourCostDAO;
import org.libreplan.business.costcategories.entities.CostCategory;
import org.libreplan.business.costcategories.entities.TypeOfWorkHours;
import org.libreplan.business.labels.entities.Label;
@ -72,6 +73,7 @@ import org.libreplan.business.qualityforms.entities.TaskQualityForm;
import org.libreplan.business.requirements.entities.CriterionRequirement;
import org.libreplan.business.requirements.entities.DirectCriterionRequirement;
import org.libreplan.business.requirements.entities.IndirectCriterionRequirement;
import org.libreplan.business.resources.daos.ICriterionDAO;
import org.libreplan.business.resources.entities.Criterion;
import org.libreplan.business.scenarios.entities.OrderVersion;
import org.libreplan.business.scenarios.entities.Scenario;
@ -1705,8 +1707,7 @@ public abstract class OrderElement extends IntegrationEntity implements
public BigDecimal getResourcesBudget() {
BigDecimal result = new BigDecimal(0);
Configuration configuration = Registry
.getConfigurationDAO()
Configuration configuration = Registry.getConfigurationDAO()
.getConfiguration();
if (configuration == null) {
return result;
@ -1736,23 +1737,20 @@ public abstract class OrderElement extends IntegrationEntity implements
return totalBudget;
}
// FIXME: This workarounds LazyException when adding new
// criteria but disables the refresh on changes
BigDecimal costPerHour = new BigDecimal(0);
BigDecimal hours = new BigDecimal(0);
for (CriterionRequirement requirement : getCriterionRequirements()) {
hours = new BigDecimal(getWorkHours());
try {
if (requirement.getCriterion().getCostCategory() != null) {
costPerHour = requirement.getCriterion().getCostCategory()
.getHourCostByCode(typeofWorkHours.getCode())
.getPriceCost();
IHourCostDAO hourCostDAO = Registry.getHourCostDAO();
costPerHour = hourCostDAO.getPriceCostFromCriterionAndType(
requirement.getCriterion().getCostCategory(),
typeofWorkHours);
totalBudget = totalBudget.add(costPerHour.multiply(hours));
}
} catch (InstanceNotFoundException e) {
// Nothing to do, the budget is kept to 0
}
}
for (HoursGroup hoursGroup : getHoursGroups()) {
@ -1763,14 +1761,11 @@ public abstract class OrderElement extends IntegrationEntity implements
CostCategory costcat = crit.getCriterion().getCostCategory();
if (costcat != null) {
try {
costPerHour = costcat
.getPriceCostByTypeOfWorkHour(typeofWorkHours
.getCode());
} catch (InstanceNotFoundException e) {
// Default values to 0
costPerHour = new BigDecimal(0);
}
IHourCostDAO hourCostDAO = Registry.getHourCostDAO();
costPerHour = hourCostDAO.getPriceCostFromCriterionAndType(
costcat, typeofWorkHours);
}
totalBudget = totalBudget.add(costPerHour.multiply(hours));
}