Cette route renvoie le détail du relevé d’heures en passant son identifiant en paramètre.
Détails :
Un relevé d’heures (timesheet) est unique pour :
- un intérimaire
- un site
- une agence
- une semaine
Ainsi, si pour une semaine donnée, un intérimaire a effectué plusieurs missions pour un même site via une même agence, alors il aura un unique relevé d’heures présentant toutes les missions de la semaine.
Un timesheet qui n’a jamais été saisi possède un UUID et présente pour chaque mission l’ensemble des créneaux horaires (timeslots) théoriques selon le pointage type (clockingTemplate) rattaché à l’équipe (shiftWorkTeam) de l’intérimaire pour la semaine.
Dans ce cas, les timeslots n’ont pas encore d’UUID, et les rubriques (wageTypes) n’ont pas encore été générées.
Dès lors qu’un timesheet est saisi sur une période, les timeslots sont enregistrés et possèdent un UUID, et les wageTypes sont générées selon le pointage type.
NB : un même timesheet a 2 statuts différents pour chaque période sur laquelle il existe. En semaine 2025W31 par exemple, un timesheet qui court sur toute la semaine aura un statut pour 2025-07 et un autre pour 2025-08. Les timeslots peuvent donc être enregistrés pour l’une des 2 périodes uniquement.
Paramètres :
- id (identifiant du relevé d’heures)
- customerId (identifiant Peopulse du client – obligatoire pour une ETT)
Champs de la réponse :
| Champ | Type | Obligatoire | Description | Notes |
|---|---|---|---|---|
| id | string | ❌ | UUID du relevé d’heures | UUID |
| week | string | ✅ | Semaine concernée | Format ISO 8601 Exemple : 2025W52 |
| worker | object | ✅ | Intérimaire | |
| └ id | string | ✅ | Identifiant de l’intérimaire | ID numérique |
| └ uuid | string | ✅ | UUID de l’intérimaire | UUID |
| └ lastName | string | ✅ | Nom de l’intérimaire | |
| └ firstName | string | ✅ | Prénom de l’intérimaire | |
| └ customerSerialNumber | string | ✅ | Matricule EU de l’intérimaire | |
| customerSite | object | ✅ | Site client | |
| └ peopulseId | string | ✅ | Identifiant site client | ID Peopulse (15 caractères) |
| └ label | string | ✅ | Libellé du site client | |
| agency | object | ✅ | Agence ETT | |
| └ id | string | ❌ | Identifiant de l’agence | ID numérique |
| └ peopulseId | string | ✅ | Identifiant Peopulse agence | ID Peopulse (15 caractères) |
| └ label | string | ✅ | Nom de l’agence | |
| entryCapability[] | array | ✅ | Possibilités de saisie du relevé | 2 occurences si semaine à cheval (une par période) |
| └ isEditable | boolean | ✅ | Relevé saisissable ou non | |
| └ period | string | ✅ | Période concernée (mois) | Format ISO 8601 Exemple : 2025-12 |
| └ reasonCode | string | null | ✅ | Motif d’impossibilité de saisie | NO_ANALYTIC┃NO_CONTRACT_SIGNED (absence d’analytique avec mode de rupture analytique, absence de signature contrat) |
| missions[] | array | ✅ | Liste des missions du relevé | |
| └ id | string | ✅ | Identifiant mission | Identifiant numérique |
| └ missionNumber | string | ✅ | Numéro de mission | Identique au numéro de contrat ou au format Cmd D-M (avec D identifiant demande, et M identifiant mission) |
| └ qualification | object | ✅ | Qualification de la mission | En cas d’avenant en cours de semaine, la qualification en fin de semaine est considérée |
| └ id | string | ✅ | Identifiant qualification | Identifiant numérique |
| └ code | string | ✅ | Code qualification | |
| └ label | string | ✅ | Libellé qualification | |
| └ lastShiftWorkTeam | object | ✅ | Equipe horaire | En cas d’avenant en cours de semaine, l’éqiupe en fin de semaine est considérée |
| └ code | string | ❌ | Code équipe | |
| └ label | string | ✅ | Libellé équipe | |
| └ analytic | object | ✅ | Analytique | |
| └ id | string | ✅ | Identifiant analytique | ID numérique |
| └ code | string | ✅ | Code analytique | |
| └ label | string | ✅ | Libellé analytique | |
| └ subAnalytic | object | ❌ | Sous-analytique | null si pas de sous-analytique |
| └ id | string | ✅ | Identifiant sous-analytique | ID numérique |
| └ code | string | ✅ | Code sous-analytique | |
| └ label | string | ✅ | Libellé sous-analytique | |
| └ startMissionDate | string | ✅ | Date de début de la mission | Format ISO 8601 (AAAA-MM-JJ) |
| └ endMissionDate | string | ✅ | Date de fin prévue | Format ISO 8601 (AAAA-MM-JJ) |
| └ actualEndMissionDate | string | ❌ | Date de fin réelle | Format ISO 8601 (AAAA-MM-JJ) |
| └ flexibilityEndMissionDate | string | ❌ | Date de souplesse plus | Format ISO 8601 (AAAA-MM-JJ) |
| └ days[] | array | ✅ | Journées associées | |
| └ day | string | ✅ | Date du jour | Format ISO 8601 (AAAA-MM-JJ) |
| └ shiftWorkTeam | object | ✅ | Équipe horaire | Equipe associée à la journée (peut être différente chaque jour en cas d’avenant) |
| └ code | string | ❌ | Code équipe | |
| └ label | string | ✅ | Libellé équipe | |
| └ clockingTemplate | object | ✅ | Pointage type | Pointage type associé à la journée (peut être différent de celui défini dans l’équipe en cas de modification ponctuelle) |
| └ id | string | ✅ | Identifiant pointage type | ID numérique |
| └ code | string | ✅ | Code pointage type | |
| └ label | string | ✅ | Libellé pointage type | |
| └ timeslots[] | array | ✅ | Créneaux horaires | Plusieurs créneaux possibles par jour, dans la limite d’un seul créneau par analytique par jour |
| └ id | string | ❌ | Identifiant créneau | UUIDSi le créneau a été saisi, l’id est renseigné. Si le créneau est proposé automatiquement (issu du pointage type), l’id est absent. |
| └ day | string | ✅ | Jour concerné | Format ISO 8601 (AAAA-MM-JJ) |
| └ analytic | object | ✅ | Analytique | |
| └ id | string | ✅ | Identifiant analytique | ID numérique |
| └ code | string | ✅ | Code analytique | |
| └ label | string | ✅ | Libellé analytique | |
| └ subAnalytic | object | ❌ | Sous-analytique | null si pas de sous-analytique |
| └ id | string | ✅ | Identifiant sous-analytique | ID numérique |
| └ code | string | ✅ | Code sous-analytique | |
| └ label | string | ✅ | Libellé sous-analytique | |
| └ absenceType | object | ✅ | Type d’absence | Attention, une présence est un type d’absence |
| └ id | string | ❌ | Identifiant type d’absence | 1┃2┃3┃...(présent, non travaillé, absence non justifiée, etc. selon paramétrage) |
| └ arrivalHour | string | ✅ | Heure d’arrivée | Format ISO 8601 HH:MM |
| └ hours | number | ❌ | Heures travaillées (défaut null) | Quantité d’heuresExemple : 7.33 |
| └ departureHour | string | ❌ | Heure de départ (défaut null) | Format ISO 8601 HH:MM |
| wageTypes[] | array | ✅ | Rubriques de rémunération | |
| └ id | string | ✅ | Identifiant | UUID |
| └ code | string | ✅ | Code rubrique | |
| └ name | string | ✅ | Nom rubrique | |
| └ activityPeriod | string | ✅ | Période d’activité | Format ISO 8601 Exemple : 2025-12 |
| └ missionId | string | ✅ | Mission associée | ID numérique |
| └ analytic | object | ✅ | Analytique | |
| └ id | string | ✅ | Identifiant analytique | ID numérique |
| └ code | string | ✅ | Code analytique | |
| └ label | string | ✅ | Libellé analytique | |
| └ subAnalytic | object | ❌ | Sous-analytique | null si pas de sous-analytique |
| └ id | string | ✅ | Identifiant sous-analytique | ID numérique |
| └ code | string | ✅ | Code sous-analytique | |
| └ label | string | ✅ | Libellé sous-analytique | |
| └ category | enum | ✅ | Catégorie de rubrique : triggered┃quickEntry┃manualEntry | Déclenchée / intégrée à la saisie rapide / ajoutée “manuellement” |
| └ valuationMode | enum | ✅ | Mode de valorisation de la rubrique : PAID┃PAID_BILLED┃BILLED | Payée / payée facturée / facturée |
| └ booleanInput | boolean | ✅ | Saisie booléenne de rubrique | Dans le cas de la saisie rapide, indication si la rubrique est une case à cocher |
| └ readonly | boolean | ✅ | Rubrique en lecture seule | Toute rubrique représentant du temps de travail ne peut pas être modifiée (c’est la saisie qui doit être modifiée). |
| └ percentage | number | null | ✅ | Taux de la rubrique en pourcent | Exemple : 25 |
| └ paidRate | number | null | ✅ | Taux payé de la rubrique | Exemple : 12.78 |
| └ coefficient | number | null | ✅ | Coefficient de la rubrique | Exemple : 1.234 |
| └ billedRate | number | null | ✅ | Taux facturé de la rubrique | Exemple : 13.89 |
| └ days[] | array | ✅ | Jours sur lesquels la rubrique est générée | |
| └ id | string | ✅ | Identifiant du jour pour la rubrique | UUID |
| └ date | string | ✅ | Date du jour | Format ISO 8601 (AAAA-MM-JJ) |
| └ quantity | number | ✅ | Quantité de la rubrique | Exemple : 7.33 |
| └ dispute[] | array | ❌ | Litiges éventuels | null si aucun litige n’a été ouvert |
| └ id | string | ✅ | Identifiant du litige | UUID |
| └ isDisputeAccepted | boolean | ✅ | Acceptation du litige | Format ISO 8601 (AAAA-MM-JJ)Un litige accepté est conservé dans l’ historique.Si solvedDisputeDate est renseigné : si isDisputeAccepted est à false : le litige a été refusé, on le garde en historiquesi isDisputeAccepted est à true : le litige a été accepté, ses valeurs ont déjà été remplacées, on garde en historique le fait que la rubrique est issue d’un litigeSinon : le litige n’a pas encore été traité. |
| └ solvedDisputeDate | string | ❌ | Date de résolution du litige | |
| └ days[] | array | ✅ | Jours sur lesquels il y a litige | |
| └ id | string | ✅ | Identifiant du jour pour le litige | UUID |
| └ date | string | ✅ | Date du jour | Format ISO 8601 (AAAA-MM-JJ) |
| └ quantity | number | ✅ | Quantité proposée pour correction | |
| └ preinvoice | array | ❌ | Préfacture éventuelles | null si la rubrique n’a pas encore été envoyée |
| └ id | string | ✅ | Identifiant de préfacture | UUID |
| └ number | string | ✅ | Numéro de préfacture | |
| status[] | array | ✅ | Statuts du relevé d’heures | 2 occurences si semaine à cheval (une par période) |
| └ period | string | null | ❌ | Période (mois) | Format ISO 8601Exemple : 2025-12 |
| └ value | enum | ✅ | Statut : IN_PROGRESS┃FILLED┃SENT┃SENT_AND_APPROVED┃IN_DISPUTE | En cours de saisie / à envoyer / envoyé, envoyé et approuvé / en litige |
| └ sentAt | string | null | ❌ | Date d’envoi à l’agence | Format ISO 8601 (AAAA-MM-JJ) |
| └ acceptedAt | string | null | ❌ | Date d’approbation par l’agence | Format ISO 8601 (AAAA-MM-JJ) |
| totalTimeslots | number | ✅ | Total d’heures | Cumul des heures enregistrées |
Exemple :
curl -X GET "https://api.dev.peopulse.com/api/v1/timesheets/f0bdf1ab-fc22-4e73-a7ff-49a3be9728ba" \
-H 'accept: application/json'\
-H 'authorization: Bearer XXX'
{
"data": {
"id": "f0bdf1ab-fc22-4e73-a7ff-49a3be9728ba",
"week": "2025W34",
"worker": {
"id": "226",
"uuid": "01951d99-1f9f-7dfe-a0da-c4904338f440",
"lastName": "AGGOUNI",
"firstName": "SONIA",
"customerSerialNumber": "123665"
},
"customerSite": {
"peopulseId": "SUPPORT00000001",
"label": "SITE INDUSTRIE ROUEN"
},
"agency": {
"id": "2",
"peopulseId": "RHXNETT00000005",
"label": "INTERIM ROUEN"
},
"entryCapability": [
{
"isEditable": true,
"reasonCode": null,
"period": "2025-08"
}
],
"missions": [
{
"id": "5857",
"missionNumber": "Cmd 5510-5857",
"qualification": {
"id": "329",
"code": "67",
"label": "CARISTE"
},
"lastShiftWorkTeam": {
"code": "200",
"label": "EQUIPE AM"
},
"analytic": {
"id": "2",
"code": "002",
"label": "ATELIER 2",
"subAnalytic": null
},
"startMissionDate": "2025-07-31",
"endMissionDate": "2025-09-07",
"actualEndMissionDate": null,
"flexibilityMissionDate": "2025-09-12",
"days": [
{
"day": "2025-08-18",
"shiftWorkTeam": {
"code": "200",
"label": "EQUIPE AM"
},
"clockingTemplate": {
"id": "16",
"code": "700",
"label": "35H AVEC PAUSE"
},
"timeslots": [
{
"id": "60521d44-3faf-4b92-b47e-3d5903778b29",
"analytic": {
"id": "3",
"code": "003",
"label": "ATELIER 3",
"subAnalytic": null
},
"absenceType": {
"id": "1"
},
"arrivalHour": "10:00",
"hours": 8,
"departureHour": "18:00"
}
]
},
{
"day": "2025-08-19",
"shiftWorkTeam": {
"code": "200",
"label": "EQUIPE AM"
},
"clockingTemplate": {
"id": "16",
"code": "700",
"label": "35H AVEC PAUSE"
},
"timeslots": [
{
"id": "719cedee-5104-4724-b912-e901f8eb8215",
"analytic": {
"id": "3",
"code": "003",
"label": "ATELIER 3",
"subAnalytic": null
},
"absenceType": {
"id": "3"
},
"arrivalHour": "09:00",
"hours": 0,
"departureHour": "09:00"
}
]
},
{
"day": "2025-08-20",
"shiftWorkTeam": {
"code": "200",
"label": "EQUIPE AM"
},
"clockingTemplate": {
"id": "16",
"code": "700",
"label": "35H AVEC PAUSE"
},
"timeslots": [
{
"id": "6a347482-1359-4796-a305-9531135d23e6",
"analytic": {
"id": "3",
"code": "003",
"label": "ATELIER 3",
"subAnalytic": null
},
"absenceType": {
"id": "3"
},
"arrivalHour": "09:00",
"hours": 0,
"departureHour": "09:00"
}
]
},
{
"day": "2025-08-21",
"shiftWorkTeam": {
"code": "200",
"label": "EQUIPE AM"
},
"clockingTemplate": {
"id": "1",
"code": "1",
"label": "STANDARD EQUIPE MATIN 35H"
},
"timeslots": [
{
"id": "4e396818-0da8-4eeb-8f40-45b95c32bdea",
"analytic": {
"id": "2",
"code": "002",
"label": "ATELIER 2",
"subAnalytic": {
"id": "5",
"code": "0022",
"label": "ALLEE 2-2"
}
},
"absenceType": {
"id": "1"
},
"arrivalHour": "05:00",
"hours": 6,
"departureHour": "11:00"
}
]
},
{
"day": "2025-08-22",
"shiftWorkTeam": {
"code": "200",
"label": "EQUIPE AM"
},
"clockingTemplate": {
"id": "1",
"code": "1",
"label": "STANDARD EQUIPE MATIN 35H"
},
"timeslots": [
{
"id": "9a35ae2a-39f8-4429-9d55-e8688e979b45",
"analytic": {
"id": "2",
"code": "002",
"label": "ATELIER 2",
"subAnalytic": {
"id": "5",
"code": "0022",
"label": "ALLEE 2-2"
}
},
"absenceType": {
"id": "1"
},
"arrivalHour": "05:00",
"hours": 6,
"departureHour": "11:00"
}
]
},
{
"day": "2025-08-23",
"shiftWorkTeam": {
"code": "200",
"label": "EQUIPE AM"
},
"clockingTemplate": {
"id": "16",
"code": "700",
"label": "35H AVEC PAUSE"
},
"timeslots": [
{
"id": "cc89d2ea-1ea7-4712-a2d6-abbb0e5c5261",
"analytic": {
"id": "2",
"code": "002",
"label": "ATELIER 2",
"subAnalytic": {
"id": "5",
"code": "0022",
"label": "ALLEE 2-2"
}
},
"absenceType": {
"id": "2"
},
"arrivalHour": "09:00",
"hours": 0,
"departureHour": "09:00"
}
]
},
{
"day": "2025-08-24",
"shiftWorkTeam": {
"code": "200",
"label": "EQUIPE AM"
},
"clockingTemplate": {
"id": "16",
"code": "700",
"label": "35H AVEC PAUSE"
},
"timeslots": [
{
"id": "f7317fe7-960a-4093-acac-1f98d78c2988",
"analytic": {
"id": "2",
"code": "002",
"label": "ATELIER 2",
"subAnalytic": {
"id": "5",
"code": "0022",
"label": "ALLEE 2-2"
}
},
"absenceType": {
"id": "2"
},
"arrivalHour": "09:00",
"hours": 0,
"departureHour": "09:00"
}
]
}
]
}
],
"wageTypes": [
{
"id": "36b548d2-a64b-4ac5-94f8-d69cbcbae4fa",
"code": "0203",
"name": "Test TR patronal",
"activityPeriod": "2025-08",
"missionId": "5857",
"analytic": {
"id": "3",
"code": "003",
"label": "ATELIER 3",
"subAnalytic": null
},
"category": "triggered",
"days": [
{
"id": "e6e1470c-ef99-479f-bf0f-5720c3b597ff",
"date": "2025-08-18",
"quantity": 1
}
],
"dispute": null,
"readonly": false,
"valuationMode": "BILLED",
"booleanInput": false,
"percentage": null,
"paidRate": 0,
"coefficient": 0,
"billedRate": 0,
"preinvoice": null
},
{
"id": "c7f59a47-b8fd-4923-9772-657bd8d13b30",
"code": "0303",
"name": "INDEMNITE TRANSPORT",
"activityPeriod": "2025-08",
"missionId": "5857",
"analytic": {
"id": "3",
"code": "003",
"label": "ATELIER 3",
"subAnalytic": null
},
"category": "triggered",
"days": [
{
"id": "699e7ee5-bef1-448e-8f1e-065a1e203db9",
"date": "2025-08-18",
"quantity": 1
}
],
"dispute": null,
"readonly": false,
"valuationMode": "PAID_BILLED",
"booleanInput": false,
"percentage": null,
"paidRate": 20,
"coefficient": 1,
"billedRate": 20,
"preinvoice": null
},
{
"id": "06463676-d80d-4671-95ca-f5b16eaf6ff8",
"code": "1100",
"name": "HEURES NORMALES",
"activityPeriod": "2025-08",
"missionId": "5857",
"analytic": {
"id": "2",
"code": "002",
"label": "ATELIER 2",
"subAnalytic": {
"id": "5",
"code": "0022",
"label": "ALLEE 2-2"
}
},
"category": "triggered",
"days": [
{
"id": "db2356e7-5622-477b-9d29-b37e1f20f1ef",
"date": "2025-08-21",
"quantity": 5
},
{
"id": "793a4a20-2b61-4230-a6f3-052c446eff3b",
"date": "2025-08-22",
"quantity": 5
}
],
"dispute": null,
"readonly": true,
"valuationMode": "PAID_BILLED",
"booleanInput": false,
"percentage": 100,
"paidRate": 0,
"coefficient": 1,
"billedRate": 0,
"preinvoice": null
},
{
"id": "71dde0e8-e1e2-47d1-a7ae-00e4a72e7551",
"code": "1100",
"name": "HEURES NORMALES",
"activityPeriod": "2025-08",
"missionId": "5857",
"analytic": {
"id": "3",
"code": "003",
"label": "ATELIER 3",
"subAnalytic": null
},
"category": "triggered",
"days": [
{
"id": "77aa9ee2-f685-4b9d-a50e-2bf3410715c9",
"date": "2025-08-18",
"quantity": 6.5
}
],
"dispute": null,
"readonly": true,
"valuationMode": "PAID_BILLED",
"booleanInput": false,
"percentage": 100,
"paidRate": 0,
"coefficient": 1,
"billedRate": 0,
"preinvoice": null
},
{
"id": "81a9f61b-500e-4c35-bb9b-05e7a9d9bff7",
"code": "1111",
"name": "Prime ponctuelle",
"activityPeriod": "2025-08",
"missionId": "5857",
"analytic": {
"id": "3",
"code": "003",
"label": "ATELIER 3",
"subAnalytic": null
},
"category": "triggered",
"days": [
{
"id": "ece49997-dc87-4586-8123-030397a327bf",
"date": "2025-08-18",
"quantity": 8
}
],
"dispute": null,
"readonly": false,
"valuationMode": "BILLED",
"booleanInput": false,
"percentage": null,
"paidRate": 0,
"coefficient": 0,
"billedRate": 0,
"preinvoice": null
},
{
"id": "890ea263-cfbe-4c6c-bc41-c813fce88bef",
"code": "1220",
"name": "HEURES DE NUIT TRAVAILLEES",
"activityPeriod": "2025-08",
"missionId": "5857",
"analytic": {
"id": "2",
"code": "002",
"label": "ATELIER 2",
"subAnalytic": {
"id": "5",
"code": "0022",
"label": "ALLEE 2-2"
}
},
"category": "triggered",
"days": [
{
"id": "ba27f31e-1d61-473f-a0bf-65fc00685bee",
"date": "2025-08-21",
"quantity": 1
},
{
"id": "01ed731a-310b-4665-8b44-0cfbb93417ba",
"date": "2025-08-22",
"quantity": 1
}
],
"dispute": null,
"readonly": true,
"valuationMode": "PAID_BILLED",
"booleanInput": false,
"percentage": 8.33,
"paidRate": 0,
"coefficient": 1,
"billedRate": 0,
"preinvoice": null
},
{
"id": "70550fc5-7806-47b7-bdaa-a2a90c5b2f8a",
"code": "1260",
"name": "HEURES DE PAUSES",
"activityPeriod": "2025-08",
"missionId": "5857",
"analytic": {
"id": "2",
"code": "002",
"label": "ATELIER 2",
"subAnalytic": {
"id": "5",
"code": "0022",
"label": "ALLEE 2-2"
}
},
"category": "quickEntry",
"days": [
{
"id": "02169d27-7fa1-4d52-957b-dd3b360914d6",
"date": "2025-08-21",
"quantity": 1
},
{
"id": "3fce8f6b-371d-4904-bfe0-02cf896ae6fa",
"date": "2025-08-22",
"quantity": 1
}
],
"dispute": null,
"readonly": false,
"valuationMode": "PAID",
"booleanInput": true,
"percentage": 95,
"paidRate": 0,
"coefficient": 0,
"billedRate": 0,
"preinvoice": null
},
{
"id": "d0953eef-541f-4cfb-9ae1-76dc37153234",
"code": "1260",
"name": "HEURES DE PAUSES",
"activityPeriod": "2025-08",
"missionId": "5857",
"analytic": {
"id": "3",
"code": "003",
"label": "ATELIER 3",
"subAnalytic": null
},
"category": "triggered",
"days": [
{
"id": "2ee85e08-80ce-493b-a0de-192f901b5554",
"date": "2025-08-18",
"quantity": 1.5
}
],
"dispute": null,
"readonly": true,
"valuationMode": "PAID",
"booleanInput": false,
"percentage": 95,
"paidRate": 0,
"coefficient": 0,
"billedRate": 0,
"preinvoice": null
}
],
"status": [
{
"period": "2025-08",
"value": "IN_PROGRESS",
"sentAt": null,
"acceptedAt": null
}
],
"totalTimeslots": 20
}
}