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.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.StringJoiner;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

import org.apache.commons.io.FilenameUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import gov.va.med.ars.dao.ars.ClaimLevel277CARepository;
import gov.va.med.ars.dao.ars.IHeaderRecord277CARepository;
import gov.va.med.ars.dao.ars.ITrailerRec277CARepository;
import gov.va.med.ars.dao.ars.LineLevel277CARepository;
import gov.va.med.ars.model.response.CSTATResponse;
import gov.va.med.ars.service.ICstatGeneratorService;
import gov.va.med.ars.util.DateUtil;
import gov.va.med.domain.ars.ClaimLevelRecordsDetail;
import gov.va.med.domain.ars.ClaimStatusRecordDetail;
import gov.va.med.domain.ars.HeaderRecordDetail;
import gov.va.med.domain.ars.LineLevelRecordsDetail;
import gov.va.med.domain.ars.TrailerRecordDetail;

@Service
public class CstatGeneratorServiceImpl implements ICstatGeneratorService {
private static final Logger logger = LogManager.getLogger(CstatGeneratorServiceImpl.class);

private static final String delimiter = "|";
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

@Autowired
ClaimLevel277CARepository clrdRepo;

@Autowired
LineLevel277CARepository llrdRepo;

@Autowired
IHeaderRecord277CARepository headerRecRepo;

@Autowired
ITrailerRec277CARepository trailerRecRepo;

@Autowired
DateUtil dateUtil;

@Value("${output_folder}")
String outputFolder;

@Override
public CSTATResponse buildCSTAT(Long batchId) {
logger.info("****************************************************************");
logger.info("CSTAT generated will be located in " + batchId);
logger.info("****************************************************************");
CSTATResponse cstatResponse = new CSTATResponse();

AtomicInteger recordNumber = new AtomicInteger(2);
try {
List<String> resultList = buildAllSegments(batchId, recordNumber);
if (resultList != null) {
try {
LocalDate today = LocalDate.now();

StringBuilder filename = generateCstatFilename();

StringBuilder pathName = new StringBuilder();
pathName.append(outputFolder);

Files.createDirectories(Paths.get(FilenameUtils.normalize(pathName.toString())));

pathName.append(filename);

Files.write(Paths.get(FilenameUtils.normalize(pathName.toString())), resultList,
Charset.defaultCharset());
File file = new File(FilenameUtils.normalize(pathName.toString()));
byte[] data = new byte[(int) file.length()];

try (FileInputStream fileIo = new FileInputStream(file)) {
fileIo.read(data);
}

try (FileOutputStream fos = new FileOutputStream(FilenameUtils.normalize(pathName.toString()))) {
fos.write(data);
}

setSuccessfulCstatResponse(cstatResponse, resultList, today, filename.toString());
} catch (IOException e) {
e.printStackTrace();
cstatResponse.setIsGenerated(false);

return cstatResponse;
} catch (Exception e) {
e.printStackTrace();
cstatResponse.setIsGenerated(false);
return cstatResponse;
}
} else {
cstatResponse.setDateCreated(null);
cstatResponse.setCstatFileName(null);
cstatResponse.setLineCount(0);
cstatResponse.setIsGenerated(false);
}
return cstatResponse;
} catch (Exception e) {
logger.error("Error occurred durring CSTAT generation.", e);
return cstatResponse;
} /*
* finally { resetRecordNumberCounter(); }
*/

}

/*
* private void resetRecordNumberCounter() { recordNumber = 2;
*
* }
*/

private StringBuilder generateCstatFilename() {

StringBuilder fileNameBuilder = new StringBuilder();

final String dataFormatNow = "yyyyMMddHHmmssSSS";
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(dataFormatNow);
String timeName = sdf.format(cal.getTime()).trim();

fileNameBuilder.append(timeName);
fileNameBuilder.append("_VAFEE.CSTAT");


return fileNameBuilder;
}

private void setSuccessfulCstatResponse(CSTATResponse cstatResponse, List<String> resultList, LocalDate today,
String fileName) {
cstatResponse.setDateCreated(today);
cstatResponse.setCstatFileName(fileName);
cstatResponse.setLineCount(resultList.size());
cstatResponse.setIsGenerated(true);
}

protected List<String> buildAllSegments(Long batchId, AtomicInteger recordNumber) {
logger.info("===============================");
logger.info("start of buildCLMSegment method");
List<Long> clRecIdList = new ArrayList<>();
List<String> resultList = new ArrayList<>();

// build header string using the header id created in parser
List<HeaderRecordDetail> headerRecordList = headerRecRepo.findBybatchId(String.valueOf(batchId));
logger.info("Header Repo: " + headerRecordList.get(headerRecordList.size() - 1).getHl21Nm10946Tpid());
if (!buildHdrString(headerRecordList.get(headerRecordList.size() - 1), resultList)) {
return null;
}

for (HeaderRecordDetail headerRecord : headerRecordList) {
List<ClaimLevelRecordsDetail> clrdWithLines = clrdRepo.findPendingCLMWithLines(headerRecord.getHrecid());
List<ClaimLevelRecordsDetail> clrdWithoutLines = clrdRepo
.findPendingCLMWithoutLines(headerRecord.getHrecid());

clrdWithLines.addAll(clrdWithoutLines);
HashSet<Object> seen = new HashSet<>();
clrdWithLines.removeIf(e -> !seen.add(e.getClrecid()));

for (ClaimLevelRecordsDetail clrd : clrdWithLines) {

logger.info("building CLM for Claim Record ID of " + clrd.getClrecid().toString());
buildClmString(clrd, resultList, recordNumber);

buildClaimLevelSTCStrings(clrd, resultList, recordNumber);

List<LineLevelRecordsDetail> lineRecords = clrd.getLineLevelRecordsDetails();

if (!lineRecords.isEmpty()) {
buildDTLString(lineRecords, resultList, recordNumber);
}

clRecIdList.add(clrd.getClrecid());
clrdRepo.save(clrd);
// recordNumber++;
}

if (!clRecIdList.isEmpty()) {
clrdRepo.updateStatus(clRecIdList, "COMPLETE");
}
}

// build trailer string using the header id created in parser
buildTrlrString(headerRecordList.get(headerRecordList.size() - 1), resultList);

logger.info("end of buildCLMSegment method");
logger.info("number of lines is " + resultList.size());
logger.info("===============================");

return resultList;
}

// build Header String
private boolean buildHdrString(HeaderRecordDetail headerRecord, List<String> resultList) {
StringJoiner result = new StringJoiner(delimiter);

if (ValidateHeaderRecord(headerRecord)) {
addHeaderToResult(result, headerRecord);
resultList.add(result.toString());
return true;
}
return false;

}

private void buildClmString(ClaimLevelRecordsDetail clrd, List<String> resultList, AtomicInteger recordNumber) {
StringJoiner result = new StringJoiner(delimiter);

// add field number 1 - 4, the 'header' info in CLM
addRecordInfoToString(result, clrd, recordNumber);
clrd.setRecnum(Long.valueOf(recordNumber.get()));
// add field number 5 - 11, the billing provider info
addBillingProviderInfo(result, clrd);

// add field number 12 - 18, the service provider info
addServiceProviderInfo(result, clrd);

// add field number 19 - 20, employer info
addEmployerInfo(result, clrd);

// add field number 21 - 25, subscriber info
addSubscriberInfo(result, clrd);

// add field number 26 - 32, patient info
addPatientInfo(result, clrd);

// add field number 33 - 39, payment info
addPaymentInfo(result, clrd);

// add field number 40 - 47, identificationAndClaim info
addIdentificationAndClaimInfo(result, clrd);

resultList.add(result.toString());

recordNumber.incrementAndGet();

}

private void buildDTLString(List<LineLevelRecordsDetail> lineDetail, List<String> resultList,
AtomicInteger recordNumber) {

for (LineLevelRecordsDetail llrd : lineDetail) {
StringJoiner result = new StringJoiner(delimiter);
llrd.setRecnum(Long.valueOf(recordNumber.get()));
/*
* add field number 1 - 7 - Record ID, Record Number, Payer ID,
* Payer Claim Identification Number, Line Item Control Number,
* Service Qualifier ID, Service Identification Code
*/
addRecordFields(llrd, result);

// add field number 8 - 11 - optional field - Procedure Modifier 1 -
// 4
addProcedureModifier(llrd, result);

// add field number 12 - 13 - required field - Line Item Charge
// Amount, Line
// Item Provider Payment Amount
addLineItemChargeAndProviderPaymentAmt(llrd, result);

// add field number 14 - 16 - optional field - Revenue Code Quantity
// EMDEON
// Claim Number
addRevenueCodeQuantityEmdeonClmNumber(llrd, result);

// add field number 17 - 18 - required field - Date of Service Start
// Date of
// Service End
addServiceStartAndEndDate(llrd, result);

resultList.add(result.toString());

recordNumber.incrementAndGet();

buildLineLevelSTC(llrd, resultList, recordNumber);
}

}

private void buildClaimLevelSTCStrings(ClaimLevelRecordsDetail clrd, List<String> resultList,
AtomicInteger recordNumber) {

List<ClaimStatusRecordDetail> stcAtClaimLevel = clrd.getClaimStatusRecordDetails().stream()
.filter(c -> c.getLineLevelRecordsDetail() == null).collect(Collectors.toList());

buildSTC(resultList, stcAtClaimLevel, recordNumber);

}

private void buildLineLevelSTC(LineLevelRecordsDetail llrd, List<String> resultList, AtomicInteger recordNumber) {

List<ClaimStatusRecordDetail> stcAtLineLevel = llrd.getClaimStatusRecordDetails().stream()
.filter(c -> c.getLineLevelRecordsDetail().getLlrecid().equals(llrd.getLlrecid()))
.collect(Collectors.toList());
Date ieDate = llrd.getClaimLevelRecordsDetail().getClaimStatusRecordDetails().stream()
.map(csrd -> csrd.getHlptStc02Stciedate()).distinct().findAny().orElse(null);
logger.info("Retrieved claim level status date: " + ieDate);
stcAtLineLevel.stream().forEach(stc -> stc.setHlptStc02Stciedate(ieDate));
buildSTC(resultList, stcAtLineLevel, recordNumber);
}

private void buildSTC(List<String> resultList, List<ClaimStatusRecordDetail> statusRecordDetails,
AtomicInteger recordNumber) {

for (ClaimStatusRecordDetail csrd : statusRecordDetails) {

StringJoiner result = new StringJoiner(delimiter);

csrd.setRecnum(Long.valueOf(recordNumber.get()));
result.add(eliminateNull(csrd.getRecid())).add(eliminateNull(csrd.getRecnum())).add(eliminateNull("VAFEE"))
.add(eliminateNull(csrd.getHl3ptRef022200d1kPcidnum()))
.add(eliminateNull(csrd.getHlptRef02FjLnitmctrlnum()))
.add(eliminateNull(csrd.getHlptStc02Stciedate() != null
? dateFormat.format(csrd.getHlptStc02Stciedate()) : ""))
.add(eliminateNull(csrd.getHlptStc011Cscc())).add(eliminateNull(csrd.getHlptStc012Csc()))
.add(eliminateNull(csrd.getHlptStc013Ec())).add(eliminateNull(csrd.getDataInError()))
.add(eliminateNull(csrd.getHl21Stc1012Esc()));

resultList.add(result.toString());

recordNumber.incrementAndGet();
}

}

private void buildTrlrString(HeaderRecordDetail headerRecord, List<String> resultList) {
StringJoiner result = new StringJoiner(delimiter);
TrailerRecordDetail trailerRecord = trailerRecRepo.findByheaderRecordDetail(headerRecord);
trailerRecRepo.updateRecCount(resultList.size() - 1, trailerRecord.getTrecid());
result.add(eliminateNull(trailerRecord.getRecid())).add(eliminateNull(String.valueOf((resultList.size() - 1))));
resultList.add(result.toString());
logger.info("trailerRecord :::::-- " + (resultList.size() - 1));
}

private void addHeaderToResult(StringJoiner result, HeaderRecordDetail headerRecord) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat timeFormat = new SimpleDateFormat("HHmmss");
Date date = dateUtil.getNewDate();
String dateString = dateFormat.format(date);
String timeString = timeFormat.format(date);
/*
* if (timeString.length() == 4) { timeString += "00"; } else {
* timeString = timeString.substring(0, 6); }
*/
result.add(eliminateNull(headerRecord.getRecid())).add(eliminateNull(headerRecord.getBatchId()))
.add(eliminateNull("01")).add(eliminateNull("01")).add(eliminateNull(dateString)).add(timeString)
.add(eliminateNull("VAFNH")).add(eliminateNull("VA Fee Basis Program"))
.add(eliminateNull(headerRecord.getPayercontactname()))
.add(eliminateNull(headerRecord.getPayersuptelnum()))
.add(eliminateNull(headerRecord.getPayersupemail())).add(String.valueOf(headerRecord.getLoadtype()))
.add(eliminateNull(headerRecord.getPudid())).add(eliminateNull(headerRecord.getFiletype()))
.add(eliminateNull(headerRecord.getVersioncode())).add(eliminateNull(headerRecord.getReleasecode()));
}

