Sistema de Integración (SID)

Una Interfaz de programación de aplicaciones API (del inglés Application Programming Interface) ha sido uno de los mayores y mas beneficiosos proyectos para las empresas grandes en los últimos tiempos,  por el hecho de que permite a cualquier desarrollador crear aplicaciones y aportar a las que ya se tienen. De esta manera los usuarios pueden tener una mayor variedad de aplicaciones, obteniendo resultado que se pueden acomodar a la medida de cada uno.

El SID (Sistema de Integración Defontana) nace en este contexto, de manera que desarrolladores y clientes lo podrán utilizar, para crear sus propias aplicaciones.

Contenidos

 

 

Preguntas Frecuentes


¿Qué es SID?

SID es la API que Defontana ofrece a sus clientes, para que estos puedan realizar las aplicaciones que más le acomoden, interactuando de una manera estandarizada. Este contiene una gran cantidad de métodos que permiten realizar un proceso dentro del sistema Defontana.

EL SID está compuesto por un conjunto de funciones (métodos), los cuales se presentan un documento técnico en detalle.

 

¿Cómo Funciona?

Al cliente, usuario o desarrollador que esté interesado en utilizar el SID, se le entregan los datos de conexión a un ambiente de pruebas. Con esto se podrá conectar al SID. Al conectarse y establecer la referencia al SID, se podrán visualizar los métodos como si estuvieran en la máquina local.

¿Qué aplicaciones Puedo Crear?

Se pueden crear todas las aplicaciones que se ocurran, relacionadas con las Cotizaciones y Pedidos. Desde aplicaciones móviles, hasta de escritorio.

Consideraciones


Sesión

La sesión es manipulada por el servicio mediante un objeto de tipo Sesion (no confundir con el objeto Session) para identificar en todo momento al usuario, la empresa y el cliente que está operando con el sistema.  De esta manera el servicio puede validar niveles de acceso de los usuarios a cada método expuesto.

Esta sesión no tiene tiempo de expiración.  Solo se expira cuando:

  1. Se invoca al método Logout.
  2. Se inicia sesión con el mismo usuario, empresa y cliente desde otra ubicación.

Se recomienda mantener esta sesión a lo largo de todo el ciclo de operación del usuario con el sistema y evitar iniciar una sesión por cada acción realizada por el usuario, lo cual implicaría un deterioro notable en el desempeño del servicio.

Excepciones

Los métodos expuestos por este servicio consideran el flujo normal de ejecución de cada tarea a ejecutar, es por esto que cualquier situación fuera de este flujo normal lanzará una excepción indicando las razones que la provocaron.

Es por esto que se recomienda encerrar la llamada a los métodos en un bloque de control de excepciones (Ej.: try… catch…).

Fechas nulas

Las fechas cuyo valor sea “01-01-0001” deben ser consideradas como nulas (NULL o NOTHING).

Volver al inicio

 

Plataformas

Modo de Operación


La forma de operar con este webservice simula la forma de operar con el ERP.

1. Se debe crear una referencia al servicio web:

Dim ws As New ServiceClient()

2. Iniciar una sesión: De la misma forma en que se inicia sesión en el sistema, se debe enviar el código del cliente, del usuario y la contraseña al servidor.  El método Login acepta estos parámetros y retorna un objeto de tipo Sesion, el que debe ser usado para invocar todos los métodos.

Dim sesion As Sesion
sesion = ws.Login( "CODIGO_CLIENTE", "CODIGO_USUARIO", "PASSWORD", "IP_ORIGEN")

3. Seleccionar una empresa: Al iniciar una sesión en el sistema, es importante seleccionar una empresa, ya que el 90% de los datos ingresados están asociados directamente con una empresa.

    1. Para ver las empresas que tiene el cliente se debe invocar el método GetEmpresas:
Dim empresas As Empresa()
empresas = ws.GetEmpresas(sesion)

b. Para asignarle una empresa a una sesión, se debe asignar el código de la empresa al atributo.

sesion.IDEmpresa = empresas(0).IDEmpresa
sesion.IDEmpresa = "CODIGO_EMPRESA"

4. Operar con el sistema: Una vez iniciada la sesión y seleccionada la empresa se pueden ejecutar los otros métodos.  El sistema será capaz de determinar el nivel de acceso que el usuario tenga a cada método y arrojará excepciones indicando mensajes ante cualquier situación que salga del curso normal de ejecución del método.

