package pt.ist.internalBilling.domain; import java.util.stream.Stream; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.domain.User; import org.fenixedu.bennu.core.security.Authenticate; import pt.ist.expenditureTrackingSystem.domain.ExpenditureTrackingSystem; import pt.ist.expenditureTrackingSystem.domain.organization.Person; import pt.ist.expenditureTrackingSystem.domain.organization.Unit; import pt.ist.fenixframework.Atomic; public class InternalBillingService extends InternalBillingService_Base { private InternalBillingService() { super(); setBennu(Bennu.getInstance()); } public static InternalBillingService getInstance() { final InternalBillingService service = Bennu.getInstance().getInternalBillingService(); return service == null ? createInternalBillingService() : service; } @Atomic private static InternalBillingService createInternalBillingService() { final InternalBillingService service = Bennu.getInstance().getInternalBillingService(); return service == null ? new InternalBillingService() : service; } public static Stream<BillableService> billableServiceStream() { return InternalBillingService.getInstance().getBillableServiceSet().stream(); } public static boolean canViewUnitServices(final Unit unit) { final User user = Authenticate.getUser(); final Person person = user == null ? null : user.getExpenditurePerson(); return person != null && (unit.isResponsible(person) || unit.isUnitObserver(user) || ExpenditureTrackingSystem.isManager()); } public static boolean canViewUserServices(final User user) { final User loggedUser = Authenticate.getUser(); return user == loggedUser || ExpenditureTrackingSystem.isManager() || isResponsibleForUser(user, loggedUser); } private static boolean isResponsibleForUser(final User user, final User loggedUser) { return user.getUserBeneficiary().getBillableSet().stream() .filter(b -> b.getBillableStatus() == BillableStatus.AUTHORIZED) .flatMap(b -> b.getUnit().getAuthorizationsSet().stream()) .anyMatch(a -> a.getPerson() == user.getExpenditurePerson() && a.isValid()); } }