package com.finance.iso.iso8583.jpos.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import javax.xml.namespace.QName; import org.apache.axiom.om.OMElement; import org.jpos.iso.ISOException; import org.jpos.iso.ISOMsg; import org.jpos.iso.ISOUtil; import com.finance.iso.iso8583.mediator.XLinkAccountInfoWrapper; import com.finance.iso.iso8583.mediator.XLinkISO8583Constant; import com.finance.iso.iso8583.mediator.XLinkSessionWrapper; public class PaymentUtils { private static final String OPERATION_TYPE = "OperationType"; private static final String REV_OPERATION_TYPE = "RevOperationType"; public static void createPaymentMessage(ISOMsg request,OMElement requestOM, XLinkAccountInfoWrapper accountInfoWrapper, XLinkSessionWrapper sessionWrapper) throws ISOException { final String field11 = ISOUtil.padleft(sessionWrapper.getNextRequestId(), XLinkISO8583Constant.FIELD_11_LENGTH, '0'); // MBSB Spec is here request.setMTI("0200"); request.set(3, "501000"); OMElement amountNode = requestOM.getFirstChildWithName(new QName("Amount")); String amount= "0"; if(amountNode!=null){ amount=amountNode.getText(); } request.set(4, ISOUtil.padleft(amount, 18, '0')); SimpleDateFormat dateFormat = new SimpleDateFormat("MMddHHmmss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); request.set(7, dateFormat.format(new Date())); request.set(11, field11); request.set(12, new SimpleDateFormat("HHmmss").format(new Date())); request.set(13, new SimpleDateFormat("MMdd").format(new Date())); request.set(18, XLinkISO8583Constant.REQUEST_FIELD_18); request.set(24, "000"); request.set(32, XLinkISO8583Constant.REQUEST_FIELD_32); request.set(37, new SimpleDateFormat("MMdd").format(new Date())+"00"+field11.substring(6)); String source=accountInfoWrapper.getAccountno(); request.set(41, ISOMsgUtils.generateField41(source)); request.set(42,ISOMsgUtils.generateField42(source)); request.set(43, ISOMsgUtils.generateField43(source)); request.set(49, XLinkISO8583Constant.REQUEST_FIELD_49); StringBuilder sb=new StringBuilder(); String destination=null; OMElement toNode = requestOM.getFirstChildWithName(new QName("To")); if(toNode !=null){ destination = toNode.getText(); } String curRate="1.0"; OMElement curRateNode = requestOM.getFirstChildWithName(new QName("CurRate")); if(curRateNode !=null){ curRate = curRateNode.getText(); } sb.append(ISOUtil.padright(destination, 30, ' ')); sb.append(ISOUtil.padright(source, 30, ' ')); sb.append(ISOUtil.padright(field11, 16, ' ')); sb.append(360); sb.append(360); sb.append(ISOUtil.padright(curRate, 12, '0')); request.set(61,sb.toString()); //FROM ACCOUNT request.set(98,ISOUtil.padright(XLinkISO8583Constant.REQUEST_FIELD_98_ON_US, 25, ' ')); //ON US Why 25 length what to do for the rest? request.set(102, source); //SAME as PAN? //This is only for Payments // request.set(103, destination); //REMOTE PAN // // String toAIIC=null; // OMElement toAIICNode = requestOM.getFirstChildWithName(new QName("ToAIIC")); // if(toAIICNode != null){ // toAIIC=toAIICNode.getText(); // } // //For testing Transfer on us // if(toAIIC == null){ // toAIIC = XLinkISO8583Constant.REQUEST_FIELD_32; // } // // request.set(127, toAIIC); //From previous Trx } public static void createTopUpMessage(ISOMsg request,OMElement requestOM, XLinkAccountInfoWrapper accountInfoWrapper, XLinkSessionWrapper sessionWrapper) throws ISOException { final String field11 = ISOUtil.padleft(sessionWrapper.getNextRequestId(), XLinkISO8583Constant.FIELD_11_LENGTH, '0'); // MBSB Spec is here request.setMTI("0200"); request.set(3, "561000"); //300100 AccType 01-Savings Account OMElement amountNode = requestOM.getFirstChildWithName(new QName("Amount")); String amount= null; if(amountNode!=null){ amount=amountNode.getText(); } //Testing if(amount == null){ amount="15000000"; } request.set(4, ISOUtil.padleft(amount, 18, '0')); SimpleDateFormat dateFormat = new SimpleDateFormat("MMddHHmmss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); request.set(7, dateFormat.format(new Date())); request.set(11, field11); request.set(12, new SimpleDateFormat("HHmmss").format(new Date())); request.set(13, new SimpleDateFormat("MMdd").format(new Date())); request.set(18, XLinkISO8583Constant.REQUEST_FIELD_18); // >> For MBSB it needs to be 6017 request.set(24, "000"); request.set(32, XLinkISO8583Constant.REQUEST_FIELD_32); request.set(37, new SimpleDateFormat("MMdd").format(new Date())+"00"+field11.substring(6)); //TrxId 12345678 String source=accountInfoWrapper.getAccountno(); request.set(41, ISOMsgUtils.generateField41(source)); //Needd to know request.set(42,ISOMsgUtils.generateField42(source)); //Need to know request.set(43, ISOMsgUtils.generateField43(source)); request.set(49, XLinkISO8583Constant.REQUEST_FIELD_49); StringBuilder sb=new StringBuilder(); String destination=null; OMElement toNode = requestOM.getFirstChildWithName(new QName("To")); if(toNode !=null){ destination = toNode.getText(); } //For testing if(destination == null){ destination = "1000452239"; } //For testing if(source == null){ source = "1000296231"; } String curRate="1.0"; OMElement curRateNode = requestOM.getFirstChildWithName(new QName("CurRate")); if(curRateNode !=null){ curRate = curRateNode.getText(); } sb.append(ISOUtil.padright(destination, 30, ' ')); sb.append(ISOUtil.padright(source, 30, ' ')); sb.append(ISOUtil.padright(field11, 16, ' ')); sb.append(360); sb.append(360); sb.append(ISOUtil.padright(curRate, 12, '0')); request.set(61,sb.toString()); //FROM ACCOUNT request.set(98,ISOUtil.padright(XLinkISO8583Constant.REQUEST_FIELD_98_ON_US, 25, ' ')); //ON US Why 25 length what to do for the rest? request.set(102, source); //SAME as PAN? //This is only for Payments // request.set(103, destination); //REMOTE PAN // // String toAIIC=null; // OMElement toAIICNode = requestOM.getFirstChildWithName(new QName("ToAIIC")); // if(toAIICNode != null){ // toAIIC=toAIICNode.getText(); // } // //For testing Transfer on us // if(toAIIC == null){ // toAIIC = XLinkISO8583Constant.REQUEST_FIELD_32; // } // // request.set(127, toAIIC); //From previous Trx } public static void createTransferMessage(ISOMsg request,OMElement requestOM, XLinkAccountInfoWrapper accountInfoWrapper, XLinkSessionWrapper sessionWrapper) throws ISOException { final String field11 = ISOUtil.padleft(sessionWrapper.getNextRequestId(), XLinkISO8583Constant.FIELD_11_LENGTH, '0'); // MBSB Spec is here request.setMTI("0200"); String sourceAcctType="10"; //Assign the Default Account OMElement sourceAcctTypeNode = requestOM.getFirstChildWithName(new QName("SourceAcctType")); if(sourceAcctTypeNode !=null && !"".equals(sourceAcctTypeNode.getText())){ sourceAcctType=sourceAcctTypeNode.getText(); } String destAcctType="00"; //Assign the Default Account OMElement destAcctTypeNode = requestOM.getFirstChildWithName(new QName("DestAcctType")); if(destAcctTypeNode !=null && !"".equals(destAcctTypeNode.getText())){ destAcctType=destAcctTypeNode.getText(); } request.set(3, "49"+sourceAcctType+destAcctType); OMElement amountNode = requestOM.getFirstChildWithName(new QName("Amount")); String amount= "0"; if(amountNode!=null){ amount=amountNode.getText(); } // if(amount.contains(".")){ // amount=amount.replace(".", ""); // } request.set(4, ISOUtil.padleft(amount, 18, '0')); SimpleDateFormat dateFormat = new SimpleDateFormat("MMddHHmmss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); request.set(7, dateFormat.format(new Date())); request.set(11, field11); request.set(12, new SimpleDateFormat("HHmmss").format(new Date())); request.set(13, new SimpleDateFormat("MMdd").format(new Date())); request.set(18, XLinkISO8583Constant.REQUEST_FIELD_18); request.set(24, "000"); request.set(32, XLinkISO8583Constant.REQUEST_FIELD_32); OMElement messageIdNode = requestOM.getFirstChildWithName(new QName("MessageId")); String messageId= field11.substring(6); if(messageIdNode!=null){ messageId=messageIdNode.getText(); } //This is going to be our reference no as well String field37 = new SimpleDateFormat("MMdd").format(new Date())+"00"+messageId; request.set(37, field37); String source=accountInfoWrapper.getAccountno(); request.set(41, ISOMsgUtils.generateField41(source)); request.set(42,ISOMsgUtils.generateField42(source)); request.set(43, ISOMsgUtils.generateField43(source)); request.set(49, XLinkISO8583Constant.REQUEST_FIELD_49); StringBuilder sb=new StringBuilder(); String destinationName=""; OMElement toNameNode = requestOM.getFirstChildWithName(new QName("ToAccountName")); if(toNameNode !=null){ destinationName = toNameNode.getText(); } String sourceName=""; OMElement fromNameNode = requestOM.getFirstChildWithName(new QName("FromAccountName")); if(toNameNode !=null){ sourceName = fromNameNode.getText(); } String curRate="1.0"; OMElement curRateNode = requestOM.getFirstChildWithName(new QName("CurRate")); if(curRateNode !=null){ curRate = curRateNode.getText(); } String toCurCode="360"; OMElement curCodeNode = requestOM.getFirstChildWithName(new QName("CurCode")); if(curCodeNode !=null){ toCurCode = curCodeNode.getText(); } sb.append(ISOUtil.padright(destinationName, 30, ' ')); sb.append(ISOUtil.padright(sourceName, 30, ' ')); sb.append(ISOUtil.padright(messageId, 16, ' ')); sb.append(toCurCode); sb.append(360); sb.append(ISOUtil.padleft(curRate, 12, ' ')); request.set(61,sb.toString()); String destination=null; OMElement toNode = requestOM.getFirstChildWithName(new QName("To")); if(toNode !=null){ destination = toNode.getText(); } request.set(98,ISOUtil.padright(XLinkISO8583Constant.REQUEST_FIELD_98_ON_US, 25, ' ')); request.set(102, source); request.set(103, destination); String dIIC=null; OMElement dIICNode = requestOM.getFirstChildWithName(new QName("DIIC")); if(dIICNode != null){ dIIC=dIICNode.getText(); } //Assuming an Internal Transfer if DIIC is not there if(dIIC == null){ dIIC = XLinkISO8583Constant.REQUEST_FIELD_32; } request.set(127, dIIC); } public static void createReversalMessage(ISOMsg request,OMElement requestOM, XLinkAccountInfoWrapper accountInfoWrapper, XLinkSessionWrapper sessionWrapper, String reversalKey) throws ISOException { final String field11 = ISOUtil.padleft(sessionWrapper.getNextRequestId(), XLinkISO8583Constant.FIELD_11_LENGTH, '0'); // MBSB Spec is here request.setMTI("0420"); OMElement revOperationRequest = requestOM .getFirstChildWithName((new QName(REV_OPERATION_TYPE))); String revOperationType=null; if(revOperationRequest !=null){ revOperationType=revOperationRequest.getText(); } request.set(3, revOperationType+"1000"); //300100 AccType 01-Savings Account OMElement amountNode = requestOM.getFirstChildWithName(new QName("Amount")); String amount= null; if(amountNode!=null){ amount=amountNode.getText(); } // if(amount.contains(".")){ // amount=amount.replace(".", ""); // } //Testing if(amount == null){ amount="0"; } String field7=reversalKey.substring(17,27); String field37=reversalKey.substring(31); request.set(4, ISOUtil.padleft(amount, 12, '0')); request.set(7, field7); request.set(11, field11); request.set(18, XLinkISO8583Constant.REQUEST_FIELD_18); // >> For MBSB it needs to be 6017 request.set(32, XLinkISO8583Constant.REQUEST_FIELD_32); request.set(37, field37); //TrxId 12345678 String source=accountInfoWrapper.getAccountno(); request.set(41, ISOMsgUtils.generateField41(source)); //Needd to know if(reversalKey==null){ OMElement revKeyNode = requestOM.getFirstChildWithName(new QName("RevKey")); if(revKeyNode!=null){ reversalKey=revKeyNode.getText(); } } request.set(90, reversalKey); String destination=null; OMElement toNode = requestOM.getFirstChildWithName(new QName("To")); if(toNode !=null){ destination = toNode.getText(); } //For testing if(destination == null){ destination = "1000452239"; } //For testing if(source == null){ source = "1000296231"; } request.set(102, source); //SAME as PAN? if(destination != null){ request.set(103, destination); //REMOTE PAN } String toAIIC=null; OMElement toAIICNode = requestOM.getFirstChildWithName(new QName("DIIC")); if(toAIICNode != null){ toAIIC=toAIICNode.getText(); } //For testing Transfer on us if(toAIIC == null){ toAIIC = XLinkISO8583Constant.REQUEST_FIELD_32; } if(toAIIC !=null){ request.set(127, toAIIC); //From previous Trx } } }