Order
s have many OrderItem
s have many OrderItemModifier
s
OrderItem
and OrderItemModifier
both have attributes of quantity
and price
I want Order
to be able to aggregate/calculate the total for the order.
First I looked at Aggregates, specifically at sum
, but since I need to do multiplication I thought maybe a Calculation would be needed. I’d like to do it as an expression so that Postgres is doing the calculation/aggregation and not Elixir code.
Update: I think I figured this out, Calculations and Aggregates are not an either or thing where if Aggregates don’t work use Calculations, you can also build up complex logic by combing simple calculations and Aggregates, I think…
I still have an error in GraphQL with one of the Aggregates, so I’m going to put my solution here and see if there’s an issue with it:
OrderItemModifier
:
calculations do
calculate :total, :decimal, expr(price * quantity)
end
OrderItem
:
calculations do
calculate :subtotal, :decimal, expr(price * quantity + modifiers_total)
end
aggregates do
sum :modifiers_total, :modifiers, :total
end
Order
:
aggregates do
sum :subtotal, :order_items, :sub_total
sum :tax_total, :order_taxes, :percentage
end
calculations do
calculate :total, :decimal, expr(subtotal * tax_total)
end
It could just be a typo somewhere (GraphQL errors like this are typically basic Ash errors that don’t get caught), but I’m getting this error from AshGraphQL after trying to compile this new code:
== Compilation error in file lib/point_of_sale/schema.ex ==
** (UndefinedFunctionError) function nil.embedded?/0 is undefined. If you are using the dot syntax, such as module.function(), make sure the left-hand side of the dot is a module atom
nil.embedded?()
(ash_graphql 0.26.9) lib/resource/resource.ex:2473: AshGraphql.Resource.filterable?/2
(elixir 1.16.1) lib/enum.ex:4277: Enum.filter_list/2
(ash_graphql 0.26.9) lib/resource/resource.ex:2386: AshGraphql.Resource.aggregate_filter_fields/2
(ash_graphql 0.26.9) lib/resource/resource.ex:2352: AshGraphql.Resource.resource_filter_fields/2
(ash_graphql 0.26.9) lib/resource/resource.ex:1283: AshGraphql.Resource.args/5
(ash_graphql 0.26.9) lib/resource/resource.ex:473: anonymous fn/6 in AshGraphql.Resource.queries/5
(elixir 1.16.1) lib/enum.ex:1700: Enum.“-map/2-lists^map/1-1-”/2