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

📄 trxres.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        shTran = -1; // Un valor negativo es un valor que NO SE CONVIERTE, se traslada identico    
    // Cuenta desde-hacia son numericos obligatorios        
    shFromAcc = antoi(pProcCde->uProcCde.stTranCde.chFrom_Acct_Typ,2);
    shToAcc   = antoi(pProcCde->uProcCde.stTranCde.chTo_Acct_Typ,2);
    switch( shTran )
    {
        case 1   : shTran = 10; break;    // Extraccion de cuenta
        case 9   : shTran = 19; break;    // Orden de debito en cta. por transferencias        
        case 21  : shTran = 20; break;    // Depositos en cuenta
        /******************************************************/
        case 31  : shTran = 30; break;    // Consultas de saldos vs.
        case 32  : shTran = 31; break;    // Cambio de PIN
        /******************************************************/
        case 90  : shTran = 51; break;  // Pago Servicios con debito en cuenta
        default : break; // permanece sin cambios, puede ser alfanumerico....
    }
    switch( shFromAcc )
    {
        case _B24_CHECKINGS_ACCOUNT_USD_ : shFromAcc = _CEXTR_CHECKINGS_ACCOUNT_USD_; break; // 7    - CUENTA CORRIENTE EN DOLARES
        case _B24_SAVINGS_ACCOUNT_       : shFromAcc = _CEXTR_SAVINGS_ACCOUNT_      ; break; // 10   - CAJA DE AHORROS EN PESOS
        case _B24_SPECIAL_ACCOUNT_AFJP_  : shFromAcc = _CEXTR_SPECIAL_ACCOUNT_AFJP_ ; break; // 13  - CUENTA AFJP
        case _B24_SAVINGS_ACCOUNT_BOND_  : shFromAcc = _CEXTR_SAVINGS_ACCOUNT_BOND_ ; break; // 14  - CUENTA BONOS
        case _B24_SAVINGS_ACCOUNT_USD_   : shFromAcc = _CEXTR_SAVINGS_ACCOUNT_USD_  ; break; // 15    - CAJA DE AHORROS EN DOLARES
        case _B24_CHECKINGS_ACCOUNT_     : shFromAcc = _CEXTR_CHECKINGS_ACCOUNT_    ; break; // 20    - CUENTA CORRIENTE EN PESOS
        // case _B24_CHECKINGS_ACCOUNT_BOND_: shFromAcc = 14; break; // 14    - CUENTA CORRIENTE BONOS
        case _B24_CREDIT_CARD_ACCOUNT_   : shFromAcc = _CEXTR_CREDIT_CARD_ACCOUNT_  ; break; // 30    - CUENTA TARJETA DE CREDITO EN PESOS
        case _B24_CREDIT_LINE_ACCOUNT_   : shFromAcc = _CEXTR_CREDIT_LINE_ACCOUNT_  ; break; // 32    - CUENTA CREDITO VISTA EN PESOS
        default : break; // permanece sin cambios
    }
    switch( shToAcc )
    {
        case _B24_CHECKINGS_ACCOUNT_USD_ : shToAcc = _CEXTR_CHECKINGS_ACCOUNT_USD_; break; // 7    - CUENTA CORRIENTE EN DOLARES
        case _B24_SAVINGS_ACCOUNT_       : shToAcc = _CEXTR_SAVINGS_ACCOUNT_      ; break; // 10   - CAJA DE AHORROS EN PESOS
        case _B24_SPECIAL_ACCOUNT_AFJP_  : shToAcc = _CEXTR_SPECIAL_ACCOUNT_AFJP_ ; break; // 13  - CUENTA AFJP
        case _B24_SAVINGS_ACCOUNT_BOND_  : shToAcc = _CEXTR_SAVINGS_ACCOUNT_BOND_ ; break; // 14  - CUENTA BONOS
        case _B24_SAVINGS_ACCOUNT_USD_   : shToAcc = _CEXTR_SAVINGS_ACCOUNT_USD_  ; break; // 15    - CAJA DE AHORROS EN DOLARES
        case _B24_CHECKINGS_ACCOUNT_     : shToAcc = _CEXTR_CHECKINGS_ACCOUNT_    ; break; // 20    - CUENTA CORRIENTE EN PESOS
        // case _B24_CHECKINGS_ACCOUNT_BOND_: shToAcc = 14; break; // 14    - CUENTA CORRIENTE BONOS
        case _B24_CREDIT_CARD_ACCOUNT_   : shToAcc = _CEXTR_CREDIT_CARD_ACCOUNT_  ; break; // 30    - CUENTA TARJETA DE CREDITO EN PESOS
        case _B24_CREDIT_LINE_ACCOUNT_   : shToAcc = _CEXTR_CREDIT_LINE_ACCOUNT_  ; break; // 32    - CUENTA CREDITO VISTA EN PESOS
        default : break; // permanece sin cambios
    }
    // En ASCII-DISPLAY
    // Si son todos numericos....
    if(shTran > 0)
        sprintf( stB24TranCode.uProcCde.stTranCde.chTran_Cde, "%02d%02d%02d", 
                shTran, shFromAcc, shToAcc );
    // Sino, si alguno es alfanumerico....
    else
        sprintf( stB24TranCode.uProcCde.stTranCde.chTran_Cde, "%2.2s%02d%02d", 
                pProcCde->uProcCde.stTranCde.chTran_Cde, shFromAcc, shToAcc );
    // Retorno de valor convertido, en forma estatica
    return ( stB24TranCode.uProcCde.chData );
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formateo especial de campos fecha y hora
BOOL TrxBaseResolution::FormatTrxDateTime(char *szYYYYMMDD, char *szHHMMSS,    
                                    char *szYYYYMMDD_Trx, char *szHHMMSS_Trx,
                                    char *szYYYYMMDD_Cap )    
{
    // Precondicion
    if(!(szYYYYMMDD && szHHMMSS && szYYYYMMDD_Trx && szHHMMSS_Trx && szYYYYMMDD_Cap))
        return FALSE;
    /* Invocar a funcion base con defaults */
    return FormatTrxDateTime_WMask( szYYYYMMDD, szHHMMSS,    
                                    szYYYYMMDD_Trx, szHHMMSS_Trx,
                                    szYYYYMMDD_Cap,
                                    is_true , is_true, is_true, is_true, 0 );
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formateo especial de campos fecha y hora, segun mascara y segun ano de 4 digitos
BOOL TrxBaseResolution::FormatTrxDateTime_WMask(char *szYYYYMMDD, char *szHHMMSS,    
                                    char *szYYYYMMDD_Trx, char *szHHMMSS_Trx,
                                    char *szYYYYMMDD_Cap,
                                    boolean_t bUseSeparators ,
                                    boolean_t bUse4DigitsYear,
                                    boolean_t bFormatIsMMDDYY,
                                    boolean_t bAlwaysTimeIsDateAndTime,
                                    short     nTimestampLength,                                    
                                    short     nHourLength)    
{
    const time_t tTimestamp         = time( NULL );
    const tm *ptmLocal              = localtime( &tTimestamp );
    short nYear                     = ptmLocal->tm_year + 1900 ;   /* default es ano actual */
    const short cnYearDigits        = ( bUse4DigitsYear ) ? 4 : 2; /* default es 4 digitos  */
    short nLength                   = 0;
    /***********************************************************************/
    const char *cszMMDDYY_Mask         = "%.2s/%.2s/%0*i";
    const char *cszMMDDYY_MaskNoSep    = "%.2s%.2s%0*i";
    const char *cszHHMMSS_Mask         = "%.2s:%.2s:%.2s";
    const char *cszHHMMSS_MaskNoSep    = "%.2s%.2s%.2s";
    const char *cszTIMESTAMP_Mask      = "%s %.2s:%.2s:%.2s";
    const char *cszTIMESTAMP_MaskNoSep = "%s%.2s%.2s%.2s";
    const char *cszYYMMDD_Mask         = "%0*i/%.2s/%.2s";
    const char *cszYYMMDD_MaskNoSep    = "%0*i%.2s%.2s";
    char       *pszDATE_Mask           = (char *)cszMMDDYY_Mask ;    /* default c/separadores y MMDDYYYY*/
    char       *pszTIME_Mask           = (char *)cszHHMMSS_Mask ;    /* default c/separadores y HHMMSS*/
    char       *pszTIMESTAMP_Mask      = (char *)cszTIMESTAMP_Mask ; /* default c/separadores y YYYY*/
    /***********************************************************************/
    short nMonth                    = ptmLocal->tm_mon + 1;  /* default es mes actual */
    short nYearTranDat              = nYear ;               /* default es ano actual */
    short nYearPostDat              = nYear ;               /* default es ano actual */
    /***********************************************************************/

    // No hay Precondicion esepcifica, ya que pueden o no informarse todos los campos

    //////////////////////////////////////////////////////////////////////
    // Segun mascara y ano de 4 digitos
    //////////////////////////////////////////////////////////////////////
    // ptmLocal->tm_year + 1900; /* years since 1900 */
    // ptmLocal->tm_mon + 1;     /* months since January - [0;11] */
    // ptmLocal->tm_mday;        /* day of the month - [1;31] */
    // ptmLocal->tm_hour;        /* hours since midnight - [0;23] */
    // ptmLocal->tm_min;         /* minutes after the hour - [0;59] */
    // ptmLocal->tm_sec;         /* seconds after the minute - [0;59] */
    //////////////////////////////////////////////////////////////////////
    if(bUse4DigitsYear)
        nYear = ptmLocal->tm_year + 1900 ;
    else
        nYear = ptmLocal->tm_year % 100;

    //////////////////////////////////////////////////////////////////////////
    // Cuando el MES de POSTING-DATE es MENOR al de TRANSACTION-DATE,
    // y es IGUAL al MES actual del sistema, ha cambiado el ao !!!
    // Ej. Es 01-01-2002 y entra SAF del 31-12-2001, debe restarse 1 al ao actual.
    if( strncmp(isoFields.field17.chMMDD, isoFields.field13.chMMDD,2) < 0
        &&
        antoi(isoFields.field17.chMMDD,2) == nMonth )
            nYearTranDat = nYear -  1;
    else
            nYearTranDat = nYear ;
    //////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////
    // Cuando el MES de POSTING-DATE es MENOR al de TRANSACTION-DATE,
    // y es MENOR al MES actual del sistema, ha cambiado el ao !!!
    // Ej. Es 31-12-2001 y ya ingresan del 01-01-2002, debe sumarse 1 al ao actual.
    if( strncmp(isoFields.field17.chMMDD, isoFields.field13.chMMDD,2) < 0
        &&
        antoi(isoFields.field17.chMMDD,2) < nMonth )
            nYearPostDat = nYear +  1;
    else
            nYearPostDat = nYear ;
    //////////////////////////////////////////////////////////////////////////

    if(bUseSeparators)
    {
        if(bFormatIsMMDDYY)
            pszDATE_Mask  = (char *)cszMMDDYY_Mask ;
        else
            pszDATE_Mask  = (char *)cszYYMMDD_Mask ;
        pszTIMESTAMP_Mask = (char *)cszTIMESTAMP_Mask ;
    }
    else
    {
        if(bFormatIsMMDDYY)
            pszDATE_Mask  = (char *)cszMMDDYY_MaskNoSep ;
        else
            pszDATE_Mask  = (char *)cszYYMMDD_MaskNoSep ;
        if(bAlwaysTimeIsDateAndTime)
            pszTIME_Mask  = (char *)cszTIMESTAMP_MaskNoSep ;
        else
            pszTIME_Mask  = (char *)cszHHMMSS_MaskNoSep ;
        pszTIMESTAMP_Mask = (char *)cszTIMESTAMP_MaskNoSep ;
    };

    // Fecha de Transmision, formato MM/DD/YYYY (XMIT-DATE), ISO-FIELD-07
    if(szYYYYMMDD)
    {
        if(bFormatIsMMDDYY)
            sprintf(szYYYYMMDD,pszDATE_Mask, isoFields.field7.chMMDD, isoFields.field7.chMMDD+2,
                cnYearDigits , nYear );
        else
            sprintf(szYYYYMMDD,pszDATE_Mask, cnYearDigits , nYear, isoFields.field7.chMMDD,
                isoFields.field7.chMMDD+2 );
    }
    // Hora de Transmision formato HH:MM:SS (XMIT-TIME), ISO-FIELD-07
    if(szHHMMSS)
    {
        if(bAlwaysTimeIsDateAndTime)
        {
            sprintf(szHHMMSS  ,pszTIMESTAMP_Mask , szYYYYMMDD,
                isoFields.field7.chHHMMSS,isoFields.field7.chHHMMSS+2,isoFields.field7.chHHMMSS+4 );
            // Paddear lo restante con ceros
            nLength = strlen(szHHMMSS);
            if(nTimestampLength > nLength)
                memset( szHHMMSS+nLength, '0', nTimestampLength-nLength);
        }
        else
            sprintf(szHHMMSS  ,pszTIME_Mask ,
                isoFields.field7.chHHMMSS,isoFields.field7.chHHMMSS+2,isoFields.field7.chHHMMSS+4 );
    };
    // Fecha de Transaccion, formato MM/DD/YYYY (TRX-DATE), ISO-FIELD-13
    // El ano se obtiene , o bien del sistema, o bien de la fecha de transaccion :
    // Mismo ano de transmision que la fecha de negocios? (comparar 2 ultimos digitos)
    if(szYYYYMMDD_Trx)
    {
        if(bFormatIsMMDDYY)
            sprintf(szYYYYMMDD_Trx,pszDATE_Mask, isoFields.field13.chMMDD, isoFields.field13.chMMDD+2,
                cnYearDigits , nYearTranDat );
        else
            sprintf(szYYYYMMDD_Trx,pszDATE_Mask, cnYearDigits , nYear, isoFields.field13.chMMDD,
                isoFields.field13.chMMDD+2 );
    }
    // Hora de Transaccion formato HH:MM:SS (TRX-TIME = XMIT-TIME), ISO-FIELD-12
    if(szHHMMSS_Trx)
    {
        if(bAlwaysTimeIsDateAndTime)
            sprintf(szHHMMSS_Trx  ,pszTIMESTAMP_Mask , szYYYYMMDD_Trx,
                isoFields.field12.chHHMMSS,isoFields.field12.chHHMMSS+2,isoFields.field12.chHHMMSS+4 );
        else
            sprintf(szHHMMSS_Trx  ,pszTIME_Mask ,
                isoFields.field12.chHHMMSS,isoFields.field12.chHHMMSS+2,isoFields.field12.chHHMMSS+4 );
        // Paddear lo restante con ceros, si corresponde, a los milisegundos....
        nLength = strlen(szHHMMSS_Trx);
        if(nHourLength > nLength)
            memset( szHHMMSS_Trx+nLength, '0', nHourLength-nLength);
    };
    // Fecha de Negocios (capture date)(CAP-DATE), ISO-FIELD-17
    if(szYYYYMMDD_Cap)
    {
        if(bFormatIsMMDDYY)
            sprintf(szYYYYMMDD_Cap,pszDATE_Mask, isoFields.field17.chMMDD, isoFields.field17.chMMDD+2,
                cnYearDigits , nYearPostDat );
        else

⌨️ 快捷键说明

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