defmodule MyApp.Users.Contract do
attributes do
# other attributes
attribute :emp_factor, :decimal, allow_nil?: false, default: Decimal.new(1)
attribute :vac_days, :decimal, allow_nil?: false, default: Decimal.new(25)
end
create :create do
primary? true
argument :user_id, :integer, allow_nil?: false
argument :emp_percent, :decimal, allow_nil?: false, default: Decimal.new(100)
end
changes do
change manage_relationship(:user_id, :user, type: :replace), on: :create
change &change_emp_factor/2
end
calculations do
calculate :vac_days_eff,
:decimal,
expr(vac_days * emp_factor)
calculate :emp_percent,
:decimal,
expr(emp_factor * 100)
end
defp change_emp_factor(changeset, _) do
case Ash.Changeset.get_argument(changeset, :emp_percent) do
nil ->
changeset
emp_percent ->
emp_factor = Decimal.div(emp_percent, 100)
Ash.Changeset.change_attribute(changeset, :emp_factor, emp_factor)
end
end
# relationships etc
end
defmodule MyApp.Users.Contract do
attributes do
# other attributes
attribute :emp_factor, :decimal, allow_nil?: false, default: Decimal.new(1)
attribute :vac_days, :decimal, allow_nil?: false, default: Decimal.new(25)
end
create :create do
primary? true
argument :user_id, :integer, allow_nil?: false
argument :emp_percent, :decimal, allow_nil?: false, default: Decimal.new(100)
end
changes do
change manage_relationship(:user_id, :user, type: :replace), on: :create
change &change_emp_factor/2
end
calculations do
calculate :vac_days_eff,
:decimal,
expr(vac_days * emp_factor)
calculate :emp_percent,
:decimal,
expr(emp_factor * 100)
end
defp change_emp_factor(changeset, _) do
case Ash.Changeset.get_argument(changeset, :emp_percent) do
nil ->
changeset
emp_percent ->
emp_factor = Decimal.div(emp_percent, 100)
Ash.Changeset.change_attribute(changeset, :emp_factor, emp_factor)
end
end
# relationships etc
end