Summary Table

Categories Total Count
PII 0
URL 0
DNS 0
EKL 0
IP 0
PORT 0
VsID 0
CF 0
AI 0
VPD 0
PL 0
Other 0

File Content

package gov.va.med.ars.service.impl;

import java.math.BigInteger;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

import gov.va.med.ars.dao.ars.ClaimContactRepository;
import gov.va.med.ars.dao.ars.ClaimSvcLinesRepository;
import gov.va.med.ars.dao.ars.HccsCdRepository;
import gov.va.med.ars.dao.ars.IClaimSubmissionRepository;
import gov.va.med.ars.dao.ars.LoincCdRepository;
import gov.va.med.ars.dao.ars.LoincModCdRepository;
import gov.va.med.ars.dao.ars.RfaiLookupRepository;
import gov.va.med.ars.exceptions.GenericException;
import gov.va.med.ars.model.response.Rfai277SubmissionResponse;
import gov.va.med.ars.model.response.RfaiAttachmentResponse;
import gov.va.med.ars.model.response.RfaiLineItemResponse;
import gov.va.med.ars.model.response.RfaiRelatedItemResponse;
import gov.va.med.ars.service.IRfaiViewSubmissionService;
import gov.va.med.domain.ars.ClaimCodeBridge;
import gov.va.med.domain.ars.ClaimSubmission;
import gov.va.med.domain.ars.ClaimSvcLines;

