Update sandbox fixtures: 3 events (past/ongoing/upcoming), 5 scan scenarios

Events:
- #1 Brocante de Printemps (past, offline)
- #2 Convention Cosplay (ongoing, online)
- #3 Marche de Noel (upcoming, online)

6 categories, 8 billets across all events

Scan scenarios for event #2 (ongoing):
- DEMO-0001: valid, never scanned
- DEMO-0002: refused, exit_definitive (already scanned with definitive exit)
- DEMO-0003: accepted, unlimited entry/exit (already scanned once)
- DEMO-0004: accepted, invitation (never scanned)
- DEMO-0005: refused, invalid (vote type - no generated ticket)

API doc: show sandbox event IDs and scan references with colored badges

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-23 19:15:38 +01:00
parent 40e89afc71
commit e6b410e715
2 changed files with 152 additions and 23 deletions

View File

@@ -4,27 +4,43 @@
"id": 1, "id": 1,
"title": "Brocante de Printemps 2026", "title": "Brocante de Printemps 2026",
"description": "Grande brocante annuelle en plein air avec plus de 200 exposants.", "description": "Grande brocante annuelle en plein air avec plus de 200 exposants.",
"startAt": "2026-06-15T08:00:00", "startAt": "2025-06-15T08:00:00",
"endAt": "2026-06-15T18:00:00", "endAt": "2025-06-15T18:00:00",
"address": "Place de la Republique", "address": "Place de la Republique",
"zipcode": "75003", "zipcode": "75003",
"city": "Paris", "city": "Paris",
"isOnline": true, "isOnline": false,
"isSecret": false, "isSecret": false,
"imageUrl": null "imageUrl": null,
"status": "past"
}, },
{ {
"id": 2, "id": 2,
"title": "Convention Cosplay Ete", "title": "Convention Cosplay Ete",
"description": "Convention cosplay avec concours, stands et animations.", "description": "Convention cosplay avec concours, stands et animations. Evenement en cours !",
"startAt": "2026-08-20T10:00:00", "startAt": "2026-03-22T10:00:00",
"endAt": "2026-08-21T19:00:00", "endAt": "2026-03-24T19:00:00",
"address": "Parc des Expositions", "address": "Parc des Expositions",
"zipcode": "02800", "zipcode": "02800",
"city": "Beautor", "city": "Beautor",
"isOnline": true, "isOnline": true,
"isSecret": false, "isSecret": false,
"imageUrl": "https://ticket.e-cosplay.fr/demo/convention.jpg" "imageUrl": "https://ticket.e-cosplay.fr/demo/convention.jpg",
"status": "ongoing"
},
{
"id": 3,
"title": "Marche de Noel 2026",
"description": "Marche de Noel avec chalets, vin chaud et animations pour enfants.",
"startAt": "2026-12-15T10:00:00",
"endAt": "2026-12-24T20:00:00",
"address": "Place du Marche",
"zipcode": "59000",
"city": "Lille",
"isOnline": true,
"isSecret": false,
"imageUrl": null,
"status": "upcoming"
} }
], ],
"categories": { "categories": {
@@ -67,6 +83,26 @@
"isHidden": false, "isHidden": false,
"isActive": true "isActive": true
} }
],
"3": [
{
"id": 5,
"name": "Chalets & Stands",
"position": 0,
"startAt": "2026-10-01T00:00:00",
"endAt": "2026-12-14T23:59:00",
"isHidden": false,
"isActive": true
},
{
"id": 6,
"name": "Entrees Visiteurs",
"position": 1,
"startAt": "2026-11-01T00:00:00",
"endAt": "2026-12-24T20:00:00",
"isHidden": false,
"isActive": true
}
] ]
}, },
"billets": { "billets": {
@@ -143,6 +179,32 @@
"notBuyable": false, "notBuyable": false,
"position": 0 "position": 0
} }
],
"5": [
{
"id": 7,
"name": "Chalet Standard (3m)",
"priceHT": 8000,
"quantity": 40,
"sold": 12,
"type": "reservation_brocante",
"isGeneratedBillet": false,
"notBuyable": false,
"position": 0
}
],
"6": [
{
"id": 8,
"name": "Entree Gratuite",
"priceHT": 0,
"quantity": null,
"sold": 0,
"type": "billet",
"isGeneratedBillet": true,
"notBuyable": false,
"position": 0
}
] ]
}, },
"billetDetails": { "billetDetails": {
@@ -241,6 +303,38 @@
"imageUrl": "https://ticket.e-cosplay.fr/demo/vip.jpg", "imageUrl": "https://ticket.e-cosplay.fr/demo/vip.jpg",
"category": {"id": 4, "name": "VIP"}, "category": {"id": 4, "name": "VIP"},
"event": {"id": 2, "title": "Convention Cosplay Ete"} "event": {"id": 2, "title": "Convention Cosplay Ete"}
},
"7": {
"id": 7,
"name": "Chalet Standard (3m)",
"description": "Chalet en bois de 3 metres avec eclairage et prise electrique.",
"priceHT": 8000,
"quantity": 40,
"sold": 12,
"type": "reservation_brocante",
"isGeneratedBillet": false,
"hasDefinedExit": false,
"notBuyable": false,
"position": 0,
"imageUrl": null,
"category": {"id": 5, "name": "Chalets & Stands"},
"event": {"id": 3, "title": "Marche de Noel 2026"}
},
"8": {
"id": 8,
"name": "Entree Gratuite",
"description": "Entree gratuite pour tous les visiteurs du marche de Noel.",
"priceHT": 0,
"quantity": null,
"sold": 0,
"type": "billet",
"isGeneratedBillet": true,
"hasDefinedExit": false,
"notBuyable": false,
"position": 0,
"imageUrl": null,
"category": {"id": 6, "name": "Entrees Visiteurs"},
"event": {"id": 3, "title": "Marche de Noel 2026"}
} }
}, },
"scan": { "scan": {
@@ -254,43 +348,60 @@
"isInvitation": false, "isInvitation": false,
"firstScannedAt": null, "firstScannedAt": null,
"hasDefinedExit": true, "hasDefinedExit": true,
"details": {} "details": {},
"_comment": "Billet valide - jamais scanne"
}, },
"ETICKET-DEMO-0002-BBBB": { "ETICKET-DEMO-0002-BBBB": {
"state": "refused", "state": "refused",
"reason": "already_scanned", "reason": "exit_definitive",
"reference": "ETICKET-DEMO-0002-BBBB", "reference": "ETICKET-DEMO-0002-BBBB",
"billetName": "Entree Adulte", "billetName": "Pass 2 jours",
"buyerFirstName": "Marie", "buyerFirstName": "Marie",
"buyerLastName": "Martin", "buyerLastName": "Martin",
"isInvitation": false, "isInvitation": false,
"firstScannedAt": "2026-06-15T09:30:00", "firstScannedAt": "2026-03-22T11:00:00",
"hasDefinedExit": false, "hasDefinedExit": true,
"details": null "details": null,
"_comment": "Billet valide - deja scanne avec sortie definitive"
}, },
"ETICKET-DEMO-0003-CCCC": { "ETICKET-DEMO-0003-CCCC": {
"state": "refused", "state": "accepted",
"reason": "invalid", "reason": null,
"reference": "ETICKET-DEMO-0003-CCCC", "reference": "ETICKET-DEMO-0003-CCCC",
"billetName": "Pass VIP 2 jours", "billetName": "Pass 1 jour Samedi",
"buyerFirstName": "Pierre", "buyerFirstName": "Pierre",
"buyerLastName": "Durand", "buyerLastName": "Durand",
"isInvitation": false, "isInvitation": false,
"firstScannedAt": null, "firstScannedAt": "2026-03-22T10:30:00",
"hasDefinedExit": true, "hasDefinedExit": false,
"details": null "details": {},
"_comment": "Billet valide - entree/sortie illimitee (deja scanne une fois)"
}, },
"ETICKET-DEMO-0004-DDDD": { "ETICKET-DEMO-0004-DDDD": {
"state": "accepted", "state": "accepted",
"reason": null, "reason": null,
"reference": "ETICKET-DEMO-0004-DDDD", "reference": "ETICKET-DEMO-0004-DDDD",
"billetName": "Pass 1 jour Samedi", "billetName": "Pass VIP 2 jours",
"buyerFirstName": "Sophie", "buyerFirstName": "Sophie",
"buyerLastName": "Bernard", "buyerLastName": "Bernard",
"isInvitation": true, "isInvitation": true,
"firstScannedAt": null, "firstScannedAt": null,
"hasDefinedExit": true, "hasDefinedExit": true,
"details": {} "details": {},
"_comment": "Invitation - jamais scannee"
},
"ETICKET-DEMO-0005-EEEE": {
"state": "refused",
"reason": "invalid",
"reference": "ETICKET-DEMO-0005-EEEE",
"billetName": "Vote Meilleur Cosplay",
"buyerFirstName": "Lucas",
"buyerLastName": "Petit",
"isInvitation": false,
"firstScannedAt": null,
"hasDefinedExit": false,
"details": null,
"_comment": "Vote - pas de billet genere, refuse car type vote"
} }
} }
} }

