Visma.Api (Visma v0.1.0)

Visma API Elixir implementation. This module offers a way to play with visma API. It has been tested on the demo API, and should work as well on the main one. This is a low level interface, you should probably use other module to directly craft the correct request.

Link to this section Summary

Functions

TODO: not tested yet.

TODO: not tested yet.

Cancel a transaction. The transaction id can be found with get_signing_status/2 function.

TODO: not tested yet.

TODO: not tested yet.

Get all running campaigns.

TODO: not tested yet.

TODO: not tested yet.

Get signing state of a specific signature.

Get the signing status of each documents. A transaction id is associated with each of them, and can be cancelled with cancel_transaction/2 function.

Returns a signing template available. A signing template is needed when using initiate_signing/2 function. Choose one method, and extract its id.

TODO: not tested yet.

Initiate a new campaign.

This function initiate a signing procedure by sending information about a sender, a list of recipients and a list of document.

Similar than login/2 except it requires a token to be set.

Log to Visma API using email and password as credentials. A valid connection returns a token. Be careful, the token has a limited lifetime, if you are reusing it, you should ensure it is still valid.

Initialize a new Visma.Api data-structure used to generate request. By default, the base_url key is initialized using environment but it can be bypassed by using new/1 function.

Prepare a request by adding a token or any mandatory elements.

Send a request and wait for its response. It automatically uses prepare/1 function to prepare the request. Reponse is parsed using parse_response/1 internal function.

Link to this section Types

Link to this type

add_user_to_group_arguments()

@type add_user_to_group_arguments() :: [email: email(), group_id: integer()]
Link to this type

campaign_name()

@type campaign_name() :: String.t()
Link to this type

cancel_signing_arguments()

@type cancel_signing_arguments() :: [{:signing_token, signing_token()}]
Link to this type

cancel_transaction_arguments()

@type cancel_transaction_arguments() :: [{:transaction_token, token()}]
Link to this type

create_group_arguments()

@type create_group_arguments() :: [name: String.t(), description: String.t()]
Link to this type

create_user_arguments()

@type create_user_arguments() :: [
  email: email(),
  language_id: integer(),
  phone: String.t(),
  role_id: integer(),
  send_welcome_email: boolean()
]
@type document() :: map()
@type documents() :: [document(), ...]
@type email() :: String.t()
Link to this type

get_campaigns_arguments()

@type get_campaigns_arguments() :: [{:reference, token()}]
Link to this type

get_rejection_comment_arguments()

@type get_rejection_comment_arguments() :: [{:signing_token, signing_token()}]
Link to this type

get_signing_arguments()

@type get_signing_arguments() :: [{:signing_token, signing_token()}]
Link to this type

get_signing_status_arguments()

@type get_signing_status_arguments() :: [{:signing_token, signing_token()}]
Link to this type

get_template_messages_arguments()

@type get_template_messages_arguments() :: [{:template_id, Ecto.UUID.t()}]
@type group_id() :: Ecto.UUID.t()
Link to this type

group_name()

@type group_name() :: String.t()
Link to this type

initiate_campaign_arguments()

@type initiate_campaign_arguments() :: [
  signing_template_id: Ecto.UUID.t(),
  recipients: [],
  site: String.t(),
  transaction_state_change_url: String.t(),
  last_reminder: integer(),
  signing_method: integer()
]
Link to this type

initiate_signing_arguments()

@type initiate_signing_arguments() :: [{:signing_request, map()}]
Link to this type

login_arguments()

@type login_arguments() :: [email: email(), password: password()] | Keyword.t()
@type name() :: String.t()
@type options() :: Keyword.t()
@type password() :: String.t()
@type recipient() :: map()
Link to this type

recipients()

@type recipients() :: [recipient(), ...]
@type sender() :: Visma.Api.Types.Sender.sender()
Link to this type

signing_token()

@type signing_token() :: Ecto.UUID.t()
Link to this type

template_id()

@type template_id() :: Ecto.UUID.t()
@type token() :: Ecto.UUID.t()
Link to this type

transaction_token()

@type transaction_token() :: Ecto.UUID.t()
@type user_name() :: String.t()

Link to this section Functions

Link to this function

add_user_to_group(api, args)

