{
    "events": [
        {
            "id": 1,
            "title": "Brocante de Printemps 2026",
            "description": "Grande brocante annuelle en plein air avec plus de 200 exposants.",
            "startAt": "2025-06-15T08:00:00",
            "endAt": "2025-06-15T18:00:00",
            "address": "Place de la Republique",
            "zipcode": "75003",
            "city": "Paris",
            "isOnline": false,
            "isSecret": false,
            "imageUrl": null,
            "status": "past"
        },
        {
            "id": 2,
            "title": "Convention Cosplay Ete",
            "description": "Convention cosplay avec concours, stands et animations. Evenement en cours !",
            "startAt": "2026-03-22T10:00:00",
            "endAt": "2026-03-24T19:00:00",
            "address": "Parc des Expositions",
            "zipcode": "02800",
            "city": "Beautor",
            "isOnline": true,
            "isSecret": false,
            "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": {
        "1": [
            {
                "id": 1,
                "name": "Entrees",
                "position": 0,
                "startAt": "2026-05-01T00:00:00",
                "endAt": "2026-06-15T18:00:00",
                "isHidden": false,
                "isActive": true
            },
            {
                "id": 2,
                "name": "Reservations Brocante",
                "position": 1,
                "startAt": "2026-04-01T00:00:00",
                "endAt": "2026-06-10T23:59:00",
                "isHidden": false,
                "isActive": true
            }
        ],
        "2": [
            {
                "id": 3,
                "name": "General",
                "position": 0,
                "startAt": "2026-07-01T00:00:00",
                "endAt": "2026-08-21T19:00:00",
                "isHidden": false,
                "isActive": true
            },
            {
                "id": 4,
                "name": "VIP",
                "position": 1,
                "startAt": "2026-07-01T00:00:00",
                "endAt": "2026-08-15T23:59:00",
                "isHidden": false,
                "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": {
        "1": [
            {
                "id": 1,
                "name": "Entree Adulte",
                "priceHT": 500,
                "quantity": 500,
                "sold": 312,
                "type": "billet",
                "isGeneratedBillet": true,
                "notBuyable": false,
                "position": 0
            },
            {
                "id": 2,
                "name": "Entree Enfant (-12 ans)",
                "priceHT": 0,
                "quantity": null,
                "sold": 145,
                "type": "billet",
                "isGeneratedBillet": true,
                "notBuyable": false,
                "position": 1
            }
        ],
        "2": [
            {
                "id": 3,
                "name": "Emplacement 3m",
                "priceHT": 1500,
                "quantity": 80,
                "sold": 72,
                "type": "reservation_brocante",
                "isGeneratedBillet": false,
                "notBuyable": false,
                "position": 0
            }
        ],
        "3": [
            {
                "id": 4,
                "name": "Pass 2 jours",
                "priceHT": 2000,
                "quantity": 300,
                "sold": 189,
                "type": "billet",
                "isGeneratedBillet": true,
                "notBuyable": false,
                "position": 0
            },
            {
                "id": 5,
                "name": "Pass 1 jour Samedi",
                "priceHT": 1200,
                "quantity": 200,
                "sold": 156,
                "type": "billet",
                "isGeneratedBillet": true,
                "notBuyable": false,
                "position": 1
            }
        ],
        "4": [
            {
                "id": 6,
                "name": "Pass VIP 2 jours",
                "priceHT": 5000,
                "quantity": 30,
                "sold": 28,
                "type": "billet",
                "isGeneratedBillet": true,
                "notBuyable": false,
                "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": {
        "1": {
            "id": 1,
            "name": "Entree Adulte",
            "description": "Entree standard pour les adultes. Billet electronique avec QR code.",
            "priceHT": 500,
            "quantity": 500,
            "sold": 312,
            "type": "billet",
            "isGeneratedBillet": true,
            "hasDefinedExit": false,
            "notBuyable": false,
            "position": 0,
            "imageUrl": null,
            "category": {"id": 1, "name": "Entrees"},
            "event": {"id": 1, "title": "Brocante de Printemps 2026"}
        },
        "2": {
            "id": 2,
            "name": "Entree Enfant (-12 ans)",
            "description": "Gratuit pour les enfants de moins de 12 ans.",
            "priceHT": 0,
            "quantity": null,
            "sold": 145,
            "type": "billet",
            "isGeneratedBillet": true,
            "hasDefinedExit": false,
            "notBuyable": false,
            "position": 1,
            "imageUrl": null,
            "category": {"id": 1, "name": "Entrees"},
            "event": {"id": 1, "title": "Brocante de Printemps 2026"}
        },
        "3": {
            "id": 3,
            "name": "Emplacement 3m",
            "description": "Emplacement de 3 metres lineaires pour exposant.",
            "priceHT": 1500,
            "quantity": 80,
            "sold": 72,
            "type": "reservation_brocante",
            "isGeneratedBillet": false,
            "hasDefinedExit": false,
            "notBuyable": false,
            "position": 0,
            "imageUrl": null,
            "category": {"id": 2, "name": "Reservations Brocante"},
            "event": {"id": 1, "title": "Brocante de Printemps 2026"}
        },
        "4": {
            "id": 4,
            "name": "Pass 2 jours",
            "description": "Acces aux 2 jours de la convention.",
            "priceHT": 2000,
            "quantity": 300,
            "sold": 189,
            "type": "billet",
            "isGeneratedBillet": true,
            "hasDefinedExit": true,
            "notBuyable": false,
            "position": 0,
            "imageUrl": "https://ticket.e-cosplay.fr/demo/pass-2j.jpg",
            "category": {"id": 3, "name": "General"},
            "event": {"id": 2, "title": "Convention Cosplay Ete"}
        },
        "5": {
            "id": 5,
            "name": "Pass 1 jour Samedi",
            "description": "Acces le samedi uniquement.",
            "priceHT": 1200,
            "quantity": 200,
            "sold": 156,
            "type": "billet",
            "isGeneratedBillet": true,
            "hasDefinedExit": true,
            "notBuyable": false,
            "position": 1,
            "imageUrl": null,
            "category": {"id": 3, "name": "General"},
            "event": {"id": 2, "title": "Convention Cosplay Ete"}
        },
        "6": {
            "id": 6,
            "name": "Pass VIP 2 jours",
            "description": "Acces VIP avec espace dedie, boissons et rencontre artistes.",
            "priceHT": 5000,
            "quantity": 30,
            "sold": 28,
            "type": "billet",
            "isGeneratedBillet": true,
            "hasDefinedExit": true,
            "notBuyable": false,
            "position": 0,
            "imageUrl": "https://ticket.e-cosplay.fr/demo/vip.jpg",
            "category": {"id": 4, "name": "VIP"},
            "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": {
        "ETICKET-DEMO-0001-AAAA": {
            "state": "accepted",
            "reason": null,
            "reference": "ETICKET-DEMO-0001-AAAA",
            "billetName": "Pass 2 jours",
            "buyerFirstName": "Jean",
            "buyerLastName": "Dupont",
            "isInvitation": false,
            "firstScannedAt": null,
            "hasDefinedExit": true,
            "details": {},
            "_comment": "Billet valide - jamais scanne"
        },
        "ETICKET-DEMO-0002-BBBB": {
            "state": "refused",
            "reason": "exit_definitive",
            "reference": "ETICKET-DEMO-0002-BBBB",
            "billetName": "Pass 2 jours",
            "buyerFirstName": "Marie",
            "buyerLastName": "Martin",
            "isInvitation": false,
            "firstScannedAt": "2026-03-22T11:00:00",
            "hasDefinedExit": true,
            "details": null,
            "_comment": "Billet valide - deja scanne avec sortie definitive"
        },
        "ETICKET-DEMO-0003-CCCC": {
            "state": "accepted",
            "reason": null,
            "reference": "ETICKET-DEMO-0003-CCCC",
            "billetName": "Pass 1 jour Samedi",
            "buyerFirstName": "Pierre",
            "buyerLastName": "Durand",
            "isInvitation": false,
            "firstScannedAt": "2026-03-22T10:30:00",
            "hasDefinedExit": false,
            "details": {},
            "_comment": "Billet valide - entree/sortie illimitee (deja scanne une fois)"
        },
        "ETICKET-DEMO-0004-DDDD": {
            "state": "accepted",
            "reason": null,
            "reference": "ETICKET-DEMO-0004-DDDD",
            "billetName": "Pass VIP 2 jours",
            "buyerFirstName": "Sophie",
            "buyerLastName": "Bernard",
            "isInvitation": true,
            "firstScannedAt": null,
            "hasDefinedExit": true,
            "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"
        }
    }
}
