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

📄 cobistrx.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            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"},
            szCBU[32]={"0000000000000000000000"};
    CHAR    szAcumEfec[sizeof(isoFields.field4.chAmmount)+1]={"0"},
            szAcumExtra[sizeof(isoFields.field4.chAmmount)+1]={"0"},
            szTrxCurrency[4] = {"032"};    /* default 32=PESOS ARGENTINOS */
    CHAR    szExchangeRate[16] = {"1.00"};    /* default 1$=1us$*/
    

    // Verificar que si el reverso es "?REVERSAL FOR LATE/UNSOL RESP?" no se procese 
    // porque ya fue reversada por TIMEOUT por el switch financiero
    if(VerifyReversalForLateResponse( bIsReversal ))
        return CISO_APPROVED_VIP_I; // Aprobada sin saldo disponible, no impactar el reverso

    // Fecha de Trx especialmente formateada
    FormatTrxDateTime(szYYYYMMDD, szHHMMSS, szYYYYMMDD_Trx, szHHMMSS_Trx, szYYYYMMDD_Cap);    
    
    ////////////////////////////////////////////////////////////////////////////////////////
    //Asignar producto y operacion COBIS
    if(!AssignCOBISProductFromAccType(&cProductoCOBIS))
        return CISO_INVALID_TRANSACTION_I;    
    if( cCobisProductoCA == cProductoCOBIS)
        cOperacionCOBIS = cCobisDebitoCA;// Debito CA=264        
    else // if( cProductoCC == cProductoCOBIS)
        cOperacionCOBIS = cCobisDebitoCC; // Debito CC=50

    // Ejecutar STORED PROCEDURE
    if(_RPC_DB_ == dbctType && prpcDB != NULL)
    {
        // Copiar string cuenta
        ASSIGNSTRING(szAccount, isoFields.field102.chNum);        
        CHECKPARAMETER(szAccount);
        // Formato del monto desde ISO hacia uso interno propio, con decimales
        Format_ISO_Ammount( isoFields.field4.chAmmount, 2, szAmmount, sizeof(szAmmount),
            is_true, szExchangeRate );        
        CHECKPARAMETER(szAmmount);        
        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);
        /* 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
        AssignCOBISCurrencyFromAccType( &cMonedaCOBIS );
        if('S' == chOnlineMode)     strcpy(szOnline,"S");
        else                        strcpy(szOnline,"N");        
        // Causal de debito?
        AssignCOBISCauseFromCurrency( chOnlineMode, szCause, cMonedaCOBIS, cOperacionCOBIS,
                cProductoCOBIS, 
                tblTranCodeSP_ARG_ARG, 
                tblTranCodeSP_USD_ARG, 
                tblTranCodeSP_ARG_USD, 
                tblTranCodeSP_USD_USD);
        // Causal parametrico?
        if(0 != wCause)    itoa( wCause, szCause, 10 );        
        // Moneda de Trx
        ASSIGNSTRING(szTrxCurrency, isoFields.field49.chData ); 
        CHECKPARAMETER(szTrxCurrency);

#ifdef _RPCDB_CONNECTION_
        // Invocacion        
        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, verificando EXEC SQL ok
    wRespCde = iReturn;
    if(0 == wRespCde && !bExecStatus_ok) wRespCde = CISO_EXTERNAL_DECLINE_I;

    // Formatear montos ISO
    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    
    // 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 #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 en particular
WORD TrxResCOBIS::ProcessDeposit(WORD wCause,boolean_t bIsReversal)            // Deposito
{
    long wRespCde       = ProcessInit();    
    INT  iReturn        = 0;
    /////////////////////////////////////////////////////////////////////////////
    CONST stTranCodeSP    tblTranCodeSP = {'S',"sp_li_deposito" ,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"},                    
            szDepType[4]={"E"};    
    CHAR szGirar[32]     = {"000000000000.0000"},
         szContable[32]  = {"000000000000.0000"};    
    CHAR szTrxCurrency[4] = {"032"};    /* default 32=PESOS ARGENTINOS */
    CHAR    szAcumEfec[sizeof(isoFields.field4.chAmmount)+1]={"0"},
            szAcumExtra[sizeof(isoFields.field4.chAmmount)+1]={"0"};
    CHAR    szExchangeRate[16] = {"1.00"};    /* default 1$=1us$*/
    boolean_t    bEnabled_E_C_U_W = is_false; /* Se permiten tipo de Depositos Cruzados ??? */


    
    // Verificar que si el reverso es "?REVERSAL FOR LATE/UNSOL RESP?" no se procese 
    // porque ya fue reversada por TIMEOUT por el switch financiero
    if(VerifyReversalForLateResponse( bIsReversal ))
        return CISO_APPROVED_VIP_I; // Aprobada sin saldo disponible, no impactar el reverso

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

    ////////////////////////////////////////////////////////////////////////////////////////
    //Asignar producto y operacion COBIS
    //DLH Debe tomar la cuenta de 'H' por ser un deposito, sino toma 0 y falla
    if(!AssignCOBISProductFromAccType(&cProductoCOBIS,'H'))
        return CISO_INVALID_TRANSACTION_I;    
    if( cCobisProductoCA == cProductoCOBIS)
        cOperacionCOBIS = cCobisDebitoCA;// Debito CA=264        
    else // if( cProductoCC == cProductoCOBIS)
        cOperacionCOBIS = cCobisDebitoCC; // Debito CC=50

    // Ejecutar STORED PROCEDURE
    if(_RPC_DB_ == dbctType && prpcDB != NULL)
    {
        // Copiar string cuenta, campo #103, cuenta DESDE 
        ASSIGNSTRING(szAccount, isoFields.field103.chNum); // Cuenta HASTA por ser deposito, #103
        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);        
        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 HASTA por ser deposito
        AssignCOBISCurrencyFromAccType( &cMonedaCOBIS, 'H' );
        if('S' == chOnlineMode) 
        {
            strcpy(szOnline,"S");
            itoa( tblTranCodeSP.shOnCause1, szCause,10);
        }
        else
        {
            strcpy(szOnline,"N");        
            itoa( tblTranCodeSP.shOffCause1, szCause,10);
        };
        // Causal parametrico?
        if(0 != wCause)    itoa( wCause, szCause, 10 );
        // TIPO DE DEPOSITO, "E" o "C" (efectivo o cheque

⌨️ 快捷键说明

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