📄 cobistrx.cpp
字号:
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// IT24 Sistemas S.A.
// Process COBIS Transaction Method
//
// Metodo de Procesamiento de Transaccion ATM - COBIS, 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) 2002.02.20 mdc Inicial
// (Inicial) 2002.02.21 mdc Inicial
// (Alfa) 2002.04.16 mdc ::AssignCOBISCurrencyFromAccType(enumCOBIS *pcMonedaCOBIS, char chDesdeHacia);
// (Alfa) 2002.04.17 mdc ::AssignCOBISCauseFromCurrency(char chOnlineMode, char *szCause, ...)
// (Alfa) 2002.05.13 mdc LIBRE DISPONIBILIDAD (CORRALITO)
// (Alfa) 2002.06.20 mdc Causales segun monedas distinta de cuentas involucradas
// (Alfa) 2002.07.25 mdc Ante reversos que no impactaron, se mandan a SAF-Queue con codigo "96"
// (Alfa) 2002.09.04 mdc Ante "DEAD LOCKS", se mandan a SAF-Queue con codigo "96", y se reintenta
// (Alfa) 2002.09.04 mdc Ante "Usuario, rol u horario incorrectos", enviar a SAF local y reintentar
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////
#if defined(_SYSTEM_ATM_COBIS_)
// Headers ANSI C/C++
#include <limits.h>
#include <stdio.h>
#include <stdlib.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>
// Header ISO Msg Redefinition
#include <qusrinc/isoredef.h>
// COBIS Transaction Resolution
#include <qusrinc/cobisdb.h>
#include <qusrinc/stdiol.h>
#ifdef _SYSTEM_ATM_DEFINED_
#undef _SYSTEM_ATM_
#endif // _SYSTEM_ATM_DEFINED_
///////////////////////////////////////////////////////////////////////////
// Funcion utilitaria externa de conversion de string a binario hasta N
// caracteres ASCII numericos
extern "C" int antoi(char *, int);
///////////////////////////////////////////////////////////////////////////
// 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
#define ASSIGNFIELD(dst,src) \
{ memset(dst,' ',sizeof(dst)); memcpy(dst,src,min(sizeof(src),sizeof(dst))); };
// Macro de asignacion de causal segun sea OFF y ONLINE
#define ISONOFFLINECAUSE(on,off) (boolOnlineMode == is_true) ? on : off
// Mascara de inicializacion de time-stamp
#define _TIMESTAMP_MASK_ "MM/DD/YYYY HH:MM:SS"
// Macro de chequeo de parametro presente
#define CHECKPARAMETER(x) if((x) && strlen(x)==0) return CISO_INVALID_FORMAT_I;
// Macro de reemplazo BNL por FIID 0265
#define CHECKBNLFIID(x) if(strcmp(x,"BNL ")==0) COPYSTRING(szFIID, "0265");
////////////////////////////////////////////////////////
// Constructor default
////////////////////////////////////////////////////////
EXPORT TrxResCOBIS::TrxResCOBIS()
{
// Conexion a base de datos via RPC, Sybase-COBIS
dbctType = _RPC_DB_ ;
#ifdef _RPCDB_CONNECTION_
prpcDB = NULL;
#endif // _RPCDB_CONNECTION_
}
////////////////////////////////////////////////////////
// Constructor opcional
////////////////////////////////////////////////////////
EXPORT TrxResCOBIS::TrxResCOBIS(PVOID prpcXDB)
{
// Conexion a base de datos via RPC, Sybase-COBIS
dbctType = _RPC_DB_ ;
#ifdef _RPCDB_CONNECTION_
prpcDB = (cobisdb *)prpcXDB;
#endif // _RPCDB_CONNECTION_
// Mapeo de Codigos COBIS a Codigos ISO8583
// Ver la documentacion de codigos ISO8583 para detalles, o el archivo iso8583.h
rtRespCdeCnv.Insert( 0, CISO_APPROVED ); // 00 Aprobada con saldo disponible
rtRespCdeCnv.Insert( 0, CISO_APPROVED_VIP_I ); // 01 Aprobada sin saldo disponible para Movimiento
//rtRespCdeCnv.Insert( -1, CISO_SYSTEM_FAILURE ); // 96 MISSING OBJECT, reintentar (Ej.Usuario, rol u horario incorrectos)
rtRespCdeCnv.Insert( -3, CISO_SYSTEM_FAILURE ); // 96 DEAD LOCK, reintentar, error interno SYBASE
rtRespCdeCnv.Insert( 351076, CISO_SYSTEM_FAILURE ); // 96 Reverso ya reversado o no existe transa original
rtRespCdeCnv.Insert( 351074, CISO_INVALID_TRANSACTION); // 12 TRX invalida, no soportada
rtRespCdeCnv.Insert( 351075, CISO_INVALID_TRANSACTION); // 12 TRX invalida, no soportada
rtRespCdeCnv.Insert( 351012, CISO_INVALID_ACCOUNT); // 76 Cuenta invalida por:1. El proceso autorizador ...
rtRespCdeCnv.Insert( 251001, CISO_INVALID_ACCOUNT); // 76 ...
rtRespCdeCnv.Insert( 351073, CISO_INVALID_ACCOUNT); // 76 ...
rtRespCdeCnv.Insert( 201196, CISO_INVALID_ACCOUNT); // 76 ...
rtRespCdeCnv.Insert( 353019, CISO_INVALID_ACCOUNT); // 76 ...
rtRespCdeCnv.Insert( 351019, CISO_INVALID_ACCOUNT); // 76 ...
rtRespCdeCnv.Insert( 201030, CISO_INVALID_ACCOUNT); // 76 ...
rtRespCdeCnv.Insert( 251025, CISO_INVALID_ACCOUNT); // 76
rtRespCdeCnv.Insert( 201005, CISO_NO_ACCOUNT_AVAILABLE); // 39
rtRespCdeCnv.Insert( 201008, CISO_NO_ACCOUNT_AVAILABLE); // 39
rtRespCdeCnv.Insert( 251058, CISO_NO_ACCOUNT_AVAILABLE); // 39
rtRespCdeCnv.Insert( 351012, CISO_NO_CHECKINGS_ACCOUNT); // 52
rtRespCdeCnv.Insert( 201004, CISO_NO_CHECKINGS_ACCOUNT); // 52
rtRespCdeCnv.Insert( 251057, CISO_NO_SAVINGS_ACCOUNT); // 56 Cuenta invalida por:1. El proceso autorizador
rtRespCdeCnv.Insert( 258012, CISO_INSUFFICIENT_FOUNDS); // 58 Fondos insuficientes, iguales a cero.
rtRespCdeCnv.Insert( 251033, CISO_INSUFFICIENT_FOUNDS); // 58 Fondos insuficientes, iguales a cero.
rtRespCdeCnv.Insert( 201017, CISO_INSUFFICIENT_FOUNDS); //DLH 58 Fondos insuficientes, iguales a cero.
rtRespCdeCnv.Insert( 258011, CISO_AMMOUNT_LIMIT_EXC); // 60 No son permitidas mas extracciones.
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Procesamiento de transacciones en particular
WORD TrxResCOBIS::ProcessBalanceInquiry(WORD wCause,boolean_t bIsReversal) // Consulta de saldos
{
long wRespCde = ProcessInit();
CHAR szGirar[32] = {"000000000000.0000"},
szContable[32] = {"000000000000.0000"};
INT iReturn = 0;
////////////////////////////////////////////////////////////////
CONST stTranCodeSP tblTranCodeSP[] =
{ 'S' , "sp_li_calcula_saldo" , 0, 0, 0, 0 , 0, 0, 0, 0,
'S' , "sp_li_ahcalcula_saldo" , 0, 0, 0, 0 , 0, 0, 0, 0,
};
////////////////////////////////////////////////////////////////
CHAR szYYYYMMDD[] = _TIMESTAMP_MASK_, // Xmit-date
szHHMMSS[] = _TIMESTAMP_MASK_, // Xmit-time
szYYYYMMDD_Trx[] = _TIMESTAMP_MASK_, // Trx-date
szHHMMSS_Trx[] = _TIMESTAMP_MASK_, // Trx-time
szYYYYMMDD_Cap[] = _TIMESTAMP_MASK_; // Cap-date
CHAR chOnlineMode = (boolOnlineMode == is_true) ? 'S' : 'N';
enumCOBIS cProductoCOBIS = cCobisProductoCA; // Producto default es CA
enumCOBIS cOperacionCOBIS = cCobisDebitoCA; // Operacion default es debito C.A.
enumCOBIS cMonedaCOBIS = cCobisMonedaPesos;
CHAR szAccount[sizeof(isoFields.field102.chNum)+1]={"0"},
szAmmount[sizeof(isoFields.field4.chAmmount)+1]={"0"},
szReceipt[sizeof(isoFields.field37.chNum)+1]={"0"},
szFIID[sizeof(isoFields.field60.stATMTerm.chTermFIID)+1]={"0"},
szATM[sizeof(isoFields.field41.chData)+1]={"0"},
szCard[sizeof(isoFields.field35.stTrack2.chData)+1]={"0"},
szProduct[4]={"0"},
szOnline[4]={"0"},
szOperacionCobis[8]={"0"},
szCurrency[4]={"0"},
szCause[8]={"0"},
szNetwork[8]={"0000"};
CHAR szAcumEfec[sizeof(isoFields.field4.chAmmount)+1]={"0"},
szAcumExtra[sizeof(isoFields.field4.chAmmount)+1]={"0"};
// Fecha de Trx especialmente formateada
FormatTrxDateTime(szYYYYMMDD, szHHMMSS, szYYYYMMDD_Trx, szHHMMSS_Trx, szYYYYMMDD_Cap);
// Ejecutar consulta parametrica por TRAN_CODE
if(!AssignCOBISProductFromAccType(&cProductoCOBIS))
{
// Verificar si es una INTERBANCARIA, y en caso positivo, VERIFICAR CUENTA DESTINO
if( !isoMsg.IsValidField( 55 ) )
return CISO_INVALID_TRANSACTION_I;
int iAccType = antoi(isoFields.field55.stInterbancarias.stTo_Acct.chTyp,2) ;
// En funcion del tipo de cuenta, establecer el producto COBIS asignado
if( _B24_SAVINGS_ACCOUNT_ == iAccType ||
_B24_SAVINGS_ACCOUNT_USD_ == iAccType ||
_B24_SAVINGS_ACCOUNT_BOND_ == iAccType )
cProductoCOBIS = cCobisProductoCA ; // Producto CA=4,CC=3;
else if(_B24_CHECKINGS_ACCOUNT_ == iAccType ||
_B24_CHECKINGS_ACCOUNT_USD_ == iAccType ||
_B24_CHECKINGS_ACCOUNT_BOND_ == iAccType )
cProductoCOBIS = cCobisProductoCC ; // Producto CA=4,CC=3;
else
{
////////////////////////////////////////////////////
// Borrar campos no validos en la rta. : 43,48,52,63
isoMsg.DeleteField ( 43 );
isoMsg.DeleteField ( 48 );
isoMsg.DeleteField ( 52 );
isoMsg.DeleteField ( 63 );
////////////////////////////////////////////////////
// ERROR, TIPO DE TRX INVALIDA, TIPO DE CTA. NO VALIDO
return CISO_INVALID_TRANSACTION_I;
}
}
// Ejecutar STORED PROCEDURE
if(_RPC_DB_ == dbctType && prpcDB != NULL)
{
// Copiar string cuenta
ASSIGNSTRING(szAccount, isoFields.field102.chNum);
CHECKPARAMETER(szAccount);
COPYSTRING(szCard, ExtractCardnumFromTrack2( &isoFields.field35 ));
CHECKPARAMETER(szCard);
ASSIGNSTRING(szReceipt, isoFields.field37.chNum);
CHECKPARAMETER(szReceipt);
ASSIGNSTRING(szFIID , isoFields.field60.stATMTerm.chTermFIID);
CHECKPARAMETER(szFIID);
CHECKBNLFIID(szFIID); // Es id "BNL" ? Usar el id de LINK, numerico
ASSIGNSTRING(szATM , isoFields.field41.chData);
CHECKPARAMETER(szATM);
ASSIGNSTRING(szNetwork , isoFields.field60.stATMTerm.chTermLNet); // LNET de la TERMINAL
CHECKPARAMETER(szNetwork);
// Moneda de la operacion es la moneda del debito en cuenta ORIGEN
AssignCOBISCurrencyFromAccType( &cMonedaCOBIS );
if('S' == chOnlineMode)
{
strcpy(szOnline,"S");
itoa( tblTranCodeSP[0].shOnCause1, szCause,10);
}
else
{
strcpy(szOnline,"N");
itoa( tblTranCodeSP[0].shOffCause1, szCause,10);
};
// Causal parametrico?
if(0 != wCause) itoa( wCause, szCause, 10 );
#ifdef _RPCDB_CONNECTION_
// Segun el tipo de cuenta, invocar un SP u otro SP (CA y CC)
if(cCobisProductoCA == cProductoCOBIS)
bExecStatus_ok = prpcDB->SavingsAccountInquiry(szAccount,
szCard ,
szReceipt ,
szFIID ,
szATM ,
TranslateTranCode_ISO_B24(isoFields.field3.uProcCde.chData),
itoa(cOperacionCOBIS,szOperacionCobis,10),
itoa(cMonedaCOBIS,szCurrency,10),
szYYYYMMDD ,
szYYYYMMDD_Trx ,
szHHMMSS ,
szHHMMSS_Trx ,
szOnline ,
itoa(cProductoCOBIS,szProduct,10),
szYYYYMMDD_Cap ,
szNetwork ,
szGirar ,
szContable ,
szAcumEfec ,
szAcumExtra );
else
bExecStatus_ok = prpcDB->CheckingsAccountInquiry(szAccount,
szCard ,
szReceipt ,
szFIID ,
szATM ,
TranslateTranCode_ISO_B24(isoFields.field3.uProcCde.chData),
itoa(cOperacionCOBIS,szOperacionCobis,10),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -