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

📄 cobistrx.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 5 页
字号:
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// IT24 Sistemas S.A.
// Process COBIS Transaction Method
//
//   Metodo de Procesamiento de Transaccion ATM - COBIS, 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)    2002.02.20      mdc     Inicial
// (Inicial)    2002.02.21      mdc     Inicial
// (Alfa)       2002.04.16      mdc     ::AssignCOBISCurrencyFromAccType(enumCOBIS *pcMonedaCOBIS, char chDesdeHacia);
// (Alfa)       2002.04.17      mdc     ::AssignCOBISCauseFromCurrency(char chOnlineMode, char *szCause, ...)
// (Alfa)       2002.05.13      mdc        LIBRE DISPONIBILIDAD (CORRALITO)
// (Alfa)       2002.06.20      mdc     Causales segun monedas distinta de cuentas involucradas        
// (Alfa)       2002.07.25      mdc     Ante reversos que no impactaron, se mandan a SAF-Queue con codigo "96"
// (Alfa)       2002.09.04      mdc     Ante "DEAD LOCKS", se mandan a SAF-Queue con codigo "96", y se reintenta
// (Alfa)       2002.09.04      mdc     Ante "Usuario, rol u horario incorrectos", enviar a SAF local y reintentar     
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////

#if defined(_SYSTEM_ATM_COBIS_)

// Headers ANSI C/C++
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


#ifndef _SYSTEM_ATM_   
#define _SYSTEM_ATM_DEFINED_   
#define _SYSTEM_ATM_   
#endif // _SYSTEM_ATM_DEFINED_

// Header Transaction Resolution
#include <qusrinc/trxres.h>
// Header ISO Msg Redefinition
#include <qusrinc/isoredef.h>
// COBIS Transaction Resolution
#include <qusrinc/cobisdb.h>
#include <qusrinc/stdiol.h>

#ifdef _SYSTEM_ATM_DEFINED_
#undef _SYSTEM_ATM_
#endif // _SYSTEM_ATM_DEFINED_

///////////////////////////////////////////////////////////////////////////
// Funcion utilitaria externa de conversion de string a binario hasta N
// caracteres ASCII numericos
extern "C" int antoi(char *, int);
///////////////////////////////////////////////////////////////////////////

// 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
#define ASSIGNFIELD(dst,src) \
    { memset(dst,' ',sizeof(dst)); memcpy(dst,src,min(sizeof(src),sizeof(dst)));  }; 
// Macro de asignacion de causal segun sea OFF y ONLINE
#define ISONOFFLINECAUSE(on,off) (boolOnlineMode == is_true) ? on : off
// Mascara de inicializacion de time-stamp
#define _TIMESTAMP_MASK_    "MM/DD/YYYY HH:MM:SS" 
// Macro de chequeo de parametro presente
#define CHECKPARAMETER(x) if((x) && strlen(x)==0) return CISO_INVALID_FORMAT_I;
// Macro de reemplazo BNL por FIID 0265
#define CHECKBNLFIID(x)    if(strcmp(x,"BNL ")==0) COPYSTRING(szFIID, "0265");

////////////////////////////////////////////////////////
// Constructor default
////////////////////////////////////////////////////////
EXPORT TrxResCOBIS::TrxResCOBIS()
{
     // Conexion a base de datos via RPC, Sybase-COBIS
     dbctType = _RPC_DB_ ;
#ifdef _RPCDB_CONNECTION_
     prpcDB   = NULL;     
#endif // _RPCDB_CONNECTION_
}

