Trazabilidad de Medicamentos - WS TrazaMed ANMAT/PAMI SNT


Interfaz para Servicio Web Código de Trazabilidad de Medicamentos (SOAP) correspondiente a la  Resolución 435/2011 del Ministerio de Salud y  Disposición 3683/2011 de A.N.M.A.T.: Sistema Nacional de Trazabilidad de Medicamentos que deberán implementar las personas físicas o jurídicas que intervengan en la cadena de comercialización, distribución y dispensación de especialidades medicinales incluidas en el Registro de Especialidades Medicinales. SNT Especificación Técnica V2.

Índice


Introducción

Biblioteca para el web service de ANMAT/PAMI que permite automatizar la gestión de las trazabilidad de medicamentos:

  • Interfaz COM: Simil DLL/OCX, embebible para aplicaciones programadas en lenguajes visuales bajo windows (Visual Basic, Visual Fox Pro, SAP, etc.)
  • Interfaz por consola (linea de comandos / archivo de texto): similar a aplicativos SIAP para sistemas legados (ej. RM COBOL) multiplataforma (DOS, Windows, Unix)
  • Interfaz por tablas DBF: compatible con dBase, FoxPro, Clipper -proximamente-
  • Interfaz por base de datos: compatible con conectores ODBC (MS SQL Server), PostgreSQL y otros (Oracle, DB2) -proximamente-

Cubre totalmente el proceso, puede ser adaptado a programas existentes y no es requerido intervención del usuario.

Para más información ver PyAfipWs

Importante: El documento ANMAT Especificación Técnica para Pruebas de Servicios v2 Download estaría entrando en vigencia a partir del 1/3/2013. Ver abajo los cambios ("Versión 2")

Descargas

URL:

Métodos

  • SendMedicamentos(usuario, password, f_evento, h_evento, gln_origen, gln_destino, n_remito, n_factura, vencimiento, gtin, lote, numero_serial, id_obra_social, id_evento, cuit_origen, cuit_destino, apellido, nombres, tipo_docmento, n_documento, sexo, direccion, numero, piso, depto, localidad, provincia, n_postal, fecha_nacimiento, telefono, nro_asociado): Realiza el registro de una transacción de medicamentos
  • SendCancelacTransacc(usuario, password, codigo_transaccion): Realiza la cancelación de una transacción
  • SendMedicamentosDHSerie(usuario, password, f_evento, h_evento, gln_origen, gln_destino, n_remito, n_factura, vencimiento, gtin, lote, desde_numero_serial, hasta_numero_serial, id_obra_social, id_evento, cuit_origen, cuit_destino, apellido, nombres, tipo_docmento, n_documento, sexo, direccion, numero, piso, depto, localidad, provincia, n_postal, fecha_nacimiento, telefono, nro_asociado): Realiza el registro de una transacción de medicamentos. Envía un lote de medicamentos informando el desde-hasta número de serie (desde_numero_serial, hasta_numero_serial)
  • SendMedicamentosFraccion(usuario, password, f_evento, h_evento, gln_origen, gln_destino, n_remito, n_factura, vencimiento, gtin, lote, numero_serial, id_obra_social, id_evento, cuit_origen, cuit_destino, apellido, nombres, tipo_docmento, n_documento, sexo, direccion, numero, piso, depto, localidad, provincia, n_postal, fecha_nacimiento, telefono, nro_asociado, cantidad): Nuevo método para Transacción de medicamentos fraccionados (farmacias)

Nuevos métodos Versión 2

  • SendConfirmaTransacc(usuario, password, p_ids_transac, f_operacion): Confirma la recepción de un medicamento (recibe nro de transacción individual al medicamento seriado; fecha en que ocurre el evento)
  • SendAlertaTransacc(usuario, password, codigo_transaccion): Alerta un medicamento, acción contraria a “confirmar la transacción”.
  • SendCancelacTransaccParcial(usuario, password, codigo_transaccion, gtin_medicamento, numero_serial): Realiza la cancelación parcial de una transacción, gtin_medicamento y numero serial son parámetros opcionales. Disponible desde la actualización 1.12a.
  • GetTransaccionesNoConfirmadas(usuario, password, p_id_transaccion_global, id_agente_informador, id_agente_origen, id_agente_destino, id_medicamento, id_evento, fecha_desde_op, fecha_hasta_op, fecha_desde_t, fecha_hasta_t, fecha_desde_v, fecha_hasta_v, n_remito, n_factura, estado, lote, numero_serial): Trae un listado de las transacciones donde el agente es el destino y no están confirmadas por el agente receptor (estado = 1: informada, 2: anulada, 3: confirmada, 4:alertada, 5: cargada). Salvo usuario y password, el resto de los parámetros son opcionales. lote y numero_serial agregado en actualización 1.14a.
  • GetEnviosPropiosAlertados(usuario, password, p_id_transaccion_global, id_agente_informador, id_agente_origen, id_agente_destino, id_medicamento, id_evento, fecha_desde_op, fecha_hasta_op, fecha_desde_t, fecha_hasta_t, fecha_desde_v, fecha_hasta_v, n_remito, n_factura): Obtiene las distribuciones y envíos propios hacia otro eslabón que han sido alertados en vez de confirmados. Todos los parámetros son opcionales excepto usuario y password. Disponible desde la actualización 1.12a.

Nuevos métodos auxiliares (Disponible desde la actualización 1.15a):

  • GetTransaccionesWS(usuario, password, p_id_transaccion_global, id_agente_origen, id_agente_destino, id_medicamento, id_evento, fecha_desde_op, fecha_hasta_op, fecha_desde_t, fecha_hasta_t, fecha_desde_v, fecha_hasta_v, n_remito, n_factura, id_estado, nro_pag,): Obtiene los movimientos realizados y permite filtros de búsqueda
  • GetCatalogoElectronicoByGTIN(usuario, password, cuit_fabricante, gtin, descripcion, id_monodroga): Obtiene el Catálogo Electrónico de Medicamentos

