Bug #1555: Fix issue adding condition in both UI and web service

FEA: ItEr77S04BugFixing
This commit is contained in:
Manuel Rego Casasnovas 2012-11-06 15:51:36 +01:00
parent 774b97a26b
commit 944d59e2b9
7 changed files with 82 additions and 19 deletions

View file

@ -109,6 +109,8 @@ public interface IOrderElementDAO extends IIntegrationEntityDAO<OrderElement> {
EffortDuration calculateMinWorkedHours(final List<OrderElement> list);
boolean isAlreadyInUse(OrderElement orderElement);
boolean isAlreadyInUseThisOrAnyOfItsChildren(OrderElement orderElement);
/**
@ -130,6 +132,8 @@ public interface IOrderElementDAO extends IIntegrationEntityDAO<OrderElement> {
boolean hasImputedExpenseSheet(Long id) throws InstanceNotFoundException;
boolean hasImputedExpenseSheetThisOrAnyOfItsChildren(Long id) throws InstanceNotFoundException;
OrderElement findByExternalCode(String code) throws InstanceNotFoundException;
public List<OrderElement> findByLabelsAndCriteria(Set<Label> labels,

View file

@ -421,7 +421,8 @@ public class OrderElementDAO extends IntegrationEntityDAO<OrderElement>
return min;
}
private boolean isAlreadyInUse(OrderElement orderElement) {
@Override
public boolean isAlreadyInUse(OrderElement orderElement) {
if (orderElement.isNewObject()) {
return false;
}
@ -518,7 +519,14 @@ public class OrderElementDAO extends IntegrationEntityDAO<OrderElement>
}
@Override
public boolean hasImputedExpenseSheet(Long id) throws InstanceNotFoundException {
public boolean hasImputedExpenseSheet(Long id)
throws InstanceNotFoundException {
OrderElement orderElement = find(id);
return (!expenseSheetLineDAO.findByOrderElement(orderElement).isEmpty());
}
@Override
public boolean hasImputedExpenseSheetThisOrAnyOfItsChildren(Long id) throws InstanceNotFoundException {
OrderElement orderElement = find(id);
return (!expenseSheetLineDAO.findByOrderElementAndChildren(orderElement).isEmpty());
}

View file

@ -133,7 +133,7 @@ public interface IOrderModel extends IIntegrationEntityModel {
PlanningState getPlanningState();
boolean hasImputedExpenseSheets(OrderElement order);
boolean hasImputedExpenseSheetsThisOrAnyOfItsChildren(OrderElement order);
void removeAskedEndDate(EndDateCommunication endDate);
@ -145,4 +145,7 @@ public interface IOrderModel extends IIntegrationEntityModel {
boolean isAnyTaskWithConstraint(PositionConstraintType type);
boolean isOnlyChildAndParentAlreadyInUseByHoursOrExpenses(
OrderElement orderElement);
}

View file

@ -843,7 +843,7 @@ public class OrderCRUDController extends GenericForwardComposer {
}
private void remove(Order order) {
boolean hasImputedExpenseSheets = orderModel.hasImputedExpenseSheets(order);
boolean hasImputedExpenseSheets = orderModel.hasImputedExpenseSheetsThisOrAnyOfItsChildren(order);
if (hasImputedExpenseSheets) {
messagesForUser
.showMessage(

View file

@ -702,7 +702,8 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
@Override
public void remove(OrderElement element) {
boolean hasImputedExpenseSheets = orderModel.hasImputedExpenseSheets(element);
boolean hasImputedExpenseSheets = orderModel
.hasImputedExpenseSheetsThisOrAnyOfItsChildren(element);
if (hasImputedExpenseSheets) {
messagesForUser
.showMessage(
@ -719,10 +720,22 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
Level.ERROR,
_("You cannot remove the task \"{0}\" because it has work reported on it or any of its children",
element.getName()));
} else {
super.remove(element);
getRenderer().removeCodeTextbox(element);
return;
}
boolean onlyChildAndParentAlreadyInUseByHoursOrExpenses = orderModel
.isOnlyChildAndParentAlreadyInUseByHoursOrExpenses(element);
if (onlyChildAndParentAlreadyInUseByHoursOrExpenses) {
messagesForUser
.showMessage(
Level.ERROR,
_("You cannot remove the task \"{0}\" because it is the only child of its parent and its parent has tracked time or imputed expenses",
element.getName()));
return;
}
super.remove(element);
getRenderer().removeCodeTextbox(element);
}
@Override

View file

@ -869,12 +869,12 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel {
@Override
@Transactional(readOnly = true)
public boolean hasImputedExpenseSheets(OrderElement order) {
public boolean hasImputedExpenseSheetsThisOrAnyOfItsChildren(OrderElement order) {
if (order.isNewObject()) {
return false;
}
try {
return orderElementDAO.hasImputedExpenseSheet(order.getId());
return orderElementDAO.hasImputedExpenseSheetThisOrAnyOfItsChildren(order.getId());
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
@ -931,4 +931,24 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel {
return planningState.getRootTask().isAnyTaskWithConstraint(type);
}
@Override
@Transactional(readOnly = true)
public boolean isOnlyChildAndParentAlreadyInUseByHoursOrExpenses(
OrderElement orderElement) {
try {
OrderLineGroup parent = orderElement.getParent();
if (!parent.isOrder() && parent.getChildren().size() == 1) {
if (orderElementDAO.isAlreadyInUse(parent)) {
return true;
}
if (orderElementDAO.hasImputedExpenseSheet(parent.getId())) {
return true;
}
}
return false;
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
}

View file

@ -169,22 +169,37 @@ public class OrderElementServiceREST extends
}
private String checkRemovalValidation(OrderElement orderElement) {
if (orderElementDAO.isAlreadyInUseThisOrAnyOfItsChildren(orderElement)) {
return "You cannot remove the order element '"
+ orderElement.getName()
+ "' because it or any of its children have tracked time in some work report";
}
try {
if (orderElementDAO.hasImputedExpenseSheet(orderElement.getId())) {
if (orderElementDAO
.isAlreadyInUseThisOrAnyOfItsChildren(orderElement)) {
return "You cannot remove the order element '"
+ orderElement.getName()
+ "' because it or any of its children have tracked expenses in some expense sheet";
+ "' because it or any of its children have tracked time in some work report";
}
if (orderElementDAO.hasImputedExpenseSheetThisOrAnyOfItsChildren(orderElement.getId())) {
return "You cannot remove the order element '"
+ orderElement.getName()
+ "' because it or any of its children have tracked expenses in some expenses sheet";
}
OrderLineGroup parent = orderElement.getParent();
if (!parent.isOrder() && parent.getChildren().size() == 1) {
if (orderElementDAO.isAlreadyInUse(parent)) {
return "You cannot remove the order element '"
+ orderElement.getName()
+ "' because it is the only child of its parent and its parent has tracked time in some work report";
}
if (orderElementDAO.hasImputedExpenseSheet(parent.getId())) {
return "You cannot remove the order element '"
+ orderElement.getName()
+ "' because it is the only child of its parent and its parent has tracked expenses in some expenses sheet";
}
}
return null;
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
return null;
}
private OrderElement findOrderElement(OrderElement orderElement, Long id) {