{"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-07-12T17:29:17","modified_gmt":"2026-07-12T15:29:17","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\">\r\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>\r\n\r\n  <h2>Comment \u00e7a marche<\/h2>\r\n  <p>100 % digitale : la carte s'ach\u00e8te et se g\u00e8re enti\u00e8rement depuis l'application, avec votre num\u00e9ro CVA et votre adresse email \u00e9cole.<\/p>\r\n\r\n  <h2>Les avantages<\/h2>\r\n  <ul>\r\n    <li>R\u00e9ductions sur les \u00e9v\u00e9nements Grenoble INP des diff\u00e9rents BDE (soir\u00e9es, \"Cafet\", week-end d'int\u00e9gration)<\/li>\r\n    <li>R\u00e9ductions dans de nombreuses enseignes partenaires (bars, restaurants, loisirs, magasins)<\/li>\r\n    <li>R\u00e9ductions sur les forfaits et la location de ski<\/li>\r\n  <\/ul><br>\r\n\r\n  <a href=\"https:\/\/app.grandcercle.org\/menuPartsAndCVA\" class=\"gc-btn gc-btn-primary\">Acheter ma CVA<\/a>\r\n<\/section>\r\n\r\n<section class=\"gc-section\">\r\n  <h2 style=\"text-align:center;\">Nos partenaires<\/h2>\r\n<\/section>\r\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2f893f5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2f893f5\" 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-401bbaf\" data-id=\"401bbaf\" 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-d9abe08 elementor-widget elementor-widget-html\" data-id=\"d9abe08\" 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<div class=\"gc-directory-toolbar\">\r\n  <input type=\"search\" id=\"gc-cva-search\" class=\"gc-search-input\" placeholder=\"Rechercher un partenaire\u2026\" \/>\r\n<\/div>\r\n<div class=\"gc-directory-filters\" id=\"gc-cva-filters\">\r\n  <button type=\"button\" data-cat=\"Toutes\">Toutes<\/button>\r\n  <button type=\"button\" data-cat=\"Restauration\">Restauration<\/button>\r\n  <button type=\"button\" data-cat=\"Bar\">Bar<\/button>\r\n  <button type=\"button\" data-cat=\"Ski\">Ski<\/button>\r\n  <button type=\"button\" data-cat=\"Magasin\">Magasin<\/button>\r\n  <button type=\"button\" data-cat=\"Loisirs\">Loisirs<\/button>\r\n<\/div>\r\n\r\n<div id=\"gc-cva-state\" class=\"gc-directory-state\">Chargement des partenaires\u2026<\/div>\r\n<div id=\"gc-cva-grid\" class=\"gc-card-grid\" style=\"display:none;\"><\/div>\r\n\r\n<div class=\"gc-sheet-backdrop\" id=\"gc-sheet-backdrop\"><\/div>\r\n<div class=\"gc-sheet\" id=\"gc-sheet\" role=\"dialog\" aria-modal=\"true\">\r\n  <div class=\"gc-sheet-topbar\">\r\n    <div class=\"gc-sheet-topbar-title\" id=\"gc-sheet-title\"><\/div>\r\n    <button class=\"gc-sheet-close\" id=\"gc-sheet-close\" aria-label=\"Fermer\">\u2715<\/button>\r\n  <\/div>\r\n  <div class=\"gc-sheet-body\" id=\"gc-sheet-body\"><\/div>\r\n<\/div>\r\n\r\n<script type=\"module\">\r\n  import { initializeApp } from \"https:\/\/www.gstatic.com\/firebasejs\/10.14.1\/firebase-app.js\";\r\n  import { getFirestore, collection, query, where, getDocs }\r\n    from \"https:\/\/www.gstatic.com\/firebasejs\/10.14.1\/firebase-firestore.js\";\r\n\r\n  const firebaseConfig = {\r\n    apiKey: \"AIzaSyBvrGB5uRgTZ2stBLsq_RAHbJ0f5Pdj2GQ\",\r\n    authDomain: \"gc-app-v1-pn9e05.firebaseapp.com\",\r\n    projectId: \"gc-app-v1-pn9e05\",\r\n    storageBucket: \"gc-app-v1-pn9e05.firebasestorage.app\",\r\n    messagingSenderId: \"591252529310\",\r\n    appId: \"1:591252529310:web:06f69c621f1c8d05ea5b8f\"\r\n  };\r\n  const app = initializeApp(firebaseConfig);\r\n  const db = getFirestore(app);\r\n\r\n  \/\/ GCDirectory : biblioth\u00e8que partag\u00e9e par les 3 annuaires (escapeHtml, normalize, slugify,\r\n  \/\/ buildSocialLinks, verrouillage du scroll, m\u00e9canique de fiche d\u00e9tail) \u2014 d\u00e9finie une seule fois dans\r\n  \/\/ le snippet global \"Header & footer\" (Phase 2). Si ce message appara\u00eet, recopie ce snippet en entier.\r\n  if (!window.GCDirectory) {\r\n    console.error('GC: window.GCDirectory absent \u2014 recopie le snippet global \"Header & footer\" (Phase 2), il a \u00e9t\u00e9 mis \u00e0 jour.');\r\n  }\r\n  const { escapeHtml, normalize, slugify, buildSocialLinks, initEntitySheetNav } = window.GCDirectory;\r\n\r\n  \/\/ Nom du param\u00e8tre URL du filtre cat\u00e9gorie \u2014 change-le ici si besoin, tout le reste s'adapte.\r\n  const CATEGORY_PARAM = 'categorie';\r\n  const CATEGORIES = ['Restauration', 'Bar', 'Ski', 'Magasin', 'Loisirs'];\r\n  \/\/ Couleurs par cat\u00e9gorie \u2014 confirm\u00e9es contre la vraie fonction getOfferColor() de l'appli (custom_code\/functions\/get_offer_color.dart).\r\n  const CATEGORY_COLORS = {\r\n    'Restauration': '#007BFF',\r\n    'Bar': '#FF9800',\r\n    'Ski': '#4CAF50',\r\n    'Magasin': '#F44336',\r\n    'Loisirs': '#9C27B0',\r\n    'Autres': '#FDF29A'\r\n  };\r\n\r\n  let allEntities = [];  \/\/ { id, data, slug, offers: [...], categories: Set }\r\n  let selectedCategory = 'Toutes';\r\n  let searchText = '';\r\n\r\n  \/\/ Format DD\/MM\/YY (twoDigitYear=true, utilis\u00e9 pour startDate) ou DD\/MM\/YYYY (endDate) \u2014 m\u00eames formats que l'appli.\r\n  function formatOfferDate(ts, twoDigitYear) {\r\n    if (!ts) return '';\r\n    const d = ts.toDate ? ts.toDate() : new Date(ts);\r\n    const dd = String(d.getDate()).padStart(2, '0');\r\n    const mm = String(d.getMonth() + 1).padStart(2, '0');\r\n    const yyyy = d.getFullYear();\r\n    return dd + '\/' + mm + '\/' + (twoDigitYear ? String(yyyy).slice(-2) : yyyy);\r\n  }\r\n\r\n  \/* ---------- Bottom sheet, pilot\u00e9 par l'URL ?entity=slug ---------- *\/\r\n  \/\/ Reproduit OfferCVADetailWidget : chip cat\u00e9gorie (pas de titre s\u00e9par\u00e9), description HTML repliable,\r\n  \/\/ modalit\u00e9s en italique, dates si pr\u00e9sentes, bouton lien. Seules les offres avec une description non vide\r\n  \/\/ sont list\u00e9es ici (m\u00eame filtre que l'appli) \u2014 mais TOUTES les offres actives comptent pour les chips de la carte.\r\n  function renderOffersHtml(withDescription) {\r\n    let html = '<div class=\"gc-offers-title\">\u2728 Offre(s) CVA \u2b50<\/div>';\r\n    if (withDescription.length === 0) {\r\n      html += '<p style=\"text-align:center;color:var(--gc-secondary-text);\">Aucune offre active pour le moment.<\/p>';\r\n      return html;\r\n    }\r\n    html += withDescription.map(function (o, idx) {\r\n      const datesParts = [];\r\n      if (o.startDate) datesParts.push('<span>Valable \u00e0 partir du ' + formatOfferDate(o.startDate, true) + '<\/span>');\r\n      if (o.endDate) datesParts.push('<span>Offre disponible jusqu\u2019au ' + formatOfferDate(o.endDate, false) + ' inclus<\/span>');\r\n      return '<div class=\"gc-offer\">' +\r\n        '<div class=\"gc-offer-head\">' +\r\n          (o.type ? '<span class=\"gc-chip\" style=\"background:' + (CATEGORY_COLORS[o.type] || '#57636C') + '\">' + escapeHtml(o.type) + '<\/span>' : '') +\r\n        '<\/div>' +\r\n        '<div class=\"gc-offer-divider\"><\/div>' +\r\n        '<div class=\"gc-offer-body\">' +\r\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.\r\n          '<div class=\"gc-offer-desc\" id=\"gc-offer-desc-' + idx + '\">' + o.description + '<\/div>' +\r\n          (o.modalites ? '<p class=\"gc-offer-modalites\">' + escapeHtml(o.modalites) + '<\/p>' : '') +\r\n          (datesParts.length ? '<p class=\"gc-offer-dates\">' + datesParts.join('') + '<\/p>' : '') +\r\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>' : '') +\r\n        '<\/div>' +\r\n      '<\/div>';\r\n    }).join('');\r\n    return html;\r\n  }\r\n\r\n  function renderSheetContent(item) {\r\n    const data = item.data;\r\n    const images = data.imagesEntity || [];\r\n    const banner = images[0] || data.coverUrl || '';\r\n    const avatar = data.imageUrl || '';\r\n    const extraImages = images.slice(1);\r\n\r\n    document.getElementById('gc-sheet-title').textContent = data.name || '';\r\n\r\n    \/\/ Chips cat\u00e9gorie tri\u00e9es, une par type d'offre actif (toutes, pas seulement celles avec description).\r\n    const chipsHtml = Array.from(item.categories).map(function (c) {\r\n      return '<span class=\"gc-chip\" style=\"background:' + (CATEGORY_COLORS[c] || '#57636C') + '\">' + escapeHtml(c) + '<\/span>';\r\n    }).join('');\r\n\r\n    let bodyHtml = '';\r\n    if (banner) {\r\n      bodyHtml += '<img decoding=\"async\" class=\"gc-sheet-banner\" src=\"' + escapeHtml(banner) + '\" alt=\"\" data-lightbox-src=\"' + escapeHtml(banner) + '\" \/>';\r\n    }\r\n\r\n    bodyHtml += '<div class=\"gc-sheet-pad\">';\r\n    bodyHtml +=\r\n      '<div class=\"gc-sheet-hero-row\">' +\r\n        (avatar ? '<img decoding=\"async\" class=\"gc-sheet-avatar\" src=\"' + escapeHtml(avatar) + '\" alt=\"\" data-lightbox-src=\"' + escapeHtml(avatar) + '\" \/>' : '<div class=\"gc-sheet-avatar\"><\/div>') +\r\n        '<div class=\"gc-sheet-hero-text\">' +\r\n          (data.description ? '<p>' + escapeHtml(data.description) + '<\/p>' : '') +\r\n          (chipsHtml ? '<div class=\"gc-chip-row\">' + chipsHtml + '<\/div>' : '') +\r\n        '<\/div>' +\r\n      '<\/div>' +\r\n      buildSocialLinks(data);\r\n\r\n    if (extraImages.length > 0) {\r\n      bodyHtml += '<div class=\"gc-sheet-gallery\">' + extraImages.map(function (src) {\r\n        return '<img decoding=\"async\" src=\"' + escapeHtml(src) + '\" alt=\"\" loading=\"lazy\" data-lightbox-src=\"' + escapeHtml(src) + '\" \/>';\r\n      }).join('') + '<\/div>';\r\n    }\r\n\r\n    \/\/ M\u00eame filtre que l'appli : seules les offres avec une description non vide sont list\u00e9es.\r\n    const offersWithDescription = item.offers.filter(function (o) { return o.description && o.description !== ''; });\r\n    bodyHtml += renderOffersHtml(offersWithDescription);\r\n\r\n    if (data.htmlDetails) {\r\n      bodyHtml += '<h4 style=\"margin-top:22px;font-family:\\'Roboto Condensed\\',sans-serif;color:var(--gc-primary);\">Pr\u00e9sentation<\/h4>' +\r\n        '<div class=\"gc-sheet-details\" id=\"gc-sheet-details\">' + data.htmlDetails + '<\/div>';\r\n    }\r\n\r\n    bodyHtml += '<a href=\"https:\/\/app.grandcercle.org\/entity\/' + 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>';\r\n    bodyHtml += '<\/div>';\r\n\r\n    document.getElementById('gc-sheet-body').innerHTML = bodyHtml;\r\n\r\n    if (window.gcMakeExpandable) {\r\n      const detailsEl = document.getElementById('gc-sheet-details');\r\n      if (detailsEl) window.gcMakeExpandable(detailsEl, '160px');\r\n      offersWithDescription.forEach(function (o, idx) {\r\n        const el = document.getElementById('gc-offer-desc-' + idx);\r\n        if (el) window.gcMakeExpandable(el, '160px');\r\n      });\r\n    }\r\n  }\r\n\r\n  \/\/ C\u00e2ble toute la m\u00e9canique de fiche d\u00e9tail (ouverture\/fermeture, historique navigateur, lightbox,\r\n  \/\/ verrouillage du scroll) via GCDirectory \u2014 voir Phase 2 pour le d\u00e9tail de ce qui est mutualis\u00e9.\r\n  const { openEntity } = initEntitySheetNav({\r\n    basePath: '\/cva\/',\r\n    findItem: function (slug) { return allEntities.find(function (e) { return e.slug === slug; }); },\r\n    render: renderSheetContent\r\n  });\r\n\r\n  \/* ---------- Recherche + filtre cat\u00e9gorie ---------- *\/\r\n  function computeVisible() {\r\n    const q = normalize(searchText);\r\n    return allEntities\r\n      .filter(function (e) {\r\n        const matchesCategory = selectedCategory === 'Toutes' || e.categories.has(selectedCategory);\r\n        const nameMatch = q === '' ||\r\n          normalize(e.data.name).indexOf(q) !== -1 ||\r\n          normalize(e.data.shortName).indexOf(q) !== -1;\r\n        return matchesCategory && nameMatch;\r\n      })\r\n      .sort(function (a, b) { return a.data.name.localeCompare(b.data.name, 'fr'); });\r\n  }\r\n\r\n  function renderGrid() {\r\n    const grid = document.getElementById('gc-cva-grid');\r\n    const state = document.getElementById('gc-cva-state');\r\n    const visible = computeVisible();\r\n    grid.innerHTML = '';\r\n    if (visible.length === 0) {\r\n      grid.style.display = 'none';\r\n      state.style.display = 'block';\r\n      state.textContent = 'Aucun partenaire dans cette cat\u00e9gorie.';\r\n      return;\r\n    }\r\n    state.style.display = 'none';\r\n    visible.forEach(function (item) {\r\n      const data = item.data;\r\n      const img = data.imageUrl || '';\r\n      const chipsHtml = Array.from(item.categories).map(function (c) {\r\n        return '<span class=\"gc-chip\" style=\"background:' + (CATEGORY_COLORS[c] || '#57636C') + '\">' + escapeHtml(c) + '<\/span>';\r\n      }).join('');\r\n      const card = document.createElement('button');\r\n      card.type = 'button';\r\n      card.className = 'gc-card gc-dir-card';\r\n      card.innerHTML =\r\n        '<div class=\"gc-dir-card-row\">' +\r\n          (img ? '<img decoding=\"async\" class=\"gc-dir-avatar\" src=\"' + escapeHtml(img) + '\" alt=\"\" loading=\"lazy\" \/>' : '<div class=\"gc-dir-avatar\"><\/div>') +\r\n          '<div class=\"gc-dir-card-head\"><p class=\"gc-card-title\">' + escapeHtml(data.name) + '<\/p>' +\r\n          '<div style=\"display:flex;flex-wrap:wrap;gap:4px;\">' + chipsHtml + '<\/div><\/div>' +\r\n        '<\/div>' +\r\n        '<p class=\"gc-card-desc\">' + escapeHtml(data.description || '') + '<\/p>';\r\n      card.addEventListener('click', function () { openEntity(item, true); });\r\n      grid.appendChild(card);\r\n    });\r\n    grid.style.display = 'grid';\r\n  }\r\n\r\n  document.getElementById('gc-cva-search').addEventListener('input', function (e) {\r\n    searchText = e.target.value;\r\n    renderGrid();\r\n  });\r\n\r\n  document.getElementById('gc-cva-filters').addEventListener('click', function (e) {\r\n    const btn = e.target.closest('button');\r\n    if (!btn) return;\r\n    document.querySelectorAll('#gc-cva-filters button').forEach(function (b) { b.classList.remove('active'); });\r\n    btn.classList.add('active');\r\n    selectedCategory = btn.dataset.cat;\r\n    const params = new URLSearchParams(location.search);\r\n    if (selectedCategory === 'Toutes') { params.delete(CATEGORY_PARAM); } else { params.set(CATEGORY_PARAM, selectedCategory); }\r\n    const qs = params.toString();\r\n    history.replaceState(null, '', location.pathname + (qs ? '?' + qs : ''));\r\n    renderGrid();\r\n  });\r\n\r\n  \/\/ Cat\u00e9gorie initiale depuis l'URL (?categorie=Bar) \u2014 \"Toutes\" par d\u00e9faut ou si la valeur est inconnue.\r\n  const initialCatParam = new URLSearchParams(location.search).get(CATEGORY_PARAM);\r\n  selectedCategory = (initialCatParam && CATEGORIES.indexOf(initialCatParam) !== -1) ? initialCatParam : 'Toutes';\r\n  document.querySelectorAll('#gc-cva-filters button').forEach(function (b) {\r\n    b.classList.toggle('active', b.dataset.cat === selectedCategory);\r\n  });\r\n\r\n  \/* ---------- Chargement : offres + entit\u00e9s partenaires, jointes c\u00f4t\u00e9 client ---------- *\/\r\n  Promise.all([\r\n    getDocs(query(collection(db, 'CvaOffers'), where('isActive', '==', true))),\r\n    getDocs(query(collection(db, 'Entities'), where('type', '==', 2), where('active', '==', true)))\r\n  ]).then(function (results) {\r\n    \/\/ Pas de filtre sur endDate ici \u2014 l'appli ne filtre pas non plus \u00e0 ce niveau (confirm\u00e9 contre\r\n    \/\/ fetchEntityOffersMap c\u00f4t\u00e9 Dart) : seul isActive==true d\u00e9termine si une offre compte.\r\n    const offersByEntity = {};\r\n    results[0].forEach(function (docSnap) {\r\n      const o = docSnap.data();\r\n      o.id = docSnap.id;\r\n      if (!offersByEntity[o.entityId]) offersByEntity[o.entityId] = [];\r\n      offersByEntity[o.entityId].push(o);\r\n    });\r\n\r\n    results[1].forEach(function (docSnap) {\r\n      const data = docSnap.data();\r\n      const offers = offersByEntity[docSnap.id] || [];\r\n      if (offers.length === 0) return; \/\/ pas de partenaire sans offre active\r\n      const categories = new Set(offers.map(function (o) { return o.type; }).filter(Boolean));\r\n      allEntities.push({ id: docSnap.id, data: data, slug: slugify(data.shortName || data.name), offers: offers, categories: categories });\r\n    });\r\n\r\n    document.getElementById('gc-cva-state').style.display = 'none';\r\n    renderGrid();\r\n\r\n    const initialSlug = new URLSearchParams(location.search).get('entity');\r\n    const initialItem = initialSlug && allEntities.find(function (e) { return e.slug === initialSlug; });\r\n    if (initialItem) openEntity(initialItem, false);\r\n  }).catch(function (err) {\r\n    const state = document.getElementById('gc-cva-state');\r\n    state.style.display = 'block';\r\n    state.textContent = 'Impossible de charger les partenaires pour le moment.';\r\n    console.error('GC annuaire CVA:', err);\r\n  });\r\n<\/script>\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>Carte de Vie Associative. 20\u20ac pour toute l&rsquo;ann\u00e9e : d\u00e9couvre la CVA et ses r\u00e9ductions chez des dizaines d&rsquo;enseignes partenaires.<\/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.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CVA &amp; partenaires<\/title>\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=\"CVA &amp; partenaires\" \/>\n<meta property=\"og:description\" content=\"Carte de Vie Associative. 20\u20ac pour toute l&#039;ann\u00e9e : d\u00e9couvre la CVA et ses r\u00e9ductions chez des dizaines d&#039;enseignes partenaires.\" \/>\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-07-12T15:29:17+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=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 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\":\"CVA & partenaires\",\"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-07-12T15:29:17+00:00\",\"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":"CVA & partenaires","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":"CVA & partenaires","og_description":"Carte de Vie Associative. 20\u20ac pour toute l'ann\u00e9e : d\u00e9couvre la CVA et ses r\u00e9ductions chez des dizaines d'enseignes partenaires.","og_url":"https:\/\/www.grandcercle.org\/en\/cva\/","og_site_name":"Grand Cercle","article_publisher":"https:\/\/www.facebook.com\/grandcercle","article_modified_time":"2026-07-12T15:29:17+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":{"Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.grandcercle.org\/cva\/","url":"https:\/\/www.grandcercle.org\/cva\/","name":"CVA & partenaires","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-07-12T15:29:17+00:00","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":81,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages\/2839\/revisions"}],"predecessor-version":[{"id":8224,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages\/2839\/revisions\/8224"}],"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}]}}