@spec add_user_to_group(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  add_user_to_group_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

TODO: not tested yet.

examples

Examples

Link to this function

cancel_signing(api, args)

@spec cancel_signing(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  cancel_signing_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

TODO: not tested yet.

examples

Examples

Link to this function

cancel_transaction(api, args)

@spec cancel_transaction(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  cancel_transaction_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Cancel a transaction. The transaction id can be found with get_signing_status/2 function.

examples

Examples

Link to this function

create_group(api, args)

@spec create_group(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  create_group_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

TODO: not tested yet.

examples

Examples

Link to this function

create_user(api, args)

@spec create_user(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  create_user_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

TODO: not tested yet.

examples

Examples

Link to this function

get_campaigns(api, args)

@spec get_campaigns(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  get_campaigns_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Get all running campaigns.

examples

Examples

Link to this function

get_groups(api)

@spec get_groups(%Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

TODO: not tested yet.

examples

Examples

Link to this function

get_rejection_comment(api, args)

@spec get_rejection_comment(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  get_rejection_comment_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

TODO: not tested yet.

examples

Examples

Link to this function

get_signing(api, args)

@spec get_signing(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  get_signing_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Get signing state of a specific signature.

examples

Examples

iex> api = Visma.Api.new()
iex> request = Visma.Api.get_signing_arguments(token: "my-token", signing_token: "my-signing-token")
iex> Visma.Api.send(request)
Link to this function

get_signing_status(api, args)

@spec get_signing_status(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  get_signing_status_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Get the signing status of each documents. A transaction id is associated with each of them, and can be cancelled with cancel_transaction/2 function.

examples

Examples

Link to this function

get_signing_templates(api)

@spec get_signing_templates(%Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Returns a signing template available. A signing template is needed when using initiate_signing/2 function. Choose one method, and extract its id.

example

example

iex> api = Visma.Api.new()
iex> request = Visma.Api.get_signing_templates(api, token: "my_token")
iex> Visma.Api.send(request)
{:ok, %{ "SigningTemplateItems" => templates }}
Link to this function

get_template_messages(api, args)

@spec get_template_messages(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  Keyword.t()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

TODO: not tested yet.

examples

Examples

Link to this function

initiate_campaign(api, args)

@spec initiate_campaign(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  initiate_campaign_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Initiate a new campaign.

examples

Examples

Link to this function

initiate_signing(api, args)

@spec initiate_signing(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  initiate_signing_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

This function initiate a signing procedure by sending information about a sender, a list of recipients and a list of document.

example

example

iex> signing = Visma.Signing.new()
iex> signing = Visma.Signing.request(signing,
  signing_template_id: "template_id"
)
iex> signing = Visma.Signing.sender(signing, ...)
iex> signing = Visma.Signing.document(signing, ...)
iex> signing = Visma.Signing.recipient(signing, ...)
iex> signing_map = Visma.Signing.to_map(signing)
iex> api = Visma.Api.new()
iex> request = Visma.Api.initiate_signing(api,
  token: "my-token",
  signing_request: signing_map
)
iex> Visma.Api.send(request)
Link to this function

login2(api, args)

@spec login2(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  login_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Similar than login/2 except it requires a token to be set.

examples

Examples

iex> api = Visma.Api.new()
iex> request = Visma.Api.login(api,
  email: "foo@bar.com",
  password: "my_password"
)
iex> prepared_request = Visma.Api.prepare(request, token: token)
iex> Visma.Api.send(prepared_request)
{:ok, "00000000-0000-0000-0000-000000000000"}
Link to this function

login(api, args)

@spec login(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  login_arguments()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Log to Visma API using email and password as credentials. A valid connection returns a token. Be careful, the token has a limited lifetime, if you are reusing it, you should ensure it is still valid.

example

example

Simple example, change with the correctly values.

iex> api = Visma.Api.new()
iex> request = Visma.Api.login(api,
  email: "foo@bar.com",
  password: "my_password"
)
iex> prepared_request = Visma.Api.prepare(request)
iex> Visma.Api.send(prepared_request)
{:ok, "00000000-0000-0000-0000-000000000000"}

A Working example with demo credentials from official. It will return a valid token.

iex> api = Visma.Api.new(base_url: "https://demo.vismaaddo.net/WebService/v2.0/restsigningservice.svc")
iex> request = Visma.Api.login(api,
  email: "fake.email.for.api.test@visma.com",
  password: Base.decode64!("c/SjPSMTRcZW1yzcvs6qdUOrnx4GyHoH0fyD0h9XnAAYP7PP/sNgTjKDMSUGlZAXB+ZFmm20JWK6hrsgJHsGYw=="),
  password_is_base64: true)
)
iex> Visma.Api.send(request)
{:ok, "00000000-0000-0000-0000-000000000000"}

Using an invalid email

iex> api = Visma.Api.new()
iex> request = Visma.Api.login(api,
  email: "invalid@email.com",
  password: "test"
)
iex> Visma.Api.send(request)
{:error, [%{"FaultCode" => 900, "Reason" => "Invalid email"}]}
@spec new() :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Initialize a new Visma.Api data-structure used to generate request. By default, the base_url key is initialized using environment but it can be bypassed by using new/1 function.

TODO: sanitize base_url field

examples

Examples

iex> Visma.Api.new()

iex> Visma.Api.new(base_url: "http://my-url.com/api")

@spec new(Keyword.t()) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}

Prepare a request by adding a token or any mandatory elements.

Link to this function

prepare(api, args)

@spec prepare(
  %Visma.Api{
    api_path: term(),
    base_url: term(),
    body: term(),
    full_url: term(),
    headers: term(),
    method: term(),
    query: term(),
    token: term(),
    token_in_body: term(),
    token_required: term()
  },
  Keyword.t()
) :: %Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}
@spec send(%Visma.Api{
  api_path: term(),
  base_url: term(),
  body: term(),
  full_url: term(),
  headers: term(),
  method: term(),
  query: term(),
  token: term(),
  token_in_body: term(),
  token_required: term()
}) :: {:ok, any()} | {:error, any()}

Send a request and wait for its response. It automatically uses prepare/1 function to prepare the request. Reponse is parsed using parse_response/1 internal function.