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

📄 cobistrx.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    {
        if (cCobisDebito_Gral == cOperacionCOBIS) 
            cOperacionCOBIS = cCobisDebitoCC; // Debito CC=50
        else                                      
            cOperacionCOBIS = cCobisCreditoCC;// Credito CC=48
    };

    // Ejecutar STORED PROCEDURE
    if(_RPC_DB_ == dbctType && prpcDB != NULL)
    {
        // Copiar string cuenta-tarjeta-monto etc.
        COPYSTRING(szCard, ExtractCardnumFromTrack2( &isoFields.field35 ) );
        CHECKPARAMETER(szCard);
        if('D' == chCuentaDesdeHacia)
            ASSIGNSTRING(szAccount, isoFields.field102.chNum);    // Cuenta Desde
        if('H' == chCuentaDesdeHacia)
            ASSIGNSTRING(szAccount, isoFields.field103.chNum);  // Cuenta Hacia
        CHECKPARAMETER(szAccount);
        // Formato del monto desde ISO hacia uso interno propio, con decimales
        // y con tipo de cambio aplicado si correspondiera
        Format_ISO_Ammount( isoFields.field4.chAmmount, 2, szAmmount, sizeof(szAmmount),
            is_true, szExchangeRate );        
        CHECKPARAMETER(szAmmount);
        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);
        /* SOLO PARA TRANSFERENCIAS MINORISTAS POR CBU */
        if( isoMsg.IsATMTransferCBU() )
        {
            ASSIGNSTRING(szCBU, isoFields.field54.stTransferenciaCBU.chCBU); // CBU para xfers. minoristas
            CHECKPARAMETER(szCBU);
        }
        // Moneda de la operacion es la moneda del debito en cuenta ORIGEN o DESTINO
        AssignCOBISCurrencyFromAccType( &cMonedaCOBIS , chCuentaDesdeHacia );
        // Online ?
        if('S' == chOnlineMode) strcpy(szOnline,"S");
        else                    strcpy(szOnline,"N");        
        // Causal interbancarias, y ademas no es parametrico ?
        if(is_false == bIsInterbankXfer && NULL == ptblTranCodeSP)
            AssignCOBISCauseFromCurrency( chOnlineMode, szCause, 
                cMonedaCOBIS, cOperacionCOBIS, cProductoCOBIS,
                tblTranCodeSP_Interbank, 
                tblTranCodeSP_Interbank, 
                tblTranCodeSP_Interbank,
                tblTranCodeSP_Interbank);
        // Causal debito/credito, y ademas no es parametrico ?
        else if (NULL == ptblTranCodeSP)
            AssignCOBISCauseFromCurrency( chOnlineMode, szCause, 
                cMonedaCOBIS, cOperacionCOBIS,  cProductoCOBIS,                
                tblTranCodeSP_ARG_ARG,                                                    
                tblTranCodeSP_USD_ARG,                                                                             
                tblTranCodeSP_ARG_USD,
                tblTranCodeSP_USD_USD);
        else // Causal parametrico?
            AssignCOBISCauseFromCurrency( chOnlineMode, szCause, 
                cMonedaCOBIS, cOperacionCOBIS,  cProductoCOBIS,                
                (*ptblTranCodeSP),
                (*ptblTranCodeSP),
                (*ptblTranCodeSP), 
                (*ptblTranCodeSP) );
        // Moneda de Trx
        ASSIGNSTRING(szTrxCurrency, isoFields.field49.chData ); 
        CHECKPARAMETER(szTrxCurrency);

        //////////////////////////////////////////////////////////////
        // CORRALITO : Cuentas de libre disponibilidad ?
        //////////////////////////////////////////////////////////////
        if(isoMsg.IsATMTransferInterbank())    /* Transferencia interbancaria? */
        {
            if(isalpha(isoFields.field55.stInterbancarias.chTo_Acct_Typ))
            {
                szToAcctTyp[0]   = isoFields.field55.stInterbancarias.chTo_Acct_Typ;
                szToAcctTyp[1]   = 0x00;
            }
            if(isalpha(isoFields.field55.stInterbancarias.chFr_Acct_Typ))
            {
                szFromAcctTyp[0] = isoFields.field55.stInterbancarias.chFr_Acct_Typ;
                szFromAcctTyp[1] = 0x00;
            }
        };
        //////////////////////////////////////////////////////////////

        
#ifdef _RPCDB_CONNECTION_
        /* Solo para Transferencias se usa un SP distinto */
        if(isoMsg.IsATMTransferInterbank())    /* Transferencia interbancaria? */
            /* Invocacion como NOTA DE DEBITO/CREDITO */
            bExecStatus_ok = prpcDB->AccountCreditDebitNote( szAccount,
                 szAmmount        , 
                 szCause        ,
                 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        ,
                 szCBU            ,
                 szGirar        ,
                 szContable        ,
                 szAcumEfec        ,
                 szAcumExtra    ,
                 szTrxCurrency    ,
                 szExchangeRate ,
                 szToAcctTyp    ,
                 szFromAcctTyp );
        else
            /* Invocacion como EXTRACCION para otras transacciones */
            bExecStatus_ok = prpcDB->AccountWidrawal( szAccount,
                 szAmmount        , 
                 szCause        ,
                 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        ,
                 szCBU            ,
                 szGirar        ,
                 szContable        ,
                 szAcumEfec        ,
                 szAcumExtra    ,
                 szTrxCurrency    ,
                 szExchangeRate );
        // Codigo de retorno de la ejecucion del SP
        iReturn = prpcDB->GetStatus();
#else
        iReturn = CISO_EXTERNAL_DECLINE_I;
