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

📄 atmtrx.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    COPYVALUE(isoFields.field54.stB24_0210_Def_Data.chCASH_AVAIL,chCASH_AVAIL); // saldo disponible
    COPYVALUE(isoFields.field54.stB24_0210_Def_Data.chMIN_PAYMENT,chMIN_PAYMENT); // pago minimo
    COPYVALUE(isoFields.field54.stB24_0210_Def_Data.chPAYMENT_DAT,chPAYMENT_DAT); // dia de pago
    COPYVALUE(isoFields.field54.stB24_0210_Def_Data.chINTEREST_RATE,chINTEREST_RATE); // tasa de interes
    COPYVALUE(isoFields.field54.stB24_0210_Def_Data.chOWE_DOLAR,chOWE_DOLAR); // deuda en dolares
    COPYVALUE(isoFields.field54.stB24_0210_Def_Data.chMIN_PAYMENT_DOLAR,chMIN_PAYMENT_DOLAR); // pago minimo en dolares
    COPYVALUE(isoFields.field54.stB24_0210_Def_Data.chPURCHASE_DOLAR,chPURCHASE_DOLAR);    // compra en dolares
    COPYVALUE(isoFields.field54.stB24_0210_Def_Data.chCASH_FEE,chCASH_FEE); // arancel de usuario
    isoFields.field54.stB24_0210_Def_Data.chFILLER[0] = 0x00;
    // Insertar el campo #54 solo si no existe
    if(isoMsg.IsValidField( 54 ))        
        isoMsg.DeleteField( 54 );
    // Respuesta parametrica en campo #54        
    wRspCdeLen=min(sizeof(isoFields.field54),strlen(isoFields.field54.chData));
    isoMsg.InsertField(54, &wRspCdeLen, (PBYTE)&isoFields.field54, wRspCdeLen );

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formatear campo ISO #55 de rta., PRIRSRVD1_ISO
void TrxResATM::FormatField55_PRIRSRVD1_ISO( 
    char *chTrack2,
    char *chCA,
    char *chFiid_1,
    char *chTyp_1,
    char *chAcct_num_1,
    char *chFiid_2,
    char *chTyp_2,
    char *chAcct_num_2
    )
{
    WORD wRspCdeLen=0;

    // Formatear campo ISO #55 de rta., PRIRSRVD1_ISO, solamente para interbancarias.
    if( !( isoMsg.IsATMTransferInterbank() || isoMsg.IsATMAccountVerification() )  )    
    {
        isoMsg.DeleteField ( 55 );
        return ;
    };
    // Formatear campo ISO #55 de rta., PRIRSRVD1_ISO
    // No se blanquea inicialmente porque ya viene informado por el switch financiero
    if( chTrack2        != NULL &&
        chCA            != NULL &&
        chFiid_1        != NULL &&
        chTyp_1         != NULL &&
        chAcct_num_1    != NULL &&
        chFiid_2        != NULL &&
        chTyp_2         != NULL &&
        chAcct_num_2    != NULL )
    {
        COPYVALUE(isoFields.field55.stInterbancarias.chTrack2,chTrack2);
        COPYVALUE(isoFields.field55.stInterbancarias.chCA, chCA);
        COPYVALUE(isoFields.field55.stInterbancarias.stFrom_Acct.chFiid, chFiid_1);
        COPYVALUE(isoFields.field55.stInterbancarias.stFrom_Acct.chTyp, chTyp_1);
        COPYVALUE(isoFields.field55.stInterbancarias.stFrom_Acct.chAcct_num, chAcct_num_1);
        COPYVALUE(isoFields.field55.stInterbancarias.stTo_Acct.chFiid, chFiid_2);
        COPYVALUE(isoFields.field55.stInterbancarias.stTo_Acct.chTyp, chTyp_2 );
        COPYVALUE(isoFields.field55.stInterbancarias.stTo_Acct.chAcct_num, chAcct_num_2);
        COPYVALUE(isoFields.field55.stInterbancarias.filler, "--------------------");
        // Respuesta parametrica en campo #55
        // Insertar el campo #55 solo si no existe
        if(isoMsg.IsValidField( 55 ))
            isoMsg.DeleteField( 55 );
        wRspCdeLen=min(sizeof(isoFields.field55),strlen(isoFields.field55.chData));
        isoMsg.InsertField(55, &wRspCdeLen, (PBYTE)&isoFields.field55,    wRspCdeLen );
    };

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formatear campo ISO #15 y #61 que POR ERRORES DEL PREHOMO DE LINK, a veces no vienen en el 0200
void TrxResATM::FormatFields15_61( void )
{
    WORD wRspCdeLen=0;
    if(isoMsg.IsValidField( 15 ) && isoMsg.IsValidField( 61 ))
        return;

    // Formatear campo ISO #15 de rta.    SETTLEMENT-DATE como POSTING DATE, #17
    COPYVALUEEXACT(isoFields.field15.chMMDD , isoFields.field17.chMMDD ); 
    // Respuesta parametrica en campo #15    
    wRspCdeLen=sizeof(isoFields.field15);
    isoMsg.InsertField(15, &wRspCdeLen, (PBYTE)&isoFields.field15,    wRspCdeLen );
    
    // Formatear campo ISO #61 de rta.    , como TERM #60 y valores por defecto    
    COPYVALUE(isoFields.field61.stATM_Data.chCrdFIID     , isoFields.field60.stATMTerm.chTermFIID);       
    COPYVALUE(isoFields.field61.stATM_Data.chCrdLNet     ,  isoFields.field60.stATMTerm.chTermLNet);        
    COPYVALUE(isoFields.field61.stATM_Data.chSaveAcctType, "0000");    
    isoFields.field61.stATM_Data.chAutorizer             = 'P';        
    isoFields.field61.stATM_Data.chOrigTranCde[0] = 0x00;    

    // Respuesta parametrica en campo #61
    wRspCdeLen=min(sizeof(isoFields.field61),strlen(isoFields.field61.chData));
    isoMsg.InsertField(61, &wRspCdeLen, (PBYTE)&isoFields.field61,    wRspCdeLen );

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formatear campo ISO #44 de rta., PRIRSRVD1_ISO
void TrxResATM::FormatField44_RESP_DATA( char *chOPEN_AMMOUNT, char *chDAILY_LIMIT )
{
    // Como RED LINK mantiene el disponible, informamos siempre el SALDO CONTABLE,
    // que es el mayor de los dos montos. Se indica con este FLAG.
    const boolean_t bNetworkDailyLimit = is_true;    
    WORD wRspCdeLen=0;

    // Formatear campo ISO #44 de rta., RESP_DATA    
    memset(&isoFields.field44,' ',sizeof(isoFields.field44));
    // Cuantos montos se informan ?
    if( chOPEN_AMMOUNT && chDAILY_LIMIT)
        isoFields.field44.stAvail.chType = '2'; /* '0','1','2','3','4' o ' ' *** forzado LINK = 2 */        
    else if( chOPEN_AMMOUNT || chDAILY_LIMIT)
        isoFields.field44.stAvail.chType = '1'; /* '0','1','2','3','4' o ' ' *** forzado LINK = 2 */        
    else 
        isoFields.field44.stAvail.chType = '0'; /* '0','1','2','3','4' o ' ' *** forzado LINK = 2 */        
    // Como RED LINK mantiene el disponible, informamos siempre el SALDO CONTABLE,
    // que es el mayor de los dos montos.
    if( chOPEN_AMMOUNT && chDAILY_LIMIT &&
        strcmp(chOPEN_AMMOUNT,chDAILY_LIMIT)>0 && bNetworkDailyLimit)
    {
        COPYVALUE(isoFields.field44.stAvail.chOpenAmmount ,chOPEN_AMMOUNT);  /* 9(10).99 : saldo apertura */
        COPYVALUE(isoFields.field44.stAvail.chAvailAmmount,chOPEN_AMMOUNT); /* 9(10).99 : disponible     */
    }
    else if( chOPEN_AMMOUNT && chDAILY_LIMIT &&
            strcmp(chOPEN_AMMOUNT,chDAILY_LIMIT)<0 && bNetworkDailyLimit)
    {
        COPYVALUE(isoFields.field44.stAvail.chOpenAmmount ,chDAILY_LIMIT);  /* 9(10).99 : saldo apertura */
        COPYVALUE(isoFields.field44.stAvail.chAvailAmmount,chDAILY_LIMIT); /* 9(10).99 : disponible     */
    }
    else if( NULL == chOPEN_AMMOUNT && NULL == chDAILY_LIMIT )
    {
        isoFields.field44.stAvail.chType = '2'; /* '0','1','2','3','4' o ' ' *** forzado LINK = 2 */        
        SETVALUEZEROE(isoFields.field44.stAvail.chOpenAmmount );  /* 9(10).99 : saldo apertura */
        SETVALUEZEROE(isoFields.field44.stAvail.chAvailAmmount); /* 9(10).99 : disponible     */
    }
    else // Todo otro caso...
    {
        COPYVALUE(isoFields.field44.stAvail.chOpenAmmount ,chOPEN_AMMOUNT);  /* 9(10).99 : saldo apertura */
        COPYVALUE(isoFields.field44.stAvail.chAvailAmmount,chDAILY_LIMIT); /* 9(10).99 : disponible     */
    };


    // Respuesta parametrica en campo #44        
    // Insertar el campo #44 solo si no existe
    if(isoMsg.IsValidField( 44 ))
        isoMsg.DeleteField( 44 );
    wRspCdeLen=min(sizeof(isoFields.field44),strlen(isoFields.field44.chData));
    isoMsg.InsertField(44, &wRspCdeLen, (PBYTE)&isoFields.field44,    wRspCdeLen );

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formatear campo ISO #122 de rta., SECNDRY_RSRVD3_PRVT
void TrxResATM::FormatField122_SECNDRY_RSRVD3_PRVT( void )
{
    WORD wRspCdeLen=0;
    // Insertar el campo #122 solo si no existe
    if(isoMsg.IsValidField( 122 ))
        return;
    // Formatear campo ISO #122 de rta., SECNDRY_RSRVD3_PRVT
    memset(&isoFields.field122,' ',sizeof(isoFields.field122));
    COPYVALUE(isoFields.field122.chCardIssuerIdentCode, "00000000000");
    // Respuesta parametrica en campo #122        
    wRspCdeLen=min(sizeof(isoFields.field122),strlen(isoFields.field122.chCardIssuerIdentCode));
    isoMsg.InsertField(122, &wRspCdeLen, (PBYTE)&isoFields.field122, wRspCdeLen );

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formatear campo ISO #123 de rta., SECNDRY_RSRVD4_PRVT
void TrxResATM::FormatField123_SECNDRY_RSRVD4_PRVT( void )
{    
    WORD wRspCdeLen=0;
    // Insertar el campo #123 solo si no existe
    if(isoMsg.IsValidField( 123 ))
        return;
    // Formatear campo ISO #123 de rta., SECNDRY_RSRVD4_PRVT, "DEPOSIT AMMOUNT"
    memset(&isoFields.field123,' ',sizeof(isoFields.field123));
    COPYVALUE(isoFields.field123.chDepositCreditAmmount, "000000000000");
    // Respuesta parametrica en campo #123        
    wRspCdeLen=min(sizeof(isoFields.field123),strlen(isoFields.field123.chDepositCreditAmmount));
    isoMsg.InsertField(123, &wRspCdeLen, (PBYTE)&isoFields.field123, wRspCdeLen );

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formatear campo ISO #127 de rta., SECNDRY_RSRVD7_PRVT
void TrxResATM::FormatField127_SECNDRY_RSRVD8_PRVT( void )
{    
    WORD wRspCdeLen=0;    

    // Actualizar o insertar segun requiera RED LINK
    if(isoMsg.IsValidField( 127 ))
    {
        // Actualizar los tipos de cambio segun informa el switch financiero
        // Copiar la cotizacion informada hacia la cotizacion aplicada
        FIELD127 resp127;
        // Copia local de trabajo
        resp127.stATM.stATM_Dl_Resp = isoFields.field127.stATM.stATM_Dl_Resp;
        // Copiar las cotizaciones del requerimiento hacia las cotizaciones de respuesta
        resp127.stATM.stATM_Dl_Resp.chCamb_Aplic = '0'; /* FORZADO LINK */
        COPYVALUEEXACT(resp127.stATM.stATM_Dl_Resp.chCambio_C,
            isoFields.field127.stATM.stATM_Dl_Rqst.chCambio_C);
        COPYVALUEEXACT(resp127.stATM.stATM_Dl_Resp.chCambio_V,
            isoFields.field127.stATM.stATM_Dl_Rqst.chCambio_V);
        COPYVALUEEXACT(resp127.stATM.stATM_Dl_Resp.chCambio_1,
            isoFields.field127.stATM.stATM_Dl_Rqst.chCambio_1);
        COPYVALUEEXACT(resp127.stATM.stATM_Dl_Resp.chCambio_2,
            isoFields.field127.stATM.stATM_Dl_Rqst.chCambio_2);
        COPYVALUE(resp127.stATM.stATM_Dl_Resp.chFiller,"0000000000");            
        // Sobreescitura del campo existente
        isoFields.field127.stATM.stATM_Dl_Resp = resp127.stATM.stATM_Dl_Resp;
        // Actualizacion en mensaje ISO
        wRspCdeLen=sizeof(isoFields.field127.stATM.chMicr_Data); // Longitud fija de 43 bytes
        isoMsg.SetField(127, &wRspCdeLen, (PBYTE)&isoFields.field127, wRspCdeLen );
    }
    else
    {
        // Formatear campo ISO #127 de rta., SECNDRY_RSRVD8_PRVT    
        memset(&isoFields.field127,' ',sizeof(isoFields.field127));
        isoFields.field127.stATM.stATM_Dl_Resp.chCamb_Aplic = '0'; /* FORZADO LINK */
        COPYVALUE(isoFields.field127.stATM.stATM_Dl_Resp.chCambio_C, "00000000");
        COPYVALUE(isoFields.field127.stATM.stATM_Dl_Resp.chCambio_V, "00000000");
        COPYVALUE(isoFields.field127.stATM.stATM_Dl_Resp.chCambio_1, "00000000");
        COPYVALUE(isoFields.field127.stATM.stATM_Dl_Resp.chCambio_2, "00000000");
        COPYVALUE(isoFields.field127.stATM.stATM_Dl_Resp.chFiller, "          ");
        wRspCdeLen=sizeof(isoFields.field127.stATM.chMicr_Data); // Longitud fija de 43 bytes
        isoMsg.InsertField(127, &wRspCdeLen, (PBYTE)&isoFields.field127, wRspCdeLen );
    };

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formatear campo ISO #125 de rta., SECNDRY_RSRVD6_PRVT
void TrxResATM::FormatField125_SECNDRY_RSRVD6_PRVT( char chProc_Acct_Ind )
{
    WORD wRspCdeLen=0;    
    // Insertar el campo #125 solo si no existe
    if(isoMsg.IsValidField( 125 ))
        return;
    // Formatear campo ISO #125 de rta., SECNDRY_RSRVD6_PRVT, "ACCOUNT INDICATOR"
    isoFields.field125.stATM_STMT.stATM.chProc_Acct_Ind = chProc_Acct_Ind;
    isoFields.field125.stATM_STMT.stATM.chFiller[0]     = 0x00;
    // Respuesta parametrica en campo #125        
    wRspCdeLen=min(sizeof(isoFields.field125),strlen(isoFields.field125.chData));
    isoMsg.InsertField(125, &wRspCdeLen, (PBYTE)&isoFields.field125, wRspCdeLen );

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////
// Estado de la ultima ejecucion RPC/ODBC
boolean_t TrxResATM::TransactionExecutionStatus()
{
    return bExecStatus_ok;
}
///////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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