Métodos generales / accesorios

  • Conectar(cache, url_webservice_wsdl, proxy, wrapper, cacert): Establece la conexión con el servidor remoto, recibe el directorio de archivos temporales, la URL del WSDL (descripción del webservice) y proxy en formato 'usuario:clave@servidor:puerto'. Si no se especifíca url, se utiliza servidores de homologación. Parametros adicionales optativos: wrapper es la librería HTTP a utilizar y cacert la ruta al certificado de la autoridad de certificante del servidor (CA)
  • LeerError(): devuelve el error notificado por el webservice, o vacio si no hay más errores para informar.
  • LeerTransaccion(): obtiene la próxima transacción a devuelta por el webservice al consultar (luego llamar a GetParametro para obtener los valores de cada campo). Devuelve False si no hay más transacciones
  • SetParametro(clave, valor): establece el parámetro de entrada de nombre "clave" con el respectivo "valor", que será usado al llamar al webservice (útil para lenguajes de programación que solo soportan 27 parámetros como VFP)
  • GetParametro(clave): devuelve el parámetro de salida de nombre "clave", que fue establecido al llamar un método del webservice (útil para recorrer las transacciones devueltas de las consultas, previa llamada a LeerTransaccion)

Los métodos devuelven True (verdadero) en caso de que se ejecuten correctamente, y establecen los atributos Resultado, Errores y CodigoTransaccion según corresponda.

En caso de falla (por ej. error de comunicación), devuelven False (falso) y se debe revisar atributos Excepcion y Traceback

Atributos

  • Username, Password: credenciales de seguridad para operar el webservice
  • CodigoTransaccion: número otorgado por el método remoto (en caso correcto)
  • Errores: lista de validaciones fallidas devueltas por el método remoto
  • Resultado: verdadero (True) si fue procesado correctamente
  • TransaccionPlainWS: lista de diccionarios (array clave->valor) de parámetros de salida de GetTransaccionesNoConfirmadas (consulta de transacciones)
  • XmlRequest, XmlResponse: mensajes xml crudos sin procesar (para depuración)
  • Version, InstallDir: datos para depuración
  • Traceback, Excepcion: errores no esperados de comunicación o similar (por ej. SoapFault)

Campos MedicamentosDTO, MedicamentosDTODHSerie, MedicamentosDTOFraccion

El método SendMedicamentos recibe los datos correspondientes a una transacción de medicamentos:

NombreTipoLongitudObligatorioDescripción
f_evento alfanumérico 10 si Fecha en que ocurre el evento. Formato DD/MM/YYYY
h_evento alfanumérico 5 si Hora en la que ocurre el evento. Formato HH:MM
gln_origen alfanumérico 13 si Código GLN del agente origen.
cuit_origen alfanumérico 11 si Número de CUIT del agente origen. Numérico sin guiones.
gln_destino alfanumérico 13 no Código GLN del agente destino
cuit_destino alfanumérico 11 no Número de CUIT del agente destino. Numérico sin guiones.
n_remito alfanumérico 20 no Número de Remito
n_factura alfanumérico 20 no Número de Factura
vencimiento alfanumérico 10 si Fecha de Vencimiento del medicamento. Formato DD/MM/YYYY
gtin alfanumérico 14 si GTIN del medicamento
lote alfanumérico 20 si Número de lote
numero_serial alfanumérico 20 si Número de serie
id_evento numerico 2 si Identificador del evento. Ver tabla de Eventos.
apellido alfanumérico 50 no Apellido de la persona a la que se dispensó el medicamento.
nombres alfanumérico 100 no Nombre /s de la persona a la que se dispensó el medicamento
n_documento alfanumérico 10 no Número de Documento de la persona a la que se dispensó el medicamento
sexo alfanumérico 1 no Sexo de la persona de la persona a la que se dispensó el medicamento
tipo_documento numerico no Tipo de Documento de la persona a la que se dispensó el medicamento
direccion alfanumérico 100 no Domicilio de la persona a la que se dispensó el medicamento
localidad alfanumérico 50 no Localidad de la persona a la que se dispensó el medicamento
numero alfanumérico 10 no Numero de calle de la persona a la que se dispensó el medicamento
piso alfanumérico 5 no Piso del departamento de la persona a la que se dispensó el medicamento
dpto alfanumérico 5 no Departamento de la persona a la que se dispensó el medicamento
n_postal alfanumérico 8 no Código postal de la persona a la que se dispensó el medicamento
telefono alfanumérico 30 no Número de teléfono de la persona a la que se le dispensó el medicamento.
id_obra_social numerico 9 no Numero de obra social que financia el medicamento cuando se dispensa al paciente. Ver tabla de obras sociales en documento set_de_datos.pdf
nro_asociado alfanumérico 30 no Número de afiliado a la obra social que financia el medicamento cuando se dispensa al paciente.
id_motivo_devolucion numérico no (provisorio, no documentado por ANMAT al 03-02-2014)
otro_motivo_devolucion alfanumérico no (provisorio, no documentado por ANMAT al 03-02-2014)

El método SendMedicamentosDHSerie cambia el dato numero_serial por un rango:

NombreTipoLongitudObligatorioDescripción
desde_numero_serialalfanumérico20siNúmero de serie desde.
hasta_numero_serialalfanumérico20siNúmero de serie hasta.

