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

📄 proctrx.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
字号:
//
// IT24 Sistemas S.A.
// Process Transaction Method
//
//   Metodo de Procesamiento de Transaccion, con discriminacion y especializacion en subclases
// SOAT, PAS, AFJP, ULTMOV, etc. para la resolucion de la misma.
//   Segun la implementacion, el metodo especializado puede ser "dummy", o sea un simple
// retorno en falso sin procesamiento, sin generar el codigo ejecutable actualmente, 
// con el solo motivo de mantener el esqueleto de codigo fuente original y facilitar el 
// posible enlace a futuro de las subclases especializadas en una sola libreria o modulo.
//
// Tarea        Fecha           Autor   Observaciones
// (Inicial)    1998.07.23      mdc     En base a ProcessTransaction de PAS/AFJP/ULTMOV. Solo para SOAT.
// (Inicial)    1999.01.06      mdc     <trxres.h> : Path globalizado
// (Beta)       2001.12.31      mdc     Implementacion de clase ATM
// (Beta)       2002.04.22      mdc        TrxResolution::ProcessTransaction(,,,,enumHostStatus hostStatus);
// (Beta)       2002.08.20      mdc        TrxResolution::ProcessTransaction(,,,,,enumFormatType efExtMsgFormat);
// (Beta)       2002.11.25      mdc        TrxResolution::ProcessTransaction(,,,,,enumHostStatus *pbackendStatus);
// (Beta)       2003.01.21      mdc        if(_SAF_IN_PROGRESS_ == hostStatus)....
//

// Headers ANSI
#include <limits.h>
#include <stdio.h>

// Solo reconocimiento de transacciones para Sistema ATM (para no incluir clases de PAS,ULTMOV,AFJP...)
#ifndef _SYSTEM_ATM_
#define _SYSTEM_ATM_
#endif // _SYSTEM_ATM_

// Header Trx Resolution
#include <qusrinc/trxres.h>

