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

📄 trxres.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/////////////////////////////////////////////////////////////////////////////////////////////////
//                                                              
// IT24 Sistemas S.A.
// Transaction Base Resolution Class
// Transaction Resolution Class
//
//        Esta es la Clase de Resolucion de Transacciones.
//        Aplicada en principio para PAS, puede soportar las subsiguientes
//  logicas de resolucion de transacciones de futuros proyectos, como
//  ULTMOV, AFJP, MEP, SOAT, etc, ya que simplemente se discriminan
//  por tipo de trx y se aplican distintos metodos con diversos Stored Procedures.
//        La misma se plantea como instancias multiples creadas por un Servidor 
//  de Atencion de Transacciones. Como puede tener multiples transacciones
//  resolviendose, no se plantea como clase estatica, y es por esto mismo
//  que no deben establecerse variables miembro estaticas, sino locales al metodo.
//      El siguiente grafico da una idea de la 'familia' de clases obtenidas:
//
//
//                           TrxBaseResolution                    1) Esta es la base
//                                  |
//                                  |
//               +------------+-----+------+-------------+
//               |            |            |             |
//               |            |            |             |
//           TrxResPAS   TrxResULTMOV   TrxResAFJP   TrxResSOAT   2) Esta la especializacion
//               |            |            |             |
//               |            |            |             |
//               +------------+-----+------+-------------+
//                                  |
//                                  |
//                             TrxResolution                      3) Y este el controlador
//
//   Segun la implementacion, los metodos especializados puede ser "dummy", o sea un 
// simple retorno en falso sin procesamiento, sin generar el codigo ejecutable 
// actualmente,  con el solo motivo de mantener el esqueleto de codigo fuente 
// original y facilitar el posible enlace a futuro de las subclases especializadas 
// en una sola libreria o modulo.
//
//
// Tarea        Fecha           Autor   Observaciones
// (Inicial)    1998.07.23      mdc     En base a TrxRes de PAS/AFJP/ULTMOV
// (Inicial)    1999.07.08      mdc     Assume time-out and retry (ConnectDataBase(...))
// (Beta)       2001.12.31      mdc     ATM
// (Beta)       2002.01.25      mdc     BOOL TrxBaseResolution::ConnectDataBase(PSTR pszServer, PSTR pszDBase, PSTR pszUser);
// (Beta)       2002.02.18      mdc     TrxBaseResolution::SetOnOffLine(boolean_t boolXOnline)
// (Beta)       2002.11.22      mdc     wAuthRespCde   = TCP4U_SUCCESS;       // OK por default
// (Beta)       2003.05.20      mdc     BOOL TrxBaseResolution::FormatTrxDateTime_WMask(char *szYYYYMMDD, char *szHHMMSS,...);
// (Beta)       2004.01.05      mdc     Cuando el MES de fecha de negocios es MENOR al de fecha de transaccion,
//                                      debe sumarse 1 al ao actual.
//
/////////////////////////////////////////////////////////////////////////////////////////////////

// Header Type Definitions
#include <qusrinc/typedefs.h>    
// Headers ANSI 
#include <time.h>    
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Headers propios
#include <qusrinc/trxres.h>
#include <qusrinc/stdiol.h>

///////////////////////////////////////////////////////////////////////////////////
// TrxBaseResolution
///////////////////////////////////////////////////////////////////////////////////

// Clase Resolucion Base de Transaccion
// Constructor default
EXPORT TrxBaseResolution::TrxBaseResolution(void)
    {
    boolOnlineMode = is_true;    // En linea por default
    /////////////////////////////////////////////////////////////////////////
    bProcResult    = is_false;    // Sin resultado de procesamiento por default
    wProcRespCde   = CISO_SYSTEM_ERROR_I; // Desaprobada por default
    shAuthRespCde   = TCP4U_SUCCESS;       // OK por default
    efFormatMsg    = CNTL_FORMAT_ISO8583; // ISO8583 por default
    srand( time( NULL ) );        // Inicializar criba de pseudorandoms
    /////////////////////////////////////////////////////////////////////////

    // Inicializacion: Bitmap strings parametricas?    
    isoMsg.CheckExternParameters();

    }

// Constructor opcional
EXPORT TrxBaseResolution::TrxBaseResolution(PSTR pszDBase,PSTR pszUser)
    {
    // Initialization    
    boolOnlineMode = is_true;    // En linea por default
    /////////////////////////////////////////////////////////////////////////
    bProcResult    = is_false;    // Sin resultado de procesamiento por default
    wProcRespCde   = CISO_SYSTEM_ERROR_I; // Desaprobada por default
    shAuthRespCde  = TCP4U_SUCCESS;       // OK por default
    efFormatMsg    = CNTL_FORMAT_ISO8583; // ISO8583 por default
    srand( time( NULL ) );        // Inicializar criba de pseudorandoms
    /////////////////////////////////////////////////////////////////////////

    // Inicializacion: Bitmap strings parametricas?    
    isoMsg.CheckExternParameters();

    }

EXPORT TrxBaseResolution::~TrxBaseResolution(void)
    {    
    // Sin formato de mensaje al finalizar
    efFormatMsg = CNTL_FORMAT_NULL; 
    // Offline al finalizar
    boolOnlineMode = is_false;    
    }

