/* * $Id$ * * Authors: * Jeff Buchbinder <jeff@freemedsoftware.org> * * REMITT Electronic Medical Information Translation and Transmission * Copyright (C) 1999-2014 FreeMED Software Foundation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.remitt.plugin.eligibility; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Stub; import org.apache.log4j.Logger; import org.remitt.prototype.EligibilityInterface; import org.remitt.prototype.EligibilityParameter; import org.remitt.prototype.EligibilityResponse; import org.remitt.prototype.EligibilityStatus; import org.remitt.prototype.EligibilitySuccessCode; import org.remitt.server.Configuration; import WebServices.GatewayEDI.Eligibility; import WebServices.GatewayEDI.EligibilityLocator; import WebServices.GatewayEDI.EligibilitySoap; import WebServices.GatewayEDI.MyNameValue; import WebServices.GatewayEDI.SuccessCode; import WebServices.GatewayEDI.WSEligibilityInquiry; import WebServices.GatewayEDI.WSEligibilityResponse; import WebServices.GatewayEDI.WSResponseDataType; public class GatewayEDIEligibility implements EligibilityInterface { static final Logger log = Logger.getLogger(GatewayEDIEligibility.class); @Override public String getPluginName() { return "GatewayEDIEligibility"; } @Override public Double getPluginVersion() { return 0.1; } @Override public EligibilityResponse checkEligibility(String userName, Map<EligibilityParameter, String> values, boolean resubmission, Integer jobId) throws Exception { // Make a service Eligibility service = new EligibilityLocator(); EligibilityResponse er = new EligibilityResponse(); // Now use the service to get a stub which implements the SDI. EligibilitySoap port = null; try { port = service.getEligibilitySoap(); } catch (ServiceException e) { log.error(e); er.setStatus(EligibilityStatus.SERVER_ERROR); return er; } List<MyNameValue> params = new ArrayList<MyNameValue>(); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_NPI, "NPI"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_INSURANCE_ID, "InsuranceNum"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_INSURED_LAST_NAME, "InsuredLastName"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_INSURED_FIRST_NAME, "InsuredFirstName"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_INSURED_DOB, "InsuredDob"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_INSURED_GENDER, "InsuredGender"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_INSURED_STATE, "InsuredState"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_INSURED_SSN, "InsuredSsn"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_DEPENDENT_LAST_NAME, "DependentLastName"); addNameValue( params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_DEPENDENT_FIRST_NAME, "DependentFirstName"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_DEPENDENT_DOB, "DependentDob"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_DEPENDENT_GENDER, "DependentGender"); addNameValue( params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_DEPENDENT_RELATIONSHIP, "DependentRelationshipCode"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_SERVICE_TYPE, "ServiceTypeCode"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_CARD_ISSUE_DATE, "CardIssueDate"); addNameValue(params, values, EligibilityParameter.ELIGIBILITY_PARAMETER_GROUP_NUMBER, "GroupNumber"); // Set HTTP Authentication: ((Stub) service)._setProperty(Call.USERNAME_PROPERTY, Configuration .getPluginOption(this, userName, "gatewayEdiUsername")); ((Stub) service)._setProperty(Call.PASSWORD_PROPERTY, Configuration .getPluginOption(this, userName, "gatewayEdiPassword")); WSEligibilityInquiry inq = new WSEligibilityInquiry(); inq.setParameters(params.toArray(new MyNameValue[0])); inq.setResponseDataType(WSResponseDataType.Xml); WSEligibilityResponse response = null; try { response = port.doInquiry(inq); } catch (RemoteException e) { log.error(e); er.setStatus(EligibilityStatus.SERVER_ERROR); return er; } String rawResponse = response.getResponseAsRawString(); log.info(rawResponse); er.setRawResponse(rawResponse); er.setSuccessCode(getSuccessCode(response.getSuccessCode())); // Try to pass on all processing messages as well, just in case. try { er.setMessages(response.getExtraProcessingInfo().getAllMessages()); } catch (Exception ex) { log.error(ex); } if (response.getSuccessCode() == SuccessCode.Success) { er.setStatus(EligibilityStatus.OK); return er; } if (response.getSuccessCode() == SuccessCode.ValidationFailure) { er.setStatus(EligibilityStatus.BAD); return er; } if (response.getSuccessCode() == SuccessCode.PayerEnrollmentRequired) { er.setStatus(EligibilityStatus.BAD); return er; } if (response.getSuccessCode() == SuccessCode.PayerNotSupported) { er.setStatus(EligibilityStatus.SERVER_ERROR); return er; } if (response.getSuccessCode() == SuccessCode.PayerTimeout) { er.setStatus(EligibilityStatus.SERVER_ERROR); return er; } if (response.getSuccessCode() == SuccessCode.ProviderEnrollmentRequired) { er.setStatus(EligibilityStatus.BAD); return er; } if (response.getSuccessCode() == SuccessCode.SystemError) { er.setStatus(EligibilityStatus.SERVER_ERROR); return er; } er.setStatus(EligibilityStatus.SERVER_ERROR); return er; } protected void addNameValue(List<MyNameValue> dest, Map<EligibilityParameter, String> map, EligibilityParameter mapName, String name) { if (map.get(mapName) != null) { MyNameValue nv = new MyNameValue(); nv.setName(name); nv.setValue(map.get(mapName)); dest.add(nv); } } @Override public String[] getPluginConfigurationOptions() { return new String[] { "gatewayEdiUsername", "gatewayEdiPassword" }; } /** * Resolve <SuccessCode> into <EligibilitySuccessCode> * * @param s * @return */ private EligibilitySuccessCode getSuccessCode(SuccessCode s) { if (s.getValue().equalsIgnoreCase("Success")) { return EligibilitySuccessCode.SUCCESS; } if (s.getValue().equalsIgnoreCase("ValidationFailure")) { return EligibilitySuccessCode.VALIDATION_FAILURE; } if (s.getValue().equalsIgnoreCase("PayerTimeout")) { return EligibilitySuccessCode.PAYER_TIMEOUT; } if (s.getValue().equalsIgnoreCase("PayerNotSupported")) { return EligibilitySuccessCode.PAYER_NOT_SUPPORTED; } if (s.getValue().equalsIgnoreCase("SystemError")) { return EligibilitySuccessCode.SYSTEM_ERROR; } if (s.getValue().equalsIgnoreCase("PayerEnrollmentRequired")) { return EligibilitySuccessCode.PAYER_ENROLLMENT_REQUIRED; } if (s.getValue().equalsIgnoreCase("ProviderEnrollmentRequired")) { return EligibilitySuccessCode.PROVIDER_ENROLLMENT_REQUIRED; } if (s.getValue().equalsIgnoreCase("ProductRequired")) { return EligibilitySuccessCode.PRODUCT_REQUIRED; } return EligibilitySuccessCode.SYSTEM_ERROR; } }