/*
* 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.cam.businessobject.lookup;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.integration.cam.CapitalAssetManagementAsset;
import org.kuali.kfs.module.cam.CamsConstants;
import org.kuali.kfs.module.cam.CamsPropertyConstants;
import org.kuali.kfs.module.cam.businessobject.Asset;
import org.kuali.kfs.module.cam.businessobject.AssetGlobal;
import org.kuali.kfs.module.cam.businessobject.AssetRetirementGlobal;
import org.kuali.kfs.module.cam.document.service.AssetService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.authorization.FinancialSystemMaintenanceDocumentAuthorizerBase;
import org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentAuthorizerBase;
import org.kuali.rice.kim.api.identity.principal.Principal;
import org.kuali.rice.kim.api.services.KimApiServiceLocator;
import org.kuali.rice.kns.lookup.HtmlData;
import org.kuali.rice.kns.lookup.HtmlData.AnchorHtmlData;
import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl;
import org.kuali.rice.kns.web.struts.form.LookupForm;
import org.kuali.rice.kns.web.ui.Field;
import org.kuali.rice.kns.web.ui.Row;
import org.kuali.rice.krad.bo.BusinessObject;
import org.kuali.rice.krad.exception.ValidationException;
import org.kuali.rice.krad.service.DocumentDictionaryService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.KRADConstants;
import org.kuali.rice.krad.util.UrlFactory;
/**
* This class overrids the base getActionUrls method
*/
public class AssetLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AssetLookupableHelperServiceImpl.class);
protected AssetService assetService;
/**
* Custom action urls for Asset.
*
* @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#getCustomActionUrls(org.kuali.rice.krad.bo.BusinessObject,
* List pkNames)
*/
@Override
public List<HtmlData> getCustomActionUrls(BusinessObject bo, List pkNames) {
List<HtmlData> anchorHtmlDataList = super.getCustomActionUrls(bo, pkNames);
Asset asset = (Asset) bo;
// For retired asset, all action link will be hidden.
if (assetService.isAssetRetired(asset)) {
// clear 'edit' link
anchorHtmlDataList.clear();
// add 'view' link instead
anchorHtmlDataList.add(getViewAssetUrl(asset));
}
else {
anchorHtmlDataList.add(getLoanUrl(asset));
anchorHtmlDataList.add(getMergeUrl(asset));
anchorHtmlDataList.add(getSeparateUrl(asset));
anchorHtmlDataList.add(getTransferUrl(asset));
}
return anchorHtmlDataList;
}
protected HtmlData getViewAssetUrl(Asset asset) {
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.START_METHOD);
parameters.put(CamsPropertyConstants.Asset.CAPITAL_ASSET_NUMBER, asset.getCapitalAssetNumber().toString());
parameters.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, CapitalAssetManagementAsset.class.getName());
String href = UrlFactory.parameterizeUrl(CamsConstants.INQUIRY_URL, parameters);
AnchorHtmlData anchorHtmlData = new AnchorHtmlData(href, KFSConstants.START_METHOD, CamsConstants.AssetActions.VIEW);
anchorHtmlData.setTarget("blank");
return anchorHtmlData;
}
protected HtmlData getMergeUrl(Asset asset) {
FinancialSystemMaintenanceDocumentAuthorizerBase documentAuthorizer = (FinancialSystemMaintenanceDocumentAuthorizerBase) SpringContext.getBean(DocumentDictionaryService.class).getDocumentAuthorizer(CamsConstants.DocumentTypeName.ASSET_RETIREMENT_GLOBAL);
boolean isAuthorized = documentAuthorizer.isAuthorized(asset, CamsConstants.CAM_MODULE_CODE, CamsConstants.PermissionNames.MERGE, GlobalVariables.getUserSession().getPerson().getPrincipalId());
if (isAuthorized) {
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.MAINTENANCE_NEWWITHEXISTING_ACTION);
parameters.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, AssetRetirementGlobal.class.getName());
parameters.put(CamsPropertyConstants.AssetRetirementGlobal.MERGED_TARGET_CAPITAL_ASSET_NUMBER, asset.getCapitalAssetNumber().toString());
parameters.put(KFSConstants.OVERRIDE_KEYS, CamsPropertyConstants.AssetRetirementGlobal.RETIREMENT_REASON_CODE + KFSConstants.FIELD_CONVERSIONS_SEPERATOR + CamsPropertyConstants.AssetRetirementGlobal.MERGED_TARGET_CAPITAL_ASSET_NUMBER);
parameters.put(CamsPropertyConstants.AssetRetirementGlobal.RETIREMENT_REASON_CODE, CamsConstants.AssetRetirementReasonCode.MERGED);
parameters.put(KFSConstants.REFRESH_CALLER, CamsPropertyConstants.AssetRetirementGlobal.RETIREMENT_REASON_CODE + "::" + CamsConstants.AssetRetirementReasonCode.MERGED);
String href = UrlFactory.parameterizeUrl(KFSConstants.MAINTENANCE_ACTION, parameters);
return new AnchorHtmlData(href, CamsConstants.AssetActions.MERGE, CamsConstants.AssetActions.MERGE);
}
else {
return new AnchorHtmlData("", "", "");
}
}
@Override
protected String getReturnHref(Properties parameters, LookupForm lookupForm, List returnKeys) {
String href = super.getReturnHref(parameters, lookupForm, returnKeys);
href += "&referencesToRefresh=mergedTargetCapitalAsset";
return href;
}
protected HtmlData getLoanUrl(Asset asset) {
AnchorHtmlData anchorHtmlData = null;
List<HtmlData> childURLDataList = new ArrayList<HtmlData>();
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.DOC_HANDLER_METHOD);
parameters.put(CamsPropertyConstants.AssetTransferDocument.CAPITAL_ASSET_NUMBER, asset.getCapitalAssetNumber().toString());
parameters.put(KFSConstants.PARAMETER_COMMAND, "initiate");
parameters.put(KFSConstants.DOCUMENT_TYPE_NAME, CamsConstants.DocumentTypeName.ASSET_EQUIPMENT_LOAN_OR_RETURN);
if (getAssetService().isAssetLoaned(asset)) {
anchorHtmlData = new AnchorHtmlData("", "", "");
AnchorHtmlData childURLData = new AnchorHtmlData("", "", CamsConstants.AssetActions.LOAN);
childURLDataList.add(childURLData);
parameters.put(CamsConstants.AssetActions.LOAN_TYPE, CamsConstants.AssetActions.LOAN_RENEW);
String childHref = UrlFactory.parameterizeUrl(CamsConstants.StrutsActions.ONE_UP + CamsConstants.StrutsActions.EQUIPMENT_LOAN_OR_RETURN, parameters);
childURLData = new AnchorHtmlData(childHref, KRADConstants.DOC_HANDLER_METHOD, CamsConstants.AssetActions.LOAN_RENEW);
childURLDataList.add(childURLData);
parameters.remove(CamsConstants.AssetActions.LOAN_TYPE);
parameters.put(CamsConstants.AssetActions.LOAN_TYPE, CamsConstants.AssetActions.LOAN_RETURN);
childHref = UrlFactory.parameterizeUrl(CamsConstants.StrutsActions.ONE_UP + CamsConstants.StrutsActions.EQUIPMENT_LOAN_OR_RETURN, parameters);
childURLData = new AnchorHtmlData(childHref, KRADConstants.DOC_HANDLER_METHOD, CamsConstants.AssetActions.LOAN_RETURN);
childURLDataList.add(childURLData);
anchorHtmlData.setChildUrlDataList(childURLDataList);
}
else {
anchorHtmlData = new AnchorHtmlData("", "", "");
//
AnchorHtmlData childURLData = new AnchorHtmlData("", "", "");
if (asset.getCampusTagNumber() == null) {
childURLData = new AnchorHtmlData("", "", CamsConstants.AssetActions.LOAN);
childURLDataList.add(childURLData);
}
else {
parameters.put(CamsConstants.AssetActions.LOAN_TYPE, CamsConstants.AssetActions.LOAN);
String childHref = UrlFactory.parameterizeUrl(CamsConstants.StrutsActions.ONE_UP + CamsConstants.StrutsActions.EQUIPMENT_LOAN_OR_RETURN, parameters);
childURLData = new AnchorHtmlData(childHref, KRADConstants.DOC_HANDLER_METHOD, CamsConstants.AssetActions.LOAN);
childURLDataList.add(childURLData);
}
childURLData = new AnchorHtmlData("", "", CamsConstants.AssetActions.LOAN_RENEW);
childURLDataList.add(childURLData);
childURLData = new AnchorHtmlData("", "", CamsConstants.AssetActions.LOAN_RETURN);
childURLDataList.add(childURLData);
anchorHtmlData.setChildUrlDataList(childURLDataList);
}
return anchorHtmlData;
}
protected HtmlData getSeparateUrl(Asset asset) {
FinancialSystemMaintenanceDocumentAuthorizerBase documentAuthorizer = (FinancialSystemMaintenanceDocumentAuthorizerBase) SpringContext.getBean(DocumentDictionaryService.class).getDocumentAuthorizer(CamsConstants.DocumentTypeName.ASSET_ADD_GLOBAL);
boolean isAuthorized = documentAuthorizer.isAuthorized(asset, CamsConstants.CAM_MODULE_CODE, CamsConstants.PermissionNames.SEPARATE, GlobalVariables.getUserSession().getPerson().getPrincipalId());
if (isAuthorized) {
String href = UrlFactory.parameterizeUrl(KFSConstants.MAINTENANCE_ACTION, getSeparateParameters(asset));
return new AnchorHtmlData(href, KFSConstants.MAINTENANCE_NEW_METHOD_TO_CALL, CamsConstants.AssetActions.SEPARATE);
}
else {
return new AnchorHtmlData("", "", "");
}
}
protected Properties getSeparateParameters(Asset asset) {
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.MAINTENANCE_NEW_METHOD_TO_CALL);
parameters.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, AssetGlobal.class.getName());
parameters.put(CamsPropertyConstants.AssetGlobal.SEPARATE_SOURCE_CAPITAL_ASSET_NUMBER, asset.getCapitalAssetNumber().toString());
// parameter that tells us this is a separate action. We read this in AssetMaintenanbleImpl.processAfterNew
parameters.put(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE, CamsConstants.PaymentDocumentTypeCodes.ASSET_GLOBAL_SEPARATE);
return parameters;
}
protected HtmlData getTransferUrl(Asset asset) {
boolean isAuthorized = true;
boolean assetMovable = false;
try {
assetMovable = getAssetService().isAssetMovableCheckByPayment(asset);
} catch (ValidationException ve) {
isAuthorized = false;
}
if (!assetMovable) {
FinancialSystemTransactionalDocumentAuthorizerBase documentAuthorizer = (FinancialSystemTransactionalDocumentAuthorizerBase)SpringContext.getBean(DocumentDictionaryService.class).getDocumentAuthorizer(CamsConstants.DocumentTypeName.ASSET_TRANSFER);
isAuthorized = documentAuthorizer.isAuthorized(asset, CamsConstants.CAM_MODULE_CODE, CamsConstants.PermissionNames.SEPARATE, GlobalVariables.getUserSession().getPerson().getPrincipalId());
}
if (isAuthorized) {
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.DOC_HANDLER_METHOD);
parameters.put(CamsPropertyConstants.AssetTransferDocument.CAPITAL_ASSET_NUMBER, asset.getCapitalAssetNumber().toString());
parameters.put(KFSConstants.PARAMETER_COMMAND, "initiate");
parameters.put(KFSConstants.DOCUMENT_TYPE_NAME, CamsConstants.DocumentTypeName.ASSET_TRANSFER);
String href = UrlFactory.parameterizeUrl(CamsConstants.StrutsActions.ONE_UP + CamsConstants.StrutsActions.TRANSFER, parameters);
return new AnchorHtmlData(href, KRADConstants.DOC_HANDLER_METHOD, CamsConstants.AssetActions.TRANSFER);
}
else {
return new AnchorHtmlData("", "", "");
}
}
public AssetService getAssetService() {
return assetService;
}
public void setAssetService(AssetService assetService) {
this.assetService = assetService;
}
/**
* Overridden to fix a field conversion
*
* @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#getRows()
*
* KRAD Conversion: Performs customization of the Row objects to be used to generate the search query screen.
*/
@Override
public List<Row> getRows() {
convertOrganizationOwnerAccountField();
return super.getRows();
}
/**
* Overridden to fix a field conversion
*
* @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#setRows()
*/
@Override
protected void setRows() {
super.setRows();
convertOrganizationOwnerAccountField();
}
/**
* Goes through all the rows, making sure that problematic field conversions are fixed
*
* KRAD Conversion: Performs customization of the fields.
*/
protected void convertOrganizationOwnerAccountField() {
boolean foundField = false;
int i = 0;
while (!foundField && i < super.getRows().size()) {
final Row r = super.getRows().get(i);
int j = 0;
while (!foundField && j < r.getFields().size()) {
Field f = r.getField(j);
if (f.getPropertyName().equals(CamsPropertyConstants.Asset.ORGANIZATION_CODE)) {
f.setFieldConversions(fixProblematicField(f.getFieldConversions()));
f.setLookupParameters(fixProblematicField(f.getLookupParameters()));
foundField = true;
}
j += 1;
}
i += 1;
}
}
/**
* Fixes the field conversions - replaces "organizationOwnerAccount.chartOfAccountsCode" with
* "organizationOwnerChartOfAccountsCode"
*
* @param fieldConversions the original field conversions
* @return the fixed field conversions
*/
protected String fixProblematicField(String problemChildField) {
if (StringUtils.isBlank(problemChildField)) {
return problemChildField;
}
return problemChildField.replace(CamsPropertyConstants.Asset.ORGANIZATION_OWNER_ACCOUNTS_COA_CODE, CamsPropertyConstants.Asset.ORGANIZATION_OWNER_CHART_OF_ACCOUNTS_CODE);
}
@Override
protected List<? extends BusinessObject> getSearchResultsHelper(Map<String, String> fieldValues, boolean unbounded) {
// perform the lookup on the asset representative first
String principalName = fieldValues.get(CamsPropertyConstants.Asset.REP_USER_AUTH_ID);
if (StringUtils.isNotBlank(principalName)) {
Principal principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName(principalName);
if (principal == null) {
return Collections.EMPTY_LIST;
}
// place the universal ID into the fieldValues map and remove the dummy attribute
fieldValues.put(CamsPropertyConstants.Asset.REPRESENTATIVE_UNIVERSAL_IDENTIFIER, principal.getPrincipalId());
fieldValues.remove(CamsPropertyConstants.Asset.REP_USER_AUTH_ID);
}
return super.getSearchResultsHelper(fieldValues, unbounded);
}
}