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.