Process · medium — valider des feuilles d'heures
Le cas. Le manager choisit les feuilles d'heures à valider, puis confirme. L'outil RH attend une liste d'identifiants.
Ce que l'exemple montre. Une part qui est un ensemble (countable: false), des lignes
envoyées comme identifiants (line_shape: ref), une écriture séparée des lectures, la confirmation
du manager comme acte.
examples/actuelle/process-medium.yaml
# Process · medium — a manager approves timesheets. A SET, not a basket: each timesheet once,
# sent to the tool as a list of ids. The manager's confirmation is the act.
station:
id: validation-heures
name: Validation des heures
global:
language: fr
currency: EUR
locale: fr-FR
domain:
domain_type: saas
entity_name: feuille d'heures
entity_name_plural: feuilles d'heures
agent:
tone: professional
name: Validation des heures
persona: "un assistant qui prépare les validations du manager, sans jamais décider à sa place"
rules:
- "Ne jamais valider une feuille que le manager n'a pas choisie."
emoji: false
portals:
web:
widget:
origins: [https://heures.example.fr]
apis:
- name: rh-lecture
openapi_url: https://rh-api.example.fr/openapi.json
base_url: https://rh-api.example.fr
operations:
- {id: getTimesheets, access: read}
- {id: getOvertimeReport, access: read}
auth: {type: api_key, key_name: X-RH-Key, key_location: header, key_env: RH_READ_KEY}
- name: rh-ecriture # the write, separated so the boundary is visible
openapi_url: https://rh-api.example.fr/openapi.json
base_url: https://rh-api.example.fr
operations:
- {id: approveTimesheets, access: write}
auth: {type: api_key, key_name: X-RH-Key, key_location: header, key_env: RH_WRITE_KEY}
skills:
- name: feuilles
cognitive:
objective: "lister les feuilles d'heures en attente pour que le manager choisisse celles à valider"
diagnose: [l'équipe, la semaine]
invoke: {method: getTimesheets}
kinds: {feuille: {}}
present: # no price: nothing is sold here
fields:
name: {from: name, type: text, role: title}
countable: false # "3 × the week of Awa" is not a thing
submit:
- name: approve
mode: request
tool: approveTimesheets
line_shape: ref # the tool takes timesheet_ids: list[str]
args:
body.timesheet_ids: "$selection[kind=feuille]"
body.idempotency_key: "$action.key"
render: {component: cards}
- name: rapport-heures-sup
invoke: {method: getOvertimeReport}
render:
component: report
report:
headline: total_overtime_hours
headline_label: "heures supplémentaires"
unit: h
submit_guard:
confirm: true # the manager's own click files the approval
Ce qui se passe
| étape | Core | résultat |
|---|---|---|
| « les feuilles en attente de mon équipe » | feuilles → getTimesheets | des cartes, une par feuille |
| trois feuilles choisies | ensemble : pas de quantité | trois lignes, pas de bouton −/+ |
| « Valider » + confirmation | approveTimesheets avec timesheet_ids: [...] | reçu dans la room |
| l'agent tente de valider seul | confirm: true | refusé sans le clic du manager |
À retenir
countable: falseparle de la sélection ;line_shape: refparle du tenant. Les deux sont nécessaires, et Core refuserefsur une part qui a des quantités.- Limite d'aujourd'hui : la clé
RH_WRITE_KEYest celle de la station. Deux managers valident sous la même identité, pour l'outil RH. Ne déployez ce cas que si un seul manager l'utilise, ou attendez l'identité par personne (version cible).