/*
* $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.x12dto;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.pb.x12.Segment;
import org.remitt.prototype.SegmentComparator;
import org.remitt.prototype.X12DTO;
import org.remitt.prototype.X12Message;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
public class ClaimAdjustment implements X12DTO {
public class Reason implements X12DTO {
@Attribute(name = "code")
private String code;
@Attribute(name = "quantity")
private Integer quantity;
@Attribute(name = "amount")
private Double amount;
private int position;
public Reason() {
}
public Reason(Segment cas, int position) {
List<Segment> in = new ArrayList<Segment>();
in.add(cas);
processSegmentList(in);
}
@Override
public void processSegmentList(List<Segment> in) {
Segment CAS = X12Message.findSegmentByComparator(in,
new SegmentComparator("CAS"));
try {
this.quantity = Integer.parseInt(X12Message.getSafeElement(CAS,
position));
this.code = X12Message.getSafeElement(CAS, position + 1);
this.amount = Double.parseDouble(X12Message.getSafeElement(CAS,
position + 2));
} catch (Exception ex) {
}
}
public String getCode() {
return this.code;
}
public Integer getQuantity() {
return this.quantity;
}
public Double getAmount() {
return this.amount;
}
}
@Attribute(name = "adjustmentGroupCode")
private String adjustmentGroupCode;
@Element(name = "adjustmentGroup", required = false)
private String adjustmentGroup;
@Element(name = "adjustmentReasonCode")
private String adjustmentReasonCode;
@Element(name = "adjustmentAmount")
private Double adjustmentAmount;
@ElementList(name = "reasons", required = false)
private List<Reason> reasons = new ArrayList<Reason>();
private Map<String, String> adjustmentGroupCodeLookup = new HashMap<String, String>();
public ClaimAdjustment() {
}
public ClaimAdjustment(Segment inAtomic) {
List<Segment> in = new ArrayList<Segment>();
in.add(inAtomic);
processSegmentList(in);
}
public ClaimAdjustment(List<Segment> in) {
processSegmentList(in);
}
@Override
public void processSegmentList(List<Segment> in) {
this.populateAdjustmentGroupCodeLookup();
Segment CAS = X12Message.findSegmentByComparator(in,
new SegmentComparator("CAS"));
this.adjustmentGroupCode = X12Message.getSafeElement(CAS, 1);
this.adjustmentGroup = this.adjustmentGroupCodeLookup
.get(this.adjustmentGroupCode);
this.adjustmentReasonCode = X12Message.getSafeElement(CAS, 2);
this.adjustmentAmount = X12Message.safeDouble(X12Message.getSafeElement(
CAS, 3));
// Attempt to populate "reasons"
for (int iter = 4; iter < 19; iter += 3) {
Reason r = new Reason(CAS, iter);
if (r.getCode() != null) {
reasons.add(r);
}
}
}
private void populateAdjustmentGroupCodeLookup() {
adjustmentGroupCodeLookup.put("CO", "CONTRACTUAL OBLIGATIONS");
adjustmentGroupCodeLookup.put("CH", "CORRECTIONS AND REVERSALS");
adjustmentGroupCodeLookup.put("OA", "OTHER ADJUSTMENTS");
adjustmentGroupCodeLookup.put("PI", "PAYOR INITIATED REDUCTIONS");
adjustmentGroupCodeLookup.put("PR", "PATIENT RESPONSIBILITY");
}
public String getAdjustmentGroupCode() {
return this.adjustmentGroupCode;
}
public String getAdjustmentGroup() {
return this.adjustmentGroup;
}
public String getAdjustmentReasonCode() {
return this.adjustmentReasonCode;
}
public Double getAdjustmentAmount() {
return this.adjustmentAmount;
}
@Override
public String toString() {
return X12Message.serializeDTO(this);
}
}