📄 cobistrx.cpp
字号:
itoa(cMonedaCOBIS,szCurrency,10),
szYYYYMMDD ,
szYYYYMMDD_Trx ,
szHHMMSS ,
szHHMMSS_Trx ,
szOnline ,
itoa(cProductoCOBIS,szProduct,10),
szYYYYMMDD_Cap ,
szNetwork ,
szGirar ,
szContable ,
szAcumEfec ,
szAcumExtra );
// Codigo de retorno de la ejecucion del SP
iReturn = prpcDB->GetStatus();
#else
iReturn = CISO_EXTERNAL_DECLINE_I;
#endif // #ifdef _RPCDB_CONNECTION_
}
else
iReturn = CISO_EXTERNAL_DECLINE_I;
// Formatear Codigo de Rta ISO8538 en base a COBIS
wRespCde = iReturn;
if(0 == wRespCde && !bExecStatus_ok) wRespCde = CISO_EXTERNAL_DECLINE_I;
// Formatear saldos a formato ISO-LINK,sin punto decimal ni millar
Format_ISO_Ammount( szContable, 0, szContable, sizeof(isoFields.field4.chAmmount) );
Format_ISO_Ammount( szGirar , 0, szGirar , sizeof(isoFields.field4.chAmmount) );
// Formatear campos 15 y 61 , OPCIONALMENTE PODRIAN NO VENIR EN UN REQUERIMIENTO
FormatFields15_61();
// Formatear campo ISO #44, RESP_DATA, saldo y disponible
if(cCobisProductoCA == cProductoCOBIS)
FormatField44_RESP_DATA( szContable, szGirar );
else
FormatField44_RESP_DATA( szContable, szGirar );
// Formatear campo ISO #54 de rta., stB24_0210_Def_Data
Format_ISO_Ammount( szAcumEfec , 0, szAcumEfec ,
sizeof(isoFields.field54.stB24_0210_Def_Data.chINT_OWE_AUSTRAL));
Format_ISO_Ammount( szAcumExtra, 0, szAcumExtra,
sizeof(isoFields.field54.stB24_0210_Def_Data.chOWE_DOLAR));
FormatField54_B24_0210_Def_Data(
"99", // chWITH_ADV_AVAIL, : contador extracciones o adelantos
szAcumEfec, // chINT_OWE_AUSTRAL,12 : LIBRE DISPONIBILIDAD (CORRALITO)
szGirar, // chCASH_AVAIL,12 : saldo disponible
NULL, // chMIN_PAYMENT,12
NULL, // chPAYMENT_DAT,6
NULL, // chINTEREST_RATE,6
szAcumExtra, // chOWE_DOLAR,10 : ACUMULADOR DE EXTRACCIONES (CORRALITO)
NULL, // chMIN_PAYMENT_DOLAR,10
NULL, // chPURCHASE_DOLAR,10
NULL ); // chCASH_FEE,8 : arancel de usuario
// Formatear campo ISO #122, SECNDRY_RSRVD3_PRVT
FormatField122_SECNDRY_RSRVD3_PRVT();
// Formatear campo ISO #123, SECNDRY_RSRVD4_PRVT, "DEPOSIT AMMOUNT"
FormatField123_SECNDRY_RSRVD4_PRVT();
// Formatear campo ISO #125, SECNDRY_RSRVD6_PRVT, "ACCOUNT INDICATOR"
FormatField125_SECNDRY_RSRVD6_PRVT( '1' );
// Formatear campo ISO #127, SECNDRY_RSRVD8_PRVT
FormatField127_SECNDRY_RSRVD8_PRVT();
////////////////////////////////////////////////////
// Borrar campos no validos en la rta. : 43,48,52,63
isoMsg.DeleteField ( 43 );
isoMsg.DeleteField ( 48 );
isoMsg.DeleteField ( 52 );
isoMsg.DeleteField ( 63 );
////////////////////////////////////////////////////
// Retornar cod.rta.
return TranslateRespCode_COBIS_ISO_B24( wRespCde ) ;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Procesamiento de transacciones de transferencia interbancarias
WORD TrxResCOBIS::ProcessTransferInterbank(WORD wCause,boolean_t bIsReversal) // Transferencia interbancaria
{
long wRespCde = ProcessInit();
// Verificar que las cuentas informadas en el campo adicional, se agreguen a los campos
// destinados por la norma ISO a soportar cuentas. Esto se hace para homogeneizar la interface
// con otras transacciones.
if( !isoMsg.IsValidField(102) )
ASSIGNFIELD(isoFields.field102.chNum,
isoFields.field55.stInterbancarias.stFrom_Acct.chAcct_num);
if( !isoMsg.IsValidField(103) )
ASSIGNFIELD(isoFields.field103.chNum,
isoFields.field55.stInterbancarias.stTo_Acct.chAcct_num);
// Ejecutar una ORDEN o NOTA DE DEBITO o CREDITO con distinto causal segun la TRANSFERENCIA
if ( antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==9) // DEBITO EN CUENTA
return ProcessDebitCredit_Note('D',cCobisDebito_Gral, 0, bIsReversal, is_true );
else if ( antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==19) // ORDEN DE DEBITO
return ProcessDebitCredit_Note('D',cCobisDebito_Gral, 0, bIsReversal, is_true );
else if ( antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==29) // ORDEN DE CREDITO
return ProcessDebitCredit_Note('H',cCobisCredito_Gral, 0, bIsReversal, is_true );
else if ( antoi(isoFields.field3.uProcCde.stTranCde.chTran_Cde,2)==39) // VERIFICACION DE CUENTA
return ProcessAccountVerification( 0, bIsReversal );
else
return CISO_EXTERNAL_DECLINE_I; // Otro codigo es error del sistema, atencion.
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Procesamiento de transacciones en particular
WORD TrxResCOBIS::ProcessTransfer(WORD wCause,boolean_t bIsReversal) // Transferencia
{
long wRespCde = ProcessInit();
CHAR szGirar[32] = {"000000000000.0000"},
szContable[32] = {"000000000000.0000"};
INT iReturn = 0;
/////////////////////////////////////////////////////////////////////////////////////////////
CONST stTranCodeSP tblTranCodeSP_ARG_ARG = {'S' , "sp_li_trans",4198, 102, 198, 102,
3698, 602, 698, 602 };
CONST stTranCodeSP tblTranCodeSP_ARG_USD = {'S' , "sp_li_trans",4200, 104, 200, 104,
3700, 604, 700, 604 };
CONST stTranCodeSP tblTranCodeSP_USD_ARG = {'S' , "sp_li_trans",4199, 103, 199, 103,
3699, 603, 699, 603 };
CONST stTranCodeSP tblTranCodeSP_USD_USD = {'S' , "sp_li_trans",4201, 105, 201, 105,
3701, 605, 701, 605 };
/////////////////////////////////////////////////////////////////////////////////////////////
CHAR szYYYYMMDD[] = _TIMESTAMP_MASK_, // Xmit-date
szHHMMSS[] = _TIMESTAMP_MASK_, // Xmit-time
szYYYYMMDD_Trx[] = _TIMESTAMP_MASK_, // Trx-date
szHHMMSS_Trx[] = _TIMESTAMP_MASK_; // Trx-time
CHAR szYYYYMMDD_Cap[] = _TIMESTAMP_MASK_; // Cap-date
CHAR szAccount1[sizeof(isoFields.field102.chNum)+1]={"00000000000000000000"},
szAccount2[sizeof(isoFields.field103.chNum)+1]={"00000000000000000000"};
CHAR chOnlineMode = (boolOnlineMode == is_true) ? 'S' : 'N';
enumCOBIS cProductoCOBIS1 = cCobisProductoCA, // Producto default CA, donde CA=4,CC=3.
cProductoCOBIS2 = cCobisProductoCA;
enumCOBIS cMonedaCOBIS1 = cCobisMonedaPesos, // Moneda Pesos por default
cMonedaCOBIS2 = cCobisMonedaPesos;
enumCOBIS cOperacionCOBIS1 = cCobisDebito_Gral, // Operacion debito-credito
cOperacionCOBIS2 = cCobisCredito_Gral;
CHAR szAmmount[sizeof(isoFields.field4.chAmmount)+1]={"000000000.00"},
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"},
szProduct1[4]={"0"},
szProduct2[4]={"0"},
szOnline[4]={"S"},
szOperacionCobis1[8]={"0"},
szOperacionCobis2[8]={"0"},
szCurrency1[4]={"0"},
szCurrency2[4]={"0"},
szCause1[8]={"0"},
szCause2[8]={"0"},
szNetwork[8]={"0000"};
CHAR szExchangeRate[16] = {"1.00"}, /* default 1$=1us$*/
szTrxCurrency[4] = {"032"}; /* default 32=PESOS ARGENTINOS */
CHAR szAcumEfec[sizeof(isoFields.field4.chAmmount)+1]={"0"},
szAcumExtra[sizeof(isoFields.field4.chAmmount)+1]={"0"};
// Verificar que si el reverso es "?REVERSAL FOR LATE/UNSOL RESP?" no se procese
// porque ya fue reversada por TIMEOUT por el switch financiero
if(VerifyReversalForLateResponse( bIsReversal ))
return CISO_APPROVED_VIP_I; // Aprobada sin saldo disponible, no impactar el reverso
// Fecha de Trx especialmente formateada
FormatTrxDateTime(szYYYYMMDD, szHHMMSS, szYYYYMMDD_Trx, szHHMMSS_Trx, szYYYYMMDD_Cap);
ASSIGNSTRING(szAccount1, isoFields.field102.chNum); // Cuenta Desde
ASSIGNSTRING(szAccount2, isoFields.field103.chNum); // Cuenta Hacia
/////////////////////////////////////////////////////////////////////
// Si es una reversa, el CREDITO se convierte en DEBITO y viceversa
/////////////////////////////////////////////////////////////////////
if(bIsReversal)
{
if(cCobisDebitoCA == cOperacionCOBIS1) cOperacionCOBIS1 = cCobisCreditoCA;
else if(cCobisCreditoCA == cOperacionCOBIS1) cOperacionCOBIS1 = cCobisDebitoCA;
else if(cCobisDebitoCC == cOperacionCOBIS1) cOperacionCOBIS1 = cCobisCreditoCC;
else if(cCobisCreditoCC == cOperacionCOBIS1) cOperacionCOBIS1 = cCobisDebitoCC;
else if(cCobisDebito_Gral == cOperacionCOBIS1) cOperacionCOBIS1 = cCobisCredito_Gral;
else if(cCobisCredito_Gral == cOperacionCOBIS1) cOperacionCOBIS1 = cCobisDebito_Gral;
else return CISO_EXTERNAL_DECLINE_I;
};
/////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//Asignar producto y operacion COBIS
if(!AssignCOBISProductFromAccType(&cProductoCOBIS1,'D'))
return CISO_INVALID_TRANSACTION_I;
if(!AssignCOBISProductFromAccType(&cProductoCOBIS2,'H'))
return CISO_INVALID_TRANSACTION_I;
////////////////////////////////////////////////////////////////////////////////////////
if( cCobisProductoCA == cProductoCOBIS1)
{
if (cCobisDebito_Gral == cOperacionCOBIS1)
cOperacionCOBIS1 = cCobisDebitoCA;// Debito CA=264
else
cOperacionCOBIS1 = cCobisCreditoCA;// Credito CA=253
}
else // if( cProductoCC == cProductoCOBIS1)
{
if (cCobisDebito_Gral == cOperacionCOBIS1)
cOperacionCOBIS1 = cCobisDebitoCC; // Debito CC=50
else
cOperacionCOBIS1 = cCobisCreditoCC;// Credito CC=48
};
////////////////////////////////////////////////////////////////////////////////////////
if( cCobisProductoCA == cProductoCOBIS2)
{
if (cCobisDebito_Gral == cOperacionCOBIS2)
cOperacionCOBIS2 = cCobisDebitoCA;// Debito CA=264
else
cOperacionCOBIS2 = cCobisCreditoCA;// Credito CA=253
}
else // if( cProductoCC == cProductoCOBIS2)
{
if (cCobisDebito_Gral == cOperacionCOBIS2)
cOperacionCOBIS2 = cCobisDebitoCC; // Debito CC=50
else
cOperacionCOBIS2 = cCobisCreditoCC;// Credito CC=48
};
////////////////////////////////////////////////////////////////////////////////////////
// Ejecutar STORED PROCEDURE
if(_RPC_DB_ == dbctType && prpcDB != NULL)
{
// Copiar string cuenta
COPYSTRING(szCard, ExtractCardnumFromTrack2( &isoFields.field35 ) );
CHECKPARAMETER(szCard);
ASSIGNSTRING(szAccount1, isoFields.field102.chNum);
CHECKPARAMETER(szAccount1);
ASSIGNSTRING(szAccount2, isoFields.field103.chNum);
CHECKPARAMETER(szAccount2);
// Formato del monto desde ISO hacia uso interno propio, con decimales
// y con tipo de cambio aplicado si correspondiera
Format_ISO_Ammount( isoFields.field4.chAmmount, 2, szAmmount, sizeof(szAmmount),
is_true, szExchangeRate );
CHECKPARAMETER(szAmmount);
// Moneda de la operacion es la moneda del debito en cuenta ORIGEN
AssignCOBISCurrencyFromAccType( &cMonedaCOBIS1, 'D' );
// Moneda de la operacion es la moneda del credito en cuenta DESTINO
AssignCOBISCurrencyFromAccType( &cMonedaCOBIS2, 'H' );
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);
// Online ?
if('S' == chOnlineMode) strcpy(szOnline,"S");
else strcpy(szOnline,"N");
/////////////////////////////////////////////////////////////////////////////////////
// Causales segun monedas distinta de cuentas involucradas
// Causal 1-DEBITO?
// Se informa CUENTA ORIGEN y operacion DEBITO
AssignCOBISCauseFromCurrency( chOnlineMode, szCause1,
cMonedaCOBIS1, cOperacionCOBIS1, cProductoCOBIS1,
tblTranCodeSP_ARG_ARG,
tblTranCodeSP_USD_ARG,
tblTranCodeSP_ARG_USD,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -