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
/****************************************************
Descrption: Created the class to parse 277CA file
to produce the required data and save in database
for further processing. Logic mainly follows back track
method.
Date Modified: 06/28/2018 Date Created: 06/14/2018
*****************************************************/
package gov.va.med.ars.service.impl;
import java.sql.Date;
import java.text.ParseException;
import java.time.DateTimeException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import gov.va.med.ars.dao.ars.ICstat277caLoggingRepository;
import gov.va.med.ars.dao.ars.IHeaderRecord277CARepository;
import gov.va.med.ars.model.ParserResult;
import gov.va.med.ars.model.request.Parse277CARequest;
import gov.va.med.ars.model.response.CSTATResponse;
import gov.va.med.ars.service.ICstatGeneratorService;
import gov.va.med.ars.service.IParse277CAServiceImpl;
import gov.va.med.ars.util.CA277SegmentList;
import gov.va.med.ars.util.Context;
import gov.va.med.ars.util.Segment;
import gov.va.med.domain.ars.ClaimLevelRecordsDetail;
import gov.va.med.domain.ars.ClaimStatusRecordDetail;
import gov.va.med.domain.ars.Cstat277caLogging;
import gov.va.med.domain.ars.HeaderRecordDetail;
import gov.va.med.domain.ars.LineLevelRecordsDetail;
import gov.va.med.domain.ars.TrailerRecordDetail;
@Service
public class Parse277CAServiceImpl implements IParse277CAServiceImpl {
private static final Logger logger = LogManager.getLogger(Parse277CAServiceImpl.class);
@Autowired
private IHeaderRecord277CARepository headerRecord277CARepository;
@Autowired
ICstatGeneratorService cstatService;
@Autowired
ICstat277caLoggingRepository loggingRepository;
@Autowired
IHeaderRecord277CARepository headerRecordDetailRepository;
HashMap<String, String> hm;
private StringBuilder code = new StringBuilder();
private int index;
private String emdeonStatus;
private ClaimLevelRecordsDetail claimLevelRecordsDetail;
private List<ClaimLevelRecordsDetail> claimLevelRecordsDetailList;
private List<LineLevelRecordsDetail> lineLevelRecordsDetailSet;
private HeaderRecordDetail headerRecordDetail;
private TrailerRecordDetail trailerRecordDetail;
private List<ClaimStatusRecordDetail> claimLevelStatusSet;
private List<ClaimStatusRecordDetail> lineLevelStatusList;
private List<Boolean> ClaimLineValidations = new ArrayList<>();
private int svcIndex = 0;
ParserResult parserResult;
private int claimCount, successfulClaimCount;
@Override
public boolean process277CABatch(Parse277CARequest parse277caRequest) {
parse277caRequest.setCa277String(parse277caRequest.getCa277String().replaceAll("\n", ""));
parse277caRequest.setCa277String(parse277caRequest.getCa277String().replaceAll("\r", ""));
// Execute the Parser
boolean parserResultList = parse(parse277caRequest);
logger.info("Returned From Parse Method");
return parserResultList;
}
// parse the initial incoming segment
public boolean parse(Parse277CARequest request) {
String fileName = request.getOriginalFileName();
String headerDateTimeString = processDateToStr();
if (headerDateTimeString == null) {
logger.error("Error in attempting to format a programmatically generated date. Exiting parsing of "
+ request.getOriginalFileName());
return false;
}
Cstat277caLogging loggingObject;
parserResult = new ParserResult();
final short fileGrpSeqAndCount = 1;
logger.info("Started Parsing");
Context context = new Context();
context.setElementSeparator('*');
context.setSegmentSeparator('~');
Long batchId = Long.valueOf(headerDateTimeString);
java.util.Date dateReceived = new java.util.Date();
if (!(request.getCa277String() == null) && !(request.getCa277String().isEmpty())) {
if (batchId == null) {
logger.info("Could not generate the Batch ID required for logging the process");
return false;
}
logger.info("The Batch Id is " + batchId);
CA277SegmentList ca277AllSegment = new CA277SegmentList(context);
logger.info("Seperate each segment");
ca277AllSegment.addSegment(request.getCa277String());
if (ca277AllSegment.getFileGrpCount() == 0) {
parserResult.setSuccessStatus("REJECT");
loggingObject = new Cstat277caLogging(batchId, dateReceived, fileName, new Long(0), new Long(0),
"ECAMS", "REJECT");
loggingRepository.save(loggingObject);
logger.info("277CA input is not parsed, Rejected: ST/SE segments had misplaced");
return false;
}
// Generate the BATCH_ID (Sequence Next number:
// BATCH_ID_GENERATOR_SEQ)
// creating new object of header
headerRecordDetail = new HeaderRecordDetail();
trailerRecordDetail = new TrailerRecordDetail();
claimCount = 0;
successfulClaimCount = 0;
// Seperating the HL sections accordingly
List<CA277SegmentList> listOfHLs = new ArrayList<>();
CA277SegmentList tempListHL = new CA277SegmentList(context);
int listSz = ca277AllSegment.getSegments().size();
Boolean stFlag = false;
String locateBHT = null;
System.out.println(ca277AllSegment.getSegments().subList(2, listSz - 2));
hm = new HashMap<String, String>();
if (ca277AllSegment.getSegment(0).getElement(0).equalsIgnoreCase("ISA")
&& ca277AllSegment.getSegment(1).getElement(0).equalsIgnoreCase("GS")
&& ca277AllSegment.getSegment(listSz - 1).getElement(0).equalsIgnoreCase("IEA")
&& ca277AllSegment.getSegment(listSz - 2).getElement(0).equalsIgnoreCase("GE")) {
List<String> segmentsStSeResults = new ArrayList<>();
headerRecordDetail = new HeaderRecordDetail();
headerRecordDetail.setFileGrpSeqnum(fileGrpSeqAndCount);
headerRecordDetail.setBatchId(headerDateTimeString);
headerRecordDetail.setFileGrpCount(fileGrpSeqAndCount);
headerRecordDetail.setRecid("HDR");
headerRecordDetail.setFiletype("CSTAT");
headerRecordDetail.setVersioncode("03");
headerRecordDetail.setReleasecode("00");
headerRecordDetail.setLoadtype('I');
headerRecordDetail.setPudid(headerDateTimeString + "_VAFEE");
for (Segment s : ca277AllSegment.getSegments().subList(2, listSz - 2)) {
// starting to group each HL sections
if (s.getElement(0).equalsIgnoreCase("ST")) {
if (!stFlag) {
listOfHLs = new ArrayList<>();
trailerRecordDetail = new TrailerRecordDetail();
/*
* claimCount = 0; successfulClaimCount = 0;
*/
parserResult = new ParserResult();
hm = new HashMap<String, String>();
stFlag = true;
} else {
logger.info("Without closing loop SE segment, Start of another ST loop is invalid");
}
} else if (s.getElement(0).equalsIgnoreCase("HL")) {
if (tempListHL.getSegments().size() > 0) {
listOfHLs.add(tempListHL);
}
// tracking of HL sections by their number and the code
// they
// carry
hm.put(s.getElement(1), s.getElement(3));
tempListHL = new CA277SegmentList(context);
tempListHL.addSegment(s);
} else if ("BHT".equalsIgnoreCase(s.getElement(0))) {
if ("ST".equalsIgnoreCase(locateBHT)) {
try {
processBHT(s);
} catch (ParseException e) {
logger.info("GO gone");
return false;
}
} else {
logger.info("BHT is misplaced, Need to be after ST segment");
}
} else if (s.getElement(0).equalsIgnoreCase("SE")) {
if (stFlag) {
if (tempListHL.getSegments().size() > 0) {
listOfHLs.add(tempListHL);
tempListHL = new CA277SegmentList(context);
}
// if (listOfHLs.size() > 0) {
//
// listOfSTSE.add(listOfHLs);
// }
stFlag = false;
} else {
logger.info("Without ST segment, Presense of SE segment is not valid");
}
logger.info("Total Number of hm " + hm.size());
boolean eachHLFlag = processEachHL(listOfHLs);
parserResult.setCA277ClaimCount(claimCount);
parserResult.setSuccessfulCount(successfulClaimCount);
int difference = claimCount - successfulClaimCount;
if (claimCount == 0 || !eachHLFlag || successfulClaimCount == 0) {
parserResult.setSuccessStatus("REJECT");
segmentsStSeResults.add("REJECT");
} else if (difference == 0) {
parserResult.setSuccessStatus("SUCCESS");
segmentsStSeResults.add("SUCCESS");
} else {
parserResult.setSuccessStatus("PARTIAL");
segmentsStSeResults.add("PARTIAL");
}
logger.info("PARSER RESULT : " + parserResult.getCA277ClaimCount() + "\n"
+ parserResult.getSuccessfulCount() + "\n" + parserResult.getSuccessStatus());
// logger.info("Total Number of HL's " +
// listOfHLs.size() + listOfHLs);
} else if (s.getElement(0).equalsIgnoreCase("ISA") || s.getElement(0).equalsIgnoreCase("IEA")
|| s.getElement(0).equalsIgnoreCase("GS") || s.getElement(0).equalsIgnoreCase("GE")) {
logger.info("Input do not meet the expectation");
parserResult.setCA277ClaimCount(0);
parserResult.setSuccessfulCount(0);
parserResult.setSuccessStatus("REJECT");
// return false;
} else {
tempListHL.addSegment(s);
}
locateBHT = s.getElement(0);
}
if (ClaimLineValidations.contains(true)) {
if (validateHeader()) {
headerRecordDetail.setTrailerRecordDetails(trailerRecordDetail);
// setting trailer values and saving
trailerRecordDetail.setRecid("TRLR");
trailerRecordDetail.setHeaderRecordDetail(headerRecordDetail);
headerRecord277CARepository.saveAndFlush(headerRecordDetail);
// trailerRecord277CARepository.save(trailerRecordDetail);
} else {
logger.info("Validation with Header Record Failed, Novalues are inserted");
logToLoggingTableFailingEntireFile(batchId, dateReceived, fileName);
return false;
}
generateCstatFile(fileName, batchId, dateReceived, segmentsStSeResults);
} else {
logger.info("Validating the transaction sets failed");
logToLoggingTableFailingEntireFile(batchId, dateReceived, fileName);
}
} else {
logger.info(
"Input must have ISA/GS as their initial segment and GE/IEA as their ending segments, Missing segments will not parse 277CA");
logToLoggingTableFailingEntireFile(batchId, dateReceived, fileName);
}
} else {
logger.info("Not a valid input");
logToLoggingTableFailingEntireFile(batchId, dateReceived, fileName);
// return parserResult;
}
resetClassVariables();
return true;
}
private void logToLoggingTableFailingEntireFile(Long batchId, java.util.Date dateReceived, String fileName) {
loggingRepository.save(new Cstat277caLogging(batchId, dateReceived, null, fileName, null,
new Long(parserResult.getCA277ClaimCount()), new Long(0), null, "ECAMS", "REJECT"));
}
private void resetClassVariables() {
hm = new HashMap<>();
code = new StringBuilder();
index = 0;
emdeonStatus = "";
claimLevelRecordsDetail = new ClaimLevelRecordsDetail();
claimLevelRecordsDetailList = new ArrayList<>();
lineLevelRecordsDetailSet = new ArrayList<>();
headerRecordDetail = new HeaderRecordDetail();
trailerRecordDetail = new TrailerRecordDetail();
claimLevelStatusSet = new ArrayList<>();
lineLevelStatusList = new ArrayList<>();
ClaimLineValidations = new ArrayList<>();
svcIndex = 0;
parserResult = new ParserResult();
claimCount = 0;
successfulClaimCount = 0;
}
private void generateCstatFile(String fileName, Long batchId, java.util.Date dateReceived,
List<String> segmentsStSeResults) {
Cstat277caLogging loggingObject;
if (segmentsStSeResults.contains("SUCCESS") || segmentsStSeResults.contains("PARTIAL")) {
logger.info("Done parsing for the given input lets call CSTAT Generator");
CSTATResponse cstatResponse = cstatService.buildCSTAT(batchId);
// CSTATResponse cstatResponse =
// cstatService.buildCSTAT(headerRecordDetail.getBatchId());
// Log into the logger table
// if cstatResponse.getIsGenerated() == true, ONLY
// if then, it will
// have other information
// if cstatResponse.getIsGenerated == false, it will
// have no other
// information in it.
if (!cstatResponse.getIsGenerated()) {
loggingObject = new Cstat277caLogging(batchId, dateReceived, fileName,
new Long(parserResult.getCA277ClaimCount()), new Long(parserResult.getSuccessfulCount()),
"ECAMS", "PARTIAL");
loggingRepository.save(loggingObject);
logger.info("CSTAT Generation Failed");
// return false;
} else {
loggingObject = new Cstat277caLogging(batchId, dateReceived,
Date.valueOf(cstatResponse.getDateCreated()), fileName, cstatResponse.getCstatFileName(),
new Long(parserResult.getCA277ClaimCount()), new Long(parserResult.getSuccessfulCount()),
new Long(cstatResponse.getLineCount()), "ECAMS", parserResult.getSuccessStatus());
loggingRepository.save(loggingObject);
logger.info("CSTAT Generation Success");
}
} else {
loggingObject = new Cstat277caLogging(batchId, dateReceived, fileName,
Long.valueOf(parserResult.getCA277ClaimCount()), new Long(0), "ECAMS", "REJECT");
loggingRepository.save(loggingObject);
logger.info("277CA input was not parsed, it is rejected");
// return false;
}
}
// process each HL sections
private boolean processEachHL(List<CA277SegmentList> listOfHLs) {
if (listOfHLs == null || listOfHLs.isEmpty()) {
logger.warn("No HLs found in current Transaction Set.");
claimCount++;
return false;
}
boolean flag, headerFlag = true;
// HeaderRecordDetail hrd = null;
List<Boolean> claimLevelSTCValidationList = new ArrayList<>();
Boolean lineLevelRecValidation = true;
claimLevelRecordsDetailList = new ArrayList<ClaimLevelRecordsDetail>();
for (CA277SegmentList headerSection : listOfHLs) {
logger.info("List of elements " + headerSection.getSegment(0).getElements().toString());
// Information Source Header
if (headerSection.getSegment(0).getElements().size() >= 4) {
boolean firstSegmentIsValid = firstSegmentIsValid(headerSection.getSegment(0));
if (firstSegmentIsValid) {
flag = true;
claimLevelRecordsDetail = new ClaimLevelRecordsDetail();
claimLevelStatusSet = new ArrayList<ClaimStatusRecordDetail>();
code.setLength(0);
code.append(headerSection.getSegment(0).getElement(3));
while (flag) {
switch (code.toString().toUpperCase(Locale.ENGLISH)) {
case "20":
logger.info("process 20");
flag = process20(headerSection);
if (flag) {
logger.info("Not the right 277CA file");
flag = false;
return false;
}
break;
// Information Receiver
case "21":
logger.info("process 21");
flag = process21(headerSection);
headerSection = listOfHLs.get(index);
break;
// Provider of Service
case "19":
logger.info("process 19");
flag = process19(headerSection);
headerSection = listOfHLs.get(index);
// flag = false;
break;
case "PT":
claimCount++;
logger.info("process PT");
flag = processPT(headerSection);
headerSection = listOfHLs.get(index);
this.svcIndex = 0;
break;
default:
break;
}
}
claimLevelRecordsDetail.setCstatStatus("PENDING");
claimLevelRecordsDetail.setRecid("CLM");
claimLevelRecordsDetail.setMaintenancetypecode("021");
claimLevelRecordsDetail.setLineLevelRecordsDetails(lineLevelRecordsDetailSet);
claimLevelRecordsDetail.setClaimStatusRecordDetails(claimLevelStatusSet);
claimLevelRecordsDetailList.add(claimLevelRecordsDetail);
logger.info("Parsed all, now have to save");
// header is inserted once per 277CA file
// following checks header insertion and sets both header
// and trailer constant values
if (headerFlag) {
headerFlag = false;
claimLevelRecordsDetailList = saveClaimLevelLineLevelRecords(headerRecordDetail,
claimLevelSTCValidationList, lineLevelRecValidation);
/*
* claimLevelRecordsDetailSet = new
* LinkedHashSet<>(claimLevel277CARepository.save(
* claimLevelRecordsDetailSet));
* claimLevel277CARepository.flush();
*/
List<ClaimLevelRecordsDetail> claimLevelSet = headerRecordDetail.getClaimLevelRecordsDetails();
if (claimLevelSet == null) {
claimLevelSet = new ArrayList<>();
}
claimLevelSet.addAll(claimLevelRecordsDetailList);
headerRecordDetail.setClaimLevelRecordsDetails(claimLevelSet);
/*
* List<LineLevelRecordsDetail> lineLevelSet =
* headerRecordDetail.getLineLevelRecordsDetails(); if
* (lineLevelSet == null) { lineLevelSet = new
* ArrayList<>(); }
* lineLevelSet.addAll(lineLevelRecordsDetailSet);
* headerRecordDetail.setLineLevelRecordsDetails(
* lineLevelSet);
*/
}
}
} else {
logger.info("Missing Info : HL doea not match the spec");
return false;
}
}
return true;
}
private List<ClaimLevelRecordsDetail> saveClaimLevelLineLevelRecords(HeaderRecordDetail hrd,
List<Boolean> claimLevelSTCValidationList, Boolean lineLevelRecValidation) {
List<ClaimLevelRecordsDetail> validatedClaimLevelRecordsDetailList = new ArrayList<>();
for (ClaimLevelRecordsDetail cm : claimLevelRecordsDetailList) {
try {
if (validateClaimRecord(cm)) {
// Boolean claimLevelSTCValidation = false,
// lineLevelRecValidation = true;
claimLevelRecordsDetail.setHeaderRecordDetail(hrd);
logger.info("validateClaimRecord() PASSED");
if (!lineLevelRecordsDetailSet.isEmpty()) {
Iterator<LineLevelRecordsDetail> llrdIter = lineLevelRecordsDetailSet.iterator();
while (llrdIter.hasNext() && lineLevelRecValidation) {
LineLevelRecordsDetail llrd = llrdIter.next();
if (llrd.getClaimStatusRecordDetails().size() >= 1) {
llrd.setRecid("DTL");
llrd.setHl20Nm1092100aFiPayerid(claimLevelRecordsDetail.getHl320Nm1092100aFiPayerid());
llrd.setHlptRef021kPyrclmidentnum(
claimLevelRecordsDetail.getHl3ptRef022200d1kPcidnum());
llrd.setHlptRef02D9Emdclmnum(claimLevelRecordsDetail.getHl3ptRef022200dD9Emdeoncn());
llrd.setClaimLevelRecordsDetail(claimLevelRecordsDetail);
// llrd.setHeaderRecordDetail(hrd);
logger.info("about to save each record to Line Level Records Detail table!!!");
lineLevelRecValidation = validateLineRecords(llrd);
if (lineLevelRecValidation) {
Iterator<ClaimStatusRecordDetail> iter = llrd.getClaimStatusRecordDetails()
.iterator();
while (iter.hasNext() && lineLevelRecValidation) {
ClaimStatusRecordDetail claimststrec = iter.next();
claimststrec.setRecid("STC");
claimststrec.setHl320Nm1092100aFiPayerid(
claimLevelRecordsDetail.getHl320Nm1092100aFiPayerid());
claimststrec.setHl3ptRef022200d1kPcidnum(
claimLevelRecordsDetail.getHl3ptRef022200d1kPcidnum());
if (llrd.getHlptRef02FjLnitmctrlnum() != null)
claimststrec.setHlptRef02FjLnitmctrlnum(llrd.getHlptRef02FjLnitmctrlnum());
if (emdeonStatus != null)
claimststrec.setHl21Stc1012Esc(emdeonStatus);
claimststrec.setLineLevelRecordsDetail(llrd);
if (claimLevelRecordsDetail != null)
claimststrec.setClaimLevelRecordsDetail(claimLevelRecordsDetail);
// Save to CLAIM STATUS RECORD
// Details Table.
lineLevelRecValidation = isValidClaimStatusRecord(claimststrec, "LINE");
}
} else {
logger.info("Validation with Line Level Record Detail Failed");
break;
}
} else {
lineLevelRecValidation = false;
logger.info("Line level must have at least 1 Claim line level status");
}
}
if (lineLevelRecValidation) {
logger.info("Everything good with Line Level");
claimLevelRecordsDetail.setLineLevelRecordsDetails(lineLevelRecordsDetailSet);
}
}
if (((!lineLevelRecordsDetailSet.isEmpty() && lineLevelRecValidation)
|| lineLevelRecordsDetailSet.isEmpty()) && claimLevelStatusSet.size() >= 1) {
List<ClaimStatusRecordDetail> goodClaimLevelStatusList = new ArrayList<>();
Iterator<ClaimStatusRecordDetail> iter = claimLevelStatusSet.iterator();
while (iter.hasNext()) {
ClaimStatusRecordDetail claimststrec = iter.next();
claimststrec.setRecid("STC");
claimststrec
.setHl320Nm1092100aFiPayerid(claimLevelRecordsDetail.getHl320Nm1092100aFiPayerid());
claimststrec
.setHl3ptRef022200d1kPcidnum(claimLevelRecordsDetail.getHl3ptRef022200d1kPcidnum());
if (emdeonStatus != null)
claimststrec.setHl21Stc1012Esc(emdeonStatus);
claimststrec.setClaimLevelRecordsDetail(claimLevelRecordsDetail);
boolean isGoodStatusRecord = isValidClaimStatusRecord(claimststrec, "CLAIM");
// claimLevelSTCValidationList.add(isValidClaimStatusRecord(claimststrec,
// "CLAIM"));
if (isGoodStatusRecord) {
goodClaimLevelStatusList.add(claimststrec);
}
}
if (goodClaimLevelStatusList.isEmpty()) {
logger.info("Claim level must have at least 1 valid Claim level status");
ClaimLineValidations.add(false);
continue;
}
claimLevelRecordsDetail.setClaimStatusRecordDetails(claimLevelStatusSet);
/*
* for (Boolean claimLevelSTCValidation :
* claimLevelSTCValidationList) { if
* (claimLevelSTCValidation) {
* claimLevelRecordsDetail.setHeaderRecordDetail(hrd);
* // claimLevel277CARepository.saveAndFlush(
* claimLevelRecordsDetail); } }
*/
// Add to temporary good list of claim level records
// that have passed
successfulClaimCount++;
validatedClaimLevelRecordsDetailList.add(cm);
} else {
logger.info("Claim level must have at least 1 Claim line level status");
// headerRecord277CARepository.deleteByhrecid(hrd.getHrecid());
ClaimLineValidations.add(false);
// return false;
}
} else {
logger.info("Validation with Claim Level Record Detail Failed, Not Saving Anything to db");
// headerRecord277CARepository.deleteByhrecid(hrd.getHrecid());
ClaimLineValidations.add(false);
// return false;
}
} catch (Exception e) {
logger.error("Error occured while attempting to validate Claim Level Records.", e);
ClaimLineValidations.add(false);
// return false;
}
}
ClaimLineValidations.add(lineLevelRecValidation);
return validatedClaimLevelRecordsDetailList;
}
private boolean firstSegmentIsValid(Segment headerSectionFirstSegment) {
return headerSectionFirstSegment.getElements().size() == 4
|| (headerSectionFirstSegment.getElements().size() == 5
&& (headerSectionFirstSegment.getElement(4).equalsIgnoreCase("0")));
}
// process 20
private boolean process20(CA277SegmentList headerSection) {
List<Segment> segmentsUnderHeader = headerSection.getSegments();
for (int counter = 1; counter < segmentsUnderHeader.size(); counter++) {
Segment s = segmentsUnderHeader.get(counter);
if (s.getElement(0).equalsIgnoreCase("NM1")) {
if (!processsNM1(s))
return false;
else {
if ((headerSection.getSegment(0).getElement(2).isEmpty())) {
return false;
}
}
}
}
return true;
}
// process 21
private boolean process21(CA277SegmentList headerSection) {
if (headerRecordDetail.getHl21Nm10946Tpid() == null) {
List<Segment> segmentsUnderHader = headerSection.getSegments();
for (int counter = 1; counter < segmentsUnderHader.size(); counter++) {
Segment s = segmentsUnderHader.get(counter);
if (s.getElement(0).equalsIgnoreCase("NM1")) {
if (s.getElements().size() >= 10 && !s.getElement(9).isEmpty()) {
if (s.getElement(8).equalsIgnoreCase("46")) {
headerRecordDetail.setHl21Nm10946Tpid(s.getElement(9));
}
} else {
return false;
}
if (!s.getElement(3).isEmpty()) {
String fullName = s.getElement(3);
if (!s.getElement(4).isEmpty())
fullName += ", " + s.getElement(4);
headerRecordDetail.setHl21Nm10310441Sn(fullName);
} else
return false;
}
}
}
// Save Claim Record Details
List<Segment> segmentsUnderHader = headerSection.getSegments();
for (int counter = 1; counter < segmentsUnderHader.size(); counter++) {
Segment s = segmentsUnderHader.get(counter);
if (s.getElement(0).equalsIgnoreCase("STC")) {
if (s.getElements().size() >= 11) {
emdeonStatus = s.getElement(10);
}
break;
}
}
if (!(headerSection.getSegment(0).getElement(2).isEmpty())) {
code.setLength(0);
code.append(hm.get(headerSection.getSegment(0).getElement(2)));
index = Integer.parseInt(headerSection.getSegment(0).getElement(2)) - 1;
return true;
} else
return false;
}
// process 19
private boolean process19(CA277SegmentList headerSection) {
List<Segment> segmentsUnderHader = headerSection.getSegments();
for (int counter = 1; counter < segmentsUnderHader.size(); counter++) {
Segment s = segmentsUnderHader.get(counter);
if (s.getElement(0).equalsIgnoreCase("NM1")) {
if (!processsNM1(s))
return false;
else {
if (!(headerSection.getSegment(0).getElement(2).isEmpty())) {
code.setLength(0);
code.append(hm.get(headerSection.getSegment(0).getElement(2)));
index = Integer.parseInt(headerSection.getSegment(0).getElement(2)) - 1;
return true;
} else
return false;
}
}
}
return true;
}
// process PT
private boolean processPT(CA277SegmentList headerSection) {
// logger.info("headerSection segment 0 elem 2 is " +
// headerSection.getSegment(0).getElement(2));
if (!(headerSection.getSegment(0).getElement(2).isEmpty())) {
// brian said if SVC isn't included in 277CA, don't produce CSTAT -
// DTL segments
// svcSegmentLists is a list of one or more SVC -> DTP blocks from
// headerSection
List<List<Segment>> listOfSvcSegmentLists = createSVCSegmentLists(headerSection.getSegments());
// looping over SVC -> DTP blocks.
logger.info("=========== DTL-RELATED LOOP START ===========");
// 1 listOfSvcSegmentLists = 1 lineLevelRecordsDetailSet.
lineLevelRecordsDetailSet = new ArrayList<>();
for (List<Segment> svcSegmentList : listOfSvcSegmentLists) {
logger.info("Line Level: Evaluating this SVC-DTP block " + svcSegmentList.toString());
// 1 svcSegmentList = 1 LineLevelRecordsDetail.
LineLevelRecordsDetail lineLevelRecordsDetail = new LineLevelRecordsDetail();
lineLevelStatusList = new ArrayList<ClaimStatusRecordDetail>();
for (Segment s : svcSegmentList) {
logger.info("Line Level : Evaluating this segment " + s.toString());
if (s.getElement(0).equalsIgnoreCase("SVC")) {
processSVC(s, lineLevelRecordsDetail);
}
if (s.getElement(0).equalsIgnoreCase("STC")) {
// currently STC doesn't have any information pertaining
// to DTL segment in CSTAT
// putting this in here for futre CSTAT work.
try {
processSTC(s, lineLevelRecordsDetail);
} catch (ParseException e) {
logger.info("Unable to parse date in this segment " + s.toString());
e.printStackTrace();
return false;
}
}
if (s.getElement(0).equalsIgnoreCase("REF")) {
if (s.getElement(1).equalsIgnoreCase("FJ"))
// only triggered if REF01 is FJ (line item control
// number)
processREF(s, lineLevelRecordsDetail);
}
if (s.getElement(0).equalsIgnoreCase("DTP")) {
try {
processDTP(s, lineLevelRecordsDetail);
} catch (ParseException e) {
logger.info("Unable to parse date in this segment " + s.toString());
e.printStackTrace();
return false;
}
}
} // end of inner for loop
lineLevelRecordsDetail.setClaimStatusRecordDetails(lineLevelStatusList);
lineLevelRecordsDetailSet.add(lineLevelRecordsDetail);
} // end of outer for loop
logger.info("=========== DTL-RELATED LOOP END ===========");
List<Segment> segmentsUnderHeader = getSegmentsUnderHeader(headerSection);
// start of for loop for CLM-related info
logger.info("++++++++++++ CLM-RELATED LOOP START ++++++++++++");
for (int counter = 1; counter < segmentsUnderHeader.size(); counter++) {
Segment s = segmentsUnderHeader.get(counter);
logger.info("Claim Level : Evaluating this segment " + s.toString());
if (s.getElement(0).equalsIgnoreCase("NM1")) {
if (!processsNM1(s))
return false;
}
if (s.getElement(0).equalsIgnoreCase("REF")) {
processREF(s, null);
}
if (s.getElement(0).equalsIgnoreCase("STC")) {
try {
if (!processSTC(s, null))
return false;
} catch (ParseException e) {
logger.info("Unable to parse date in this segment " + s.toString());
e.printStackTrace();
return false;
}
}
if (s.getElement(0).equalsIgnoreCase("DTP")) {
try {
if (!processDTP(s, null))
return false;
} catch (ParseException e) {
logger.info("Unable to parse date in this segment " + s.toString());
e.printStackTrace();
return false;
}
}
}
// end of for loop for CLM-related info
logger.info("++++++++++++ CLM-RELATED LOOP END ++++++++++++");
code.setLength(0);
code.append(hm.get(headerSection.getSegment(0).getElement(2)));
index = Integer.parseInt(headerSection.getSegment(0).getElement(2)) - 1;
return true;
} else {
logger.info("NO PARENT FOUND! CANNOT PROCESS DATA FURTHER");
return false;
}
}
private List<List<Segment>> createSVCSegmentLists(List<Segment> allHLPTSegments) {
List<List<Segment>> listOfSvcSegmentLists = new ArrayList<>();
List<Segment> svcSegmentList = new ArrayList<>();
boolean svcFound = false;
// find when SVC segment happens
for (int i = 0; i < allHLPTSegments.size(); i++) {
if (allHLPTSegments.get(i).getElement(0).equalsIgnoreCase("SVC")) {
this.svcIndex = i;
svcFound = true;
// logger.info("SVC is found! SVC INDEX IS " + this.svcIndex);
break;
}
}
// if SVC segment is found, then break it up into blocks.
if (svcFound) {
// getting rid of every segment up until the first SVC.
List<Segment> segmentsFromFirstSVC = allHLPTSegments.subList(this.svcIndex, allHLPTSegments.size());
for (Segment s : segmentsFromFirstSVC) {
if (s.getElement(0).equals("SVC")) {
if (!svcSegmentList.isEmpty()) {
listOfSvcSegmentLists.add(svcSegmentList);
}
svcSegmentList = new ArrayList<>();
svcSegmentList.add(s);
} else {
svcSegmentList.add(s);
}
}
if (!svcSegmentList.isEmpty()) {
listOfSvcSegmentLists.add(svcSegmentList);
}
return listOfSvcSegmentLists;
} else {
// when svcFound == false, listOfSvcSegmentLists will be empty.
return listOfSvcSegmentLists;
}
}
// PROCESSING nm1 SEGMENTS
private boolean processsNM1(Segment s) {
int size = s.getElements().size();
if (size >= 2) {
if (s.getElement(1).equalsIgnoreCase("PR")) {
logger.info("INSIDE NM1*PR!!!!");
if (size >= 10 && s.getElement(8).equalsIgnoreCase("PI")) {
claimLevelRecordsDetail.setHl320Nm1092100aFiPayerid(s.getElement(9));
// logger.info("Col : PayerID " + s.getElement(9));
}
} else if (s.getElement(1).equalsIgnoreCase("85")) {
if (size >= 10) {
if (s.getElement(8).equalsIgnoreCase("FI")) {
claimLevelRecordsDetail.setHl319Nm1092100cFiBpftaxid(Integer.parseInt(s.getElement(9)));
// logger.info("Col : Billing Provider Federal Tax Id "
// + s.getElement(9));
} else if (s.getElement(8).equalsIgnoreCase("XX")) {
claimLevelRecordsDetail.setHl319Nm1092100cXxBpnpid(Long.parseLong(s.getElement(9)));
// logger.info("Col : Billing Provider National Provider
// Id " + s.getElement(9));
} else {
logger.info(
"Billing Provider Federal Tax Id or Billing Provider National Provider Id- either of them is required");
return false;
}
if (!s.getElement(3).isEmpty()) {
claimLevelRecordsDetail.setHl319Nm1032100cBplastname(s.getElement(3));
if (s.getElement(2).equalsIgnoreCase("1")) {
// Person
claimLevelRecordsDetail.setHl319Nm1042100cBpfirstname(s.getElement(4));
claimLevelRecordsDetail.setHl319Nm1052100cBpmiddlename(s.getElement(5));
claimLevelRecordsDetail.setHl319Nm1072100cBpsfx(s.getElement(7));
// logger.info("Col : Service Provider Last Name " +
// s.getElement(3));
// logger.info("Col : Service Provider First Name "
// +
// s.getElement(4));
// logger.info("Col : Service Provider Middle Name "
// +
// s.getElement(5));
// logger.info("Col : Service Provider Suffix " +
// s.getElement(7));
}
} else
return false;
}
} else if (s.getElement(1).equalsIgnoreCase("QC")) {
if (size >= 10 && s.getElement(8).equalsIgnoreCase("MI")) {
// logger.info("Col : Patient ID " + s.getElement(9));
if (!s.getElement(9).isEmpty()) {
claimLevelRecordsDetail.setHl3ptNm1092100d1Patid(s.getElement(9));
} else {
logger.info("Patient ID is required, Cannot be empty");
return false;
}
}
if (s.getElement(2).equalsIgnoreCase("1")) {
if (size >= 4 && s.getElement(3).isEmpty()) {
// claimLevelRecordsDetail.setHl3ptNm1032100d1Patlastname("LastNameFD");
// claimLevelRecordsDetail.setHl3ptNm1042100d1Patfrstname("FirstNameFD");
logger.info("MISSING Patient Last Name");
return false;
} else {
// logger.info("Col : Patient Last Name " +
// s.getElement(3));
claimLevelRecordsDetail.setHl3ptNm1032100d1Patlastname(s.getElement(3));
}
if (size >= 5) {
claimLevelRecordsDetail.setHl3ptNm1042100d1Patfrstname(s.getElement(4));
}
if (size >= 6) {
logger.info("Col : Patient Middle Name " + s.getElement(5));
claimLevelRecordsDetail.setHl3ptNm1052100d1Patmidname(s.getElement(5));
}
if (size >= 8) {
logger.info("Col : Patient Suffix " + s.getElement(7));
claimLevelRecordsDetail.setHl3ptNm1072100d1Patnamesfx(s.getElement(7));
}
}
}
} else {
logger.info("File is corrupted");
return false;
}
return true;
}
// PROCESS STC
private boolean processSTC(Segment s, LineLevelRecordsDetail lineLevelRecordsDetail) throws ParseException {
int size = s.getElements().size();
// only evaluate this if lineLevelRecordsDetail is null.
if (lineLevelRecordsDetail == null) {
claimLevelStatusSet.addAll(getDataForClaimStatusRecord(s));
if (size >= 5 && !s.getElement(4).isEmpty()) {
// logger.info("Col : Claim Charge Amount " + s.getElement(4));
claimLevelRecordsDetail.setHl3ptStc042200dCca(Double.parseDouble(s.getElement(4)));
} else {
// claimLevelRecordsDetail.setHl3ptStc042200dCca(12345.678);
logger.info("Claim Charge amount is a required field, 0 is accepted");
return false;
}
if (size >= 6) {
String[] elements = s.getElement(1).split("\\" + ":");
for (String element : elements) {
if (element.equalsIgnoreCase("F1")) {
// logger.info("Col : Claim Payment Amount " +
// s.getElement(5));
claimLevelRecordsDetail.setHl3ptStc052200dCpa(Double.parseDouble(s.getElement(5)));
break;
}
}
}
if (size >= 7) {
String[] elements = s.getElement(1).split("\\" + ":");
for (String element : elements) {
if (element.charAt(0) == 'F') {
LocalDate date = processStrToDate(s.getElement(6));
if (date != null)
claimLevelRecordsDetail.setHl3ptStc062200dCapd(Date.valueOf(date));
// logger.info("Col : Claim Adjudication/Payment Date" +
// s.getElement(6) + " ---- " + date);
break;
}
}
}
if (size >= 9 && !(s.getElement(8).isEmpty())) {
LocalDate date = processStrToDate(s.getElement(8));
if (date != null)
claimLevelRecordsDetail.setHl3ptStc082200dCeftd(Date.valueOf(date));
// logger.info("Col : Check/EFT Date " + date);
}
if (size >= 10) {
claimLevelRecordsDetail.setHl3ptStc092200dCeftnum(s.getElement(9));
// logger.info("Col : Check/EFT Number " + s.getElement(9));
}
} // Line Level STC Processing
else {
// Get the Claim Status Record Details for Line (there can be
// multiple STC Status for a single Line Level Record)
lineLevelStatusList.addAll(getDataForClaimStatusRecord(s));
}
return true;
}
// Process SVC
private boolean processSVC(Segment s, LineLevelRecordsDetail lineLevelRecordsDetail) {
int size = s.size();
logger.info("Line Col : Quantity (Units Of Service) default value 1");
lineLevelRecordsDetail.setHlptSvc07Qnty(1L);
if (size >= 2) {
String[] svc01Array = s.getElement(1).split(":");
if (svc01Array.length >= 2) {
lineLevelRecordsDetail.setHlptSvc011Svcqualid(svc01Array[0]);
lineLevelRecordsDetail.setHlptSvc012Svcidntcd(svc01Array[1]);
// logger.info("Line Col : Service Qualifier ID " +
// svc01Array[0]);
// logger.info("Line Col : Service Ident Code " +
// svc01Array[1]);
}
if (svc01Array.length >= 3) {
lineLevelRecordsDetail.setHlptSvc013Prcmd1(svc01Array[2]);
// logger.info("Line Col : Procedure Modifier 1 " +
// svc01Array[2]);
}
if (svc01Array.length >= 4) {
lineLevelRecordsDetail.setHlptSvc014Prcmd2(svc01Array[3]);
// logger.info("Line Col : Procedure Modifier 2 " +
// svc01Array[3]);
}
if (svc01Array.length >= 5) {
lineLevelRecordsDetail.setHlptSvc015Prcmd3(svc01Array[4]);
// logger.info("Line Col : Procedure Modifier 3 " +
// svc01Array[4]);
}
if (svc01Array.length >= 6) {
lineLevelRecordsDetail.setHlptSvc016Prcmd4(svc01Array[5]);
// logger.info("Line Col : Procedure Modifier 4 " +
// svc01Array[5]);
}
}
if (size >= 3 && !s.getElement(2).isEmpty() && isDouble(s.getElement(2))) {
lineLevelRecordsDetail.setHlptSvc02Lnitmchrgamt(Double.valueOf(s.getElement(2)));
logger.info("Line Col : Line Item Charge Amount " + s.getElement(2));
}
if (size >= 4 && !s.getElement(3).isEmpty() && isDouble(s.getElement(3))) {
lineLevelRecordsDetail.setHlptSvc03Lnitmprvpymamt(Double.valueOf(s.getElement(3)));
logger.info("Line Col : Line Item Provider Payment Amount " + s.getElement(3));
}
if (size >= 8 && !s.getElement(7).isEmpty() && s.getElement(7).matches("[0-9]+")) {
lineLevelRecordsDetail.setHlptSvc07Qnty(Long.valueOf(s.getElement(7)));
logger.info("Line Col : Quantity (Units of Service) overriding default of 1 with " + s.getElement(7));
}
return true;
}
// PROCESS REF
private boolean processREF(Segment s, LineLevelRecordsDetail lineLevelRecordsDetail) {
if (s.getElements().size() >= 3) {
String compareEle = s.getElement(1);
String element = s.getElement(2);
if (compareEle.equalsIgnoreCase("1K")) {
claimLevelRecordsDetail.setHl3ptRef022200d1kPcidnum(element);
// logger.info("Col : Payer Claim Control Number " +
// s.getElement(2));
} else if (compareEle.equalsIgnoreCase("D9")) {
claimLevelRecordsDetail.setHl3ptRef022200dD9Emdeoncn(element);
// logger.info("Col : EMDEON Claim Number " + s.getElement(2));
} else if (compareEle.equalsIgnoreCase("BLT")) {
claimLevelRecordsDetail.setHl3ptRef022200dBltBilltype(element);
// logger.info("Col : BILL TYPE " + s.getElement(2));
} else if (compareEle.equalsIgnoreCase("FJ") && lineLevelRecordsDetail != null) {
lineLevelRecordsDetail.setHlptRef02FjLnitmctrlnum(element);
logger.info("Line Col : Line Item Control Number " + s.getElement(2));
}
}
return true;
}
// PROCESS DTP
private boolean processDTP(Segment s, LineLevelRecordsDetail lineLevelRecordsDetail) throws ParseException {
if (s.getElements().size() >= 4) {
if (s.getElement(1).equalsIgnoreCase("472") && s.getElement(2).equalsIgnoreCase("D8")) {
if (!s.getElement(3).isEmpty() && s.getElement(3).length() == 8) {
LocalDate date = processStrToDate(s.getElement(3));
if (date != null) {
if (lineLevelRecordsDetail == null) {
// logger.info("Col : Claim Service Date Start And
// End "
// +
// date);
claimLevelRecordsDetail.setHl3ptDtp032200d472D8Csds(Date.valueOf(date));
claimLevelRecordsDetail.setHl3ptDtp032200d472D8Csde(Date.valueOf(date));
} else {
logger.info("Line Col: Line Service Date Start And End " + date);
lineLevelRecordsDetail.setHlptDtp03Dtsvcstart(Date.valueOf(date));
lineLevelRecordsDetail.setHlptDtp03Dtsvcend(Date.valueOf(date));
}
}
} else
return false;
} else if (s.getElement(1).equalsIgnoreCase("472") && s.getElement(2).equalsIgnoreCase("RD8")) {
if (!s.getElement(3).isEmpty()) {
String[] dateArray = s.getElement(3).split("\\" + "-");
if (dateArray.length == 2 && dateArray[0].length() == 8 && dateArray[1].length() == 8) {
LocalDate startDate, endDate;
startDate = processStrToDate(dateArray[0]);
endDate = processStrToDate(dateArray[1]);
if (startDate != null && endDate != null) {
if (lineLevelRecordsDetail == null) {
claimLevelRecordsDetail.setHl3ptDtp032200d472D8Csds(Date.valueOf(startDate));
// logger.info("Col : split at - Claim Service
// Date
// Start "
// + startDate);
claimLevelRecordsDetail.setHl3ptDtp032200d472D8Csde(Date.valueOf(endDate));
// logger.info("Col : rest half Claim Service
// Date
// End " +
// endDate);
} else {
lineLevelRecordsDetail.setHlptDtp03Dtsvcstart(Date.valueOf(startDate));
lineLevelRecordsDetail.setHlptDtp03Dtsvcend(Date.valueOf(endDate));
logger.info("Line Col: Line Service Date Start " + startDate);
logger.info("Line Col: Line Service Date End " + endDate);
}
}
}
}
}
} else
return false;
return true;
}
// process date string to date format
private LocalDate processStrToDate(String inputDate) throws ParseException {
if (inputDate.length() < 8 || inputDate.length() > 8) {
return null;
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate date = LocalDate.parse(inputDate, formatter);
// reqFormat = new SimpleDateFormat("MM/dd/yyyy");
// String dateString = reqFormat.format(date);
// date = reqFormat.parse(dateString);
return date;
}
private String processDateToStr() {
try {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String formatDateTime = now.format(formatter);
return formatDateTime;
} catch (DateTimeException e) {
logger.error("Error occurred while formatting date.", e);
return null;
}
}
private boolean processBHT(Segment s) throws ParseException {
int size = s.getElements().size();
LocalTime localTime = null;
LocalDate date = null;
if (size >= 5 && !s.getElement(4).isEmpty()) {
date = processStrToDate(s.getElement(4));
if (date != null)
headerRecordDetail.setBht04CreationDate(Date.valueOf(date));
} else
return false;
logger.info("date parsed");
if (size >= 6 && !s.getElement(5).isEmpty() && s.getElement(5).length() >= 4) {
// int sz = s.getElement(5).length();
// String format = "";
// if (sz == 4) {
// //format = "HHmm";
// } else if (sz == 6) {
// format = "HHmmss";
// } else if (sz == 7) {
// format = "HHmmssS";
// sz = 10;
// } else if (sz == 8) {
// format = "HHmmssSS";
// sz = 11;
// }
// if (!format.isEmpty()) {
// localTime = LocalTime.parse(s.getElement(5),
// DateTimeFormatter.ofPattern(format));
headerRecordDetail.setBht05CreationTime(s.getElement(5));
// }
} else
return false;
return true;
}
private List<ClaimStatusRecordDetail> getDataForClaimStatusRecord(Segment s) throws ParseException {
// Creating a list to return in case STC segment contains multiple sets
// of codes
List<ClaimStatusRecordDetail> returnClaimStatusList = new ArrayList<>();
// Get the size of elements contained in the line
int size = s.getElements().size();
// Creating initial record for the required first
ClaimStatusRecordDetail initialClaimStatusDetail = new ClaimStatusRecordDetail();
if (size >= 3 && !(s.getElement(2).isEmpty())) {
initialClaimStatusDetail.setHlptStc02Stciedate(Date.valueOf(processStrToDate(s.getElement(2))));
}
if (size >= 2 && !(s.getElement(1).isEmpty())) {
extractHealthCareClaimStatusCodesFromString(s.getElement(1), initialClaimStatusDetail);
}
returnClaimStatusList.add(initialClaimStatusDetail);
if (size >= 11 && !s.getElement(10).isEmpty()) {
ClaimStatusRecordDetail anotherClaimStatusDetail = new ClaimStatusRecordDetail();
extractHealthCareClaimStatusCodesFromString(s.getElement(10), anotherClaimStatusDetail);
anotherClaimStatusDetail.setHlptStc02Stciedate(initialClaimStatusDetail.getHlptStc02Stciedate());
returnClaimStatusList.add(anotherClaimStatusDetail);
}
if (size >= 12 && !s.getElement(11).isEmpty()) {
ClaimStatusRecordDetail anotherClaimStatusDetail2 = new ClaimStatusRecordDetail();
extractHealthCareClaimStatusCodesFromString(s.getElement(11), anotherClaimStatusDetail2);
anotherClaimStatusDetail2.setHlptStc02Stciedate(initialClaimStatusDetail.getHlptStc02Stciedate());
returnClaimStatusList.add(anotherClaimStatusDetail2);
}
return returnClaimStatusList;
}
private void extractHealthCareClaimStatusCodesFromString(String s, ClaimStatusRecordDetail claimStatusDetail) {
String[] elements = s.split("\\" + ":");
for (int count = 0; count < elements.length; count++) {
if (count == 0)
claimStatusDetail.setHlptStc011Cscc(elements[count]);
else if (count == 1)
claimStatusDetail.setHlptStc012Csc(elements[count]);
else
claimStatusDetail.setHlptStc013Ec(elements[count]);
}
}
private boolean validateClaimRecord(ClaimLevelRecordsDetail cm) {
if (claimLevelRecordsDetail.getHl320Nm1092100aFiPayerid() == null) {
logger.info("Hl320Nm1092100aFiPayerid() == null, returning false");
return false;
}
if (claimLevelRecordsDetail.getHl319Nm1092100cFiBpftaxid() == null
&& claimLevelRecordsDetail.getHl319Nm1092100cXxBpnpid() == null) {
logger.info("Hl319Nm1092100cFiBpftaxid() == null && Hl319Nm1092100cXxBpnpid() == null, returning false");
return false;
}
if (isNullish(claimLevelRecordsDetail.getHl319Nm1032100cBplastname())) {
return false;
}
if (claimLevelRecordsDetail.getHl3ptNm1032100d1Patlastname() == null) {
logger.info("Hl3ptNm1032100d1Patlastname() == null, returning false");
return false;
}
if (claimLevelRecordsDetail.getHl3ptNm1092100d1Patid() == null) {
logger.info("getHl3ptNm1092100d1Patid() == null, returning false");
return false;
}
if (claimLevelRecordsDetail.getHl3ptStc042200dCca() == null) {
logger.info("Hl3ptStc042200dCca() == null, returning false");
return false;
}
if (claimLevelRecordsDetail.getHl3ptDtp032200d472D8Csds() == null
|| claimLevelRecordsDetail.getHl3ptDtp032200d472D8Csde() == null) {
logger.info("Hl3ptDtp032200d472D8Csds() == null || Hl3ptDtp032200d472D8Csde() == null, returning false");
return false;
}
return true;
}
private boolean validateHeader() {
if (isNullish(headerRecordDetail.getRecid()) || isNullish(headerRecordDetail.getBatchId())
|| isNullish(headerRecordDetail.getFileGrpSeqnum()) || isNullish(headerRecordDetail.getFileGrpCount())
|| isNullish(headerRecordDetail.getBht04CreationDate())
|| isNullish(headerRecordDetail.getBht05CreationTime())
|| isNullish(headerRecordDetail.getHl21Nm10310441Sn())
|| isNullish(headerRecordDetail.getHl21Nm10946Tpid()) || isNullish(headerRecordDetail.getLoadtype())
|| isNullish(headerRecordDetail.getFiletype()) || isNullish(headerRecordDetail.getVersioncode())
|| isNullish(headerRecordDetail.getReleasecode())) {
return false;
}
return true;
}
private boolean validateLineRecords(LineLevelRecordsDetail llrd) {
logger.info("LLRDSET SIZE " + lineLevelRecordsDetailSet.size());
if (isNullish(llrd.getHl20Nm1092100aFiPayerid())) {
logger.info("getHl20Nm1092100aFiPayerid() == null, returning false");
return false;
}
if (isNullish(llrd.getHlptRef02FjLnitmctrlnum())) {
logger.info("getHlptRef02FjLnitmctrlnum() == null, returning false");
return false;
}
if (isNullish(llrd.getHlptDtp03Dtsvcstart()) || isNullish(llrd.getHlptDtp03Dtsvcend())) {
logger.info("getHlptDtp03Dtsvcend() == null or getHlptDtp03Dtsvcstart() == null, returning false");
return false;
}
if (isNullish(llrd.getHlptSvc011Svcqualid()) || isNullish(llrd.getHlptSvc012Svcidntcd())) {
logger.info("getHlptSvc011Svcqualid() == null or getHlptSvc011Svcqualid() == null, returning false");
return false;
}
return true;
}
private boolean isValidClaimStatusRecord(ClaimStatusRecordDetail claimStatusRec, String typeOfLevel) {
logger.info("Claim Status date: ", claimStatusRec.getHlptStc02Stciedate());
if (typeOfLevel.equalsIgnoreCase("LINE")) {
if (isNullish(claimStatusRec.getRecid()) || isNullish(claimStatusRec.getHl320Nm1092100aFiPayerid())
|| isNullish(claimStatusRec.getHlptRef02FjLnitmctrlnum())
/* || isNullish(claimStatusRec.getHlptStc02Stciedate()) */
|| isNullish(claimStatusRec.getHlptStc011Cscc()) || isNullish(claimStatusRec.getHlptStc012Csc())
|| claimStatusRec.getClaimLevelRecordsDetail() == null) {
logger.error("Claim Status Record for Line Details Missing");
return false;
}
} else {
if (isNullish(claimStatusRec.getRecid()) || isNullish(claimStatusRec.getHl320Nm1092100aFiPayerid())
|| isNullish(claimStatusRec.getHlptStc02Stciedate())
|| isNullish(claimStatusRec.getHlptStc011Cscc()) || isNullish(claimStatusRec.getHlptStc012Csc())
|| claimStatusRec.getClaimLevelRecordsDetail() == null) {
logger.error("Claim Status Record for claim Details Missing");
return false;
}
}
return true;
}
private boolean isNullish(Object element) {
if (element == null || element.toString().isEmpty()) {
return true;
} else {
return false;
}
}
private List<Segment> getSegmentsUnderHeader(CA277SegmentList headerSection) {
List<Segment> segmentsUnderHeader = null;
if (this.svcIndex == 0) {
for (int i = 0; i < headerSection.getSegments().size(); i++) {
if (headerSection.getSegment(i).getElement(0).equalsIgnoreCase("DTP")) {
segmentsUnderHeader = headerSection.getSegments();
break;
}
}
} else {
segmentsUnderHeader = headerSection.getSegments().subList(0, this.svcIndex);
}
return segmentsUnderHeader;
}
private boolean isDouble(String doubleString) {
return doubleString.matches("\\d+(\\.\\d+)?");
}
}