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
idstring❌UUID du relevé d’heuresUUID
weekstring✅Semaine concernéeFormat ISO 8601 Exemple : 2025W52
workerobject✅Intérimaire 
└ idstring✅Identifiant de l’intérimaireID numérique
└ uuidstring✅UUID de l’intérimaireUUID
└ lastNamestring✅Nom de l’intérimaire 
└ firstNamestring✅Prénom de l’intérimaire 
└ customerSerialNumberstring✅Matricule EU de l’intérimaire 
customerSiteobject✅Site client 
└ peopulseIdstring✅Identifiant site clientID Peopulse (15 caractères)
└ labelstring✅Libellé du site client 
agencyobject✅Agence ETT 
└ idstring❌Identifiant de l’agenceID numérique
└ peopulseIdstring✅Identifiant Peopulse agenceID Peopulse (15 caractères)
└ labelstring✅Nom de l’agence 
entryCapability[]array✅Possibilités de saisie du relevé2 occurences si semaine à cheval (une par période)
└ isEditableboolean✅Relevé saisissable ou non 
└ periodstring✅Période concernée (mois)Format ISO 8601 Exemple : 2025-12
└ reasonCodestring | null✅Motif d’impossibilité de saisieNO_ANALYTIC┃NO_CONTRACT_SIGNED (absence d’analytique avec mode de rupture analytique, absence de signature contrat)
missions[]array✅Liste des missions du relevé 
└ idstring✅Identifiant missionIdentifiant numérique
└ missionNumberstring✅Numéro de missionIdentique au numéro de contrat ou au format Cmd D-M (avec D identifiant demande, et M identifiant mission)
└ qualificationobject✅Qualification de la missionEn cas d’avenant en cours de semaine, la qualification en fin de semaine est considérée
   └ idstring✅Identifiant qualificationIdentifiant numérique
   └ codestring✅Code qualification 
   └ labelstring✅Libellé qualification 
└ lastShiftWorkTeamobject✅Equipe horaireEn cas d’avenant en cours de semaine, l’éqiupe en fin de semaine est considérée
   └ codestring❌Code équipe 
   └ labelstring✅Libellé équipe 
└ analyticobject✅Analytique 
   └ idstring✅Identifiant analytiqueID numérique
   └ codestring✅Code analytique 
   └ labelstring✅Libellé analytique 
   └ subAnalyticobject❌Sous-analytiquenull si pas de sous-analytique
     └ idstring✅Identifiant sous-analytiqueID numérique
     └ codestring✅Code sous-analytique 
     └ labelstring✅Libellé sous-analytique 
└ startMissionDatestring✅Date de début de la missionFormat ISO 8601 (AAAA-MM-JJ)
└ endMissionDatestring✅Date de fin prévueFormat ISO 8601 (AAAA-MM-JJ)
└ actualEndMissionDatestring❌Date de fin réelleFormat ISO 8601 (AAAA-MM-JJ)
└ flexibilityEndMissionDatestring❌Date de souplesse plusFormat ISO 8601 (AAAA-MM-JJ)
└ days[]array✅Journées associées 
   └ daystring✅Date 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)
     └ codestring❌Code équipe 
     └ labelstring✅Libellé équipe 
   └ clockingTemplateobject✅Pointage typePointage type associé à la journée (peut être différent de celui défini dans l’équipe en cas de modification ponctuelle)
     └ idstring✅Identifiant pointage typeID numérique
     └ codestring✅Code pointage type 
     └ labelstring✅Libellé pointage type 
   └ timeslots[]array✅Créneaux horairesPlusieurs créneaux possibles par jour, dans la limite d’un seul créneau par analytique par jour
     └ idstring❌Identifiant 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.
     └ daystring✅Jour concernéFormat ISO 8601 (AAAA-MM-JJ)
     └ analyticobject✅Analytique 
       └ idstring✅Identifiant analytiqueID numérique
       └ codestring✅Code analytique 
       └ labelstring✅Libellé analytique 
       └ subAnalyticobject❌Sous-analytiquenull si pas de sous-analytique
         └ idstring✅Identifiant sous-analytiqueID numérique
         └ codestring✅Code sous-analytique 
         └ labelstring✅Libellé sous-analytique 
     └ absenceTypeobject✅Type d’absenceAttention, une présence est un type d’absence
         └ idstring❌Identifiant type d’absence1┃2┃3┃...(présent, non travaillé, absence non justifiée, etc. selon paramétrage)
     └ arrivalHourstring✅Heure d’arrivéeFormat ISO 8601 HH:MM
     └ hoursnumber❌Heures travaillées (défaut null)Quantité d’heuresExemple : 7.33
     └ departureHourstring❌Heure de départ (défaut null)Format ISO 8601 HH:MM