private void addProcedureModifier(LineLevelRecordsDetail llrd, StringJoiner result) {
result.add(eliminateNull(llrd.getHlptSvc013Prcmd1())).add(eliminateNull(llrd.getHlptSvc014Prcmd2()))
.add(eliminateNull(llrd.getHlptSvc015Prcmd3())).add(eliminateNull(llrd.getHlptSvc016Prcmd4()));
}

private void addLineItemChargeAndProviderPaymentAmt(LineLevelRecordsDetail llrd, StringJoiner result) {

if (lineItemChargeAndProviderPaymentAmtAreEmpty(llrd)) {
logger.info("missing required Line payment info");
}

result.add(eliminateNull(llrd.getHlptSvc02Lnitmchrgamt()))
.add(eliminateNull(llrd.getHlptSvc03Lnitmprvpymamt() == null? "0.00":llrd.getHlptSvc03Lnitmprvpymamt() ));
}

private void addRecordFields(LineLevelRecordsDetail llrd, StringJoiner result) {
if (requiredRecordFieldsAreEmpty(llrd)) {
logger.info("missing required Line Record info");
}

result.add(eliminateNull(llrd.getRecid())).add(String.valueOf(llrd.getRecnum())).add(eliminateNull("VAFEE"))
.add(eliminateNull(llrd.getHlptRef021kPyrclmidentnum()))
.add(eliminateNull(llrd.getHlptRef02FjLnitmctrlnum())).add(eliminateNull(llrd.getHlptSvc011Svcqualid()))
.add(eliminateNull(llrd.getHlptSvc012Svcidntcd()));
}

