DEV Community

Alexander Nitrovich
Alexander Nitrovich

Posted on • Originally published at blog.eurovalidate.com

Validate EU VAT in Elixir

Validating EU VAT numbers in real time is essential for businesses operating within the European Union to ensure regulatory compliance and accurate billing processes. If you're an Elixir developer looking to integrate VAT validation into your backend system, leveraging the EuroValidate API simplifies this process significantly. In this implementation-focused guide, we will walk you through setting up an Elixir project for VAT number validation using this developer-first API, ensuring reliability and ease of integration.

Introduction

Value Added Tax (VAT) is a key financial element for companies operating in the EU. Ensuring valid VAT numbers not only helps maintain legal compliance but also enhances the integrity of financial operations. With the concurrency advantages that Elixir offers, integrating an efficient VAT validation mechanism becomes straightforward, especially when using EuroValidate API. This API not only expedites the development process but also offers extensive documentation and support, making it a preferred choice among developers.

Prerequisites

Before diving into the code, ensure you have a basic understanding of Elixir programming, particularly around modules and functions, as well as familiarity with HTTP clients like HTTPoison. You'll also need to have the Elixir environment set up on your machine, ideally with version 1.12 or higher. A good text editor or IDE such as Visual Studio Code will increase productivity.

Setting Up Your Elixir Project

To start, create a new Elixir project:

mix new vat_validation
cd vat_validation
Enter fullscreen mode Exit fullscreen mode

Next, add HTTPoison to your dependencies in mix.exs:

defp deps do
  [
    {:httpoison, "~> 1.8"},
    {:jason, "~> 1.2"}  # For JSON parsing
  ]
end
Enter fullscreen mode Exit fullscreen mode

Run mix deps.get to fetch the necessary packages.

Integrating the VAT Validation API

Begin by obtaining your free API key from EuroValidate. Once you have your key, store it securely, preferably in an environment variable for security best practices. If you're using a Unix-based system, set the environment variable like so:

export VAT_API_KEY="your_api_key_here"
Enter fullscreen mode Exit fullscreen mode

Ensure you retrieve this key within your application using System.get_env/1.

Implementation: Validating EU VAT Numbers

Create a module VatValidator with a function to call the API:

defmodule VatValidator do
  @api_url "https://api.eurovalidate.com/v1/vat/"
  @api_key System.get_env("VAT_API_KEY")

  def validate_vat(vat_number) when is_binary(vat_number) do
    url = "#{@api_url}#{URI.encode(vat_number)}"
    headers = [
      {"Authorization", "Bearer #{@api_key}"},
      {"Content-Type", "application/json"}
    ]

    case HTTPoison.get(url, headers) do
      {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
        body |> Jason.decode!() |> parse_response()

      {:ok, %HTTPoison.Response{status_code: code}} when code in [400, 404] ->
        {:error, "Invalid VAT number or not found."}

      {:error, %HTTPoison.Error{reason: reason}} ->
        {:error, reason}
    end
  end

  defp parse_response(%{"status" => "valid", "company_name" => company_info}) do
    {:ok, company_info}
  end

  defp parse_response(_response) do
    {:error, "VAT number is not valid."}
  end
end
Enter fullscreen mode Exit fullscreen mode

This code constructs the API endpoint, handles HTTP requests, and parses the responses to distinguish between valid and invalid VAT numbers.

Handling API Responses and Error Management

Successful responses are parsed into known structures, while errors are handled gracefully. To account for potential API latency, ensure the request times out appropriately and implement a retry logic if necessary, using tools like Retry. For reliable operations, ensure logging is configured to capture error events:

Logger.error("VAT validation failed with reason: #{inspect(reason)}")
Enter fullscreen mode Exit fullscreen mode

Lastly, employ unit testing using ExUnit to automate the validation of your service:

defmodule VatValidatorTest do
  use ExUnit.Case, async: true

  test "validates a correct VAT number" do
    result = VatValidator.validate_vat("NL820646660B01")
    assert {:ok, _company} = result
  end

  test "catches an invalid VAT number" do
    result = VatValidator.validate_vat("DE89370400440532013000")
    assert {:error, _reason} = result
  end
end
Enter fullscreen mode Exit fullscreen mode

Conclusion

By completing these steps, you have integrated a reliable solution for EU VAT validation into your Elixir application. This implementation not only streamlines tax operations but also leverages a developer-first API known for its ease of use and comprehensive support. For further details, refer to the EuroValidate API documentation.

Next Steps

Ready to streamline your VAT validation process? Get started with our developer-first API today! Test your integration within the sandbox environment before moving to production, ensuring a smooth and effective deployment of your VAT validation feature.

Top comments (0)