{"id":17789,"date":"2026-02-25T10:02:16","date_gmt":"2026-02-25T10:02:16","guid":{"rendered":"https:\/\/prelib.com\/?p=17789"},"modified":"2026-03-17T18:48:37","modified_gmt":"2026-03-17T18:48:37","slug":"service-prelib-prive","status":"publish","type":"post","link":"https:\/\/prelib.com\/en\/articles\/service-prelib-prive\/","title":{"rendered":"With Prelib, You Can Now Choose Your Laboratory Type Before Your Appointment"},"content":{"rendered":"<p>With <a href=\"https:\/\/prelib.com\/en\/\" data-type=\"page\" data-id=\"16155\">Prelib<\/a>With Prelib, you\u2019ve always had the option to have your samples analyzed either by a public or a private laboratory at the time of your appointment. Now, you can make that choice directly when booking your appointment through the patient portal. <a href=\"https:\/\/patient.prelib.com\/login\">patient portal<\/a>. This new feature shows the private laboratory analysis fees for the recommended tests, as well as the estimated turnaround time for results.<\/p>\n\n\n\n<p><strong>The approach is fully flexible<\/strong> : during your appointment, you can choose to mix and match both types of labs based on your preferences.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Public or Private Laboratory: What Does This Choice Mean?<\/h2>\n\n\n\n<p>En choissisant d\u2019effectuer un test avec Prelib, tes \u00e9chantillons sont envoy\u00e9s \u00e0 un laboratoire pour analyse. Le choix entre un laboratoire public ou priv\u00e9 influence principalement :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Turnaround time for results<\/li>\n\n\n\n<li>Transportation and analysis fees<\/li>\n\n\n\n<li>Potential reimbursement through private insurance<\/li>\n<\/ul>\n\n\n\n<p>Here\u2019s how each option works:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option 1: Public Laboratory<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Transportation fee<\/strong> : between $5 and $15.<\/li>\n\n\n\n<li><strong>Laboratory analysis<\/strong> : covered by the public healthcare system.<\/li>\n\n\n\n<li><strong>Average turnaround time:<\/strong> varies depending on the capacity of the public system, up to 10 business days<\/li>\n\n\n\n<li><strong>Eligibility:<\/strong> RAMQ only.<\/li>\n<\/ul>\n\n\n\n<p>This is the most affordable option, ideal if waiting a bit longer for your results is not an issue.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option 2: Private laboratory<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Transportation, medical service and analysis fees<\/strong> : $225 on average, based on test selection.<\/li>\n\n\n\n<li><strong>Average turnaround time<\/strong> : results shared the next day<\/li>\n\n\n\n<li><strong>Private insurance<\/strong> : fees may be <strong>reimbursable<\/strong>,  depending on your coverage.<\/li>\n<\/ul>\n\n\n\n<p>This option is ideal if you\u2019d like to receive some or all of your results quickly, or if you have specific needs. The amount will be charged at the time of your appointment.<\/p>\n\n\n\n<p>Please note: You can always request a printed requisition at the clinic and choose to have your tests done at another facility.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Combining Public and Private to Fit Your Needs<\/h2>\n\n\n\n<p>You can choose a different laboratory for each test. This flexibility allows you to tailor your screening process to your priorities while keeping costs under control.<\/p>\n\n\n\n<p>For example: Someone is getting tested for chlamydia, gonorrhea, syphilis, and HIV, but would like to receive only their HIV result more quickly.<\/p>\n\n\n\n<p>They could choose:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Public laboratory:<\/strong> <a href=\"https:\/\/prelib.com\/en\/chlamydia\/\" data-type=\"page\" data-id=\"424\">chlamydia<\/a>, <a href=\"https:\/\/prelib.com\/en\/gonorrhea\/\" data-type=\"page\" data-id=\"455\">gonorrhea<\/a>, <a href=\"https:\/\/prelib.com\/en\/syphilis\/\" data-type=\"page\" data-id=\"442\">syphilis<\/a><\/li>\n\n\n\n<li><strong>Private laboratory:<\/strong> <a href=\"https:\/\/prelib.com\/en\/human-immunodeficiency-virus\/\" data-type=\"page\" data-id=\"451\">HIV<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How to Change Laboratory Options<\/h2>\n\n\n\n<p>If you select the private laboratory when booking your appointment, this choice can always be adjusted <strong>on site<\/strong> on the day of your appointment.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>You changed your mind and would rather use the public lab?<\/strong> Si tu d\u00e9tiens une carte RAMQ, tu peux toujours opter pour un laboratoire public. Il suffit d\u2019en informer l\u2019infirmier\u00b7\u00e8re lors de ton rendez-vous. Seuls les frais de transport (5\u202f$ \u00e0 15\u202f$) seront alors factur\u00e9s. Il est aussi possible de faire imprimer ta requ\u00eate en clinique et de quitter pour effectuer tes tests dans un autre \u00e9tablissement.<\/li>\n\n\n\n<li><strong>You want to choose a different laboratory for each test?<\/strong> That's perfectly possible. Just mention your choice to the nurse during your appointment.<\/li>\n<\/ol>\n\n\n\n<p>If, on the other hand, you selected the public laboratory when booking your appointment, you can switch to the private laboratory during your visit.<\/p>\n\n\n\n<p><strong>Note : <\/strong>Notre point de service \u00e0 <a href=\"https:\/\/prelib.com\/en\/clinics\/clinique-de-depistage-des-itss-a-montreal-saint-laurent-prelib\/\">St-Laurent<\/a> ne peut effectuer d\u2019analyses en laboratoire public.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How to Calculate Private Laboratory Fees<\/h3>\n\n\n\n<p>Private laboratory fees depend on the <strong>tests<\/strong> you choose to have analyzed by a private lab. Each additional test increases the total cost, as the laboratory must process a separate sample.<\/p>\n\n\n\n<p>Calculate your cost based on the selected tests:<\/p>\n\n\n\n<!doctype html>\n<html lang=\"fr-CA\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" \/>\n  <title>Choix des tests ITSS<\/title>\n  <link href=\"https:\/\/fonts.googleapis.com\/icon?family=Material+Icons\" rel=\"stylesheet\">\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Poppins&#038;display=swap\" rel=\"stylesheet\">\n  <style>\n    :root {\n      --text: #111;\n      --muted: #666;\n      --ring-off: #b5b5b5;\n      --ring-on: #111;\n      --bg: transparent;\n    }\n    html, body {\n      background: var(--bg);\n      margin: 0;\n      padding: 0;\n      font-family: 'Poppins', sans-serif;\n      color: var(--text);\n    }\n    .app {\n      width: 100%;\n      margin: 0 auto;\n      padding: 12px 12px 16px;\n      box-sizing: border-box;\n    }\n    .list {\n      width: 100%;\n      box-sizing: border-box;\n    }\n    .row {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      padding: 8px 0;\n      line-height: 1.25;\n      user-select: none;\n      border-bottom: 1px solid #e6e6e6;\n    }\n    .row.group {\n      padding-top: 10px;\n    }\n    .row.item {\n      padding-left: 22px;\n    }\n\n    \/* Custom circular checkbox *\/\n    .check {\n      position: relative;\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      cursor: pointer;\n    }\n    .check input[type=\"checkbox\"] {\n      position: absolute;\n      inset: 0;\n      opacity: 0;\n      margin: 0;\n      cursor: pointer;\n    }\n    .check .visual {\n      width: 18px;\n      height: 18px;\n      border-radius: 999px;\n      border: 2px solid var(--ring-off);\n      box-sizing: border-box;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n    }\n    .check .visual::after {\n      content: \"\";\n      width: 8px;\n      height: 8px;\n      border-radius: 999px;\n      background: var(--text);\n      opacity: 0;\n      transform: scale(0.9);\n      transition: opacity 120ms ease;\n    }\n    .check input[type=\"checkbox\"]:focus-visible + .visual {\n      outline: 2px solid #000;\n      outline-offset: 2px;\n    }\n    .check input[type=\"checkbox\"]:checked + .visual {\n      border-color: var(--ring-on);\n    }\n    .check input[type=\"checkbox\"]:checked + .visual::after {\n      opacity: 1;\n    }\n\n    .count {\n      font-weight: normal;\n    }\n    .chevron {\n      margin-left: auto;\n    }\n\n    .footer {\n      margin-top: 10px;\n      padding-top: 10px;\n    }\n    .totalRow {\n      display: flex;\n      align-items: baseline;\n      justify-content: space-between;\n      gap: 12px;\n    }\n    .totalLabel {\n      font-weight: 800;\n    }\n    .totalValue {\n      font-weight: 800;\n      font-size: 20px;\n      white-space: nowrap;\n    }\n\n    .details {\n      margin-top: 10px;\n      font-size: 13px;\n      color: var(--text);\n    }\n    .details h3 {\n      margin: 0 0 6px 0;\n      font-size: 13px;\n      font-weight: 700;\n    }\n    .details ul {\n      margin: 0;\n      padding-left: 18px;\n    }\n    .details li {\n      margin: 2px 0;\n      color: var(--text);\n    }\n    .warn {\n      margin-top: 8px;\n      color: #000;\n      font-size: 13px;\n    }\n    .muted {\n      color: var(--muted);\n    }\n    .callout {\n      margin-top: 20px;\n      font-size: 18px;\n      color: #000;\n      background-color: #f0f0f0;\n      padding: 12px 16px;\n      border-radius: 25px;\n      font-family: 'Poppins', sans-serif;\n    }\n    @keyframes highlight {\n      0% { background-color: #ffff99; }\n      100% { background-color: transparent; }\n    }\n    .price-highlight {\n      animation: highlight 1s ease-out;\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"app\">\n    <div id=\"app\" class=\"list\" aria-label=\"S\u00e9lection des tests ITSS\"><\/div>\n  <\/div>\n\n  <script>\n    \/\/ Data constants\n    const GROUPS = [\n      {\n        id: \"anal\",\n        title: \"D\u00e9pistage anal\",\n        items: [\n          { id: \"chlamydia_anal_taan\", label: \"Chlamydia anus (TAAN)\" },\n          { id: \"gonorrhea_anal_taan\", label: \"Gonorrh\u00e9e anus (TAAN)\" },\n        ],\n      },\n      {\n        id: \"oral\",\n        title: \"D\u00e9pistage oral\",\n        items: [\n          { id: \"chlamydia_oral_taan\", label: \"Chlamydia gorge\" },\n          { id: \"gonorrhea_oral_taan\", label: \"Gonorrh\u00e9e gorge\" },\n        ],\n      },\n      {\n        id: \"urine\",\n        title: \"D\u00e9pistage urinaire\",\n        items: [\n          { id: \"chlamydia_urinary_taan\", label: \"Chlamydia urine\" },\n          { id: \"gonorrhea_urinary_taan\", label: \"Gonorrh\u00e9e urine\" },\n        ],\n      },\n      {\n        id: \"blood\",\n        title: \"D\u00e9pistage sanguin\",\n        items: [\n          { id: \"syphilis\", label: \"Syphilis\" },\n          { id: \"hiv\", label: \"VIH\" },\n          { id: \"hepatite_b\", label: \"H\u00e9patite B (HBsAg)\" },\n          { id: \"hepatite_c_anti_vhc\", label: \"H\u00e9patite C anticorps (anti VHC)\" },\n        ],\n      },\n    ];\n\n    const PRICES = Object.freeze({\n      hiv: 69,\n      syphilis: 31,\n      hepatite_b: 64,\n      hepatite_c_anti_vhc: 76,\n      \/\/ All chlamydia\/gonorrhea TAAN tests intentionally absent (unknown individually).\n      \/\/ Important: do not include hepatite_c_arn_vhc anywhere.\n    });\n\n    const PACKAGES = Object.freeze([\n      { code: \"CPSS01\", price: 188, tests: [\"hiv\",\"syphilis\",\"chlamydia_urinary_taan\",\"gonorrhea_urinary_taan\"] },\n      { code: \"CPSS02\", price: 188, tests: [\"hiv\",\"syphilis\",\"chlamydia_oral_taan\",\"gonorrhea_oral_taan\"] },\n      { code: \"CPSS03\", price: 188, tests: [\"hiv\",\"syphilis\",\"chlamydia_anal_taan\",\"gonorrhea_anal_taan\"] },\n      { code: \"CPSS04\", price: 225, tests: [\"hiv\",\"syphilis\",\"chlamydia_urinary_taan\",\"gonorrhea_urinary_taan\",\"chlamydia_oral_taan\",\"gonorrhea_oral_taan\"] },\n      { code: \"CPSS05\", price: 225, tests: [\"hiv\",\"syphilis\",\"chlamydia_urinary_taan\",\"gonorrhea_urinary_taan\",\"chlamydia_anal_taan\",\"gonorrhea_anal_taan\"] },\n      { code: \"CPSS06\", price: 225, tests: [\"hiv\",\"syphilis\",\"chlamydia_oral_taan\",\"gonorrhea_oral_taan\",\"chlamydia_anal_taan\",\"gonorrhea_anal_taan\"] },\n      { code: \"CPSS07\", price: 255, tests: [\"hiv\",\"syphilis\",\"chlamydia_urinary_taan\",\"gonorrhea_urinary_taan\",\"chlamydia_oral_taan\",\"gonorrhea_oral_taan\",\"chlamydia_anal_taan\",\"gonorrhea_anal_taan\"] },\n      { code: \"CPSS08\", price: 113, tests: [\"chlamydia_urinary_taan\",\"gonorrhea_urinary_taan\"] },\n      { code: \"CPSS09\", price: 113, tests: [\"chlamydia_oral_taan\",\"gonorrhea_oral_taan\"] },\n      { code: \"CPSS10\", price: 113, tests: [\"chlamydia_anal_taan\",\"gonorrhea_anal_taan\"] },\n      { code: \"CPSS11\", price: 150, tests: [\"chlamydia_urinary_taan\",\"gonorrhea_urinary_taan\",\"chlamydia_oral_taan\",\"gonorrhea_oral_taan\"] },\n      { code: \"CPSS12\", price: 150, tests: [\"chlamydia_urinary_taan\",\"gonorrhea_urinary_taan\",\"chlamydia_anal_taan\",\"gonorrhea_anal_taan\"] },\n      { code: \"CPSS13\", price: 150, tests: [\"chlamydia_oral_taan\",\"gonorrhea_oral_taan\",\"chlamydia_anal_taan\",\"gonorrhea_anal_taan\"] },\n      { code: \"CPSS14\", price: 180, tests: [\"chlamydia_urinary_taan\",\"gonorrhea_urinary_taan\",\"chlamydia_oral_taan\",\"gonorrhea_oral_taan\",\"chlamydia_anal_taan\",\"gonorrhea_anal_taan\"] },\n    ]);\n\n    const TEST_LABELS = (() => {\n      const map = new Map();\n      for (const g of GROUPS) {\n        for (const it of g.items) map.set(it.id, it.label);\n      }\n      return map;\n    })();\n\n    const PACKAGE_UNIVERSE = (() => {\n      const s = new Set();\n      for (const p of PACKAGES) for (const t of p.tests) s.add(t);\n      return s;\n    })();\n\n    \/\/ State\n    const selections = new Set();\n    const openGroups = new Set();\n    let lastPrice = null;\n\n    function formatDollars(amount) {\n      \/\/ Non-breaking space before $\n      return String(amount) + \"\\u00A0$\";\n    }\n\n    function setDefaultSelections() {\n      \/\/ All selected by default EXCEPT hepatite_b, hepatite_c_anti_vhc\n      for (const g of GROUPS) {\n        for (const it of g.items) selections.add(it.id);\n      }\n      selections.delete(\"hepatite_b\");\n      selections.delete(\"hepatite_c_anti_vhc\");\n    }\n\n    function getGroupItems(group) {\n      return group.items.map(x => x.id);\n    }\n\n    function isAnySelected(ids) {\n      for (const id of ids) {\n        if (selections.has(id)) return true;\n      }\n      return false;\n    }\n\n    function areAllSelected(ids) {\n      for (const id of ids) {\n        if (!selections.has(id)) return false;\n      }\n      return ids.length > 0;\n    }\n\n    function toggleGroup(group) {\n      const ids = getGroupItems(group);\n      if (areAllSelected(ids)) {\n        for (const id of ids) selections.delete(id);\n      } else {\n        for (const id of ids) selections.add(id);\n      }\n    }\n\n    function setItem(id, checked) {\n      if (checked) selections.add(id);\n      else selections.delete(id);\n    }\n\n    function pricingEngine(selectedSet) {\n      const selected = new Set(selectedSet);\n\n      \/\/ Candidates: no package + each package\n      const candidates = [];\n\n      \/\/ No package candidate\n      candidates.push(evaluateOption(null, selected));\n\n      for (const pkg of PACKAGES) {\n        candidates.push(evaluateOption(pkg, selected));\n      }\n\n      candidates.sort(compareOptions);\n\n      const best = candidates[0];\n      return best;\n\n      function evaluateOption(pkgOrNull, selectedIds) {\n        const covered = new Set();\n        let packagePrice = 0;\n\n        if (pkgOrNull) {\n          const pkgTests = new Set(pkgOrNull.tests);\n\n          \/\/ Package applicability: must cover all selected tests that are in the package universe.\n          \/\/ (Tests not in package universe are allowed; they'd be billed individually or missing.)\n          for (const id of selectedIds) {\n            if (PACKAGE_UNIVERSE.has(id) && !pkgTests.has(id)) {\n              return invalidOption(pkgOrNull, selectedIds);\n            }\n          }\n\n          for (const t of pkgOrNull.tests) covered.add(t);\n          packagePrice = pkgOrNull.price;\n        }\n\n        const billed = [];\n        const missing = [];\n\n        let total = packagePrice;\n\n        for (const id of selectedIds) {\n          if (covered.has(id)) continue;\n\n          const price = PRICES[id];\n          if (typeof price === \"number\") {\n            billed.push({ id, price });\n            total += price;\n          } else {\n            missing.push(id);\n          }\n        }\n\n        const extraCount = pkgOrNull\n          ? countExtraTests(pkgOrNull.tests, selectedIds)\n          : 0;\n\n        billed.sort((a, b) => a.id.localeCompare(b.id));\n        missing.sort((a, b) => a.localeCompare(b));\n\n        return {\n          valid: true,\n          pkg: pkgOrNull,\n          total,\n          billed,\n          missing,\n          extraCount,\n        };\n      }\n\n      function invalidOption(pkg, selectedIds) {\n        \/\/ Mark invalid by setting valid=false; it will be sorted to the end.\n        return {\n          valid: false,\n          pkg,\n          total: Number.POSITIVE_INFINITY,\n          billed: [],\n          missing: Array.from(selectedIds),\n          extraCount: Number.POSITIVE_INFINITY,\n        };\n      }\n\n      function countExtraTests(pkgTests, selectedIds) {\n        let extra = 0;\n        for (const t of pkgTests) {\n          if (!selectedIds.has(t)) extra += 1;\n        }\n        return extra;\n      }\n\n      function compareOptions(a, b) {\n        \/\/ Invalid last\n        if (a.valid !== b.valid) return a.valid ? -1 : 1;\n\n        \/\/ 1) minimize number of missing price tests\n        if (a.missing.length !== b.missing.length) return a.missing.length - b.missing.length;\n\n        \/\/ 2) minimize total dollar cost\n        if (a.total !== b.total) return a.total - b.total;\n\n        \/\/ 3) minimize number of extra tests included by the package\n        if (a.extraCount !== b.extraCount) return a.extraCount - b.extraCount;\n\n        \/\/ 4) prefer any package over no package\n        const aHasPkg = !!a.pkg;\n        const bHasPkg = !!b.pkg;\n        if (aHasPkg !== bHasPkg) return aHasPkg ? -1 : 1;\n\n        \/\/ 5) sort by package code alphabetically (no package last by empty code)\n        const aCode = a.pkg ? a.pkg.code : \"ZZZZZZ\";\n        const bCode = b.pkg ? b.pkg.code : \"ZZZZZZ\";\n        return aCode.localeCompare(bCode);\n      }\n    }\n\n    function render() {\n      const root = document.getElementById(\"app\");\n      root.innerHTML = \"\";\n\n      for (const group of GROUPS) {\n        \/\/ Group row\n        const groupRow = document.createElement(\"div\");\n        groupRow.className = \"row group\";\n\n        const groupIds = getGroupItems(group);\n        const groupChecked = isAnySelected(groupIds);\n        const selectedCount = groupIds.filter(id => selections.has(id)).length;\n        const totalCount = group.items.length;\n\n        const gCheck = createCheckControl({\n          checked: groupChecked,\n          onChange: (ev) => {\n            toggleGroup(group);\n            rerenderAndRecalc();\n          },\n          ariaLabel: group.title,\n          text: null,\n        });\n\n        groupRow.appendChild(gCheck);\n\n        const titleSpan = document.createElement(\"span\");\n        titleSpan.className = \"label\";\n        titleSpan.innerHTML = `<strong>${group.title}<\/strong> (${selectedCount}\/${totalCount})`;\n        titleSpan.addEventListener('click', () => {\n          if (openGroups.has(group.id)) {\n            openGroups.delete(group.id);\n          } else {\n            openGroups.add(group.id);\n          }\n          rerenderAndRecalc();\n        });\n        groupRow.appendChild(titleSpan);\n\n        const chevronSpan = document.createElement(\"span\");\n        chevronSpan.className = \"chevron material-icons\";\n        chevronSpan.textContent = openGroups.has(group.id) ? \"expand_more\" : \"chevron_right\";\n        chevronSpan.addEventListener('click', () => {\n          if (openGroups.has(group.id)) {\n            openGroups.delete(group.id);\n          } else {\n            openGroups.add(group.id);\n          }\n          rerenderAndRecalc();\n        });\n        groupRow.appendChild(chevronSpan);\n\n        root.appendChild(groupRow);\n\n        \/\/ Item rows if open\n        if (openGroups.has(group.id)) {\n          for (const item of group.items) {\n            const itemRow = document.createElement(\"div\");\n            itemRow.className = \"row item\";\n\n            const checked = selections.has(item.id);\n\n            const iCheck = createCheckControl({\n              checked,\n              onChange: (ev) => {\n                setItem(item.id, ev.target.checked);\n                rerenderAndRecalc();\n              },\n              ariaLabel: item.label,\n              text: item.label,\n            });\n\n            itemRow.appendChild(iCheck);\n            root.appendChild(itemRow);\n          }\n        }\n      }\n\n      const pricing = pricingEngine(selections);\n      const consultationCost = selections.size === 0 ? 0 : 55;\n\n      \/\/ Footer\n      const footer = document.createElement(\"div\");\n      footer.className = \"footer\";\n\n      const totalRow = document.createElement(\"div\");\n      totalRow.className = \"totalRow\";\n\n      const totalLabel = document.createElement(\"div\");\n      totalLabel.className = \"totalLabel\";\n      totalLabel.textContent = \"Co\u00fbt de laboratoire\";\n\n      const totalValue = document.createElement(\"div\");\n      totalValue.className = \"totalValue\";\n      totalValue.textContent = formatDollars(pricing.total);\n\n      totalRow.appendChild(totalLabel);\n      totalRow.appendChild(totalValue);\n      footer.appendChild(totalRow);\n\n      const consultationRow = document.createElement(\"div\");\n      consultationRow.className = \"totalRow\";\n      consultationRow.style.marginBottom = \"10px\";\n\n      const consultationLabel = document.createElement(\"div\");\n      consultationLabel.className = \"totalLabel\";\n      consultationLabel.textContent = \"Co\u00fbt de consultation m\u00e9dicale\";\n\n      const consultationValue = document.createElement(\"div\");\n      consultationValue.className = \"totalValue\";\n      consultationValue.textContent = formatDollars(consultationCost);\n\n      consultationRow.appendChild(consultationLabel);\n      consultationRow.appendChild(consultationValue);\n      footer.appendChild(consultationRow);\n\n      const totalAllRow = document.createElement(\"div\");\n      totalAllRow.className = \"totalRow\";\n\n      const totalAllLabel = document.createElement(\"div\");\n      totalAllLabel.className = \"totalLabel\";\n      totalAllLabel.textContent = \"Total\";\n\n      const totalAllValue = document.createElement(\"div\");\n      totalAllValue.className = \"totalValue\";\n      const newPrice = pricing.total + consultationCost;\n      if (lastPrice !== null && lastPrice !== newPrice) {\n        totalAllValue.classList.add(\"price-highlight\");\n      }\n      lastPrice = newPrice;\n      totalAllValue.textContent = formatDollars(newPrice);\n\n      totalAllRow.appendChild(totalAllLabel);\n      totalAllRow.appendChild(totalAllValue);\n      footer.appendChild(totalAllRow);\n\n      const details = document.createElement(\"div\");\n      details.className = \"details\";\n\n      if (pricing.missing.length > 0) {\n        const warn = document.createElement(\"div\");\n        warn.className = \"warn\";\n        warn.textContent = `Prix manquant pour: ${pricing.missing.join(\", \")}`;\n        details.appendChild(warn);\n      }\n\n      footer.appendChild(details);\n      root.appendChild(footer);\n\n      const callout = document.createElement(\"div\");\n      callout.className = \"callout\";\n      callout.innerHTML = \"<span style='font-size: 24px;'> \ud83d\udcb8 <\/span> Frais rembours\u00e9s par la majorit\u00e9 des assurances priv\u00e9es.\";\n      root.appendChild(callout);\n    }\n\n    function createCheckControl({ checked, onChange, ariaLabel, text }) {\n      const label = document.createElement(\"label\");\n      label.className = \"check\";\n\n      const input = document.createElement(\"input\");\n      input.type = \"checkbox\";\n      input.checked = !!checked;\n      input.addEventListener(\"change\", onChange);\n      if (ariaLabel) input.setAttribute(\"aria-label\", ariaLabel);\n\n      const visual = document.createElement(\"span\");\n      visual.className = \"visual\";\n\n      label.appendChild(input);\n      label.appendChild(visual);\n\n      if (text) {\n        const span = document.createElement(\"span\");\n        span.className = \"label\";\n        span.textContent = text;\n        label.appendChild(span);\n      }\n\n      return label;\n    }\n\n    function rerenderAndRecalc() {\n      \/\/ Single source of truth is selections; rerender triggers recalculation via pricingEngine.\n      render();\n    }\n\n    \/\/ Test suite (runs on load)\n    function runTests() {\n      function totalFor(ids) {\n        const s = new Set(ids);\n        const r = pricingEngine(s);\n        return r.total;\n      }\n\n      console.assert(totalFor([]) === 0, \"Empty selection should total 0\");\n\n      console.assert(totalFor([\"hiv\"]) === 69, \"Selecting hiv only totals 69\");\n\n      console.assert(\n        totalFor([\"chlamydia_urinary_taan\", \"gonorrhea_urinary_taan\"]) === 113,\n        \"Selecting urinary pair totals 113 (CPSS08 optimal)\"\n      );\n\n      console.assert(\n        totalFor([\"chlamydia_urinary_taan\", \"gonorrhea_urinary_taan\", \"chlamydia_oral_taan\", \"gonorrhea_oral_taan\"]) === 150,\n        \"Selecting urinary pair + oral pair totals 150 (CPSS11 optimal)\"\n      );\n\n      console.assert(\n        totalFor([\"hiv\", \"syphilis\"]) === 100,\n        \"Selecting hiv + syphilis totals 100 (individual cheaper than any package)\"\n      );\n\n      console.assert(\n        totalFor([\"hiv\", \"syphilis\", \"chlamydia_urinary_taan\", \"gonorrhea_urinary_taan\"]) === 188,\n        \"Selecting hiv + syphilis + urinary pair totals 188 (CPSS01 optimal)\"\n      );\n    }\n\n    \/\/ Initialize\n    setDefaultSelections();\n    runTests();\n    render();\n  <\/script>\n<\/body>\n<\/html>\n\n\n\n<h2 class=\"wp-block-heading\">Distinguishing Between Medical Service Fees and Laboratory Fees<\/h2>\n\n\n\n<p>To better understand your invoice and choose the option that best suits your needs, it is important to distinguish between two types of fees: <strong>medical service fees<\/strong> to <strong>and laboratory fees<\/strong>These two categories cover different aspects of the screening process.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"271\" src=\"https:\/\/prelib.com\/wp-content\/uploads\/2026\/03\/Component-159-2-scaled.png\" alt=\"\" class=\"wp-image-17857\" srcset=\"https:\/\/prelib.com\/wp-content\/uploads\/2026\/03\/Component-159-2-scaled.png 2560w, https:\/\/prelib.com\/wp-content\/uploads\/2026\/03\/Component-159-2-300x79.png 300w, https:\/\/prelib.com\/wp-content\/uploads\/2026\/03\/Component-159-2-1024x271.png 1024w, https:\/\/prelib.com\/wp-content\/uploads\/2026\/03\/Component-159-2-768x203.png 768w, https:\/\/prelib.com\/wp-content\/uploads\/2026\/03\/Component-159-2-1536x406.png 1536w, https:\/\/prelib.com\/wp-content\/uploads\/2026\/03\/Component-159-2-2048x542.png 2048w, https:\/\/prelib.com\/wp-content\/uploads\/2026\/03\/Component-159-2-18x5.png 18w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Medical Services Fee<\/h2>\n\n\n\n<p>This fee covers the entire clinical process: medical assessment, test prescription, result review, and personalized follow-up if needed.<\/p>\n\n\n\n<p>Two follow-up options are available:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p><strong>Regular Service  \u2014 No Fees<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>With RAMQ only<\/li>\n\n\n\n<li>Results in about <strong>10 days on average<\/strong><\/li>\n\n\n\n<li>Results communicated <strong>by phone<\/strong><\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p><strong>Express Service \u2014 $55<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>With or without RAMQ<\/li>\n\n\n\n<li>Results in about <strong>5 days on average<\/strong><\/li>\n\n\n\n<li>Results <strong>by email<\/strong> (except for positive results or those requiring further explanation)<\/li>\n<\/ul>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Laboratory Fees<\/h3>\n\n\n\n<p>As explained above, <strong>laboratory fees<\/strong> vary depending on the type of lab chosen.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>With a <strong>public laboratory<\/strong>, sample analysis is covered by RAMQ; only transportation fees ($5\u2013$15) are charged at the appointment.<\/li>\n\n\n\n<li>With a <strong>private laboratory<\/strong>, the cost of transport and analysis ranges from $150 to $395, depending on the number of samples sent (individual tests from $31). The most common testing panel averages $180. These costs are reimbursable by most private insurance companies. <\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How to Submit a Claim to Your Insurer<\/h2>\n\n\n\n<p>With just a few simple steps, you can quickly determine whether your private laboratory fees and medical service fees are eligible for reimbursement.<\/p>\n\n\n\n<p><a href=\"https:\/\/prelib.com\/en\/articles\/comment-te-faire-rembourser-une-facture-medicale-ou-d-analyse-en-laboratoire-prive\/\">Read this article to learn how it works <em>\u2192<\/em><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>STI testing with Prelib: choose between a RAMQ-covered service or a private option with results in 24 hours, available directly in your patient portal.<\/p>","protected":false},"author":1,"featured_media":18197,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,22,23],"tags":[],"class_list":["post-17789","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-actualites","category-astuces","category-depistage"],"_links":{"self":[{"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/posts\/17789","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/comments?post=17789"}],"version-history":[{"count":0,"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/posts\/17789\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/media\/18197"}],"wp:attachment":[{"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/media?parent=17789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/categories?post=17789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prelib.com\/en\/wp-json\/wp\/v2\/tags?post=17789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}