El método SendMedicamentosFraccion agrega el siguiente campo luego del numero_serial:

NombreTipoLongitudObligatorioDescripción
cantidadnumerico3noIndica la cantidad a dispensar del medicamento siempre que el mismo pueda ser fraccionado. La cantidad máxima esta dada por la cantidad de unidades de la presentación. La cantidad mínima es 1.

Importante: si un campo no debe enviarse, completar con None, Null, Empty, ? o el valor equivalente para campos nulos. No usar cadena vacia o 0 ya que son datos válidos y se enviarán al webservice. No saltear u omitir parámetros, salvo que esten al final o sean pasados por nombre (keyword arguments), usar SetParametro en dicho caso.

Campos devueltos al consultar - TransaccionPlainWs - Version 2

El método GetTransaccionesNoConfirmadas devuelve la lista de transacciones que coincicidan con los criterios de búsqueda especificados. Se puede acceder al atributo TransaccionPlainWs para leer estos datos (diccionario clave - valor, dependiendo del lenguaje de programación). Es posible recorrer dichas transacciones una por una usando el método LeerTransaccion (devuelve True y establece los parámetros de salida, que pueden ser consultados con GetParametro?).

Para el listado de transacciones no confirmadas, los parámetros de salida definidos en la documentación de ANMAT son los siguientes:

  • id_transaccion: Numero de transaccion individual (a nivel nro de serie)
  • id_transac_global: Numero Global
  • nro_transaccion: N/A
  • f_evento: Fecha del evento
  • gln_destino: GLN Destino
  • cuit_destino: CUIT Destino
  • gln_origen: GLN Origen
  • n_remito: Numero de Remito
  • cuit_origen: CUIT Origen
  • n_factura: Numero de Factura
  • vencimiento: Fecha de vencimiento de transaccion
  • gtin: GTIN medicamento
  • lote: Número de Lote
  • numero_serial: Numero Serial
  • id_evento: Numero de Evento (reestablecido pero no documentado por ANMAT al 03-02-2014)
  • d_evento: Descripción del Evento
  • f_transaccion: Fecha Transaccion*
  • gln_agente_informador: GLN Agente Informador
  • c_usuario_informador: Codigo de Usuario Informador
  • id_transac_ws_anul: ID Transaccion de Anulación
  • f_anulacion: Fecha de anulación (si aplica)
  • id_estado: Estado de la transaccion
  • d_provincia: Provincia
  • paciente: Paciente (si aplica)
  • cant_fraccion: Cantidad Fraccion

Importante: en la respuesta devuelta por ANMAT, pueden no estar todos los parámetros presentes (depende de la transacción). Si no se encuentra el parámetro, GetParametro devolverá nulo.

Los campos tachados fueron incluidos en la documentación preliminar pero omitidos por ANMAT en la versión definitiva. A partir del 17 de Junio de 2014, los campos no incluyen el guión bajo debido a un cambio en la descripción del servicio de ANMAT.

Linea de Comandos

Para sistemas operativos legados (DOS bajo windows) y UNIX/Linux, es posible operar la herramienta de trazabilidad por consola. Recibe como parámetros los datos correspondientes a la llamada remota (ver métodos). Opcionalmente se puede especificar --testing para pruebas (usar xml de muestra como respuesta si no se tiene acceso a homologación) y --trace para imprimir por pantalla los datos enviados y recibidos.

Nota: dependiendo de la compilación y el instalador, el ejecutable puede ser TRAZAMED_CLI.EXE

Ejemplo de uso para Informar un Medicamento (por defecto recibe los argumentos según el método SendMedicamento):

C:\PYANMAT>trazamed.exe "pruebasws" "Clave1234" "31/03/2015" "04:24" "9999999999918" "glnws" "R123400001234" "A123400001234" "31/03/2015" "GTIN1" "2015" "12348" "" 134 "20267565393" "20267565393" "Reingart" "Mariano" "96" "26756539" "M" "Saraza" "1234" "1" "A" "Hurlingham" "Buenos Aires" "1688" "01/01/2000" "5555-5555"
|Resultado  True|CodigoTransaccion   31013624|Errores||

Si no se específican los campos por linea de comando, de manera predeterminada se utilizará el formato de texto Para usar Tablas DBF agregar a la linea de comandos el parámetro --dbf. Para soporte de JSON (JavaScript? Object Notation), agregar parametro --json. Se debe anteponer --cargar y --grabar para leer y escribir los datos en los archivos de intercambio.

Ejemplos para informar medicamentos usando archivos de texto, dbf y json respectivamente (disponible desde actualización 1.11a):

C:\PYANMAT>trazamed.exe --cargar --grabar "pruebasws" "Clave1234"
C:\PYANMAT>trazamed.exe --cargar --grabar --dbf "pruebasws" "Clave1234"
C:\PYANMAT>trazamed.exe --cargar --grabar --json "pruebasws" "Clave1234"

Ejemplo de uso para cancelar una transacción (recibe usuario, password y número de transacción):

C:\PYANMAT>trazamed.exe --cancela "pruebasws" "pruebasws" "5114801" 
|Resultado False|CodigoTransaccion       None|Errores|3: Transaccion NO encontrada, NO se puede anular.|

Ejemplo de uso para cancelar una transacción parcialmente (recibe usuario, password, número de transacción, gtin y numero de serie -estos dos últimos opcionales-):

C:\PYANMAT>trazamed.exe --cancela_parcial  pruebasws pruebasws 2224635 000000000GTIN2 998
|Resultado False|CodigoTransaccion       None|Errores|3: Transaccion NO encontrada, NO se puede anular.|

Ejemplo de uso para Consultar transacciones no confirmadas -v2-:

