defmodule Burox do @moduledoc File.read!("#{__DIR__}/../README.md") alias Burox.Request alias Burox.Request.Encoder alias Burox.Response.Parser alias Burox.Utils.Validator alias Burox.QueryResponse require Logger @doc """ Solicita la información crediticia de una persona al buró de crédito ## Examples iex> Burox.solicitar{%Burox.Request{}} {:ok, term} """ @spec solicitar(Request.t()) :: {:ok, term} | {:error, term} def solicitar(peticion) do solicitar(peticion, "507") end @doc """ Solicita la información crediticia de una persona al buró de crédito ## Examples iex> Burox.solicitar{%Burox.Request{}, "507"} {:ok, term} """ @spec solicitar(Request.t(), String.t()) :: {:ok, term} | {:error, term} def solicitar(data, codigo_producto) do response_map = %{ cadena_peticion: "", cadena_respuesta: "" } # Valida los datos de la petición with {:ok, request} <- Validator.valid?(data) do buro_service = Application.get_env(:burox, :buro_service) # Convierte la petición a una cadena de texto request_string = Encoder.encode_buro(request, codigo_producto) # Solicita el buró with {:ok, buro_response} <- buro_service.post(request_string, codigo_producto) do result = Map.merge( response_map, %{ cadena_peticion: request_string, cadena_respuesta: String.slice(buro_response, 0..-2), respuesta: Parser.process_response(buro_response) } ) |> (&struct(QueryResponse, &1)).() {:ok, result} end else {:error, errors} -> # Traduce los errores de validación de campos a un mapa. error_list = Enum.map(errors, fn {_e, k, s, v} -> {"#{k}(#{s})", v}end) {:error, Map.put(response_map, :respuesta , error_list)} end end end