import com.americancoders.edi.*;
import com.americancoders.edi.x12.*;
import java.util.*;
import java.text.*;
import java.io.*;
public class AccountEDI {
private static final int BLANK_FILL = 0;
private static final int ZERO_FILL = 1;
private static final int LEFT_JUSTIFY = 0;
private static final int RIGHT_JUSTIFY = 1;
private static final int DATA_LENGTH = 0;
private static final int MIN_LENGTH = 1;
private static final int MAX_LENGTH = 2;
private static final String accountNum = "GMT100000009999";
private static final String fromID = "1111111111111";
private static final String toID = "2222222222222";
public static void main( String args[] ) {
String fullDate;
String transDate;
String transTime;
Segment seg = null;
Segment detail = null;
Segment names = null;
Segment qty = null;
Table tbl = null;
String inputFileName;
String interchangeControlNumber;
String functionalGroupControlNumber;
String transactionSetControlNumber;
DataElement elem = null;
Date date = new Date();
SimpleDateFormat fmt;
BufferedReader br = null;
StringTokenizer st;
String lineIn = null;
String token = null;
String cmd = null;
int lineNum = 0;
int count = 0;
int segs = 0;
/*
* get the date and time in the correct format
*/
fmt = new SimpleDateFormat( "yyyyMMdd" );
fullDate = fmt.format( date );
transDate = fullDate.substring( 2 );
fmt = new SimpleDateFormat( "HHmmss" );
transTime = fmt.format( date );
/*
* ensure correct usage
*/
if( args.length != 4 ) {
System.err.println( "Usage: AccountEDI filename " +
"ic# gc# tc#" );
System.exit( 12 );
}
inputFileName = args[0];
interchangeControlNumber = args[1];
functionalGroupControlNumber = args[2];
transactionSetControlNumber = args[3];
/*
* open the specified input file
*/
try {
br = new BufferedReader( new FileReader(
inputFileName ) );
}
catch( Exception e ) {
System.err.println( "AccountEDI: open(" + inputFileName
+ "): " + e.toString() );
System.exit( 12 );
}
/*
* create a new envelope
*/
X12Envelope env = new X12Envelope();
/*
* build the ISA header
*/
seg = Interchange_Control_Header.getInstance();
setElement( seg.getDataElement( 0 ), "0", ZERO_FILL, 0,
MIN_LENGTH );
setElement( seg.getDataElement( 1 ), " ", BLANK_FILL, 0,
MIN_LENGTH );
setElement( seg.getDataElement( 2 ), "0", ZERO_FILL, 0,
MIN_LENGTH );
setElement( seg.getDataElement( 3 ), " ", BLANK_FILL, 0,
MIN_LENGTH );
setElement( seg.getDataElement( 4 ), "1", ZERO_FILL,
RIGHT_JUSTIFY, MIN_LENGTH );
setElement( seg.getDataElement( 5 ), fromID,
BLANK_FILL, 0, MIN_LENGTH );
setElement( seg.getDataElement( 6 ), "1", ZERO_FILL,
RIGHT_JUSTIFY, MIN_LENGTH );
setElement( seg.getDataElement( 7 ), toID,
BLANK_FILL, 0, MIN_LENGTH );
setElement( seg.getDataElement( 8 ), transDate, 0, 0, 0 );
setElement( seg.getDataElement( 9 ), transTime, 0, 0, 0 );
setElement( seg.getDataElement( 10 ), "U", 0, 0, 0 );
setElement( seg.getDataElement( 11 ), "200", ZERO_FILL,
RIGHT_JUSTIFY, MIN_LENGTH );
setElement( seg.getDataElement( 12 ), interchangeControlNumber,
ZERO_FILL, RIGHT_JUSTIFY, MIN_LENGTH );
setElement( seg.getDataElement( 13 ), "0", 0, 0, 0 );
setElement( seg.getDataElement( 14 ), "T", 0, 0, 0 );
setElement( seg.getDataElement( 15 ), ":", 0, 0, 0 );
env.setInterchange_Header( seg );
env.setInProcess();
/*
* create a new functional group
*/
FunctionalGroup fg = null;
try {
fg = X12FunctionalGroup.getInstance();
}
catch( Exception e ) {
e.printStackTrace();
System.exit( 12 );
}
/*
* build the group header
*/
seg = fg.getHeader();
setElement( seg.getDataElement( 0 ), "PT", 0, 0, 0 );
setElement( seg.getDataElement( 1 ), fromID, 0, 0, 0 );
setElement( seg.getDataElement( 2 ), toID, 0, 0, 0 );
setElement( seg.getDataElement( 3 ), transDate, 0, 0, 0 );
setElement( seg.getDataElement( 4 ), transTime, 0, 0, 0 );
seg.getDataElement( 5 ).setMinLength( 1 );
setElement( seg.getDataElement( 5 ),
functionalGroupControlNumber, 0, 0, DATA_LENGTH );
setElement( seg.getDataElement( 6 ), "T", 0, 0, 0 );
setElement( seg.getDataElement( 7 ), "004010", 0, 0, 0 );
/*
* create a new transaction set
*/
TransactionSet ts = null;
try {
ts = TransactionSetFactory.buildTransactionSet( "867" );
}
catch( Exception e ) {
e.printStackTrace();
}
/*
* build the header table
*/
tbl = ts.getHeaderTable();
seg = tbl.createSegment( "ST" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( "867" );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 1 );
setElement( elem, transactionSetControlNumber, ZERO_FILL,
RIGHT_JUSTIFY, MIN_LENGTH );
seg.addDataElement( elem );
tbl.addSegment( seg );
/*
* build the beginning segment
*/
seg = tbl.createSegment( "BPT" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( "08" );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 2 );
elem.set( fullDate );
seg.addDataElement( elem );
tbl.addSegment( seg );
/*
* build the reference
*/
seg = tbl.createSegment( "REF" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( "VR" );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 1 );
elem.set( accountNum );
seg.addDataElement( elem );
tbl.addSegment( seg );
/*
* build the detail table
*/
tbl = ts.getDetailTable();
for(;;) {
try {
lineIn = br.readLine();
}
catch( IOException e ) {
System.err.println( "AccountEDI: read(" +
inputFileName + "): " + e.toString() );
break;
}
if( lineIn == null )
break;
lineNum++;
st = new StringTokenizer( lineIn, "\t" );
token = st.nextToken();
if( token.equals( "create" ) )
cmd = "DS";
else if( token.equals( "delete" ) )
cmd = "SC";
else if( token.equals( "modify" ) )
cmd = "BK";
else {
System.err.println( "AccountEDI: " + token +
": invalid operation in line " + lineNum );
continue;
}
count++;
detail = tbl.createSegment( "PTD" );
segs++;
elem = (DataElement) detail.buildDE( 0 );
elem.set( cmd );
detail.addDataElement( elem );
seg = detail.createSegment( "DTM" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( "771" );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 1 );
elem.set( st.nextToken() );
seg.addDataElement( elem );
detail.addSegment( seg );
seg = detail.createSegment( "REF" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( "11" );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 2 );
elem.set( st.nextToken() );
seg.addDataElement( elem );
detail.addSegment( seg );
seg = detail.createSegment( "REF" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( "U5" );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 2 );
elem.set( st.nextToken() );
seg.addDataElement( elem );
detail.addSegment( seg );
names = detail.createSegment( "N1" );
segs++;
elem = (DataElement) names.buildDE( 0 );
elem.set( "53" );
names.addDataElement( elem );
elem = (DataElement) names.buildDE( 1 );
elem.set( st.nextToken() );
names.addDataElement( elem );
elem = (DataElement) names.buildDE( 2 );
elem.set( "12" );
names.addDataElement( elem );
elem = (DataElement) names.buildDE( 3 );
token = dequote( st.nextToken() );
elem.set( token );
names.addDataElement( elem );
seg = names.createSegment( "N3" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( st.nextToken() );
seg.addDataElement( elem );
token = dequote( st.nextToken() );
if( token.length() > 0 ) {
elem = (DataElement) seg.buildDE( 1 );
elem.set( token );
seg.addDataElement( elem );
}
names.addSegment( seg );
seg = names.createSegment( "N4" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( st.nextToken() );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 1 );
elem.set( st.nextToken() );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 2 );
elem.set( st.nextToken() );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 3 );
elem.set( st.nextToken() );
seg.addDataElement( elem );
names.addSegment( seg );
seg = names.createSegment( "PER" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( "CW" );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 2 );
elem.set( "EM" );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 3 );
token = dequote( st.nextToken() );
elem.set( token );
seg.addDataElement( elem );
names.addSegment( seg );
detail.addSegment( names );
names = detail.createSegment( "N1" );
segs++;
elem = (DataElement) names.buildDE( 0 );
elem.set( "BB" );
names.addDataElement( elem );
elem = (DataElement) names.buildDE( 1 );
elem.set( st.nextToken() );
names.addDataElement( elem );
detail.addSegment( names );
names = detail.createSegment( "N1" );
segs++;
elem = (DataElement) names.buildDE( 0 );
elem.set( "DS" );
names.addDataElement( elem );
elem = (DataElement) names.buildDE( 1 );
token = dequote( st.nextToken() );
elem.set( token );
names.addDataElement( elem );
elem = (DataElement) names.buildDE( 2 );
elem.set( "MI" );
names.addDataElement( elem );
elem = (DataElement) names.buildDE( 3 );
elem.set( st.nextToken() );
names.addDataElement( elem );
detail.addSegment( names );
qty = detail.createSegment( "QTY" );
segs++;
elem = (DataElement) qty.buildDE( 0 );
elem.set( "01" );
qty.addDataElement( elem );
elem = (DataElement) qty.buildDE( 1 );
elem.set( "1" );
qty.addDataElement( elem );
seg = qty.createSegment( "REF" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( "44" );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 1 );
elem.set( st.nextToken() );
seg.addDataElement( elem );
qty.addSegment( seg );
detail.addSegment( qty );
tbl.addSegment( detail );
}
try {
br.close();
}
catch( IOException e ) {
}
/*
* build the summary table
*/
tbl = ts.getSummaryTable();
seg = tbl.createSegment( "CTT" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( String.valueOf( count ) );
seg.addDataElement( elem );
tbl.addSegment( seg );
seg = tbl.createSegment( "SE" );
segs++;
elem = (DataElement) seg.buildDE( 0 );
elem.set( String.valueOf( segs ) );
seg.addDataElement( elem );
elem = (DataElement) seg.buildDE( 1 );
setElement( elem, transactionSetControlNumber, ZERO_FILL,
RIGHT_JUSTIFY, MIN_LENGTH );
seg.addDataElement( elem );
tbl.addSegment( seg );
/*
* add the transaction set to the functional group
*/
if( ts != null )
fg.addTransactionSet( ts );
/*
* add the functional group to the envelope
*/
env.addFunctionalGroup( fg );
/*
* build the group trailer
*/
seg = fg.getTrailer();
setElement( seg.getDataElement( 0 ), "1", 0, 0, DATA_LENGTH );
seg.getDataElement( 1 ).setMinLength(
functionalGroupControlNumber.length() );
setElement( seg.getDataElement( 1 ),
functionalGroupControlNumber, 0, 0, DATA_LENGTH );
/*
* build the interchange trailer
*/
seg = Interchange_Control_Trailer.getInstance();
setElement( seg.getDataElement( 0 ), "1", 0, 0, DATA_LENGTH );
setElement( seg.getDataElement( 1 ), interchangeControlNumber,
ZERO_FILL, RIGHT_JUSTIFY, MIN_LENGTH );
env.setInterchange_Trailer( seg );
/*
* generate the output
*/
System.out.print( env.getFormattedText( Envelope.X12_FORMAT ) );
}
private static void setElement( DataElement elem, String contents,
int fill, int justify, int length ) {
int bufLen = 0;
switch( length ) {
case MIN_LENGTH:
bufLen = elem.getMinLength();
break;
case MAX_LENGTH:
bufLen = elem.getMaxLength();
break;
default:
bufLen = contents.length();
elem.set( new String( contents ) );
return;
}
if( contents.length() > bufLen ) {
if( justify == RIGHT_JUSTIFY )
elem.set( contents.substring(
bufLen - contents.length() ) );
else
elem.set( contents.substring( 0, bufLen ) );
return;
}
StringBuffer sb = new StringBuffer( bufLen );
sb.append( contents );
while( sb.length() < bufLen ) {
if( justify == RIGHT_JUSTIFY )
sb.insert( 0, ( fill == ZERO_FILL ) ? '0' :
' ' );
else
sb.append( ( fill == ZERO_FILL ) ? '0' : ' ' );
}
elem.set( sb.toString() );
}
private static String dequote( String string ) {
if( ( string.charAt( 0 ) == '\'' ) ||
( string.charAt( 0 ) == '"' ) )
return( string.substring( 1, string.length() - 1 ) );
return( string );
}
}