C:\PYANMAT>trazamed.exe --consulta "pruebasws" "pruebasws"
|| _gtin||_lote||_numero_serial||_id_transaccion||_estado||_f_transaccion||_d_evento||_gln_origen||_gln_destino ||
|| 07795360005385 || 412568 || 1200 || 5114793 || Informada || 19/02/2013 || ENVIO... || 9992105600005 || glnws ||
|| 07795347900511 || 412568 || 1200 || 5114796 || Informada || 19/02/2013 || ENVIO... || 9992105600005 || glnws ||
|| 00121231323232 || 412568 || 1200 || 5114798 || Informada || 19/02/2013 || ENVIO... || 9992105600005 || glnws ||
|| 55564646464645 || 412568 || 1200 || 5114801 || Informada || 19/02/2013 || ENVIO... || 9992105600005 || glnws ||

Para generar un archivo de intercambio con los datos de las transacciones, especificar --grabar (disponible desde actualización 1.11a):

C:\PYANMAT>trazamed.exe --grabar --consulta "pruebasws" "pruebasws"

Ejemplo de uso para Consultar transacciones alertadas por el eslabón posterior (GetEnviosPropiosAlertados) -v2-:

C:\PYANMAT>trazamed.exe --alertadas --consulta "pruebasws" "pruebasws"
CantPaginas None
HayError None
||_id_transaccion||_id_transaccion_global||_f_evento||_f_transaccion||_gtin||_lote||_numero_serial||_d_evento||_gln_origen||_gln_destino||_n_remito||_n_factura||_vencimiento ||
|| 2224635 || 842235 || 14/06/2012 || 15/06/2012 15:14 || 000000000GTIN2 || 9999 || 998 || RECEPCION DE PRODUCTO DESDE UN ESLABON ANTERIOR || 9999999999918 || glnws || 4433 || A000100000001 || 15/12/2012 ||
|| 10493358 || 12479556 || 06/03/2013 || 23/04/2013 09:54 || 000000000GTIN4 || 1 || 77777565 || ENVIO DE PRODUCTO EN CARACTER DEVOLUCION || 9991106600007 || glnws || 1 || 1 || 31/12/2015 ||
|| 10493357 || 12479556 || 06/03/2013 || 23/04/2013 09:54 || 000000000GTIN4 || 1 || 77777564 || ENVIO DE PRODUCTO EN CARACTER DEVOLUCION || 9991106600007 || glnws  || 1 || 1 || 31/12/2015 ||

Ejemplo de uso para confirmar una transacción -v2- (recibe usuario, password, número de transacción y fecha de operación):

C:\PYANMAT>trazamed.exe --confirma "pruebasws" "pruebasws" "5114793" "25/02/2013"
|Resultado  True|CodigoTransaccion       None|Errores||

Ejemplo de uso para alertar una transacción -v2- (recibe usuario, password, número de transacción):

C:\PYANMAT>trazamed.exe --alerta "pruebasws" "pruebasws" "5114798"
|Resultado  True|CodigoTransaccion       None|Errores||

Archivos de Intercambio

Desde la actualización 1.11a, la herramienta soporta archivos de intercambio en DBF, JSON o archivos de texto fijo (COBOL):

Formato para Medicamentos

Nombre Tipo Long. Pos(txt) Campo(dbf)
f_evento Alfanumerico 10 1 fevento
h_evento Alfanumerico 5 11 hevento
gln_origen Alfanumerico 13 16 glnorigen
gln_destino Alfanumerico 13 29 glndestino
n_remito Alfanumerico 20 42 nremito
n_factura Alfanumerico 20 62 nfactura
vencimiento Alfanumerico 10 82 vencimient
gtin Alfanumerico 14 92 gtin
lote Alfanumerico 20 106 lote
numero_serial Alfanumerico 20 126 numeroseri
desde_numero_serial Alfanumerico 20 146 desdenumer
hasta_numero_serial Alfanumerico 20 166 hastanumer
id_obra_social Numerico 9 186 idobrasoci
id_evento Numerico 3 195 idevento
cuit_origen Alfanumerico 11 198 cuitorigen
cuit_destino Alfanumerico 11 209 cuitdestin
apellido Alfanumerico 50 220 apellido
nombres Alfanumerico 100 270 nombres
tipo_documento Numerico 2 370 tipodocume
n_documento Alfanumerico 10 372 ndocumento
sexo Alfanumerico 1 382 sexo
direccion Alfanumerico 100 383 direccion
numero Alfanumerico 10 483 numero
piso Alfanumerico 5 493 piso
depto Alfanumerico 5 498 depto
localidad Alfanumerico 50 503 localidad
provincia Alfanumerico 100 553 provincia
n_postal Alfanumerico 8 653 npostal
fecha_nacimiento Alfanumerico 100 661 fechanacim
telefono Alfanumerico 30 761 telefono
nro_asociado Alfanumerico 30 791 nroasociad
cantidad Numerico 3 821 cantidad
codigo_transaccion Alfanumerico 14 824 codigotran

Formato para Transacciones

Nombre Tipo Long. Pos(txt) Campo(dbf)
id_transaccion Alfanumerico 14 1 idtransacc
id_transaccion_global Alfanumerico 14 15 idtransac1
f_evento Alfanumerico 10 29 fevento
f_transaccion Alfanumerico 16 39 ftransacci
gtin Alfanumerico 14 55 gtin
lote Alfanumerico 20 69 lote
numero_serial Alfanumerico 20 89 numeroseri
nombre Alfanumerico 200 109 nombre
d_evento Alfanumerico 100 309 devento
gln_origen Alfanumerico 13 409 glnorigen
razon_social_origen Alfanumerico 200 422 razonsocia
gln_destino Alfanumerico 13 622 glndestino
razon_social_destino Alfanumerico 200 635 razonsoci1
n_remito Alfanumerico 20 835 nremito
n_factura Alfanumerico 20 855 nfactura
vencimiento Alfanumerico 10 875 vencimient