////////////////////////////////////////////////////////
// Constructor opcional
////////////////////////////////////////////////////////
EXPORT TrxResCOBIS::TrxResCOBIS(PVOID prpcXDB)
{
     // Conexion a base de datos via RPC, Sybase-COBIS
     dbctType = _RPC_DB_ ;
#ifdef _RPCDB_CONNECTION_
     prpcDB   = (cobisdb *)prpcXDB;
#endif // _RPCDB_CONNECTION_     
     // Mapeo de Codigos COBIS a Codigos ISO8583
     // Ver la documentacion de codigos ISO8583 para detalles, o el archivo iso8583.h
     rtRespCdeCnv.Insert(       0, CISO_APPROVED ); //    00    Aprobada con saldo disponible 
     rtRespCdeCnv.Insert(       0, CISO_APPROVED_VIP_I  );  //    01    Aprobada sin saldo disponible para Movimiento 
     //rtRespCdeCnv.Insert(      -1, CISO_SYSTEM_FAILURE ); // 96 MISSING OBJECT, reintentar (Ej.Usuario, rol u horario incorrectos)
     rtRespCdeCnv.Insert(      -3, CISO_SYSTEM_FAILURE ); // 96 DEAD LOCK, reintentar, error interno SYBASE     
     rtRespCdeCnv.Insert(  351076, CISO_SYSTEM_FAILURE ); // 96 Reverso ya reversado o no existe transa original
     rtRespCdeCnv.Insert(  351074, CISO_INVALID_TRANSACTION); // 12 TRX invalida, no soportada
     rtRespCdeCnv.Insert(  351075, CISO_INVALID_TRANSACTION); // 12 TRX invalida, no soportada
     rtRespCdeCnv.Insert(  351012, CISO_INVALID_ACCOUNT); // 76    Cuenta invalida por:1. El proceso autorizador     ...
     rtRespCdeCnv.Insert(  251001, CISO_INVALID_ACCOUNT); // 76 ...
     rtRespCdeCnv.Insert(  351073, CISO_INVALID_ACCOUNT); // 76 ...
     rtRespCdeCnv.Insert(  201196, CISO_INVALID_ACCOUNT); // 76 ...
     rtRespCdeCnv.Insert(  353019, CISO_INVALID_ACCOUNT); // 76 ...
     rtRespCdeCnv.Insert(  351019, CISO_INVALID_ACCOUNT); // 76 ...
     rtRespCdeCnv.Insert(  201030, CISO_INVALID_ACCOUNT); // 76 ...
     rtRespCdeCnv.Insert(  251025, CISO_INVALID_ACCOUNT); // 76
     rtRespCdeCnv.Insert(  201005, CISO_NO_ACCOUNT_AVAILABLE); // 39
     rtRespCdeCnv.Insert(  201008, CISO_NO_ACCOUNT_AVAILABLE); // 39
     rtRespCdeCnv.Insert(  251058, CISO_NO_ACCOUNT_AVAILABLE); // 39
     rtRespCdeCnv.Insert(  351012, CISO_NO_CHECKINGS_ACCOUNT);    // 52
     rtRespCdeCnv.Insert(  201004, CISO_NO_CHECKINGS_ACCOUNT);    // 52
     rtRespCdeCnv.Insert(  251057, CISO_NO_SAVINGS_ACCOUNT); //    56    Cuenta invalida por:1. El proceso autorizador 
     rtRespCdeCnv.Insert(  258012, CISO_INSUFFICIENT_FOUNDS); //    58    Fondos insuficientes, iguales a cero.
     rtRespCdeCnv.Insert(  251033, CISO_INSUFFICIENT_FOUNDS); //    58    Fondos insuficientes, iguales a cero.
     rtRespCdeCnv.Insert(  201017, CISO_INSUFFICIENT_FOUNDS); //DLH    58    Fondos insuficientes, iguales a cero.
     rtRespCdeCnv.Insert(  258011, CISO_AMMOUNT_LIMIT_EXC); //    60    No son permitidas mas extracciones.
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Procesamiento de transacciones en particular
WORD TrxResCOBIS::ProcessBalanceInquiry(WORD wCause,boolean_t bIsReversal)        // Consulta de saldos
{
    long wRespCde       = ProcessInit();    
    CHAR szGirar[32]    = {"000000000000.0000"},
         szContable[32] = {"000000000000.0000"};
    INT  iReturn        = 0;
    ////////////////////////////////////////////////////////////////
    CONST stTranCodeSP    tblTranCodeSP[] =
    {  'S' , "sp_li_calcula_saldo"     ,   0, 0, 0, 0 , 0, 0, 0, 0,
       'S' , "sp_li_ahcalcula_saldo"   ,   0, 0, 0, 0 , 0, 0, 0, 0,
    };
    ////////////////////////////////////////////////////////////////
    CHAR    szYYYYMMDD[]     = _TIMESTAMP_MASK_, // Xmit-date
            szHHMMSS[]       = _TIMESTAMP_MASK_, // Xmit-time
            szYYYYMMDD_Trx[] = _TIMESTAMP_MASK_, // Trx-date
            szHHMMSS_Trx[]   = _TIMESTAMP_MASK_, // Trx-time
            szYYYYMMDD_Cap[] = _TIMESTAMP_MASK_; // Cap-date
    CHAR    chOnlineMode     = (boolOnlineMode == is_true) ? 'S' : 'N';
    enumCOBIS cProductoCOBIS  = cCobisProductoCA; // Producto default es CA
    enumCOBIS cOperacionCOBIS = cCobisDebitoCA;  // Operacion default es debito C.A.
    enumCOBIS cMonedaCOBIS    = cCobisMonedaPesos;
    CHAR    szAccount[sizeof(isoFields.field102.chNum)+1]={"0"},
            szAmmount[sizeof(isoFields.field4.chAmmount)+1]={"0"},
            szReceipt[sizeof(isoFields.field37.chNum)+1]={"0"},
            szFIID[sizeof(isoFields.field60.stATMTerm.chTermFIID)+1]={"0"},
            szATM[sizeof(isoFields.field41.chData)+1]={"0"},
            szCard[sizeof(isoFields.field35.stTrack2.chData)+1]={"0"},            
            szProduct[4]={"0"},
            szOnline[4]={"0"},
            szOperacionCobis[8]={"0"},
            szCurrency[4]={"0"},
            szCause[8]={"0"},
            szNetwork[8]={"0000"};        
    CHAR    szAcumEfec[sizeof(isoFields.field4.chAmmount)+1]={"0"},
            szAcumExtra[sizeof(isoFields.field4.chAmmount)+1]={"0"};


    // Fecha de Trx especialmente formateada
    FormatTrxDateTime(szYYYYMMDD, szHHMMSS, szYYYYMMDD_Trx, szHHMMSS_Trx, szYYYYMMDD_Cap);

    // Ejecutar consulta parametrica por TRAN_CODE
    if(!AssignCOBISProductFromAccType(&cProductoCOBIS))
    {        
        // Verificar si es una INTERBANCARIA, y en caso positivo, VERIFICAR CUENTA DESTINO
        if( !isoMsg.IsValidField( 55 ) )
            return CISO_INVALID_TRANSACTION_I;
        int iAccType = antoi(isoFields.field55.stInterbancarias.stTo_Acct.chTyp,2) ;        
        // En funcion del tipo de cuenta, establecer el producto COBIS asignado
        if( _B24_SAVINGS_ACCOUNT_      == iAccType ||
            _B24_SAVINGS_ACCOUNT_USD_  == iAccType ||
            _B24_SAVINGS_ACCOUNT_BOND_ == iAccType ) 
            cProductoCOBIS = cCobisProductoCA    ;         // Producto CA=4,CC=3;
        else if(_B24_CHECKINGS_ACCOUNT_      == iAccType ||
                _B24_CHECKINGS_ACCOUNT_USD_  == iAccType ||
                _B24_CHECKINGS_ACCOUNT_BOND_ == iAccType ) 
            cProductoCOBIS = cCobisProductoCC    ;         // Producto CA=4,CC=3;
        else
        {
            ////////////////////////////////////////////////////
            // Borrar campos no validos en la rta. : 43,48,52,63
            isoMsg.DeleteField ( 43 );
            isoMsg.DeleteField ( 48 );
            isoMsg.DeleteField ( 52 );
            isoMsg.DeleteField ( 63 );
            ////////////////////////////////////////////////////
            // ERROR, TIPO DE TRX INVALIDA, TIPO DE CTA. NO VALIDO
            return CISO_INVALID_TRANSACTION_I;
        }
    }
    // Ejecutar STORED PROCEDURE
    if(_RPC_DB_ == dbctType && prpcDB != NULL)
    {
        // Copiar string cuenta
        ASSIGNSTRING(szAccount, isoFields.field102.chNum);        
        CHECKPARAMETER(szAccount);
        COPYSTRING(szCard, ExtractCardnumFromTrack2( &isoFields.field35 ));        
        CHECKPARAMETER(szCard);
        ASSIGNSTRING(szReceipt, isoFields.field37.chNum);
        CHECKPARAMETER(szReceipt);
        ASSIGNSTRING(szFIID   , isoFields.field60.stATMTerm.chTermFIID);
        CHECKPARAMETER(szFIID);
        CHECKBNLFIID(szFIID); // Es id "BNL" ? Usar el id de LINK, numerico
        ASSIGNSTRING(szATM    , isoFields.field41.chData);        
        CHECKPARAMETER(szATM);
        ASSIGNSTRING(szNetwork , isoFields.field60.stATMTerm.chTermLNet); // LNET de la TERMINAL
        CHECKPARAMETER(szNetwork);
        // Moneda de la operacion es la moneda del debito en cuenta ORIGEN
        AssignCOBISCurrencyFromAccType( &cMonedaCOBIS );
        if('S' == chOnlineMode) 
        {
            strcpy(szOnline,"S");
            itoa( tblTranCodeSP[0].shOnCause1, szCause,10);
        }
        else
        {
            strcpy(szOnline,"N");        
            itoa( tblTranCodeSP[0].shOffCause1, szCause,10);
        };
        // Causal parametrico?
        if(0 != wCause)    itoa( wCause, szCause, 10 );        

#ifdef _RPCDB_CONNECTION_
        // Segun el tipo de cuenta, invocar un SP u otro SP (CA y CC)
        if(cCobisProductoCA == cProductoCOBIS)
            bExecStatus_ok = prpcDB->SavingsAccountInquiry(szAccount, 
                             szCard            ,
                             szReceipt        , 
                             szFIID            ,
                             szATM            , 
                             TranslateTranCode_ISO_B24(isoFields.field3.uProcCde.chData),
                             itoa(cOperacionCOBIS,szOperacionCobis,10), 
                             itoa(cMonedaCOBIS,szCurrency,10),
                             szYYYYMMDD        , 
                             szYYYYMMDD_Trx    ,
                             szHHMMSS        ,
                             szHHMMSS_Trx    ,
                             szOnline        , 
                             itoa(cProductoCOBIS,szProduct,10),
                             szYYYYMMDD_Cap    ,
                             szNetwork        ,                             
                             szGirar        ,
                             szContable     ,
                             szAcumEfec        ,
                             szAcumExtra    );
        else
            bExecStatus_ok = prpcDB->CheckingsAccountInquiry(szAccount, 
                             szCard            ,
                             szReceipt        , 
                             szFIID            ,
                             szATM            , 
                             TranslateTranCode_ISO_B24(isoFields.field3.uProcCde.chData),
                             itoa(cOperacionCOBIS,szOperacionCobis,10), 

⌨️ 快捷键说明

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