blob: ae24186c1c6ca16d0ec20edcac37037fc7657d52 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.ofbiz.pos.device.impl;
import jpos.JposException;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.pos.adaptor.DataEventAdaptor;
import org.ofbiz.pos.adaptor.ErrorEventAdaptor;
import org.ofbiz.pos.device.GenericDevice;
import org.ofbiz.pos.screen.PosScreen;
public class Msr extends GenericDevice {
public static final String module = Msr.class.getName();
public static final int MSR_CREDIT_CARD = 100;
public static final int MSR_GIFT_CARD = 101;
public static final int MSR_ATM_CARD = 102;
public static final int MSR_CUST_CARD = 701;
public static final int MSR_CLERK_CARD = 801;
public static final int MSR_UNKNOWN = 999;
public Msr(String deviceName, int timeout) {
super(deviceName, timeout);
this.control = new jpos.MSR();
}
@Override
protected void initialize() throws JposException {
Debug.logInfo("MSR [" + control.getPhysicalDeviceName() + "] Claimed : " + control.getClaimed(), module);
final jpos.MSR msr = (jpos.MSR) control;
msr.setDecodeData(true);
msr.setTracksToRead(2);
// create the data listner
msr.addDataListener(new DataEventAdaptor() {
@Override
public void dataOccurred(jpos.events.DataEvent event) {
String[] decodedData = new String[7];
byte[] track1 = null;
byte[] track2 = null;
try {
// get the raw track data
track1 = msr.getTrack1Data();
track2 = msr.getTrack2Data();
// get the decoded data
decodedData[0] = msr.getTitle();
decodedData[1] = msr.getFirstName();
decodedData[2] = msr.getMiddleInitial();
decodedData[3] = msr.getSurname();
decodedData[4] = msr.getSuffix();
decodedData[5] = msr.getAccountNumber();
// verify the acct num exists
if (UtilValidate.isEmpty(decodedData[5])) {
PosScreen.currentScreen.showDialog("dialog/error/cardreaderror");
msr.clearInput();
return;
}
// fix expDate (reversed)
if (msr.getExpirationDate() != null && msr.getExpirationDate().length() > 3) {
decodedData[6] = msr.getExpirationDate().substring(2) + msr.getExpirationDate().substring(0, 2);
} else {
PosScreen.currentScreen.showDialog("dialog/error/cardreaderror");
msr.clearInput();
return;
}
msr.clearInput();
} catch (jpos.JposException e) {
Debug.logError(e, module);
}
processMsrData(decodedData, track1, track2);
}
});
// create the error listener
msr.addErrorListener(new ErrorEventAdaptor() {
@Override
public void errorOccurred(jpos.events.ErrorEvent event) {
Debug.logInfo("Error Occurred : " + event.getErrorCodeExtended(), module);
PosScreen.currentScreen.showDialog("dialog/error/cardreaderror");
try {
msr.clearInput();
} catch (jpos.JposException e) {
Debug.logError(e, module);
}
}
});
}
protected void processMsrData(String[] decodedData, byte[] track1, byte[] track2) {
StringBuffer msrStr = new StringBuffer();
msrStr.append(decodedData[5]);
msrStr.append("|");
msrStr.append(decodedData[6]);
msrStr.append("|");
msrStr.append(decodedData[1]);
msrStr.append("|");
msrStr.append(decodedData[3]);
// implemented validation
int msrType = MSR_UNKNOWN;
try {
if (UtilValidate.isAnyCard(decodedData[5])) {
msrType = MSR_CREDIT_CARD;
} else if (UtilValidate.isGiftCard(decodedData[5])) {
msrType = MSR_GIFT_CARD;
}
} catch (NumberFormatException e) {
}
// all implemented types
switch (msrType) {
case MSR_CREDIT_CARD:
// make sure we are on the POS pay screen
this.setPayPanel();
PosScreen.currentScreen.getButtons().setLock(true);
String[] credInfo = PosScreen.currentScreen.getInput().getFunction("CREDIT");
if (credInfo == null) {
PosScreen.currentScreen.getInput().setFunction("CREDIT", "");
}
PosScreen.currentScreen.getInput().setFunction("TRACK2", new String(track2));
PosScreen.currentScreen.getInput().setFunction("MSRINFO", msrStr.toString());
PosScreen.currentScreen.getOutput().print("Credit Card Read");
PosScreen.currentScreen.getInput().clearInput();
this.callEnter();
break;
case MSR_GIFT_CARD:
// make sure we are on the POS pay screen
this.setPayPanel();
PosScreen.currentScreen.getButtons().setLock(true);
PosScreen.currentScreen.getInput().setFunction("MSRINFO", msrStr.toString());
PosScreen.currentScreen.getOutput().print("Gift Card Read");
PosScreen.currentScreen.getInput().clearInput();
this.callEnter();
break;
case MSR_UNKNOWN:
PosScreen.currentScreen.showDialog("dialog/error/unknowncardtype");
break;
}
}
private void setPayPanel() {
if (!"main/paypanel".equals(PosScreen.currentScreen.getName())) {
PosScreen pos = PosScreen.currentScreen.showPage("paypanel", false);
pos.getInput().setFunction("TOTAL", "");
pos.refresh();
Debug.logInfo("Switched to paypanel.xml; triggered TOTAL function", module);
}
}
}