Formato para Errores

Nombre Tipo Long. Pos(txt) Campo(dbf)
_c_error Alfanumerico 4 1 cerror
_d_error Alfanumerico 250 5 derror

Ejemplos

Intefase COM en VB (5/6)

Envio de Medicamentos (transacción de trazabilidad):

Dim TrazaMed As Object, ok As Variant

' Crear la interfaz COM
Set TrazaMed = CreateObject("TrazaMed")

' Establecer credenciales de seguridad
TrazaMed.Username = "testwservice"
TrazaMed.Password = "testwservicepsw"

' Conectar al servidor (pruebas)
ok = TrazaMed.Conectar()

' datos de prueba
usuario = "pruebasws": Password = "pruebasws"
f_evento = "25/11/2011": h_evento = "04:24"
gln_origen = "glnws": gln_destino = "glnws"
n_remito = "1234": n_factura = "1234"
vencimiento = "30/11/2011": gtin = "GTIN1": lote = "1111"
numero_serial = "12348": id_obra_social = "": id_evento = 133
cuit_origen = "20267565393": cuit_destino = "20267565393":
apellido = "Reingart": nombres = "Mariano"
tipo_docmento = "96": n_documento = "26756539": sexo = "M"
direccion = "Saraza": numero = "1234": piso = "": depto = ""
localidad = "Hurlingham": provincia = "Buenos Aires"
n_postal = "B1688FDD": fecha_nacimiento = "01/01/2000"
telefono = "5555-5555"

' Enviar datos y procesar la respuesta:
ok = TrazaMed.SendMedicamentos(usuario, Password, _
                     f_evento, h_evento, gln_origen, gln_destino, _
                     n_remito, n_factura, vencimiento, gtin, lote, _
                     numero_serial, id_obra_social, id_evento, _
                     cuit_origen, cuit_destino, apellido, nombres, _
                     tipo_docmento, n_documento, sexo, _
                     direccion, numero, piso, depto, localidad, provincia, _
                     n_postal, fecha_nacimiento, telefono)

Debug.Print "Resultado:", TrazaMed.Resultado
Debug.Print "CodigoTransaccion:", TrazaMed.CodigoTransaccion
    
For Each er In TrazaMed.Errores
     MsgBox er, vbExclamation, "Error!"
Next
    
MsgBox "Resultado: " & TrazaMed.Resultado & vbCrLf & _
        "CodigoTransaccion: " & TrazaMed.CodigoTransaccion, _
        vbInformation, "Resultado"

Ejemplo para anular una transacción de trazabilidad de medicamentos:

' Cancelo la transacción (anulación):
codigo_transaccion = TrazaMed.CodigoTransaccion
ok = TrazaMed.SendCancelacTransacc(usuario, password, codigo_transaccion)
MsgBox "Resultado: " & TrazaMed.Resultado & vbCrLf & _
       "CodigoTransaccion: " & TrazaMed.CodigoTransaccion, _
       vbInformation, "SendCancelacTransacc"

Ejemplo de consulta de transacciones de trazabilidad de medicamentos (v2):

' llamo al webservice para realizar la consulta:
ok = TrazaMed.GetTransaccionesNoConfirmadas(usuario, password, _
        p_id_transaccion_global, id_agente_informador, _
        id_agente_origen, id_agente_destino, id_medicamento, _
        id_evento, fecha_desde_op, fecha_hasta_op, _
        fecha_desde_t, fecha_hasta_t, _
        fecha_desde_v, fecha_hasta_v, _
        n_remito, n_factura, estado)
' recorro las transacciones devueltas (TransaccionPlainWS)
Do While TrazaMed.LeerTransaccion:
    If MsgBox("GTIN:" & TrazaMed.GetParametro("gtin") & vbCrLf & _
              "Estado: " & TrazaMed.GetParametro("estado") & vbCrLf & _
              "CodigoTransaccion: " & TrazaMed.GetParametro("id_transaccion"), _
              vbInformation + vbOKCancel, "GetTransaccionesNoConfirmadas") = vbCancel Then
        Exit Do
    End If
Loop

Ejemplo de confirmación de transacciones de trazabilidad de medicamentos (v2):

' Confirmo la transacción
p_ids_transac = "5142760" ' TrazaMed.CodigoTransaccion
f_operacion = CStr(Date)  ' ej. 25/02/2013
ok = TrazaMed.SendConfirmaTransacc(usuario, password, _
                                   p_ids_transac, f_operacion)
If ok Then
    MsgBox "Resultado: " & TrazaMed.Resultado & vbCrLf & _
           "CodigoTransaccion: " & TrazaMed.CodigoTransaccion, _
           vbInformation, "SendConfirmaTransacc"
    For Each er In TrazaMed.Errores
        MsgBox er, vbExclamation, "Error en SendConfirmaTransacc"
    Next
End If

Intefase COM en VFP 9

*-- Crear objeto interface COM
TrazaMed = CREATEOBJECT("TrazaMed") 
    
*-- Establecer credenciales de seguridad
TrazaMed.Username = "testwservice"
TrazaMed.Password = "testwservicepsw"

*-- Conectar al servidor (pruebas)
ok = TrazaMed.Conectar()

