package org.sigmah.client.ui.view.pivot; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program 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, 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 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/gpl-3.0.html>. * #L% */ import java.util.ArrayList; import java.util.Date; import java.util.List; import org.sigmah.shared.dto.pivot.model.AdminDimension; import org.sigmah.shared.dto.pivot.model.DateDimension; import org.sigmah.shared.dto.pivot.model.DateUnit; import org.sigmah.shared.dto.pivot.model.Dimension; import org.sigmah.shared.dto.pivot.model.PivotTableElement; import org.sigmah.shared.dto.AdminLevelDTO; import org.sigmah.shared.dto.ProjectDTO; import org.sigmah.shared.dto.country.CountryDTO; import org.sigmah.shared.dto.pivot.content.Filter; import org.sigmah.shared.dto.referential.DimensionType; import org.sigmah.shared.util.DateRange; import org.sigmah.shared.util.Dates; import org.sigmah.shared.util.Month; public class LayoutComposer { private final int databaseId; private final DateRange projectDateRange; private final Dates dates; private final List<Dimension> adminDimensions; public LayoutComposer(Dates dates, ProjectDTO project) { this.databaseId = project.getId(); this.dates = dates; this.projectDateRange = computeProjectDateRange(project.getStartDate(), project.getEndDate()); this.adminDimensions = getAdminDimensions(project.getCountry()); } /** * Using the project start date as a guideline, generate a date * range of at least six months. * * @param startDate * Start date of the project. * @param endDate * End date of the project. * @return */ private DateRange computeProjectDateRange(final Date startDate, final Date endDate) { final Date notNullStartDate = startDate != null ? startDate : new Date(); final Month startMonth = dates.monthFromDate(notNullStartDate); Month endMonth = endDate == null ? startMonth : dates.monthFromDate(endDate); if (Month.monthsBetween(startMonth, endMonth) < 6) { endMonth = startMonth.plus(6); } return dates.dateRange(startMonth, endMonth); } public PivotTableElement fixIndicator(int indicatorId) { PivotTableElement pivot = new PivotTableElement(); pivot.setShowEmptyCells(true); pivot.addRowDimensions(adminDimensions); pivot.addRowDimension(new Dimension(DimensionType.Site)); //pivot.addColDimension(new DateDimension(DateUnit.YEAR)); pivot.addColDimension(new DateDimension(DateUnit.MONTH)); Filter filter = new Filter(); filter.addRestriction(DimensionType.Database, databaseId); filter.addRestriction(DimensionType.Indicator, indicatorId ); filter.setDateRange(projectDateRange); pivot.setFilter(filter); return pivot; } public PivotTableElement fixSite(int siteId) { PivotTableElement pivot = new PivotTableElement(); pivot.setShowEmptyCells(true); pivot.addRowDimension(new Dimension(DimensionType.Activity)); pivot.addRowDimension(new Dimension(DimensionType.Indicator)); pivot.addColDimension(new DateDimension(DateUnit.YEAR)); pivot.addColDimension(new DateDimension(DateUnit.MONTH)); Filter filter = new Filter(); filter.addRestriction(DimensionType.Database, databaseId); filter.addRestriction(DimensionType.Site, siteId); filter.setDateRange(projectDateRange); pivot.setFilter(filter); return pivot; } public PivotTableElement fixDateRange(DateRange dateRange, boolean indicatorsInRows) { PivotTableElement pivot = new PivotTableElement(); pivot.setShowEmptyCells(true); if(indicatorsInRows) { pivot.addColDimensions(adminDimensions); pivot.addColDimension(new Dimension(DimensionType.Site)); pivot.addRowDimension(new Dimension(DimensionType.Activity)); pivot.addRowDimension(new Dimension(DimensionType.Indicator)); } else { pivot.addColDimension(new Dimension(DimensionType.Activity)); pivot.addColDimension(new Dimension(DimensionType.Indicator)); pivot.addRowDimensions(adminDimensions); pivot.addRowDimension(new Dimension(DimensionType.Site)); } Filter filter = new Filter(); filter.addRestriction(DimensionType.Database, databaseId); filter.setDateRange(dateRange); pivot.setFilter(filter); return pivot; } private List<Dimension> getAdminDimensions(CountryDTO country) { List<Dimension> dims = new ArrayList<Dimension>(); Integer parentId = null; AdminLevelDTO level; while ( (level=getFirstChild(country, parentId)) != null) { dims.add(new AdminDimension(level.getId())); parentId = level.getId(); } return dims; } private AdminLevelDTO getFirstChild(CountryDTO country, Integer parentId) { for(AdminLevelDTO level : country.getAdminLevels()) { if( (level.getParentLevelId() == null && parentId == null) || (level.getParentLevelId() != null && level.getParentLevelId().equals(parentId))) { return level; } } return null; } }