wageTypes[]array✅Rubriques de rémunération 
└ idstring✅IdentifiantUUID
└ codestring✅Code rubrique 
└ namestring✅Nom rubrique 
└ activityPeriodstring✅Période d’activitéFormat ISO 8601 Exemple : 2025-12
└ missionIdstring✅Mission associéeID numérique
└ analyticobject✅Analytique 
   └ idstring✅Identifiant analytiqueID numérique
   └ codestring✅Code analytique 
   └ labelstring✅Libellé analytique 
   └ subAnalyticobject❌Sous-analytiquenull si pas de sous-analytique
     └ idstring✅Identifiant sous-analytiqueID numérique
     └ codestring✅Code sous-analytique 
     └ labelstring✅Libellé sous-analytique 
└ categoryenum✅Catégorie de rubrique : triggered┃quickEntry┃manualEntryDéclenchée / intégrée à la saisie rapide / ajoutée “manuellement”
└ valuationModeenum✅Mode de valorisation de la rubrique : PAID┃PAID_BILLED┃BILLEDPayée / payée facturée / facturée
└ booleanInputboolean✅Saisie booléenne de rubriqueDans le cas de la saisie rapide, indication si la rubrique est une case à cocher
└ readonlyboolean✅Rubrique 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 | null✅Taux de la rubrique en pourcentExemple : 25
└ paidRatenumber | null✅Taux payé de la rubriqueExemple : 12.78
└ coefficientnumber | null✅Coefficient de la rubriqueExemple : 1.234
└ billedRatenumber | null✅Taux facturé de la rubriqueExemple : 13.89
└ days[]array✅Jours sur lesquels la rubrique est générée 
   └ idstring✅Identifiant du jour pour la rubriqueUUID
   └ datestring✅Date du jourFormat ISO 8601 (AAAA-MM-JJ)
   └ quantitynumber✅Quantité de la rubriqueExemple : 7.33
└ dispute[]array❌Litiges éventuelsnull si aucun litige n’a été ouvert
   └ idstring✅Identifiant du litigeUUID
   └ isDisputeAcceptedboolean✅Acceptation 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é.
   └ solvedDisputeDatestring❌Date de résolution du litige
   └ days[]array✅Jours sur lesquels il y a litige 
     └ idstring✅Identifiant du jour pour le litigeUUID
     └ datestring✅Date du jourFormat ISO 8601 (AAAA-MM-JJ)
     └ quantitynumber✅Quantité proposée pour correction 
└ preinvoicearray❌Préfacture éventuellesnull si la rubrique n’a pas encore été envoyée
   └ idstring✅Identifiant de préfactureUUID
   └ numberstring✅Numéro de préfacture 
status[]array✅Statuts du relevé d’heures2 occurences si semaine à cheval (une par période)
└ periodstring | null❌Période (mois)Format ISO 8601Exemple : 2025-12
└ valueenum✅Statut : IN_PROGRESS┃FILLED┃SENT┃SENT_AND_APPROVED┃IN_DISPUTEEn cours de saisie / à envoyer / envoyé, envoyé et approuvé / en litige
└ sentAtstring | null❌Date d’envoi à l’agenceFormat ISO 8601 (AAAA-MM-JJ)
└ acceptedAtstring | null❌Date d’approbation par l’agenceFormat ISO 8601 (AAAA-MM-JJ)
totalTimeslotsnumber✅Total 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
}
}