View File

@@ -43,7 +43,25 @@
<p class="font-mono font-bold text-sm text-[#fabf04]" id="env-base-url">https://ticket.e-cosplay.fr/api/sandbox</p> <p class="font-mono font-bold text-sm text-[#fabf04]" id="env-base-url">https://ticket.e-cosplay.fr/api/sandbox</p>
</div> </div>
<p class="mt-2 text-xs font-bold text-gray-400" id="env-description">Environnement de test. Les donnees ne sont pas modifiees.</p> <p class="mt-2 text-xs font-bold text-gray-400" id="env-description">Environnement de test. Les donnees ne sont pas modifiees.</p>
<p class="mt-2 text-xs font-bold text-gray-500">L'authentification (<span class="font-mono">/api/auth/login</span>) est commune aux deux environnements.</p> <p class="mt-2 text-xs font-bold text-gray-500">L'authentification (<span class="font-mono">/api/auth/login</span>) est commune aux deux environnements (vos vrais identifiants).</p>
<div class="mt-4 border-2 border-gray-700 bg-gray-800 p-4">
<p class="text-[10px] font-black uppercase tracking-widest text-orange-400 mb-2">Donnees Sandbox</p>
<p class="text-xs font-bold text-gray-400 mb-2">La sandbox retourne des donnees fictives identiques pour tous les utilisateurs :</p>
<div class="flex flex-wrap gap-2 text-xs">
<span class="font-mono px-2 py-1 border border-gray-600 text-gray-300">Event #1 <span class="text-gray-500">(passe)</span></span>
<span class="font-mono px-2 py-1 border border-green-600 text-green-400">Event #2 <span class="text-green-600">(en cours)</span></span>
<span class="font-mono px-2 py-1 border border-indigo-600 text-indigo-400">Event #3 <span class="text-indigo-600">(a venir)</span></span>
</div>
<p class="text-xs font-bold text-gray-500 mt-3">References de scan disponibles :</p>
<div class="flex flex-wrap gap-2 mt-1 text-xs font-mono">
<span class="px-2 py-1 border border-green-600 text-green-400">ETICKET-DEMO-0001-AAAA</span>
<span class="px-2 py-1 border border-red-600 text-red-400">ETICKET-DEMO-0002-BBBB</span>
<span class="px-2 py-1 border border-green-600 text-green-400">ETICKET-DEMO-0003-CCCC</span>
<span class="px-2 py-1 border border-green-600 text-green-400">ETICKET-DEMO-0004-DDDD</span>
<span class="px-2 py-1 border border-red-600 text-red-400">ETICKET-DEMO-0005-EEEE</span>
</div>
</div>
</div> </div>
<div class="mt-8"> <div class="mt-8">