[Bug #1227] Fix problem with percentage advances not being created

Now these are created in SaveCommand, while it's doing the saving.

FEA: ItEr75S04BugFixing
This commit is contained in:
Manuel Rego Casasnovas 2011-10-21 18:06:31 +02:00
parent d378166772
commit 14633d8e7a
6 changed files with 49 additions and 91 deletions

View file

@ -116,10 +116,6 @@ public interface IManageOrderElementAdvancesModel {
AdvanceAssignment getSpreadAdvance();
void createPercentageAdvances(OrderElement orderElement)
throws DuplicateAdvanceAssignmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException;
void cancel();
}

View file

@ -1269,15 +1269,6 @@ public class ManageOrderElementAdvancesController extends
messagesForUser.showMessage(Level.ERROR, message);
}
public void createPercentageAdvances(IOrderElementModel orderElementModel)
throws DuplicateAdvanceAssignmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException {
setOrderElementModel(orderElementModel);
manageOrderElementAdvancesModel.initEdit(getOrderElement());
manageOrderElementAdvancesModel
.createPercentageAdvances(getOrderElement());
}
private String validateValueAdvanceMeasurement(
AdvanceMeasurement measurement) {
if (manageOrderElementAdvancesModel.greatThanMaxValue(measurement)) {

View file

@ -179,49 +179,6 @@ public class ManageOrderElementAdvancesModel implements
}
}
public void createPercentageAdvances(OrderElement orderElement)
throws DuplicateAdvanceAssignmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException {
if (orderElement != null) {
DirectAdvanceAssignment advancePercentage = orderElement
.getAdvanceAssignmentByType(PredefinedAdvancedTypes.PERCENTAGE
.getType());
boolean existDirectPercentageAdvance = ((advancePercentage != null) && (!advancePercentage
.isFake()));
if ((orderElement.isSchedulingPoint())
&& (orderElement.getReportGlobalAdvanceAssignment() == null)
&& (!existDirectPercentageAdvance)) {
createPercentageAdvance(orderElement);
} else if (!existDirectPercentageAdvance) {
for (OrderElement child : orderElement.getChildren()) {
createPercentageAdvances(child);
}
}
}
}
private void createPercentageAdvance(OrderElement orderElement)
throws DuplicateAdvanceAssignmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException {
DirectAdvanceAssignment newAdvance = DirectAdvanceAssignment.create();
newAdvance.setOrderElement(orderElement);
for (AdvanceType type : this.listAdvanceTypes) {
if (type.getUnitName().equals(
PredefinedAdvancedTypes.PERCENTAGE.getTypeName())) {
newAdvance.setAdvanceType(type);
newAdvance.setMaxValue(getMaxValue(type));
}
}
newAdvance.setReportGlobalAdvance(true);
orderElement.addAdvanceAssignment(newAdvance);
}
@Override
@Transactional(readOnly = true)
public void initEdit(OrderElement orderElement) {

View file

@ -35,8 +35,6 @@ import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.LogFactory;
import org.hibernate.validator.InvalidValue;
import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException;
import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException;
import org.navalplanner.business.calendars.entities.BaseCalendar;
import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.externalcompanies.entities.ExternalCompany;
@ -784,8 +782,6 @@ public class OrderCRUDController extends GenericForwardComposer {
}
}
createPercentageAdvances();
// come back to the default tab.
if (getCurrentTab() != null) {
selectTab(getCurrentTab().getId());
@ -801,36 +797,6 @@ public class OrderCRUDController extends GenericForwardComposer {
Tab tabGeneralData;
private void createPercentageAdvances() {
try {
if (manageOrderElementAdvancesController == null) {
Component orderElementAdvances = editWindow
.getFellowIfAny("orderElementAdvances");
manageOrderElementAdvancesController = (ManageOrderElementAdvancesController) orderElementAdvances
.getVariable("manageOrderElementAdvancesController",
true);
}
manageOrderElementAdvancesController
.createPercentageAdvances(getOrderElementModel());
} catch (DuplicateAdvanceAssignmentForOrderElementException e) {
messagesForUser
.showMessage(
Level.ERROR,
_("cannot include a progress of the same progress type twice"));
} catch (DuplicateValueTrueReportGlobalAdvanceException e) {
messagesForUser
.showMessage(
Level.ERROR,
_("spread values are not valid, at least one value should be true"));
} catch (Exception e) {
messagesForUser
.showMessage(
Level.ERROR,
_("incorrect initialization of the progress assignment controller."));
}
}
private void selectDefaultTab() {
selectTab(DEFAULT_TAB);
}

View file

@ -36,8 +36,12 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.validator.InvalidValue;
import org.joda.time.LocalDate;
import org.navalplanner.business.advance.bootstrap.PredefinedAdvancedTypes;
import org.navalplanner.business.advance.entities.AdvanceMeasurement;
import org.navalplanner.business.advance.entities.AdvanceType;
import org.navalplanner.business.advance.entities.DirectAdvanceAssignment;
import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException;
import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException;
import org.navalplanner.business.common.BaseEntity;
import org.navalplanner.business.common.IAdHocTransactionService;
import org.navalplanner.business.common.IOnTransaction;
@ -315,6 +319,7 @@ public class SaveCommandBuilder {
if (order.isCodeAutogenerated()) {
generateOrderElementCodes(order);
}
createAdvancePercentagesIfRequired(order);
calculateAndSetTotalHours(order);
checkConstraintOrderUniqueCode(order);
checkConstraintHoursGroupUniqueCode(order);
@ -341,6 +346,49 @@ public class SaveCommandBuilder {
subcontractedTaskDataDAO.removeOrphanedSubcontractedTaskData();
}
private void createAdvancePercentagesIfRequired(Order order) {
List<OrderElement> allChildren = order.getAllChildren();
for (OrderElement each : allChildren) {
if (each.isLeaf()) {
createAdvancePercentageIfRequired(each);
}
}
}
private void createAdvancePercentageIfRequired(OrderElement orderElement) {
DirectAdvanceAssignment advancePercentage = orderElement
.getDirectAdvanceAssignmentByType(PredefinedAdvancedTypes.PERCENTAGE
.getType());
if ((orderElement.isSchedulingPoint())
&& (orderElement.getReportGlobalAdvanceAssignment() == null)
&& (advancePercentage == null)) {
createAdvancePercentage(orderElement);
}
}
private void createAdvancePercentage(OrderElement orderElement) {
DirectAdvanceAssignment newAdvance = DirectAdvanceAssignment
.create();
newAdvance.setOrderElement(orderElement);
AdvanceType type = PredefinedAdvancedTypes.PERCENTAGE.getType();
newAdvance.setAdvanceType(type);
newAdvance.setMaxValue(type.getDefaultMaxValue());
newAdvance.setReportGlobalAdvance(true);
try {
orderElement.addAdvanceAssignment(newAdvance);
} catch (DuplicateValueTrueReportGlobalAdvanceException e) {
// This shouldn't happen
throw new RuntimeException(e);
} catch (DuplicateAdvanceAssignmentForOrderElementException e) {
// Do nothing.
// This means that some parent has already defined an advance
// percentage so we don't need to create it at this point
}
}
private void generateOrderElementCodes(Order order) {
order.generateOrderElementCodes(entitySequenceDAO
.getNumberOfDigitsCode(EntityNameEnum.ORDER));

View file

@ -362,7 +362,7 @@ public class OrderModelTest {
for (OrderElement orderElement : elements) {
assertThat(((OrderLineGroup) orderElement)
.getIndirectAdvanceAssignments().size(),
equalTo(0));
equalTo(2));
}
for (int i = 0; i < containers.length; i++) {
assertThat(elements.get(i).getId(),