updates the sum of expenses if the task associated to the

expense sheet line is changed.

FEA: ItEr76S22ExpenseTrackingSystem
This commit is contained in:
Susana Montes Pedreira 2012-06-05 15:38:37 +01:00
parent 488977188e
commit 342a1c32d2

View file

@ -24,6 +24,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.libreplan.business.common.IAdHocTransactionService;
@ -34,6 +35,7 @@ import org.libreplan.business.expensesheet.daos.IExpenseSheetLineDAO;
import org.libreplan.business.expensesheet.entities.ExpenseSheetLine;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.orders.entities.OrderElement;
import org.libreplan.business.orders.entities.OrderLineGroup;
import org.libreplan.business.orders.entities.SumExpenses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
@ -93,11 +95,17 @@ public class SumExpensesDAO extends GenericDAOHibernate<SumExpenses, Long> imple
}
}
});
if (value.compareTo(previousValue) >= 0) {
value = value.subtract(previousValue);
} else {
increase = false;
value = previousValue.subtract(value);
boolean isTaskDifferent = updateRelatedSumExpensesIfTheAssociatedTaskIsDifferent(
previousValue, expenseSheetLine);
if (!isTaskDifferent) {
if (value.compareTo(previousValue) >= 0) {
value = value.subtract(previousValue);
} else {
increase = false;
value = previousValue.subtract(value);
}
}
}
@ -110,6 +118,47 @@ public class SumExpensesDAO extends GenericDAOHibernate<SumExpenses, Long> imple
}
}
private boolean updateRelatedSumExpensesIfTheAssociatedTaskIsDifferent(
BigDecimal previousValue, final ExpenseSheetLine expenseSheetLine) {
final OrderElement task = expenseSheetLine.getOrderElement();
OrderElement previousTask = transactionService
.runOnAnotherTransaction(new IOnTransaction<OrderElement>() {
@Override
public OrderElement execute() {
try {
OrderElement previousTask = expenseSheetLineDAO
.find(expenseSheetLine.getId())
.getOrderElement();
if (task.getId().compareTo(previousTask.getId()) != 0) {
initalizeOrderElement(previousTask);
}
return previousTask;
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
});
if (task.getId().compareTo(previousTask.getId()) != 0) {
substractDirectExpenses(previousTask, previousValue);
return true;
}
return false;
}
private void initalizeOrderElement(OrderElement orderElement) {
Hibernate.initialize(orderElement);
initalizeOrder(orderElement);
}
private void initalizeOrder(OrderElement orderElement) {
OrderLineGroup parent = orderElement.getParent();
while (parent != null) {
Hibernate.initialize(parent);
parent = parent.getParent();
}
}
private void addDirectExpenses(OrderElement orderElement, BigDecimal value) {
SumExpenses sumExpenses = getByOrderElement(orderElement);
if (sumExpenses == null) {