///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition 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 General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.humanresources; import java.io.Serializable; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import org.projectforge.common.NumberHelper; import org.projectforge.core.IdObject; import org.projectforge.fibu.KundeDO; import org.projectforge.fibu.ProjektDO; import org.projectforge.timesheet.TimesheetDO; import org.projectforge.user.PFUserDO; public class HRViewUserData implements Comparable<HRViewUserData>, Serializable, IdObject<Serializable> { private static final long serialVersionUID = 5576425603050236009L; PFUserDO user; List<HRViewUserEntryData> entries; long plannedSecondsSum = 0; long actualSecondsSum = 0; long plannedSecondsRestSum = 0; long actualSecondsRestSum = 0; boolean deleted; private HRPlanningDO hrPlanning; HRViewUserData(final PFUserDO user) { this.user = user; this.entries = new ArrayList<HRViewUserEntryData>(); } void addTimesheet(final TimesheetDO timesheet) { addTimesheet(timesheet, (ProjektDO) null); } void addTimesheet(final TimesheetDO timesheet, final ProjektDO projekt) { ensureAndGetEntry(projekt).addTimesheet(timesheet); actualSecondsSum += (timesheet.getDuration() / 1000); if (projekt == null) { actualSecondsRestSum += (timesheet.getDuration() / 1000); } } void addTimesheet(final TimesheetDO timesheet, final KundeDO kunde) { ensureAndGetEntry(kunde).addTimesheet(timesheet); actualSecondsSum += (timesheet.getDuration() / 1000); if (kunde == null) { actualSecondsRestSum += (timesheet.getDuration() / 1000); } } void addPlanningEntry(final HRPlanningEntryDO entry) { addPlanningEntry(entry, (ProjektDO) null); } void addPlanningEntry(final HRPlanningEntryDO entry, final ProjektDO projekt) { ensureAndGetEntry(projekt).addPlanningEntry(entry); if (hrPlanning == null) { hrPlanning = entry.getPlanning(); } plannedSecondsSum += entry.getTotalHours().multiply(NumberHelper.THREE_THOUSAND_SIX_HUNDRED).longValue(); if (projekt == null) { plannedSecondsRestSum += entry.getTotalHours().multiply(NumberHelper.THREE_THOUSAND_SIX_HUNDRED).longValue(); } if (entry.getPlanning() != null) { deleted = entry.getPlanning().isDeleted(); } } void addPlanningEntry(final HRPlanningEntryDO entry, final KundeDO kunde) { ensureAndGetEntry(kunde).addPlanningEntry(entry); if (hrPlanning == null) { hrPlanning = entry.getPlanning(); } plannedSecondsSum += entry.getTotalHours().multiply(NumberHelper.THREE_THOUSAND_SIX_HUNDRED).longValue(); if (kunde == null) { plannedSecondsRestSum += entry.getTotalHours().multiply(NumberHelper.THREE_THOUSAND_SIX_HUNDRED).longValue(); } } public Integer getPlanningId() { if (hrPlanning == null) { return null; } return hrPlanning.getId(); } public boolean isDeleted() { return deleted; } public BigDecimal getPlannedDaysSum() { return new BigDecimal(plannedSecondsSum).divide(new BigDecimal(28800), 2, RoundingMode.HALF_UP); } public BigDecimal getActualDaysSum() { return new BigDecimal(actualSecondsSum).divide(new BigDecimal(28800), 2, RoundingMode.HALF_UP); } /** * @return The rest of days (not included in the child entries). */ public BigDecimal getPlannedDaysRestSum() { return new BigDecimal(plannedSecondsRestSum).divide(new BigDecimal(28800), 2, RoundingMode.HALF_UP); } /** * @return The rest of days (not included in the child entries). */ public BigDecimal getActualDaysRestSum() { return new BigDecimal(actualSecondsRestSum).divide(new BigDecimal(28800), 2, RoundingMode.HALF_UP); } public PFUserDO getUser() { return user; } public Integer getUserId() { if (user == null) { return null; } return user.getId(); } public HRViewUserEntryData getEntry(final ProjektDO projekt) { for (final HRViewUserEntryData entry : entries) { if (projekt == null) { if (entry.projekt == null && entry.kunde == null) { return entry; } } else if (entry.projekt != null && entry.projekt.getId().equals(projekt.getId()) == true) { return entry; } } return null; } public HRViewUserEntryData getEntry(final KundeDO kunde) { for (final HRViewUserEntryData entry : entries) { if (kunde == null) { if (entry.kunde == null) { return entry; } } else if (entry.kunde != null && entry.kunde.getId().equals(kunde.getId()) == true) { return entry; } } return null; } private HRViewUserEntryData ensureAndGetEntry(final ProjektDO projekt) { HRViewUserEntryData entry = getEntry(projekt); if (entry == null) { entry = new HRViewUserEntryData(projekt); this.entries.add(entry); } return entry; } private HRViewUserEntryData ensureAndGetEntry(final KundeDO kunde) { HRViewUserEntryData entry = getEntry(kunde); if (entry == null) { entry = new HRViewUserEntryData(kunde); this.entries.add(entry); } return entry; } public int compareTo(final HRViewUserData o) { return this.user.getFullname().compareTo(o.user.getFullname()); } /** * @see org.projectforge.core.IdObject#getId() */ @Override public Serializable getId() { return hrPlanning != null ? hrPlanning.getId() : null; } }