/** * Copyright © 2002 Instituto Superior Técnico * * This file is part of FenixEdu Academic. * * FenixEdu Academic 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 Academic 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 Academic. If not, see <http://www.gnu.org/licenses/>. */ package org.fenixedu.academic.dto.accounting.sibsPaymentFileProcessReport; import org.fenixedu.academic.domain.GratuitySituation; import org.fenixedu.academic.domain.accounting.Event; import org.fenixedu.academic.domain.accounting.PaymentCode; import org.fenixedu.academic.domain.accounting.ResidenceEvent; import org.fenixedu.academic.domain.accounting.events.AdministrativeOfficeFeeAndInsuranceEvent; import org.fenixedu.academic.domain.accounting.events.SpecialSeasonEnrolmentEvent; import org.fenixedu.academic.domain.accounting.events.candidacy.DegreeCandidacyForGraduatedPersonEvent; import org.fenixedu.academic.domain.accounting.events.candidacy.DegreeChangeIndividualCandidacyEvent; import org.fenixedu.academic.domain.accounting.events.candidacy.DegreeTransferIndividualCandidacyEvent; import org.fenixedu.academic.domain.accounting.events.candidacy.Over23IndividualCandidacyEvent; import org.fenixedu.academic.domain.accounting.events.candidacy.SecondCycleIndividualCandidacyEvent; import org.fenixedu.academic.domain.accounting.events.gratuity.DfaGratuityEvent; import org.fenixedu.academic.domain.accounting.events.gratuity.GratuityEventWithPaymentPlan; import org.fenixedu.academic.domain.accounting.events.gratuity.StandaloneEnrolmentGratuityEvent; import org.fenixedu.academic.domain.accounting.events.insurance.InsuranceEvent; import org.fenixedu.academic.domain.accounting.paymentCodes.AccountingEventPaymentCode; import org.fenixedu.academic.domain.accounting.paymentCodes.GratuitySituationPaymentCode; import org.fenixedu.academic.domain.accounting.paymentCodes.MasterDegreeInsurancePaymentCode; import org.fenixedu.academic.domain.phd.candidacy.PhdProgramCandidacyEvent; import org.fenixedu.academic.util.Money; import org.fenixedu.academic.util.sibs.incomming.SibsIncommingPaymentFile; import org.fenixedu.academic.util.sibs.incomming.SibsIncommingPaymentFileDetailLine; import org.joda.time.YearMonthDay; public class SibsPaymentFileProcessReportDTO { private String filename; private YearMonthDay whenProcessedBySibs; private Integer fileVersion; private Money degreeGratuityTotalAmount; private Money bolonhaDegreeGratuityTotalAmount; private Money integratedMasterDegreeGratuityTotalAmount; private Money integratedBolonhaMasterDegreeGratuityTotalAmount; private Money administrativeOfficeTaxTotalAmount; private Money graduationInsuranceTotalAmount; private Money specializationGratuityTotalAmount; private Money masterDegreeGratuityTotalAmount; private Money bolonhaMasterDegreeGratuityTotalAmount; private Money dfaGratuityTotalAmount; private Money afterGraduationInsuranceTotalAmount; private Money phdGratuityTotalAmout; private Money transactionsTotalAmount; private Money residenceAmount; private Money degreeChangeIndividualCandidacyAmount; private Money degreeTransferIndividualCandidacyAmount; private Money secondCycleIndividualCandidacyAmount; private Money degreeCandidacyForGraduatedPersonAmount; private Money totalCost; private Money standaloneEnrolmentGratuityEventAmount; private Money over23IndividualCandidacyEventAmount; private Money institutionAffiliationEventAmount; private Money phdProgramCandidacyEventAmount; private Money rectorateAmount; private Money specialSeasonEnrolmentEventAmount; public SibsPaymentFileProcessReportDTO() { super(); this.degreeGratuityTotalAmount = Money.ZERO; this.bolonhaDegreeGratuityTotalAmount = Money.ZERO; this.integratedMasterDegreeGratuityTotalAmount = Money.ZERO; this.integratedBolonhaMasterDegreeGratuityTotalAmount = Money.ZERO; this.administrativeOfficeTaxTotalAmount = Money.ZERO; this.graduationInsuranceTotalAmount = Money.ZERO; this.specializationGratuityTotalAmount = Money.ZERO; this.masterDegreeGratuityTotalAmount = Money.ZERO; this.bolonhaMasterDegreeGratuityTotalAmount = Money.ZERO; this.dfaGratuityTotalAmount = Money.ZERO; this.afterGraduationInsuranceTotalAmount = Money.ZERO; this.phdGratuityTotalAmout = Money.ZERO; this.transactionsTotalAmount = Money.ZERO; this.totalCost = Money.ZERO; this.residenceAmount = Money.ZERO; this.degreeChangeIndividualCandidacyAmount = Money.ZERO; this.degreeTransferIndividualCandidacyAmount = Money.ZERO; this.secondCycleIndividualCandidacyAmount = Money.ZERO; this.degreeCandidacyForGraduatedPersonAmount = Money.ZERO; this.standaloneEnrolmentGratuityEventAmount = Money.ZERO; this.over23IndividualCandidacyEventAmount = Money.ZERO; this.institutionAffiliationEventAmount = Money.ZERO; this.phdProgramCandidacyEventAmount = Money.ZERO; this.rectorateAmount = Money.ZERO; this.specialSeasonEnrolmentEventAmount = Money.ZERO; } public SibsPaymentFileProcessReportDTO(final SibsIncommingPaymentFile sibsIncomingPaymentFile) { this(); setWhenProcessedBySibs(sibsIncomingPaymentFile.getHeader().getWhenProcessedBySibs()); setFilename(sibsIncomingPaymentFile.getFilename()); setTransactionsTotalAmount(sibsIncomingPaymentFile.getFooter().getTransactionsTotalAmount()); setTotalCost(sibsIncomingPaymentFile.getFooter().getTotalCost()); setFileVersion(sibsIncomingPaymentFile.getHeader().getVersion()); } private void addAdministrativeOfficeTaxAmount(final Money amount) { this.administrativeOfficeTaxTotalAmount = this.administrativeOfficeTaxTotalAmount.add(amount); } public Money getAdministrativeOfficeTaxTotalAmount() { return administrativeOfficeTaxTotalAmount; } private void addBolonhaDegreeGratuityAmount(final Money amount) { this.bolonhaDegreeGratuityTotalAmount = this.bolonhaDegreeGratuityTotalAmount.add(amount); } public Money getBolonhaDegreeGratuityTotalAmount() { return bolonhaDegreeGratuityTotalAmount; } private void addDegreeGratuityAmount(final Money amount) { this.degreeGratuityTotalAmount = this.degreeGratuityTotalAmount.add(amount); } public Money getDegreeGratuityTotalAmount() { return degreeGratuityTotalAmount; } public Money getGraduationInsuranceTotalAmount() { return graduationInsuranceTotalAmount; } private void addGraduationInsuranceAmount(Money amount) { this.graduationInsuranceTotalAmount = this.graduationInsuranceTotalAmount.add(amount); } private void addDfaGratuityAmount(final Money amount) { this.dfaGratuityTotalAmount = this.dfaGratuityTotalAmount.add(amount); } public Money getDfaGratuityTotalAmount() { return dfaGratuityTotalAmount; } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } public Integer getFileVersion() { return fileVersion; } public void setFileVersion(Integer fileVersion) { this.fileVersion = fileVersion; } private void addAfterGraduationInsuranceAmount(final Money amount) { this.afterGraduationInsuranceTotalAmount = this.afterGraduationInsuranceTotalAmount.add(amount); } public Money getAfterGraduationInsuranceTotalAmount() { return afterGraduationInsuranceTotalAmount; } private void addIntegratedBolonhaMasterDegreeGratuityAmount(final Money amount) { this.integratedBolonhaMasterDegreeGratuityTotalAmount = this.integratedBolonhaMasterDegreeGratuityTotalAmount.add(amount); } public Money getIntegratedBolonhaMasterDegreeGratuityTotalAmount() { return integratedBolonhaMasterDegreeGratuityTotalAmount; } private void addIntegratedMasterDegreeGratuityAmount(final Money amount) { this.integratedMasterDegreeGratuityTotalAmount = this.integratedMasterDegreeGratuityTotalAmount.add(amount); } public Money getIntegratedMasterDegreeGratuityTotalAmount() { return integratedMasterDegreeGratuityTotalAmount; } private void addMasterDegreeGratuityAmount(final Money amount) { this.masterDegreeGratuityTotalAmount = this.masterDegreeGratuityTotalAmount.add(amount); } public Money getMasterDegreeGratuityTotalAmount() { return masterDegreeGratuityTotalAmount; } private void addBolonhaMasterDegreGratuityTotalAmount(final Money amount) { this.bolonhaMasterDegreeGratuityTotalAmount = this.bolonhaMasterDegreeGratuityTotalAmount.add(amount); } public Money getBolonhaMasterDegreeGratuityTotalAmount() { return bolonhaMasterDegreeGratuityTotalAmount; } private void addSpecializationGratuityAmount(final Money amount) { this.specializationGratuityTotalAmount = this.specializationGratuityTotalAmount.add(amount); } public Money getSpecializationGratuityTotalAmount() { return specializationGratuityTotalAmount; } private void addPhdGratuityAmount(final Money amount) { this.phdGratuityTotalAmout = this.phdGratuityTotalAmout.add(amount); } public Money getPhdGratuityTotalAmout() { return phdGratuityTotalAmout; } public Money getOver23IndividualCandidacyEventAmount() { return over23IndividualCandidacyEventAmount; } public void addOver23IndividualCandidacyEventAmount(final Money amount) { this.over23IndividualCandidacyEventAmount = this.over23IndividualCandidacyEventAmount.add(amount); } public Money getInstitutionAffiliationEventAmount() { return institutionAffiliationEventAmount; } public void addInstitutionAffiliationEventAmount(final Money amount) { this.institutionAffiliationEventAmount = this.institutionAffiliationEventAmount.add(amount); } public Money getPhdProgramCandidacyEventAmount() { return phdProgramCandidacyEventAmount; } public void addPhdProgramCandidacyEventAmount(final Money amount) { this.phdProgramCandidacyEventAmount = this.phdProgramCandidacyEventAmount.add(amount); } public Money getTotalCost() { return totalCost; } public void setTotalCost(Money totalCost) { this.totalCost = totalCost; } public Money getTransactionsTotalAmount() { return transactionsTotalAmount; } public void setTransactionsTotalAmount(Money transactionsTotalAmount) { this.transactionsTotalAmount = transactionsTotalAmount; } public YearMonthDay getWhenProcessedBySibs() { return whenProcessedBySibs; } public void setWhenProcessedBySibs(YearMonthDay whenProcessedBySibs) { this.whenProcessedBySibs = whenProcessedBySibs; } public Money getResidenceAmount() { return residenceAmount; } public void addResidenceAmount(Money money) { this.residenceAmount = this.residenceAmount.add(money); } private void addSpecialSeasonEnrolmentEventAmount(final Money amount) { this.specialSeasonEnrolmentEventAmount = this.specialSeasonEnrolmentEventAmount.add(amount); } public Money getSpecialSeasonEnrolmentEventAmount() { return specialSeasonEnrolmentEventAmount; } public void addAmount(final SibsIncommingPaymentFileDetailLine detailLine, final PaymentCode paymentCode) { if (paymentCode.isForRectorate()) { addAmountForRectorate(detailLine.getAmount()); } else if (paymentCode instanceof AccountingEventPaymentCode) { addAmountForEvent(detailLine, paymentCode); } else if (paymentCode instanceof GratuitySituationPaymentCode) { addAmountForGratuitySituation(detailLine, (GratuitySituationPaymentCode) paymentCode); } else if (paymentCode instanceof MasterDegreeInsurancePaymentCode) { addAfterGraduationInsuranceAmount(detailLine.getAmount()); } else { throw new UnsupportedOperationException("Unknown payment code type"); } } private void addAmountForEvent(final SibsIncommingPaymentFileDetailLine detailLine, final PaymentCode paymentCode) { final Event event = ((AccountingEventPaymentCode) paymentCode).getAccountingEvent(); if (event instanceof GratuityEventWithPaymentPlan) { addAmountForGratuityEvent(detailLine, (GratuityEventWithPaymentPlan) event); } else if (event instanceof AdministrativeOfficeFeeAndInsuranceEvent) { addAmountForAdministrativeOfficeAndInsuranceEvent(detailLine, (AdministrativeOfficeFeeAndInsuranceEvent) event); } else if (event instanceof DfaGratuityEvent) { addDfaGratuityAmount(detailLine.getAmount()); } else if (event instanceof InsuranceEvent) { addAfterGraduationInsuranceAmount(detailLine.getAmount()); } else if (event instanceof ResidenceEvent) { addResidenceAmount(detailLine.getAmount()); } else if (event instanceof SecondCycleIndividualCandidacyEvent) { addSecondCycleIndividualCandidacyAmount(detailLine.getAmount()); } else if (event instanceof DegreeChangeIndividualCandidacyEvent) { addDegreeChangeIndividualCandidacyAmount(detailLine.getAmount()); } else if (event instanceof DegreeCandidacyForGraduatedPersonEvent) { addDegreeCandidacyForGraduatedPersonAmount(detailLine.getAmount()); } else if (event instanceof DegreeTransferIndividualCandidacyEvent) { addDegreeTransferIndividualCandidacyAmount(detailLine.getAmount()); } else if (event instanceof StandaloneEnrolmentGratuityEvent) { addStandaloneEnrolmentGratuityEventAmount(detailLine.getAmount()); } else if (event instanceof Over23IndividualCandidacyEvent) { addOver23IndividualCandidacyEventAmount(detailLine.getAmount()); } else if (event instanceof PhdProgramCandidacyEvent) { addPhdProgramCandidacyEventAmount(detailLine.getAmount()); } else if (event instanceof SpecialSeasonEnrolmentEvent) { addSpecialSeasonEnrolmentEventAmount(detailLine.getAmount()); } else { throw new IllegalArgumentException("Unknown accounting event " + event.getClass().getName()); } } private void addAmountForGratuityEvent(final SibsIncommingPaymentFileDetailLine detailLine, final GratuityEventWithPaymentPlan gratuityEventWithPaymentPlan) { if (gratuityEventWithPaymentPlan.getDegree().getDegreeType().isPreBolonhaDegree()) { addDegreeGratuityAmount(detailLine.getAmount()); return; } if (gratuityEventWithPaymentPlan.getDegree().getDegreeType().isBolonhaMasterDegree()) { addBolonhaMasterDegreGratuityTotalAmount(detailLine.getAmount()); return; } if (gratuityEventWithPaymentPlan.getDegree().getDegreeType().isBolonhaDegree()) { addBolonhaDegreeGratuityAmount(detailLine.getAmount()); return; } if (gratuityEventWithPaymentPlan.getDegree().getDegreeType().isIntegratedMasterDegree()) { addIntegratedBolonhaMasterDegreeGratuityAmount(detailLine.getAmount()); return; } throw new IllegalArgumentException("unknown degree type for gratuity event"); } private void addAmountForAdministrativeOfficeAndInsuranceEvent(final SibsIncommingPaymentFileDetailLine detailLine, final AdministrativeOfficeFeeAndInsuranceEvent administrativeOfficeFeeAndInsuranceEvent) { if (detailLine.getAmount().greaterOrEqualThan(administrativeOfficeFeeAndInsuranceEvent.getAmountToPay())) { addGraduationInsuranceAmount(administrativeOfficeFeeAndInsuranceEvent.getInsuranceAmount()); addAdministrativeOfficeTaxAmount(detailLine.getAmount().subtract( administrativeOfficeFeeAndInsuranceEvent.getInsuranceAmount())); } else { addAdministrativeOfficeTaxAmount(detailLine.getAmount()); } } private void addAmountForGratuitySituation(final SibsIncommingPaymentFileDetailLine detailLine, GratuitySituationPaymentCode paymentCode) { final GratuitySituation gratuitySituation = paymentCode.getGratuitySituation(); switch (gratuitySituation.getStudentCurricularPlan().getSpecialization()) { case STUDENT_CURRICULAR_PLAN_MASTER_DEGREE: addMasterDegreeGratuityAmount(detailLine.getAmount()); break; case STUDENT_CURRICULAR_PLAN_INTEGRATED_MASTER_DEGREE: addIntegratedMasterDegreeGratuityAmount(detailLine.getAmount()); break; case STUDENT_CURRICULAR_PLAN_SPECIALIZATION: addSpecializationGratuityAmount(detailLine.getAmount()); break; default: throw new RuntimeException("Unknown specialization " + gratuitySituation.getStudentCurricularPlan().getSpecialization().name()); } } public Money getDegreeChangeIndividualCandidacyAmount() { return degreeChangeIndividualCandidacyAmount; } public Money getDegreeTransferIndividualCandidacyAmount() { return degreeTransferIndividualCandidacyAmount; } public Money getSecondCycleIndividualCandidacyAmount() { return secondCycleIndividualCandidacyAmount; } public Money getDegreeCandidacyForGraduatedPersonAmount() { return degreeCandidacyForGraduatedPersonAmount; } public Money getRectorateAmount() { return this.rectorateAmount; } public void addDegreeChangeIndividualCandidacyAmount(Money money) { this.degreeChangeIndividualCandidacyAmount = this.degreeChangeIndividualCandidacyAmount.add(money); } public void addDegreeTransferIndividualCandidacyAmount(Money money) { this.degreeTransferIndividualCandidacyAmount = this.degreeTransferIndividualCandidacyAmount.add(money); } public void addSecondCycleIndividualCandidacyAmount(Money money) { this.secondCycleIndividualCandidacyAmount = this.secondCycleIndividualCandidacyAmount.add(money); } public void addDegreeCandidacyForGraduatedPersonAmount(Money money) { this.degreeCandidacyForGraduatedPersonAmount = this.degreeCandidacyForGraduatedPersonAmount.add(money); } public Money getStandaloneEnrolmentGratuityEventAmount() { return this.standaloneEnrolmentGratuityEventAmount; } public void addStandaloneEnrolmentGratuityEventAmount(Money amount) { this.standaloneEnrolmentGratuityEventAmount = this.standaloneEnrolmentGratuityEventAmount.add(amount); } public void addAmountForRectorate(Money amount) { this.rectorateAmount = this.rectorateAmount.add(amount); } }