×

Welcome to TagMyCode

Please login or create account to add a snippet.
0
0
 
0
Language: Java
Posted by: Dorian Cuentas
Added: Oct 5, 2016 8:54 PM
Views: 11
Tags: no tags
Intérprete de parámetros Visanet
  1. /*
  2.  * ##############################################################################
  3.  * This is a unlicensed code
  4.  * you could find a beautiful piece of code or a disaster that will make you
  5.  * wish a hippocampus dysfunction, no guarantees, use it at your discretion.
  6.  * ns616dc@gmail.com
  7.  * ##############################################################################
  8.  */
  9. package com.iofe.pinpadintegration.ipp320;
  10.  
  11. import java.util.HashMap;
  12. import java.util.Map;
  13.  
  14. /**
  15.  *
  16.  * should interpret responses like:
  17.  * 200C1A11BFIN DE OPERACIONCVISANET/SIETE             D161017E0111F457033******6335G1907H03/10/16I11:38J01L000000000000O80366457P00Q00R00S991162770119528T000000000000U000273#1003#113854#C4
  18.  *
  19.  * @author Dorian Cuentas <ns616dc@gmail.com>
  20.  */
  21. public class ResponseInterpreter {
  22.  
  23.     public static final String STX_STARTofMSG = "";//☻ chacarter
  24.     public static final String ETX_ENDofMSG = ""; //♥
  25.     public static final String FS_FIELSEPARATOR = "";//∟ chacarter
  26.  
  27.     public static enum RESPONSE_PARAMETER_TYPE {
  28.  
  29.         UNDEFINED(0, '?', "Identificador de campo de parámetros de respuesta pinpad no definido"),
  30.         COD_RESP(2, 'A', "Resultado de la operación devuelto por el Host de VisaNet."),
  31.         MSG_END_OPERATION(100, 'B', "Mensaje que indica la finalización de la operación."),
  32.         CLIENT_NAME(1, 'C', ""),
  33.         AUTH_NUMBER(6, 'D', "Número de autorización para la transacción. Generado por el banco"),
  34.         REF_NUMBER(4, 'E', "Número del voucher"),
  35.         CARD_NUMBER(19, 'F', "Número (enmascarado) de la tarjeta con la que se hizo el pago. Ejemplo: 444444******1111"),
  36.         EXPIRATION_DATE(4, 'G', "Formato (MM/AA)"),
  37.         TRANSACCTION_DATE(8, 'H', "Fecha de la transacción. Formato DD/MM/YY"),
  38.         TRANSACCTION_TIME(5, 'I', "Hora de la transacción. Formato HH:MM"),
  39.         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"),
  40.         PAPER_CUT(1, 'K', "Anuncio de corte de papel. Tiene el valor “1”"),
  41.         TIP_AMOUNT(12, 'L', "Monto de cashback o propina ingresado en el pinpad al momento de hacer una venta."),
  42.         WAITER_NUMBER(2, 'M', "Ingresado en el pinpad al momento de hacer el pago."),
  43.         TERMINAL(8, 'O', "Número de serie del pinpad"),
  44.         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"),
  45.         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"),
  46.         PIN_FLAG(2, 'R', "Indica si se solicitó PIN en la transacción de venta. 01: SI 00: NO"),
  47.         UNIQUE_ID(15, 'S', "Id único de transacción VisaNet. Se debe guardar");
  48.  
  49.         public final int maxSize;
  50.         public final char fieldId;
  51.         public final String description;
  52.  
  53.         private RESPONSE_PARAMETER_TYPE(int maxSize, char fieldId, String description) {
  54.             this.maxSize = maxSize;
  55.             this.fieldId = fieldId;
  56.             this.description = description;
  57.         }
  58.  
  59.         /**
  60.          *
  61.          * @param fieldId single character
  62.          * @return UNDEFINED if not existing parameter has been registered or if
  63.          * fieldId.lenght > 1
  64.          * @TODO for performance replace with switch case
  65.          */
  66.         public RESPONSE_PARAMETER_TYPE findParameterType(char fieldId) {
  67.             for (RESPONSE_PARAMETER_TYPE registeredParameterType : values()) {
  68.                 if (registeredParameterType.fieldId == fieldId) {
  69.                     return registeredParameterType;
  70.                 }
  71.             }
  72.             return UNDEFINED;
  73.         }
  74.     }
  75.  
  76.     private String rawResponse;
  77.     private Map<Character, String> interpretedFieldValues;
  78.  
  79.     public ResponseInterpreter(String rawResponse) {
  80.         setRawResponse(rawResponse);
  81.     }
  82.  
  83.     public String getRawResponse() {
  84.         return rawResponse;
  85.     }
  86.  
  87.     public final void setRawResponse(String rawResponse) {
  88.         this.rawResponse = rawResponse;
  89.         resetInterpretedFieldValuesMap();
  90.     }
  91.  
  92.     public Map<Character, String> getInterpretedFieldValues() {
  93.         return interpretedFieldValues;
  94.     }
  95.  
  96.     private void resetInterpretedFieldValuesMap() {
  97.         interpretedFieldValues = new HashMap<>();
  98.     }
  99.  
  100.     /**
  101.      * should interpret the pinpad raw data and return the value for the
  102.      * specified parameter based on "trama de respuesta a la caja" of visanet
  103.      * manuals:
  104.      *
  105.      * @param parameterFieldId
  106.      * @return
  107.      */
  108.     public String getResponseValueForResponseParameter(char parameterFieldId) {
  109.         String responseValue = interpretedFieldValues.get(parameterFieldId);
  110.         if (responseValue == null) {
  111.             int startOfValue = rawResponse.indexOf(FS_FIELSEPARATOR + parameterFieldId + "");
  112.             if (startOfValue > -1) {
  113.                 int endOfValue = rawResponse.indexOf(FS_FIELSEPARATOR, startOfValue + 1);
  114.                 responseValue = rawResponse.substring(startOfValue + 2, endOfValue);
  115.                 interpretedFieldValues.put(parameterFieldId, responseValue);
  116.             }
  117.         }
  118.         return responseValue;
  119.     }
  120.  
  121.     public static boolean isSaleCode(String operationCode) {
  122.         if (operationCode != null && (operationCode.equals("01") || operationCode.equals("02") || operationCode.equals("03"))) {
  123.             return true;
  124.         }
  125.         return false;
  126.     }
  127. }
  128.