/*
* 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.module.tem.service.impl;
import static org.kuali.kfs.module.tem.TemConstants.EMP_TRAVELER_TYP_CD;
import static org.kuali.kfs.module.tem.TemConstants.NONEMP_TRAVELER_TYP_CD;
import static org.kuali.kfs.module.tem.TemConstants.TemProfileParameters.VALID_KIM_TYPE_AFFILIATION_BY_TRAVER_TYPE;
import static org.kuali.kfs.module.tem.TemConstants.TemProfileParameters.VALID_TRAVELER_TYPE_BY_CUSTOMER_TYPE;
import static org.kuali.kfs.module.tem.TemConstants.TravelParameters.EMPLOYEE_TRAVELER_TYPE_CODES;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.text.StrTokenizer;
import org.apache.log4j.Logger;
import org.kuali.kfs.coa.businessobject.Organization;
import org.kuali.kfs.coa.service.ChartService;
import org.kuali.kfs.coa.service.OrganizationService;
import org.kuali.kfs.integration.ar.AccountsReceivableCustomer;
import org.kuali.kfs.integration.ar.AccountsReceivableCustomerAddress;
import org.kuali.kfs.integration.ar.AccountsReceivableModuleService;
import org.kuali.kfs.module.tem.TemConstants;
import org.kuali.kfs.module.tem.TemParameterConstants;
import org.kuali.kfs.module.tem.TemPropertyConstants;
import org.kuali.kfs.module.tem.TemPropertyConstants.TemProfileProperties;
import org.kuali.kfs.module.tem.businessobject.TemProfile;
import org.kuali.kfs.module.tem.businessobject.TemProfileAddress;
import org.kuali.kfs.module.tem.businessobject.TemProfileEmergencyContact;
import org.kuali.kfs.module.tem.businessobject.TemProfileFromCustomer;
import org.kuali.kfs.module.tem.businessobject.TemProfileFromKimPerson;
import org.kuali.kfs.module.tem.businessobject.TravelerDetail;
import org.kuali.kfs.module.tem.businessobject.TravelerDetailEmergencyContact;
import org.kuali.kfs.module.tem.identity.TemOrganizationHierarchyRoleTypeService;
import org.kuali.kfs.module.tem.service.TemRoleService;
import org.kuali.kfs.module.tem.service.TravelerService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.businessobject.ChartOrgHolder;
import org.kuali.kfs.sys.businessobject.ChartOrgHolderImpl;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.identity.KfsKimAttributes;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kim.api.identity.PersonService;
import org.kuali.rice.kim.api.identity.address.EntityAddressContract;
import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliation;
import org.kuali.rice.kim.api.identity.citizenship.EntityCitizenship;
import org.kuali.rice.kim.api.identity.entity.Entity;
import org.kuali.rice.kim.api.identity.personal.EntityBioDemographics;
import org.kuali.rice.kim.api.role.RoleService;
import org.kuali.rice.kim.api.services.IdentityManagementService;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.SequenceAccessorService;
import org.kuali.rice.krad.util.ObjectUtils;
import org.springframework.beans.BeanUtils;
/**
*
*/
public class TravelerServiceImpl implements TravelerService {
protected ParameterService parameterService;
protected PersonService personService;
protected IdentityManagementService identityManagementService;
protected BusinessObjectService businessObjectService;
protected DateTimeService dateTimeService;
protected TemRoleService temRoleService;
protected ChartService chartService;
protected OrganizationService organizationService;
protected RoleService roleService;
protected AccountsReceivableModuleService accountsReceivableModuleService;
protected static Logger LOG = Logger.getLogger(TravelerServiceImpl.class);
/**
* Creates a {@link TravelerDetail} from a {@link Person} instance
*
* @param person to create {@link TravelerDetail} instance from
* @return a new {@link Traveler} detail instance
*/
@Override
public TravelerDetail convertToTraveler(final Person person) {
TravelerDetail retval = new TravelerDetail();
retval.setPrincipalId(person.getPrincipalId());
retval.setPrincipalName(person.getPrincipalName());
retval.setFirstName(person.getFirstName());
retval.setLastName(person.getLastName());
retval.setStreetAddressLine1(person.getAddressLine1());
retval.setStreetAddressLine2(person.getAddressLine2());
retval.setStateCode(person.getAddressStateProvinceCode());
retval.setZipCode(person.getAddressPostalCode());
retval.setCityName(person.getAddressCity());
retval.setCountryCode(person.getAddressCountryCode());
retval.setEmailAddress(person.getEmailAddress());
retval.setPhoneNumber(person.getPhoneNumber());
retval.setTravelerTypeCode(EMP_TRAVELER_TYP_CD);
return retval;
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#canIncludeProfileInSearch(org.kuali.kfs.module.tem.businessobject.TemProfile, java.lang.String, org.kuali.rice.kim.bo.Person, boolean, boolean, boolean, boolean, boolean)
*/
@Override
public boolean canIncludeProfileInSearch(TemProfile profile, String docType, Person user, boolean isProfileAdmin, boolean isAssignedArranger, boolean isOrgArranger, boolean isArrangerDoc, boolean isRiskManagement) {
boolean canInclude = false;
//arrange doc, risk management or user look up self
if(isArrangerDoc || isRiskManagement || user.getPrincipalId().equals(profile.getPrincipalId())) {
return true;
}
if(isProfileAdmin || isOrgArranger) {
//pull the org they are responsible for and filter on that
final String roleName = isOrgArranger ?
TemConstants.TEM_ORGANIZATION_PROFILE_ARRANGER :
TemConstants.TEM_PROFILE_ADMIN;
canInclude |= isArrangeeByOrganizationByRole(user.getPrincipalId(), profile, roleName);
}
//check in arranger details if it does not already have the authority to view the profile
if(!canInclude && isAssignedArranger) {
//pull the arranger's profiles it is responsible for
if (ObjectUtils.isNotNull(docType)){
canInclude |= getTemRoleService().isTravelDocumentArrangerForProfile(docType, user.getPrincipalId(), profile.getProfileId());
}else{
// arranger for a non docType specific search, look up without the doctype comparison
canInclude |= getTemRoleService().isArrangerForProfile(user.getPrincipalId(), profile.getProfileId());
}
}
return canInclude;
}
/**
* Checks both the organization approver and profile admin roles to see if the given principal can arrange for the role
* @param principalId the principal id to check
* @param profile the profile to see if the principal can be their arranger
* @return true if the principal can be an arranger for the profile, false otherwise
*/
@Override
public boolean isArrangeeByOrganization(String principalId, TemProfile profile) {
return isArrangeeByOrganizationByRole(principalId, profile, TemConstants.TEM_ORGANIZATION_PROFILE_ARRANGER) ||
isArrangeeByOrganizationByRole(principalId, profile, TemConstants.TEM_PROFILE_ADMIN);
}
/**
* Determines if the given principal id represents a user who can arrange trips for the given profile, by the power granted by the given role
* @param principalId the principal id to see if they can act as arrangers
* @param profile the profile to act as an arranger for
* @param roleName the role it is expected the principal should be in
* @return true if the principal can arrange, false otherwise
*/
protected boolean isArrangeeByOrganizationByRole(String principalId, TemProfile profile, String roleName) {
Organization org = profile.getHomeDeptOrg();
final ChartOrgHolder chartOrg = getOrganizationForUser(principalId, roleName);
if(ObjectUtils.isNotNull(chartOrg)) {
final String roleChartOfAccountsCode = chartOrg.getChartOfAccountsCode();
final String roleOrganizationCode = chartOrg.getOrganizationCode();
return isParentOrg(org.getChartOfAccountsCode(), org.getOrganizationCode(), roleChartOfAccountsCode, roleOrganizationCode, true);
}
return false; // they're not in the role to begin with
}
@Override
public void convertTemProfileToTravelerDetail(TemProfile profile, TravelerDetail detail){
if(profile != null){
if(detail.getId() == null){
SequenceAccessorService sas = SpringContext.getBean(SequenceAccessorService.class);
long id = sas.getNextAvailableSequenceNumber(TemConstants.TEM_TRAVELER_DETAIL_SEQ_NAME);
detail.setId((int)id);
}
detail.setFirstName(profile.getFirstName());
detail.setLastName(profile.getLastName());
detail.setStreetAddressLine1(profile.getTemProfileAddress().getStreetAddressLine1());
detail.setStreetAddressLine2(profile.getTemProfileAddress().getStreetAddressLine2());
detail.setStateCode(profile.getTemProfileAddress().getStateCode());
detail.setCityName(profile.getTemProfileAddress().getCityName());
detail.setZipCode(profile.getTemProfileAddress().getZipCode());
detail.setCountryCode(profile.getTemProfileAddress().getCountryCode());
detail.setPrincipalId(profile.getPrincipalId());
if (ObjectUtils.isNotNull(profile.getPrincipal())) {
detail.setPrincipalName(profile.getPrincipal().getPrincipalName());
}
else {
detail.setPrincipalName(KFSConstants.EMPTY_STRING);
}
detail.setCustomer(profile.getCustomer());
detail.setTravelerType(profile.getTravelerType());
detail.setTravelerTypeCode(profile.getTravelerTypeCode());
detail.setCustomerNumber(profile.getCustomerNumber());
detail.setEmailAddress(profile.getEmailAddress());
detail.setPhoneNumber(profile.getPhoneNumber());
detail.setDateOfBirth(profile.getDateOfBirth());
detail.setGender(profile.getGender());
detail.setCitizenship(profile.getCitizenship());
detail.setDriversLicenseExpDate(profile.getDriversLicenseExpDate());
detail.setDriversLicenseNumber(profile.getDriversLicenseNumber());
detail.setDriversLicenseState(profile.getDriversLicenseState());
detail.setNotifyTAFinal(profile.isNotifyTAFinal());
detail.setNotifyTAStatusChange(profile.isNotifyTAStatusChange());
detail.setNotifyTERFinal(profile.isNotifyTERFinal());
detail.setNotifyTERStatusChange(profile.isNotifyTERStatusChange());
detail.setNonResidentAlien(profile.getNonResidentAlien());
//reset traveler detail's emergency contact list
detail.resetEmergencyContacts();
if (ObjectUtils.isNotNull(profile.getEmergencyContacts())){
int count = 1;
for(TemProfileEmergencyContact profileContact : profile.getEmergencyContacts()){
TravelerDetailEmergencyContact contact = new TravelerDetailEmergencyContact(profileContact);
contact.setDocumentNumber(detail.getDocumentNumber());
contact.setFinancialDocumentLineNumber(count);
contact.setTravelerDetailId(detail.getId());
detail.getEmergencyContacts().add(contact);
count++;
}
}
}
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#copyTravelerDetail(org.kuali.kfs.module.tem.businessobject.TravelerDetail, java.lang.String)
*/
@Override
public TravelerDetail copyTravelerDetail(TravelerDetail travelerDetail, String documentNumber) {
TravelerDetail newTravelerDetail = new TravelerDetail();
//dateOfBirth actually doesn't belong to TravelDetail (only in Profile) so skipping it as it cause error in copyProperties
BeanUtils.copyProperties(travelerDetail, newTravelerDetail, new String[]{TemProfileProperties.DATE_OF_BIRTH});
newTravelerDetail.setId(null);
newTravelerDetail.setVersionNumber(null);
newTravelerDetail.setDocumentNumber(documentNumber);
newTravelerDetail.setEmergencyContacts(copyTravelerDetailEmergencyContact(travelerDetail.getEmergencyContacts(), documentNumber));
return newTravelerDetail;
}
/**
*
* @see org.kuali.kfs.module.tem.document.service.TravelDocumentService#copyTravelerDetailEmergencyContact(java.util.List, java.lang.String)
*/
@Override
public List<TravelerDetailEmergencyContact> copyTravelerDetailEmergencyContact(List<TravelerDetailEmergencyContact> emergencyContacts, String documentNumber) {
List<TravelerDetailEmergencyContact> newEmergencyContacts = new ArrayList<TravelerDetailEmergencyContact>();
if (emergencyContacts != null) {
for (TravelerDetailEmergencyContact emergencyContact : emergencyContacts){
TravelerDetailEmergencyContact newEmergencyContact = new TravelerDetailEmergencyContact();
BeanUtils.copyProperties(emergencyContact, newEmergencyContact);
newEmergencyContact.setDocumentNumber(documentNumber);
newEmergencyContact.setVersionNumber(new Long(1));
newEmergencyContact.setObjectId(null);
newEmergencyContact.setId(null);
newEmergencyContacts.add(newEmergencyContact);
}
}
return newEmergencyContacts;
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#convertToTemProfileFromKim(org.kuali.rice.kim.bo.Person)
*/
@Override
public TemProfileFromKimPerson convertToTemProfileFromKim(final Person person) {
TemProfileFromKimPerson retval = new TemProfileFromKimPerson();
retval.setPrincipalId(person.getPrincipalId());
retval.setEmployeeId(person.getEmployeeId());
retval.setPrincipalName(person.getPrincipalName());
retval.setEntityId(person.getEntityId());
retval.setFirstName(person.getFirstNameUnmasked());
retval.setMiddleName(person.getMiddleNameUnmasked());
retval.setLastName(person.getLastNameUnmasked());
retval.setEmailAddress(person.getEmailAddressUnmasked());
retval.setPhoneNumber(person.getPhoneNumber());
retval.setEmployeeStatusCode(person.getEmployeeStatusCode());
retval.setEmployeeTypeCode(person.getEmployeeTypeCode());
retval.setPrimaryDepartmentCode(person.getPrimaryDepartmentCode());
retval.setCampusCode(person.getCampusCode());
retval.setActive(person.isActive());
return retval;
}
@Override
public boolean isEmployee(final TravelerDetail traveler) {
final String param = getParameterService().getParameterValueAsString(TemParameterConstants.TEM_DOCUMENT.class, EMPLOYEE_TRAVELER_TYPE_CODES);
List<String> employeeTypes = StrTokenizer.getCSVInstance(param).getTokenList();
return employeeTypes.contains(StringUtils.defaultString(traveler.getTravelerTypeCode()));
}
/**
* Creates a {@link TravelerDetail} from a {@link Person} instance
*
* @param customer to create {@link TravelerDetail} instance from
* @return a new {@link Traveler} detail instance
*/
@Override
public TravelerDetail convertToTraveler(final AccountsReceivableCustomer customer) {
TravelerDetail retval = new TravelerDetail();
final AccountsReceivableCustomerAddress address = getAddressFor(customer);
final String[] names = customer.getCustomerName().split(" ");
final String firstName = names[0];
final String lastName = names[names.length - 1];
retval.setCustomerNumber(customer.getCustomerNumber());
retval.refreshReferenceObject(TemPropertyConstants.CUSTOMER);
retval.setFirstName(firstName);
retval.setLastName(lastName);
retval.setStreetAddressLine1(address.getCustomerLine1StreetAddress());
retval.setStreetAddressLine2(address.getCustomerLine2StreetAddress());
retval.setStateCode(address.getCustomerStateCode());
retval.setZipCode(address.getCustomerZipCode());
retval.setCityName(address.getCustomerCityName());
retval.setCountryCode(address.getCustomerCountryCode());
retval.setEmailAddress(address.getCustomerEmailAddress());
retval.setPhoneNumber(customer.getCustomerPhoneNumber());
retval.setTravelerTypeCode(NONEMP_TRAVELER_TYP_CD);
return retval;
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#convertToTemProfileFromCustomer(org.kuali.kfs.integration.ar.AccountsReceivableCustomer)
*/
@Override
public TemProfileFromCustomer convertToTemProfileFromCustomer(AccountsReceivableCustomer person) {
TemProfileFromCustomer retval = new TemProfileFromCustomer();
final AccountsReceivableCustomerAddress address = getAddressFor(person);
BeanUtils.copyProperties(person, retval);
BeanUtils.copyProperties(address, retval);
return retval;
}
/**
* Dig up the primary address for a {@link Customer}
*
* @param customer to get address for
* @return {@link CustomerAddress} instance
*/
protected AccountsReceivableCustomerAddress getAddressFor(final AccountsReceivableCustomer customer) {
return getAddressFor(customer, null);
}
/**
* Dig up the primary address for a {@link Customer}
*
* @param customer to get address for
* @return {@link CustomerAddress} instance
*/
protected AccountsReceivableCustomerAddress getAddressFor(final AccountsReceivableCustomer customer, Integer addressId) {
for (final AccountsReceivableCustomerAddress address : customer.getAccountsReceivableCustomerAddresses()) {
if (ObjectUtils.isNull(addressId) && TemConstants.CUSTOMER_PRIMARY_ADDRESS_TYPE_CODE.equals(address.getCustomerAddressTypeCode())) {
return address;
} else if (address.getCustomerAddressIdentifier().equals(addressId)) {
return address;
}
}
return null;
}
@Override
public TemProfileAddress convertToTemProfileAddressFromCustomer(AccountsReceivableCustomerAddress customerAddress) {
TemProfileAddress retval = new TemProfileAddress();
retval.setStreetAddressLine1(customerAddress.getCustomerLine1StreetAddress());
retval.setStreetAddressLine2(customerAddress.getCustomerLine2StreetAddress());
retval.setStateCode(customerAddress.getCustomerStateCode());
retval.setZipCode(customerAddress.getCustomerZipCode());
retval.setCityName(customerAddress.getCustomerCityName());
retval.setCountryCode(customerAddress.getCustomerCountryCode());
retval.setCustomerNumber(customerAddress.getCustomerNumber());
retval.setCustomerAddressIdentifier(customerAddress.getCustomerAddressIdentifier());
return retval;
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#convertToTemProfileAddressFromKimAddress(org.kuali.rice.kim.bo.Person)
*/
@Override
public TemProfileAddress convertToTemProfileAddressFromKimAddress(final EntityAddressContract address) {
TemProfileAddress retval = new TemProfileAddress();
retval.setStreetAddressLine1(address.getLine1());
retval.setStreetAddressLine2(address.getLine2());
retval.setStateCode(address.getStateProvinceCode());
retval.setZipCode(address.getPostalCode());
retval.setCityName(address.getCity());
retval.setCountryCode(address.getCountryCode());
return retval;
}
/**
* Gets the parameterService attribute.
* @return Returns the parameterService.
*/
public ParameterService getParameterService() {
return parameterService;
}
/**
* Sets the parameterService attribute value.
* @param parameterService The parameterService to set.
*/
public void setParameterService(final ParameterService parameterService) {
this.parameterService = parameterService;
}
/**
* Gets the personService attribute.
* @return Returns the personService.
*/
public PersonService getPersonService() {
if ( personService == null ) {
personService = SpringContext.getBean(PersonService.class);
}
return personService;
}
/**
* Copies relevant data from {@link TemProfile} to {@link Customer}
* @see org.kuali.kfs.module.tem.service.TravelerService#copyTemProfileToCustomer(org.kuali.kfs.module.tem.businessobject.TemProfile, org.kuali.kfs.integration.ar.AccountsReceivableCustomer)
*/
@Override
public void copyTemProfileToCustomer(TemProfile profile, AccountsReceivableCustomer customer) {
String tempName = profile.getFirstName() + " " + (StringUtils.isEmpty(profile.getMiddleName()) ? "" : profile.getMiddleName() + " ") + profile.getLastName();
if (tempName.length() > 40){
tempName = profile.getFirstName() + " " + profile.getLastName();
while (tempName.length() > 40){
tempName = tempName.substring(0, tempName.length()-1);
}
}
customer.setCustomerName(tempName);
customer.setCustomerEmailAddress(profile.getEmailAddress());
customer.setCustomerPhoneNumber(profile.getPhoneNumber());
AccountsReceivableCustomerAddress customerAddress = null;
if(ObjectUtils.isNotNull(profile.getTemProfileAddress()) && ObjectUtils.isNotNull(profile.getTemProfileAddress().getCustomerAddressIdentifier())) {
customerAddress = getAddressFor(customer, profile.getTemProfileAddress().getCustomerAddressIdentifier());
} else {
customerAddress = getAddressFor(customer);
}
if (customerAddress == null){
customerAddress = getAccountsReceivableModuleService().createCustomerAddress();
customerAddress.setCustomerAddressTypeCode(TemConstants.CUSTOMER_PRIMARY_ADDRESS_TYPE_CODE);
customerAddress.setCustomerAddressName(tempName);
customer.setCustomerAddressChangeDate(dateTimeService.getCurrentSqlDate());
} else {
if (compareAddress(customerAddress, profile)) {
customer.setCustomerAddressChangeDate(dateTimeService.getCurrentSqlDate());
}
}
customerAddress.setCustomerLine1StreetAddress(profile.getTemProfileAddress().getStreetAddressLine1());
customerAddress.setCustomerLine2StreetAddress(profile.getTemProfileAddress().getStreetAddressLine2());
customerAddress.setCustomerCityName(profile.getTemProfileAddress().getCityName());
customerAddress.setCustomerStateCode(profile.getTemProfileAddress().getStateCode());
customerAddress.setCustomerZipCode(profile.getTemProfileAddress().getZipCode());
customerAddress.setCustomerCountryCode(profile.getTemProfileAddress().getCountryCode());
customerAddress.setCustomerEmailAddress(profile.getEmailAddress());
if (customer.getAccountsReceivableCustomerAddresses() == null){
customer.setAccountsReceivableCustomerAddresses(new ArrayList<AccountsReceivableCustomerAddress>());
}
if (customer.getAccountsReceivableCustomerAddresses().size() == 0){
List<AccountsReceivableCustomerAddress> customerAddresses = customer.getAccountsReceivableCustomerAddresses();
customerAddresses.add(customerAddress);
customer.setAccountsReceivableCustomerAddresses(customerAddresses);
}
customer.setCustomerRecordAddDate(dateTimeService.getCurrentSqlDate());
customer.setCustomerLastActivityDate(dateTimeService.getCurrentSqlDate());
customer.setCustomerBirthDate(profile.getDateOfBirth());
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#populateTemProfile(org.kuali.kfs.module.tem.businessobject.TemProfile)
*/
@Override
public void populateTemProfile(TemProfile profile) {
if(profile != null){
if (!StringUtils.isBlank(profile.getPrincipalId())){
Person person = getPersonService().getPerson(profile.getPrincipalId());
profile.setPrincipal(person);
Entity kimEntity = identityManagementService.getEntityByPrincipalId(profile.getPrincipalId());
profile.setKimEntityInfo(kimEntity);
copyKimDataToTemProfile(profile, profile.getPrincipal(), profile.getKimEntityInfo());
} else if (ObjectUtils.isNotNull(profile.getCustomer())){
copyCustomerToTemProfile(profile, profile.getCustomer());
}
}
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#copyCustomerToTemProfile(TemProfile, AccountsReceivableCustomer)
*/
@Override
public void copyCustomerToTemProfile(TemProfile profile, AccountsReceivableCustomer customer) {
String[] customerNames = customer.getCustomerName().split(" ");
if (customerNames.length == 1){
profile.setFirstName(customerNames[0]);
}
else if (customerNames.length == 2){
profile.setFirstName(customerNames[0]);
profile.setLastName(customerNames[1]);
}
else if (customerNames.length == 3){
profile.setFirstName(customerNames[0]);
profile.setMiddleName(customerNames[1]);
profile.setLastName(customerNames[2]);
}
else{
profile.setFirstName(customerNames[0]);
profile.setMiddleName(customerNames[1]);
profile.setLastName(customerNames[2]);
for (int i=3;i<customerNames.length;i++){
profile.setLastName(profile.getLastName() + " " + customerNames[i]);
}
}
AccountsReceivableCustomerAddress address = customer.getPrimaryAddress();
TemProfileAddress profileAddress = new TemProfileAddress();
if(ObjectUtils.isNotNull(profile.getTemProfileAddress())) {
profileAddress = profile.getTemProfileAddress();
}
profileAddress.setProfileId(profile.getProfileId());
profileAddress.setStreetAddressLine1(address.getCustomerLine1StreetAddress());
profileAddress.setStreetAddressLine2(address.getCustomerLine2StreetAddress());
profileAddress.setCityName(address.getCustomerCityName());
profileAddress.setStateCode(address.getCustomerStateCode());
profileAddress.setZipCode(address.getCustomerZipCode());
profileAddress.setCountryCode(address.getCustomerCountryCode());
profile.setTemProfileAddress(profileAddress);
profile.setEmailAddress(address.getCustomerEmailAddress());
profile.setPhoneNumber(customer.getCustomerPhoneNumber());
profile.setEmployeeId("None");
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#copyKimDataToTemProfile(org.kuali.kfs.module.tem.businessobject.TemProfile, org.kuali.rice.kim.bo.Person, org.kuali.rice.kim.bo.entity.dto.KimEntityInfo)
*/
@Override
public void copyKimDataToTemProfile(TemProfile profile, Person principal, Entity kimEntity) {
// copy principal data
if (ObjectUtils.isNotNull(kimEntity)) {
profile.setFirstName(principal.getFirstName().toUpperCase());
profile.setMiddleName(principal.getMiddleName().toUpperCase());
profile.setLastName(principal.getLastName().toUpperCase());
}
TemProfileAddress profileAddress = new TemProfileAddress();
if(ObjectUtils.isNotNull(profile.getTemProfileAddress())) {
profileAddress = profile.getTemProfileAddress();
}
profileAddress.setProfileId(profile.getProfileId());
profileAddress.setStreetAddressLine1(StringUtils.upperCase(principal.getAddressLine1Unmasked()));
profileAddress.setStreetAddressLine2(StringUtils.upperCase(principal.getAddressLine2Unmasked()));
profileAddress.setCityName(StringUtils.upperCase(principal.getAddressCity()));
profileAddress.setStateCode(StringUtils.upperCase(principal.getAddressStateProvinceCodeUnmasked()));
profileAddress.setZipCode(principal.getAddressPostalCodeUnmasked());
profileAddress.setCountryCode(StringUtils.upperCase(principal.getAddressCountryCodeUnmasked()));
profile.setTemProfileAddress(profileAddress);
profile.setEmailAddress(StringUtils.upperCase(principal.getEmailAddressUnmasked()));
profile.setPhoneNumber(principal.getPhoneNumberUnmasked());
String primaryDeptCode[] = principal.getPrimaryDepartmentCode().split("-");
if(primaryDeptCode != null && primaryDeptCode.length == 2){
profile.setHomeDeptChartOfAccountsCode(primaryDeptCode[0]);
profile.setHomeDeptOrgCode(primaryDeptCode[1]);
}
profile.refreshReferenceObject("homeDeptOrg");
profile.setEmployeeId(principal.getEmployeeId());
// Copy kim info to profile
if(ObjectUtils.isNotNull(kimEntity)) {
if (ObjectUtils.isNotNull(kimEntity.getBioDemographics())) {
String birthDate = kimEntity.getBioDemographics().getBirthDate();
java.util.Date parsedBirthDate = new java.util.Date();
try {
parsedBirthDate = new SimpleDateFormat(EntityBioDemographics.BIRTH_DATE_FORMAT).parse(birthDate);
} catch (ParseException pe) {
LOG.error("Error parsing EntityBioDemographics birth date: '" + birthDate + "'", pe);
}
Date dateOfBirth = new Date(parsedBirthDate.getTime());
profile.setDateOfBirth(dateOfBirth);
profile.setGender(kimEntity.getBioDemographics().getGenderCode());
}
List<EntityCitizenship> citizenships = kimEntity.getCitizenships();
if (ObjectUtils.isNotNull(citizenships) && citizenships.size() > 0) {
profile.setCitizenship(citizenships.get(0).getCountryCode());
}
}
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#isCustomerEmployee(org.kuali.kfs.integration.ar.AccountsReceivableCustomer)
*/
@Override
public boolean isCustomerEmployee(AccountsReceivableCustomer person) {
List<String> empParams = new ArrayList<String>(getParameterService().getParameterValuesAsString(TemProfile.class, VALID_TRAVELER_TYPE_BY_CUSTOMER_TYPE));
List<String> empCodes = new ArrayList<String>();
List<String> nonEmpCodes = new ArrayList<String>();
splitCodes(empCodes, nonEmpCodes, empParams);
if(empCodes.contains(person.getCustomerTypeCode())) {
return true;
} else if(nonEmpCodes.contains(person.getCustomerTypeCode())) {
return false;
}
return false;
}
/**
* @see org.kuali.kfs.module.tem.service.TravelerService#isKimPersonEmployee(org.kuali.rice.kim.bo.Person)
*/
@Override
public boolean isKimPersonEmployee(Person person) {
List<String> empParams = new ArrayList<String>(getParameterService().getParameterValuesAsString(TemProfile.class, VALID_KIM_TYPE_AFFILIATION_BY_TRAVER_TYPE));
List<String> empCodes = new ArrayList<String>();
List<String> nonEmpCodes = new ArrayList<String>();
splitCodes(empCodes, nonEmpCodes, empParams);
//for KIM we need the affiliation type in the entity
Entity kimEntity = identityManagementService.getEntityByPrincipalId(person.getPrincipalId());
for(EntityAffiliation affiliation: kimEntity.getAffiliations()) {
if(empCodes.contains(affiliation.getAffiliationType().getCode())) {
return true;
} else if(nonEmpCodes.contains(affiliation.getAffiliationType().getCode())) {
return false;
}
}
return false;
}
private void splitCodes(List<String> empCodes, List<String> nonEmpCodes, List<String> empParams) {
for(String param: empParams) {
String [] splitParams = param.split("=");
String typeCode = splitParams[1];
if(typeCode.equals(TemConstants.EMP_TRAVELER_TYP_CD)) {
empCodes.add(splitParams[0]);
} else if(typeCode.equals(TemConstants.NONEMP_TRAVELER_TYP_CD)) {
nonEmpCodes.add(splitParams[0]);
}
}
}
private boolean compareAddress(AccountsReceivableCustomerAddress customerAddress, TemProfile temProfile) {
if(!StringUtils.equalsIgnoreCase(customerAddress.getCustomerLine1StreetAddress(), temProfile.getTemProfileAddress().getStreetAddressLine1())) {
return true;
}
if(!StringUtils.equalsIgnoreCase(customerAddress.getCustomerLine2StreetAddress(), temProfile.getTemProfileAddress().getStreetAddressLine2())) {
return true;
}
if(!StringUtils.equalsIgnoreCase(customerAddress.getCustomerCityName(), temProfile.getTemProfileAddress().getCityName())) {
return true;
}
if(!StringUtils.equalsIgnoreCase(customerAddress.getCustomerStateCode(), temProfile.getTemProfileAddress().getStateCode())) {
return true;
}
if(!StringUtils.equalsIgnoreCase(customerAddress.getCustomerZipCode(), temProfile.getTemProfileAddress().getZipCode())) {
return true;
}
if(!StringUtils.equalsIgnoreCase(customerAddress.getCustomerCountryCode(), temProfile.getTemProfileAddress().getCountryCode())) {
return true;
}
if(!StringUtils.equalsIgnoreCase(customerAddress.getCustomerEmailAddress(), temProfile.getEmailAddress())) {
return true;
}
return false;
}
@Override
public boolean isParentOrg(String chartCode, String orgCode, String roleChartCode, String roleOrgCode, boolean descendHierarchy) {
if ( StringUtils.isBlank(chartCode) || StringUtils.isBlank(orgCode) ) {
LOG.debug("No chart/org qualifications passed into isParentOrg()");
return false;
}
if (ObjectUtils.isNull(roleChartCode) && ObjectUtils.isNull(roleOrgCode)) {
LOG.debug("Call to "+this.getClass().getName()+" with no organization role qualifiers; both chart and organization code are null. Please ensure that qualification data has organization information for this role.");
return false;
}
if (ObjectUtils.isNull(roleOrgCode)) {
return roleChartCode.equals(chartCode)
|| (descendHierarchy && chartService.isParentChart(chartCode, roleChartCode));
}
final boolean parentOrg = (roleChartCode.equals(chartCode) && roleOrgCode.equals(orgCode))
|| (descendHierarchy && organizationService.isParentOrganization(chartCode, orgCode, roleChartCode, roleOrgCode));
return parentOrg;
}
protected ChartOrgHolder getOrganizationForUser(String principalId, String roleName) {
if (principalId == null) {
return null;
}
Map<String,String> qualification = new HashMap<String,String>(1);
qualification.put(TemOrganizationHierarchyRoleTypeService.PERFORM_QUALIFIER_MATCH, "false");
List<Map<String,String>> roleQualifiers = getRoleService().getRoleQualifersForPrincipalByNamespaceAndRolename(principalId, TemConstants.PARAM_NAMESPACE, roleName, qualification);
if ((roleQualifiers != null) && !roleQualifiers.isEmpty()) {
final ChartOrgHolder chartOrg = new ChartOrgHolderImpl(roleQualifiers.get(0).get(KfsKimAttributes.CHART_OF_ACCOUNTS_CODE), roleQualifiers.get(0).get(KfsKimAttributes.ORGANIZATION_CODE));
return chartOrg;
}
return null;
}
/**
* Gets the identityManagementService attribute.
* @return Returns the identityManagementService.
*/
public IdentityManagementService getIdentityManagementService() {
return identityManagementService;
}
/**
* Sets the identityManagementService attribute value.
* @param identityManagementService The identityManagementService to set.
*/
public void setIdentityManagementService(IdentityManagementService identityManagementService) {
this.identityManagementService = identityManagementService;
}
/**
* Gets the businessObjectService attribute.
* @return Returns the businessObjectService.
*/
public BusinessObjectService getBusinessObjectService() {
return businessObjectService;
}
/**
* Sets the businessObjectService attribute value.
* @param businessObjectService The businessObjectService to set.
*/
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
/**
* Sets the dateTimeService attribute value.
* @param dateTimeService The dateTimeService to set.
*/
public void setDateTimeService(DateTimeService dateTimeService) {
this.dateTimeService = dateTimeService;
}
/**
* Gets the dateTimeService attribute.
* @return Returns the dateTimeService.
*/
public DateTimeService getDateTimeService() {
return dateTimeService;
}
public TemRoleService getTemRoleService() {
return temRoleService;
}
public void setTemRoleService(TemRoleService temRoleService) {
this.temRoleService = temRoleService;
}
public ChartService getChartService() {
return chartService;
}
public void setChartService(ChartService chartService) {
this.chartService = chartService;
}
public OrganizationService getOrganizationService() {
return organizationService;
}
public void setOrganizationService(OrganizationService organizationService) {
this.organizationService = organizationService;
}
/**
* Gets the roleManagementService attribute.
* @return Returns the roleManagementService.
*/
public RoleService getRoleService() {
return roleService;
}
/**
* Sets the roleManagementService attribute value.
* @param roleManagementService The roleManagementService to set.
*/
public void setRoleService(RoleService roleService) {
this.roleService = roleService;
}
protected AccountsReceivableModuleService getAccountsReceivableModuleService() {
if (accountsReceivableModuleService == null) {
this.accountsReceivableModuleService = SpringContext.getBean(AccountsReceivableModuleService.class);
}
return accountsReceivableModuleService;
}
public void setAccountsReceivableModuleService(AccountsReceivableModuleService accountsReceivableModuleService) {
this.accountsReceivableModuleService = accountsReceivableModuleService;
}
}