📄 sioptrx.cpp
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// IT24 Sistemas S.A.
// Process ATM Transaction Method
//
// Metodo de Procesamiento de Transaccion ATM, con conexion y desconexion a base de
// datos para cada transaccion entrante, con manejo local de parsing del mensaje ISO
// y seteo del codigo de respuesta en el mensaje saliente.
//
// Tarea Fecha Autor Observaciones
// (Inicial) 2003.05.09 mdc Base
// (Inicial) 2003.06.04 mdc REVERSAL REASONS
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Headers ANSI C/C++
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include <memory.h>
#ifndef _SYSTEM_ATM_
#define _SYSTEM_ATM_DEFINED_
#define _SYSTEM_ATM_
#endif // _SYSTEM_ATM_DEFINED_
// Header Transaction Resolution
#include <qusrinc/trxres.h>
// Libreria de utilidades estandards
#include <qusrinc/stdiol.h>
// Header ISO Msg Redefinition
#include <qusrinc/isoredef.h>
// Header ISO 8583
#include <qusrinc/iso8583.h>
// Header EXTRACT BASE24 RED LINK
#include <qusrinc/extrctst.h>
#ifdef _SYSTEM_ATM_DEFINED_
#undef _SYSTEM_ATM_
#endif // _SYSTEM_ATM_DEFINED_
// Librerias propias de TCP/IP v4
#include <qusrinc/tcp4u.h>
/////////////////////////////////////////////////////////////////////////////////////////
// Definiciones y Macros de expansion MUY utiles para simplificar el codigo
/////////////////////////////////////////////////////////////////////////////////////////
// Macro de asignacion de String, con NULL al final
#define COPYSTRING(dst,src) strcpy(dst,src)
// Macro de asignacion de String, con NULL al final
#define ASSIGNSTRING(dst,src) \
{ strncpy(dst,src,sizeof(src)); dst[sizeof(src)]=0x00; }
// Macro de asignacion de bytes a campo de estructura
#define ASSIGNFIELD(dst,src) \
{ memset(dst,' ',sizeof(dst)); memcpy(dst,src,min(sizeof(src),sizeof(dst))); }
// Macro de asignacion de ceros a campo de estructura
#define SETFIELDZEROED(dst) memset(dst ,'0',sizeof(dst))
#define SETFIELDBLANKED(dst) memset(dst ,' ',sizeof(dst))
#define SETSTRUCTZEROED(dst) memset(&dst,'0',sizeof(dst))
#define SETSTRUCTBLANKED(dst) memset(&dst,' ',sizeof(dst))
#define SETSTRUCTNULL(dst) memset(&dst, 0x00,sizeof(dst))
// Mascara de inicializacion de time-stamp
#define _TIMESTAMP_MASK_YYYY_ "YYYYMMDDHHMMSS"
#define _TIMESTAMP_MASK_YY_ "YYMMDDHHMMSS"
#define _TIMESTAMP_MASK_ _TIMESTAMP_MASK_YY_
/////////////////////////////////////////////////////////////////////////////////////////
// Prototipo de funcion utilitaria que retorna la cantidad de bytes numericos en string
/////////////////////////////////////////////////////////////////////////////////////////
short strnumlen( char *pszValue , const short nMax );
/////////////////////////////////////////////////////////////////////////////////////////
// Longitud maxima de tarjeta en TACK-2
static const short _MAX_CARDNUM_LEN_ = 19;
/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////
TrxResSIOP::TrxResSIOP()
{
}
/////////////////////////////////////////////////////////////////////////////////////
// Constructor opcional con parametros para el back-end
///////////////////////////////////////////////////////////////////////////////////
TrxResSIOP::TrxResSIOP(char szIPBackEnd[], unsigned short usPortBackEnd)
{
// Configurar el Back End
tcpConn.setHost( szIPBackEnd );
tcpConn.setUsPort( usPortBackEnd );
}
///////////////////////////////////////////////////////////////////////////////////
// Destructor
///////////////////////////////////////////////////////////////////////////////////
TrxResSIOP::~TrxResSIOP()
{
// Cierre de conexion back end
tcpConn.disconnect();
}
///////////////////////////////////////////////////////////////////////
// Procesamiento de Transacciones ATM SIOP genericas, no en particular.
///////////////////////////////////////////////////////////////////////
WORD TrxResSIOP::ProcessGeneric(void)
{
// Enviar al sistema autorizador SIOP/AS400 y esperar rta.
WORD wRespCode = EnviarYRecibirMsg();
///////////////////////////////////////////////////////////////////
// Verificar si fue rechazada y era un SAF que debia impactarse
if ( Verify_Rejected_SAF( wRespCode ) )
// Forzar el envio a SAF LOCAL cuando es SAF online que no
// pudo impactarse debido a cualquier tipo de error en el HOST.
wRespCode = CISO_SYSTEM_FAILURE_I;
///////////////////////////////////////////////////////////////////
// Backup de resultado de ejecucion hacia la clase base
wProcRespCde = wRespCode;
// Retornar codigo de rta.
return (wRespCode);
}//end-ProcessGeneric
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
// Mapear codigo de respuesta SIOP hacia RED LINK
// El codigo SIOP es de 7 digitos, tal que si todos son blancos es aprobada,
// y sino es un error de codigo alfanumerico que se mapea segun indican esta tablas
///////////////////////////////////////////////////////////////////////////////////
short TrxResSIOP::Mapear_RespCde_SIOP_REDLINK(char *szSIOP, char *szLINK, short nLen)
{
// Precondicion
if(NULL == szSIOP || NULL == szLINK || nLen <= 0)
// Postcondicion : 0=OK, -1=ERROR
return (-1);
// Precondicion : Segun aplicacion interna, poseen prefijos distintos,
// ejemplo "M56", "CJ", "USR" y similares
if( strncmp(szSIOP,"M56",3)==0 )
{
// Segun codigo de error SIOP, mapear el respectivo Link en ISO:
// El prefijo de estos errores es "M56" y siguen "9999"
switch( antoi(szSIOP+3,4) )
{
case 1 : /* El codigo de transaccion (2) no esta habilitado */
strcpy( szLINK, CISO_TRANSACTION_NOT_SUPP ); break;
case 2 : /* El codigo de transaccion (6) no esta habilitado */
strcpy( szLINK, CISO_TRANSACTION_NOT_SUPP ); break;
case 3 : /* La moneda no esta habilitada */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 4 : /* El producto desde no esta habilitado */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 5 : /* El producto hacia no esta habilitado */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 6 : /* La cuenta desde no existe en le maestro de cuentas */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 7 : /* El digito verificador desde no coincide */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 8 : /* La cuenta hacia no existe en el maestro de cuentas */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 9 : /* El digito verificador hacia no coincide */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 10 : /* La cta cte desde no existe en el maestro */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 11 : /* Para la cta cte desde difiere el sistema */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 12 : /* Para la cta cte desde difiere el producto */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 13 : /* Para la cta cte desde difiere la moneda */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 14 : /* La cta cte desde no esta activa */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 15 : /* La cta cte hacia no existe en el maestro */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 16 : /* Para la cta cte hacia difiere el sistema */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 17 : /* Para la cta cte hacia difiere el producto */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 18 : /* Para la cta cte hacia difiere la moneda */
strcpy( szLINK, CISO_NO_ACCOUNT_AVAILABLE ); break;
case 19 : /* La cta cte hacia no esta activa */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 20 : /* La caj aho desde no existe en el maestro */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 21 : /* La caj aho desde no esta activa */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 22 : /* La caj aho hacia no existe en el maestro */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 23 : /* La caj aho hacia no esta activa */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 24 : /* Descripcion no valida */
strcpy( szLINK, CISO_SYSTEM_ERROR ); break;
case 25 : /* El resultado de la operacion no es valido */
strcpy( szLINK, CISO_SYSTEM_ERROR ); break;
case 26 : /* No fue encontrada la operacion que origino esta rev */
strcpy( szLINK, CISO_SYSTEM_ERROR ); break;
case 27 : /* La operacion que genero esta reversa tiene errores */
strcpy( szLINK, CISO_SYSTEM_ERROR ); break;
case 28 : /* La cantidad de transacciones libres es incorrecta. */
strcpy( szLINK, CISO_SYSTEM_ERROR ); break;
case 29 : /* Falta informar la fecha. */
strcpy( szLINK, CISO_INVALID_FORMAT ); break;
case 30 : /* La fecha informada es incorrectA */
strcpy( szLINK, CISO_INVALID_FORMAT ); break;
case 31 : /* La fecha no puede ser inferior a la fecha de proces */
strcpy( szLINK, CISO_INVALID_FORMAT ); break;
case 32 : /* El importe es incorrecto. */
strcpy( szLINK, CISO_INVALID_AMMOUNT ); break;
case 33 : /* Fecha de vigencia inferior a la del Plan. */
strcpy( szLINK, CISO_SYSTEM_ERROR ); break;
case 34 : /* La opcion no es valida. */
strcpy( szLINK, CISO_SYSTEM_ERROR ); break;
case 35 : /* Fecha de vigencia incorrecta. */
strcpy( szLINK, CISO_SYSTEM_ERROR ); break;
case 46 : /* La cuenta no corresponde a la sucural. */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 47 : /* La cuenta no una cuenta de caja de ahorro */
strcpy( szLINK, CISO_INVALID_ACCOUNT ); break;
case 48 : /* El ingreso del datos produce duplicaciones */
strcpy( szLINK, CISO_SYSTEM_FAILURE ); break;
case 49 : /* Codigo de transaccion incorrecto */
strcpy( szLINK, CISO_TRANSACTION_NOT_SUPP ); break;
default: /* DEFAULT */
strcpy( szLINK, CISO_GENERIC_ERROR);break;
};
}
// Cuentas Corrientes
else if( strncmp(szSIOP,"CJ",2)==0 )
{
// Segun codigo de error SIOP, mapear el respectivo Link en ISO:
// El prefijo de estos errores es "CJ" y siguen "99999"
switch( antoi(szSIOP+2,5) )
{
case 110 : /* Falta de fondos en la cuenta */
strcpy( szLINK, CISO_INSUFFICIENT_FOUNDS ); break;
default: /* DEFAULT */
strcpy( szLINK, CISO_GENERIC_ERROR);break;
};
}
// Caja de Ahorros
else if( strncmp(szSIOP,"USR",3)==0 )
{
// Segun codigo de error SIOP, mapear el respectivo Link en ISO:
// El prefijo de estos errores es "CJ" y siguen "99999"
switch( antoi(szSIOP+3,4) )
{
case 949 : /* Falta de fondos en la cuenta */
strcpy( szLINK, CISO_INSUFFICIENT_FOUNDS ); break;
default: /* DEFAULT */
strcpy( szLINK, CISO_GENERIC_ERROR);break;
};
}
// Si son todos blancos, es APROBADA
else if( strncmp(szSIOP," ",7)==0 )
strcpy( szLINK, CISO_APPROVED);
// Sino por omision es ERROR GENERICO
else
/* DEFAULT */
strcpy( szLINK, CISO_GENERIC_ERROR);
////////////////////////////////////////////////////////////////
// Postcondicion : 0=OK, -1=ERROR
return (0);
};
///////////////////////////////////////////////////////////////////////////////////////////////
// Conexion con SIOP AS-400
// Retorna ERROR ISO por procesamiento aprobado o no,
////////////////////////////////////////////////////////////////////////////////////////////////
WORD TrxResSIOP::EnviarYRecibirMsg(char szIPBackEnd[], unsigned short usPortBackEnd)
{
// Estructura SIOP en AS400, local
msgEXTRACT extractBuff;
char *pszExtractBuff = (char *)&extractBuff;
// Saldo de respuesta en campo AMT_3, formato ISO de 12 digitos
TRAN_AMT *psztTran_Amt = (TRAN_AMT *)extractBuff.cuerpo.AMT_3;
// Variables de soporte
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -