{
  "info": {
    "name": "Gobot SUNU Assurance API",
    "description": "Collection Postman pour l'API gobot-sunu-assurance — v20.20.1\nBase URL : http://localhost:8000/api/v1",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "_exporter_id": "gobot-sunu-api"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "http://localhost:8000/api/v1",
      "type": "string"
    },
    {
      "key": "chatbot",
      "value": "MTN",
      "type": "string"
    },
    {
      "key": "customer_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "phone",
      "value": "22961000001",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "🏓 Health Check",
      "item": [
        {
          "name": "Ping",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/ping",
              "host": ["{{base_url}}"],
              "path": ["ping"]
            },
            "description": "Vérifie que l'API est en ligne."
          },
          "response": [
            {
              "name": "OK",
              "status": "OK",
              "code": 200,
              "body": "{\n  \"status\": \"ok\",\n  \"timestamp\": \"2026-03-26T10:00:00.000000Z\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "📋 Souscriptions",
      "item": [
        {
          "name": "Créer une souscription AUTO",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "Accept", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"22961000001\",\n  \"lastname\": \"DOE\",\n  \"firstname\": \"John\",\n  \"email\": \"john.doe@example.com\",\n  \"birth_date\": \"1990-05-15\",\n\n  \"type\": \"auto\",\n  \"status\": \"pending\",\n  \"chatbot\": \"MTN\",\n  \"session_id\": \"sess_auto_001\",\n\n  \"codeproduit\": \"AUTO\",\n  \"codeformule\": \"TIERS\",\n  \"codeduree\": \"AN1\",\n\n  \"start_date\": \"2026-01-01\",\n  \"end_date\": \"2026-12-31\",\n\n  \"msisdn_payment\": \"22961000001\",\n  \"amount\": 45000,\n  \"fees\": 500,\n  \"payment_method\": \"MTN_MOMO\",\n  \"transaction_id\": \"TXN123456\",\n  \"payment_status\": \"SUCCESS\",\n  \"receipt_number\": \"RCP001\",\n\n  \"metadata\": {\n    \"immatriculation\": \"BJ-1234-AB\",\n    \"marque\": \"Toyota\",\n    \"modele\": \"Corolla\",\n    \"chassis\": \"JT123456789\",\n    \"genre\": \"VP\",\n    \"usage\": \"Particulier\",\n    \"energie\": \"Essence\",\n    \"puissance\": 90,\n    \"nbplace\": 5,\n    \"classe\": \"3\",\n    \"csp\": \"A\",\n    \"zonecirculation\": \"BJ\",\n    \"datemiseencirculation\": \"2018-03-01\"\n  }\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{base_url}}/subscriptions",
              "host": ["{{base_url}}"],
              "path": ["subscriptions"]
            },
            "description": "Crée une souscription AUTO avec création/lookup du client par téléphone."
          },
          "response": [
            {
              "name": "201 Created",
              "status": "Created",
              "code": 201,
              "body": "{\n  \"success\": true,\n  \"message\": \"Souscription enregistrée avec succès.\",\n  \"data\": { ... }\n}"
            },
            {
              "name": "409 Doublon",
              "status": "Conflict",
              "code": 409,
              "body": "{\n  \"success\": false,\n  \"message\": \"Une souscription existe déjà pour ce client avec ce chatbot.\"\n}"
            }
          ]
        },
        {
          "name": "Créer une souscription VOYAGE",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "Accept", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"22996000002\",\n  \"lastname\": \"MARTIN\",\n  \"firstname\": \"Claire\",\n  \"email\": \"claire.martin@example.com\",\n  \"birth_date\": \"1985-08-20\",\n\n  \"type\": \"voyage\",\n  \"status\": \"pending\",\n  \"chatbot\": \"MOOV\",\n  \"session_id\": \"sess_voyage_001\",\n\n  \"codeproduit\": \"VOYAGE\",\n  \"codeformule\": \"STANDARD\",\n  \"codeduree\": \"MOIS1\",\n\n  \"start_date\": \"2026-04-01\",\n  \"end_date\": \"2026-04-30\",\n\n  \"msisdn_payment\": \"22996000002\",\n  \"amount\": 25000,\n  \"fees\": 300,\n  \"payment_method\": \"MOOV_MONEY\",\n  \"transaction_id\": \"TXN789012\",\n  \"payment_status\": \"SUCCESS\",\n  \"receipt_number\": \"RCP002\",\n\n  \"metadata\": {\n    \"codedesti\": \"EUR\",\n    \"codepays\": \"FR\",\n    \"duree\": 30,\n    \"nomvoyageur\": \"MARTIN\",\n    \"prenomvoyageur\": \"Claire\",\n    \"datenaissancevoyageur\": \"1985-08-20\",\n    \"age\": 40,\n    \"telephonevoyageur\": \"22996000002\",\n    \"emailvoyageur\": \"claire.martin@example.com\",\n    \"numpiece\": \"AB123456\"\n  }\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{base_url}}/subscriptions",
              "host": ["{{base_url}}"],
              "path": ["subscriptions"]
            },
            "description": "Crée une souscription VOYAGE."
          },
          "response": []
        },
        {
          "name": "Voir une souscription",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Accept", "value": "application/json" }
            ],
            "url": {
              "raw": "{{base_url}}/subscriptions/{{chatbot}}",
              "host": ["{{base_url}}"],
              "path": ["subscriptions", "{{chatbot}}"]
            },
            "description": "Récupère une souscription par son identifiant chatbot (ex: MTN, MOOV)."
          },
          "response": [
            {
              "name": "200 OK",
              "status": "OK",
              "code": 200,
              "body": "{\n  \"success\": true,\n  \"data\": { ... }\n}"
            },
            {
              "name": "404 Not Found",
              "status": "Not Found",
              "code": 404,
              "body": "{\n  \"message\": \"No query results for model [Subscription].\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "👤 Clients",
      "item": [
        {
          "name": "Souscriptions d'un client",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Accept", "value": "application/json" }
            ],
            "url": {
              "raw": "{{base_url}}/customers/{{customer_id}}/subscriptions",
              "host": ["{{base_url}}"],
              "path": ["customers", "{{customer_id}}", "subscriptions"]
            },
            "description": "Liste toutes les souscriptions d'un client par son ID."
          },
          "response": [
            {
              "name": "200 OK",
              "status": "OK",
              "code": 200,
              "body": "{\n  \"success\": true,\n  \"data\": [ ... ]\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "🤖 Chatbot Infobip",
      "item": [
        {
          "name": "Init session chatbot",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Accept", "value": "application/json" }
            ],
            "url": {
              "raw": "{{base_url}}/chatbot/customers/contracts?phone={{phone}}&type=auto&session_id=sess_init_001",
              "host": ["{{base_url}}"],
              "path": ["chatbot", "customers", "contracts"],
              "query": [
                { "key": "phone", "value": "{{phone}}" },
                { "key": "type", "value": "auto" },
                { "key": "session_id", "value": "sess_init_001" }
              ]
            },
            "description": "Initialise une session chatbot pour un client. Retourne ses contrats actifs et les 3 derniers.\n\n⚠️ Route GET avec query params (imposé par Infobip)."
          },
          "response": [
            {
              "name": "200 READY",
              "status": "OK",
              "code": 200,
              "body": "{\n  \"success\": true,\n  \"code\": \"READY\",\n  \"customer_id\": 1,\n  \"contrats_actifs\": [],\n  \"derniers_contrats\": []\n}"
            },
            {
              "name": "200 SESSION_EXISTS",
              "status": "OK",
              "code": 200,
              "body": "{\n  \"success\": true,\n  \"code\": \"SESSION_EXISTS\",\n  \"message\": \"Session déjà initialisée.\"\n}"
            }
          ]
        },
        {
          "name": "Webhook Infobip",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "Accept", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sessionId\": \"sess_auto_001\",\n  \"event\": \"PAYMENT_SUCCESS\",\n  \"payload\": {\n    \"transaction_id\": \"TXN123456\",\n    \"amount\": 45000,\n    \"msisdn\": \"22961000001\"\n  }\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{base_url}}/chatbot/webhook",
              "host": ["{{base_url}}"],
              "path": ["chatbot", "webhook"]
            },
            "description": "Reçoit un webhook d'Infobip et le transmet au service InfobipService."
          },
          "response": [
            {
              "name": "200 WEBHOOK_SENT",
              "status": "OK",
              "code": 200,
              "body": "{\n  \"success\": true,\n  \"code\": \"WEBHOOK_SENT\",\n  \"message\": \"Webhook transmis avec succès.\"\n}"
            },
            {
              "name": "400 sessionId manquant",
              "status": "Bad Request",
              "code": 400,
              "body": "{\n  \"error\": \"sessionId manquant\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "🚫 Blacklist",
      "item": [
        {
          "name": "Vérifier un numéro (phone)",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Accept", "value": "application/json" }
            ],
            "url": {
              "raw": "{{base_url}}/blacklist/check?target_type=phone&target_value={{phone}}&service=mtn",
              "host": ["{{base_url}}"],
              "path": ["blacklist", "check"],
              "query": [
                { "key": "target_type", "value": "phone" },
                { "key": "target_value", "value": "{{phone}}" },
                { "key": "service", "value": "mtn", "description": "Slug service — optionnel. null = check global." }
              ]
            },
            "description": "Vérifie si un numéro est blacklisté pour un service donné.\n\nservice est optionnel — si absent, check global tous services."
          },
          "response": [
            {
              "name": "200 Non bloqué",
              "status": "OK",
              "code": 200,
              "body": "{\n  \"success\": true,\n  \"blocked\": false\n}"
            },
            {
              "name": "200 Bloqué",
              "status": "OK",
              "code": 200,
              "body": "{\n  \"success\": true,\n  \"blocked\": true\n}"
            }
          ]
        },
        {
          "name": "Vérifier un email",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Accept", "value": "application/json" }
            ],
            "url": {
              "raw": "{{base_url}}/blacklist/check?target_type=email&target_value=fraudeur@test.com",
              "host": ["{{base_url}}"],
              "path": ["blacklist", "check"],
              "query": [
                { "key": "target_type", "value": "email" },
                { "key": "target_value", "value": "fraudeur@test.com" }
              ]
            },
            "description": "Vérifie si un email est blacklisté globalement."
          },
          "response": []
        },
        {
          "name": "Vérifier un customer_id",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Accept", "value": "application/json" }
            ],
            "url": {
              "raw": "{{base_url}}/blacklist/check?target_type=customer_id&target_value={{customer_id}}",
              "host": ["{{base_url}}"],
              "path": ["blacklist", "check"],
              "query": [
                { "key": "target_type", "value": "customer_id" },
                { "key": "target_value", "value": "{{customer_id}}" }
              ]
            },
            "description": "Vérifie si un client est blacklisté par son ID."
          },
          "response": []
        }
      ]
    },
    {
      "name": "🎁 Rewards MTN",
      "item": [
        {
          "name": "Vérifier éligibilité reward",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Accept", "value": "application/json" }
            ],
            "url": {
              "raw": "{{base_url}}/rewards/mtn/check?msisdn={{phone}}",
              "host": ["{{base_url}}"],
              "path": ["rewards", "mtn", "check"],
              "query": [
                { "key": "msisdn", "value": "{{phone}}" }
              ]
            },
            "description": "Vérifie si un numéro MTN est éligible à un reward.\n\nChecks effectués :\n1. Blacklist MTN\n2. Quota jour (1 max)\n3. Quota semaine ISO (2 max lundi→dimanche)"
          },
          "response": [
            {
              "name": "200 Éligible",
              "status": "OK",
              "code": 200,
              "body": "{\n  \"eligible\": true,\n  \"weekly_count\": 1,\n  \"remaining_week\": 1,\n  \"message\": \"Numéro éligible à un reward.\"\n}"
            },
            {
              "name": "403 Blacklisté",
              "status": "Forbidden",
              "code": 403,
              "body": "{\n  \"eligible\": false,\n  \"reason\": \"blacklisted\",\n  \"message\": \"Ce numéro est blacklisté donc ne peut pas bénéficier d'un reward.\"\n}"
            },
            {
              "name": "429 Quota jour",
              "status": "Too Many Requests",
              "code": 429,
              "body": "{\n  \"eligible\": false,\n  \"reason\": \"daily_quota_exceeded\",\n  \"message\": \"Ce numéro a déjà bénéficié d'un reward aujourd'hui.\"\n}"
            },
            {
              "name": "429 Quota semaine",
              "status": "Too Many Requests",
              "code": 429,
              "body": "{\n  \"eligible\": false,\n  \"reason\": \"weekly_quota_exceeded\",\n  \"message\": \"Ce numéro a atteint le plafond de 2 rewards pour cette semaine.\"\n}"
            }
          ]
        },
        {
          "name": "Enregistrer un reward",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "Accept", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"msisdn_payment\": \"22961000001\",\n  \"msisdn_advantage\": \"22961000001\",\n  \"amount\": 100,\n  \"chatbot\": \"MTN\",\n  \"status\": \"success\",\n  \"description\": \"Reward souscription auto\",\n  \"reward_type\": \"CASHBACK\",\n  \"status_operation\": \"SUCCESS\",\n  \"date_operation\": \"2026-03-26T10:00:00\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{base_url}}/rewards/mtn",
              "host": ["{{base_url}}"],
              "path": ["rewards", "mtn"]
            },
            "description": "Enregistre un reward MTN en base.\n\n⚠️ Appeler /rewards/mtn/check AVANT pour valider l'éligibilité — ce endpoint ne re-vérifie pas."
          },
          "response": [
            {
              "name": "201 Created",
              "status": "Created",
              "code": 201,
              "body": "{\n  \"success\": true,\n  \"data\": { ... }\n}"
            }
          ]
        }
      ]
    }
  ]
}
