⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sioptrx.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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 + -