net.sourceforge.fenixedu.domain.personnelSection.contracts.PersonProfessionalData.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.fenixedu.domain.personnelSection.contracts.PersonProfessionalData.java

Source

/**
 * Copyright  2002 Instituto Superior Tcnico
 *
 * This file is part of FenixEdu Core.
 *
 * FenixEdu Core 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.
 *
 * FenixEdu Core 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 FenixEdu Core.  If not, see <http://www.gnu.org/licenses/>.
 */
package net.sourceforge.fenixedu.domain.personnelSection.contracts;

import java.util.HashSet;
import java.util.Set;

import net.sourceforge.fenixedu.domain.Person;
import net.sourceforge.fenixedu.domain.exceptions.DomainException;
import net.sourceforge.fenixedu.domain.person.RoleType;
import net.sourceforge.fenixedu.domain.teacher.CategoryType;

import org.fenixedu.bennu.core.domain.Bennu;
import org.joda.time.Interval;
import org.joda.time.LocalDate;

public class PersonProfessionalData extends PersonProfessionalData_Base {

    public PersonProfessionalData(Person person) {
        super();
        setPerson(person);
    }

    protected Bennu getRootDomainObject() {
        return getPerson().getRootDomainObject();
    }

    public GiafProfessionalData getGiafProfessionalDataByCategoryType(CategoryType categoryType) {
        for (GiafProfessionalData giafProfessionalData : getGiafProfessionalDatasSet()) {
            if (giafProfessionalData.getProfessionalCategory() != null
                    && giafProfessionalData.getProfessionalCategory().getCategoryType().equals(categoryType)) {
                return giafProfessionalData;
            }
        }
        return null;
    }

    public GiafProfessionalData getGiafProfessionalData() {
        if (getGiafProfessionalDatasSet().size() == 1) {
            return getGiafProfessionalDatasSet().iterator().next();
        }
        throw new DomainException("more.than.one.GiafProfessionalData");
    }

    public GiafProfessionalData getGiafProfessionalDataByGiafPersonIdentification(String giafPersonIdentification) {
        for (GiafProfessionalData giafProfessionalData : getGiafProfessionalDatasSet()) {
            if (giafProfessionalData.getGiafPersonIdentification().equalsIgnoreCase(giafPersonIdentification)) {
                return giafProfessionalData;
            }
        }
        return null;
    }

    public ProfessionalCategory getProfessionalCategoryByCategoryType(CategoryType categoryType, LocalDate date) {
        PersonContractSituation lastPersonContractSituation = null;
        GiafProfessionalData giafProfessionalData = getGiafProfessionalData();
        if (giafProfessionalData != null) {
            for (final PersonContractSituation situation : giafProfessionalData
                    .getValidPersonContractSituations()) {
                if (situation.isActive(date) && situation.getProfessionalCategory() != null
                        && situation.getProfessionalCategory().getCategoryType().equals(categoryType)
                        && (lastPersonContractSituation == null
                                || situation.isAfter(lastPersonContractSituation))) {
                    lastPersonContractSituation = situation;
                }
            }
        }
        return lastPersonContractSituation == null ? null : lastPersonContractSituation.getProfessionalCategory();
    }

    public ProfessionalCategory getLastProfessionalCategoryByCategoryType(CategoryType categoryType) {
        return getLastProfessionalCategoryByCategoryType(categoryType, null, null);
    }

    public ProfessionalCategory getLastProfessionalCategoryByCategoryType(CategoryType categoryType,
            LocalDate beginDate, LocalDate endDate) {
        Interval dateInterval = null;
        if (beginDate != null && endDate != null) {
            dateInterval = new Interval(beginDate.toDateTimeAtStartOfDay(),
                    endDate.plusDays(1).toDateTimeAtStartOfDay());
        }
        PersonContractSituation lastPersonContractSituation = null;
        GiafProfessionalData giafProfessionalData = getGiafProfessionalData();
        if (giafProfessionalData != null) {
            for (final PersonContractSituation situation : giafProfessionalData
                    .getValidPersonContractSituations()) {
                if ((dateInterval == null || situation.overlaps(dateInterval))
                        && (categoryType == null || (situation.getProfessionalCategory() != null
                                && situation.getProfessionalCategory().getCategoryType().equals(categoryType)))
                        && (lastPersonContractSituation == null
                                || situation.isAfter(lastPersonContractSituation))) {
                    lastPersonContractSituation = situation;
                }
            }
        }
        return lastPersonContractSituation == null ? null : lastPersonContractSituation.getProfessionalCategory();
    }

    public Set<PersonContractSituation> getPersonContractSituationsByCategoryType(CategoryType categoryType) {
        GiafProfessionalData giafProfessionalData = getGiafProfessionalData();
        Set<PersonContractSituation> result = new HashSet<PersonContractSituation>();
        for (final PersonContractSituation situation : giafProfessionalData.getValidPersonContractSituations()) {
            if (situation.getProfessionalCategory() != null
                    && situation.getProfessionalCategory().getCategoryType().equals(categoryType)) {
                result.add(situation);
            }
        }
        return result;
    }

