Current section
Files
Jump to
Current section
Files
lib/alpa/models/corporate_action.ex
defmodule Alpa.Models.CorporateAction do
@moduledoc """
Corporate action announcement model.
"""
use TypedStruct
typedstruct do
field :id, String.t()
field :corporate_action_id, String.t()
field :ca_type, String.t()
field :ca_sub_type, String.t()
field :initiating_symbol, String.t()
field :initiating_original_cusip, String.t()
field :target_symbol, String.t()
field :target_original_cusip, String.t()
field :declaration_date, Date.t()
field :ex_date, Date.t()
field :record_date, Date.t()
field :payable_date, Date.t()
field :cash, Decimal.t()
field :old_rate, Decimal.t()
field :new_rate, Decimal.t()
end
@spec from_map(map()) :: t()
def from_map(data) when is_map(data) do
%__MODULE__{
id: data["id"],
corporate_action_id: data["corporate_action_id"],
ca_type: data["ca_type"],
ca_sub_type: data["ca_sub_type"],
initiating_symbol: data["initiating_symbol"],
initiating_original_cusip: data["initiating_original_cusip"],
target_symbol: data["target_symbol"],
target_original_cusip: data["target_original_cusip"],
declaration_date: parse_date(data["declaration_date"]),
ex_date: parse_date(data["ex_date"]),
record_date: parse_date(data["record_date"]),
payable_date: parse_date(data["payable_date"]),
cash: parse_decimal(data["cash"]),
old_rate: parse_decimal(data["old_rate"]),
new_rate: parse_decimal(data["new_rate"])
}
end
defp parse_date(nil), do: nil
defp parse_date(value) when is_binary(value) do
case Date.from_iso8601(value) do
{:ok, date} -> date
_ -> nil
end
end
defp parse_decimal(nil), do: nil
defp parse_decimal(value) when is_binary(value), do: Decimal.new(value)
defp parse_decimal(value) when is_integer(value), do: Decimal.new(value)
defp parse_decimal(value) when is_float(value), do: Decimal.from_float(value)
end