Aller au contenu principal

Cartes (Administration)

Base URL : /api/v1/admin/org/cards

Gestion complète des cartes : création, cycle de vie, attribution aux porteurs, QR codes et imports. Les porteurs eux-mêmes sont gérés dans Cartes — Porteurs.


Statuts de carte​

StatutDescription
unassignedCréée, non attribuée
activeAttribuée et utilisable
deactivatedDésactivée
lostDéclarée perdue

Cycle de vie​

stateDiagram-v2
[*] --> unassigned: POST /cards
unassigned --> active: POST /cards/{id}/assign
active --> deactivated: POST /cards/{id}/deactivate
active --> lost: POST /cards/{id}/lost
deactivated --> active: POST /cards/{id}/activate
lost --> active: POST /cards/{id}/activate
active --> active: POST /cards/{id}/reassign

GET /admin/org/cards​

Liste paginée des cartes.

Permissions : card.read

ParamTypeDéfautDescription
searchstring—Recherche (code, numéro, porteur)
statusstring—unassigned, active, deactivated, lost
limitinteger20Éléments par page
offsetinteger0Décalage

Réponse (200) :

{
"items": [
{
"id": "uuid",
"code": "CL-EL-0008",
"card_number": "6287940000123456",
"status": "active",
"balance_cents": 5000,
"balance": 5000,
"balance_formatted": "5 000 FCFA",
"card_holder_id": "uuid",
"card_holder": {
"id": "uuid",
"first_name": "Fatou",
"last_name": "Diallo",
"establishment_name": null,
"code": "CL-EL-0008"
},
"created_at": "2025-01-10T10:00:00Z"
}
],
"total": 150,
"currency": "XOF"
}

POST /admin/org/cards​

Crée une carte, éventuellement avec un porteur inline.

Permissions : card.create

Corps de la requête​

ChampTypeRequisDescription
card_numberstringNonNuméro (auto si absent)
holder_iduuidNonPorteur existant à attribuer
holderobjectNonPorteur inline (prioritaire sur holder_id)
holder.establishment_namestringOui*Établissement
holder.last_namestringOui*Nom
holder.first_namestringOui*Prénom
holder.phone_numberstringOui*Téléphone
holder.emailstringNonEmail
holder.holder_typestringNonType de porteur (défaut other)
holder.passwordstringNonMot de passe (auto-généré sinon)
POST /api/v1/admin/org/cards
Content-Type: application/json

{
"holder": {
"establishment_name": "Cours Lumière",
"last_name": "Diallo",
"first_name": "Fatou",
"phone_number": "+22890123456"
}
}

Réponse (201) :

{
"id": "uuid",
"code": "CL-EL-0008",
"card_number": "6287940000123456",
"status": "active",
"balance_cents": 0,
"balance": 0,
"balance_formatted": "0 FCFA",
"card_holder_id": "uuid",
"created_at": "2025-01-10T10:00:00Z",
"password": "a1b2c3d4e5f6"
}
Champ password

password n'est présent que lorsqu'un porteur inline a été créé avec un mot de passe généré.


GET /admin/org/cards/{id}​

Détail d'une carte.

Permissions : card.read

Réponse (200) :

{
"id": "uuid",
"code": "CL-EL-0008",
"card_number": "6287940000123456",
"card_holder_id": "uuid",
"holder_name": "Fatou Diallo",
"status": "active",
"balance_cents": 5000,
"balance": 5000,
"balance_formatted": "5 000 FCFA",
"activated_at": "2025-01-10T10:00:00Z",
"deactivated_at": null,
"deactivated_reason": null,
"metadata": {},
"created_at": "2025-01-10T10:00:00Z",
"updated_at": "2025-01-10T10:00:00Z",
"currency": "XOF"
}

PUT /admin/org/cards/{id}​

Met à jour une carte.

Permissions : card.update

ChampTypeDescription
card_numberstringNuméro
metadataobjectMétadonnées
daily_limit_centsintegerPlafond journalier (≤ 0 retire le plafond)

Réponse (200) : { "message": "Carte mise à jour", "card": {...} }


DELETE /admin/org/cards/{id}​

Permissions : card.delete

Réponse (200) : { "message": "Carte supprimée" }


Attribution et cycle de vie​

POST /admin/org/cards/{id}/assign​

Attribue la carte à un porteur.

Permissions : card.update

{ "holder_id": "uuid" }

Réponse (200) : { "message": "Carte attribuée", "card": {...} }

POST /admin/org/cards/{id}/reassign​

Réattribue la carte à un autre porteur.

Permissions : card.update

{ "holder_id": "uuid" }

Réponse (200) : { "message": "Carte réassignée", "card": {...} }

POST /admin/org/cards/{id}/revoke​

Révoque le propriétaire actuel de la carte.

Permissions : card.update

Réponse (200) : { "message": "Propriétaire révoqué de la carte", "card": {...} }

POST /admin/org/cards/{id}/deactivate​

Désactive la carte.

Permissions : card.update

{ "reason": "Carte endommagée" }

Réponse (200) : { "message": "Carte désactivée", "card": {...} }

POST /admin/org/cards/{id}/lost​

Marque la carte comme perdue.

Permissions : card.update

{ "reason": "Déclarée perdue par le porteur" }

Réponse (200) : { "message": "Carte marquée perdue", "card": {...} }

POST /admin/org/cards/{id}/activate​

Réactive une carte.

Permissions : card.update

Réponse (200) : { "message": "Carte réactivée", "card": {...} }


QR codes et visuels​

GET /admin/org/cards/{id}/qr​

Retourne le QR code de la carte en PNG.

Permissions : card.read Type MIME : image/png (Content-Disposition: attachment; filename="{code}.png")

GET /admin/org/cards/{id}/card​

Retourne la carte formatée (350×500) en PNG.

Permissions : card.read Type MIME : image/png (filename="card_{code}.png")

POST /admin/org/cards/qr-export​

Retourne les QR codes de plusieurs cartes en base64 (max 500).

Permissions : card.read

{ "card_ids": ["uuid", "uuid"] }

Réponse (200) :

{
"items": [
{ "card_id": "uuid", "code": "CL-EL-0008", "png_base64": "iVBORw0KGgo..." }
]
}

POST /admin/org/cards/qr-export/zip​

Retourne une archive ZIP des QR codes.

Permissions : card.read Type MIME : application/zip (entrées qr_codes/{code}.png)

POST /admin/org/cards/cards-export/zip​

Retourne une archive ZIP des cartes formatées.

Permissions : card.read Type MIME : application/zip (entrées cards/{code}.png)


POST /admin/org/cards/import​

Importe des cartes en lot (max 500).

Permissions : card.create

{
"cards": [
{
"card_number": "6287940000123456",
"code": "CL-EL-0009",
"holder_id": "uuid",
"status": "active",
"daily_limit_cents": 2000
}
]
}

Réponse (200) :

{
"message": "3 cartes importées",
"created": 3,
"cards": [ ],
"currency": "XOF"
}

Permissions​

PermissionDescription
card.readLecture des cartes et QR codes
card.createCréation et import
card.updateModification, attribution, cycle de vie
card.deleteSuppression
card.manageSuper-permission couvrant toutes les opérations