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

📄 cobistrx.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                             itoa(cMonedaCOBIS,szCurrency,10),
                             szYYYYMMDD        , 
                             szYYYYMMDD_Trx    ,
                             szHHMMSS        ,
                             szHHMMSS_Trx    ,
                             szOnline        , 
                             itoa(cProductoCOBIS,szProduct,10),
                             szYYYYMMDD_Cap    ,
                             szNetwork        ,                             
                             szGirar        ,
                             szContable     ,
                             szAcumEfec        ,
                             szAcumExtra    );
        // 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( szContable, 0, szContable, sizeof(isoFields.field4.chAmmount) );
    Format_ISO_Ammount( szGirar   , 0, szGirar   , sizeof(isoFields.field4.chAmmount) );
    // Formatear campos 15 y 61 , OPCIONALMENTE PODRIAN NO VENIR EN UN REQUERIMIENTO 
    FormatFields15_61();
    // Formatear campo ISO #44, RESP_DATA, saldo y disponible
    if(cCobisProductoCA == cProductoCOBIS)
        FormatField44_RESP_DATA( szContable, szGirar );
    else
        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 #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 transferencia interbancarias
WORD TrxResCOBIS::ProcessTransferInterbank(WORD wCause,boolean_t bIsReversal)            // Transferencia interbancaria
{
    long wRespCde = ProcessInit();
    // Verificar que las cuentas informadas en el campo adicional, se agreguen a los campos
    // destinados por la norma ISO a soportar cuentas. Esto se hace para homogeneizar la interface 
    // con otras transacciones.
    if( !isoMsg.IsValidField(102) )
        ASSIGNFIELD(isoFields.field102.chNum, 
                    isoFields.field55.stInterbancarias.stFrom_Acct.chAcct_num);
    if( !isoMsg.IsValidField(103) )
        ASSIGNFIELD(isoFields.field103.chNum, 
                    isoFields.field55.stInterbancarias.stTo_Acct.chAcct_num);
    // Ejecutar una ORDEN o NOTA DE DEBITO o CREDITO con distinto causal segun la TRANSFERENCIA
    if ( antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==9) // DEBITO EN CUENTA
        return ProcessDebitCredit_Note('D',cCobisDebito_Gral, 0, bIsReversal, is_true ); 
    else if ( antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==19) // ORDEN DE DEBITO
        return ProcessDebitCredit_Note('D',cCobisDebito_Gral, 0, bIsReversal, is_true ); 
    else if ( antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==29) // ORDEN DE CREDITO
        return ProcessDebitCredit_Note('H',cCobisCredito_Gral, 0, bIsReversal, is_true ); 
    else if ( antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==39) // VERIFICACION DE CUENTA
        return ProcessAccountVerification( 0, bIsReversal ); 
    else
        return CISO_EXTERNAL_DECLINE_I; // Otro codigo es error del sistema, atencion.
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Procesamiento de transacciones en particular
WORD TrxResCOBIS::ProcessTransfer(WORD wCause,boolean_t bIsReversal)            // Transferencia
{
    long wRespCde       = ProcessInit();    
    CHAR szGirar[32]    = {"000000000000.0000"},
         szContable[32] = {"000000000000.0000"};
    INT  iReturn        = 0;
    /////////////////////////////////////////////////////////////////////////////////////////////
    CONST stTranCodeSP    tblTranCodeSP_ARG_ARG  = {'S' , "sp_li_trans",4198, 102,  198, 102,
        3698, 602,  698, 602 };
    CONST stTranCodeSP    tblTranCodeSP_ARG_USD  = {'S' , "sp_li_trans",4200, 104,  200, 104,
        3700, 604,  700, 604 };
    CONST stTranCodeSP    tblTranCodeSP_USD_ARG  = {'S' , "sp_li_trans",4199, 103,  199, 103,
        3699, 603,  699, 603 };
    CONST stTranCodeSP    tblTranCodeSP_USD_USD  = {'S' , "sp_li_trans",4201, 105,  201, 105,
        3701, 605,  701, 605 };
    /////////////////////////////////////////////////////////////////////////////////////////////
    CHAR    szYYYYMMDD[]     = _TIMESTAMP_MASK_, // Xmit-date
            szHHMMSS[]       = _TIMESTAMP_MASK_, // Xmit-time
            szYYYYMMDD_Trx[] = _TIMESTAMP_MASK_, // Trx-date
            szHHMMSS_Trx[]   = _TIMESTAMP_MASK_; // Trx-time
    CHAR    szYYYYMMDD_Cap[] = _TIMESTAMP_MASK_; // Cap-date
    CHAR    szAccount1[sizeof(isoFields.field102.chNum)+1]={"00000000000000000000"},
            szAccount2[sizeof(isoFields.field103.chNum)+1]={"00000000000000000000"};
    CHAR    chOnlineMode      = (boolOnlineMode == is_true) ? 'S' : 'N';
    enumCOBIS cProductoCOBIS1 = cCobisProductoCA, // Producto default CA, donde CA=4,CC=3.
              cProductoCOBIS2 = cCobisProductoCA;
    enumCOBIS cMonedaCOBIS1   = cCobisMonedaPesos, // Moneda Pesos por default
              cMonedaCOBIS2   = cCobisMonedaPesos;
    enumCOBIS cOperacionCOBIS1 = cCobisDebito_Gral,    // Operacion debito-credito
              cOperacionCOBIS2 = cCobisCredito_Gral;
    CHAR    szAmmount[sizeof(isoFields.field4.chAmmount)+1]={"000000000.00"},
            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"},            
            szProduct1[4]={"0"},
            szProduct2[4]={"0"},
            szOnline[4]={"S"},
            szOperacionCobis1[8]={"0"},
            szOperacionCobis2[8]={"0"},
            szCurrency1[4]={"0"},
            szCurrency2[4]={"0"},
            szCause1[8]={"0"},
            szCause2[8]={"0"},
            szNetwork[8]={"0000"};        
    CHAR    szExchangeRate[16] = {"1.00"},    /* default 1$=1us$*/
            szTrxCurrency[4] = {"032"};    /* default 32=PESOS ARGENTINOS */
    CHAR    szAcumEfec[sizeof(isoFields.field4.chAmmount)+1]={"0"},
            szAcumExtra[sizeof(isoFields.field4.chAmmount)+1]={"0"};

    // 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);
    ASSIGNSTRING(szAccount1, isoFields.field102.chNum);    // Cuenta Desde
    ASSIGNSTRING(szAccount2, isoFields.field103.chNum); // Cuenta Hacia

    /////////////////////////////////////////////////////////////////////
    // Si es una reversa, el CREDITO se convierte en DEBITO y viceversa
    /////////////////////////////////////////////////////////////////////
    if(bIsReversal)
    {
        if(cCobisDebitoCA == cOperacionCOBIS1)          cOperacionCOBIS1 = cCobisCreditoCA;
        else if(cCobisCreditoCA    == cOperacionCOBIS1)    cOperacionCOBIS1 = cCobisDebitoCA;
        else if(cCobisDebitoCC     == cOperacionCOBIS1)    cOperacionCOBIS1 = cCobisCreditoCC;
        else if(cCobisCreditoCC    == cOperacionCOBIS1)    cOperacionCOBIS1 = cCobisDebitoCC;
        else if(cCobisDebito_Gral  == cOperacionCOBIS1)    cOperacionCOBIS1 = cCobisCredito_Gral;
        else if(cCobisCredito_Gral == cOperacionCOBIS1)    cOperacionCOBIS1 = cCobisDebito_Gral;
        else return CISO_EXTERNAL_DECLINE_I; 
    };
    /////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////
    //Asignar producto y operacion COBIS
    if(!AssignCOBISProductFromAccType(&cProductoCOBIS1,'D'))
        return CISO_INVALID_TRANSACTION_I;    
    if(!AssignCOBISProductFromAccType(&cProductoCOBIS2,'H'))
        return CISO_INVALID_TRANSACTION_I;    
    ////////////////////////////////////////////////////////////////////////////////////////
    if( cCobisProductoCA == cProductoCOBIS1)
    {
        if (cCobisDebito_Gral == cOperacionCOBIS1) 
            cOperacionCOBIS1 = cCobisDebitoCA;// Debito CA=264
        else 
            cOperacionCOBIS1 = cCobisCreditoCA;// Credito CA=253
    }
    else // if( cProductoCC == cProductoCOBIS1)
    {
        if (cCobisDebito_Gral == cOperacionCOBIS1) 
            cOperacionCOBIS1 = cCobisDebitoCC; // Debito CC=50
        else                                       
            cOperacionCOBIS1 = cCobisCreditoCC;// Credito CC=48
    };
    ////////////////////////////////////////////////////////////////////////////////////////
    if( cCobisProductoCA == cProductoCOBIS2)
    {
        if (cCobisDebito_Gral == cOperacionCOBIS2) 
            cOperacionCOBIS2 = cCobisDebitoCA;// Debito CA=264
        else                                       
            cOperacionCOBIS2 = cCobisCreditoCA;// Credito CA=253
    }
    else // if( cProductoCC == cProductoCOBIS2)
    {
        if (cCobisDebito_Gral == cOperacionCOBIS2) 
            cOperacionCOBIS2 = cCobisDebitoCC; // Debito CC=50
        else                                       
            cOperacionCOBIS2 = cCobisCreditoCC;// Credito CC=48
    };
    ////////////////////////////////////////////////////////////////////////////////////////

    // Ejecutar STORED PROCEDURE
    if(_RPC_DB_ == dbctType && prpcDB != NULL)
    {
        // Copiar string cuenta
        COPYSTRING(szCard, ExtractCardnumFromTrack2( &isoFields.field35 ) );
        CHECKPARAMETER(szCard);
        ASSIGNSTRING(szAccount1, isoFields.field102.chNum);        
        CHECKPARAMETER(szAccount1);
        ASSIGNSTRING(szAccount2, isoFields.field103.chNum);        
        CHECKPARAMETER(szAccount2);
        // 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);
        // Moneda de la operacion es la moneda del debito en cuenta ORIGEN
        AssignCOBISCurrencyFromAccType( &cMonedaCOBIS1, 'D' );
        // Moneda de la operacion es la moneda del credito en cuenta DESTINO
        AssignCOBISCurrencyFromAccType( &cMonedaCOBIS2, 'H' );
        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);
        // Online ?
        if('S' == chOnlineMode) strcpy(szOnline,"S");
        else                     strcpy(szOnline,"N");
        /////////////////////////////////////////////////////////////////////////////////////
        // Causales segun monedas distinta de cuentas involucradas                        
        // Causal 1-DEBITO?
        // Se informa CUENTA ORIGEN y operacion DEBITO
        AssignCOBISCauseFromCurrency( chOnlineMode, szCause1, 
                cMonedaCOBIS1, cOperacionCOBIS1, cProductoCOBIS1, 
                tblTranCodeSP_ARG_ARG, 
                tblTranCodeSP_USD_ARG, 
                tblTranCodeSP_ARG_USD, 

⌨️ 快捷键说明

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