private void addRevenueCodeQuantityEmdeonClmNumber(LineLevelRecordsDetail llrd, StringJoiner result) {
result.add(eliminateNull(llrd.getHlptSvc04Revcd())).add(eliminateNull(llrd.getHlptSvc07Qnty()))
.add(eliminateNull(llrd.getHlptRef02D9Emdclmnum()));
}

private void addServiceStartAndEndDate(LineLevelRecordsDetail llrd, StringJoiner result) {
if (serviceStartAndEndDateAreEmpty(llrd)) {
logger.info("missing required Line service date info");
}

result.add(llrd.getHlptDtp03Dtsvcstart() != null ? dateFormat.format(llrd.getHlptDtp03Dtsvcstart()) : "")
.add(llrd.getHlptDtp03Dtsvcend() != null ? dateFormat.format(llrd.getHlptDtp03Dtsvcend()) : "");

}

private void addRecordInfoToString(StringJoiner result, ClaimLevelRecordsDetail clrd, AtomicInteger recordNumber) {

clrd.setRecnum(Long.valueOf(recordNumber.get()));

// all 4 fields are required
if (allRecordInfoAreEmpty(clrd)) {
logger.info("missing required record info");
}

result.add(eliminateNull(clrd.getRecid())).add(String.valueOf(clrd.getRecnum())).add(eliminateNull("VAFEE"))
.add(eliminateNull(clrd.getMaintenancetypecode()));

}