*-- datos de prueba
usuario = "pruebasws" 
password = "pruebasws"
f_evento = "25/11/2011"
h_evento = "04;24"
gln_origen = "glnws"
gln_destino = "glnws"
n_remito = "1234"
n_factura = "1234"
vencimiento = "30/11/2011"
gtin = "GTIN1"
lote = "1111"
numero_serial = "12349"
id_obra_social = ""
id_evento = 133

*-- Establezco parámetros adicionales:

ok = TrazaMed.SetParametro("nro_asociado", "9999999999999")

*-- Enviar datos y procesar la respuesta:
ok = ""
ok = TrazaMed.SendMedicamentos(usuario, password, ;
                     f_evento, h_evento, gln_origen, gln_destino, ;
                     n_remito, n_factura, vencimiento, gtin, lote, ;
                     numero_serial, id_obra_social, id_evento ;
				     )

Entrenamiento

IMPORTANTE: Solo usuarios habilitados. Consultar con técnicos de PAMI/ANMAT:  contactotrazabilidad@pami.org.ar y  trazabilidad@anmat.gov.ar

Para la Pruebas de Servicios (desarrollo) debe utilizar las siguientes credenciales (ver  Paso 1 ANMAT SNT):

Para poder realizar la trazabilidad de medicamentos a través del WebService, deberá antes realizar el entrenamiento con datos ejemplo que lo ayudarán a comprender y probar el funcionamiento del servicio (ver  Paso 2 ANMAT SNT).

Deberá utilizar en esta etapa el usuario, contraseña y GLN asignado en la registración en el modo de entrenamiento por la web de  https://servicios.pami.org.ar/trazamed/registro.tz

Para el entorno de producción (definitivo) registrarse en  https://trazabilidad.pami.org.ar/trazamed/registro.tz

Los siguientes son los eventos que deberá realizar a través del webservice. Previamente deberá cumplimentar los pasos de entrenamiento descriptos en la página de trazabilidad. Tenga en cuenta que siempre podrá ver el estado actual de su entrenamiento ingresando a la opción Agentes / Mi puntuación.

  1. Debe informar un lote de 20 productos recibidos desde un eslabón anterior.
  2. Debe informar un lote de 20 productos como entrega de producto en carácter de devolución.
  3. Debe informar un lote de 20 productos como robados / extraviados.
  4. Debe informar un lote de 20 productos como vencidos.
  5. Debe informar un lote de 8 productos como DEVOLUCION POR PROHIBICION.

Ver también  Instructivo Farmacias

Agentes de prueba

GLNTipo de Agente
GLNWSLABORATORIO
9999999999918Laboratorio
9999999999925Distribuidora
9999999999932Operador Logístico
9999999999949Droguería
9999999999956Farmacia
9999999999963Establecimiento Asistencial
9999999999970Laboratorio de Mezcla

Transacciones No Confirmadas

Según la documentación de la v2, el método GetTransaccionesNoConfirmadas:

  • Trae un listado de las transacciones donde el agente es el destino y no están confirmadas por el agente receptor.
  • El usuario (laboratorio/droguería/operador logístico/farmacia) mediante esta capacidad, puede ver todas las transacciones donde el es el destino, y no están confirmadas. Mediante este listado se obtienen los números de transacción individual (a nivel medicamento seriado) para poder invocar la capacidad de confirmar o alertar transaccion.

A modo de ejemplo, se copia a continuación la tabla que devuelve la consulta de transacciones no confirmadas al 25 de febrero de 2012 en el ambiente de pruebas (resumida y simplificada por cuestiones de espacio):

_gtin_lote_numero_serial_id_transaccion_estado_f_transaccion_d_evento_gln_origen_gln_destino
07795360005385 412568 1200 5114793 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07795347900511 412568 1200 5114796 Informada 19/02/2013 ENVIO... 9992105600005 glnws
00121231323232 412568 1200 5114798 Informada 19/02/2013 ENVIO... 9992105600005 glnws
55564646464645 412568 1200 5114801 Informada 19/02/2013 ENVIO... 9992105600005 glnws
55564646464645 412568 1200 5114806 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07795349010010 412568 1200 5114808 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07798113890290 412568 1200 5114810 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07795349169589 412568 1200 5114813 Informada 19/02/2013 ENVIO... 9992105600005 glnws
77956464646464 412568 1200 5114815 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07795349169190 412568 1200 5114818 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07798144340010 412568 1200 5114821 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07795384000021 412568 1200 5114824 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07795368001228 12569 1201 5114851 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07795347901006 12569 1001 5114855 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07798112990151 12569 1200 5114858 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07798112990304 12569 1200 5114866 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07798112990281 12569 1200 5114868 Informada 19/02/2013 ENVIO... 9992105600005 glnws
07798112990335 12569 1200 5114873 Informada 19/02/2013 ENVIO... 9992105600005 glnws
08470008243426 68 121 5139846 Informada 25/02/2013 ENVIO... 7795366000001 glnws
08470008243426 68 135 5139860 Informada 25/02/2013 ENVIO... 7795366000001 glnws
08470008243426 68 134 5139859 Informada 25/02/2013 ENVIO... 7795366000001 glnws
07790375000295 2012 7790123456000 5140385 Informada 25/02/2013 ENVIO... 7798142290009 glnws
07790375000295 2012 7790123456001 5140386 Informada 25/02/2013 ENVIO... 7798142290009 glnws
07790375000295 2012 7790123456002 5140387 Informada 25/02/2013 ENVIO... 7798142290009 glnws
07795366452732 0015 1501 5141722 Informada 25/02/2013 ENVIO... 7795366000001 glnws
07795366452732 0015 1502 5141723 Informada 25/02/2013 ENVIO... 7795366000001 glnws
07795366452732 0015 1503 5141724 Informada 25/02/2013 ENVIO... 7795366000001 glnws
07795366454545 0206 5013 5142011 Informada 25/02/2013 ENVIO... 7795366000001 glnws
07795366454545 0206 5020 5142018 Informada 25/02/2013 ENVIO... 7795366000001 glnws
07795366454545 0206 5011 5142009 Informada 25/02/2013 ENVIO... 7795366000001 glnws
06554847518371 123456 1219 5142437 Informada 25/02/2013 ENVIO... 9992105600005 glnws
06554847518371 123456 1218 5142436 Informada 25/02/2013 ENVIO... 9992105600005 glnws
06554847518371 123456 1217 5142435 Informada 25/02/2013 ENVIO... 9992105600005 glnws
07795347000037 123456 1207 5142522 Informada 25/02/2013 ENVIO... 9992105600005 glnws
07795347000037 123456 1208 5142523 Informada 25/02/2013 ENVIO... 9992105600005 glnws
07795347000037 123456 1209 5142524 Informada 25/02/2013 ENVIO... 9992105600005 glnws
07749583345148 12345 1203 5142711 Informada 25/02/2013 ENVIO... 9992105600005 glnws
07749583345148 12345 1202 5142710 Informada 25/02/2013 ENVIO... 9992105600005 glnws
07749583345148 12345 1201 5142709 Informada 25/02/2013 ENVIO... 9992105600005 glnws
07795306206722 2000 7795123456000 5142759 Informada 25/02/2013 ENVIO... 7798142290009 glnws
07795306206722 2000 7795123456002 5142761 Informada 25/02/2013 ENVIO... 7798142290009 glnws
07795306206722 2000 7795123456003 5142762 Informada 25/02/2013 ENVIO... 7798142290009 glnws

