/*
* $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.parser;
import java.util.List;
import org.apache.log4j.Logger;
import org.pb.x12.Segment;
import org.remitt.parser.x12dto.ClaimAdjustment;
import org.remitt.parser.x12dto.ClaimInformation;
import org.remitt.parser.x12dto.ClaimPayment;
import org.remitt.parser.x12dto.Payee;
import org.remitt.parser.x12dto.Payer;
import org.remitt.parser.x12dto.ProviderClaimGroup;
import org.remitt.parser.x12dto.Remittance;
import org.remitt.prototype.ParserInterface;
import org.remitt.prototype.SegmentComparator;
import org.remitt.prototype.X12Message;
/**
* Handle X12 835 remittance messages.
*
* @author jeff@freemedsoftware.org
*/
public class X12Message835 extends X12Message implements ParserInterface {
static final Logger log = Logger.getLogger(X12Message835.class);
private Remittance remittance = null;
protected void parseSegments() {
if (getX12message() == null) {
log.error("X12 message not set");
return;
}
debug.println("Begin parsing 835");
position = 1;
debug.println("Extracting transaction header");
List<Segment> header = extractLoop(new SegmentComparator[] {
new SegmentComparator("ISA"), new SegmentComparator("GS"),
new SegmentComparator("ST"), new SegmentComparator("BPR"),
new SegmentComparator("NTE"), new SegmentComparator("TRN"),
new SegmentComparator("CUR"), new SegmentComparator("REF"),
new SegmentComparator("DTM") });
Remittance remittance = new Remittance(header);
debug.println("***** Loop 1000A *****");
while (isNextSegmentIdentifier(new SegmentComparator("N1", 1,
new String[] { "PR" }))) {
List<Segment> loop1000a = extractLoop(new SegmentComparator[] {
new SegmentComparator("N1", 1, new String[] { "PR" }),
new SegmentComparator("N2"), new SegmentComparator("N3"),
new SegmentComparator("N4"), new SegmentComparator("REF"),
new SegmentComparator("PER", 1, new String[] { "CX" }) });
debug.println("Serialize Payer DTO");
Payer payer = new Payer(loop1000a);
debug.println("***** Loop 1000B ***** ");
while (isNextSegmentIdentifier(new SegmentComparator("N1", 1,
new String[] { "PE" }))) {
List<Segment> loop1000b = extractLoop(new SegmentComparator[] {
new SegmentComparator("N1", 1, new String[] { "PE" }),
new SegmentComparator("N3"),
new SegmentComparator("N4"),
new SegmentComparator("REF"),
new SegmentComparator("RDM") });
Payee payee = new Payee(loop1000b);
while (isNextSegmentIdentifier("LX")) {
debug.println("***** Loop 2000 *****");
List<Segment> loop2000 = extractLoop(new SegmentComparator[] {
new SegmentComparator("LX"),
new SegmentComparator("TS3"),
new SegmentComparator("TS2") });
ProviderClaimGroup providerClaimGroup = new ProviderClaimGroup(
loop2000);
while (isNextSegmentIdentifier("CLP")) {
debug.println("***** Loop 2100 *****");
List<Segment> loop2100 = extractLoop(new SegmentComparator[] {
new SegmentComparator("CLP"),
new SegmentComparator("CAS"),
new SegmentComparator("NM1", 1, new String[] {
"QC", "IL", "74", "82", "TT", "PR" }),
new SegmentComparator("MIA"),
new SegmentComparator("MOA"),
new SegmentComparator("REF"),
new SegmentComparator("DTM", 1, new String[] {
"036", "050", "232", "233" }),
new SegmentComparator("PER", 1,
new String[] { "CX" }),
new SegmentComparator("AMT", 1, new String[] {
"AU", "D8", "DY", "F5", "I", "NL", "T",
"T2", "ZK", "ZL", "ZM", "ZN", "ZO",
"ZZ" }),
new SegmentComparator("QTY", 1, new String[] {
"CA", "CD", "LA", "LE", "NA", "NE",
"NR", "OU", "PS", "VS", "ZK", "ZL",
"ZM", "ZN", "ZO" }) });
providerClaimGroup.getClaimPayments().add(
new ClaimPayment(loop2100));
providerClaimGroup.getClaimAdjustments().add(
new ClaimAdjustment(loop2100));
debug.println("***** Loop 2110 *****");
List<Segment> loop2110 = extractLoop(new SegmentComparator[] {
new SegmentComparator("SVC"),
new SegmentComparator("DTM", 1, new String[] {
"150", "151", "472" }),
new SegmentComparator("CAS", 1, new String[] {
"CO", "CR", "OA", "PI", "PR" }),
new SegmentComparator("REF", 1, new String[] {
"1S", "6R", "BB", "E9", "G1", "G3",
"LU", "RB" }),
new SegmentComparator("REF", 1, new String[] {
"1A", "1B", "1C", "1D", "1G", "1H",
"1J", "HPI", "SY", "TJ", "XX" }),
new SegmentComparator("AMT", 1, new String[] {
"B6", "DY", "KH", "NE", "T", "T2",
"ZK", "ZL", "ZM", "ZN", "ZO" }),
new SegmentComparator("QTY", 1, new String[] {
"NE", "ZK", "ZL", "ZM", "ZN", "ZO" }),
new SegmentComparator("LQ", 1, new String[] {
"HE", "RX" }) });
providerClaimGroup.getClaimInformations().add(
new ClaimInformation(loop2110));
log.info("2110 finished");
}
payee.getProviderClaimGroup().add(providerClaimGroup);
log.info("2100 finished");
}
payer.getPayees().add(payee);
log.info("2000 finished");
}
remittance.getPayers().add(payer);
}
debug.println("Summary loop");
/*
List<Segment> summary = extractLoop(new SegmentComparator[] {
new SegmentComparator("PLB"), new SegmentComparator("SE") });
*/
debug.println("Finished parsing 835");
setRemittance(remittance);
debug.println(remittance.toString());
}
public Remittance getRemittance() {
return this.remittance;
}
public void setRemittance(Remittance r) {
this.remittance = r;
}
@Override
public String parseData(String inputData) throws Exception {
this.parse(inputData);
return getRemittance().toString();
}
}