BOOL EXPORT TrxBaseResolution::SetOnOffLine(boolean_t boolXOnline)
    {
    // Senal de modo ON u OFF que implica informar fechas en forma distinta segun corresponda
    boolOnlineMode = boolXOnline;
    return TRUE;
    }

////////////////////////////////////////////////////////////////////////////
// Para loggear errores internos, se disponibilizan estos metodos publicas:
WORD EXPORT TrxBaseResolution::TransactionStatus(void)
    {
    // Ok?
    return ( bProcResult ) 
        ? wProcRespCde
        : 0;
    }

////////////////////////////////////////////////////////////////////////////
// Para loggear errores internos, se disponibilizan estos metodos publicas:
short EXPORT TrxBaseResolution::BackEndAuthStatus(void)
    {
    // Ok? {-32768....+32767}
    return shAuthRespCde;
    }

////////////////////////////////////////////////////////////////////////////
// Para verificar tipo de mensajes ISO para enviar a SAF
BOOL EXPORT TrxBaseResolution::IsValidSAFTransaction(void)
    {
    // Las transacciones validas para enviar a SAF son aquellas notificaciones 
    // (ISO 220) y reversos (ISO 420) o forzados de los mismos. El resto no se
    // guarda en el SAF local, sino en el SAF del switch financiero.
    if(     isoMsgBkp.IsFinancialAdvice() ||     // Forzados
         isoMsgBkp.IsValidReversal() )        // Reversos
         return TRUE;
    else
        return FALSE;

    }

///////////////////////////////////////////////////////////////////////////////////
// TrxResolution
///////////////////////////////////////////////////////////////////////////////////

// Verificacion de TrxAdvice/SAFAdvice (0220)
BOOL EXPORT TrxResolution::IsTrxAdvice(void)
    {
    // Actualmente solo se da en el Sistema PAS
    return isoMsg.IsPASPayment();
    }

// Verificacion de TrxAdviceResp/SAFAdviceResp (0230)
BOOL EXPORT TrxResolution::IsTrxAdviceResponse(void)
    {
    // Actualmente solo se da en el Sistema PAS
    return isoMsg.IsPASPaymentResponse();
    }

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Formatea el monto agregandole o quitando punto decimal y millares,
// y optativamente aplica el tipo de cambio si correspondiera.
// szAmmount - monto en formato display, a convertir y formatear con decimales
// shDecPos - posiciones decimales a fijar
// szNew - variable de recepcion del monto formateado
// shAlignWidth - cantidad de posiciones a alinear y rellenar
// bApplyChangeRate - aplica tipo de cambio, si o no?
// szExchangeRate - tipo de cambio aplicado
SHORT TrxBaseResolution::Format_ISO_Ammount(const char *szAmmount, short shDecPos, 
                                      char *szNew, short shAlignWidth,
                                      boolean_t bApplyChangeRate ,
                                      char *szExchangeRate)
{
    /******************************************************************/
    /* maximo de longitud a tomar */
    const short wAmmountLen = sizeof(isoFields.field4.chAmmount); 
    /******************************************************************/    
    short  shLen           = 0;       /* long de cadena */
    char   *pszDecPoint    = NULL; /* ptr a pto. decimal en la cadena */
    short  shQPoints       = 0;    /* cantidad de reemplazos efectuados */
    double dblAmmount      = 0.0f; /* monto en binario interno */           
    const char chMilePoint = ',';  /* punto millar buscado */
    double dblCnvRate      = 0.0f, /* tasa de cambio-conversion DOLARES-PESOS-etc */
           dblAmmountCnv   = 0.0f; /* monto convertido a tasa de cambio */    
    /* Recuperar en forma binaria los tipos de cuenta DESDE y HACIA */
    int iFromAccType = antoi(isoFields.field3.uProcCde.stTranCde.chFrom_Acct_Typ,2) ;
    int iToAccType   = antoi(isoFields.field3.uProcCde.stTranCde.chTo_Acct_Typ  ,2) ;


    /* precondicion */
    if(szAmmount == NULL || szAmmount[0] == 0x00 || szNew == NULL || 
        shAlignWidth < 0 || shDecPos < 0)
        return -1;
    /******************************************************************/
    /* conversion de formato ISO a uso interno con decimales ? */
    /* posicion decimal invalida para poner punto decimal ? */
    if(shDecPos > 0)    
    {
        /******************************************************************/
        /* copia local y longitud de la cadena que representa al MONTO TRX*/    
        strncpy(szNew, szAmmount, wAmmountLen);
        szNew[wAmmountLen] = 0x00 ;
        /* longitud en base al maximo ISO posible */
        shLen = strlen(szNew);
        /******************************************************************/

        /* conversion a ASCII con pto. decimal */
        sprintf(szNew, "%*.*s.%*.*s", 
            shLen - shDecPos, shLen - shDecPos, szAmmount, 
            shDecPos, shDecPos, szAmmount + shLen - shDecPos);                    
        shLen = strlen(szNew);
        /* conversion a binario y verificacion del tipo de cambio si corresponde */
        dblAmmount = atof( szNew );
        dblCnvRate = 1.0f; /* default : NO hay conversion a ningun tipo de cambio */ 
        /* si el tipo de cuenta difiere de la moneda de la transaccion */

⌨️ 快捷键说明

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