{"id":2839,"date":"2019-10-29T20:35:14","date_gmt":"2019-10-29T19:35:14","guid":{"rendered":"http:\/\/grandcercle.org\/?page_id=2839"},"modified":"2026-09-13T20:47:54","modified_gmt":"2026-09-13T18:47:54","slug":"cva","status":"publish","type":"page","link":"https:\/\/www.grandcercle.org\/en\/cva\/","title":{"rendered":"CVA &amp; Partners"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2839\" class=\"elementor elementor-2839\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8d4ff3e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8d4ff3e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e603c22\" data-id=\"e603c22\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5aefbf9 elementor-widget elementor-widget-html\" data-id=\"5aefbf9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"gc-section\">\n  <p>La Carte de Vie Associative donne acc\u00e8s \u00e0 des r\u00e9ductions chez nos partenaires et sur les \u00e9v\u00e9nements Grenoble INP, toute l'ann\u00e9e, pour 20 \u20ac.<\/p>\n\n  <h2>Comment \u00e7a marche<\/h2>\n  <p>100 % digitale : la carte s'ach\u00e8te et se g\u00e8re enti\u00e8rement depuis l'application. Elle porte votre num\u00e9ro CVA et s'affiche \u00e0 l'\u00e9cran, sans support physique \u00e0 perdre.<\/p>\n\n  <h2>Les avantages<\/h2>\n  <ul>\n    <li>R\u00e9ductions sur les \u00e9v\u00e9nements Grenoble INP des diff\u00e9rents BDE (soir\u00e9es, \"Cafet\", week-end d'int\u00e9gration)<\/li>\n    <li>R\u00e9ductions dans de nombreuses enseignes partenaires (bars, restaurants, loisirs, magasins)<\/li>\n    <li>R\u00e9ductions sur les forfaits et la location de ski<\/li>\n  <\/ul><br>\n\n  <a href=\"https:\/\/app.grandcercle.org\/cva\" class=\"gc-btn gc-btn-primary\">Acheter ma CVA<\/a>\n  <p style=\"margin-top:16px;font-size:.95rem;color:var(--gc-secondary-text);\">\n    La carte se g\u00e8re dans l'application, avec la billetterie, les boutiques et les annuaires :\n    <a href=\"\/application\/\">voir tout ce qu'elle permet<\/a>.\n  <\/p>\n<\/section>\n\n<section class=\"gc-section\">\n  <h2 style=\"text-align:center;\">Nos partenaires<\/h2>\n<\/section>\n\n<div class=\"gc-directory-toolbar\">\n  <input type=\"search\" id=\"gc-cva-search\" class=\"gc-search-input\" placeholder=\"Rechercher un partenaire\u2026\" \/>\n<\/div>\n<div class=\"gc-directory-filters\" id=\"gc-cva-filters\">\n  <button type=\"button\" data-cat=\"Toutes\">Toutes<\/button>\n  <button type=\"button\" data-cat=\"Restauration\">Restauration<\/button>\n  <button type=\"button\" data-cat=\"Bar\">Bar<\/button>\n  <button type=\"button\" data-cat=\"Ski\">Ski<\/button>\n  <button type=\"button\" data-cat=\"Magasin\">Magasin<\/button>\n  <button type=\"button\" data-cat=\"Loisirs\">Loisirs<\/button>\n<\/div>\n\n<div id=\"gc-cva-state\" class=\"gc-directory-state\">Chargement des partenaires\u2026<\/div>\n<div id=\"gc-cva-grid\" class=\"gc-card-grid\" style=\"display:none;\"><\/div>\n\n<div class=\"gc-sheet-backdrop\" id=\"gc-sheet-backdrop\"><\/div>\n<div class=\"gc-sheet\" id=\"gc-sheet\" role=\"dialog\" aria-modal=\"true\">\n  <div class=\"gc-sheet-topbar\">\n    <div class=\"gc-sheet-topbar-title\" id=\"gc-sheet-title\"><\/div>\n    <button class=\"gc-sheet-close\" id=\"gc-sheet-close\" aria-label=\"Fermer\">\u2715<\/button>\n  <\/div>\n  <div class=\"gc-sheet-body\" id=\"gc-sheet-body\"><\/div>\n<\/div>\n\n<script type=\"module\">\n  import { initializeApp } from \"https:\/\/www.gstatic.com\/firebasejs\/10.14.1\/firebase-app.js\";\n  import { getFirestore, collection, query, where, getDocs }\n    from \"https:\/\/www.gstatic.com\/firebasejs\/10.14.1\/firebase-firestore.js\";\n\n  const firebaseConfig = {\n    apiKey: \"AIzaSyBvrGB5uRgTZ2stBLsq_RAHbJ0f5Pdj2GQ\",\n    authDomain: \"gc-app-v1-pn9e05.firebaseapp.com\",\n    projectId: \"gc-app-v1-pn9e05\",\n    storageBucket: \"gc-app-v1-pn9e05.firebasestorage.app\",\n    messagingSenderId: \"591252529310\",\n    appId: \"1:591252529310:web:06f69c621f1c8d05ea5b8f\"\n  };\n  const app = initializeApp(firebaseConfig);\n  const db = getFirestore(app);\n\n  \/\/ GCDirectory : biblioth\u00e8que partag\u00e9e par les 3 annuaires (escapeHtml, normalize, slugify,\n  \/\/ buildSocialLinks, verrouillage du scroll, m\u00e9canique de fiche d\u00e9tail) \u2014 d\u00e9finie une seule fois dans\n  \/\/ le snippet global \"Header & footer\" (Phase 2). Si ce message appara\u00eet, recopie ce snippet en entier.\n  if (!window.GCDirectory) {\n    console.error('GC: window.GCDirectory absent \u2014 recopie le snippet global \"Header & footer\" (Phase 2), il a \u00e9t\u00e9 mis \u00e0 jour.');\n  }\n  const { escapeHtml, normalize, slugify, buildSocialLinks, initEntitySheetNav } = window.GCDirectory;\n  \/\/ Repli si le snippet \u00ab Header & footer \u00bb n'est pas encore \u00e0 jour : les deux se\n  \/\/ collent s\u00e9par\u00e9ment, il existe donc toujours une fen\u00eatre o\u00f9 la page est en\n  \/\/ avance sur le snippet. Sans ce repli, `gcChipStyle` vaut `undefined`, l'appel\n  \/\/ l\u00e8ve, et l'annuaire entier dispara\u00eet derri\u00e8re un message de panne r\u00e9seau.\n  const chipStyle = window.GCDirectory.gcChipStyle ||\n    function (bg) { return 'background:' + bg; };\n\n\n  \/\/ Nom du param\u00e8tre URL du filtre cat\u00e9gorie \u2014 change-le ici si besoin, tout le reste s'adapte.\n  const CATEGORY_PARAM = 'categorie';\n  const CATEGORIES = ['Restauration', 'Bar', 'Ski', 'Magasin', 'Loisirs'];\n  \/\/ Couleurs par cat\u00e9gorie \u2014 celles de getOfferColor() (custom_code\/functions\/get_offer_color.dart),\n  \/\/ donc exactement celles de l'appli. L'ENCRE, elle, n'est plus \u00e9crite ici : chipStyle()\n  \/\/ la d\u00e9duit de la luminance du fond. \u00ab Autres \u00bb est en #FDF29A, un jaune tr\u00e8s p\u00e2le sur\n  \/\/ lequel le blanc de .gc-chip \u00e9tait illisible ; la couleur est conserv\u00e9e (c'est celle de\n  \/\/ l'appli), c'est le texte qui s'adapte.\n  \/\/ \u26a0\ufe0f L'appli a le m\u00eame d\u00e9faut d'affichage sur cette cat\u00e9gorie : \u00e0 corriger c\u00f4t\u00e9 Dart.\n  const CATEGORY_COLORS = {\n    'Restauration': '#007BFF',\n    'Bar': '#FF9800',\n    'Ski': '#4CAF50',\n    'Magasin': '#F44336',\n    'Loisirs': '#9C27B0',\n    'Autres': '#FDF29A'\n  };\n\n  let allEntities = [];  \/\/ { id, data, slug, offers: [...], categories: Set }\n  let selectedCategory = 'Toutes';\n  let searchText = '';\n\n  \/\/ Format DD\/MM\/YY (twoDigitYear=true, utilis\u00e9 pour startDate) ou DD\/MM\/YYYY (endDate) \u2014 m\u00eames formats que l'appli.\n  function formatOfferDate(ts, twoDigitYear) {\n    if (!ts) return '';\n    const d = ts.toDate ? ts.toDate() : new Date(ts);\n    const dd = String(d.getDate()).padStart(2, '0');\n    const mm = String(d.getMonth() + 1).padStart(2, '0');\n    const yyyy = d.getFullYear();\n    return dd + '\/' + mm + '\/' + (twoDigitYear ? String(yyyy).slice(-2) : yyyy);\n  }\n\n  \/* ---------- Bottom sheet, pilot\u00e9 par l'URL ?entity=slug ---------- *\/\n  \/\/ Reproduit OfferCVADetailWidget : chip cat\u00e9gorie (pas de titre s\u00e9par\u00e9), description HTML repliable,\n  \/\/ modalit\u00e9s en italique, dates si pr\u00e9sentes, bouton lien. Seules les offres avec une description non vide\n  \/\/ sont list\u00e9es ici (m\u00eame filtre que l'appli) \u2014 mais TOUTES les offres actives comptent pour les chips de la carte.\n  function renderOffersHtml(withDescription) {\n    let html = '<div class=\"gc-offers-title\">\u2728 Offre(s) CVA \u2b50<\/div>';\n    if (withDescription.length === 0) {\n      html += '<p style=\"text-align:center;color:var(--gc-secondary-text);\">Aucune offre active pour le moment.<\/p>';\n      return html;\n    }\n    html += withDescription.map(function (o, idx) {\n      const datesParts = [];\n      if (o.startDate) datesParts.push('<span>Valable \u00e0 partir du ' + formatOfferDate(o.startDate, true) + '<\/span>');\n      if (o.endDate) datesParts.push('<span>Offre disponible jusqu\u2019au ' + formatOfferDate(o.endDate, false) + ' inclus<\/span>');\n      return '<div class=\"gc-offer\">' +\n        '<div class=\"gc-offer-head\">' +\n          (o.type ? '<span class=\"gc-chip\" style=\"' + chipStyle(CATEGORY_COLORS[o.type] || '#57636C') + '\">' + escapeHtml(o.type) + '<\/span>' : '') +\n        '<\/div>' +\n        '<div class=\"gc-offer-divider\"><\/div>' +\n        '<div class=\"gc-offer-body\">' +\n          \/\/ description est du HTML de confiance saisi c\u00f4t\u00e9 appli (ex. \"<p>...<\/p>\") \u2014 inject\u00e9 tel quel, non \u00e9chapp\u00e9, comme HtmlViewer le fait dans l'appli.\n          '<div class=\"gc-offer-desc\" id=\"gc-offer-desc-' + idx + '\">' + o.description + '<\/div>' +\n          (o.modalites ? '<p class=\"gc-offer-modalites\">' + escapeHtml(o.modalites) + '<\/p>' : '') +\n          (datesParts.length ? '<p class=\"gc-offer-dates\">' + datesParts.join('') + '<\/p>' : '') +\n          (o.linkOffer ? '<a href=\"' + escapeHtml(o.linkOffer) + '\" target=\"_blank\" rel=\"noopener\" class=\"gc-btn gc-btn-primary\" style=\"margin-top:10px;\">' + escapeHtml(o.txtBtnLinkOffer || 'Ouvrir le lien') + '<\/a>' : '') +\n        '<\/div>' +\n      '<\/div>';\n    }).join('');\n    return html;\n  }\n\n  function renderSheetContent(item) {\n    const data = item.data;\n    const images = data.imagesEntity || [];\n    const banner = images[0] || data.coverUrl || '';\n    const avatar = data.imageUrl || '';\n    const extraImages = images.slice(1);\n\n    document.getElementById('gc-sheet-title').textContent = data.name || '';\n\n    \/\/ Chips cat\u00e9gorie tri\u00e9es, une par type d'offre actif (toutes, pas seulement celles avec description).\n    const chipsHtml = Array.from(item.categories).map(function (c) {\n      return '<span class=\"gc-chip\" style=\"' + chipStyle(CATEGORY_COLORS[c] || '#57636C') + '\">' + escapeHtml(c) + '<\/span>';\n    }).join('');\n\n    let bodyHtml = '';\n    if (banner) {\n      bodyHtml += '<img decoding=\"async\" class=\"gc-sheet-banner\" src=\"' + escapeHtml(banner) + '\" alt=\"\" data-lightbox-src=\"' + escapeHtml(banner) + '\" \/>';\n    }\n\n    bodyHtml += '<div class=\"gc-sheet-pad\">';\n    bodyHtml +=\n      '<div class=\"gc-sheet-hero-row\">' +\n        (avatar ? '<img decoding=\"async\" class=\"gc-sheet-avatar\" src=\"' + escapeHtml(avatar) + '\" alt=\"\" data-lightbox-src=\"' + escapeHtml(avatar) + '\" \/>' : '<div class=\"gc-sheet-avatar\"><\/div>') +\n        '<div class=\"gc-sheet-hero-text\">' +\n          (data.description ? '<p>' + escapeHtml(data.description) + '<\/p>' : '') +\n          (chipsHtml ? '<div class=\"gc-chip-row\">' + chipsHtml + '<\/div>' : '') +\n        '<\/div>' +\n      '<\/div>' +\n      buildSocialLinks(data);\n\n    if (extraImages.length > 0) {\n      bodyHtml += '<div class=\"gc-sheet-gallery\">' + extraImages.map(function (src) {\n        return '<img decoding=\"async\" src=\"' + escapeHtml(src) + '\" alt=\"\" loading=\"lazy\" data-lightbox-src=\"' + escapeHtml(src) + '\" \/>';\n      }).join('') + '<\/div>';\n    }\n\n    \/\/ M\u00eame filtre que l'appli : seules les offres avec une description non vide sont list\u00e9es.\n    const offersWithDescription = item.offers.filter(function (o) { return o.description && o.description !== ''; });\n    bodyHtml += renderOffersHtml(offersWithDescription);\n\n    if (data.htmlDetails) {\n      bodyHtml += '<h4 style=\"margin-top:22px;font-family:\\'Roboto Condensed\\',sans-serif;color:var(--gc-primary);\">Pr\u00e9sentation<\/h4>' +\n        '<div class=\"gc-sheet-details\" id=\"gc-sheet-details\">' + data.htmlDetails + '<\/div>';\n    }\n\n    bodyHtml += '<a href=\"https:\/\/app.grandcercle.org\/entities\/' + escapeHtml(item.id) + '\" class=\"gc-btn gc-btn-primary gc-mobile-only gc-sheet-app-cta\" style=\"margin-top:16px;\">Voir dans l\u2019application<\/a>';\n    bodyHtml += '<\/div>';\n\n    document.getElementById('gc-sheet-body').innerHTML = bodyHtml;\n\n    if (window.gcMakeExpandable) {\n      const detailsEl = document.getElementById('gc-sheet-details');\n      if (detailsEl) window.gcMakeExpandable(detailsEl, '160px');\n      offersWithDescription.forEach(function (o, idx) {\n        const el = document.getElementById('gc-offer-desc-' + idx);\n        if (el) window.gcMakeExpandable(el, '160px');\n      });\n    }\n  }\n\n  \/\/ C\u00e2ble toute la m\u00e9canique de fiche d\u00e9tail (ouverture\/fermeture, historique navigateur, lightbox,\n  \/\/ verrouillage du scroll) via GCDirectory \u2014 voir Phase 2 pour le d\u00e9tail de ce qui est mutualis\u00e9.\n  const { openEntity } = initEntitySheetNav({\n    basePath: '\/cva\/',\n    findItem: function (slug) { return allEntities.find(function (e) { return e.slug === slug; }); },\n    render: renderSheetContent\n  });\n\n  \/* ---------- Recherche + filtre cat\u00e9gorie ---------- *\/\n  function computeVisible() {\n    const q = normalize(searchText);\n    return allEntities\n      .filter(function (e) {\n        const matchesCategory = selectedCategory === 'Toutes' || e.categories.has(selectedCategory);\n        const nameMatch = q === '' ||\n          normalize(e.data.name).indexOf(q) !== -1 ||\n          normalize(e.data.shortName).indexOf(q) !== -1;\n        return matchesCategory && nameMatch;\n      })\n      .sort(function (a, b) { return a.data.name.localeCompare(b.data.name, 'fr'); });\n  }\n\n  function renderGrid() {\n    const grid = document.getElementById('gc-cva-grid');\n    const state = document.getElementById('gc-cva-state');\n    const visible = computeVisible();\n    grid.innerHTML = '';\n    if (visible.length === 0) {\n      grid.style.display = 'none';\n      state.style.display = 'block';\n      state.textContent = 'Aucun partenaire dans cette cat\u00e9gorie.';\n      return;\n    }\n    state.style.display = 'none';\n    visible.forEach(function (item) {\n      const data = item.data;\n      const img = data.imageUrl || '';\n      const chipsHtml = Array.from(item.categories).map(function (c) {\n        return '<span class=\"gc-chip\" style=\"' + chipStyle(CATEGORY_COLORS[c] || '#57636C') + '\">' + escapeHtml(c) + '<\/span>';\n      }).join('');\n      const card = document.createElement('button');\n      card.type = 'button';\n      card.className = 'gc-card gc-dir-card';\n      card.innerHTML =\n        '<div class=\"gc-dir-card-row\">' +\n          (img ? '<img decoding=\"async\" class=\"gc-dir-avatar\" src=\"' + escapeHtml(img) + '\" alt=\"\" loading=\"lazy\" \/>' : '<div class=\"gc-dir-avatar\"><\/div>') +\n          '<div class=\"gc-dir-card-head\"><p class=\"gc-card-title\">' + escapeHtml(data.name) + '<\/p>' +\n          '<div style=\"display:flex;flex-wrap:wrap;gap:4px;\">' + chipsHtml + '<\/div><\/div>' +\n        '<\/div>' +\n        '<p class=\"gc-card-desc\">' + escapeHtml(data.description || '') + '<\/p>';\n      card.addEventListener('click', function () { openEntity(item, true); });\n      grid.appendChild(card);\n    });\n    grid.style.display = 'grid';\n  }\n\n  document.getElementById('gc-cva-search').addEventListener('input', function (e) {\n    searchText = e.target.value;\n    renderGrid();\n  });\n\n  document.getElementById('gc-cva-filters').addEventListener('click', function (e) {\n    const btn = e.target.closest('button');\n    if (!btn) return;\n    document.querySelectorAll('#gc-cva-filters button').forEach(function (b) { b.classList.remove('active'); });\n    btn.classList.add('active');\n    selectedCategory = btn.dataset.cat;\n    const params = new URLSearchParams(location.search);\n    if (selectedCategory === 'Toutes') { params.delete(CATEGORY_PARAM); } else { params.set(CATEGORY_PARAM, selectedCategory); }\n    const qs = params.toString();\n    history.replaceState(null, '', location.pathname + (qs ? '?' + qs : ''));\n    renderGrid();\n  });\n\n  \/\/ Cat\u00e9gorie initiale depuis l'URL (?categorie=Bar) \u2014 \"Toutes\" par d\u00e9faut ou si la valeur est inconnue.\n  const initialCatParam = new URLSearchParams(location.search).get(CATEGORY_PARAM);\n  selectedCategory = (initialCatParam && CATEGORIES.indexOf(initialCatParam) !== -1) ? initialCatParam : 'Toutes';\n  document.querySelectorAll('#gc-cva-filters button').forEach(function (b) {\n    b.classList.toggle('active', b.dataset.cat === selectedCategory);\n  });\n\n  \/* ---------- Chargement : offres + entit\u00e9s partenaires, jointes c\u00f4t\u00e9 client ---------- *\/\n  \/\/ \ud83d\udd34 `categories` (array-contains), PAS `type` : voir la note dans \/clubs-assos\/.\n  Promise.all([\n    getDocs(query(collection(db, 'CvaOffers'), where('isActive', '==', true))),\n    getDocs(query(collection(db, 'Entities'), where('active', '==', true), where('categories', 'array-contains', 'partner')))\n  ]).then(function (results) {\n    \/\/ Pas de filtre sur endDate ici \u2014 l'appli ne filtre pas non plus \u00e0 ce niveau (confirm\u00e9 contre\n    \/\/ fetchEntityOffersMap c\u00f4t\u00e9 Dart) : seul isActive==true d\u00e9termine si une offre compte.\n    const offersByEntity = {};\n    results[0].forEach(function (docSnap) {\n      const o = docSnap.data();\n      o.id = docSnap.id;\n      if (!offersByEntity[o.entityId]) offersByEntity[o.entityId] = [];\n      offersByEntity[o.entityId].push(o);\n    });\n\n    results[1].forEach(function (docSnap) {\n      const data = docSnap.data();\n      const offers = offersByEntity[docSnap.id] || [];\n      if (offers.length === 0) return; \/\/ pas de partenaire sans offre active\n      const categories = new Set(offers.map(function (o) { return o.type; }).filter(Boolean));\n      allEntities.push({ id: docSnap.id, data: data, slug: slugify(data.shortName || data.name), offers: offers, categories: categories });\n    });\n\n    document.getElementById('gc-cva-state').style.display = 'none';\n\n    \/\/ \ud83d\udd34 Voir la note de \/clubs-assos\/ : le rendu a son propre filet, pour qu'une\n    \/\/ erreur d'affichage ne se pr\u00e9sente pas comme une panne de chargement.\n    try {\n      renderGrid();\n      const initialSlug = new URLSearchParams(location.search).get('entity');\n      const initialItem = initialSlug && allEntities.find(function (e) { return e.slug === initialSlug; });\n      if (initialItem) openEntity(initialItem, false);\n    } catch (err) {\n      const state = document.getElementById('gc-cva-state');\n      state.style.display = 'block';\n      state.textContent = 'Les partenaires se sont charg\u00e9s mais n\\u2019ont pas pu s\\u2019afficher. Rechargez la page.';\n      console.error('GC annuaire CVA (RENDU, pas chargement) :', err);\n    }\n  }).catch(function (err) {\n    const state = document.getElementById('gc-cva-state');\n    state.style.display = 'block';\n    state.textContent = 'Impossible de charger les partenaires pour le moment.';\n    console.error('GC annuaire CVA (chargement) :', err);\n  });\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Association Life Card. \u20ac20 for the whole year: discover the CVA and its discounts at dozens of partner stores.<\/p>","protected":false},"author":100,"featured_media":8147,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-2839","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Carte de Vie Associative (CVA) \u2014 R\u00e9ductions \u00e9tudiantes Grenoble<\/title>\n<meta name=\"description\" content=\"Obtenez votre CVA et profitez de r\u00e9ductions chez des dizaines de partenaires grenoblois : sport, restauration, ski, loisirs et bien plus.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.grandcercle.org\/en\/cva\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Carte de Vie Associative (CVA) \u2014 R\u00e9ductions \u00e9tudiantes Grenoble\" \/>\n<meta property=\"og:description\" content=\"Obtenez votre CVA et profitez de r\u00e9ductions chez des dizaines de partenaires grenoblois : sport, restauration, ski, loisirs et bien plus.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.grandcercle.org\/en\/cva\/\" \/>\n<meta property=\"og:site_name\" content=\"Grand Cercle\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/grandcercle\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-13T18:47:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2026\/07\/bon-plan-cva.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1148\" \/>\n\t<meta property=\"og:image:height\" content=\"352\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/cva\\\/\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/cva\\\/\",\"name\":\"Carte de Vie Associative (CVA) \u2014 R\u00e9ductions \u00e9tudiantes Grenoble\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/cva\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/cva\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/bon-plan-cva.png\",\"datePublished\":\"2019-10-29T19:35:14+00:00\",\"dateModified\":\"2026-09-13T18:47:54+00:00\",\"description\":\"Obtenez votre CVA et profitez de r\u00e9ductions chez des dizaines de partenaires grenoblois : sport, restauration, ski, loisirs et bien plus.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/cva\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.grandcercle.org\\\/cva\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/cva\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/bon-plan-cva.png\",\"contentUrl\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/bon-plan-cva.png\",\"width\":1148,\"height\":352},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/cva\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.grandcercle.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CVA &#038; partenaires\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#website\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/\",\"name\":\"Grand Cercle\",\"description\":\"Cercle des \u00e9l\u00e8ves de Grenoble INP - UGA\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.grandcercle.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#organization\",\"name\":\"Grand Cercle\",\"alternateName\":\"GC\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/cropped-Logo-GC-centree.png\",\"contentUrl\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/cropped-Logo-GC-centree.png\",\"width\":512,\"height\":512,\"caption\":\"Grand Cercle\"},\"image\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/grandcercle\",\"https:\\\/\\\/www.instagram.com\\\/grand_cercle\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/grand-cercle-grenoble-inp\\\/\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/LeGrandCercle\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Student Life Card (CVA) \u2014 Student discounts in Grenoble","description":"Get your CVA and enjoy discounts at dozens of Grenoble partners: sports, restaurants, skiing, leisure and much more.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.grandcercle.org\/en\/cva\/","og_locale":"en_GB","og_type":"article","og_title":"Carte de Vie Associative (CVA) \u2014 R\u00e9ductions \u00e9tudiantes Grenoble","og_description":"Obtenez votre CVA et profitez de r\u00e9ductions chez des dizaines de partenaires grenoblois : sport, restauration, ski, loisirs et bien plus.","og_url":"https:\/\/www.grandcercle.org\/en\/cva\/","og_site_name":"Grand Cercle","article_publisher":"https:\/\/www.facebook.com\/grandcercle","article_modified_time":"2026-09-13T18:47:54+00:00","og_image":[{"width":1148,"height":352,"url":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2026\/07\/bon-plan-cva.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.grandcercle.org\/cva\/","url":"https:\/\/www.grandcercle.org\/cva\/","name":"Student Life Card (CVA) \u2014 Student discounts in Grenoble","isPartOf":{"@id":"https:\/\/www.grandcercle.org\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.grandcercle.org\/cva\/#primaryimage"},"image":{"@id":"https:\/\/www.grandcercle.org\/cva\/#primaryimage"},"thumbnailUrl":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2026\/07\/bon-plan-cva.png","datePublished":"2019-10-29T19:35:14+00:00","dateModified":"2026-09-13T18:47:54+00:00","description":"Get your CVA and enjoy discounts at dozens of Grenoble partners: sports, restaurants, skiing, leisure and much more.","breadcrumb":{"@id":"https:\/\/www.grandcercle.org\/cva\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.grandcercle.org\/cva\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.grandcercle.org\/cva\/#primaryimage","url":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2026\/07\/bon-plan-cva.png","contentUrl":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2026\/07\/bon-plan-cva.png","width":1148,"height":352},{"@type":"BreadcrumbList","@id":"https:\/\/www.grandcercle.org\/cva\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.grandcercle.org\/"},{"@type":"ListItem","position":2,"name":"CVA &#038; partenaires"}]},{"@type":"WebSite","@id":"https:\/\/www.grandcercle.org\/#website","url":"https:\/\/www.grandcercle.org\/","name":"Grand Circle","description":"Grenoble INP \u2013 UGA Student Union","publisher":{"@id":"https:\/\/www.grandcercle.org\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.grandcercle.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/www.grandcercle.org\/#organization","name":"Grand Circle","alternateName":"GC","url":"https:\/\/www.grandcercle.org\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.grandcercle.org\/#\/schema\/logo\/image\/","url":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2024\/10\/cropped-Logo-GC-centree.png","contentUrl":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2024\/10\/cropped-Logo-GC-centree.png","width":512,"height":512,"caption":"Grand Cercle"},"image":{"@id":"https:\/\/www.grandcercle.org\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/grandcercle","https:\/\/www.instagram.com\/grand_cercle\/","https:\/\/www.linkedin.com\/company\/grand-cercle-grenoble-inp\/","https:\/\/www.youtube.com\/user\/LeGrandCercle"]}]}},"_links":{"self":[{"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages\/2839","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/users\/100"}],"replies":[{"embeddable":true,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/comments?post=2839"}],"version-history":[{"count":90,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages\/2839\/revisions"}],"predecessor-version":[{"id":8694,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages\/2839\/revisions\/8694"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/media\/8147"}],"wp:attachment":[{"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/media?parent=2839"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}