Packages

Conversión de CFDI XML a estructura tipo JSON

Current section

Files

Jump to
cfdi_xml lib cfdi xml utils.ex
Raw

lib/cfdi/xml/utils.ex

defmodule Cfdi.Xml.Utils do
@moduledoc """
Helpers puntuales para la construcción de XML CFDI.
Mirror de `packages/cfdi/xml/src/utils/*` en el ecosistema Node.
"""
@doc """
Ordena un mapa dado un listado de llaves. Las llaves no listadas preservan
su orden relativo al final.
"""
@spec sort_object(map(), [atom() | String.t()]) :: [{atom() | String.t(), any()}]
def sort_object(map, order) when is_map(map) and is_list(order) do
ordered =
Enum.reduce(order, [], fn key, acc ->
case Map.fetch(map, key) do
{:ok, v} -> [{key, v} | acc]
:error -> acc
end
end)
|> Enum.reverse()
rest =
map
|> Enum.reject(fn {k, _} -> k in order end)
ordered ++ rest
end
@doc """
Une un listado de URIs en el formato requerido por `xsi:schemaLocation`
(separados por espacio).
"""
@spec schema_build([String.t()]) :: String.t()
def schema_build(locations) when is_list(locations) do
locations
|> Enum.reject(&(&1 in [nil, ""]))
|> Enum.uniq()
|> Enum.join(" ")
end
end