/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.coa.service.impl; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.coa.businessobject.AccountDelegate; import org.kuali.kfs.coa.dataaccess.AccountDelegateDao; import org.kuali.kfs.coa.dataaccess.AccountDelegateGlobalDao; import org.kuali.kfs.coa.document.AccountDelegateGlobalMaintainableImpl; import org.kuali.kfs.coa.document.AccountDelegateMaintainableImpl; import org.kuali.kfs.coa.service.AccountDelegateService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.document.FinancialSystemMaintainable; import org.kuali.kfs.sys.service.NonTransactional; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.kew.service.KEWServiceLocator; import org.kuali.rice.kim.api.role.RoleResponsibility; import org.kuali.rice.kim.api.role.RoleService; import org.kuali.rice.kim.api.services.KimApiServiceLocator; import org.kuali.rice.kns.service.DataDictionaryService; import org.kuali.rice.krad.bo.PersistableBusinessObject; import org.kuali.rice.krad.maintenance.MaintenanceLock; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.util.ObjectUtils; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * The default implementation of AccountDelegateService. */ public class AccountDelegateServiceImpl implements AccountDelegateService { private AccountDelegateDao accountDelegateDao; private AccountDelegateGlobalDao accountDelegateGlobalDao; private DataDictionaryService dataDictionaryService; private BusinessObjectService businessObjectService; protected DateTimeService dateTimeService; /** * @see org.kuali.kfs.coa.service.AccountDelegateService#getLockingDocumentId(org.kuali.kfs.coa.document.AccountDelegateGlobalMaintainableImpl, * java.lang.String) */ @Override @NonTransactional public String getLockingDocumentId(AccountDelegateGlobalMaintainableImpl global, String docNumber) { String lockingDocId = null; List<MaintenanceLock> maintenanceLocks = global.generateMaintenanceLocks(); for (MaintenanceLock maintenanceLock : maintenanceLocks) { lockingDocId = accountDelegateGlobalDao.getLockingDocumentNumber(maintenanceLock.getLockingRepresentation(), docNumber); if (StringUtils.isNotBlank(lockingDocId)) { break; } } return lockingDocId; } /** * @see org.kuali.kfs.coa.service.AccountDelegateService#getLockingDocumentId(org.kuali.kfs.coa.document.AccountDelegateMaintainableImpl, * java.lang.String) */ @Override @NonTransactional public String getLockingDocumentId(AccountDelegateMaintainableImpl delegate, String docNumber) { String lockingDocId = null; List<MaintenanceLock> maintenanceLocks = delegate.generateMaintenanceLocks(); maintenanceLocks.add(delegate.createGlobalAccountLock()); for (MaintenanceLock maintenanceLock : maintenanceLocks) { lockingDocId = accountDelegateDao.getLockingDocumentNumber(maintenanceLock.getLockingRepresentation(), docNumber); if (StringUtils.isNotBlank(lockingDocId)) { break; } } return lockingDocId; } /** * @see org.kuali.kfs.coa.service.AccountDelegateService#buildMaintainableForAccountDelegate(org.kuali.kfs.coa.businessobject.AccountDelegate) */ @Override @NonTransactional public FinancialSystemMaintainable buildMaintainableForAccountDelegate(AccountDelegate delegate) { FinancialSystemMaintainable maintainable = getAccountDelegateMaintainable(); maintainable.setBoClass(delegate.getClass()); maintainable.setBusinessObject(delegate); return maintainable; } /** * @return the proper class for the Maintainable associated with AccountDelegate maintenance documents */ protected Class getAccountDelegateMaintainableClass() { return dataDictionaryService.getDataDictionary().getMaintenanceDocumentEntryForBusinessObjectClass(AccountDelegate.class).getMaintainableClass(); } /** * @return a new instance of the proper maintainable for AccountDelegate maintenance documents */ protected FinancialSystemMaintainable getAccountDelegateMaintainable() { final Class maintainableClazz = getAccountDelegateMaintainableClass(); final FinancialSystemMaintainable maintainable; try { maintainable = (FinancialSystemMaintainable) maintainableClazz.newInstance(); } catch (Exception ie) { throw new RuntimeException("Could not instantiate maintainable for AccountDelegate maintenance document", ie); } return maintainable; } /** * @see org.kuali.kfs.coa.service.AccountDelegateService#retrieveAllActiveDelegationsForPerson(java.lang.String) */ @Override @NonTransactional public Iterator<AccountDelegate> retrieveAllActiveDelegationsForPerson(String principalId, boolean primary) { return accountDelegateDao.getAccountDelegationsForPerson(principalId, primary); } /** * @see org.kuali.kfs.coa.service.AccountDelegateService#isPrincipalInAnyWayShapeOrFormPrimaryAccountDelegate(java.lang.String) */ @Override @NonTransactional public boolean isPrincipalInAnyWayShapeOrFormPrimaryAccountDelegate(String principalId) { return accountDelegateDao.isPrincipalInAnyWayShapeOrFormPrimaryAccountDelegate(principalId, dateTimeService.getCurrentSqlDate()); } /** * @see org.kuali.kfs.coa.service.AccountDelegateService#isPrincipalInAnyWayShapeOrFormSecondaryAccountDelegate(java.lang.String) */ @Override @NonTransactional public boolean isPrincipalInAnyWayShapeOrFormSecondaryAccountDelegate(String principalId) { return accountDelegateDao.isPrincipalInAnyWayShapeOrFormSecondaryAccountDelegate(principalId, dateTimeService.getCurrentSqlDate()); } /** * Saves the given account delegate to the persistence store * * @param accountDelegate the account delegate to save */ @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public void saveForMaintenanceDocument(AccountDelegate accountDelegate) { businessObjectService.linkAndSave(accountDelegate); } /** * Persists the given account delegate global maintenance document inactivations * * @param delegatesToInactivate the List of delegates to inactivate */ @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public void saveInactivationsForGlobalMaintenanceDocument(List<PersistableBusinessObject> delegatesToInactivate) { if (delegatesToInactivate != null && !delegatesToInactivate.isEmpty()) { businessObjectService.save(delegatesToInactivate); } } /** * Persists the given account delegate global maintenance document changes * * @param delegatesToChange the List of delegates to change */ @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public void saveChangesForGlobalMaintenanceDocument(List<PersistableBusinessObject> delegatesToChange) { if (delegatesToChange != null && !delegatesToChange.isEmpty()) { businessObjectService.save(delegatesToChange); } } /** * Updates the role that this delegate is part of, to account for the changes in this delegate */ @Override @Transactional public void updateDelegationRole() { final RoleService roleManagementService = KimApiServiceLocator.getRoleService(); final String roleId = roleManagementService.getRoleIdByNamespaceCodeAndName(KFSConstants.ParameterNamespaces.KFS, KFSConstants.SysKimApiConstants.FISCAL_OFFICER_KIM_ROLE_NAME); if (!StringUtils.isBlank(roleId)) { List<RoleResponsibility> newRoleResp = roleManagementService.getRoleResponsibilities(roleId); KEWServiceLocator.getActionRequestService().updateActionRequestsForResponsibilityChange(getChangedRoleResponsibilityIds(newRoleResp)); } } protected Set<String> getChangedRoleResponsibilityIds( List<RoleResponsibility> newRoleResp){ Set<String> lRet = new HashSet<String>(); if(ObjectUtils.isNotNull(newRoleResp)){ for(RoleResponsibility roleResp: newRoleResp){ lRet.add(roleResp.getResponsibilityId()); } } return lRet; } @NonTransactional public void setAccountDelegateDao(AccountDelegateDao accountDelegateDao) { this.accountDelegateDao = accountDelegateDao; } @NonTransactional public void setAccountDelegateGlobalDao(AccountDelegateGlobalDao accountDelegateGlobalDao) { this.accountDelegateGlobalDao = accountDelegateGlobalDao; } @NonTransactional public void setDataDictionaryService(DataDictionaryService dataDictionaryService) { this.dataDictionaryService = dataDictionaryService; } @NonTransactional public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } @NonTransactional public void setDateTimeService(DateTimeService dateTimeService) { this.dateTimeService = dateTimeService; } }