private void addBillingProviderInfo(StringJoiner result, ClaimLevelRecordsDetail clrd) {
// if all of the 3 billing provider ids are empty
// then i need to throw an error.
if (allBillingProviderIdsAreEmpty(clrd)) {
logger.info("missing at least 1 required billing provider info");
}

result.add(eliminateNull(clrd.getHl319Nm1092100cFiBpftaxid())).add(eliminateNull(clrd.getBppassignnum()))
.add(eliminateNull(clrd.getHl319Nm1092100cXxBpnpid()))
.add(eliminateNull(clrd.getHl319Nm1032100cBplastname()))
.add(eliminateNull(clrd.getHl319Nm1042100cBpfirstname()))
.add(eliminateNull(clrd.getHl319Nm1052100cBpmiddlename()))
.add(eliminateNull(clrd.getHl319Nm1072100cBpsfx()));

}

private void addServiceProviderInfo(StringJoiner result, ClaimLevelRecordsDetail clrd) {
result.add(eliminateNull(clrd.getSpftid())).add(eliminateNull(clrd.getSpftid())) // here
.add(eliminateNull(clrd.getSpnpid())).add(eliminateNull(clrd.getSplastname()))
.add(eliminateNull(clrd.getSpfirstname())).add(eliminateNull(clrd.getSpmiddlename()))
.add(eliminateNull(clrd.getSpsfx()));
}