Dim sesion As Sesion
    Dim ws As New ServiceClient

    Dim cot97754 As Cotizacion
    Dim cot97755 As Cotizacion
    Dim cot97756 As Cotizacion
    Dim cot97757 As Cotizacion
    Dim cot97758 As Cotizacion
    Dim cotizaciones() As Cotizacion
    Dim nuevaCotizacion As Cotizacion

    Dim nuevoDetalles As List(Of CotizacionDetalle)
    Dim nuevoRecargosDescuentos As List(Of CotizacionRecargoDescuento)
    Dim nuevoImpuestos As List(Of DetalleImpuesto)
    Dim nuevoTasas As List(Of CotizacionTasa)

    Try
        sesion = ws.Login("ASPDEFONTANA", "ASPDEFONTANA", "2", "")
        sesion.IDEmpresa = "ASPDEFONTANA"

        cot97754 = ws.GetCotizacion(sesion, 97754)
        cot97755 = ws.GetCotizacion(sesion, 97755)
        cot97756 = ws.GetCotizacion(sesion, 97756)
        cot97757 = ws.GetCotizacion(sesion, 97757)
        cot97758 = ws.GetCotizacion(sesion, 97758)

        ' MODIFICACIÓN
        cot97754.MotivoRechazo = "CAMBIA EL MOTIVO DEL RECHAZO " & Date.UtcNow()
        cot97754.Observacion = "CAMBIA LA OBSERVACION " & Date.UtcNow()
        ws.ModificaCotizacion(sesion, cot97754)

        cot97756.Estado = EstadoCotizacion.PENDIENTE

        ' ELIMINACIÓN
        ws.EliminaCotizacion(sesion, cot97756)

        ' CAMBIO DE ESTADO
        ws.CambiaEstadoCotizacion(sesion, cot97756, EstadoCotizacion.RECHAZADA)


        ' GRABACIÓN.  Copio los datos de una cotización existente pero la grabo como una nueva.
        nuevaCotizacion = New Cotizacion()
        nuevaCotizacion.Afecto = cot97756.Afecto
        nuevaCotizacion.Total = cot97756.Total
        nuevaCotizacion.Estado = cot97756.Estado
        nuevaCotizacion.Exento = cot97756.Exento
        nuevaCotizacion.Fecha = cot97756.Fecha
        nuevaCotizacion.FechaCierre = cot97756.FechaCierre
        nuevaCotizacion.FechaExpiracion = cot97756.FechaExpiracion
        nuevaCotizacion.IDCondicionPago = cot97756.IDCondicionPago
        nuevaCotizacion.IDContactoFicha = cot97756.IDContactoFicha
        nuevaCotizacion.IDEmpresa = cot97756.IDEmpresa
        nuevaCotizacion.IDFichaCliente = cot97756.IDFichaCliente
        nuevaCotizacion.IDListaPrecio = cot97756.IDListaPrecio
        nuevaCotizacion.IDMoneda = cot97756.IDMoneda
        nuevaCotizacion.TasaCambio = cot97756.TasaCambio
        nuevaCotizacion.IDTipoDocumento = cot97756.IDTipoDocumento
        nuevaCotizacion.IDVendedor = cot97756.IDVendedor
        nuevaCotizacion.MotivoRechazo = cot97756.MotivoRechazo
        nuevaCotizacion.Subtotal = cot97756.Subtotal
        nuevaCotizacion.Numero = 0 ' Asigno 0 para que el sistema asigne el último disponible.
        nuevaCotizacion.Observacion = cot97756.Observacion
        nuevaCotizacion.RecargoDescuento = cot97756.RecargoDescuento

 ' Creo un nuevo arreglo con la cantidad de elementos a contener.       
 nuevoDetalles = New List(Of CotizacionDetalle)(cot97756.Detalles.Length)

        For Each detalle As CotizacionDetalle In cot97756.Detalles
            Dim nuevoDetalle As New CotizacionDetalle With {
                .Cantidad = detalle.Cantidad,
                .Comentario = detalle.Comentario,
                .FechaEntrega = detalle.FechaEntrega,
                .IDProducto = detalle.IDProducto,
                .LineaDetalle = detalle.LineaDetalle,
                .PrecioUnitario = detalle.PrecioUnitario,
                .RecargoDescuento = detalle.RecargoDescuento,
                .SubTotal = detalle.SubTotal,
                .Tipo = detalle.Tipo,
                .TipoRecargoDescuento = detalle.TipoRecargoDescuento
            }

            nuevoDetalles.Add(nuevoDetalle)
        Next
        nuevaCotizacion.Detalles = nuevoDetalles.ToArray()

         ' Creo un nuevo arreglo con la cantidad de elementos a contener.
        nuevoImpuestos = New List(Of DetalleImpuesto)(cot97756.Impuestos.Length)

        For Each impuesto As DetalleImpuesto In cot97756.Impuestos
            Dim nuevoImpuesto As New DetalleImpuesto With {
                .IDImpuesto = impuesto.IDImpuesto,
                .MontoImpuesto = impuesto.MontoImpuesto,
                .PorcentajeImpuesto = impuesto.PorcentajeImpuesto
            }
            nuevoImpuestos.Add(nuevoImpuesto)
        Next
        nuevaCotizacion.Impuestos = nuevoImpuestos.ToArray()

         ' Creo un nuevo arreglo con la cantidad de elementos a contener.
        nuevoRecargosDescuentos = New List(Of CotizacionRecargoDescuento)(cot97756.RecargosDescuentos.Length)

        For Each rd As CotizacionRecargoDescuento In cot97756.RecargosDescuentos
            Dim nuevoRD As New CotizacionRecargoDescuento With {
                .Linea = rd.Linea,
                .Monto = rd.Monto,
                .Nombre = rd.Nombre,
                .Porcentaje = rd.Porcentaje,
                .TipoRecargoDescuento = rd.TipoRecargoDescuento
            }
            nuevoRecargosDescuentos.Add(nuevoRD)
        Next
        nuevaCotizacion.RecargosDescuentos = nuevoRecargosDescuentos.ToArray()

         ' Creo un nuevo arreglo con la cantidad de elementos a contener.
        nuevoTasas = New List(Of CotizacionTasa)(cot97756.Tasas.Length)

        For Each t As CotizacionTasa In cot97756.Tasas
            Dim nuevoT As New CotizacionTasa With {
                .IDMoneda = t.IDMoneda,
                .Tasa = t.Tasa
            }
            nuevoTasas.Add(nuevoT)
        Next
        nuevaCotizacion.Tasas = nuevoTasas.ToArray()

        ws.GrabaCotizacion(sesion, nuevaCotizacion)

        ' CAMBIOS DE ESTADO
        ws.CambiaEstadoCotizacion(sesion, cot97757, EstadoCotizacion.RECHAZADA)
        ws.CambiaEstadoCotizacion(sesion, cot97758, EstadoCotizacion.PENDIENTE)

        ' CONSULTAS VARIAS
        Console.WriteLine("CONSULTA ESTADO RECHAZADO.")
        cotizaciones = ws.GetCotizaciones(sesion, EstadoCotizacion.RECHAZADA, Nothing, Nothing, Nothing, Nothing, Nothing)
        If cotizaciones.Length = 0 Then
            Console.WriteLine("No se han encontrado cotizaciones.")
        Else
            For Each cotizacion In cotizaciones
                Console.WriteLine("cotizacion #{0} para el cliente {1} por un monto de ${2}.", cotizacion.Numero, cotizacion.IDFichaCliente, cotizacion.Total)
            Next
        End If

        Console.WriteLine("CONSULTA FECHA COTIZACION.")
        cotizaciones = ws.GetCotizaciones(sesion, Nothing, Nothing, Nothing, "2009-10-07", Nothing, Nothing)
        If cotizaciones.Length = 0 Then
            Console.WriteLine("No se han encontrado cotizaciones.")
        Else
            For Each cotizacion In cotizaciones
                Console.WriteLine("cotizacion #{0} para el cliente {1} por un monto de ${2}.", cotizacion.Numero, cotizacion.IDFichaCliente, cotizacion.Total)
            Next
        End If


        Console.WriteLine("CONSULTA NUMERO COTIZACION.")
        cotizaciones = ws.GetCotizaciones(sesion, Nothing, 94084, Nothing, Nothing, Nothing, Nothing)
        If cotizaciones.Length = 0 Then
            Console.WriteLine("No se han encontrado cotizaciones.")
        Else
            For Each cotizacion In cotizaciones
                Console.WriteLine("cotizacion #{0} para el cliente {1} por un monto de ${2}.", cotizacion.Numero, cotizacion.IDFichaCliente, cotizacion.Total)
            Next
        End If

        ws.Logout(sesion)

    Catch ex As Exception

        Console.WriteLine("Ha ocurrido el siguiente error:")
        Console.WriteLine(ex.Message)

    Finally

        If ws.State = CommunicationState.Opened Then ws.Close()

        ws = Nothing
        sesion = Nothing

    End Try

    5. Finalizar la sesión:

ws.Logout(sesion)