org.fenixedu.parking.dto.ParkingCardSearchBean.java Source code

Java tutorial

Introduction

Here is the source code for org.fenixedu.parking.dto.ParkingCardSearchBean.java

Source

/**
 * Copyright  2014 Instituto Superior Tcnico
 *
 * This file is part of Fenix Parking.
 *
 * Fenix Parking is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Fenix Parking 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with Fenix Parking.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.fenixedu.parking.dto;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.beanutils.BeanComparator;
import org.fenixedu.bennu.core.domain.Bennu;
import org.fenixedu.parking.domain.ParkingGroup;
import org.fenixedu.parking.domain.ParkingParty;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Interval;
import org.joda.time.YearMonthDay;

public class ParkingCardSearchBean implements Serializable {

    private ParkingGroup parkingGroup;

    private ParkingGroup newParkingGroup;

    private List<ParkingParty> searchedParkingParties = new ArrayList<ParkingParty>();

    private List<ParkingParty> selectedParkingParties = new ArrayList<ParkingParty>();;

    private YearMonthDay actualEndDate;

    private DateTime renewalEndDate;

    private int groupMembersCount;

    private ParkingCardSearchPeriod parkingCardSearchPeriod;

    private ParkingCardUserState parkingCardUserState;

    private ParkingCardUserState parkingCardState;

    private String emailText;

    public enum ParkingCardSearchPeriod {
        ENDS_BEFORE_ONE_MONTH, ENDS_BEFORE_TWO_MONTHS, ENDED_UNTIL_ONE_MONTH_AGO, ENDED_UNTIL_SIX_MONTHS_AGO, ENDED_UNTIL_ONE_YEAR_AGO;

        public static int getDays(ParkingCardSearchPeriod parkingCardSearchPeriod) {
            switch (parkingCardSearchPeriod) {
            case ENDS_BEFORE_ONE_MONTH:
                return 30;
            case ENDS_BEFORE_TWO_MONTHS:
                return 60;
            case ENDED_UNTIL_ONE_MONTH_AGO:
                return 30;
            case ENDED_UNTIL_SIX_MONTHS_AGO:
                return 180;
            case ENDED_UNTIL_ONE_YEAR_AGO:
                return 365;
            default:
                return 0;
            }
        }
    }

    public enum ParkingCardUserState {
        ALL, ACTIVE, INACTIVE;
    }

    public ParkingCardSearchBean() {
        setParkingCardUserState(ParkingCardUserState.ALL);
        setParkingCardState(ParkingCardUserState.ALL);
    }

    public void doSearch() {
        getSearchedParkingParties().clear();
        for (ParkingParty parkingParty : Bennu.getInstance().getParkingPartiesSet()) {
            if (!parkingParty.getVehiclesSet().isEmpty() && satisfiesSearch(parkingParty)) {
                getSearchedParkingParties().add(parkingParty);
            }
        }
    }

    private boolean satisfiesSearch(ParkingParty parkingParty) {
        return satisfiesGroup(parkingParty) && satisfiesEndDate(parkingParty) && satisfiesUserState(parkingParty)
                && satisfiesPeriodCriteria(parkingParty) && satisfiesCardState(parkingParty);
    }

    private boolean satisfiesCardState(ParkingParty parkingParty) {
        switch (getParkingCardState()) {
        case ALL:
            return Boolean.TRUE;
        case ACTIVE:
            if (parkingParty.getCardEndDate() == null) {
                return Boolean.TRUE;
            } else {
                return new Interval(parkingParty.getCardStartDate(), parkingParty.getCardEndDate())
                        .contains(new DateTime());
            }
        default:
            if (parkingParty.getCardEndDate() == null) {
                return Boolean.FALSE;
            } else {
                return !new Interval(parkingParty.getCardStartDate(), parkingParty.getCardEndDate())
                        .contains(new DateTime());
            }
        }
    }

    private boolean satisfiesPeriodCriteria(ParkingParty parkingParty) {
        if (getParkingCardSearchPeriod() == null) {
            return Boolean.TRUE;
        } else {
            if (parkingParty.getCardEndDate() == null) {
                return Boolean.FALSE;
            } else {
                YearMonthDay today = new YearMonthDay();
                if (!today.isAfter(parkingParty.getCardEndDate().toYearMonthDay()) && (getParkingCardSearchPeriod()
                        .equals(ParkingCardSearchPeriod.ENDS_BEFORE_ONE_MONTH)
                        || getParkingCardSearchPeriod().equals(ParkingCardSearchPeriod.ENDS_BEFORE_TWO_MONTHS))) {
                    int daysBetween = Days.daysBetween(today, parkingParty.getCardEndDate().toYearMonthDay())
                            .getDays();
                    return daysBetween <= ParkingCardSearchPeriod.getDays(getParkingCardSearchPeriod());
                } else if (!today.isBefore(parkingParty.getCardEndDate().toYearMonthDay())
                        && (getParkingCardSearchPeriod().equals(ParkingCardSearchPeriod.ENDED_UNTIL_ONE_MONTH_AGO)
                                || getParkingCardSearchPeriod()
                                        .equals(ParkingCardSearchPeriod.ENDED_UNTIL_SIX_MONTHS_AGO)
                                || getParkingCardSearchPeriod()
                                        .equals(ParkingCardSearchPeriod.ENDED_UNTIL_ONE_YEAR_AGO))) {
                    int daysBetween = Days.daysBetween(today, parkingParty.getCardEndDate().toYearMonthDay())
                            .getDays();
                    return daysBetween <= ParkingCardSearchPeriod.getDays(getParkingCardSearchPeriod());
                }
            }
        }
        return false;
    }

    private boolean satisfiesEndDate(ParkingParty parkingParty) {
        return getActualEndDate() == null || (parkingParty.getCardEndDate() != null
                && getActualEndDate().isEqual(parkingParty.getCardEndDate().toYearMonthDay()));
    }

    private boolean satisfiesGroup(ParkingParty parkingParty) {
        if (getParkingGroup() == null) {
            return Boolean.TRUE;
        }
        return getParkingGroup() == parkingParty.getParkingGroup();
    }

    private boolean satisfiesUserState(ParkingParty parkingParty) {
        switch (getParkingCardUserState()) {
        case ALL:
            return Boolean.TRUE;
        case ACTIVE:
            return parkingParty.isActiveInHisGroup();
        default:
            return !parkingParty.isActiveInHisGroup();
        }
    }

    public ParkingGroup getParkingGroup() {
        return parkingGroup;
    }

    public void setParkingGroup(ParkingGroup parkingGroup) {
        this.parkingGroup = parkingGroup;
    }

    public ParkingGroup getNewParkingGroup() {
        return newParkingGroup;
    }

    public void setNewParkingGroup(ParkingGroup newParkingGroup) {
        this.newParkingGroup = newParkingGroup;
    }

    public YearMonthDay getActualEndDate() {
        return actualEndDate;
    }

    public void setActualEndDate(YearMonthDay actualEndDate) {
        this.actualEndDate = actualEndDate;
    }

    public DateTime getRenewalEndDate() {
        return renewalEndDate;
    }

    public void setRenewalEndDate(DateTime renewalEndDate) {
        this.renewalEndDate = renewalEndDate;
    }

    public List<ParkingParty> getSearchedParkingParties() {
        return searchedParkingParties;
    }

    public void setSearchedParkingParties(List<ParkingParty> searchedParkingParties) {
        this.searchedParkingParties = searchedParkingParties;
    }

    public int getGroupMembersCount() {
        return groupMembersCount;
    }

    public void setGroupMembersCount(int groupMembersCount) {
        this.groupMembersCount = groupMembersCount;
    }

    public void orderSearchedParkingParties() {
        Collections.sort(getSearchedParkingParties(), new BeanComparator("partyClassification"));
        Collections.sort(getSearchedParkingParties(), new BeanComparator("cardEndDateToCompare"));
    }

    public void orderSelectedParkingParties() {
        Collections.sort(getSearchedParkingParties(), new BeanComparator("partyClassification"));
        Collections.sort(getSearchedParkingParties(), new BeanComparator("cardEndDateToCompare"));
    }

    public ParkingCardSearchPeriod getParkingCardSearchPeriod() {
        return parkingCardSearchPeriod;
    }

    public void setParkingCardSearchPeriod(ParkingCardSearchPeriod parkingCardSearchPeriod) {
        this.parkingCardSearchPeriod = parkingCardSearchPeriod;
    }

    public ParkingCardUserState getParkingCardUserState() {
        return parkingCardUserState;
    }

    public void setParkingCardUserState(ParkingCardUserState parkingCardUserState) {
        this.parkingCardUserState = parkingCardUserState;
    }

    public List<ParkingParty> getSelectedParkingParties() {
        return selectedParkingParties;
    }

    public void setSelectedParkingParties(List<ParkingParty> selectedParkingParties) {
        this.selectedParkingParties = selectedParkingParties;
    }

    public void removeSelectedParkingParty(String parkingPartyIDToRemove) {
        for (ParkingParty parkingParty : getSelectedParkingParties()) {
            if (parkingParty.getExternalId().equals(parkingPartyIDToRemove)) {
                getSelectedParkingParties().remove(parkingParty);
                break;
            }
        }
    }

    public ParkingCardUserState getParkingCardState() {
        return parkingCardState;
    }

    public void setParkingCardState(ParkingCardUserState parkingCardState) {
        this.parkingCardState = parkingCardState;
    }

    public String getEmailText() {
        return emailText;
    }

    public void setEmailText(String emailText) {
        this.emailText = emailText;
    }
}