private void addEmployerInfo(StringJoiner result, ClaimLevelRecordsDetail clrd) {
result.add(eliminateNull(clrd.getEmployerid())).add(eliminateNull(clrd.getEmpname()));
}

private void addSubscriberInfo(StringJoiner result, ClaimLevelRecordsDetail clrd) {
result.add(eliminateNull(clrd.getHl3ptNm1092100d1Patid()))
.add(eliminateNull(clrd.getHl3ptNm1032100d1Patlastname()))
.add(eliminateNull(clrd.getHl3ptNm1042100d1Patfrstname()))
.add(eliminateNull(clrd.getHl3ptNm1052100d1Patmidname())).add(eliminateNull(clrd.getSubsfx()));

}

private void addPatientInfo(StringJoiner result, ClaimLevelRecordsDetail clrd) {

// patient last name, first name, DOB is required
if (requiredPatientInfoAreEmpty(clrd)) {
logger.info("missing required patient info");
}

result.add(eliminateNull("")).add(eliminateNull(clrd.getHl3ptNm1032100d1Patlastname()))
.add(eliminateNull(clrd.getHl3ptNm1042100d1Patfrstname()))
.add(eliminateNull(clrd.getHl3ptNm1052100d1Patmidname()))
.add(eliminateNull(clrd.getHl3ptNm1072100d1Patnamesfx()))
// Per Rational Requirement 1077126
// Patient DOB will default to 19850818 as per customer
// agreement until
// groups providing 277CA's for ingest can provide the DOB in a
// correct field.
// Currently the 277CA doesn't support DOB's in a date field
// somewhere, hence
// why this issue has arose and is using this static value
// workaround
.add(clrd.getPatdob() != null ? dateFormat.format(clrd.getPatdob()) : "19850818")
.add(eliminateNull(clrd.getPatgen()));

}

private void addPaymentInfo(StringJoiner result, ClaimLevelRecordsDetail clrd) {
if (!isEmpty(clrd.getHl3ptStc042200dCca())) {
logger.info("missing required payment info");
}

result.add(eliminateNull(clrd.getHl3ptRef022200dD9Emdeoncn())).add(eliminateNull(clrd.getHl3ptStc042200dCca()))
.add(eliminateNull(clrd.getHl3ptStc052200dCpa())).add(eliminateNull(clrd.getHl3ptStc062200dCapd()))
.add(eliminateNull(clrd.getHl3ptStc082200dCeftd())).add(eliminateNull(clrd.getHl3ptStc092200dCeftnum()))
.add(eliminateNull(clrd.getHl3ptRef022200dBltBilltype()));

}

private void addIdentificationAndClaimInfo(StringJoiner result, ClaimLevelRecordsDetail clrd) {

if (requiredIdAndClaimInfoAreEmpty(clrd)) {
logger.info("missing required identification and claim info");
}

result.add(eliminateNull(clrd.getHl3ptRef022200d1kPcidnum())).add(eliminateNull(clrd.getPan()))
.add(eliminateNull(clrd.getPpn())).add(eliminateNull(clrd.getVoucher()))
.add(eliminateNull(clrd.getAlsi())).add(eliminateNull(clrd.getGrpnum()))
.add(clrd.getHl3ptDtp032200d472D8Csds() != null ? dateFormat.format(clrd.getHl3ptDtp032200d472D8Csds())
: "")
.add(clrd.getHl3ptDtp032200d472D8Csde() != null ? dateFormat.format(clrd.getHl3ptDtp032200d472D8Csde())
: "");

}

