/** * 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.service.services.serviceRequests.documentRequests; import org.fenixedu.academic.domain.accounting.PaymentMode; import org.fenixedu.academic.domain.accounting.events.serviceRequests.PastDegreeDiplomaRequestEvent; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.serviceRequests.AcademicServiceRequestSituationType; import org.fenixedu.academic.domain.serviceRequests.documentRequests.PastDiplomaRequest; import org.fenixedu.academic.dto.accounting.AccountingTransactionDetailDTO; import org.fenixedu.academic.dto.serviceRequests.AcademicServiceRequestBean; import org.fenixedu.academic.dto.serviceRequests.DocumentRequestCreateBean; import org.fenixedu.academic.predicate.AccessControl; import org.fenixedu.academic.service.factoryExecutors.DocumentRequestCreator; import org.fenixedu.bennu.core.security.Authenticate; import org.joda.time.DateTime; import org.joda.time.LocalDate; import pt.ist.fenixframework.Atomic; public class CreatePastDiplomaRequest { @Atomic public static PastDiplomaRequest create(DocumentRequestCreator bean) { if (bean.getRegistration().getStartDate().isAfter(bean.getPastRequestDate())) { throw new DomainException("DiplomaRequest.cannot.request.before.registration.start"); } bean.setRequestDate(bean.getPastRequestDate().toDateTimeAtStartOfDay()); PastDiplomaRequest request = createPastDiplomaRequest(bean); request.getActiveSituation().setSituationDate(bean.getPastRequestDate().toDateTimeAtStartOfDay()); createSituations(request, bean); return request; } private static PastDiplomaRequest createPastDiplomaRequest(DocumentRequestCreator bean) { PastDiplomaRequest request = new PastDiplomaRequest(); request.init(bean); return request; } private static void createSituations(PastDiplomaRequest request, DocumentRequestCreateBean bean) { if (!bean.getRegistration().isRegistrationConclusionProcessed()) { throw new DomainException("DiplomaRequest.diploma.cannot.be.concluded"); } LocalDate latestDate = bean.getPastRequestDate(); if (bean.getPastPaymentDate() == null) { bean.setPastPaymentDate(latestDate); } else { latestDate = (latestDate.compareTo(bean.getPastPaymentDate()) < 0) ? bean.getPastPaymentDate() : latestDate; } if (bean.getPastEmissionDate() == null) { bean.setPastEmissionDate(latestDate); } else { latestDate = (latestDate.compareTo(bean.getPastEmissionDate()) < 0) ? bean.getPastEmissionDate() : latestDate; } if (bean.getPastDispatchDate() == null) { bean.setPastDispatchDate(latestDate); } createPaymentSituation(request, bean); process(request, bean.getPastRequestDate()); request.setNumberOfPages(1); send(request, bean.getPastRequestDate()); receive(request, bean.getPastRequestDate()); conclude(request, bean.getPastEmissionDate()); deliver(request, bean.getPastDispatchDate()); } private static void createPaymentSituation(PastDiplomaRequest request, DocumentRequestCreateBean bean) { if (isPayed(bean)) { PastDegreeDiplomaRequestEvent event = new PastDegreeDiplomaRequestEvent(request.getAdministrativeOffice(), request.getPerson(), request, bean.getPastPaymentAmount()); event.depositAmount(Authenticate.getUser(), bean.getPastPaymentAmount(), createTransactionDetailDTO(bean)); } } private static boolean isPayed(DocumentRequestCreateBean bean) { return bean.getPastPaymentAmount() != null && bean.getPastPaymentAmount().isPositive(); } private static AccountingTransactionDetailDTO createTransactionDetailDTO(DocumentRequestCreateBean bean) { return new AccountingTransactionDetailDTO(bean.getPastPaymentDate().toDateTimeAtStartOfDay(), PaymentMode.CASH); } private static void process(PastDiplomaRequest request, LocalDate requestDate) { editSituation(request, AcademicServiceRequestSituationType.PROCESSING, requestDate.toDateTimeAtStartOfDay() .plusMinutes(1)); } private static void send(PastDiplomaRequest request, LocalDate requestDate) { editSituation(request, AcademicServiceRequestSituationType.SENT_TO_EXTERNAL_ENTITY, requestDate.toDateTimeAtStartOfDay() .plusMinutes(2)); } private static void receive(PastDiplomaRequest request, LocalDate requestDate) { editSituation(request, AcademicServiceRequestSituationType.RECEIVED_FROM_EXTERNAL_ENTITY, requestDate .toDateTimeAtStartOfDay().plusMinutes(3)); } private static void conclude(PastDiplomaRequest request, LocalDate emissionDate) { editSituation(request, AcademicServiceRequestSituationType.CONCLUDED, emissionDate.toDateTimeAtStartOfDay() .plusMinutes(4)); } private static void deliver(PastDiplomaRequest request, LocalDate dispatchDate) { editSituation(request, AcademicServiceRequestSituationType.DELIVERED, dispatchDate.toDateTimeAtStartOfDay() .plusMinutes(5)); } private static void editSituation(PastDiplomaRequest request, AcademicServiceRequestSituationType situationType, DateTime situationDate) { final AcademicServiceRequestBean bean = new AcademicServiceRequestBean(situationType, AccessControl.getPerson()); bean.setFinalSituationDate(situationDate); bean.setJustification("-"); request.edit(bean); } }