Hi! First, I’d like to say that AshPhoenix.Form is really great, it makes dealing with forms so much easier! To implement an e-invoicing pipeline, I’m playing with Reactor and would like to know if it is possible to use it together with AshPhoenix.Form.
The main issue I’m facing is that my Invoice resource handles many items through manage_relationship and I don’t know how to pass that to the Reactor.
Here’s my Invoice resource:
defmodule Sales.Invoice do
actions do
defaults [:read]
create :issue do
primary? true
accept [
:discount_tax_rate,
:discount_type,
:discount_value,
:issue_date,
:payment_mean,
:payment_terms_days,
:payment_terms_days_end_of_month,
:status,
:contact_id
]
argument :items, {:array, :map}, allow_nil?: false
change manage_relationship(:items, type: :direct_control, order_is_key: :number)
# many more validations and change
end
action :complete_issue, :struct do
# Do I have to repeat alls arguments here?
# And what about change manage_relationship(:items, type: :direct_control, order_is_key: :number)?
run Reactors.IssueInvoice
end
end
end
And here’s the Reactor:
defmodule Reactors.IssueInvoice do
use Ash.Reactor
# Do I have to repeat all the inputs here?
input :discount_tax_rate
input :discount_type
input :discount_value
input :issue_date
input :payment_mean
input :payment_terms_days
input :payment_terms_days_end_of_month
input :status
input :contact_id
input :items
step :check_access_point, Sales.Invoice.Steps.CheckAccessPoint do
max_retries 3
end
transaction :create_invoice_transaction, [Sales.Invoice, Audit.AuditLog] do
wait_for :check_access_point
# Do I have to repeat all the inputs here?
create :create_invoice, Sales.Invoice, :issue do
inputs %{
discount_tax_rate: input(:discount_tax_rate),
discount_type: input(:discount_type),
discount_value: input(:discount_value),
issue_date: input(:issue_date),
payment_mean: input(:payment_mean),
payment_terms_days: input(:payment_terms_days),
payment_terms_days_end_of_month: input(:payment_terms_days_end_of_month),
status: input(:status),
contact_id: input(:contact_id),
items: input(:items)
}
end
# Other steps...
return :create_invoice
end
return :create_invoice_transaction
end
And of course, this is the error I get:
[error] ** (AshPhoenix.Form.NoFormConfigured) items at path [] must be configured in the form to be used with `inputs_for`. For example:
There is an argument called `items` on the action `Sales.Invoice.complete_issue`.
Perhaps you are missing a `change manage_relationship` for that argument, or it is not a type that can have forms generated for it?
So I guess the question is: it is possible to benefit from all the goodness of Ash.Changeset and Ash.Phoenix.Form while using Ash.Reactor?
I’ve managed to get a working solution using hooks, but it would be nice to benefit from the compensation and retry/backoff features of Reactor.
Hope I’m clear enough, let me know!






