// Procesamiento de Transacciones.
// Retorna TRUE por procesamiento aprobado o no,
// y FALSE al hallar algun Error en el Sistema o en el Mensaje ISO-8583.
// Verifica tambien si la respuesta es solicitada (OnLine) o no 
// (OffLine) para la copia de datos en el mensaje de retorno.
BOOL TrxResolution::ProcessTransaction( PBYTE  pcbBuffer   , 
                                        INT    iBuffLen    ,
                                        PBYTE  pcbRspBuffer,
                                        PINT   piRspBuffLen,
                                        enumHostStatus hostStatus,
                                        enumFormatType efExtMsgFormat,
                                        enumHostStatus *pbackendStatus) 
{    
    // Booleanos de respuesta de o hacia funciones
    // (Pertenece a la clase base TrxBaseResolution)
    bProcResult = is_false;       // Sin procesar inicialmente, default
    ///////////////////////////////////////////////////////////////////
    efFormatMsg = efExtMsgFormat; // Formato de mensaje actual
    ///////////////////////////////////////////////////////////////////

    // Precondicion: Mensaje ISO-8583 valido
    // Import ISO-8583 Message
    if(!isoMsg.Import(pcbBuffer, iBuffLen))
        // Error
        return (FALSE);
        
    // Is Valid Message?
    if(!isoMsg.IsValidMessage())
        // Error
        return (FALSE);

    ///////////////////////////////////////////////////////////////
    // Antes de modificar el requerimiento como respuesta, 
    // guardar un backup original para no perder los datos !
    isoMsgBkp = isoMsg;
    ///////////////////////////////////////////////////////////////


// Compilar para reconocer diversos sistemas segun definiciones previas
#if defined( _SYSTEM_BASE_ ) && !defined( _SYSTEM_SOAT_ )
    //////////////////////////////////////////////////////////////////////////////
    // Bloque discriminador de Tipo de Transaccion
    // Segun producto SOAT/PAS/AFJP/ULTMOV... procesar transaccion con metodo adecuado:    
    //////////////////////////////////////////////////////////////////////////////
    if( isoMsg.IsPASTransaction() ) // PAS?
        {
        // Atencion:
        // No procesar pagos desde terminales POS Teller    
        if( isoMsg.IsPASPaymentFromPOSTerminal() )
            // No es un error, se post-procesa con refresh,
            // y no se genera una respuesta al mensaje...
            return (bProcResult = FALSE);

        // ClassCasting, a clase de resolucion PAS
        TrxResPAS *pTrxRes = dynamic_cast<TrxResPAS*>(this);
        // Procesar
        if(pTrxRes)    bProcResult = pTrxRes->ProcessTransaction();        
        else           bProcResult = FALSE; // error
        }
    else 
    if( isoMsg.IsULTMOVTransaction() ) // ULTMOV?
        {
        // ClassCasting, a clase de resolucion ULTMOV
        TrxResULTMOV *pTrxRes = dynamic_cast<TrxResULTMOV*>(this);
        // Procesar
        if(pTrxRes)    bProcResult = pTrxRes->ProcessTransaction();    
        else           bProcResult = FALSE; // error
        }
    else 
    if( isoMsg.IsAFJPTransaction() ) // AFJP?
        {
        // ClassCasting, a clase de resolucion AFJP
        TrxResAFJP *pTrxRes = dynamic_cast<TrxResAFJP*>(this);
        // Procesar
        if(pTrxRes)    bProcResult = pTrxRes->ProcessTransaction();    
        else           bProcResult = FALSE; // error
        }
    else 
// Sistema SOAT solamente?
#elif defined( _SYSTEM_SOAT_ )    
    if( isoMsg.IsSOATTransaction() ) // SOAT?
        {
        // ClassCasting, a clase de resolucion SOAT
        TrxResSOAT *pTrxRes = dynamic_cast<TrxResSOAT*>(this);
        // Procesar
        if(pTrxRes)    bProcResult = pTrxRes->ProcessTransaction();        
        else           bProcResult = FALSE; // error
        }
    else
// Sistema ATM solamente (incluye COBIS y SIAF) ?
#elif defined( _SYSTEM_ATM_ )    
    if( isoMsg.IsATMTransaction() ) // ATM?
        {
        ////////////////////////////////////////////////////////
        // ClassCasting, a clase de resolucion ATM
        TrxResATM   *pTrxRes      = dynamic_cast<TrxResATM*>(this);        

        // Procesar si el host esta ONLINE y DISPONIBLE
        if(( _HOST_READY_      == hostStatus ||
             _SAF_IN_PROGRESS_ == hostStatus ) && 
             pTrxRes )
        {
            // ATM default
            bProcResult = pTrxRes->ProcessTransaction();
            /////////////////////////////////////////////////////
            // Si hubo error en el BACK END, informarlo
            if(pbackendStatus && pTrxRes->BackEndAuthStatus() < 0 )
                (*pbackendStatus) = _HOST_UNAVAILABLE_;            
            else if(pbackendStatus && pTrxRes->BackEndAuthStatus() >= 0 )
                (*pbackendStatus) = _HOST_READY_;
            /////////////////////////////////////////////////////
        }
        // Si en cambio el host esta en Corte de Red o No Disponible....
        else if(_CUTOVER_IN_PROGRESS_ == hostStatus ||                
                _HOST_UNAVAILABLE_    == hostStatus ||
                _HOST_STOPPED_        == hostStatus ||
                _NO_COMM_EVENTS_      == hostStatus)
        {
            // CUTOVER IN PROGRESS , AUTH-PROC NOT AVAILABLE, DESTINY NOT AVAILABLE
            // Insert Error Response Code { 91=Destino no disponible }
            WORD wRespCodeLen = 2;
            if(!isoMsg.IsValidField(39))
                isoMsg.InsertField( 39, &wRespCodeLen,(PBYTE)CISO_DESTINY_NOT_AVAILABLE, wRespCodeLen);
            else
                isoMsg.SetField( 39, &wRespCodeLen,(PBYTE)CISO_DESTINY_NOT_AVAILABLE, wRespCodeLen);
            wProcRespCde = CISO_DESTINY_NOT_AVAILABLE_I;
        }
        else 
        {
            bProcResult = is_false; // error        
        };
        ////////////////////////////////////////////////////////
        }
    else
#else
#error "Sin definir sistema a compilar"
#endif // _SYSTEM_ATM_    
        {
        // Invalid Transaction 
        // Insert Error Response Code { 40=Transaccion no soportada }
        WORD wRespCodeLen = 2;
        if(!isoMsg.IsValidField(39))
            isoMsg.InsertField( 39, &wRespCodeLen, (PBYTE)CISO_TRANSACTION_NOT_SUPP, wRespCodeLen);
        else
            isoMsg.SetField( 39, &wRespCodeLen, (PBYTE)CISO_TRANSACTION_NOT_SUPP, wRespCodeLen);
        wProcRespCde = CISO_TRANSACTION_NOT_SUPP_I;

        // Set Message Type Response { 0210,230,430 }
        if( !isoMsg.SetMsgTypeIdResponse() )
            return (FALSE);
        // Procesada, pero con error
        bProcResult = is_true;
        }; // end-if-IsTransaction...
    //////////////////////////////////////////////////////////////////////////////
    // Fin del Bloque discriminador de Tipo de Transaccion    
    //////////////////////////////////////////////////////////////////////////////

    
    // Pudo procesarse?
    if(!bProcResult)
        // Error
        return (FALSE);
        
    // Copiar respuesta, si es copia solicitada en forma OnLine/OffLine:    
    if(pcbRspBuffer != NULL && piRspBuffLen != NULL)
        {
        // Copia external de la respuesta en formato ISO-8583
        WORD wBuffLen = (WORD)(*piRspBuffLen);
        if(!isoMsg.Export(pcbRspBuffer, &wBuffLen))
            {
            // Excepcion de exportacion de mensaje ISO-8583
            throw (int (-1));
            // Error
            return (FALSE);
            }
        else
            // Longitud exportada 
            (*piRspBuffLen) = (INT)wBuffLen;

        }

    // Y retornar verdadero, por transaccion procesada (con error o sin error)
    return (TRUE);
    };//end-ProcessTransaction

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -