ItEr24S06RFControlAvancesIncompatiblesEnUnidadesTraballoItEr23S06 : Management of Direct Advances and Calculated Advances.

This commit is contained in:
Susana Montes Pedreira 2009-09-06 21:07:39 +02:00 committed by Óscar González Fernández
parent f2c858cf38
commit 47c4e73845
15 changed files with 1199 additions and 289 deletions

View file

@ -1,13 +1,15 @@
package org.navalplanner.business.advance.entities;
import java.math.BigDecimal;
import java.util.SortedSet;
import java.util.TreeSet;
import org.hibernate.validator.NotNull;
import org.navalplanner.business.common.BaseEntity;
import org.navalplanner.business.orders.entities.OrderElement;
public class AdvanceAssigment extends BaseEntity {
public enum Type { DIRECTO, CALCULADO };
public enum Type { DIRECT, CALCULATED };
public static AdvanceAssigment create() {
AdvanceAssigment advanceAssigment = new AdvanceAssigment();
@ -15,14 +17,17 @@ public class AdvanceAssigment extends BaseEntity {
return advanceAssigment;
}
public static AdvanceAssigment create(boolean reportGlobalAdvance) {
AdvanceAssigment advanceAssigment = new AdvanceAssigment(reportGlobalAdvance);
public static AdvanceAssigment create(boolean reportGlobalAdvance, BigDecimal maxValue) {
AdvanceAssigment advanceAssigment = new AdvanceAssigment(reportGlobalAdvance, maxValue);
advanceAssigment.setNewObject(true);
return advanceAssigment;
}
private boolean reportGlobalAdvance;
@NotNull
private BigDecimal maxValue;
private Type type;
private OrderElement orderElement;
@ -36,8 +41,10 @@ public class AdvanceAssigment extends BaseEntity {
this.reportGlobalAdvance = false;
}
private AdvanceAssigment(boolean reportGlobalAdvance) {
private AdvanceAssigment(boolean reportGlobalAdvance,BigDecimal maxValue) {
this.reportGlobalAdvance = reportGlobalAdvance;
this.maxValue = maxValue;
this.maxValue.setScale(2,BigDecimal.ROUND_HALF_UP);
}
public void setReportGlobalAdvance(boolean reportGlobalAdvance) {
@ -48,6 +55,15 @@ public class AdvanceAssigment extends BaseEntity {
return this.reportGlobalAdvance;
}
public BigDecimal getMaxValue() {
return this.maxValue;
}
public void setMaxValue(BigDecimal maxValue) {
this.maxValue = maxValue;
this.maxValue.setScale(2);
}
public void setOrderElement(OrderElement orderElement) {
this.orderElement = orderElement;
}

View file

@ -8,10 +8,9 @@ import org.navalplanner.business.common.BaseEntity;
public class AdvanceMeasurement extends BaseEntity {
public static AdvanceMeasurement create(Date date, BigDecimal value,
BigDecimal maxValue) {
public static AdvanceMeasurement create(Date date, BigDecimal value) {
AdvanceMeasurement advanceMeasurement = new AdvanceMeasurement(date,
value, maxValue);
value);
advanceMeasurement.setNewObject(true);
return advanceMeasurement;
}
@ -28,21 +27,20 @@ public class AdvanceMeasurement extends BaseEntity {
@NotNull
private BigDecimal value;
@NotNull
private BigDecimal maxValue;
@NotNull
private AdvanceAssigment advanceAssigment;
private int numIndirectSons;
public AdvanceMeasurement() {
this.numIndirectSons = 0;
}
private AdvanceMeasurement(Date date, BigDecimal value, BigDecimal maxValue) {
private AdvanceMeasurement(Date date, BigDecimal value) {
this.date = date;
this.value = value;
this.value.setScale(2,BigDecimal.ROUND_HALF_UP);
this.maxValue = maxValue;
this.maxValue.setScale(2,BigDecimal.ROUND_HALF_UP);
this.numIndirectSons = 0;
}
public void setDate(Date date) {
@ -62,15 +60,6 @@ public class AdvanceMeasurement extends BaseEntity {
return this.value;
}
public BigDecimal getMaxValue() {
return this.maxValue;
}
public void setMaxValue(BigDecimal maxValue) {
this.maxValue = maxValue;
this.maxValue.setScale(2);
}
public void setAdvanceAssigment(AdvanceAssigment advanceAssigment) {
this.advanceAssigment = advanceAssigment;
}
@ -78,4 +67,20 @@ public class AdvanceMeasurement extends BaseEntity {
public AdvanceAssigment getAdvanceAssigment() {
return this.advanceAssigment;
}
public int getNumIndirectSons() {
return numIndirectSons;
}
public void setNumIndirectSons(int numIndirectSons) {
this.numIndirectSons = numIndirectSons;
}
public void incrementNumIndirectSons() {
this.numIndirectSons = this.numIndirectSons + 1;
}
public void decrementNumIndirectSons() {
this.numIndirectSons = this.numIndirectSons - 1;
}
}

View file

@ -18,6 +18,6 @@ public class AdvanceMeasurementComparator implements Comparator<AdvanceMeasureme
@Override
public int compare(AdvanceMeasurement arg0, AdvanceMeasurement arg1) {
return arg0.getDate().compareTo(arg1.getDate());
return arg1.getDate().compareTo(arg0.getDate());
}
}

View file

@ -1,5 +1,6 @@
package org.navalplanner.business.orders.entities;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
@ -8,6 +9,7 @@ import java.util.Set;
import org.hibernate.validator.NotEmpty;
import org.navalplanner.business.advance.entities.AdvanceAssigment;
import org.navalplanner.business.advance.entities.AdvanceMeasurement;
import org.navalplanner.business.advance.entities.AdvanceType;
import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssigmentForOrderElementException;
import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException;
@ -161,11 +163,13 @@ public abstract class OrderElement extends BaseEntity {
public void addAvanceAssigment(AdvanceAssigment newAdvanceAssigment)
throws DuplicateValueTrueReportGlobalAdvanceException,
DuplicateAdvanceAssigmentForOrderElementException {
checkNoOtherGlobalAdvanceAssignment(newAdvanceAssigment);
checkAncestorsNoOtherAssignmentWithSameAdvanceType(this,
newAdvanceAssigment);
checkChildrenNoOtherAssignmentWithSameAdvanceType(this,
newAdvanceAssigment);
if(newAdvanceAssigment.getType().equals(AdvanceAssigment.Type.DIRECT)){
checkNoOtherGlobalAdvanceAssignment(newAdvanceAssigment);
checkAncestorsNoOtherAssignmentWithSameAdvanceType(this,
newAdvanceAssigment);
checkChildrenNoOtherAssignmentWithSameAdvanceType(this,
newAdvanceAssigment);
}
this.advanceAssigments.add(newAdvanceAssigment);
}
@ -176,7 +180,8 @@ public abstract class OrderElement extends BaseEntity {
return;
}
for (AdvanceAssigment advanceAssigment : getAdvanceAssigments()) {
if (advanceAssigment.getReportGlobalAdvance())
if((advanceAssigment.getType().equals(AdvanceAssigment.Type.DIRECT))
&& (advanceAssigment.getReportGlobalAdvance()))
throw new DuplicateValueTrueReportGlobalAdvanceException(
"Duplicate Value True ReportGlobalAdvance For Order Element",
this, OrderElement.class);
@ -195,8 +200,9 @@ public abstract class OrderElement extends BaseEntity {
throws DuplicateAdvanceAssigmentForOrderElementException {
for (AdvanceAssigment advanceAssigment : orderElement
.getAdvanceAssigments()) {
if (AdvanceType.equivalentInDB(advanceAssigment.getAdvanceType(),
newAdvanceAssigment.getAdvanceType())) {
if ((AdvanceType.equivalentInDB(advanceAssigment.getAdvanceType(),
newAdvanceAssigment.getAdvanceType())) &&
(advanceAssigment.getType().equals(AdvanceAssigment.Type.DIRECT))) {
throw new DuplicateAdvanceAssigmentForOrderElementException(
"Duplicate Advance Assigment For Order Element", this,
OrderElement.class);
@ -220,8 +226,9 @@ public abstract class OrderElement extends BaseEntity {
throws DuplicateAdvanceAssigmentForOrderElementException {
for (AdvanceAssigment advanceAssigment : orderElement
.getAdvanceAssigments()) {
if (AdvanceType.equivalentInDB(advanceAssigment.getAdvanceType(),
newAdvanceAssigment.getAdvanceType())) {
if ((AdvanceType.equivalentInDB(advanceAssigment.getAdvanceType(),
newAdvanceAssigment.getAdvanceType())) &&
(advanceAssigment.getType().equals(AdvanceAssigment.Type.DIRECT))) {
throw new DuplicateAdvanceAssigmentForOrderElementException(
"Duplicate Advance Assigment For Order Element", this,
OrderElement.class);

View file

@ -28,6 +28,7 @@
<version name="version" access="property" type="long" />
<property name="reportGlobalAdvance" access="field"/>
<property name="maxValue" access="field" scale="2"/>
<property name="type" access="field">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">org.navalplanner.business.advance.entities.AdvanceAssigment$Type</param>
@ -58,7 +59,7 @@
<property name="date"/>
<property name="value" scale="2"/>
<property name="maxValue" scale="2"/>
<property name="numIndirectSons"/>
<many-to-one name="advanceAssigment" class="AdvanceAssigment" column="ADVANCE_ASSIGMENT_ID" />
</class>
</hibernate-mapping>

View file

@ -46,7 +46,7 @@
</set>
<!-- Inverse navigation from OrderElement to OrderLineGroup -->
<many-to-one name="parent" access="field" cascade="lock"/>
<many-to-one name="parent" access="field" cascade="all"/>
<joined-subclass name="OrderLineGroup">
<key column="ORDERELEMENTID"></key>

View file

@ -10,6 +10,7 @@ import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING
import java.math.BigDecimal;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
@ -17,6 +18,7 @@ import org.junit.runner.RunWith;
import org.navalplanner.business.advance.daos.IAdvanceAssigmentDAO;
import org.navalplanner.business.advance.daos.IAdvanceTypeDAO;
import org.navalplanner.business.advance.entities.AdvanceAssigment;
import org.navalplanner.business.advance.entities.AdvanceMeasurement;
import org.navalplanner.business.advance.entities.AdvanceType;
import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssigmentForOrderElementException;
import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException;
@ -90,10 +92,17 @@ public class AddAdvanceAssigmentsToOrderElementTest {
return advanceType;
}
private AdvanceMeasurement createValidAdvanceMeasurement() {
AdvanceMeasurement advanceMeasurement = AdvanceMeasurement.create(
new Date(), new BigDecimal(0));
return advanceMeasurement;
}
private AdvanceAssigment createValidAdvanceAssigment(
boolean reportGlobalAdvance) {
AdvanceAssigment advanceAssigment = AdvanceAssigment.create(
reportGlobalAdvance);
reportGlobalAdvance,new BigDecimal(0));
advanceAssigment.setType(AdvanceAssigment.Type.DIRECT);
return advanceAssigment;
}
@ -203,13 +212,17 @@ public class AddAdvanceAssigmentsToOrderElementTest {
OrderLine son = createValidLeaf("bla", "132");
container.add(son);
AdvanceMeasurement advanceMeasurement = createValidAdvanceMeasurement();
AdvanceType advanceTypeA = createAndSaveType("tipoA");
AdvanceType advanceTypeB = createAndSaveType("tipoB");
AdvanceAssigment advanceAssigmentA = createValidAdvanceAssigment(true);
advanceAssigmentA.setAdvanceType(advanceTypeA);
advanceAssigmentA.getAdvanceMeasurements().add(advanceMeasurement);
AdvanceAssigment advanceAssigmentB = createValidAdvanceAssigment(false);
advanceAssigmentB.setAdvanceType(advanceTypeB);
advanceAssigmentB.getAdvanceMeasurements().add(advanceMeasurement);
container.addAvanceAssigment(advanceAssigmentA);
@ -270,12 +283,15 @@ public class AddAdvanceAssigmentsToOrderElementTest {
OrderLine grandSon = createValidLeaf("GranSon", "75757");
son.add(grandSon);
AdvanceMeasurement advanceMeasurement = createValidAdvanceMeasurement();
AdvanceType advanceTypeA = createAndSaveType("tipoA");
AdvanceAssigment advanceAssigmentA = createValidAdvanceAssigment(true);
advanceAssigmentA.setAdvanceType(advanceTypeA);
advanceAssigmentA.getAdvanceMeasurements().add(advanceMeasurement);
AdvanceAssigment advanceAssigmentB = createValidAdvanceAssigment(false);
advanceAssigmentB.setAdvanceType(advanceTypeA);
advanceAssigmentB.getAdvanceMeasurements().add(advanceMeasurement);
grandSon.addAvanceAssigment(advanceAssigmentA);

View file

@ -0,0 +1,142 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.navalplanner.web.orders;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.TreeSet;
import java.util.SortedSet;
import org.navalplanner.business.advance.entities.AdvanceAssigment;
import org.navalplanner.business.advance.entities.AdvanceMeasurement;
import org.navalplanner.business.advance.entities.AdvanceMeasurementComparator;
import org.navalplanner.business.advance.entities.AdvanceType;
import org.navalplanner.business.util.ListSorter;
/**
*
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
public class AdvanceAssigmentDTO {
private AdvanceType advanceType;
private SortedSet<AdvanceMeasurement> advanceMeasurements =
new TreeSet<AdvanceMeasurement>(new AdvanceMeasurementComparator());
private ListSorter<AdvanceMeasurementDTO> advanceMeasurementDTOs =
ListSorter.create(new ArrayList<AdvanceMeasurementDTO>(), new AdvanceMeasurementDTOComparator());
private AdvanceAssigment advanceAssigment;
private BigDecimal maxValue;
private boolean reportGlobalAdvance;
private AdvanceAssigment.Type type;
private boolean isNewObject = true;
private boolean isNewDTO = true;
private boolean selectedRemove = false;
public AdvanceAssigmentDTO() {
this.reportGlobalAdvance = false;
this.isNewDTO = true;
this.isNewObject = false;
this.type = AdvanceAssigment.Type.DIRECT;
}
public AdvanceAssigmentDTO(AdvanceType advanceType,
AdvanceAssigment advanceAssigment,
SortedSet<AdvanceMeasurement> advanceMeasurements) {
this.advanceType = advanceType;
this.advanceMeasurements = advanceMeasurements;
this.advanceAssigment = advanceAssigment;
this.maxValue = advanceAssigment.getMaxValue();
this.reportGlobalAdvance = advanceAssigment.getReportGlobalAdvance();
this.type = advanceAssigment.getType();
this.isNewDTO = false;
if(advanceAssigment.getVersion()==null){
this.isNewObject = true;
}else{
this.isNewObject = false;
}
}
public boolean getIsNewObject() {
return this.isNewObject;
}
public boolean getIsNewDTO() {
return this.isNewDTO;
}
public void setAdvanceType(AdvanceType advanceType){
this.advanceType = advanceType;
}
public AdvanceType getAdvanceType() {
return this.advanceType;
}
public AdvanceAssigment getAdvanceAssigment() {
return this.advanceAssigment;
}
public void setAdvanceAssigment(AdvanceAssigment advanceAssigment) {
this.advanceAssigment = advanceAssigment;
}
public SortedSet<AdvanceMeasurement> getAdvanceMeasurements() {
return this.advanceMeasurements;
}
public void setAdvanceMeasurements(SortedSet<AdvanceMeasurement> advanceMeasurements) {
this.advanceMeasurements = advanceMeasurements;
}
public ListSorter<AdvanceMeasurementDTO> getAdvanceMeasurementDTOs() {
return this.advanceMeasurementDTOs;
}
public void setAdvanceMeasurementDTOs(ListSorter<AdvanceMeasurementDTO> advanceMeasurementDTOs) {
this.advanceMeasurementDTOs = advanceMeasurementDTOs;
}
public void setReportGlobalAdvance(boolean reportGlobalAdvance) {
this.reportGlobalAdvance = reportGlobalAdvance;
}
public boolean getReportGlobalAdvance() {
return this.reportGlobalAdvance;
}
public BigDecimal getMaxValue(){
return this.maxValue;
}
public void setMaxValue(BigDecimal maxValue) {
this.maxValue = maxValue;
}
public AdvanceAssigment.Type getType(){
return this.type;
}
public void setType(AdvanceAssigment.Type type) {
this.type = type;
}
public boolean isSelectedForRemove(){
return this.selectedRemove;
}
public void setSelectedForRemove(boolean selectedRemove){
this.selectedRemove = selectedRemove;
}
}

View file

@ -3,26 +3,18 @@ package org.navalplanner.web.orders;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import org.navalplanner.business.advance.entities.AdvanceAssigment;
import org.navalplanner.business.advance.entities.AdvanceMeasurement;
import org.navalplanner.business.advance.entities.AdvanceType;
public class AdvanceMeasurementDTO{
private AdvanceType advanceType;
private AdvanceMeasurement advanceMeasurement;
private AdvanceAssigment advanceAssigment;
private AdvanceAssigmentDTO advanceAssigmentDTO;
private Date date;
private BigDecimal maxValue;
private BigDecimal value;
private boolean reportGlobalAdvance;
private boolean isNewObject = true;
private boolean isNewDTO = true;
@ -32,36 +24,28 @@ public class AdvanceMeasurementDTO{
private String percentage;
public AdvanceMeasurementDTO() {
this.reportGlobalAdvance = false;
this.date = new Date();
this.percentage = new String("");
this.percentage = new String("0 %");
this.isNewDTO = true;
this.isNewObject = false;
}
public AdvanceMeasurementDTO(AdvanceType advanceType,
AdvanceAssigment advanceAssigment,
AdvanceMeasurement advanceMeasurement) {
this.advanceType = advanceType;
public AdvanceMeasurementDTO(AdvanceMeasurement advanceMeasurement){
this.advanceMeasurement = advanceMeasurement;
this.date = advanceMeasurement.getDate();
this.maxValue = advanceMeasurement.getMaxValue();
this.value = advanceMeasurement.getValue();
this.advanceAssigment = advanceAssigment;
this.reportGlobalAdvance = advanceAssigment.getReportGlobalAdvance();
this.percentage = new String("");
this.percentage = new String("0 %");
this.isNewDTO = false;
if(advanceAssigment.getVersion()==null){
if(advanceMeasurement.getVersion()==null){
this.isNewObject = true;
}else{
this.isNewObject = false;
}
}
public boolean getIsNewObject() {
public boolean getIsNewObject(){
return this.isNewObject;
}
@ -69,45 +53,40 @@ public class AdvanceMeasurementDTO{
return this.isNewDTO;
}
public void setAdvanceType(AdvanceType advanceType){
this.advanceType = advanceType;
public AdvanceAssigmentDTO getAdvanceAssigmentDTO() {
return this.advanceAssigmentDTO;
}
public AdvanceType getAdvanceType() {
return this.advanceType;
}
public AdvanceAssigment getAdvanceAssigment() {
return this.advanceAssigment;
public void setAdvanceAssigmentDTO(AdvanceAssigmentDTO advanceAssigmentDTO) {
this.advanceAssigmentDTO = advanceAssigmentDTO;
}
public AdvanceMeasurement getAdvanceMeasurement() {
return this.advanceMeasurement;
}
public void setAdvanceMeasurement(AdvanceMeasurement advanceMeasurement) {
this.advanceMeasurement = advanceMeasurement;
}
public void setPercentage(String percentage) {
this.percentage = percentage;
}
public String getPercentage() {
if((value != null)&&(maxValue != null)){
if(advanceAssigmentDTO == null) return "0 %";
if(value == null) return "0 %";
if(advanceAssigmentDTO.getMaxValue() != null){
BigDecimal maxValue = advanceAssigmentDTO.getMaxValue();
BigDecimal percentage = new BigDecimal(0);
BigDecimal division = (value.divide(maxValue,4,RoundingMode.HALF_UP));
division.setScale(2, RoundingMode.HALF_UP);
percentage = division.multiply(new BigDecimal(100));
percentage = percentage.setScale(2, RoundingMode.HALF_UP);
this.percentage = percentage.toString();
this.percentage = percentage.toString()+" %";
return this.percentage;
}
return "";
}
public void setReportGlobalAdvance(boolean reportGlobalAdvance) {
this.reportGlobalAdvance = reportGlobalAdvance;
}
public boolean getReportGlobalAdvance() {
return this.reportGlobalAdvance;
return "0 %";
}
public void setDate(Date date) {
@ -126,14 +105,6 @@ public class AdvanceMeasurementDTO{
return this.value;
}
public BigDecimal getMaxValue() {
return this.maxValue;
}
public void setMaxValue(BigDecimal maxValue) {
this.maxValue = maxValue;
}
public boolean isSelectedForRemove(){
return this.selectedRemove;
}

View file

@ -0,0 +1,16 @@
package org.navalplanner.web.orders;
import java.util.Comparator;
/**
*
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
public class AdvanceMeasurementDTOComparator implements Comparator<AdvanceMeasurementDTO> {
public AdvanceMeasurementDTOComparator(){
}
@Override
public int compare(AdvanceMeasurementDTO arg0, AdvanceMeasurementDTO arg1) {
return arg1.getDate().compareTo(arg0.getDate());
}
}

View file

@ -14,21 +14,40 @@ import org.navalplanner.business.orders.entities.OrderElement;
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
public interface IManageOrderElementAdvancesModel {
public List<AdvanceMeasurementDTO> getAdvanceMeasurements();
public void prepareEditAdvanceMeasurements(AdvanceAssigmentDTO advanceAssigmentDTO);
public List<AdvanceMeasurementDTO> getAdvanceMeasurementDTOs();
public List<AdvanceAssigmentDTO> getAdvanceAssigmentDTOs();
public void init(OrderElement orderElement);
public void addNewLine();
public void addNewLineAdvaceAssigment();
public void removeLine(AdvanceMeasurementDTO advanceDTO);
public void addNewLineAdvaceMeasurement();
public void removeLineAdvanceAssigment(AdvanceAssigmentDTO advanceDTO);
public void removeLineAdvanceMeasurement(AdvanceMeasurementDTO advanceDTO);
public List<AdvanceType> getActivesAdvanceTypes();
public boolean isPrecisionValid(AdvanceMeasurementDTO advanceDTO, BigDecimal value);
public boolean isReadOnlyAdvanceMeasurementDTOs();
public boolean greatThanMaxValue(AdvanceMeasurementDTO advanceDTO, BigDecimal value);
public void cleanAdvance();
public boolean isGreatValidDate(AdvanceMeasurementDTO advanceDTO, Date value);
public boolean isPrecisionValid(BigDecimal value);
public boolean greatThanMaxValue(BigDecimal value);
public boolean isGreatValidDate(Date value);
public BigDecimal getUnitPrecision();
public AdvanceMeasurementDTO getFirstAdvanceMeasurement(AdvanceAssigmentDTO advanceAssigmentDTO);
public void modifyListAdvanceMeasurement(AdvanceMeasurementDTO advanceMeasurementDTO);
public void accept()throws InstanceNotFoundException,
DuplicateAdvanceAssigmentForOrderElementException,

View file

@ -7,6 +7,8 @@ import static org.navalplanner.web.I18nHelper._;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.SortedSet;
import org.navalplanner.business.advance.entities.AdvanceAssigment;
import org.navalplanner.business.advance.entities.AdvanceType;
import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssigmentForOrderElementException;
import org.navalplanner.web.common.IMessagesForUser;
@ -19,6 +21,7 @@ import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Constraint;
@ -30,6 +33,7 @@ import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;
/**
@ -44,6 +48,8 @@ public class ManageOrderElementAdvancesController extends
private Window window;
private int indexSelectedItem = -1;
private IManageOrderElementAdvancesModel manageOrderElementAdvancesModel;
private AdvanceTypeListRenderer advanceTypeListRenderer = new AdvanceTypeListRenderer();
@ -57,7 +63,11 @@ public class ManageOrderElementAdvancesController extends
}
public List<AdvanceMeasurementDTO> getAdvanceMeasurementDTOs() {
return manageOrderElementAdvancesModel.getAdvanceMeasurements();
return manageOrderElementAdvancesModel.getAdvanceMeasurementDTOs();
}
public List<AdvanceAssigmentDTO> getAdvanceAssigmentDTOs() {
return manageOrderElementAdvancesModel.getAdvanceAssigmentDTOs();
}
public void cancel() {
@ -94,40 +104,79 @@ public class ManageOrderElementAdvancesController extends
public void openWindow(IOrderElementModel orderElementModel) {
this.manageOrderElementAdvancesModel.init(orderElementModel
.getOrderElement());
}
public void goToCreateLine() {
manageOrderElementAdvancesModel.addNewLine();
this.indexSelectedItem = -1;
Util.reloadBindings(window);
}
public void goToRemoveLine(){
public void prepareEditAdvanceMeasurements(AdvanceAssigmentDTO advanceAssigmentDTO){
manageOrderElementAdvancesModel.prepareEditAdvanceMeasurements(advanceAssigmentDTO);
Listbox listAdvances = ((Listbox) window.getFellow("editAdvances"));
this.indexSelectedItem = listAdvances.getIndexOfItem(listAdvances.getSelectedItem());
Util.reloadBindings(window);
}
public void goToCreateLineAdvanceAssigment() {
manageOrderElementAdvancesModel.addNewLineAdvaceAssigment();
Util.reloadBindings(window);
}
public void goToCreateLineAdvanceMeasurement() {
manageOrderElementAdvancesModel.addNewLineAdvaceMeasurement();
Util.reloadBindings(window);
}
public void goToRemoveLineAdvanceAssigment(){
Listbox listAdvances = (Listbox) window.getFellow("editAdvances");
Listitem listItem = listAdvances.getSelectedItem();
Listitem listItem = listAdvances.getItemAtIndex(indexSelectedItem);
if(listItem != null){
AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO) listItem.getValue();
manageOrderElementAdvancesModel.removeLine(advanceDTO);
AdvanceAssigmentDTO advanceAssigmentDTO = (AdvanceAssigmentDTO) listItem.getValue();
manageOrderElementAdvancesModel.removeLineAdvanceAssigment(advanceAssigmentDTO);
Util.reloadBindings(window);
}
}
public void goToRemoveLineAdvanceMeasurement(){
Listbox listAdvancesMeasurement = (Listbox)window.getFellow("editAdvancesMeasurement");
Listitem selectedItem = listAdvancesMeasurement.getSelectedItem();
if(selectedItem != null){
AdvanceMeasurementDTO advanceMeasurementDTO = (AdvanceMeasurementDTO) selectedItem.getValue();
if(advanceMeasurementDTO != null){
manageOrderElementAdvancesModel.removeLineAdvanceMeasurement(advanceMeasurementDTO);
Util.reloadBindings(window);
}
}
}
public List<AdvanceType> getActivesAdvanceType() {
return manageOrderElementAdvancesModel.getActivesAdvanceTypes();
}
public boolean isReadOnlyAdvanceMeasurementDTOs(){
return manageOrderElementAdvancesModel.isReadOnlyAdvanceMeasurementDTOs();
}
public AdvanceTypeListRenderer getAdvancesRenderer() {
return advanceTypeListRenderer;
}
public void updatesValue(final Decimalbox item){
this.setPercentage();
this.setCurrentValue();
this.cleanDate((Listitem)item.getParent().getParent());
this.setCurrentDate();
}
public class AdvanceTypeListRenderer implements ListitemRenderer {
@Override
public void render(Listitem listItem, Object data) throws Exception {
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO) data;
final AdvanceAssigmentDTO advanceDTO = (AdvanceAssigmentDTO) data;
listItem.setValue(advanceDTO);
listItem.setDraggable("true");
listItem.setDroppable("true");
if ((advanceDTO.getIsNewObject())||(advanceDTO.getIsNewDTO())){
if((advanceDTO.getType().equals(AdvanceAssigment.Type.DIRECT))
&& ((advanceDTO.getIsNewObject())||(advanceDTO.getIsNewDTO()))){
appendComboboxAdvancType(listItem);
} else {
appendLabelAdvanceType(listItem);
@ -137,11 +186,12 @@ public class ManageOrderElementAdvancesController extends
appendLabelPercentage(listItem);
appendDateBoxDate(listItem);
appendRadioSpread(listItem);
appendCalculatedCheckbox(listItem);
}
}
private void appendComboboxAdvancType(final Listitem listItem){
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO)listItem.getValue();
final AdvanceAssigmentDTO advanceDTO = (AdvanceAssigmentDTO)listItem.getValue();
final Combobox comboAdvanceTypes = new Combobox();
final List<AdvanceType> listAdvanceType = manageOrderElementAdvancesModel
.getActivesAdvanceTypes();
@ -160,8 +210,8 @@ public class ManageOrderElementAdvancesController extends
@Override
public void onEvent(Event event) throws Exception {
setMaxValue(listItem,comboAdvanceTypes);
cleanFields(listItem);
setPercentage(listItem);
cleanFields();
setPercentage();
}
});
@ -188,7 +238,7 @@ public class ManageOrderElementAdvancesController extends
}
private void appendLabelAdvanceType(final Listitem listItem){
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO)listItem.getValue();
final AdvanceAssigmentDTO advanceDTO = (AdvanceAssigmentDTO)listItem.getValue();
Label unitName = new Label(advanceDTO.getAdvanceType().getUnitName());
Listcell listCell = new Listcell();
listCell.appendChild(unitName);
@ -196,27 +246,31 @@ public class ManageOrderElementAdvancesController extends
}
private void appendDecimalBoxMaxValue(final Listitem listItem){
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO)listItem.getValue();
final AdvanceAssigmentDTO advanceAssigmentDTO = (AdvanceAssigmentDTO)listItem.getValue();
Decimalbox maxValue = new Decimalbox();
maxValue.setScale(2);
if(advanceAssigmentDTO.getType().equals(AdvanceAssigment.Type.CALCULATED))
maxValue.setDisabled(true);
Util.bind(maxValue,
new Util.Getter<BigDecimal>() {
@Override
public BigDecimal get() {
return advanceDTO.getMaxValue();
return advanceAssigmentDTO.getMaxValue();
}
}, new Util.Setter<BigDecimal>() {
@Override
public void set(BigDecimal value) {
advanceDTO.setMaxValue(value);
advanceAssigmentDTO.setMaxValue(value);
}
});
maxValue.addEventListener(Events.ON_CHANGE,
new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
setPercentage(listItem);
setPercentage();
}
});
@ -226,83 +280,106 @@ public class ManageOrderElementAdvancesController extends
}
private void appendDecimalBoxValue(final Listitem listItem){
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO)listItem.getValue();
final AdvanceAssigmentDTO advanceAssigmentDTO = (AdvanceAssigmentDTO)listItem.getValue();
Decimalbox value = new Decimalbox();
value.setScale(2);
Util.bind(value, new Util.Getter<BigDecimal>() {
@Override
public BigDecimal get() {
return advanceDTO.getValue();
}
}, new Util.Setter<BigDecimal>() {
value.setDisabled(true);
final AdvanceMeasurementDTO advanceMeasurementDTO =
this.manageOrderElementAdvancesModel.getFirstAdvanceMeasurement(advanceAssigmentDTO);
if(advanceMeasurementDTO != null){
Util.bind(value, new Util.Getter<BigDecimal>() {
@Override
public BigDecimal get() {
return advanceMeasurementDTO.getValue();
}
}, new Util.Setter<BigDecimal>() {
@Override
public void set(BigDecimal value) {
advanceDTO.setValue(value);
advanceMeasurementDTO.setValue(value);
}
});
value.setConstraint(checkValidValue());
value.addEventListener(Events.ON_CHANGE,
new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
setPercentage(listItem);
cleanDate(listItem);
}
});
});
}
Listcell listCell = new Listcell();
listCell.appendChild(value);
listItem.appendChild(listCell);
}
private void appendLabelPercentage(final Listitem listItem){
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO)listItem.getValue();
final AdvanceAssigmentDTO advanceAssigmentDTO = (AdvanceAssigmentDTO)listItem.getValue();
Label percentage = new Label();
percentage.setValue(advanceDTO.getPercentage() + " %");
final AdvanceMeasurementDTO advanceMeasurementDTO =
this.manageOrderElementAdvancesModel.getFirstAdvanceMeasurement(advanceAssigmentDTO);
if(advanceMeasurementDTO != null){
percentage.setValue(advanceMeasurementDTO.getPercentage());
}
Listcell listCell = new Listcell();
listCell.appendChild(percentage);
listItem.appendChild(listCell);
}
private void appendDateBoxDate(final Listitem listItem){
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO)listItem.getValue();
final AdvanceAssigmentDTO advanceAssigmentDTO = (AdvanceAssigmentDTO)listItem.getValue();
Datebox date = new Datebox();
Util.bind(date, new Util.Getter<Date>() {
date.setDisabled(true);
final AdvanceMeasurementDTO advanceMeasurementDTO =
this.manageOrderElementAdvancesModel.getFirstAdvanceMeasurement(advanceAssigmentDTO);
if(advanceMeasurementDTO != null){
Util.bind(date, new Util.Getter<Date>() {
@Override
public Date get() {
return advanceDTO.getDate();
return advanceMeasurementDTO.getDate();
}
}, new Util.Setter<Date>() {
}, new Util.Setter<Date>() {
@Override
public void set(Date value) {
advanceDTO.setDate(value);
advanceMeasurementDTO.setDate(value);
}
});
date.setConstraint(checkValidDate());
});
}
Listcell listCell = new Listcell();
listCell.appendChild(date);
listItem.appendChild(listCell);
}
private void appendRadioSpread(final Listitem listItem){
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO)listItem.getValue();
final AdvanceAssigmentDTO advanceAssigmentDTO = (AdvanceAssigmentDTO)listItem.getValue();
Radio reportGlobalAdvance = new Radio();
reportGlobalAdvance.setChecked(advanceDTO.getReportGlobalAdvance());
reportGlobalAdvance.setChecked(advanceAssigmentDTO.getReportGlobalAdvance());
if(advanceAssigmentDTO.getType().equals(AdvanceAssigment.Type.CALCULATED))
reportGlobalAdvance.setDisabled(true);
reportGlobalAdvance.addEventListener(Events.ON_CHECK,
new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
setReportGlobalAdvance(listItem);
}
new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
setReportGlobalAdvance(listItem);
}
});
Listcell listCell = new Listcell();
listCell.appendChild(reportGlobalAdvance);
listItem.appendChild(listCell);
}
private void appendCalculatedCheckbox(final Listitem listItem){
final AdvanceAssigmentDTO advanceDTO = (AdvanceAssigmentDTO)listItem.getValue();
Checkbox calculated = new Checkbox();
boolean isCalculated = advanceDTO.getType().equals(AdvanceAssigment.Type.CALCULATED);
calculated.setChecked(isCalculated);
calculated.setDisabled(true);
Listcell listCell = new Listcell();
listCell.appendChild(calculated);
listItem.appendChild(listCell);
}
private void setMaxValue(final Listitem item,Combobox comboAdvanceTypes) {
Listcell listCell = (Listcell)item.getChildren().get(1);
Decimalbox miBox = ((Decimalbox) listCell.getFirstChild());
@ -310,44 +387,80 @@ public class ManageOrderElementAdvancesController extends
if(selectedItem != null){
AdvanceType advanceType = ((AdvanceType) selectedItem.getValue());
if(advanceType != null){
AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO)item.getValue();
AdvanceAssigmentDTO advanceDTO = (AdvanceAssigmentDTO)item.getValue();
advanceDTO.setMaxValue(advanceType.getDefaultMaxValue());
miBox.setValue(advanceType.getDefaultMaxValue());
}
}
}
private void setPercentage(final Listitem item){
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO) item.getValue();
Listcell celdaPercentage = (Listcell)item.getChildren().get(3);
((Label)celdaPercentage.getFirstChild()).setValue(advanceDTO.getPercentage()+" %");
private void setPercentage(){
if(this.indexSelectedItem >= 0){
Listbox listAdvances = ((Listbox) window.getFellow("editAdvances"));
Listitem selectedItem = listAdvances.getItemAtIndex(indexSelectedItem);
AdvanceAssigmentDTO advanceAssigmentDTO =
(AdvanceAssigmentDTO) selectedItem.getValue();
final AdvanceMeasurementDTO greatAdvanceMeasurementDTO =
this.manageOrderElementAdvancesModel.getFirstAdvanceMeasurement(advanceAssigmentDTO);
if(greatAdvanceMeasurementDTO != null){
Listcell percentage = (Listcell)selectedItem.getChildren().get(3);
((Label)percentage.getFirstChild()).setValue(greatAdvanceMeasurementDTO.getPercentage());
}
}
}
private void setCurrentValue(){
if(this.indexSelectedItem >= 0){
Listbox listAdvances = ((Listbox) window.getFellow("editAdvances"));
Listitem selectedItem = listAdvances.getItemAtIndex(indexSelectedItem);
AdvanceAssigmentDTO advanceAssigmentDTO =
(AdvanceAssigmentDTO) selectedItem.getValue();
final AdvanceMeasurementDTO greatAdvanceMeasurementDTO =
this.manageOrderElementAdvancesModel.getFirstAdvanceMeasurement(advanceAssigmentDTO);
if(greatAdvanceMeasurementDTO != null){
Listcell value = (Listcell)selectedItem.getChildren().get(2);
((Decimalbox)value.getFirstChild()).setValue(greatAdvanceMeasurementDTO.getValue());
}
}
}
public void setCurrentDate(Listitem item){
this.manageOrderElementAdvancesModel.modifyListAdvanceMeasurement(
(AdvanceMeasurementDTO)item.getValue());
Util.reloadBindings(window.getFellow("editAdvancesMeasurement"));
setCurrentDate();
this.setPercentage();
this.setCurrentValue();
}
private void setCurrentDate(){
if(this.indexSelectedItem >= 0){
Listbox listAdvances = ((Listbox) window.getFellow("editAdvances"));
Listitem selectedItem = listAdvances.getItemAtIndex(indexSelectedItem);
AdvanceAssigmentDTO advanceAssigmentDTO =
(AdvanceAssigmentDTO) selectedItem.getValue();
final AdvanceMeasurementDTO greatAdvanceMeasurementDTO =
this.manageOrderElementAdvancesModel.getFirstAdvanceMeasurement(advanceAssigmentDTO);
if(greatAdvanceMeasurementDTO != null){
Listcell date = (Listcell)selectedItem.getChildren().get(4);
((Datebox)date.getFirstChild()).setValue(greatAdvanceMeasurementDTO.getDate());
}
}
}
private void cleanDate(final Listitem item){
final AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO) item.getValue();
advanceDTO.setDate(null);
Listcell celdaDate = (Listcell)item.getChildren().get(4);
final AdvanceMeasurementDTO advanceMeasurementDTO = (AdvanceMeasurementDTO) item.getValue();
advanceMeasurementDTO.setDate(null);
Listcell celdaDate = (Listcell)item.getChildren().get(2);
((Datebox)celdaDate.getFirstChild()).setValue(null);
}
private void cleanFields(final Listitem item){
AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO) item.getValue();
Listcell celdaValue = (Listcell) item.getChildren().get(2);
((Decimalbox)celdaValue.getFirstChild()).setValue(null);
advanceDTO.setValue(null);
Listcell celdaPercentage = (Listcell) item.getChildren().get(3);
((Label)celdaPercentage.getFirstChild()).setValue(" %");
advanceDTO.setPercentage("");
Listcell celdaDate = (Listcell) item.getChildren().get(4);
((Datebox)celdaDate.getFirstChild()).setValue(null);
advanceDTO.setDate(null);
Listcell celdaSpread = (Listcell) item.getChildren().get(5);
((Radio)celdaSpread.getFirstChild()).setChecked(false);
advanceDTO.setReportGlobalAdvance(false);
private void cleanFields(){
this.manageOrderElementAdvancesModel.cleanAdvance();
Util.reloadBindings(window);
}
private void setReportGlobalAdvance(final Listitem item){
@ -356,33 +469,35 @@ public class ManageOrderElementAdvancesController extends
if(listAdvances.getChildren().get(i) instanceof Listitem){
Listitem listItem = (Listitem) listAdvances.getChildren().get(i);
Listcell celdaSpread = (Listcell) listItem.getChildren().get(5);
((Radio)celdaSpread.getFirstChild()).setChecked(false);
((AdvanceMeasurementDTO)listItem.getValue()).setReportGlobalAdvance(false);
Radio radioSpread = ((Radio)celdaSpread.getFirstChild());
if(!radioSpread.isDisabled()){
radioSpread.setChecked(false);
((AdvanceAssigmentDTO)listItem.getValue()).setReportGlobalAdvance(false);
}
}
}
Listcell celdaSpread = (Listcell) item.getChildren().get(5);
((Radio)celdaSpread.getFirstChild()).setChecked(true);
((AdvanceMeasurementDTO)item.getValue()).setReportGlobalAdvance(true);
((AdvanceAssigmentDTO)item.getValue()).setReportGlobalAdvance(true);
}
private Constraint checkValidValue() {
public Constraint checkValidValue() {
Constraint newConstraint = new Constraint() {
@Override
public void validate(Component comp, Object value)
throws WrongValueException {
if (((BigDecimal) value) != null){
Listitem listItem = ((Listitem)comp.getParent().getParent());
AdvanceMeasurementDTO advanceDTO = ((AdvanceMeasurementDTO)listItem.getValue());
if(manageOrderElementAdvancesModel.greatThanMaxValue(advanceDTO,(BigDecimal)value)){
if(manageOrderElementAdvancesModel.greatThanMaxValue((BigDecimal)value)){
throw new WrongValueException(
comp,
_("Value is not valid, the current value must be less than max value"));
}
if (!(manageOrderElementAdvancesModel.isPrecisionValid(advanceDTO,(BigDecimal)value))) {
if (!(manageOrderElementAdvancesModel.isPrecisionValid((BigDecimal)value))) {
throw new WrongValueException(
comp,
_("Value is not valid, the Precision value must be exact "
+advanceDTO.getAdvanceType().getUnitPrecision()));
+manageOrderElementAdvancesModel.getUnitPrecision()));
}
}
}
@ -390,15 +505,13 @@ public class ManageOrderElementAdvancesController extends
return newConstraint;
}
private Constraint checkValidDate() {
public Constraint checkValidDate() {
Constraint newConstraint = new Constraint() {
@Override
public void validate(Component comp, Object value)
throws WrongValueException {
if (((Date) value) != null) {
Listitem listItem = ((Listitem)comp.getParent().getParent());
AdvanceMeasurementDTO advanceDTO = ((AdvanceMeasurementDTO)listItem.getValue());
if(!manageOrderElementAdvancesModel.isGreatValidDate(advanceDTO,(Date)value)){
if(!manageOrderElementAdvancesModel.isGreatValidDate((Date)value)){
throw new WrongValueException(
comp,
_("The date is not valid, the date must be great than the current date of the other advances measurement"));
@ -410,13 +523,29 @@ public class ManageOrderElementAdvancesController extends
}
private boolean validateDataForm(){
return ((validateListAdvanceAssigment())
&&(validateListAdvanceMeasurement()));
}
private boolean validateListAdvanceAssigment(){
Listbox listAdvances = (Listbox) window.getFellow("editAdvances");
for(int i=0; i< listAdvances.getChildren().size(); i++){
if(listAdvances.getChildren().get(i) instanceof Listitem){
Listitem listItem = (Listitem) listAdvances.getChildren().get(i);
AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO) listItem.getValue();
AdvanceAssigmentDTO advanceDTO = (AdvanceAssigmentDTO) listItem.getValue();
if(advanceDTO.getAdvanceType() == null)return false;
if(advanceDTO.getMaxValue() == null)return false;
}
}
return true;
}
private boolean validateListAdvanceMeasurement(){
Listbox listAdvances = (Listbox) window.getFellow("editAdvancesMeasurement");
for(int i=0; i< listAdvances.getChildren().size(); i++){
if(listAdvances.getChildren().get(i) instanceof Listitem){
Listitem listItem = (Listitem) listAdvances.getChildren().get(i);
AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO) listItem.getValue();
if(advanceDTO.getValue() == null)return false;
if(advanceDTO.getDate() == null)return false;
}
@ -429,11 +558,14 @@ public class ManageOrderElementAdvancesController extends
boolean existItems = false;
for(int i=0; i< listAdvances.getChildren().size(); i++){
if(listAdvances.getChildren().get(i) instanceof Listitem){
existItems = true;
Listitem listItem = (Listitem) listAdvances.getChildren().get(i);
AdvanceMeasurementDTO advanceDTO = (AdvanceMeasurementDTO) listItem.getValue();
if(advanceDTO.getReportGlobalAdvance())
return true;
AdvanceAssigmentDTO advanceAssigmentDTO = (AdvanceAssigmentDTO) listItem.getValue();
if(advanceAssigmentDTO.getType().equals(AdvanceAssigment.Type.DIRECT)){
existItems = true;
if(advanceAssigmentDTO.getReportGlobalAdvance()){
return true;
}
}
}
}
if(!existItems) return true;

View file

@ -4,15 +4,19 @@ package org.navalplanner.web.orders;
import java.math.BigDecimal;
import java.util.Date;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.apache.commons.lang.Validate;
import org.hibernate.HibernateException;
import org.navalplanner.business.advance.daos.IAdvanceAssigmentDAO;
import org.navalplanner.business.advance.daos.IAdvanceMeasurementDAO;
import org.navalplanner.business.advance.daos.IAdvanceTypeDAO;
import org.navalplanner.business.advance.entities.AdvanceAssigment;
import org.navalplanner.business.advance.entities.AdvanceMeasurement;
import org.navalplanner.business.advance.entities.AdvanceMeasurementComparator;
import org.navalplanner.business.advance.entities.AdvanceType;
import org.navalplanner.business.orders.daos.IOrderElementDAO;
import org.navalplanner.business.orders.entities.OrderElement;
@ -40,12 +44,16 @@ public class ManageOrderElementAdvancesModel implements
private OrderElement orderElement;
private List<AdvanceMeasurementDTO> advanceMeasurementDTOs;
private AdvanceAssigmentDTO advanceAssigmentDTO;
private List<AdvanceAssigmentDTO> advanceAssigmentDTOs;
private List<AdvanceAssigment> listAdvanceAssigments;
private SortedSet<AdvanceMeasurement> listAdvanceMeasurements;
private List<AdvanceType> listAdvanceTypes;
private List<AdvanceMeasurement> listAdvanceMeasurement;
@Autowired
public ManageOrderElementAdvancesModel(
IAdvanceMeasurementDAO advanceMeasurementDAO,
@ -59,52 +67,92 @@ public class ManageOrderElementAdvancesModel implements
@Override
@Transactional(readOnly = true)
public List<AdvanceMeasurementDTO> getAdvanceMeasurements() {
if (this.orderElement == null) {
public List<AdvanceMeasurementDTO> getAdvanceMeasurementDTOs() {
if((this.advanceAssigmentDTO == null) ||
(this.orderElement == null)) {
return new ArrayList<AdvanceMeasurementDTO>();
}
return this.advanceMeasurementDTOs;
return this.advanceAssigmentDTO.getAdvanceMeasurementDTOs().toListView();
}
@Override
@Transactional(readOnly = true)
public List<AdvanceAssigmentDTO> getAdvanceAssigmentDTOs(){
if(this.orderElement == null){
return new ArrayList<AdvanceAssigmentDTO>();
}
return this.advanceAssigmentDTOs;
}
@Override
public void prepareEditAdvanceMeasurements(AdvanceAssigmentDTO advanceAssigmentDTO){
this.advanceAssigmentDTO = advanceAssigmentDTO;
}
@Override
@Transactional(readOnly = true)
public void init(OrderElement orderElement) {
this.orderElement = orderElement;
this.advanceAssigmentDTO = null;
if (orderElement != null){
loadAdvanceTypes();
reattchmentOrderElement();
createAdvanceMeasurementDTOs();
reattachmentOrderElement();
createAdvanceDTOs();
}
}
public void reattchmentOrderElement() {
public void reattachmentOrderElement() {
orderElementDAO.save(orderElement);
}
public void createAdvanceMeasurementDTOs() {
this.listAdvanceMeasurement = new ArrayList<AdvanceMeasurement>();
this.advanceMeasurementDTOs = new ArrayList<AdvanceMeasurementDTO>();
public void createAdvanceDTOs() {
this.advanceAssigmentDTOs = new ArrayList<AdvanceAssigmentDTO>();
this.listAdvanceAssigments = new ArrayList<AdvanceAssigment>();
this.listAdvanceMeasurements = new TreeSet<AdvanceMeasurement>(new AdvanceMeasurementComparator());
for (AdvanceAssigment advanceAssigment : this.orderElement
.getAdvanceAssigments()) {
AdvanceMeasurement advanceMeasurement = ((SortedSet<AdvanceMeasurement>) advanceAssigment
.getAdvanceMeasurements()).last();
AdvanceMeasurementDTO advanceDTO = new AdvanceMeasurementDTO(
advanceAssigment.getAdvanceType(), advanceAssigment,
.getAdvanceAssigments()) {
AdvanceAssigmentDTO advanceAssigmentDTO = new AdvanceAssigmentDTO(
advanceAssigment.getAdvanceType(), advanceAssigment,
advanceAssigment.getAdvanceMeasurements());
for (AdvanceMeasurement advanceMeasurement : advanceAssigment.
getAdvanceMeasurements()) {
AdvanceMeasurementDTO advanceMeasurementDTO = new AdvanceMeasurementDTO(
advanceMeasurement);
this.listAdvanceMeasurement.add(advanceMeasurement);
this.advanceMeasurementDTOs.add(advanceDTO);
advanceAssigmentDTO.getAdvanceMeasurementDTOs().add(advanceMeasurementDTO);
advanceMeasurementDTO.setAdvanceAssigmentDTO(advanceAssigmentDTO);
this.listAdvanceMeasurements.add(advanceMeasurement);
}
this.advanceAssigmentDTOs.add(advanceAssigmentDTO);
this.listAdvanceAssigments.add(advanceAssigment);
}
}
@Override
public void addNewLine() {
AdvanceMeasurementDTO newAdvance = new AdvanceMeasurementDTO();
this.advanceMeasurementDTOs.add(newAdvance);
public void addNewLineAdvaceAssigment() {
AdvanceAssigmentDTO newAdvance = new AdvanceAssigmentDTO();
this.advanceAssigmentDTOs.add(newAdvance);
}
@Override
public void removeLine(AdvanceMeasurementDTO advanceDTO) {
this.advanceMeasurementDTOs.remove(advanceDTO);
public void addNewLineAdvaceMeasurement() {
if(this.advanceAssigmentDTO != null){
AdvanceMeasurementDTO newAdvance = new AdvanceMeasurementDTO();
newAdvance.setAdvanceAssigmentDTO(advanceAssigmentDTO);
this.advanceAssigmentDTO.getAdvanceMeasurementDTOs().add(newAdvance);
}
}
@Override
public void removeLineAdvanceAssigment(AdvanceAssigmentDTO advanceDTO) {
this.advanceAssigmentDTOs.remove(advanceDTO);
this.advanceAssigmentDTO = null;
}
@Override
public void removeLineAdvanceMeasurement(AdvanceMeasurementDTO advanceDTO) {
this.advanceAssigmentDTO.getAdvanceMeasurementDTOs().remove(advanceDTO);
}
@Override
@ -120,114 +168,571 @@ public class ManageOrderElementAdvancesModel implements
this.listAdvanceTypes = this.advanceTypeDAO.findActivesAdvanceTypes(orderElement);
}
@Override
public boolean isReadOnlyAdvanceMeasurementDTOs(){
if(this.advanceAssigmentDTO == null) return true;
return this.advanceAssigmentDTO.getType().equals(AdvanceAssigment.Type.CALCULATED);
}
@Override
public void cleanAdvance(){
if(this.advanceAssigmentDTO != null){
this.advanceAssigmentDTO.setReportGlobalAdvance(false);
List<AdvanceMeasurementDTO> listAdvanceMeasurementDTOs =
this.advanceAssigmentDTO.getAdvanceMeasurementDTOs().toListView();
for(AdvanceMeasurementDTO advanceMeasurementDTO : listAdvanceMeasurementDTOs){
advanceMeasurementDTO.setValue(BigDecimal.ZERO);
advanceMeasurementDTO.setDate(null);
}
}
}
@Override
@Transactional(readOnly = true)
public void accept()throws InstanceNotFoundException,
DuplicateAdvanceAssigmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException{
orderElementDAO.checkVersion(orderElement);
reattachmentOrderElement();
validateBasicData();
}
private void validateBasicData() throws InstanceNotFoundException,
DuplicateAdvanceAssigmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException{
updateRemoveAdvanceMeasurement();
for(AdvanceMeasurementDTO advanceDTO : this.advanceMeasurementDTOs){
validateBasicData(advanceDTO);
DuplicateAdvanceAssigmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException{
updateRemoveAdvances();
for(AdvanceAssigmentDTO advanceAssigmentDTO : this.advanceAssigmentDTOs){
validateBasicData(advanceAssigmentDTO);
}
}
private void updateRemoveAdvanceMeasurement(){
for(AdvanceMeasurement advanceMeasurement : this.listAdvanceMeasurement){
if(!yetExistAdvanceMeasurement(advanceMeasurement)){
removeAdvanceMeasurement(advanceMeasurement);
private void updateRemoveAdvances(){
for(AdvanceAssigment advanceAssigment : this.listAdvanceAssigments){
AdvanceAssigmentDTO advanceAssigmentDTO = yetExistAdvanceAssigment(advanceAssigment);
if(advanceAssigmentDTO == null){
updateRemoveCalculatedAdvanceAssigment(orderElement,advanceAssigment);
removeAdvanceAssigment(advanceAssigment);
}else{
for(AdvanceMeasurement advanceMeasurement : this.listAdvanceMeasurements){
if(!yetExistAdvanceMeasurement(advanceAssigmentDTO,advanceMeasurement)){
updateRemoveCalculatedAdvanceMeasurement(orderElement,
advanceAssigment,advanceMeasurement);
removeAdvanceMeasurement(advanceMeasurement);
}
}
}
}
}
private void validateBasicData(AdvanceMeasurementDTO advanceDTO)
throws InstanceNotFoundException,DuplicateAdvanceAssigmentForOrderElementException,
private void validateBasicData(AdvanceAssigmentDTO advanceAssigmentDTO)
throws InstanceNotFoundException,DuplicateAdvanceAssigmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException{
if(advanceDTO.getIsNewDTO()){
AdvanceAssigment newAdvanceAssigment = createNewAdvance(advanceDTO);
if(advanceAssigmentDTO.getIsNewDTO()){
AdvanceAssigment newAdvanceAssigment = createNewAdvance(advanceAssigmentDTO);
addCalculatedAdvanceAssigmentToAncestors(this.orderElement,
advanceAssigmentDTO,newAdvanceAssigment);
addAdvanceAssigment(newAdvanceAssigment);
}else{
if((advanceDTO.getIsNewObject())||
(advanceDTO.getAdvanceMeasurement().getDate().compareTo(advanceDTO.getDate()) == 0)){
updateAdvanceMeasurement(advanceDTO);
AdvanceAssigment newAdvanceAssigment = advanceAssigmentDTO.getAdvanceAssigment();
addCalculatedAdvanceAssigmentToAncestors(this.orderElement,
advanceAssigmentDTO,newAdvanceAssigment);
updateAdvanceAssigment(advanceAssigmentDTO);
}
}
private void updateAdvanceAssigment(AdvanceAssigmentDTO advanceAssigmentDTO){
//Removed the advance and add a new advanceAssigment
AdvanceAssigment advanceAssigment = advanceAssigmentDTO.getAdvanceAssigment();
for(AdvanceMeasurementDTO advanceMeasurementDTO :
advanceAssigmentDTO.getAdvanceMeasurementDTOs().toListView()){
if(advanceMeasurementDTO.getIsNewDTO()){
AdvanceMeasurement newAdvanceMeasurement =
createAdvanceMeasurement(advanceMeasurementDTO);
advanceAssigment.getAdvanceMeasurements().add(newAdvanceMeasurement);
}else{
addAdvanceMeasurement(advanceDTO);
AdvanceMeasurement newAdvanceMeasurement =
createAdvanceMeasurement(advanceMeasurementDTO);
removeAdvanceMeasurement(advanceMeasurementDTO.getAdvanceMeasurement());
advanceAssigment.getAdvanceMeasurements().add(newAdvanceMeasurement);
//updateAdvanceMeasurement(advanceMeasurementDTO);
}
}
//Update changes in AdvanceAssigment
advanceAssigment.setReportGlobalAdvance(advanceAssigmentDTO.getReportGlobalAdvance());
advanceAssigment.setMaxValue(advanceAssigmentDTO.getMaxValue());
advanceAssigment.setAdvanceType(advanceAssigmentDTO.getAdvanceType());
}
private void updateAdvanceMeasurement(AdvanceMeasurementDTO advanceDTO){
AdvanceAssigment advanceAssigment = advanceDTO.getAdvanceAssigment();
advanceAssigment.setReportGlobalAdvance(advanceDTO.getReportGlobalAdvance());
AdvanceMeasurement advanceMeasurement = advanceDTO.getAdvanceMeasurement();
advanceMeasurement.setValue(advanceDTO.getValue());
advanceMeasurement.setMaxValue(advanceDTO.getMaxValue());
if(advanceDTO.getIsNewObject()){
advanceMeasurement.setDate(advanceDTO.getDate());
advanceAssigment.setAdvanceType(advanceDTO.getAdvanceType());
}
}
private void addAdvanceMeasurement(AdvanceMeasurementDTO advanceDTO){
AdvanceMeasurement newAdvanceMeasurement = AdvanceMeasurement.create(advanceDTO.getDate(),
advanceDTO.getValue(),advanceDTO.getMaxValue());
AdvanceAssigment advanceAssigment = advanceDTO.getAdvanceAssigment();
private AdvanceMeasurement createAdvanceMeasurement(AdvanceMeasurementDTO advanceMeasurementDTO){
AdvanceMeasurement newAdvanceMeasurement = AdvanceMeasurement.create(
advanceMeasurementDTO.getDate(),advanceMeasurementDTO.getValue());
AdvanceAssigment advanceAssigment = advanceMeasurementDTO.getAdvanceAssigmentDTO().
getAdvanceAssigment();
newAdvanceMeasurement.setAdvanceAssigment(advanceAssigment);
advanceAssigment.getAdvanceMeasurements().add(newAdvanceMeasurement);
return newAdvanceMeasurement;
}
private boolean yetExistAdvanceMeasurement(AdvanceMeasurement advanceMeasurement){
for(AdvanceMeasurementDTO advanceDTO : this.advanceMeasurementDTOs){
private void updateAdvanceMeasurement(AdvanceMeasurementDTO advanceMeasurementDTO){
AdvanceMeasurement advanceMeasurement = advanceMeasurementDTO.getAdvanceMeasurement();
advanceMeasurement.setValue(advanceMeasurementDTO.getValue());
advanceMeasurement.setDate(advanceMeasurementDTO.getDate());
}
private AdvanceAssigmentDTO yetExistAdvanceAssigment(AdvanceAssigment advanceAssigment){
for(AdvanceAssigmentDTO advanceDTO : this.advanceAssigmentDTOs){
if((!advanceDTO.getIsNewDTO()) &&
(advanceDTO.getAdvanceMeasurement().equals(advanceMeasurement)))
(advanceDTO.getAdvanceAssigment().getId() == advanceAssigment.getId()))
return advanceDTO;
}
return null;
}
private boolean yetExistAdvanceMeasurement(AdvanceAssigmentDTO advanceAssigmentDTO,
AdvanceMeasurement advanceMeasurement){
for(AdvanceMeasurementDTO advanceDTO :
advanceAssigmentDTO.getAdvanceMeasurementDTOs().toListView()){
if((!advanceDTO.getIsNewDTO()) &&
(advanceDTO.getAdvanceMeasurement().getId() == advanceMeasurement.getId()))
return true;
}
return false;
}
@Transactional(readOnly = true)
private AdvanceAssigment createNewAdvance(AdvanceMeasurementDTO advanceDTO)
throws InstanceNotFoundException{
//create AdvanceMeasurement
AdvanceMeasurement newAdvanceMeasurement = AdvanceMeasurement.create(advanceDTO.getDate(),
advanceDTO.getValue(),advanceDTO.getMaxValue());
private AdvanceAssigment createNewAdvance(AdvanceAssigmentDTO advanceAssigmentDTO)
throws InstanceNotFoundException{
//create AdvanceAssigment
AdvanceAssigment newAdvanceAssigment = AdvanceAssigment.create(
advanceAssigmentDTO.getReportGlobalAdvance(),
advanceAssigmentDTO.getMaxValue());
newAdvanceAssigment.setAdvanceType(advanceAssigmentDTO.getAdvanceType());
newAdvanceAssigment.setOrderElement(this.orderElement);
newAdvanceAssigment.setType(AdvanceAssigment.Type.DIRECT);
//create AdvanceAssigment
AdvanceAssigment newAdvanceAssigment = AdvanceAssigment.create(
advanceDTO.getReportGlobalAdvance());
newAdvanceAssigment.setAdvanceType(advanceDTO.getAdvanceType());
newAdvanceAssigment.setOrderElement(this.orderElement);
//create AdvanceMeasurement
for(AdvanceMeasurementDTO advanceMeasurementDTO
:advanceAssigmentDTO.getAdvanceMeasurementDTOs().toListView()){
AdvanceMeasurement newAdvanceMeasurement = AdvanceMeasurement.create(
advanceMeasurementDTO.getDate(),advanceMeasurementDTO.getValue());
//link AdvanceMeasurement to AdvanceAssigment
newAdvanceMeasurement.setAdvanceAssigment(newAdvanceAssigment);
newAdvanceAssigment.getAdvanceMeasurements().add(newAdvanceMeasurement);
return newAdvanceAssigment;
}
advanceAssigmentDTO.setAdvanceAssigment(newAdvanceAssigment);
return newAdvanceAssigment;
}
@Transactional(readOnly = true)
private void addAdvanceAssigment(AdvanceAssigment newAdvanceAssigment)
throws DuplicateAdvanceAssigmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException{
this.orderElementDAO.save(this.orderElement);
this.orderElement.addAvanceAssigment(newAdvanceAssigment);
}
private void removeAdvanceMeasurement(AdvanceMeasurement advanceMeasurement){
AdvanceAssigment advanceAssigment = advanceMeasurement.getAdvanceAssigment();
private void removeAdvanceAssigment(AdvanceAssigment advanceAssigment){
orderElement.getAdvanceAssigments().remove(advanceAssigment);
}
private void removeAdvanceMeasurement(AdvanceMeasurement advanceMeasurement){
AdvanceAssigment advanceAssigment = advanceMeasurement.getAdvanceAssigment();
advanceAssigment.getAdvanceMeasurements().remove(advanceMeasurement);
}
private void updateRemoveCalculatedAdvanceAssigment(OrderElement orderElement,
AdvanceAssigment advanceAssigment){
OrderElement parent = orderElement.getParent();
if(parent != null){
removeCalculatedAdvanceAssigment(parent,advanceAssigment);
updateRemoveCalculatedAdvanceAssigment(parent,advanceAssigment);
}
}
private void updateRemoveCalculatedAdvanceMeasurement(OrderElement orderElement,
AdvanceAssigment advanceAssigment,AdvanceMeasurement advanceMeasurement){
OrderElement parent = orderElement.getParent();
if(parent != null){
AdvanceAssigment indirectAdvanceAssigment =
findCalculatedAdvanceInParent(parent,advanceAssigment.getAdvanceType().getId());
if(indirectAdvanceAssigment != null){
removeCalculatedAdvanceMeasurement(advanceMeasurement,indirectAdvanceAssigment);
updateRemoveCalculatedAdvanceMeasurement(parent,advanceAssigment,advanceMeasurement);
}
}
}
public void addCalculatedAdvanceAssigmentToAncestors(OrderElement orderElement,
AdvanceAssigmentDTO newAdvanceAssigmentDTO,AdvanceAssigment newAdvanceAssigment)
throws DuplicateAdvanceAssigmentForOrderElementException,
DuplicateValueTrueReportGlobalAdvanceException{
if (orderElement.getParent() != null) {
OrderElement parent = orderElement.getParent();
if(checkChangeTheAdvanceType(newAdvanceAssigmentDTO)){
removeCalculatedAdvanceAssigment(parent,newAdvanceAssigment);
}
AdvanceAssigment indirectAdvanceAssigment =
findCalculatedAdvanceInParent(parent,newAdvanceAssigmentDTO.getAdvanceType().getId());
if(indirectAdvanceAssigment == null){
indirectAdvanceAssigment = initNewCalculatedAdvanceAssigment(parent,newAdvanceAssigmentDTO);
parent.addAvanceAssigment(indirectAdvanceAssigment);
}
addIncrementMaxValueToAdvanceAssigment(newAdvanceAssigmentDTO,indirectAdvanceAssigment);
addCalculatedAdvanceMeasurements(newAdvanceAssigmentDTO,indirectAdvanceAssigment);
addCalculatedAdvanceAssigmentToAncestors(parent,newAdvanceAssigmentDTO,newAdvanceAssigment);
}
}
private void addIncrementMaxValueToAdvanceAssigment(
AdvanceAssigmentDTO newAdvanceAssigmentDTO,
AdvanceAssigment indirectAdvanceAssigment){
BigDecimal incrementMaxValue = getIncrementMaxValue(newAdvanceAssigmentDTO);
BigDecimal currentMaxValue = indirectAdvanceAssigment.getMaxValue().add(incrementMaxValue);
indirectAdvanceAssigment.setMaxValue(currentMaxValue);
}
private void addCalculatedAdvanceMeasurements(
AdvanceAssigmentDTO advanceAssigmentDTO, AdvanceAssigment indirectAdvanceAssigment){
for(AdvanceMeasurementDTO advanceMeasurementDTO
:advanceAssigmentDTO.getAdvanceMeasurementDTOs().toListView()){
if((advanceMeasurementDTO.getIsNewDTO())
|| (checkChangeTheAdvanceType(advanceAssigmentDTO))){
addNewCalculatedAdvanceMeasurement(advanceMeasurementDTO,indirectAdvanceAssigment);
}else{
_removeCalculatedAdvanceMeasurement(advanceMeasurementDTO,indirectAdvanceAssigment);
addNewCalculatedAdvanceMeasurement(advanceMeasurementDTO,indirectAdvanceAssigment);
}
}
}
private void addNewCalculatedAdvanceMeasurement(
AdvanceMeasurementDTO advanceMeasurementDTO,
AdvanceAssigment indirectAdvanceAssigment){
AdvanceMeasurementDTO greatNeighbor = this.getGreatNeighborDTO(advanceMeasurementDTO);
AdvanceMeasurement lessNeighbor = this.getLessNeighbor(advanceMeasurementDTO);
incrementLaterCalculatedAdvances(lessNeighbor,greatNeighbor,
advanceMeasurementDTO,indirectAdvanceAssigment);
AdvanceMeasurement previousAdvanceMeasurement =
findPreviousIndirectAdvanceMeasurement(
advanceMeasurementDTO.getDate(),indirectAdvanceAssigment);
if(previousAdvanceMeasurement == null){
//create and add a new indirect AdvanceMeasurement
AdvanceMeasurement newIndirectAdvanceMeasurement = AdvanceMeasurement.create(
advanceMeasurementDTO.getDate(),advanceMeasurementDTO.getValue());
newIndirectAdvanceMeasurement.setAdvanceAssigment(indirectAdvanceAssigment);
newIndirectAdvanceMeasurement.incrementNumIndirectSons();
indirectAdvanceAssigment.getAdvanceMeasurements().add(newIndirectAdvanceMeasurement);
}else{
if(previousAdvanceMeasurement.getDate().compareTo(advanceMeasurementDTO.getDate()) < 0){
//create and add a new indirect AdvanceMeasurement
BigDecimal incrementValue = calculateIncrementValue(lessNeighbor,advanceMeasurementDTO);
BigDecimal currentValue = previousAdvanceMeasurement.getValue().add(incrementValue);
AdvanceMeasurement newIndirectAdvanceMeasurement = AdvanceMeasurement.create(
advanceMeasurementDTO.getDate(),currentValue);
newIndirectAdvanceMeasurement.setAdvanceAssigment(indirectAdvanceAssigment);
newIndirectAdvanceMeasurement.incrementNumIndirectSons();
indirectAdvanceAssigment.getAdvanceMeasurements().add(newIndirectAdvanceMeasurement);
}
if(previousAdvanceMeasurement.getDate().compareTo(advanceMeasurementDTO.getDate()) == 0){
previousAdvanceMeasurement.incrementNumIndirectSons();
}
}
}
private void removeCalculatedAdvanceMeasurement(AdvanceMeasurement advanceMeasurement,
AdvanceAssigment indirectAdvanceAssigment){
//find the indirect advanceMeasurement
AdvanceMeasurement previousAdvanceMeasurement =
findPreviousIndirectAdvanceMeasurement(
advanceMeasurement.getDate(),indirectAdvanceAssigment);
//check if the indirect advanceMeasurement is the adding of several sons.
previousAdvanceMeasurement.decrementNumIndirectSons();
if(previousAdvanceMeasurement.getNumIndirectSons() == 0){
indirectAdvanceAssigment.getAdvanceMeasurements().remove(previousAdvanceMeasurement);
}
//update post indirect advanceMeasurement (substract the increment)
AdvanceMeasurement[] neighbors = getOldNeighborsAdvanceMeasurement(advanceMeasurement);
decrementLaterCalculatedAdvances(neighbors,advanceMeasurement,indirectAdvanceAssigment);
}
private void _removeCalculatedAdvanceMeasurement(AdvanceMeasurementDTO advanceMeasurementDTO,
AdvanceAssigment indirectAdvanceAssigment){
//find the indirect advanceMeasurement
AdvanceMeasurement advanceMeasurement = advanceMeasurementDTO.getAdvanceMeasurement();
AdvanceMeasurement previousAdvanceMeasurement =
findPreviousIndirectAdvanceMeasurement(
advanceMeasurement.getDate(),indirectAdvanceAssigment);
//check if the indirect advanceMeasurement is the adding of several sons.
previousAdvanceMeasurement.decrementNumIndirectSons();
if(previousAdvanceMeasurement.getNumIndirectSons() == 0){
indirectAdvanceAssigment.getAdvanceMeasurements().remove(previousAdvanceMeasurement);
}
//update post indirect advanceMeasurement (substract the increment)
AdvanceMeasurement lessNeighbor = getLessNeighbor(advanceMeasurementDTO);
AdvanceMeasurementDTO greatNeighbor = getGreatNeighborDTO(advanceMeasurementDTO);
_decrementLaterCalculatedAdvances(lessNeighbor,greatNeighbor,advanceMeasurement,indirectAdvanceAssigment);
}
private void removeCalculatedAdvanceAssigment(OrderElement parent,
AdvanceAssigment newAdvanceAssigment){
AdvanceAssigment indirectAdvanceAssigment =
findCalculatedAdvanceInParent(parent,newAdvanceAssigment.getAdvanceType().getId());
if(indirectAdvanceAssigment != null){
if(decrementMaxValue(newAdvanceAssigment,indirectAdvanceAssigment)){
parent.getAdvanceAssigments().remove(indirectAdvanceAssigment);
}else{
for(AdvanceMeasurement advanceMeasurement :
newAdvanceAssigment.getAdvanceMeasurements()){
removeCalculatedAdvanceMeasurement(advanceMeasurement,indirectAdvanceAssigment);
}
}
}
}
private boolean decrementMaxValue(AdvanceAssigment newAdvanceAssigment,
AdvanceAssigment indirectAdvanceAssigment){
BigDecimal maxValue = newAdvanceAssigment.getMaxValue();
BigDecimal currentMaxValue = indirectAdvanceAssigment.getMaxValue().subtract(maxValue);
indirectAdvanceAssigment.setMaxValue(currentMaxValue);
if(currentMaxValue.compareTo(new BigDecimal(0)) == 0){
return true;
}
return false;
}
private boolean isAddingOfSeveralSons(AdvanceMeasurement previousAdvanceMeasurement){
previousAdvanceMeasurement.decrementNumIndirectSons();
if(previousAdvanceMeasurement.getNumIndirectSons() == 0)
return false;
else return true;
}
private AdvanceMeasurementDTO getGreatNeighborDTO(
AdvanceMeasurementDTO advanceMeasurementDTO){
AdvanceMeasurementDTO neighbor = null;
AdvanceAssigmentDTO advanceAssigmentDTO =
advanceMeasurementDTO.getAdvanceAssigmentDTO();
List<AdvanceMeasurementDTO> advanceMeasurementDTOs =
advanceAssigmentDTO.getAdvanceMeasurementDTOs().toListView();
for(int i=0; i < advanceMeasurementDTOs.size() ; i++){
AdvanceMeasurementDTO advance =
(AdvanceMeasurementDTO) advanceMeasurementDTOs.get(i);
if(advance.equals(advanceMeasurementDTO)){
if(i > 0){
neighbor =((AdvanceMeasurementDTO)
advanceMeasurementDTOs.get(i-1));
}
return neighbor;
}
}
return neighbor;
}
private AdvanceMeasurement getLessNeighbor(
AdvanceMeasurementDTO advanceMeasurementDTO){
AdvanceMeasurement neighbor = null;
AdvanceAssigmentDTO advanceAssigmentDTO = advanceMeasurementDTO.getAdvanceAssigmentDTO();
AdvanceAssigment advanceAssigment = advanceAssigmentDTO.getAdvanceAssigment();
if(advanceAssigment == null) return neighbor;
Object[] advanceMeasurements = advanceAssigment.getAdvanceMeasurements().toArray();
for(int i=0; i < advanceMeasurements.length;i++){
AdvanceMeasurement advance = (AdvanceMeasurement) advanceMeasurements[i];
if(advance.getDate().compareTo(advanceMeasurementDTO.getDate()) < 0){
neighbor=advance;
return neighbor;
}
}
return neighbor;
}
private AdvanceMeasurement[] getOldNeighborsAdvanceMeasurement(
AdvanceMeasurement advanceMeasurement){
AdvanceMeasurement neighbors[] = {null,null};
AdvanceAssigment advanceAssigment = advanceMeasurement.getAdvanceAssigment();
Object[] advanceMeasurements = advanceAssigment.getAdvanceMeasurements().toArray();
for(int i=0; i < advanceMeasurements.length;i++){
AdvanceMeasurement advance = (AdvanceMeasurement) advanceMeasurements[i];
if(advance.equals(advanceMeasurement)){
if(i > 0){
neighbors[1]=((AdvanceMeasurement) advanceMeasurements[i-1]);
}
if(i < advanceMeasurements.length-1){
neighbors[0]=((AdvanceMeasurement) advanceMeasurements[i+1]);
}
return neighbors;
}
}
return neighbors;
}
private void incrementLaterCalculatedAdvances(AdvanceMeasurement lessNeighbor,
AdvanceMeasurementDTO greatNeighbor,
AdvanceMeasurementDTO advanceMeasurementDTO,
AdvanceAssigment indirectAdvanceAssigment){
BigDecimal incrementValue = calculateIncrementValue(lessNeighbor,advanceMeasurementDTO);
Date dateIni = advanceMeasurementDTO.getDate();
Date dateFin = advanceMeasurementDTO.getDate();
for(AdvanceMeasurement indirectAdvanceMeasurement :
indirectAdvanceAssigment.getAdvanceMeasurements()){
if((indirectAdvanceMeasurement.getDate().compareTo(dateIni) >= 0)
&& (isIntoIntervalDateFin(greatNeighbor,dateFin,indirectAdvanceMeasurement))){
indirectAdvanceMeasurement.setValue(indirectAdvanceMeasurement.
getValue().add(incrementValue));
}
}
}
private void _decrementLaterCalculatedAdvances(AdvanceMeasurement lessNeighbor,
AdvanceMeasurementDTO greatNeighbor,
AdvanceMeasurement advanceMeasurement,
AdvanceAssigment indirectAdvanceAssigment){
BigDecimal decrementValue = calculateDecrementValue(lessNeighbor,advanceMeasurement);
Date dateFin = advanceMeasurement.getDate();
Date dateIni = advanceMeasurement.getDate();
for(AdvanceMeasurement indirectAdvanceMeasurement :
indirectAdvanceAssigment.getAdvanceMeasurements()){
if((indirectAdvanceMeasurement.getDate().compareTo(dateIni) >= 0)
&& (isIntoIntervalDateFin(greatNeighbor,dateFin,indirectAdvanceMeasurement))){
indirectAdvanceMeasurement.setValue(
indirectAdvanceMeasurement.getValue().subtract(decrementValue));
}
}
}
private void decrementLaterCalculatedAdvances(AdvanceMeasurement[] neighbors
,AdvanceMeasurement advanceMeasurement,
AdvanceAssigment indirectAdvanceAssigment){
BigDecimal decrementValue = calculateDecrementValue(neighbors[0],advanceMeasurement);
Date dateFin = advanceMeasurement.getDate();
Date dateIni = advanceMeasurement.getDate();
for(AdvanceMeasurement indirectAdvanceMeasurement :
indirectAdvanceAssigment.getAdvanceMeasurements()){
if((indirectAdvanceMeasurement.getDate().compareTo(dateIni) >= 0)
&& (isIntoIntervalDateFin(neighbors[1],dateFin,indirectAdvanceMeasurement))){
indirectAdvanceMeasurement.setValue(
indirectAdvanceMeasurement.getValue().subtract(decrementValue));
}
}
}
private boolean isIntoIntervalDateFin(AdvanceMeasurementDTO neighbor,
Date dateFin,AdvanceMeasurement advanceMeasurement){
if(neighbor != null){
dateFin = neighbor.getDate();
if(advanceMeasurement.getDate().compareTo(dateFin) < 0) return true;
else return false;
}
return true;
}
private boolean isIntoIntervalDateFin(AdvanceMeasurement neighbor,
Date dateFin,AdvanceMeasurement advanceMeasurement){
if(neighbor != null){
dateFin = neighbor.getDate();
if(advanceMeasurement.getDate().compareTo(dateFin) < 0) return true;
else return false;
}
return true;
}
private BigDecimal calculateIncrementValue(AdvanceMeasurement neighbor
,AdvanceMeasurementDTO advanceMeasurementDTO){
//Calculate the increment value
BigDecimal incrementValue = advanceMeasurementDTO.getValue();
if(neighbor != null){
BigDecimal previousValue = neighbor.getValue();
incrementValue = incrementValue.subtract(previousValue);
}
return incrementValue;
}
private BigDecimal calculateDecrementValue(AdvanceMeasurement neighbor
,AdvanceMeasurement advanceMeasurement){
//Calculate the decrement value
BigDecimal decrementValue = advanceMeasurement.getValue();
if(neighbor != null){
BigDecimal previousValue = neighbor.getValue();
decrementValue = decrementValue.subtract(previousValue);
}
return decrementValue;
}
private BigDecimal getIncrementMaxValue(AdvanceAssigmentDTO advanceAssigmentDTO){
BigDecimal incrementMaxValue= new BigDecimal(0);
if((advanceAssigmentDTO.getIsNewDTO())
|| (checkChangeTheAdvanceType(advanceAssigmentDTO))){
incrementMaxValue = advanceAssigmentDTO.getMaxValue();
}else{
AdvanceAssigment advanceAssigment = advanceAssigmentDTO.getAdvanceAssigment();
incrementMaxValue = advanceAssigmentDTO.getMaxValue().subtract(advanceAssigment.getMaxValue());
}
return incrementMaxValue;
}
private AdvanceAssigment initNewCalculatedAdvanceAssigment(
OrderElement orderElement,AdvanceAssigmentDTO advanceAssigmentDTO){
//create AdvanceAssigment
AdvanceAssigment newAdvanceAssigment = AdvanceAssigment.create(
advanceAssigmentDTO.getReportGlobalAdvance(),new BigDecimal(0));
newAdvanceAssigment.setAdvanceType(advanceAssigmentDTO.getAdvanceType());
newAdvanceAssigment.setOrderElement(orderElement);
newAdvanceAssigment.setType(AdvanceAssigment.Type.CALCULATED);
return newAdvanceAssigment;
}
private AdvanceMeasurement findPreviousIndirectAdvanceMeasurement(
Date date,AdvanceAssigment indirectAdvanceAssigment){
Object[] arrayAdvanceMeasurements = indirectAdvanceAssigment.getAdvanceMeasurements().toArray();
for(int i=0; i < arrayAdvanceMeasurements.length; i++){
AdvanceMeasurement advanceMeasurement = (AdvanceMeasurement)arrayAdvanceMeasurements[i];
if(advanceMeasurement.getDate().compareTo(date) <= 0){
return advanceMeasurement;
}
}
return null;
}
private AdvanceAssigment findCalculatedAdvanceInParent(
OrderElement orderElement, Long id){
for(AdvanceAssigment oldAdvanceAssigment : orderElement.getAdvanceAssigments()){
if(oldAdvanceAssigment.getAdvanceType().getId().equals(id))
return oldAdvanceAssigment;
}
return null;
}
private boolean checkChangeTheAdvanceType(AdvanceAssigmentDTO newAdvanceAssigmentDTO){
AdvanceAssigment advanceAssigment = newAdvanceAssigmentDTO.getAdvanceAssigment();
AdvanceType advanceType = advanceAssigment.getAdvanceType();
AdvanceType advanceTypeDTO = newAdvanceAssigmentDTO.getAdvanceType();
if((newAdvanceAssigmentDTO.getIsNewObject())
&& (!advanceType.equals(advanceTypeDTO))) return true;
return false;
}
@Override
public boolean isPrecisionValid(AdvanceMeasurementDTO advanceDTO, BigDecimal value){
if(advanceDTO.getAdvanceType() != null){
BigDecimal precision = advanceDTO.getAdvanceType().getUnitPrecision();
public boolean isPrecisionValid(BigDecimal value){
if((this.advanceAssigmentDTO != null)
&& (this.advanceAssigmentDTO.getAdvanceType() != null)){
BigDecimal precision = this.advanceAssigmentDTO.getAdvanceType().getUnitPrecision();
BigDecimal result[] = value.divideAndRemainder(precision);
if(result[1].compareTo(BigDecimal.ZERO) == 0) return true;
return false;
@ -236,28 +741,63 @@ public class ManageOrderElementAdvancesModel implements
}
@Override
public boolean greatThanMaxValue(AdvanceMeasurementDTO advanceDTO, BigDecimal value){
if(advanceDTO.getMaxValue() == null)
public boolean greatThanMaxValue(BigDecimal value){
if((this.advanceAssigmentDTO == null)
||(this.advanceAssigmentDTO.getMaxValue() == null))
return false;
if(value.compareTo(advanceDTO.getMaxValue())>0)
if(value.compareTo(this.advanceAssigmentDTO.getMaxValue())>0)
return true;
return false;
}
@Override
public boolean isGreatValidDate(AdvanceMeasurementDTO advanceDTO, Date value){
if((advanceDTO.getIsNewDTO())||(advanceDTO.getIsNewObject()))
public boolean isGreatValidDate(Date value){
if(this.advanceAssigmentDTO == null) return true;
if((this.advanceAssigmentDTO.getIsNewDTO())||(this.advanceAssigmentDTO.getIsNewObject()))
return true;
AdvanceAssigment advanceAssigment = advanceDTO.getAdvanceAssigment();
if(((SortedSet<AdvanceMeasurement>) advanceAssigment
.getAdvanceMeasurements()).size() > 0){
AdvanceMeasurement advanceMeasurement = ((SortedSet<AdvanceMeasurement>) advanceAssigment
.getAdvanceMeasurements()).last();
if(value.compareTo(advanceMeasurement.getDate()) < 0)
return false;
AdvanceAssigment advanceAssigment = this.advanceAssigmentDTO.getAdvanceAssigment();
Iterator<AdvanceMeasurement> iterator = advanceAssigment.getAdvanceMeasurements().iterator();
while(iterator.hasNext()){
AdvanceMeasurement advanceMeasurement = iterator.next();
if(advanceMeasurement.getVersion() != null){
if(value.compareTo(advanceMeasurement.getDate()) < 0)return false;
else return true;
}
}
return true;
}
@Override
public BigDecimal getUnitPrecision(){
if(this.advanceAssigmentDTO == null){
return new BigDecimal(0);
}
return this.advanceAssigmentDTO.getAdvanceType().getUnitPrecision();
}
@Override
public AdvanceMeasurementDTO getFirstAdvanceMeasurement(AdvanceAssigmentDTO advanceAssigmentDTO){
if((advanceAssigmentDTO != null) &&
(advanceAssigmentDTO.getAdvanceMeasurementDTOs().toListView().size()>0)){
final AdvanceMeasurementDTO advanceMeasurementDTO =
(AdvanceMeasurementDTO) advanceAssigmentDTO.getAdvanceMeasurementDTOs().toListView().get(0);
return advanceMeasurementDTO;
}
return null;
}
public AdvanceMeasurement getFirstAdvanceMeasurement(AdvanceAssigment advanceAssigment){
if((advanceAssigment != null) &&
(advanceAssigmentDTO.getAdvanceMeasurements().size()>0)){
SortedSet<AdvanceMeasurement> listAM = (SortedSet<AdvanceMeasurement>) advanceAssigment.getAdvanceMeasurements();
final AdvanceMeasurement advanceMeasurement = (AdvanceMeasurement) listAM.first();
return advanceMeasurement;
}
return null;
}
public void modifyListAdvanceMeasurement(AdvanceMeasurementDTO advanceMeasurementDTO){
this.advanceAssigmentDTO.getAdvanceMeasurementDTOs().modified(advanceMeasurementDTO);
}
}

View file

@ -1,6 +1,6 @@
<?component name="listOrderElementHours" inline="true" macroURI="_listOrderElementHours.zul"?>
<?component name="listOrderElementAdvances" inline="true" macroURI="_listOrderElementAdvances.zul"?>
<window visible="false" id="${arg.top_id}" title="${i18n:_('Edit order element')}" width="600px" left="100px" top="100px">
<window visible="false" id="${arg.top_id}" title="${i18n:_('Edit order element')}" width="800px" left="100px" top="100px">
<tabbox>
<tabs>
<tab label="${i18n:_('Details')}"></tab>

View file

@ -1,29 +1,74 @@
<vbox id="listOrderElementAdvances">
<vbox>
<label value="${i18n:_('Direct Advances')}"/>
<separator bar="true" spacing="2px" orient="horizontal"/>
<vbox align="left">
<hbox>
<button label="${i18n:_('Add')}" onClick="manageOrderElementAdvancesController.goToCreateLine();">
<button label="${i18n:_('Add new advance assigment')}"
onClick="manageOrderElementAdvancesController.goToCreateLineAdvanceAssigment();">
</button>
<button label="${i18n:_('Remove')}" onClick="manageOrderElementAdvancesController.goToRemoveLine();">
<button label="${i18n:_('Remove')}"
onClick="manageOrderElementAdvancesController.goToRemoveLineAdvanceAssigment();">
</button>
</hbox>
</vbox>
<vbox>
<listbox id="editAdvances"
model="@{manageOrderElementAdvancesController.advanceMeasurementDTOs}"
<listbox id="editAdvances"
model="@{manageOrderElementAdvancesController.advanceAssigmentDTOs}"
itemRenderer="@{manageOrderElementAdvancesController.advancesRenderer}" mold="paging"
onSelect="manageOrderElementAdvancesController.prepareEditAdvanceMeasurements(self.selectedItem.value);"
pageSize="10">
<listhead sizable="true">
<listhead sizable="true">
<listheader label="${i18n:_('Advance Type')}" />
<listheader label="${i18n:_('Max value')}"/>
<listheader label="${i18n:_('Current value')}"/>
<listheader label="${i18n:_('Percentage')}"/>
<listheader label="${i18n:_('Date')}"/>
<listheader label="${i18n:_('Spread')}"/>
<listheader label="${i18n:_('Calculated')}"/>
</listhead>
</listbox>
</vbox>
<separator bar="true" spacing="12px" orient="horizontal"/>
<separator bar="false" spacing="20px" orient="vertical"/>
<label value="${i18n:_('Advances Measurement')}"/>
<separator bar="true" spacing="3px" orient="horizontal"/>
<vbox>
<hbox>
<button label="${i18n:_('Add new advance measurement')}"
onClick="manageOrderElementAdvancesController.goToCreateLineAdvanceMeasurement();"
disabled = "@{manageOrderElementAdvancesController.isReadOnlyAdvanceMeasurementDTOs}">
</button>
<button label="${i18n:_('Remove')}"
onClick="manageOrderElementAdvancesController.goToRemoveLineAdvanceMeasurement();"
disabled = "@{manageOrderElementAdvancesController.isReadOnlyAdvanceMeasurementDTOs}">
</button>
</hbox>
<listbox id="editAdvancesMeasurement"
model="@{manageOrderElementAdvancesController.advanceMeasurementDTOs}"
mold="paging" pageSize="10">
<listhead sizable="true">
<listheader label="${i18n:_('Current value')}"/>
<listheader label="${i18n:_('Percentage')}"/>
<listheader label="${i18n:_('Date')}"/>
</listhead>
<listitem self="@{each='advanceMeasurementDTO'}" value="@{advanceMeasurementDTO}">
<listcell>
<decimalbox value="@{advanceMeasurementDTO.value, save-when='self.onChange'}"
disabled = "@{manageOrderElementAdvancesController.isReadOnlyAdvanceMeasurementDTOs}"
scale="2"
onChange = "manageOrderElementAdvancesController.updatesValue(self);"
constraint = "@{manageOrderElementAdvancesController.checkValidValue}"/>
</listcell>
<listcell label="@{advanceMeasurementDTO.percentage}" />
<listcell>
<datebox value="@{advanceMeasurementDTO.date, save-when='self.onChange'}"
disabled = "@{manageOrderElementAdvancesController.isReadOnlyAdvanceMeasurementDTOs}"
constraint = "@{manageOrderElementAdvancesController.checkValidDate}"
onChange = "manageOrderElementAdvancesController.setCurrentDate(self.parent.parent);"/>
</listcell>
</listitem>
</listbox>
</vbox>
<separator bar="false" spacing="40px" orient="vertical"/>
<hbox>
<button id="aceptAdvance" onClick="manageOrderElementAdvancesController.accept();" label="${i18n:_('Accept')}"/>
<button id="cancelAdvance" onClick="manageOrderElementAdvancesController.cancel();" label="${i18n:_('Cancel')}"/>