    public Set<PersonContractSituation> getValidPersonProfessionalExemptionByCategoryType(CategoryType categoryType,
            Interval intervalWithNextPeriods) {
        Set<PersonContractSituation> personProfessionalExemptions = new HashSet<PersonContractSituation>();
        Set<PersonContractSituation> personContractSituations = getPersonContractSituationsByCategoryType(
                categoryType);
        for (PersonContractSituation personContractSituation : personContractSituations) {
            if (personContractSituation.betweenDates(intervalWithNextPeriods)) {
                PersonProfessionalExemption personProfessionalExemption = personContractSituation
                        .getPersonProfessionalExemption();
                if (personContractSituation.getContractSituation().getServiceExemption()
                        && ((!personContractSituation.getContractSituation().getMustHaveAssociatedExemption())
                                || (personProfessionalExemption != null
                                        && personProfessionalExemption.isLongDuration()))) {
                    personProfessionalExemptions.add(personContractSituation);
                }
            }
        }
        return personProfessionalExemptions;
    }

    public PersonContractSituation getLastPersonContractSituationByCategoryType(CategoryType categoryType) {
        GiafProfessionalData giafProfessionalData = getGiafProfessionalData();
        PersonContractSituation lastPersonContractSituation = null;
        if (giafProfessionalData != null) {
            for (final PersonContractSituation situation : giafProfessionalData
                    .getValidPersonContractSituations()) {
                if (situation.getProfessionalCategory() != null
                        && situation.getProfessionalCategory().getCategoryType().equals(categoryType)
                        && (lastPersonContractSituation == null
                                || situation.isAfter(lastPersonContractSituation))) {
                    lastPersonContractSituation = situation;
                }
            }
        }
        return lastPersonContractSituation;
    }

    public PersonContractSituation getCurrentPersonContractSituationByCategoryType(CategoryType categoryType) {
        LocalDate today = new LocalDate();
        PersonContractSituation currentPersonContractSituation = null;
        GiafProfessionalData giafProfessionalDataByCategoryType = getGiafProfessionalData();
        if (giafProfessionalDataByCategoryType != null) {
            for (final PersonContractSituation situation : giafProfessionalDataByCategoryType
                    .getValidPersonContractSituations()) {
                if (situation.isActive(today)
                        && (situation.getProfessionalCategory() != null
                                && situation.getProfessionalCategory().getCategoryType().equals(categoryType))
                        && (currentPersonContractSituation == null
                                || situation.isAfter(currentPersonContractSituation))) {
                    currentPersonContractSituation = situation;
                }
            }
        }
        return currentPersonContractSituation;
    }

    public PersonContractSituation getCurrentOrLastPersonContractSituationByCategoryType(
            CategoryType categoryType) {
        return getCurrentOrLastPersonContractSituationByCategoryType(categoryType, null, null);
    }

    public PersonContractSituation getCurrentOrLastPersonContractSituationByCategoryType(CategoryType categoryType,
            LocalDate beginDate, LocalDate endDate) {
        LocalDate today = new LocalDate();
        Interval dateInterval = null;
        if (beginDate != null && endDate != null) {
            dateInterval = new Interval(beginDate.toDateTimeAtStartOfDay(),
                    endDate.plusDays(1).toDateTimeAtStartOfDay());
        }
        PersonContractSituation lastPersonContractSituation = null;
        PersonContractSituation currentPersonContractSituation = null;
        GiafProfessionalData giafProfessionalDataByCategoryType = getGiafProfessionalData();
        if (giafProfessionalDataByCategoryType != null) {
            for (final PersonContractSituation situation : giafProfessionalDataByCategoryType
                    .getValidPersonContractSituations()) {
                if ((categoryType == null || (situation.getProfessionalCategory() != null
                        && situation.getProfessionalCategory().getCategoryType().equals(categoryType)))) {
                    if ((dateInterval == null || situation.overlaps(dateInterval))) {
                        if (situation.isActive(today) && (currentPersonContractSituation == null
                                || situation.isAfter(currentPersonContractSituation))) {
                            currentPersonContractSituation = situation;
                        }
                        lastPersonContractSituation = situation;
                    }
                }
            }
        }
        return currentPersonContractSituation != null ? currentPersonContractSituation
                : lastPersonContractSituation;
    }