Ver tabla completa adjuntada en: trazamed_ej_pyafipws_transacciones_no_confirmadas.xls Download

Nota: al momento de su evaluación, algunas transacciones listadas en esta tabla pueden estar ya confirmadas / alertadas o canceladas. Se recomiendo obtener una tabla actualizada (como se describe en las secciones previas) o consultarnos (ver soporte abajo).

Errores

Fallas SOAP (SoapFault) en atributo Excepcion:

  • soap:Server: La aplicacion usuario:"testwservice" intento ingresar con el password invalido:"testwservicepsw": verificar atributos Username, Password y url en Conectar (ambiente testing o producción)
  • soap:Server: La aplicacion usuario:"testwservice" no esta registrado en el sistema: verificar atributos Username, Password y url en Conectar (ambiente testing o producción)
  • ns1:InvalidSecurity: An error was discovered processing the <wsse:Security> header: ha proporcionado incorrectamente las credenciales de acceso o la biblioteca no soporta los encabezados de seguridad requeridos.
  • soap:Server: Error grave: null: por lo visto, si no se especifica criterio de búsqueda o el criterio es muy amplio el webservice está devolviendo este error. En GetTransaccionesWS especificar al menos los parámetros de fechas (fecha_desde_op y fecha_hasta_op, ver  ejemplo completo en VB)

Errores Internos del webservice en atributo Errores (lista):

  • 1: Error de autentificacion, verifique el usuario y/o contrase?a.: verificar usuario y contraseña pasada al método SendMedicamentos (para testing es "pruebasws1" "pruebasws")
  • 3014: No puede informar mas de una vez el mismo evento para el mismo número de serie.: verifique los datos enviados (numero_serial), solo se puede enviar los requerimientos una vez.
  • No ha informado la recepcion del medicamento que desea enviar: en ocasiones sucedía por una falla interna de los servidores, si se ha informado la recepción con SendMedicamentos, consultar con los técnicos de PAMI/ANMAT:  contactotrazabilidad@pami.org.ar
  • -20001: ORA-20001: ERROR al intentar guardar informacion de auditoria: ORA-01653: no se ha podido ampliar la tabla TRAZAMED.AU_WS_INFORM_AGENTE con 8192 en el tablespace TS_DATA -06512: en "TRAZAMED.TR_AU_WS_INFORME_AGENTE", línea 118 ORA-04088: error durante la ejecución del disparador 'TRAZAMED.TR_AU_WS_INFORME_AGENTE' TRYVADA 30 CMPR REC serie: 1300178000 son errores internos del servidor de ANMAT, suele solucionarse automáticamente (reportado 9 de mayo de 2013)

El atributo Errores contendrá una lista con el código y mensaje de error devuelto por el webservice, se puede recorrer uno a uno:

' recorro y muestro los errores
For Each er In TrazaMed.Errores
    MsgBox er, vbExclamation, "Error"
Next

Se puede recorrer la lista o llamar a LeerError() que irá devolviendo cada error uno por uno, retornando cadena vacía al finalizar, ejemplo:

' obtengo el error (si hay)
er = TrazaMed.LeerError()
Do While er <> ""
    MsgBox er, vbExclamation, "Error"
    er = TrazaMed.LeerError()   ' obtengo el proximo error (si hay)
Next

Errores frecuentes para SendMedicamentos (en general, revisar código de operación, datos del medicamento, etc.):

  • 3023: No se puede informar envios o recepciones entre un mismo agente GTIN: 000000000GTIN1 SERIE: ...
  • 2009: El campo GLN_DESTINO no tiene un formato valido. GTIN: 000000000GTIN1 SERIE: ...
  • 3022: El campo numero serial no tiene un valor correcto, verifiquelo. GTIN: 000000000GTIN1 SERIE: ...
  • 2009: El campo GLN_DESTINO no tiene un formato valido. GTIN: 000000000GTIN1 SERIE: ...
  • 3021: El medicamento que desea recibir ya lo informo como recibido.
  • 3010: El gln origen o el gln destino debe corresponderse con el gln del agente asignado a su usuario. verifiquelo. GTIN: 000000000GTIN1 SERIE: ...
  • 3019 No ha informado la recepcion del medicamento que desea enviar.

