Audiences: external-employee (contractor), client (hour approval).
External employee — read: Payslip, EmploymentContract, own Employee record, Timesheet, Expense (scope: employeeId — already clean, account-less); create: Timesheet, Expense (field-whitelisted); actions: submit lifecycle transition; inbox: approval/rejection notices.
Schema gaps to close in this change: (1) Leave/Absence request schema (MISSING today), (2) client reference on project/timesheet for billable-hours approval by the client audience.
Client audience — read: billable Timesheets for their project; action: approve/reject.
Per ADR-046 + contract-v2 amendment (hydra, 2026-07-06) and the fleet review PORTALIQ-FLEET-REVIEW-2026-07-06.md (apps-extra). Delivery: one portal-contribution openspec change in this repo — a plain OCA\{App}\Portal\PortalContributionProvider (duck-typed: getAudiences(): array + getContribution(array $subject): ?array; NO portaliq import, NO info.xml dependency — without portaliq the class is inert). Data stays in OpenRegister; portaliq reads it scoped by the declared scopeField. Scoping properties must be UUID domain refs, never NC user IDs.
Gemigreerd van Codeberg — oorspronkelijk Conduction/hrmq#4, geopend door rubenvdlinde op 2026-07-06.
Audiences:
external-employee(contractor),client(hour approval).External employee — read: Payslip, EmploymentContract, own Employee record, Timesheet, Expense (scope:
employeeId— already clean, account-less); create: Timesheet, Expense (field-whitelisted); actions:submitlifecycle transition; inbox: approval/rejection notices.Schema gaps to close in this change: (1) Leave/Absence request schema (MISSING today), (2) client reference on project/timesheet for billable-hours approval by the client audience.
Client audience — read: billable Timesheets for their project; action: approve/reject.
Per ADR-046 + contract-v2 amendment (hydra, 2026-07-06) and the fleet review
PORTALIQ-FLEET-REVIEW-2026-07-06.md(apps-extra). Delivery: oneportal-contributionopenspec change in this repo — a plainOCA\{App}\Portal\PortalContributionProvider(duck-typed:getAudiences(): array+getContribution(array $subject): ?array; NO portaliq import, NO info.xml dependency — without portaliq the class is inert). Data stays in OpenRegister; portaliq reads it scoped by the declaredscopeField. Scoping properties must be UUID domain refs, never NC user IDs.Gemigreerd van Codeberg — oorspronkelijk Conduction/hrmq#4, geopend door
rubenvdlindeop 2026-07-06.