?? trxres.cpp
字號:
/////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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 */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -