/* * This file is part of LibrePlan * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia * Copyright (C) 2010-2011 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.libreplan.web.planner.consolidations; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import org.libreplan.business.advance.entities.AdvanceAssignment; import org.libreplan.business.advance.entities.AdvanceMeasurement; import org.libreplan.business.advance.entities.DirectAdvanceAssignment; import org.libreplan.business.planner.entities.consolidations.ConsolidatedValue; /** * Controller for {@link Advance} consolidation view. * @author Susana Montes Pedreira <smontes@wirelessgailicia.com> */ public class AdvanceConsolidationDTO { public static Date lastConsolidatedDate; public static Date lastConsolidatedAndSavedDate; private static boolean allReadOnly = false; private AdvanceMeasurement advanceMeasurement; private ConsolidatedValue consolidatedValue; private Date date; private BigDecimal units; private BigDecimal percentage; private boolean consolidated; public static List<AdvanceConsolidationDTO> sortByDate( List<AdvanceConsolidationDTO> consolidationDTOs) { Collections.sort(consolidationDTOs, new Comparator<AdvanceConsolidationDTO>() { @Override public int compare(AdvanceConsolidationDTO o1, AdvanceConsolidationDTO o2) { if (o1.getDate() == null) { return 1; } if (o2.getDate() == null) { return -1; } return o1.getDate().compareTo(o2.getDate()); } }); return consolidationDTOs; } public AdvanceConsolidationDTO(AdvanceMeasurement advanceMeasurement) { this(advanceMeasurement, null); } public AdvanceConsolidationDTO(AdvanceMeasurement advanceMeasurement, ConsolidatedValue consolidatedValue) { this.setAdvanceMeasurement(advanceMeasurement); this.setConsolidatedValue(consolidatedValue); initConsolidated(); initDate(); initPercentage(); initUnits(); } private void initConsolidated() { this.setConsolidated((getConsolidatedValue() != null)); } private void initDate() { if (consolidatedValue != null) { this.date = consolidatedValue.getDate().toDateTimeAtStartOfDay() .toDate(); } else if (advanceMeasurement != null) { this.date = advanceMeasurement.getDate().toDateTimeAtStartOfDay() .toDate(); } } private void initPercentage() { if (consolidatedValue != null) { this.percentage = this.consolidatedValue.getValue(); } else if (advanceMeasurement != null) { this.percentage = calculatePercentageAdvanceMeasurement(advanceMeasurement); } } private void initUnits(){ if (advanceMeasurement != null) { this.units = advanceMeasurement.getValue(); } else { this.units = BigDecimal.ZERO; } } public void setAdvanceMeasurement(AdvanceMeasurement advanceMeasurement) { this.advanceMeasurement = advanceMeasurement; } public AdvanceMeasurement getAdvanceMeasurement() { return advanceMeasurement; } public void setConsolidatedValue(ConsolidatedValue consolidatedValue) { this.consolidatedValue = consolidatedValue; } public ConsolidatedValue getConsolidatedValue() { return consolidatedValue; } public void setConsolidated(boolean consolidated) { this.consolidated = consolidated; } public boolean isConsolidated() { return consolidated; } public static void setLastConsolidatedAdvance(Date lastConsolidatedAdvance) { AdvanceConsolidationDTO.lastConsolidatedDate = lastConsolidatedAdvance; } public static Date getLastConsolidatedAdvance() { return lastConsolidatedDate; } public Boolean canNotBeConsolidated() { if (isAllReadOnly()) { return true; } if ((isConsolidated()) && (consolidatedValue != null) && (!consolidatedValue.isNewObject())) { if ((lastConsolidatedDate == null) || (lastConsolidatedDate.equals(date))) { return false; } return true; } if (lastConsolidatedDate != null) { if (date != null) { return ((lastConsolidatedDate.compareTo(date)) > 0); } } return false; } public static Boolean canBeConsolidateAndShow(Date date) { if (lastConsolidatedAndSavedDate != null) { if (date != null) { return ((lastConsolidatedAndSavedDate.compareTo(date)) < 0); } } return true; } public boolean isSavedConsolidatedValue() { return ((consolidatedValue != null) && (!consolidatedValue .isNewObject())); } public Date getDate() { return date; } public BigDecimal getPercentage() { return percentage; } public static void setAllReadOnly(boolean allReadOnly) { AdvanceConsolidationDTO.allReadOnly = allReadOnly; } public static boolean isAllReadOnly() { return allReadOnly; } private BigDecimal calculatePercentageAdvanceMeasurement( AdvanceMeasurement advanceMeasurement) { AdvanceAssignment assignment = advanceMeasurement .getAdvanceAssignment(); if (assignment == null) { return BigDecimal.ZERO; } BigDecimal maxValue = ((DirectAdvanceAssignment) assignment) .getMaxValue(); if (maxValue.compareTo(BigDecimal.ZERO) <= 0) { return BigDecimal.ZERO; } BigDecimal value = advanceMeasurement.getValue(); if (value == null) { return BigDecimal.ZERO; } BigDecimal division = value.divide(maxValue, 2, RoundingMode.DOWN); return (division.multiply(new BigDecimal(100))).setScale(0, RoundingMode.DOWN); } public String getLabelPercentage() { if (getPercentage() != null) { return getPercentage().toString() + " %"; } else { return (BigDecimal.ZERO).toString() + " %"; } } public BigDecimal getUnits() { return units; } public String getLabelUnits() { if (getUnits() != null) { return getUnits().toString(); } else { return (BigDecimal.ZERO).toString(); } } }