Resources involved are Employee, Shift, and EmployeeShift
Employee and shift are related many_to_many, through EmployeeShift, however, since an employee can clock in and out multiple times during an shift EmployeeShift has it’s own id and isn’t unique by pairs of Employee and Shift ids:
attributes do
uuid_primary_key :id
attribute :in_at, :utc_datetime_usec, allow_nil?: false
attribute :out_at, :utc_datetime_usec
create_timestamp :created_at
update_timestamp :updated_at
end
relationships do
belongs_to :employee, PointOfSale.Accounts.Employee do
api PointOfSale.Accounts
allow_nil? false
attribute_writable? true
end
belongs_to :shift, PointOfSale.Stores.Shift do
allow_nil? false
attribute_writable? true
end
end
Additionally EmployeeShifts have a custom primary create action called start that takes arguments of employ_id and shift_id and set’s the start time:
create :start do
primary? true
accept [:employee_id, :shift_id]
argument :employee_id, :uuid, allow_nil?: false
argument :shift_id, :uuid, allow_nil?: false
change set_attribute(:in_at, DateTime.utc_now())
change set_attribute(:employee_id, arg(:employee_id))
change set_attribute(:shift_id, arg(:shift_id))
end
When I start a new Shift I want to be able to pass an array of Employee ids to manage_relationship so that the custom start create function is called on EmployeeShift so that the included employees are clocked in automatically as the shift starts:
Shift
has_many :employee_shifts, PointOfSale.Stores.EmployeeShift
many_to_many :employees, PointOfSale.Accounts.Employee do
api PointOfSale.Accounts
through PointOfSale.Stores.EmployeeShift
join_relationship :employee_shifts
end
create :start do
accept [:till_id, :employee_ids]
argument :till_id, :uuid, allow_nil?: false
argument :employee_ids, {:array, :uuid}, allow_nil?: false
change set_attribute(:start_at, DateTime.utc_now())
change set_attribute(:till_id, arg(:till_id))
change manage_relationship(:employee_ids, :employee_shifts, type: create)
end
However, when I attempt to create a new Shift via this action I get an error saying that the required arguments of shift_id and employee_id for EmployeeShift are missing.
The shift_id should come from the shift that is created just before running the manage relationship. And I thought I would be accepting employee_ids via the manage_relationship function.
I see that I can pass a map instead of a list of ids, and maybe that is the way, but that doesn’t solve the passing in of the shift_id that I don’t have since it get’s created.






















