/*******************************************************************************
* Open Behavioral Health Information Technology Architecture (OBHITA.org)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the <organization> nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
package gov.samhsa.consent2share.service.util;
import gov.samhsa.consent2share.hl7.dto.PixPatientDto;
import gov.samhsa.consent2share.service.dto.BasicPatientAccountDto;
import gov.samhsa.consent2share.service.dto.PatientProfileDto;
import gov.samhsa.consent2share.service.dto.SignupDto;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.function.Consumer;
import java.util.function.Supplier;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.util.StringUtils;
/**
* The Class TypeConverter.
*/
public class TypeConverter {
/**
* Signup dto to pix patient dto.
*
* @param signupDto
* the signup dto
* @param mrn
* the mrn
* @return the pix patient dto
*/
public static PixPatientDto signupDtoToPixPatientDto(SignupDto signupDto,
String mrn) {
PixPatientDto pixPatientDto = new PixPatientDto();
set(pixPatientDto::setBirthTimeValue,
() -> dateToDateValue(signupDto.getBirthDate()));
set(pixPatientDto::setPatientFirstName, signupDto::getFirstName);
set(pixPatientDto::setAdministrativeGenderCode,
signupDto::getGenderCode);
set(pixPatientDto::setPatientLastName, signupDto::getLastName);
set(pixPatientDto::setSsn,
() -> formatSsn(signupDto.getSocialSecurityNumber()));
set(pixPatientDto::setIdExtension, () -> mrn);
return pixPatientDto;
}
/**
* Basic patient account dto to pix patient dto.
*
* @param basicPatientAccountDto
* the basic patient account dto
* @param mrn
* the mrn
* @return the pix patient dto
*/
public static PixPatientDto basicPatientAccountDtoToPixPatientDto(
BasicPatientAccountDto basicPatientAccountDto, String mrn) {
PixPatientDto pixPatientDto = new PixPatientDto();
set(pixPatientDto::setAdministrativeGenderCode,
basicPatientAccountDto::getAdministrativeGenderCode);
set(pixPatientDto::setBirthTimeValue,
() -> dateToDateValue(basicPatientAccountDto.getBirthDate()));
set(pixPatientDto::setPatientEmailHome,
basicPatientAccountDto::getEmail);
set(pixPatientDto::setPatientFirstName,
basicPatientAccountDto::getFirstName);
set(pixPatientDto::setPatientLastName,
basicPatientAccountDto::getLastName);
set(pixPatientDto::setSsn,
() -> formatSsn(basicPatientAccountDto
.getSocialSecurityNumber()));
set(pixPatientDto::setIdExtension, () -> mrn);
return pixPatientDto;
}
/**
* Patient profile dto to pix patient dto.
*
* @param patientProfileDto
* the patient profile dto
* @param mrn
* the mrn
* @return the pix patient dto
*/
public static PixPatientDto patientProfileDtoToPixPatientDto(
PatientProfileDto patientProfileDto, String mrn) {
PixPatientDto pixPatientDto = new PixPatientDto();
set(pixPatientDto::setAddrCity, patientProfileDto::getAddressCity);
set(pixPatientDto::setAddrPostalCode,
patientProfileDto::getAddressPostalCode);
set(pixPatientDto::setAddrState, patientProfileDto::getAddressStateCode);
set(pixPatientDto::setAddrStreetAddressLine,
patientProfileDto::getAddressStreetAddressLine);
set(pixPatientDto::setAdministrativeGenderCode,
patientProfileDto::getAdministrativeGenderCode);
set(pixPatientDto::setBirthTimeValue,
() -> dateToDateValue(patientProfileDto.getBirthDate()));
set(pixPatientDto::setIdExtension, () -> mrn);
set(pixPatientDto::setMaritalStatusCode, () -> patientProfileDto
.getMaritalStatusCode().getCode());
set(pixPatientDto::setPatientEmailHome, patientProfileDto::getEmail);
set(pixPatientDto::setPatientFirstName, patientProfileDto::getFirstName);
set(pixPatientDto::setPatientLastName, patientProfileDto::getLastName);
set(pixPatientDto::setSsn,
() -> formatSsn(patientProfileDto.getSocialSecurityNumber()));
set(pixPatientDto::setTelecomValue,
patientProfileDto::getTelephoneTelephone);
return pixPatientDto;
}
/**
* Date to date value.
*
* @param date
* the date
* @return the string
*/
public static String dateToDateValue(Date date) {
return new SimpleDateFormat("yyyyMMdd").format(date);
}
/**
* Format ssn.
*
* @param ssn
* the ssn
* @return the string
*/
public static String formatSsn(String ssn) {
if (StringUtils.hasText(ssn) && !ssn.contains("-") && ssn.length() == 9
&& NumberUtils.isNumber(ssn)) {
StringBuilder builder = new StringBuilder();
builder.append(ssn.substring(0, 3));
builder.append("-");
builder.append(ssn.substring(3, 5));
builder.append("-");
builder.append(ssn.substring(5));
ssn = builder.toString();
}
return ssn;
}
/**
* Sets the.
*
* @param consumer
* the consumer
* @param supplier
* the supplier
*/
private static void set(Consumer<String> consumer, Supplier<String> supplier) {
consumer.accept(StringUtils.hasText(supplier.get()) ? supplier.get()
: " ");
}
}