View Categories

Afficher les détails d’un relevé d’heures GET /api/v1/timesheets/{id}

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 :

ChampTypeObligatoireDescriptionNotes
idstringUUID du relevé d’heuresUUID
weekstringSemaine concernéeFormat ISO 8601 Exemple : 2025W52
workerobjectIntérimaire 
└ idstringIdentifiant de l’intérimaireID numérique
└ uuidstringUUID de l’intérimaireUUID
└ lastNamestringNom de l’intérimaire 
└ firstNamestringPrénom de l’intérimaire 
└ customerSerialNumberstringMatricule EU de l’intérimaire 
customerSiteobjectSite client 
└ peopulseIdstringIdentifiant site clientID Peopulse (15 caractères)
└ labelstringLibellé du site client 
agencyobjectAgence ETT 
└ idstringIdentifiant de l’agenceID numérique
└ peopulseIdstringIdentifiant Peopulse agenceID Peopulse (15 caractères)
└ labelstringNom de l’agence 
entryCapability[]arrayPossibilités de saisie du relevé2 occurences si semaine à cheval (une par période)
└ isEditablebooleanRelevé saisissable ou non 
└ periodstringPériode concernée (mois)Format ISO 8601 Exemple : 2025-12
└ reasonCodestring | nullMotif d’impossibilité de saisieNO_ANALYTIC┃NO_CONTRACT_SIGNED (absence d’analytique avec mode de rupture analytique, absence de signature contrat)
missions[]arrayListe des missions du relevé 
└ idstringIdentifiant missionIdentifiant numérique
└ missionNumberstringNuméro de missionIdentique au numéro de contrat ou au format Cmd D-M (avec D identifiant demande, et M identifiant mission)
qualificationobjectQualification de la missionEn cas d’avenant en cours de semaine, la qualification en fin de semaine est considérée
   └ idstringIdentifiant qualificationIdentifiant numérique
   └ codestringCode qualification 
   └ labelstringLibellé qualification 
lastShiftWorkTeamobjectEquipe horaireEn cas d’avenant en cours de semaine, l’éqiupe en fin de semaine est considérée
   └ codestringCode équipe 
   └ labelstringLibellé équipe 
analyticobjectAnalytique 
   └ idstringIdentifiant analytiqueID numérique
   └ codestringCode analytique 
   └ labelstringLibellé analytique 
   └ subAnalyticobjectSous-analytiquenull si pas de sous-analytique
     └ idstringIdentifiant sous-analytiqueID numérique
     └ codestringCode sous-analytique 
     └ labelstringLibellé sous-analytique 
└ startMissionDatestringDate de début de la missionFormat ISO 8601 (AAAA-MM-JJ)
└ endMissionDatestringDate de fin prévueFormat ISO 8601 (AAAA-MM-JJ)
└ actualEndMissionDatestringDate de fin réelleFormat ISO 8601 (AAAA-MM-JJ)
└ flexibilityEndMissionDatestringDate de souplesse plusFormat ISO 8601 (AAAA-MM-JJ)
days[]arrayJournées associées 
   └ daystringDate du jourFormat ISO 8601 (AAAA-MM-JJ)
   └ shiftWorkTeamobjectÉquipe horaireEquipe associée à la journée (peut être différente chaque jour en cas d’avenant)
     └ codestringCode équipe 
     └ labelstringLibellé équipe 
   └ clockingTemplateobjectPointage typePointage type associé à la journée (peut être différent de celui défini dans l’équipe en cas de modification ponctuelle)
     └ idstringIdentifiant pointage typeID numérique
     └ codestringCode pointage type 
     └ labelstringLibellé pointage type 
   └ timeslots[]arrayCréneaux horairesPlusieurs créneaux possibles par jour, dans la limite d’un seul créneau par analytique par jour
     └ idstringIdentifiant créneauUUIDSi 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.
     └ daystringJour concernéFormat ISO 8601 (AAAA-MM-JJ)
     └ analyticobjectAnalytique 
       └ idstringIdentifiant analytiqueID numérique
       └ codestringCode analytique 
       └ labelstringLibellé analytique 
       └ subAnalyticobjectSous-analytiquenull si pas de sous-analytique
         └ idstringIdentifiant sous-analytiqueID numérique
         └ codestringCode sous-analytique 
         └ labelstringLibellé sous-analytique 
     └ absenceTypeobjectType d’absenceAttention, une présence est un type d’absence
         └ idstringIdentifiant type d’absence1┃2┃3┃...(présent, non travaillé, absence non justifiée, etc. selon paramétrage)
     └ arrivalHourstringHeure d’arrivéeFormat ISO 8601 HH:MM
     └ hoursnumberHeures travaillées (défaut null)Quantité d’heuresExemple : 7.33
     └ departureHourstringHeure de départ (défaut null)Format ISO 8601 HH:MM