@Service
public class RfaiViewSubmissionServiceImpl implements IRfaiViewSubmissionService {

@Autowired
IClaimSubmissionRepository claimSubRepo;

@Autowired
HccsCdRepository hccsRepo;

@Autowired
LoincCdRepository loincRepo;

@Autowired
LoincModCdRepository loincModRepo;

@Autowired
RfaiLookupRepository rfaiRepository;

@Autowired
ClaimSvcLinesRepository claimSvcLinesRepository;

@Autowired
ClaimContactRepository claimContactRepository;

final Logger logger = LogManager.getLogger(RfaiViewSubmissionServiceImpl.class);
DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");

@Override
public Rfai277SubmissionResponse getRfaiSubmissionResults(BigInteger submissionId) throws GenericException {

logger.info("Hitting getRfaiSubmissionResults");
Rfai277SubmissionResponse rfaiResponse = new Rfai277SubmissionResponse();
ClaimSubmission claimSubmission = new ClaimSubmission();

// get claim information by submission id and related submissions for
// claim id
try {
claimSubmission = rfaiRepository.getClaimSubInfo(submissionId);

BigInteger submissionLong = claimSubmission.getSubmissionid();
// if submission id then populate response object and return data
if (claimSubmission != null && submissionLong != null) {

// get the Service Line Items
// added a new call since ServiceLines are not a mandatory
// fields to be filled in the db
List<ClaimSvcLines> claimSvcLines = claimSvcLinesRepository.findAllByclaimSubmission(claimSubmission);

// get related submissions for claim id
List<RfaiRelatedItemResponse> rfaiRelatedItemResponses = getRfaiRelatedItemResponses(claimSubmission);

// get attachment details for claim id
List<RfaiAttachmentResponse> rfaiAttachmentResponses = getRfaiAttachmentResponses(claimSubmission,
claimSvcLines);

// get service line items
List<RfaiLineItemResponse> rfaiLineItemResponse = getRfaiServiceLineItemResponse(claimSvcLines);
// populate rfaiResponse object

/*
* if(claimSubmission.getPayerConfig()!=null){
* if(claimSubmission.getPayerConfig().getPayerIdentifierDesc()!
* =null){
* rfaiResponse.setPayerName(claimSubmission.getPayerConfig().
* getPayerIdentifierDesc()); }
* if(claimSubmission.getPayerConfig().getPayerIdentifier()!=
* null){
* rfaiResponse.setPayerId(claimSubmission.getPayerConfig().
* getPayerIdentifier() ); } }else{
*/
rfaiResponse.setPayerName(claimSubmission.getHl1nm103pyrNm());
rfaiResponse.setPayerId(claimSubmission.getHl1nm109pyrId());
// }
rfaiResponse.setInformationReceiver(claimSubmission.getHl2nm103infRcvr());
if (claimSubmission.getDtp203responseduedate() != null) {
rfaiResponse.setResponseDate(formatDate(claimSubmission.getDtp203responseduedate()));
}
rfaiResponse.setBillingProvider(claimSubmission.getHl3nm103svcbillprvnm());
rfaiResponse.setProviderNpi(claimSubmission.getHl3nm109prvnpi());
rfaiResponse.setProviderTin(claimSubmission.getHl2nm109svcprvtin());
rfaiResponse.setPatientLastname(claimSubmission.getHl4nm103ptlstnm());
rfaiResponse.setPatientFirstName(claimSubmission.getHl4nm104ptftnm());
rfaiResponse.setPatientIdentifier(claimSubmission.getHl4nm109ptid());
rfaiResponse.setPatientcontrolNumber(claimSubmission.getRef102ptctrlnmbr());
rfaiResponse.setPayerClaimControlNumber(claimSubmission.getTrn02pyrclmctrlnmbr());
rfaiResponse.setBillType(claimSubmission.getRef202billtype());
rfaiResponse.setClaimId(claimSubmission.getTrn02claimIndex());
rfaiResponse.setContactInfo(claimSubmission.getClaimContact().getContactemail());
rfaiResponse.setClearingHouseId(claimSubmission.getRef402clrnghsid());
rfaiResponse.setMedicalRecordNumber(claimSubmission.getRef302medrecnmbr());
rfaiResponse.setRfaiRelatedItemResponse(rfaiRelatedItemResponses);
rfaiResponse.setRfaiAttachmentResponse(rfaiAttachmentResponses);
rfaiResponse.setSubmittedBy(claimSubmission.getClaimContact().getSubmittedby());
if (claimSubmission.getDatesubmitted() != null) {
rfaiResponse.setRfaiSubmissionDate(formatDate(claimSubmission.getDatesubmitted()));
}
rfaiResponse.setRfaiStatus(claimSubmission.getSubmissionStatus());
rfaiResponse.setRfaiLineItemResponse(rfaiLineItemResponse);

Date serviceFromDateClaim = claimSubmission.getDtp103svcfrmdt();
Date serviceToDateClaim = claimSubmission.getDtp103svctodt();

if (claimSvcLines.isEmpty()) {
if (serviceFromDateClaim != null) {
rfaiResponse.setServiceFromDate(dateFormat.format(serviceFromDateClaim));
}

if (serviceToDateClaim != null) {
rfaiResponse.setServiceToDate(dateFormat.format(serviceToDateClaim));
}
} else {
setRfaiResponseServiceFromDate(rfaiResponse, claimSvcLines, serviceFromDateClaim);
setRfaiResponseServiceToDate(rfaiResponse, claimSvcLines, serviceToDateClaim);
}

} else {
throw new GenericException("ERR", "Claim Submission not found", HttpStatus.BAD_REQUEST);
}
} catch (Exception e) {
logger.error(
"Rfai277SubmissionServiceImpl:getRfai277SubmissionResults() exception occured " + e.getMessage());
throw e;
}
return rfaiResponse;
}

private void setRfaiResponseServiceToDate(Rfai277SubmissionResponse rfaiResponse, List<ClaimSvcLines> claimSvcLines,
Date serviceToDateClaim) {
// Date maxServiceToDateSvcLine = null;

Date svcToDateBegin = null;
for (ClaimSvcLines cl : claimSvcLines) {
Date svcToDate = null;
if (cl.getDtp03svctodt() != null) {
svcToDate = cl.getDtp03svctodt();
} else {
svcToDate = cl.getDtp03svcfrmdt();
}
if (svcToDateBegin == null) {
svcToDateBegin = svcToDate;
} else {
if (svcToDate.after(svcToDateBegin)) {
svcToDateBegin = svcToDate;
}
}
}
rfaiResponse.setServiceToDate(dateFormat.format(svcToDateBegin));
// all service line to date fields may be null, so I need to check for
// that.
// if (claimSvcLines.stream().filter(c -> c.getDtp03svctodt() !=
// null).collect(Collectors.toList()).size() != 0) {
// maxServiceToDateSvcLine = claimSvcLines.stream().filter(c ->
// c.getDtp03svctodt() != null)
// .map(ClaimSvcLines::getDtp03svctodt).max(Date::compareTo).get();
// }

// if serviceToDateClaim is later than maxServiceToDateSvcLine
// then rfaiResponse's serviceToDate is serviceToDateClaim
// eise it's maxServiceToDateSvcLine
// if (serviceToDateClaim != null && maxServiceToDateSvcLine != null) {
// if (serviceToDateClaim.compareTo(maxServiceToDateSvcLine) >= 0) {
// rfaiResponse.setServiceToDate(dateFormat.format(serviceToDateClaim));
// } else {
// rfaiResponse.setServiceToDate(dateFormat.format(maxServiceToDateSvcLine));
// }
// }

// ^ is XOR
// if exactly one of the dates is null, then pick the one that isn't
// null
// if (serviceToDateClaim == null ^ maxServiceToDateSvcLine == null) {
// Date notNullToDate = serviceToDateClaim != null ? serviceToDateClaim
// : maxServiceToDateSvcLine;
// rfaiResponse.setServiceToDate(dateFormat.format(notNullToDate));
// }
}

private void setRfaiResponseServiceFromDate(Rfai277SubmissionResponse rfaiResponse,
List<ClaimSvcLines> claimSvcLines, Date serviceFromDateClaim) {

Date svcFromDateBegin = null;
for (ClaimSvcLines cl : claimSvcLines) {
Date svcFromDate = null;
if (cl.getDtp03svcfrmdt() != null) {
svcFromDate = cl.getDtp03svcfrmdt();
}
if (svcFromDateBegin == null) {
svcFromDateBegin = cl.getDtp03svcfrmdt();
} else {
if (svcFromDate != null && svcFromDate.before(svcFromDateBegin)) {
svcFromDateBegin = svcFromDate;
}
}
}
rfaiResponse.setServiceFromDate(dateFormat.format(svcFromDateBegin));
// Date minServiceFromDateSvcLine = claimSvcLines.stream().filter(c ->
// c.getDtp03svcfrmdt() != null)
// .map(ClaimSvcLines::getDtp03svcfrmdt).min(Date::compareTo).get();

// if serviceFromDateClaim is earlier than minServiceFromDateSvcLine
// then rfaiResponse's serviceFromDate is serviceFromDateClaim
// eise it's minServiceFromDateSvcLine
// if (serviceFromDateClaim != null && minServiceFromDateSvcLine !=
// null) {
// if (serviceFromDateClaim.compareTo(minServiceFromDateSvcLine) <= 0) {
// rfaiResponse.setServiceFromDate(dateFormat.format(serviceFromDateClaim));
// } else {
// rfaiResponse.setServiceFromDate(dateFormat.format(minServiceFromDateSvcLine));
// }
// }

// ^ is XOR
// if exactly one of the dates is null, then pick the one that isn't
// null
// if (serviceFromDateClaim == null ^ minServiceFromDateSvcLine == null)
// {
// Date notNullFromDate = serviceFromDateClaim != null ?
// serviceFromDateClaim : minServiceFromDateSvcLine;
// rfaiResponse.setServiceFromDate(dateFormat.format(notNullFromDate));
// }
}

private List<RfaiLineItemResponse> getRfaiServiceLineItemResponse(List<ClaimSvcLines> claimSvcLines) {
List<RfaiLineItemResponse> rfaiSvcLines = new ArrayList<>();
if (claimSvcLines != null && claimSvcLines.size() > 0) {
for (ClaimSvcLines claimSvcLine : claimSvcLines) {
RfaiLineItemResponse lineResponse = new RfaiLineItemResponse();
lineResponse.setServiceLineId(Long.valueOf(claimSvcLine.getRef02svclnnmbr()));
if (claimSvcLine.getDtp03svcfrmdt() != null) {
lineResponse.setServiceFrom(formatDate(claimSvcLine.getDtp03svcfrmdt()));
}
if (claimSvcLine.getDtp03svctodt() != null) {
lineResponse.setServiceTo(formatDate(claimSvcLine.getDtp03svctodt()));
}
lineResponse.setProcedureCode(claimSvcLine.getSvc01proccd());
lineResponse.setRevenueCode(claimSvcLine.getSvc01revcd());
lineResponse.setModifiers(claimSvcLine.getSvc01mod());
lineResponse.setChargeAmount(claimSvcLine.getSvc02chrgamt());
rfaiSvcLines.add(lineResponse);
rfaiSvcLines.sort((RfaiLineItemResponse l1, RfaiLineItemResponse l2) -> l1.getServiceLineId()
.compareTo(l2.getServiceLineId()));
}
}
return rfaiSvcLines;
}

private List<RfaiRelatedItemResponse> getRfaiRelatedItemResponses(ClaimSubmission claimSubmission)
throws GenericException {

final Logger logger = LogManager.getLogger(RfaiViewSubmissionServiceImpl.class);

List<RfaiRelatedItemResponse> rfaiRelatedItemResponses = new ArrayList<>();

try {
// get all related claims by claim id from submission
List<ClaimSubmission> relatedSubmissions = rfaiRepository
.findBytrn02claimIndex(claimSubmission.getTrn02claimIndex());

// loop through related submissions found to populate related item
// response object
if (relatedSubmissions.size() > 0) {
for (ClaimSubmission cs : relatedSubmissions) {
if (cs.getSubmissionid() != claimSubmission.getSubmissionid()) {
RfaiRelatedItemResponse rfaiRelatedItemResponse = new RfaiRelatedItemResponse();
rfaiRelatedItemResponse.setSubmissionId(cs.getSubmissionid());
rfaiRelatedItemResponse.setClaimId(cs.getTrn02claimIndex());
rfaiRelatedItemResponse.setProviderName(cs.getHl3nm103svcbillprvnm());
rfaiRelatedItemResponse.setProviderNPI(cs.getHl3nm109prvnpi());
rfaiRelatedItemResponse.setProviderTin(cs.getHl2nm109svcprvtin());
rfaiRelatedItemResponse.setPatientControlNumber(cs.getRef102ptctrlnmbr());
rfaiRelatedItemResponse.setMedicalRecordNumber(cs.getRef302medrecnmbr());
if (cs.getDatesubmitted() != null) {
rfaiRelatedItemResponse.setDateSubmitted(dateFormat.format(cs.getDatesubmitted()));
}
if (cs.getDtp203responseduedate() != null) {
rfaiRelatedItemResponse
.setRequiredResponseDate(dateFormat.format(cs.getDtp203responseduedate()));
}

rfaiRelatedItemResponses.add(rfaiRelatedItemResponse);
}
}
}
} catch (Exception e) {
logger.error(
"Rfai277SubmissionServiceImpl:getRfaiRelatedItemResponses() exception occured " + e.getMessage());
throw e;
}
return rfaiRelatedItemResponses;
}

private List<RfaiAttachmentResponse> getRfaiAttachmentResponses(ClaimSubmission claimSubmission,
List<ClaimSvcLines> claimSvcLines) throws GenericException {

List<RfaiAttachmentResponse> rfaiAttachmentResponses = new ArrayList<>();

// Create the attachment response object
Set<ClaimCodeBridge> setClaimCode = claimSubmission.getClaimCodeBridges();
for (ClaimCodeBridge ccb : setClaimCode) {
RfaiAttachmentResponse rfaiAttachmentResponse = new RfaiAttachmentResponse();

if (ccb.getHccsCd() != null)
rfaiAttachmentResponse.setStatusCode(ccb.getHccsCd().getStchccstatuscatCd());
if (ccb.getLoincCd() != null)
rfaiAttachmentResponse.setLoincCodes(ccb.getLoincCd().getStcloincCd());
if (ccb.getLoincModCdByLoincMod1Id() != null) {
rfaiAttachmentResponse.setLoincModCodes1(ccb.getLoincModCdByLoincMod1Id().getStcloincCdMod());
}
if (ccb.getLoincModCdByLoincMod2Id() != null) {
rfaiAttachmentResponse.setLoincModCodes2(ccb.getLoincModCdByLoincMod2Id().getStcloincCdMod());
}
if (ccb.getId().getSubmissionsvclineid() == 0) {
rfaiAttachmentResponse.setClaimLevel("CLAIM");
} else {
rfaiAttachmentResponse.setClaimLevel("LINE");
for (ClaimSvcLines claimSvcLine : claimSvcLines) {
if (claimSvcLine.getSubmissionsvclineid() == ccb.getId().getSubmissionsvclineid()) {
rfaiAttachmentResponse.setServiceLine(Long.valueOf(claimSvcLine.getRef02svclnnmbr()));
}
}
}
rfaiAttachmentResponse.setAttachments("");
rfaiAttachmentResponses.add(rfaiAttachmentResponse);
}
return rfaiAttachmentResponses;
}

private String formatDate(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
return dateFormat.format(date);
}
}