Errores de formato (ahora usar letra + 4 dígitos punto de venta + 8 digitos numero de comprobante, ejemplo: "A000100000001")

  • 2038: El campo N_REMITO no tiene la longitud deseada. [Long: 13]
  • 2039: El campo N_FACTURA no tiene la longitud deseada. [Long: 13]
  • 2039: El campo nro factura no tiene un valor valido.

Ejemplos para los métodos de confirmación:

  • 3: Transaccion NO encontrada, NO se puede anular. (en SendCancelacTransacc)
  • 10001: El ID de Transaccion indicado no existe. No es posible Confirmar la misma. (en SendConfirmaTransacc)
  • 10001: El ID de Transaccion indicado no existe. No es posible Alertar la misma. (en SendAlertaTransacc)

Novedades

Se recuerda que esta disponible el  grupo de noticias ( http://groups.google.com.ar/group/pyafipws) donde se publicarán futuras novedades sobre PyAfipWS: servicios web de factura electrónica y sus interfases (se recomienda suscribirse)

Historial de cambios:

  • Mayo de 2014: Se agregan metodos GetTransaccionesWS y GetCatalogoElectronicoByGTIN.
  • Febrero de 2014: Se agregan cambios por actualización de especificación técnica ANMAT al 30/01/2014 (método GetTransaccionesNoConfirmadas: nuevos parametros lote, numero_serial, y respuesta con _id_estado en TransaccionPlainWS)
  • Septiembre de 2013: Se agregan archivos de intercambio (dbf, txt, json) y métodos v2: SendCancelacTransaccParcial y GetEnviosPropiosAlertados
  • Febrero de 2013: Se agrega v2: SendConfirmaTransacc, SendAlertaTransacc y GetTransaccionesNoConfirmadas
  • Agosto de 2012: Se agrega SendMedicamentosFraccion para enviar cantidad
  • Agosto de 2012: Se agrega nro_asociado para enviar el numero de afiliado a la obra social
  • Junio de 2012: Se agrega soporte para librería de tipos (TypeLib o TLB)
  • Mayo de 2012: Se agrega soporte para Visual Fox Pro
  • Enero de 2011: Mejoras en la captura de errores
  • Diciembre de 2011: Se agrega SendCancelacTransacc y SendMedicamentosDHSerie
  • Noviembre de 2011: Versión inicial

Implementación del sistema de trazabilidad para productos críticos:

Etapa 1:

  • Desde LABORATORIO hasta DROGUERIA: Hasta SEIS (6) MESES a partir del 15/06/2011
  • Desde DROGUERIA hasta FARMACIA: Hasta SEIS (6) MESES a partir del 15/06/2011

Etapa 2: VALIDACION DEL SISTEMA desde:

  • LABORATORIO TITULAR  DISTRIBUIDORA  DROGUERIA  FARMACIA/ESTABLECIMIENTO ASISTENCIAL  PACIENTE: Hasta DOCE (12) MESES a partir del 15/06/2011

IDL y TLB (libreria de tipos) para lenguajes estáticos

Liberamos una versión del instalador para Trazabilidad de ANMAT con el archivo TrazaMed.TLB (Type Library)para usar en Clarion y otros lenguajes estáticos:

http://www.sistemasagiles.com.ar/soft/pyafipws/instalador-TrazaMed-1.05a-tlb-homo.exe

Luego de instalar, deben registrar el tlb ejecutando

C:\Archivos de Programa\TrazaMed\TrazaMed.EXE --register

El IDL fuente está publicado en:

 https://github.com/reingart/pyafipws/blob/master/typelib

IMPORTANTE: el TLB no sirve para la versión normal previa, solo se debe usar con este instalador y viceversa.

Si lo usan con Visual Basic, deben ir a Referencias y agregar el archivo TLB, y luego cambiar la definición:

Dim TrazaMedObj As TrazaMed

La única diferencia con la versión estandard sin TLB, es que se activa el autocompletado y tips de llamadas (información de metodos y parámetros estáticos), pero no hay parámetros opcionales (deben completarlos con string vacios "") y se pierde las funcionalidades dinámicas (deben pasar practicamente todo como string)

Costos y Condiciones

Por soporte comercial consultar al (011) 4450-0716 o (011) 15-3048-9211 o por mail a  info@sistemasagiles.com.ar

Costos de soporte estimativos (puede variar dependiendo de las necesidades de cada implementación puntual):

  • Soporte Mínimo: $1500+IVA (2 semanas máx., hasta 2 hs en total, solo instalación y acceso a actualizaciones por correcciones generales)
  • Soporte Básico: $4640+IVA (1 mes máx., hasta 4 hs en total, solo ajustes y consultas menores)
  • Soporte Avanzado: desde $6960+IVA (2 meses máx., hasta 8 hs en total, incluyendo modificaciones y desarrollo de ejemplos, documentación, pruebas, etc., contempla temas urgentes y/o grandes empresas/ciclos de desarrollo)
  • Soporte por actualización: desde $1260+IVA (1 semana máx., hasta 1 hs en total, solo instalación y acceso a actualizaciones por correcciones generales), aplica a la versión 2 para clientes previos.

Para soporte sin cargo de la comunidad, revisar la  lista de temas y/o  crear uno nuevo. Por novedades y consultas genereales, puede usar el  Google Groups (Foro Público). Código fuente en  GitHub.

Más información en PyAfipWs

MarianoReingart MarianoReingart

Attachments