    public PersonContractSituation getDominantPersonContractSituationByCategoryType(CategoryType categoryType,
            Interval dateInterval) {
        PersonContractSituation dominantContractSituation = null;
        int dominantContractSituationDays = 0;
        GiafProfessionalData giafProfessionalData = getGiafProfessionalData();
        if (giafProfessionalData != null) {
            for (final PersonContractSituation situation : giafProfessionalData
                    .getValidPersonContractSituations()) {
                if (situation.overlaps(dateInterval) && (situation.getProfessionalCategory() != null
                        && situation.getProfessionalCategory().getCategoryType().equals(categoryType))) {
                    int thisSituationDays = situation.getDaysInInterval(dateInterval);
                    if (dominantContractSituationDays < thisSituationDays
                            || (dominantContractSituationDays == thisSituationDays
                                    && (dominantContractSituation == null
                                            || situation.isAfter(dominantContractSituation)))) {
                        dominantContractSituation = situation;
                        dominantContractSituationDays = thisSituationDays;
                    }
                }
            }
        }
        return dominantContractSituation;
    }

    public ProfessionalRegime getLastProfessionalRegime(GiafProfessionalData giafProfessionalData,
            LocalDate beginDate, LocalDate endDate) {
        PersonProfessionalRegime lastPersonProfessionalRegime = null;
        if (giafProfessionalData != null) {
            for (final PersonProfessionalRegime regime : giafProfessionalData.getValidPersonProfessionalRegimes()) {
                if (regime.betweenDates(beginDate, endDate)
                        && (lastPersonProfessionalRegime == null || regime.isAfter(lastPersonProfessionalRegime))) {
                    lastPersonProfessionalRegime = regime;
                }
            }
            if (lastPersonProfessionalRegime == null) {
                if (giafProfessionalData.getProfessionalRegimeDate() != null
                        && !giafProfessionalData.getProfessionalRegimeDate().isAfter(endDate)) {
                    return giafProfessionalData.getProfessionalRegime();
                }
            }
        }
        return lastPersonProfessionalRegime == null ? null : lastPersonProfessionalRegime.getProfessionalRegime();
    }

    public ProfessionalRegime getDominantProfessionalRegime(GiafProfessionalData giafProfessionalData,
            Interval interval, CategoryType categoryType) {
        PersonProfessionalRegime dominantPersonProfessionalRegime = null;
        int dominantPersonProfessionalRegimeDays = 0;
        if (giafProfessionalData != null) {
            for (final PersonProfessionalRegime regime : giafProfessionalData.getValidPersonProfessionalRegimes()) {
                if (regime.overlaps(interval) && (regime.getProfessionalRegime().getCategoryType() == null
                        || regime.getProfessionalRegime().getCategoryType().equals(categoryType))) {
                    int thisRegimeDays = regime.getDaysInInterval(interval);
                    if (dominantPersonProfessionalRegimeDays < thisRegimeDays
                            || (dominantPersonProfessionalRegimeDays == thisRegimeDays
                                    && (dominantPersonProfessionalRegime == null
                                            || regime.isAfter(dominantPersonProfessionalRegime)))) {
                        dominantPersonProfessionalRegime = regime;
                        dominantPersonProfessionalRegimeDays = thisRegimeDays;
                    }
                }
            }
            if (dominantPersonProfessionalRegime == null) {
                if (giafProfessionalData.getProfessionalRegimeDate() != null && !giafProfessionalData
                        .getProfessionalRegimeDate().isAfter(interval.getEnd().toLocalDate())) {
                    return giafProfessionalData.getProfessionalRegime();
                }
            }
        }
        return dominantPersonProfessionalRegime == null ? null
                : dominantPersonProfessionalRegime.getProfessionalRegime();
    }

    public ProfessionalRelation getLastProfessionalRelation(GiafProfessionalData giafProfessionalData,
            LocalDate beginDate, LocalDate endDate) {
        PersonProfessionalRelation lastPersonProfessionalRelation = null;
        if (giafProfessionalData != null) {
            for (final PersonProfessionalRelation relation : giafProfessionalData
                    .getValidPersonProfessionalRelations()) {
                if (relation.betweenDates(beginDate, endDate) && (lastPersonProfessionalRelation == null
                        || relation.isAfter(lastPersonProfessionalRelation))) {
                    lastPersonProfessionalRelation = relation;
                }
            }
            if (lastPersonProfessionalRelation == null) {
                if (giafProfessionalData.getProfessionalRegimeDate() != null
                        && !giafProfessionalData.getProfessionalRegimeDate().isAfter(endDate)) {
                    return giafProfessionalData.getProfessionalRelation();
                }
            }
        }
        return lastPersonProfessionalRelation == null ? null
                : lastPersonProfessionalRelation.getProfessionalRelation();
    }

    public String getEmployer(final RoleType roleType) {
        final CategoryType categoryType = getCategoryTypeFor(roleType);
        final GiafProfessionalData giafProfessionalData = categoryType == null ? null
                : getGiafProfessionalDataByCategoryType(categoryType);
        return giafProfessionalData == null ? null : giafProfessionalData.getEmployer();
    }

    private static CategoryType getCategoryTypeFor(final RoleType roleType) {
        for (final CategoryType categoryType : CategoryType.values()) {
            if (categoryType.name().equals(roleType.name())) {
                return categoryType;
            }
        }
        return null;
    }

}