Exemplo n.º 1
0
/*
+-----------------+------------------------------------------------------------+
| FUNCION         | PriceOnLine::Armar_y_Enviar_Respuesta                      |
+-----------------+------------------------------------------------------------+
| DESCRIPCION     | Arma un mensaje de respuesta local en funcion del mensaje  |
|                 | recibido y datos calculados y lo envia al TPV              | 
+-----------------+------------------------------------------------------------+
*/
int PriceOnLine::Armar_y_Enviar_Respuesta(char *szCodRta, struct trxRtaTPV *stRta)
{
	Price_Msg		*priceRta;
	char			szCampo13[LON_CAMPO_13 + 1];
	char			szMsgStr[2000];
	int				iLen;
	int				iRet = 0;
	char			szCpoTerVer[25+1];

	/* Arma mensaje de respuesta de rechazo hacia el TPV por configuracion erronea */
	priceRta=new Price_Msg(TYPE_PRICE_VENTA_RTA);
	
	/* Completa campos de la respuesta */
	priceRta->PutField( 1, mensaje_price->GetField( 1));
	priceRta->PutField( 2, mensaje_price->GetField(15));
	priceRta->PutField( 3, mensaje_price->GetField(16));
	priceRta->PutField( 4, mensaje_price->GetField(11));
	priceRta->PutField( 7, mensaje_price->GetField( 4));
	priceRta->PutField( 8, mensaje_price->GetField( 5));
	priceRta->PutField( 9, stRta->szCodAut);
	priceRta->PutField(10, "");
	priceRta->PutField(11, stRta->szComerc);
	priceRta->PutField(15, mensaje_price->GetCodTar());
	priceRta->PutField(16, "000000000000");
	sprintf(szCampo13, "%03d%1s%8s%s%s ", atoi(stRta->szNroLot), FLAG_OFFLINE, PINPAD_NULO, stRta->szRespCA, stRta->szPlanSF); 
	priceRta->PutField(13, szCampo13);
	priceRta->PutField( 6, szCodRta); 

	/* Devuelve nro de terminal y version */
	sprintf(szCpoTerVer, FTO_VER, stRta->szTermin, stRta->szProtoc, stRta->szPlnIso, 
								  NO_ANUL, VERSION_NRO, stRta->szTicOri, stRta->szFecOri );
	priceRta->PutField(12, szCpoTerVer);

	/* Aplana el mensaje */
	iLen = priceRta->GetMsgString(szMsgStr);

	/* Borra el mensaje price */
	delete priceRta;

	/* Envia respuesta al TPV */
	iRet = SQueue.SendMsg(orig_pid, szMsgStr, iLen);
	if (iRet != OK)
	{
		LogAlarm.Put(0, "PriceOn: ERROR (%d) al enviar respuesta\n", SQueue.GetErrno());
	}	
	else
	{
		LogAlarm.Put(0, "PriceOn: RESPUESTA LOCAL: %s\n", szCodRta);
	}
	return (iRet);
}
Exemplo n.º 2
0
/*
+-----------------+------------------------------------------------------------+
| FUNCION         | EchoTest::ProcessIt                                        |
+-----------------+------------------------------------------------------------+
| DESCRIPCION     | Proceso del objeto                                         |
|                 |                                                            | 
+-----------------+------------------------------------------------------------+
*/
int EchoTest::ProcessIt()
{
	char	msg_str[2000];
	int		len;
	int		ret;
	int		HeapOcup = 0;
	int		TOQueueOcup = 0;
	char	aux_str1[100];	
	char	idHeap[20];
	str_sel_cadata	term_data;
	int     iCantidad;

	/* Arma los datos de la terminal */
	memset(&term_data, 0, sizeof(term_data));
	strncpy(term_data.nro_suc, ping_data.nro_suc, sizeof(term_data.nro_suc));
	strncpy(term_data.nro_caj, ping_data.nro_caj, sizeof(term_data.nro_caj));
	strncpy(term_data.nro_ca , ping_data.nro_ca , sizeof(term_data.nro_ca ));
	LogAlarm.Put(0, "EchoTest: Suc:[%s] Caj:[%s] CA:[%s]\n", term_data.nro_suc, term_data.nro_caj, term_data.nro_ca);

	/* Obtiene datos de la terminal */
	ret=getDataByNTET(&term_data);
	if (ret!=OK)
	{
		LogAlarm.Put( 1, "EchoTest: ERROR (%d) al obtener datos de la terminal\n", ret);
		EnviarMsg(orig_pid, "ERROR", 5);
		return NOOK;
	}

	/* Se carga en el objeto TraceNmbr el centro autorizador con el que se trabaja */
	TraceNumber.SetNroSuc(term_data.nro_suc);
	TraceNumber.SetNroCaj(term_data.nro_caj);
	TraceNumber.SetNroCA (term_data.nro_ca );
	TraceNumber.SetCodConCie("0");

	/* Arma mensaje iso */
	mensaje_iso->PutField(7, currentTimestamp());
	strcpy(aux_str1, TraceNumber);
	TraceNumber.Inc();
	mensaje_iso->PutField(11, aux_str1); 
	mensaje_iso->PutField(24, term_data.cod_red);
	mensaje_iso->PutField(41, term_data.nro_caj_ca);
	mensaje_iso->PutField(42, term_data.nro_com_et);

	/* Arma clave del heap */
	sprintf(idHeap,"%02d",atoi(term_data.nro_ca));

	/* Verifica si se encuentra en el heap */
	LogAlarm.Put(0, "EchoTest: Busca clave en el heap [%s]\n", idHeap);
	ret=Heap.FindData(idHeap, (char *)&orig_pid,sizeof(orig_pid));
	if (ret!=1)
	{
		LogAlarm.Put(0, "EchoTest: Heap ocupado. Clave:[%s]\n", idHeap);
		HeapOcup = 1;
	}
	LogAlarm.Put(0, "EchoTest: Valor de HeapOcup %d\n", HeapOcup);

	/* Verifica si se encuentra en la TOQ */
	ret=timeout_queue.FindTimeOut(idHeap);
	if (ret==1)
	{
		LogAlarm.Put(0, "EchoTest: Se encontro en TOQueue. Clave:[%s]\n", idHeap);
		TOQueueOcup = 1;
	}
	LogAlarm.Put(0, "EchoTest: Valor de TOQueueOcup %d\n", TOQueueOcup);

	/* Si el ping esta activo */
	if ((HeapOcup == 1) && (TOQueueOcup == 1))
	{
		/* Envia respuesta por la cola administrativa */
		LogAlarm.Put(0, "EchoTest: Ping Activo. Esta ocupado\n");
		LogAlarm.Put(0, "EchoTest: Envia respuesta por la cola administrativa\n");
		ret= EnviarMsg(orig_pid, "ERROR", 5);
		return NOOK;
	}
	else 
	{
		/* Si el head esta ocupado */
		if (HeapOcup == 1)
		{
			LogAlarm.Put( 0, "EchoTest: Se encuentra en Heap pero no en TOQ\n");
			ret=Heap.GetData(idHeap, (char *)&orig_pid,sizeof(orig_pid));
			if (ret==NOOK)
			{
				LogAlarm.Put( 0, "EchoTest: ERROR (%d) al extraer de heap\n", Heap.GetErrno());
				EnviarMsg(orig_pid, "ERROR", 5);			
				return NOOK;
			}
		}

		/* Si la TOQ esta ocupada */ 
		if (TOQueueOcup == 1) 
		{
			LogAlarm.Put( 0, "EchoTest: Se encuentra en TOQ pero no en Heap\n");
			ret=timeout_queue.RemTimeOut(idHeap);
			if (ret==NOOK)
			{
				LogAlarm.Put(0, "EchoTest: ERROR (%d) al extraer de TOQ\n", timeout_queue.GetErrno());
				EnviarMsg(orig_pid, "ERROR", 5);
				return NOOK;
			}
		}
	}

	/* Registra en el heap */
	LogAlarm.Put(0, "EchoTest: Registra mensaje en el heap.\n");
	ret=Heap.PutData(idHeap, (char *)&orig_pid,sizeof(orig_pid));
	if (ret==NOOK)
	{
		LogAlarm.Put(0, "EchoTest: ERROR (%d) al registrar en el heap\n", Heap.GetErrno());
		EnviarMsg(orig_pid, "ERROR", 5);
		return NOOK;
	}

	/* Registra en la TimeoutQueue	*/
	LogAlarm.Put(0, "EchoTest: Registra mensaje en la TOQ\n");
	Cfg.GetItem("TimeOutDaemon", "MsgTimeOut1", aux_str1);
	ret=timeout_queue.SetTimeOut(idHeap, atoi(aux_str1), GetType(), "");
	if (ret==NOOK)
	{
		LogAlarm.Put(0, "EchoTest: ERROR (%d) al agregar a la TOQ\n", timeout_queue.GetErrno());

		/* Retira del heap si hubo error */
		ret=Heap.GetData(idHeap, (char *)&orig_pid,sizeof(orig_pid));
		if (ret==NOOK)
		{
			LogAlarm.Put( 0, "EchoTest: ERROR (%d) al obtener del heap\n", Heap.GetErrno());
		}
		EnviarMsg(orig_pid, "ERROR", 5);
		return NOOK;
	}

	/* Aplana el mensaje */
	len=mensaje_iso->GetMsgString(msg_str);

	/* Envia por la cola de X.25 */
	LogAlarm.Put(0, "EchoTest: Envia a X.25. CAut [%s]\n", term_data.nro_ca);
	ret=XQueue.SendMsg(atoi(term_data.nro_ca)+1, msg_str, len);
	if (ret!=OK)
	{
		LogAlarm.Put( 0, "EchoTest: ERROR (%d) al enviar por X.25!!\n", XQueue.GetErrno());
		EnviarMsg(orig_pid, "ERROR", 5);
		return NOOK;
	}
	return OK;
}
Exemplo n.º 3
0
/*
+-----------------+------------------------------------------------------------+
| FUNCION         | Batch::ProcessIt                                           |
+-----------------+------------------------------------------------------------+
| DESCRIPCION     | Proceso del objeto                                         |
|                 |                                                            | 
+-----------------+------------------------------------------------------------+
*/
int Batch::ProcessIt()
{
    char			aux_str[100];
    char			msg_str[2000];
    int				msg_len;
    int				ret;
    str_heap_data	heap_data;
    str_sel_ntdata	term_data;
    char			idHeap[20];

    /* Obtiene los datos del mensaje */
    LogAlarm.Put(5, "Batch: Obteniendo datos de la terminal.\n");
    strcpy(term_data.nro_caj_ca, mensaje_iso->GetField(41));
    strcpy(term_data.nro_com   , mensaje_iso->GetField(42));

    /* Obtiene datos de la terminal */
	ret=getDataByCA(&term_data);
	if (ret!=OK)
	{
		LogAlarm.Put( 0, "Batch: ERROR (%d) al obtener datos de la terminal\n", ret);
		return NOOK;
	}

    /* Se indica al objeto TraceNmbr con que centro autorizador se trabaja */
    TraceNumber.SetNroSuc(term_data.nro_suc);
    TraceNumber.SetNroCaj(term_data.nro_caj);
    TraceNumber.SetNroCA (term_data.nro_ca );
    TraceNumber.SetCodConCie(term_data.cod_con_cie);

	/* Setea centro autorizador */
	mensaje_iso->SetNroCA8583(term_data.nro_ca);
	
	/* Obtiene tarjeta y la carga para agregar 'F' final */
	switch (DBTipoProtocoloISO(term_data.nro_ca))
	{
	case PROT_ISO_AMEX:
		sprintf(aux_str, "%s", mensaje_iso->GetField(2));
		mensaje_iso->PutField(2, aux_str);
		break;
	default:
		break;
	}
	
    /* Completar el mensaje con los datos generados	*/
    strcpy(aux_str, TraceNumber);
    TraceNumber.Inc();
    mensaje_iso->PutField(11, aux_str); 

    /* Chequea consistencia del mensaje	*/
    LogAlarm.Put(5, "Batch: Checkeo de consistencia del msg.\n");
    if (!mensaje_iso->ChkReady())
	{
		LogAlarm.Put(0,"Batch: ERROR mensaje ISO incompleto\n");
		return NOOK;
	}

    /* Registra transaccion en TrxHeap	*/
    LogAlarm.Put(5, "Batch: Obteniendo datos para el Heap.\n");
    heap_data.orig_pid=orig_pid;
    LogAlarm.Put(5, "Batch: Poniendo datos en el Heap.\n");
    sprintf(idHeap,"%2.2s%3.3s%5.5s%8.8s", term_data.nro_ca, term_data.nro_suc,
                                           term_data.nro_caj, mensaje_iso->GetField(11));
    ret=Heap.PutData(idHeap,(char *)&heap_data, sizeof(heap_data));
    if (ret==NOOK)
	{
		LogAlarm.Put(5, "Batch: ERROR (%d) al agregar en el Heap\n", Heap.GetErrno());
		return NOOK;
	}

    /* Registra en la TimeoutQueue	*/
    LogAlarm.Put(5, "Batch: Agregando a la TO Queue.\n");
    Cfg.GetItem("TimeOutDaemon", "MsgTimeOut320", aux_str);
    ret=timeout_queue.SetTimeOut(idHeap, atoi(aux_str), GetType(), "");
	if (ret==NOOK)
	{
		LogAlarm.Put(0, "Batch: ERROR (%d) al agregar en TimeOutQueue\n", timeout_queue.GetErrno());
		return NOOK;
	}

	/* Aplana el mensaje */
    msg_len=mensaje_iso->GetMsgString(msg_str);

    /* Envia el mensaje por X25 */
    LogAlarm.Put(0, "Batch: Envia a X.25. CAut [%s]\n", term_data.nro_ca);
	ret=XQueue.SendMsg(atoi(term_data.nro_ca)+1, msg_str, msg_len);
    if (ret==NOOK)
	{
		LogAlarm.Put(0, "Batch: ERROR (%d) al enviar a Cola X.25\n", XQueue.GetErrno());
		return NOOK;
	}
	LogAlarm.Put(5, "Batch: Evento finalizado\n");

    return OK;
}
Exemplo n.º 4
0
/*
+-----------------+------------------------------------------------------------+
| FUNCION         | init                                                       |
+-----------------+------------------------------------------------------------+
| DESCRIPCION     | Inicia las estructuras y memoria compartida                |
|                 |                                                            | 
+-----------------+------------------------------------------------------------+
*/
int init()
{
    int	ret;
    int	cont;
	int	max_entries;
	char aux_str1[100];
	char aux_str2[100];

    /* Configura las señales de terminacion */
	signal(SIGINT, shut_down);
    signal(SIGTERM, shut_down);

    /* Obtiene el nombre del archivo de log */
	Cfg.GetItem("TimeOutDaemon", "LogName", aux_str1);
    LogAlarm.Open(aux_str1);

    /* Setea el nivel de log */
	Cfg.GetItem("TimeOutDaemon", "LogLevel", aux_str1);
    LogAlarm.SetLevel(atoi(aux_str1));

	/* Loguea hora de comienzo */
    LogAlarm.Put( 0,"TimeOutDaemon::init(): Comienzo [%s] - %s", NUM_VERSION, currentTimeLog()); 

    /* Obtiene la cantidad maxima de entradas en la cola */
	Cfg.GetItem("TimeOutDaemon", "MaxEntries", aux_str1);
    max_entries=atoi(aux_str1);

    /* Obtiene la cantidad maxima de entradas en la tabla de PIDs */
	Cfg.GetItem("PIDTable", "ShMemID", aux_str1);
    Cfg.GetItem("PIDTable", "MaxEntries", aux_str2);

    /* Abre tabla de PIDs */
	LogAlarm.Put(0, "TimeOutDaemon::init(): Abre tabla de PIDs [%s] [%s]\n", aux_str1, aux_str2);
    while (PTable.Open(atoi(aux_str1), atoi(aux_str2))==NOOK)
    {
		if (PTable.GetErrno()!=ENOENT)
		{
			LogAlarm.Put(0, "TimeOutDaemon::init(): Error (%d)!!\n", PTable.GetErrno());
			exit(1);
		}
    }
    
	/* Pone el pid en la tabla */
	LogAlarm.Put(0, "TimeOutDaemon::init(): Adding PID to PID table...\n");
    ret=PTable.PutPid(getpid());
    if (ret==NOOK)
    {
		LogAlarm.Put(0, "TimeOutDaemon::init(): Error (%d)!!\n", PTable.GetErrno());
		exit(1);
    }

    /* Obtiene los identificadores y permisos de la cola de timeout */
	Cfg.GetItem("TimeOutDaemon", "ShMemID", aux_str1);
    Cfg.GetItem("TimeOutDaemon", "ShMemPerms", aux_str2);

    /* Crea cola de timeout */
    LogAlarm.Put(0, "TimeOutDaemon::init(): Creando area de memoria compartida para la Timeout_Queue\n");  
    ret=timeout_queue.Create(atoi(aux_str1), max_entries, atoi(aux_str2));
    if (ret==NOOK)
    {
		LogAlarm.Put(0, "TimeOutDaemon::init(): Error (%d) al crear area para la Timeout_Queue \n", timeout_queue.GetErrno());
    }

    /* Obtiene identificador de la cola de eventos */
	Cfg.GetItem("VisaDaemon", "QueueID", aux_str1);
    
	/* Abre cola de eventos */
	LogAlarm.Put(0, "TimeOutDaemon::init(): Abriendo cola de eventos...\n");
    ret= EQueue.Open(atoi(aux_str1));
    if (ret==NOOK)
	{
		LogAlarm.Put(1, "TimeOutDaemon::init(): Error (%d) al abrir cola de eventos!!\n", EQueue.GetErrno());
		return NOOK;
	}

    return OK;
}
Exemplo n.º 5
0
/*
+-----------------+------------------------------------------------------------+
| FUNCION         | process_timeout                                            |
+-----------------+------------------------------------------------------------+
| DESCRIPCION     | Procesa el timeout.                                        |
|                 | Parametro: cont: Posicion de la cola con el timeout        | 
+-----------------+------------------------------------------------------------+
*/
void process_timeout(int cont)
{
	int		ret;
	int		event_type;
	str_timeout     	*timeout_data;
	str_timeout_event	timeout_event_data;
	char	aux_str1[100];	
	
	/* Obtiene los datos del elemento con time out vencido */
	timeout_data=timeout_queue.GetTimeOut(cont);
	LogAlarm.Put(0, "process_timeout(): Se encontro un TO (id:%s)\n", timeout_data->id);
	
	/* Si expired==0 */
	if (timeout_data->expired==0)
	{
		/* Setea el primer timeout */
		Cfg.GetItem("TimeOutDaemon", "MsgTimeOut2", aux_str1);
		LogAlarm.Put(0, "process_timeout(): Primer timeout\n");
		timeout_queue.SetOne(cont, atoi(aux_str1)); 
		
		/* Generar evento TimeOut */
		LogAlarm.Put(0, "process_timeout(): Generando evento TimeOut...\n");
		
		/* Completa la estructura del timeout */
		strcpy(timeout_event_data.key,timeout_data->id);
		strcpy(timeout_event_data.cod_ser,timeout_data->cod_ser);
		
		/* Obtiene el tipo de evento */
		switch (timeout_data->event_type)
		{
		case EVENT_REVTRXANUL:
			LogAlarm.Put(5,"process_timeout():  generando TimeOut de Reverso Anulacion \n");
			event_type=EVENT_TIMEOUT_REV_ANUL;
			break;
		case EVENT_SNDTRXANUL:
			LogAlarm.Put(5,"process_timeout():  Generando Timeout de Anulacion \n");
			event_type=EVENT_TIMEOUT_ANULACION;
			break;
		case EVENT_CIERRE:
			LogAlarm.Put(5, "process_timeout(): Generando TimeOut de cierre...\n");
			event_type=EVENT_TIMEOUT_CIERRE;
			break;
		case EVENT_CIERRE_B:
			LogAlarm.Put(5, "process_timeout(): Generando Timeout de cierre Batch\n");
			event_type=EVENT_TIMEOUT_CIERRE_B;
			break;
		case EVENT_BATCH:
			LogAlarm.Put(5, "process_timeout(): Generando Timeout en trx de batch upload\n");
			event_type=EVENT_TIMEOUT_BATCH;
			break;
		case EVENT_SNDTRXOFFLINE:
			LogAlarm.Put(5, "process_timeout(): Generando Timeout de Transaccion offline\n");
			event_type=EVENT_TMTTRXOFFLINE;
			break;
		case EVENT_SNDREVERSO:
			LogAlarm.Put(5, "process_timeout(): Generando Timeout de reverso\n");
			event_type=EVENT_TIMEOUT_REVERSO;
			break;
		case EVENT_ECHOTEST:
			LogAlarm.Put(5, "process_timeout(): Generando Timeout de echo test\n");
			
			event_type=EVENT_TIMEOUT_ECHOTEST;
			break;
		default:
			LogAlarm.Put(5, "process_timeout(): Generando Timeout generico\n");
			event_type=EVENT_TIMEOUT;
		}
		
		/* Envia el mensaje al Daemon */
		ret=EQueue.SendMsg(event_type, (char *)&timeout_event_data, sizeof(str_timeout_event));
		if (ret==NOOK)
		{
			LogAlarm.Put(5, "process_timeout: Error (%d) en Envio de Evento Timeout!!\n", EQueue.GetErrno());
		}
	}
	else  /* expired en 1 (ya se habia cumplido el 1er. timeout) */
	{
		/* Borra el timeout de la cola */
		LogAlarm.Put(0, "process_timeout: Segundo timeout. Borrando de la tabla...\n");
		timeout_queue.SetSecond(cont);
	}
}
Exemplo n.º 6
0
/*
+-----------------+------------------------------------------------------------+
| FUNCION         | Cierre::ProcessIt                                          |
+-----------------+------------------------------------------------------------+
| DESCRIPCION     | Proceso del objeto                                         |
|                 |                                                            | 
+-----------------+------------------------------------------------------------+
*/
int Cierre::ProcessIt()
{
    char			aux_str[100];
    char			msg_str[2000];
    int				msg_len;
    int				ret;
    str_heap_data	heap_data;
    BatchData		batch_data;
    str_sel_ntdata	term_data;
	char			aux_str1[100];
    char			idHeap[20];

	/* Obtiene los datos del mensaje */
    strcpy(term_data.nro_caj_ca, mensaje_iso->GetField(41));
    strcpy(term_data.nro_com   , mensaje_iso->GetField(42));
    
	/* Completa la estructura con los datos del mensaje */
	batch_data.NroCajCa(term_data.nro_caj_ca);

	/* Obtiene datos de la terminal */
	ret=getDataByCACie(&term_data);
	if (ret!=OK)
	{
		LogAlarm.Put( 0, "Cierre: ERROR (%d) al obtener datos de la terminal\n", ret);
		return NOOK;
	}

	/* Indica al objeto TraceNmbr el centro autorizador */
    TraceNumber.SetNroSuc(term_data.nro_suc);
    TraceNumber.SetNroCaj(term_data.nro_caj);
    TraceNumber.SetNroCA (term_data.nro_ca );
    TraceNumber.SetCodConCie(term_data.cod_con_cie);

    /* Completar el mensaje con los datos generados */
    mensaje_iso->PutField(7, currentTimestamp());
    strcpy(aux_str, TraceNumber);
    TraceNumber.Inc();
    mensaje_iso->PutField(11, aux_str); 
    mensaje_iso->PutField(15, currentTimestamp());

    /* Chequea consistencia del mensaje	*/
	LogAlarm.Put(95, "Cierre: Chequea consistencia del mensaje\n");
	if (!mensaje_iso->ChkReady())
	{
		LogAlarm.Put( 0, "Cierre: ERROR de consistencia en el mensaje\n");
		return NOOK;
	}

    /* Registrar transaccion en TrxHeap	*/
    LogAlarm.Put(95, "Cierre: Obtiene datos para el Heap\n");
    heap_data.orig_pid=orig_pid;

	/* Pone datos en el heap */
    LogAlarm.Put(95, "Cierre: Poniendo datos en el Heap.\n");
    sprintf(idHeap,"%2.2s%3.3s%5.5s%8.8s",term_data.nro_ca,term_data.nro_suc,term_data.nro_caj,mensaje_iso->GetField(11));
    ret=Heap.PutData(idHeap,(char *)&heap_data, sizeof(heap_data));
	if (ret==NOOK)
	{
		LogAlarm.Put(0, "Cierre: ERROR (%d) al poner los datos en el heap!!\n", Heap.GetErrno());
		return NOOK;
	}

    /* Registra en la TimeoutQueue con un timeout diferente a los otros eventos */
    LogAlarm.Put( 5, "Cierre: Agrega a la cola de timeout\n");
    Cfg.GetItem("TimeOutDaemon", "MsgTimeOut500", aux_str1);
    ret=timeout_queue.SetTimeOut(idHeap, atoi(aux_str1), GetType(), ""/*CodSer*/);
	if (ret==NOOK)
	{
		LogAlarm.Put( 0, "Cierre: ERROR (%d) al agregar en cola de timeout!!\n", timeout_queue.GetErrno());
		return NOOK;
	}

    /* Si se graba registro de cierre */
	memset(aux_str1, 0, sizeof(aux_str1));
	Cfg.GetItem("AdminDaemon", "InsertCierre", aux_str1);
	if (aux_str1[0] != 'N')
	{
		/* Completa la estructura */
		batch_data.NroCA(term_data.nro_ca);
		mensaje_iso->GetDBData(batch_data);
		batch_data.CanRet("0000");
		sprintf(aux_str, "%02d", E_ENVI);
		batch_data.CodEst(aux_str);
		batch_data.NroSuc(term_data.nro_suc);
		batch_data.NroCaj(term_data.nro_caj);
		batch_data.NroCom(term_data.nro_com);

		/* Registra en la base de datos */
		LogAlarm.Put( 5, "Cierre: Registra en base de datos\n");
		ret=DBBatch.Insert(batch_data.GetInsData());
		if (ret!=OK)
		{
			LogAlarm.Put( 1, "Cierre: ERROR (%d) al registrar en base de datos\n", DBBatch.GetErrno());
			return NOOK;
		}
	}

	/* Aplana el mensaje */
    msg_len=mensaje_iso->GetMsgString(msg_str);

    /* Envia el mensaje al centro autorizador */
	LogAlarm.Put(0, "Cierre: Envia a X.25. CAut [%s]\n", term_data.nro_ca);
    ret=XQueue.SendMsg(atol(term_data.nro_ca)+1, msg_str, msg_len);
	if (ret!=OK)
	{
		LogAlarm.Put(0, "Cierre: ERROR (%d) mandando mensaje a X.25!!\n", SQueue.GetErrno());
		return NOOK;
	}
    return OK;
}
Exemplo n.º 7
0
/*
+-----------------+------------------------------------------------------------+
| FUNCION         | SndTrxOffLine::ProcessIt                                   |
+-----------------+------------------------------------------------------------+
| DESCRIPCION     | Proceso del objeto                                         |
|                 |                                                            | 
+-----------------+------------------------------------------------------------+
*/
int SndTrxOffLine::ProcessIt()
{
    int             len;
    int             ret;
    int				iCont;
	str_sel_cadata  term_data;
    char            msg_str[2000];
    char            aux_str[20];
    trxOffHeap      infoHeap;         
    DBInfoEnvio     InfoEnvio;        
    str_fet_bu_trx  trxOff;
    int             pos_ocup;
    str_tarjeta     data_tar;
	char			aux_str1[100];	
    DBTrxPk         trxPk;             
    char			idHeap[20];
	char			szFechaEnvio[16];
	int				iErrorBD;
	int				iNroCuotas;

	/* Carga estructura para busqueda de transaccion offline */
    strncpy(trxOff.cod_tar   , CodTarjeta, sizeof(trxOff.cod_tar));
    strncpy(trxOff.cod_est   , "00"      , sizeof(trxOff.cod_est));
    strncpy(trxOff.nro_caj_ca, NroCajCa  , sizeof(trxOff.nro_caj_ca));
    strncpy(trxOff.nro_trx   , NroTrx    , sizeof(trxOff.nro_trx));
	trxOff.nro_caj_ca[sizeof(trxOff.nro_caj_ca)-1]='\0';
    trxOff.cod_tar   [sizeof(trxOff.cod_tar)   -1]='\0';
	trxOff.cod_est   [sizeof(trxOff.cod_est)   -1]='\0';
	trxOff.nro_trx   [sizeof(trxOff.nro_trx)   -1]='\0';

    /* Busca en BD una transaccion offline */
    LogAlarm.Put(0, "TrxOff: Lee offline [%s] [%s] [%s] [%s]\n", trxOff.nro_caj_ca, trxOff.cod_tar, trxOff.cod_est, trxOff.nro_trx);
	ret=DBGetNextTrx(&trxOff, &iErrorBD);
    if (ret!=OK)
    {
		LogAlarm.Put( 0, "TrxOff: Retorno de recuperacion de offline:%d Errno:%d\n", ret, iErrorBD);
		EnviarMsg(orig_pid, "ERROR", 5);
		return OK; 
	}
    //LogAlarm.Put(0, "TrxOff: Rowid a enviar [%s]\n",trxOff.rowid);

	/* Obtiene datos del centro autorizador */
    LogAlarm.Put(5, "TrxOff: Obtiene codigo de centro\n");
	strcpy(data_tar.cod_tar, trxOff.cod_tar);
	ret = ObtCA(&data_tar);
	if (ret!=OK)
	{
		LogAlarm.Put(0, "TrxOff: ERROR al obtener CA. Tar:[%s]\n", trxOff.cod_tar);
		EnviarMsg(orig_pid, "ERROR", 5);
		return OK; 
	}       

	/* Verifica si la caja esta libre */
    strcpy(term_data.nro_caj, trxOff.nro_caj);
    pos_ocup = P.IsPosFree(data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
    if (pos_ocup)
    {    
		/* Marca la caja como ocupada */
		ret = P.SetPosBusy(data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
		if (ret!=OK)
		{
			LogAlarm.Put(0, "TrxOff: ERROR al setear caja como ocupada\n");
		}
    }
    else
    {
        /* Retorna envio de caja bloqueada */
		LogAlarm.Put(0, "TrxOff: ERROR. Caja bloqueada\n");
		EnviarMsg(orig_pid, "BLOCK", 5);
		return NOOK;
    }

    /* Arma el mensaje base de acuerdo al codigo de transaccion */
	switch (atoi(trxOff.cod_trx))
	{
	case T_VENT:
		IsoMsg=new Iso_Msg(TYPE_VISA_VENTA_LOCAL);
		break;
	case T_DEVO:
		IsoMsg=new Iso_Msg(TYPE_VISA_DEVOL_LOCAL);
		break;
	case T_PAGO:
		IsoMsg=new Iso_Msg(TYPE_VISA_VENTA_LOCAL);
		sprintf(aux_str1, "%06d", OPCODE_VISA_PAGO_RESUMEN);
		IsoMsg->PutField(3, aux_str1);
		break;
	case T_DEVP:
		IsoMsg=new Iso_Msg(TYPE_VISA_DEVOL_LOCAL);
		sprintf(aux_str1, "%06d", OPCODE_VISA_DEVO_RESUMEN);
		IsoMsg->PutField(3, aux_str1);
		break;
	default: /* Tipo de transaccion desconocida */
		/* Libera la caja */
		ret = P.SetPosFree(data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
		if (ret != OK)
		{
			LogAlarm.Put(0, "TrxOff: ERROR en SetPosFree. CA:[%s] Emp:[%s] Caj:[%s]\n", 
							data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
		}
		LogAlarm.Put(0, "TrxOff: ERROR. Mensaje desconocido\n");
		EnviarMsg(orig_pid, "ERROR", 5);
		return NOOK;
	}

	/* Setea centro autorizador */
	IsoMsg->SetNroCA8583(data_tar.nro_ca);

	/* Arma la informacion para el heap */
    infoHeap.origPid=orig_pid;
    strncpy( infoHeap.nroSuc  , trxOff.nro_suc, sizeof(infoHeap.nroSuc  ) );
    strncpy( infoHeap.nroTerm , trxOff.nro_caj, sizeof(infoHeap.nroTerm ) );
    strncpy( infoHeap.nroTrans, trxOff.nro_tic, sizeof(infoHeap.nroTrans) );
    strncpy( infoHeap.fechaTrx, trxOff.fec_loc, sizeof(infoHeap.fechaTrx) );
    strncpy( infoHeap.codTar  , trxOff.cod_tar, sizeof(infoHeap.codTar  ) );
    strncpy( infoHeap.NroCajCa, trxOff.nro_caj_ca,sizeof(infoHeap.NroCajCa));
    strcpy ( infoHeap.Rowid,    trxOff.rowid);
    infoHeap.nroSuc  [sizeof(infoHeap.nroSuc   )-1]='\0';
    infoHeap.nroTerm [sizeof(infoHeap.nroTerm  )-1]='\0';
    infoHeap.nroTrans[sizeof(infoHeap.nroTrans )-1]='\0';
    infoHeap.fechaTrx[sizeof(infoHeap.fechaTrx )-1]='\0';
    infoHeap.codTar  [sizeof(infoHeap.codTar   )-1]='\0';
    infoHeap.NroCajCa[sizeof(infoHeap.NroCajCa )-1]='\0';   

     /* Convierte la tarjeta a standard ISO (sin espsacio y formato LLL-VAR */
    int counter=0;
    for (counter=0;counter<sizeof(trxOff.nro_tar);counter++)
    {
		if (trxOff.nro_tar[counter]<'0' || trxOff.nro_tar[counter]>'9')
		{
			break;
		} 
    }
    trxOff.nro_tar[counter]='\0';

    /* Configura datos de la terminal */
	strcpy(term_data.cod_tar, trxOff.cod_tar);
    strcpy(term_data.nro_suc, infoHeap.nroSuc);
    strcpy(term_data.nro_caj, infoHeap.nroTerm);
    strcpy(term_data.plan_sf, trxOff.plan_sf);

    /* Busca terminal en base de datos */
	ret=getDataByNT2(&term_data);
    if ( (ret!=OK) || (term_data.caj_bloq==1) )
    {
		/* Loguea error de terminal */
		LogErrTerminal.Put(0, "Fecha Hora %s", currentTimeLog() );
        LogErrTerminal.Put(0, "Caja: %s - Sucursal: %s - Tarjeta: %s - Plan: %s - Evento: TrxOff\n\n", 
							term_data.nro_caj, term_data.nro_suc, term_data.cod_tar, term_data.plan_sf);
        LogAlarm.Put(0, "TrxOff: ERROR (%d) de terminal (%s) bloqueada (%d)\n", ret, term_data.nro_caj, term_data.caj_bloq);
    
        /* Libera la caja */
		ret = P.SetPosFree(data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
        if (ret != OK)
        {
             LogAlarm.Put(0, "TrxOff: ERROR en SetPosFree. CA:[%s] Emp:[%s] Caj:[%s]\n", 
								data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
        }
        EnviarMsg(orig_pid, "ERROR", 5);
        return NOOK;
    }

    /* Numero de Tarjeta */
	sprintf(aux_str1,"%02d%s",counter,trxOff.nro_tar);
    IsoMsg->PutField(2, aux_str1);

    /* Monto */
	sprintf(aux_str1,"%012ld",atol(trxOff.monto));
    IsoMsg->PutField(4, aux_str1);

	/* Fecha de transmision */
	sprintf(szFechaEnvio, currentTimestamp());
    IsoMsg->PutField(7, szFechaEnvio);

	/* Si hora operacion mayor a transmision se rechaza */
	/* Quitar si sincronizan hora los servidores        */
	switch (DBTipoProtocoloISO(trxOff.nro_ca))
	{
	case PROT_ISO_AMEX: 
		if (strcmp(trxOff.fec_loc, szFechaEnvio)>0)
		{
			LogAlarm.Put(0, "TrxOff: Ter:[%s] Trx:[%04d]\n", infoHeap.nroTerm, atoi(infoHeap.nroTrans));
			LogAlarm.Put(0, "TrxOff: ERROR fecha/hora FHoperac[%s] FHtransm[%s]\n", trxOff.fec_loc, szFechaEnvio);
			/* Libera la caja */
			ret = P.SetPosFree(data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
			if (ret != OK)
			{
				LogAlarm.Put(0, "TrxOff: ERROR en SetPosFree. CA:[%s] Emp:[%s] Caj:[%s]\n", 
								data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
			}
			EnviarMsg(orig_pid, "ERROR", 5);
	        return NOOK;
		}
		break;
	default:
		break;
	}

   	/* Numero de trace */
    TraceNumber.SetNroSuc(term_data.nro_suc);
    TraceNumber.SetNroCaj(term_data.nro_caj);
    TraceNumber.SetNroCA (term_data.nro_ca );
    TraceNumber.SetCodConCie(term_data.cod_con_cie);
    strcpy(aux_str, TraceNumber);
    TraceNumber.Inc();
    IsoMsg->PutField(11, aux_str); 

	/* Hora local */
	IsoMsg->PutField(12, trxOff.fec_loc+4);
    
	/* Fecha local */
	IsoMsg->PutField(13, trxOff.fec_loc);
    
	/* Fecha de expiracion */
	IsoMsg->PutField(14, trxOff.fec_ven);
    
	/* Fecha de captura */
	switch (DBTipoProtocoloISO(trxOff.nro_ca))
	{
	case PROT_ISO_AMEX:
		break;
	default:
		IsoMsg->PutField(17, trxOff.fec_loc);
		break;
	}
    
	/* Modo de ingreso */
	IsoMsg->PutField(22, trxOff.mod_ing );
		
	/* Codigo de red */
    IsoMsg->PutField(24, term_data.cod_red);
    
	/* Codigo de condicion */
	IsoMsg->PutField(25, "00" );

	/* Track 2 si ingreso fue por banda */
	switch (DBTipoProtocoloISO(trxOff.nro_ca))
	{
	case PROT_ISO_AMEX:
		break;
	default:
		if (   !strcmp(trxOff.mod_ing, "022") 
			|| !strcmp(trxOff.mod_ing, "062") ) 
		{
			sprintf(aux_str1, "%02d%s", strlen(trxOff.track2), trxOff.track2);
			IsoMsg->PutField(35, aux_str1);
		}
		break;
	}

	/* Codigo de autorizacion */
	sprintf(aux_str1, "%s", trxOff.cod_aut);
	switch (DBTipoProtocoloISO(trxOff.nro_ca))
	{
	case PROT_ISO_AMEX:
		if( (atoi(trxOff.cod_trx)==T_DEVO) || (atoi(trxOff.cod_trx)==T_DEVP) )
		{
			if (atoi(trxOff.mod_env)==T_OFLI)
			{
				sprintf(aux_str1, "      "); // Devolucion offline Amex
			}
		}
		break;
	default:
		break;
	}
	IsoMsg->PutField(38, aux_str1);

	/* Terminal centro autorizador */
    IsoMsg->PutField(41, term_data.nro_caj_ca);

	/* Comercio centro autorizador */	
    sprintf(aux_str1,"%-15s",term_data.nro_com);
    IsoMsg->PutField(42, aux_str1);

	/* #37322 Cuotas articulos nacionales */
	iNroCuotas = ( term_data.plan_esp > 0 ) ? term_data.plan_esp : atoi(trxOff.nro_cuo) ;
	/* Campo Cuotas */
	sprintf(aux_str1,"003%1.1s%2.2d",trxOff.plan_iso, iNroCuotas);
	if( (atoi(trxOff.cod_trx)==T_DEVO) || (atoi(trxOff.cod_trx)==T_DEVP) )
    {
		if(useCampCuot(trxOff.nro_ca)==1)
		{
			sprintf(aux_str1, "013%1.1s%02d%04d%6s", 
						trxOff.plan_iso, iNroCuotas, atoi(trxOff.nro_tic_ori), trxOff.fec_ori);
		}
    }
	/* Compras AMEX de contado no se envia campo 48 */
	switch (DBTipoProtocoloISO(trxOff.nro_ca))
	{
	case PROT_ISO_AMEX: 
		if (strcmp(aux_str1, "003001")==0) 
		{
			memset(aux_str1, 0, sizeof(aux_str1));
		}
		break;
	default:
		break;
	}
	/* Agrega campo */
	if ( strlen(aux_str1) > 0 )
	{
		IsoMsg->PutField(48, aux_str1);
	}

	/* Codigo de moneda */
	IsoMsg->PutField(49, trxOff.cod_mon );

	/* Fecha de diferimiento (si no es devolucion) */
	if (term_data.dias_dif > 0)
	{
		if( (atoi(trxOff.cod_trx)!=T_DEVO) && (atoi(trxOff.cod_trx)!=T_DEVP) )
		{
			char szFechaDif[6+1];
			if (getFechaDif(trxOff.fec_trx, term_data.dias_dif, szFechaDif)==0)
			{
				ret = strlen(CAMPO_FECHA_DIFE) + strlen(szFechaDif);
				sprintf(aux_str1, "%03d%s%s", ret, CAMPO_FECHA_DIFE, szFechaDif);
				ret = IsoMsg->PutField(59, aux_str1);
				LogAlarm.Put(10, "TrxOff: Campo 59:[%s] Ret:[%d]\n", aux_str1, ret);
			}
		}
	}

    /* Numero de ticket */
	sprintf(aux_str1,"004%04d", atoi(trxOff.nro_tic));
    IsoMsg->PutField(62, aux_str1 );

    LogAlarm.Put(0, "TrxOff: Emp:[%s] Suc:[%s] Ter:[%s] Trx:[%04d] Rowid:[%s]\n", 
						term_data.nro_suc, term_data.nro_caj_sf, infoHeap.nroTerm, 
						atoi(infoHeap.nroTrans), trxOff.rowid);

	/* Arma clave para el heap */
    sprintf(idHeap, "%2.2s%3.3s%5.5s%8.8s", term_data.nro_ca, term_data.nro_suc, term_data.nro_caj, IsoMsg->GetField(11));

    /* Pone datos en el heap */
    LogAlarm.Put(5, "TrxOff: Pone datos en el Heap\n");
	ret=Heap.PutData(idHeap,(char *)&infoHeap, sizeof(infoHeap));
	if (ret==NOOK)
	{
		LogAlarm.Put(0, "TrxOff: ERROR (%d) al insertar en Heap. Clave:[%s]\n", Heap.GetErrno(), idHeap);

		/* Libera la caja */
		ret = P.SetPosFree(data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
		if (ret != OK)
		{
			LogAlarm.Put(0, "TrxOff: ERROR en SetPosFree. CA:[%s] Emp:[%s] Caj:[%s]\n", 
								data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
		}
        EnviarMsg(orig_pid, "ERROR", 5);
		return NOOK;
	}

    /* Carga estructura para actualizar la base de datos */
	strncpy( trxPk.nroSuc  , trxOff.nro_suc, sizeof(trxPk.nroSuc  ) );
    strncpy( trxPk.nroTerm , trxOff.nro_caj, sizeof(trxPk.nroTerm ) );
    strncpy( trxPk.nroTrans, trxOff.nro_tic, sizeof(trxPk.nroTrans) );
    strncpy( trxPk.fechaTrx, trxOff.fec_loc, sizeof(trxPk.fechaTrx) );
    strncpy( trxPk.rowid   , trxOff.rowid  , sizeof(trxPk.rowid   ) );

    /* Carga estructura para actualizar la base de datos */
	strncpy(InfoEnvio.cod_est, "01", sizeof(InfoEnvio.cod_est ));
    strncpy(InfoEnvio.fec_env, szFechaEnvio, sizeof(InfoEnvio.fec_env ));
    strncpy(InfoEnvio.nro_lot, "0000", sizeof(InfoEnvio.nro_lot));
    strncpy(InfoEnvio.nro_trc, IsoMsg->GetField(11), sizeof(InfoEnvio.nro_trc));

	/* Actualiza la base de datos */
    ret=DBUpdEnvio(trxPk , InfoEnvio);
    LogAlarm.Put(0, "TrxOff: Actualiza informacion de Envio. Retorno:%d\n", ret);

    /* Registra en cola de timeout */
	strcpy(aux_str, IsoMsg->GetField(11));
    Cfg.GetItem("TimeOutDaemon", "MsgTimeOut1", aux_str1);
	LogAlarm.Put(0, "TrxOff: Timeout ID Trace [%s]\n", idHeap);
    ret=timeout_queue.SetTimeOut(idHeap, atoi(aux_str1), GetType(), "");
    if (ret==NOOK)
    {
        LogAlarm.Put(0, "TrxOff: ERROR (%d) al registrar en TOQ\n",ret);

		/* Libera la caja */
		ret = P.SetPosFree(data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
		if (ret != OK)
		{
			LogAlarm.Put(0, "TrxOff: ERROR en SetPosFree. CA:[%s] Emp:[%s] Caj:[%s]\n", 
							data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
		}

		/* Retira del heap */
		ret=Heap.GetData(idHeap,(char *)&infoHeap, sizeof(infoHeap));
		if (ret == NOOK)
		{
			LogAlarm.Put( 0, "TrxOff: ERROR (%d) al obtener del heap\n", Heap.GetErrno());
		}
		
		/* Envia respuesta */
		EnviarMsg(orig_pid, "ERROR", 5);
		
		return NOOK;
    }

    /* Aplana el mensaje */
    len=IsoMsg->GetMsgString(msg_str);

	/* Loguea el mensaje */
	for (iCont=0; iCont<64; iCont++)
	{
		if (IsoMsg->ChkField(iCont))
		{
			LogAlarm.Put(5, "TrxOff: Campo %02d: Valor:[%s]\n", iCont, IsoMsg->GetField(iCont) );
		}
	}

    /* Envia el mensaje a X25 */
	LogAlarm.Put(0, "TrxOff: Envia a X.25. CAut [%s]\n", term_data.nro_ca);
    ret=XQueue.SendMsg(atoi(term_data.nro_ca)+1, msg_str, len);
    if (ret!=OK)
    {
        LogAlarm.Put(0, "TrxOff: ERROR en Envio X.25(%d)\n", XQueue.GetErrno());

		/* Libera la caja */
        ret = P.SetPosFree(data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
        if (ret != OK)
        {
             LogAlarm.Put(0, "TrxOff: ERROR en SetPosFree. CA:[%s] Emp:[%s] Caj:[%s]\n", 
								data_tar.nro_ca, trxOff.nro_suc, trxOff.nro_caj);
        }
        
		/* Envia respuesta */
		EnviarMsg(orig_pid, "ERROR", 5);

        return NOOK;
    }
    return OK;
}