wageTypes[]arrayRubriques de rémunération 
└ idstringIdentifiantUUID
└ codestringCode rubrique 
└ namestringNom rubrique 
└ activityPeriodstringPériode d’activitéFormat ISO 8601 Exemple : 2025-12
└ missionIdstringMission associéeID numérique
analyticobjectAnalytique 
   └ idstringIdentifiant analytiqueID numérique
   └ codestringCode analytique 
   └ labelstringLibellé analytique 
   └ subAnalyticobjectSous-analytiquenull si pas de sous-analytique
     └ idstringIdentifiant sous-analytiqueID numérique
     └ codestringCode sous-analytique 
     └ labelstringLibellé sous-analytique 
└ categoryenumCatégorie de rubrique : triggered┃quickEntry┃manualEntryDéclenchée / intégrée à la saisie rapide / ajoutée “manuellement”
└ valuationModeenumMode de valorisation de la rubrique : PAID┃PAID_BILLED┃BILLEDPayée / payée facturée / facturée
└ booleanInputbooleanSaisie booléenne de rubriqueDans le cas de la saisie rapide, indication si la rubrique est une case à cocher
└ readonlybooleanRubrique en lecture seuleToute rubrique représentant du temps de travail ne peut pas être modifiée (c’est la saisie qui doit être modifiée).
└ percentagenumber | nullTaux de la rubrique en pourcentExemple : 25
└ paidRatenumber | nullTaux payé de la rubriqueExemple : 12.78
└ coefficientnumber | nullCoefficient de la rubriqueExemple : 1.234
└ billedRatenumber | nullTaux facturé de la rubriqueExemple : 13.89
days[]arrayJours sur lesquels la rubrique est générée 
   └ idstringIdentifiant du jour pour la rubriqueUUID
   └ datestringDate du jourFormat ISO 8601 (AAAA-MM-JJ)
   └ quantitynumberQuantité de la rubriqueExemple : 7.33
dispute[]arrayLitiges éventuelsnull si aucun litige n’a été ouvert
   └ idstringIdentifiant du litigeUUID
   └ isDisputeAcceptedbooleanAcceptation du litigeFormat 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é.
   └ solvedDisputeDatestringDate de résolution du litige
   └ days[]arrayJours sur lesquels il y a litige 
     └ idstringIdentifiant du jour pour le litigeUUID
     └ datestringDate du jourFormat ISO 8601 (AAAA-MM-JJ)
     └ quantitynumberQuantité proposée pour correction 
preinvoicearrayPréfacture éventuellesnull si la rubrique n’a pas encore été envoyée
   └ idstringIdentifiant de préfactureUUID
   └ numberstringNuméro de préfacture 
status[]arrayStatuts du relevé d’heures2 occurences si semaine à cheval (une par période)
└ periodstring | nullPériode (mois)Format ISO 8601Exemple : 2025-12
└ valueenumStatut : IN_PROGRESS┃FILLED┃SENT┃SENT_AND_APPROVED┃IN_DISPUTEEn cours de saisie / à envoyer / envoyé, envoyé et approuvé / en litige
└ sentAtstring | nullDate d’envoi à l’agenceFormat ISO 8601 (AAAA-MM-JJ)
└ acceptedAtstring | nullDate d’approbation par l’agenceFormat ISO 8601 (AAAA-MM-JJ)
totalTimeslotsnumberTotal d’heuresCumul 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
}
}