#endif // #ifdef _RPCDB_CONNECTION_

    }
    else
        iReturn = CISO_EXTERNAL_DECLINE_I;

    // Formatear Codigo de Rta ISO8538 en base a COBIS
    wRespCde = iReturn;
    if(0 == wRespCde && !bExecStatus_ok) wRespCde = CISO_EXTERNAL_DECLINE_I;

    // Formatear saldos a formato ISO-LINK,sin punto decimal ni millar
    Format_ISO_Ammount( szGirar   , 0, szGirar   , sizeof(isoFields.field4.chAmmount));
    Format_ISO_Ammount( szContable, 0, szContable, sizeof(isoFields.field4.chAmmount));
    // Formatear campo ISO #44, RESP_DATA, saldo y disponible
    FormatField44_RESP_DATA( szContable, szGirar );
    // Formatear campo ISO #54 de rta., stB24_0210_Def_Data    
    Format_ISO_Ammount( szAcumEfec , 0, szAcumEfec , 
        sizeof(isoFields.field54.stB24_0210_Def_Data.chINT_OWE_AUSTRAL));
    Format_ISO_Ammount( szAcumExtra, 0, szAcumExtra, 
        sizeof(isoFields.field54.stB24_0210_Def_Data.chOWE_DOLAR));
    FormatField54_B24_0210_Def_Data(     
        "99", // chWITH_ADV_AVAIL, : contador extracciones o adelantos
        szAcumEfec, // chINT_OWE_AUSTRAL,12 : LIBRE DISPONIBILIDAD (CORRALITO)
        szGirar, // chCASH_AVAIL,12 : saldo disponible
        NULL, // chMIN_PAYMENT,12
        NULL, // chPAYMENT_DAT,6
        NULL, // chINTEREST_RATE,6
        szAcumExtra, // chOWE_DOLAR,10 : ACUMULADOR DE EXTRACCIONES (CORRALITO)
        NULL, // chMIN_PAYMENT_DOLAR,10
        NULL, // chPURCHASE_DOLAR,10
        NULL ); // chCASH_FEE,8 : arancel de usuario
    // Formatear campo ISO #55 de rta., PRIRSRVD1_ISO
    FormatField55_PRIRSRVD1_ISO( 
            NULL,    // Track-2 o PAN del Titular
            NULL,    // Codigo asociado
            NULL,    // Institucion 1
            NULL,    // Tipo Cta. 1
            NULL,    // Cuenta Num. 1
            NULL,    // Institucion 2
            NULL,    // Tipo Cta. 2
            NULL );    // Cuenta Num. 2
    // Formatear campo ISO #122, SECNDRY_RSRVD3_PRVT
    FormatField122_SECNDRY_RSRVD3_PRVT();
    // Formatear campo ISO #123, SECNDRY_RSRVD4_PRVT, "DEPOSIT AMMOUNT"
    FormatField123_SECNDRY_RSRVD4_PRVT();
    // Formatear campo ISO #125, SECNDRY_RSRVD6_PRVT, "ACCOUNT INDICATOR"
    FormatField125_SECNDRY_RSRVD6_PRVT( '1' );
    // Formatear campo ISO #127, SECNDRY_RSRVD8_PRVT
    FormatField127_SECNDRY_RSRVD8_PRVT();

    ////////////////////////////////////////////////////
    // Borrar campos no validos en la rta. : 43,48,52,63
    isoMsg.DeleteField ( 43 );
    isoMsg.DeleteField ( 48 );
    isoMsg.DeleteField ( 52 );
    isoMsg.DeleteField ( 63 );
    ////////////////////////////////////////////////////

    
    // Retornar cod.rta.
    return TranslateRespCode_COBIS_ISO_B24( wRespCde );
}

// Procesamiento de transacciones de xfer. minorista, o CBU
WORD TrxResCOBIS::ProcessIndividualTransfer(WORD wCause,boolean_t bIsReversal)            // Transferencia minorista
{
    ///////////////////////////////////////////////////////////////////////////////
    CONST stTranCodeSP    tblTranCodeSP = {'S', NULL, 4331, 0, 331, 0, 3831, 0, 831 };
    ///////////////////////////////////////////////////////////////////////////////
    // La transferencia por CBU solo genera un DEBITO en cuenta (extraccion) y recien el credito 
    // se obtiene por compensacion, por camara, a las 48hs, y por proceso batch.
    return ProcessDebitCredit_Note('D', cCobisDebito_Gral, &tblTranCodeSP , bIsReversal ); 
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Procesamiento de transacciones en particular
WORD TrxResCOBIS::ProcessWithdrawal(WORD wCause,boolean_t bIsReversal)            // Extraccion
{    
    long wRespCde       = ProcessInit();    
    CHAR szGirar[32]    = {"000000000000.0000"};
    CHAR szContable[32] = {"000000000000.0000"};        
    INT  iReturn        = 0;
    ///////////////////////////////////////////////////////////////////////////////////////
    CONST stTranCodeSP    tblTranCodeSP_ARG_ARG  = {'S' , "sp_li_ndc_ext",4190, 0,  190, 0 , 
        3690, 0,  690, 0 };
    CONST stTranCodeSP    tblTranCodeSP_ARG_USD  = {'S' , "sp_li_ndc_ext",4191, 0,  191, 0 ,
        3691, 0,  691, 0 };
    CONST stTranCodeSP    tblTranCodeSP_USD_ARG  = {'S' , "sp_li_ndc_ext",4192, 0,  192, 0 ,
        3692, 0,  692, 0 };
    CONST stTranCodeSP    tblTranCodeSP_USD_USD  = {'S' , "sp_li_ndc_ext",4193, 0,  193, 0 ,
        3693, 0,  693, 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"},

⌨️ 快捷键说明

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