/*
* ##############################################################################
* This is a unlicensed code
* you could find a beautiful piece of code or a disaster that will make you
* wish a hippocampus dysfunction, no guarantees, use it at your discretion.
* ns616dc@gmail.com
* ##############################################################################
*/
package com.iofe.pinpadintegration.ipp320;
import java.util.HashMap;
import java.util.Map;
/**
*
* should interpret responses like:
* 200C1A11BFIN DE OPERACIONCVISANET/SIETE D161017E0111F457033******6335G1907H03/10/16I11:38J01L000000000000O80366457P00Q00R00S991162770119528T000000000000U000273#1003#113854#C4
*
* @author Dorian Cuentas <ns616dc@gmail.com>
*/
public class ResponseInterpreter {
public static final String STX_STARTofMSG
= "";//☻ chacarter
public static final String ETX_ENDofMSG
= ""; //♥
public static final String FS_FIELSEPARATOR
= "";//∟ chacarter
public static enum RESPONSE_PARAMETER_TYPE {
UNDEFINED(0, '?', "Identificador de campo de parámetros de respuesta pinpad no definido"),
COD_RESP(2, 'A', "Resultado de la operación devuelto por el Host de VisaNet."),
MSG_END_OPERATION(100, 'B', "Mensaje que indica la finalización de la operación."),
CLIENT_NAME(1, 'C', ""),
AUTH_NUMBER(6, 'D', "Número de autorización para la transacción. Generado por el banco"),
REF_NUMBER(4, 'E', "Número del voucher"),
CARD_NUMBER(19, 'F', "Número (enmascarado) de la tarjeta con la que se hizo el pago. Ejemplo: 444444******1111"),
EXPIRATION_DATE(4, 'G', "Formato (MM/AA)"),
TRANSACCTION_DATE(8, 'H', "Fecha de la transacción. Formato DD/MM/YY"),
TRANSACCTION_TIME(5, 'I', "Hora de la transacción. Formato HH:MM"),
OPERATION_CODE(2, 'J', "Código de operación efectuada. 01: Venta 02: Venta con cashback 03: Venta cuotas 04: Anulación 06: Captura propina 08: POS Servicios 10: Simulación cuotas"),
PAPER_CUT(1, 'K', "Anuncio de corte de papel. Tiene el valor “1”"),
TIP_AMOUNT(12, 'L', "Monto de cashback o propina ingresado en el pinpad al momento de hacer una venta."),
WAITER_NUMBER(2, 'M', "Ingresado en el pinpad al momento de hacer el pago."),
TERMINAL(8, 'O', "Número de serie del pinpad"),
PAYMENT_DUES(2, 'P', "Número de cuotas con que se procesó la venta. Se ingresa en el pinpad al momento de hacer una venta"),
DEFERRED_PAYMENT(2, 'Q', "Indica si en el pinpad se ingresó la opción de pago diferido al momento de hacer la venta. 01: SI 00: NO"),
PIN_FLAG(2, 'R', "Indica si se solicitó PIN en la transacción de venta. 01: SI 00: NO"),
UNIQUE_ID(15, 'S', "Id único de transacción VisaNet. Se debe guardar");
public final int maxSize;
public final char fieldId;
public final String description
;
private RESPONSE_PARAMETER_TYPE
(int maxSize,
char fieldId,
String description
) {
this.maxSize = maxSize;
this.fieldId = fieldId;
this.description = description;
}
/**
*
* @param fieldId single character
* @return UNDEFINED if not existing parameter has been registered or if
* fieldId.lenght > 1
* @TODO for performance replace with switch case
*/
public RESPONSE_PARAMETER_TYPE findParameterType(char fieldId) {
for (RESPONSE_PARAMETER_TYPE registeredParameterType : values()) {
if (registeredParameterType.fieldId == fieldId) {
return registeredParameterType;
}
}
return UNDEFINED;
}
}
private Map
<Character, String
> interpretedFieldValues
;
public ResponseInterpreter
(String rawResponse
) {
setRawResponse(rawResponse);
}
public String getRawResponse
() {
return rawResponse;
}
public final void setRawResponse
(String rawResponse
) {
this.rawResponse = rawResponse;
resetInterpretedFieldValuesMap();
}
public Map
<Character, String
> getInterpretedFieldValues
() {
return interpretedFieldValues;
}
private void resetInterpretedFieldValuesMap() {
interpretedFieldValues = new HashMap<>();
}
/**
* should interpret the pinpad raw data and return the value for the
* specified parameter based on "trama de respuesta a la caja" of visanet
* manuals:
*
* @param parameterFieldId
* @return
*/
public String getResponseValueForResponseParameter
(char parameterFieldId
) {
String responseValue
= interpretedFieldValues.
get(parameterFieldId
);
if (responseValue == null) {
int startOfValue = rawResponse.indexOf(FS_FIELSEPARATOR + parameterFieldId + "");
if (startOfValue > -1) {
int endOfValue = rawResponse.indexOf(FS_FIELSEPARATOR, startOfValue + 1);
responseValue = rawResponse.substring(startOfValue + 2, endOfValue);
interpretedFieldValues.put(parameterFieldId, responseValue);
}
}
return responseValue;
}
public static boolean isSaleCode
(String operationCode
) {
if (operationCode != null && (operationCode.equals("01") || operationCode.equals("02") || operationCode.equals("03"))) {
return true;
}
return false;
}
}