private boolean lineItemChargeAndProviderPaymentAmtAreEmpty(LineLevelRecordsDetail llrd) {

if (isEmpty(llrd.getHlptSvc02Lnitmchrgamt()) || isEmpty(llrd.getHlptSvc03Lnitmprvpymamt())) {
return true;
} else {
return false;
}
}

private boolean serviceStartAndEndDateAreEmpty(LineLevelRecordsDetail llrd) {

if (llrd.getHlptDtp03Dtsvcstart() == null || llrd.getHlptDtp03Dtsvcend() == null) {
return true;
} else {
return false;
}
}

private boolean requiredRecordFieldsAreEmpty(LineLevelRecordsDetail llrd) {
if (isEmpty(llrd.getRecid()) && isEmpty(llrd.getRecnum()) && isEmpty(llrd.getHl20Nm1092100aFiPayerid())
&& isEmpty(llrd.getHlptRef021kPyrclmidentnum()) && isEmpty(llrd.getHlptRef02FjLnitmctrlnum())
&& isEmpty(llrd.getHlptSvc011Svcqualid()) && isEmpty(llrd.getHlptSvc012Svcidntcd())) {
return true;
} else {
return false;
}
}

private boolean requiredIdAndClaimInfoAreEmpty(ClaimLevelRecordsDetail clrd) {
if (isEmpty(clrd.getHl3ptRef022200d1kPcidnum()) && clrd.getHl3ptDtp032200d472D8Csds() == null
&& clrd.getHl3ptDtp032200d472D8Csde() == null) {
return true;
} else {
return false;
}
}

private boolean allRecordInfoAreEmpty(ClaimLevelRecordsDetail clrd) {

if (isEmpty(clrd.getRecid()) && isEmpty(clrd.getRecnum()) && isEmpty(clrd.getHl320Nm1092100aFiPayerid())
&& isEmpty(clrd.getMaintenancetypecode())) {
return true;
} else {
return false;
}
}

private boolean allBillingProviderIdsAreEmpty(ClaimLevelRecordsDetail clrd) {

if (isEmpty(clrd.getHl319Nm1092100cFiBpftaxid()) && isEmpty(clrd.getBppassignnum())
&& isEmpty(clrd.getHl319Nm1092100cXxBpnpid())) {
return true;
} else {
return false;
}
}

private boolean requiredPatientInfoAreEmpty(ClaimLevelRecordsDetail clrd) {

if ((isEmpty(clrd.getHl3ptNm1032100d1Patlastname())) || (isEmpty(clrd.getHl3ptNm1042100d1Patfrstname()))
|| clrd.getPatdob() == null) {
return true;
} else {
return false;
}
}

private String eliminateNull(Object obj) {
String result = "";

if (obj != null) {
if (obj.getClass().equals(Integer.class) || obj.getClass().equals(Long.class)
|| obj.getClass().equals(Double.class) || obj.getClass().equals(Short.class)) {
result = String.valueOf(obj);
} else if (obj.getClass().equals(String.class)) {
String str = String.valueOf(obj);
if (str != null && !str.trim().isEmpty()) {
result = str.trim();
}
}

}

return result;
}

private boolean isEmpty(Object obj) {
return eliminateNull(obj).isEmpty() || eliminateNull(obj).equals("");
}

private boolean ValidateHeaderRecord(HeaderRecordDetail headerRecord) {
if (isEmpty(headerRecord.getRecid()) || isEmpty(headerRecord.getBatchId())
|| isEmpty(headerRecord.getFileGrpSeqnum()) || isEmpty(headerRecord.getFileGrpCount())
|| headerRecord.getBht04CreationDate() == null || isEmpty(headerRecord.getBht05CreationTime())
|| isEmpty("VAFNH") || isEmpty("VA Fee Basis Program") || headerRecord.getLoadtype() == ' '
|| isEmpty(headerRecord.getPudid()) || isEmpty(headerRecord.getFiletype())
|| isEmpty(headerRecord.getVersioncode()) || isEmpty(headerRecord.getReleasecode())) {
logger.info("One of the required field in header is empty, cannot produce CSTAT");
return false;
}
if (headerRecord.getBht04CreationDate().compareTo(new Date()) > 0) {
logger.info("Creation date cannot be greater than current date");
return false;
}
return true;
}
}