📄 extrtrx.cpp
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// IT24 Sistemas S.A.
// Process ATM Transaction Method
//
// Metodo de Procesamiento de Transaccion ATM, con conexion y desconexion a base de
// datos para cada transaccion entrante, con manejo local de parsing del mensaje ISO
// y seteo del codigo de respuesta en el mensaje saliente.
//
// Tarea Fecha Autor Observaciones
// (Inicial) 2003.05.09 mdc Base
// (Inicial) 2003.06.04 mdc REVERSAL REASONS
// (Inicial) 2003.06.10 mdc Para formatos EXTRACT, clase especializada TrxResEXTRACT
// (Release-1) 2003.07.23 mdc Arbitraje no multiplica AMMT-1 : bArbitraje = is_false;
// (Release-2) 2003.08.26 mdc Seales de uso o no de transacciones CBU y ANUL.COMPRAS.
// (Release-2) 2003.10.30 mdc NO SE REVERSA PARCIALMENTE EL FAST-CASH.
// (Release-2) 2004.04.06 mdc Cod.de Moneda asumido es PESOS ARGENTINOS
// (Release-2) 2004.05.14 mdc Bug de campo ISO-102 y ISO-103 : reemplaza macro ASSIGNFIELD.
// (Release-2) 2004.05.24 mdc Codigo de Respuesta o Causal de Reversa, si acaso tambien es un FORZADO
// (Release-2) 2004.06.04 mdc ProcessBuying() : Compras y Devol. procesan pero NO IMPACTAN : no retornar "91"
// (Release-2) 2004.09.24 mdc _USE_EXCHANGE_AMMT1_
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Headers ANSI C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <time.h>
#ifndef _SYSTEM_ATM_
#define _SYSTEM_ATM_DEFINED_
#define _SYSTEM_ATM_
#endif // _SYSTEM_ATM_DEFINED_
// Header Transaction Resolution
#include <qusrinc/trxres.h>
// Libreria de utilidades estandards
#include <qusrinc/stdiol.h>
// Header ISO Msg Redefinition
#include <qusrinc/isoredef.h>
// Header ISO 8583
#include <qusrinc/iso8583.h>
// Header EXTRACT BASE24 RED LINK
#include <qusrinc/extrctst.h>
#ifdef _SYSTEM_ATM_DEFINED_
#undef _SYSTEM_ATM_
#endif // _SYSTEM_ATM_DEFINED_
// Librerias propias de TCP/IP v4
#include <qusrinc/tcp4u.h>
/////////////////////////////////////////////////////////////////////////////////////////
// Prototipo de funcion utilitaria que retorna la cantidad de bytes numericos en string
/////////////////////////////////////////////////////////////////////////////////////////
short strnumlen( char *pszValue , const short nMax );
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
// Definiciones y Macros de expansion MUY utiles para simplificar el codigo
/////////////////////////////////////////////////////////////////////////////////////////
// Macro de asignacion de String, con NULL al final
#define COPYSTRING(dst,src) strcpy(dst,src)
// Macro de asignacion de String, con NULL al final
#define ASSIGNSTRING(dst,src) \
{ strncpy(dst,src,sizeof(src)); dst[sizeof(src)]=0x00; }
// Macro de asignacion de bytes a campo de estructura
#define ASSIGNFIELD(dst,src) \
{ memset(dst,' ',sizeof(dst)); memcpy(dst,src,min(sizeof(src),sizeof(dst))); }
// Macro de asignacion de ceros a campo de estructura
#define SETFIELDZEROED(dst) memset(dst ,'0',sizeof(dst))
#define SETFIELDBLANKED(dst) memset(dst ,' ',sizeof(dst))
#define SETSTRUCTZEROED(dst) memset(&dst,'0',sizeof(dst))
#define SETSTRUCTBLANKED(dst) memset(&dst,' ',sizeof(dst))
#define SETSTRUCTNULL(dst) memset(&dst, 0x00,sizeof(dst))
/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Nombre local al modulo para el archivo de logg del EXTRACT
static const char _LOGFILENAME_[] = "LGyymmdd.txt";
// ISO8583 Msg. Header
static const char _ISO_MSG_HEADER_[] = "ISO";
// Longitud maxima de tarjeta en TACK-2
static const short _MAX_CARDNUM_LEN_ = 19;
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Funcion utilitaria que retorna la cantidad de bytes numericos en string
///////////////////////////////////////////////////////////////////////////
short strnumlen( char *pszValue , const short nMax );
/////////////////////////////////////////////////////////////////////////////////////
// Implementacion
/////////////////////////////////////////////////////////////////////////////////////
// Constructor
TrxResEXTRACT::TrxResEXTRACT()
{
// Apertura del archivo de logging
glLogg.Open(_LOGFILENAME_);
}
/////////////////////////////////////////////////////////////////////////////////////
// Constructor opcional con parametros para el back-end
TrxResEXTRACT::TrxResEXTRACT(char szIPBackEnd[], unsigned short usPortBackEnd)
{
// Apertura del archivo de logging
glLogg.Open(_LOGFILENAME_);
}
// Destructor
TrxResEXTRACT::~TrxResEXTRACT()
{
// Cierre del archivo de logging
glLogg.Close();
}
// Transacciones individualizadas, que luego, se procesan genericamente
WORD TrxResEXTRACT::ProcessBalanceInquiry(WORD wCause,boolean_t bIsRvsl) // Consulta de saldos
{
// Metodo generico de procesamiento de transaccion
return ProcessGeneric();
}
WORD TrxResEXTRACT::ProcessTransfer(WORD wCause,boolean_t bIsRvsl) // Transferencia Ctas. relacionadas
{
// Metodo generico de procesamiento de transaccion
return ProcessGeneric();
}
WORD TrxResEXTRACT::ProcessTransferInterbank(WORD wCause,boolean_t bIsRvsl) // Transferencia Interbancaria
{
// Metodo generico de procesamiento de transaccion
return ProcessGeneric();
}
WORD TrxResEXTRACT::ProcessIndividualTransfer(WORD wCause,boolean_t bIsRvsl)// Transferencia CBU de individuo
{
// Respuesta default
WORD wRespCde = CISO_EXTERNAL_DECLINE_I;
// Precondicion = Descomponer mensaje ISO-8583 en campos estructurados
wRespCde = ProcessInit();
// Denegada, no se procesa, segun sea ON/OFF, sera 91 o 06
wRespCde = ( isoMsg.IsFinancialAdvice() || isoMsg.IsValidReversal() )
? CISO_SYSTEM_FAILURE_I
: CISO_DESTINY_NOT_AVAILABLE_I;
///////////////////////////////////////////////////////////////////////////
// Verificar transaccion XFER POR CBU
if( isoMsg.IsATMTransferCBU() )
{
glLogg.Put("############# PARSEO DE TRX EXTRACT-ATM-POS #############\n");
glLogg.Put("Transferencia por CBU, se procesa BATCH, resultado:<%i>\n", wRespCde );
///////////////////////////////////////////////////////////////////////
// Formatear campo ISO #44, RESP_DATA, saldo y disponible
FormatField44_RESP_DATA( NULL, NULL );
// Formatear campo ISO #122, SECNDRY_RSRVD3_PRVT
FormatField122_SECNDRY_RSRVD3_PRVT();
// Formatear campo ISO #123, SECNDRY_RSRVD4_PRVT, "DEPOSIT AMMOUNT"
FormatField123_SECNDRY_RSRVD4_PRVT();
// Borrar campos no validos en la rta. : 43,48,52,63
isoMsg.DeleteField ( 43 );
isoMsg.DeleteField ( 48 );
isoMsg.DeleteField ( 52 );
isoMsg.DeleteField ( 63 );
// Borrar campo 120, OPCIONALMENTE PODRIAN NO VENIR EN UN REQUERIMIENTO
isoMsg.DeleteField ( 120 );
glLogg.Put("### Fin ###\n");
// Denegada, no se procesa, segun sea ON/OFF, sera 91 o 06
return (wRespCde);
///////////////////////////////////////////////////////////////////////
}
else
// Metodo generico de procesamiento de transaccion
return ProcessGeneric();
}
WORD TrxResEXTRACT::ProcessWithdrawal(WORD wCause,boolean_t bIsRvsl) // Extraccion
{
// Metodo generico de procesamiento de transaccion
return ProcessGeneric();
}
WORD TrxResEXTRACT::ProcessDeposit(WORD wCause,boolean_t bIsRvsl) // Deposito
{
// Metodo generico de procesamiento de transaccion
return ProcessGeneric();
}
WORD TrxResEXTRACT::ProcessFastCash(WORD wCause,boolean_t bIsRvsl) // FastCash o compra
{
// Metodo generico de procesamiento de transaccion
return ProcessGeneric();
}
WORD TrxResEXTRACT::ProcessAccountVerification(WORD wCause,boolean_t bIsRvsl) // Verificacion cuenta destino
{
// Metodo generico de procesamiento de transaccion
return ProcessGeneric();
}
WORD TrxResEXTRACT::ProcessPayment(WORD wCause,boolean_t bIsRvsl) // Pagos
{
// Metodo generico de procesamiento de transaccion
return ProcessGeneric();
}
WORD TrxResEXTRACT::ProcessBuying(WORD wCause,boolean_t bIsRvsl) // Compras y relacionados
{
// Respuesta default
WORD wRespCde = CISO_EXTERNAL_DECLINE_I;
////////////////////////////////////////////////////////////
// Devoluciones y Anulaciones, son procesadas ?
boolean_t bProcessBuyingReturn = is_true ;
////////////////////////////////////////////////////////////
// Precondicion = Descomponer mensaje ISO-8583 en campos estructurados
wRespCde = ProcessInit();
// Denegada, no se procesa, segun sea ON/OFF, sera 91 o 06
wRespCde = ( isoMsg.IsFinancialAdvice() || isoMsg.IsValidReversal() )
? CISO_SYSTEM_FAILURE_I
: CISO_DESTINY_NOT_AVAILABLE_I;
// Verificar transaccion DEVOLUCION DE COMPRA/ANULACION DEV.COMPRA/PREAUTORIZACION/...
if( bProcessBuyingReturn &&
(antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==B24_OPCODE_BUYING_DEVOLUTION ||
// Devolucion compra (credito NO se procesa, PERO se registra)
antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==B24_OPCODE_BUYING_DEVOLUTION_CANCEL)
)
{
// Retornar lo que este implementado por omision
return ProcessGeneric();
}
else
if (antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==B24_OPCODE_BUYING_DEVOLUTION ||
// Devolucion compra (credito NO se procesa)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -