{"id":20,"date":"2026-10-30T01:43:19","date_gmt":"2026-10-30T01:43:19","guid":{"rendered":"https:\/\/beautycolabeduca.com.br\/?page_id=20"},"modified":"2026-10-30T04:11:56","modified_gmt":"2026-10-30T04:11:56","slug":"trilha-do-atendimento","status":"publish","type":"page","link":"https:\/\/beautycolabeduca.com.br\/home\/trilha-do-atendimento\/","title":{"rendered":"Trilha do Atendimento"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"20\" class=\"elementor elementor-20\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2e1f042 e-flex e-con-boxed e-con e-parent\" data-id=\"2e1f042\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e521dff elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"e521dff\" 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<title>Trilha do Atendimento<\/title>\r\n<meta name=\"claude:viewport-fit-sides\" content=\"cover\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Anton&family=Lato:ital,wght@0,400;0,700;0,900;1,900&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n\/* Identidade igual \u00e0 do site: fundo off-white, t\u00edtulos Anton roxos em mai\u00fasculas, Lato, bot\u00f5es em p\u00edlula. Tudo isolado em .app para n\u00e3o afetar o resto da p\u00e1gina. Layout horizontal: aulas em duas colunas de blocos. *\/\r\n.app {\r\n  --bg: #F8F3EF; --surface: #FFFFFF; --ink: #333333; --muted: #525252; --accent: #93117E; --accent-ink: #FFFFFF;\r\n  --tint: #F4E9F1; --tint-strong: #E8D2E3; --line: #E9DFDA;\r\n  --gray: #F7F7F7; --gray-line: #EBEBEB; --gray-dot: #E4E4E4; --gray-ring: #D6D6D6; --title: #3B3B3B;\r\n  --ok: #2F6E4F; --ok-bg: #E8F1EB; --bad: #9A3B3B; --bad-bg: #F7E7E5;\r\n  --display: \"Anton\", Impact, \"Arial Narrow\", sans-serif;\r\n  --body: \"Lato\", \"Helvetica Neue\", Arial, sans-serif;\r\n  color-scheme: light;\r\n  display: grid; gap: 24px; max-width: none; margin: 0; padding: 28px 28px 40px; border: 1.5px solid #E0D3CC; border-radius: 28px;\r\n  background: var(--bg); color: var(--ink); font-family: var(--body); font-size: 15.5px; line-height: 1.55;\r\n}\r\n.app *, .app *::before, .app *::after { box-sizing: border-box; }\r\nbody:has(> .app) { margin: 0; padding: 8px; background: #F8F3EF; }\r\n.app h2, .app h3 { font-family: var(--body); font-weight: 900; text-transform: uppercase; }\r\n.app h1, .app .ptitle, .app .ltitle { font-family: var(--display); font-weight: 400; }\r\n.app h1, .app h2, .app h3 { text-transform: uppercase; margin: 0; text-wrap: balance; }\r\n.app h1 { font-size: clamp(2rem, 5vw, 2.8rem); line-height: 1.02; letter-spacing: 0.02em; color: var(--accent); }\r\n.app h2 { font-size: 1.1rem; letter-spacing: 0.1em; color: var(--muted); }\r\n.app .eyebrow { margin: 0 0 6px; font-size: 0.78rem; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; color: var(--muted); }\r\n\r\n.app .score { display: grid; gap: 18px; }\r\n.app .top { display: flex; justify-content: space-between; align-items: flex-end; gap: 16px 40px; flex-wrap: wrap; }\r\n.app .stats { display: flex; gap: 40px; flex-wrap: wrap; }\r\n.app .stats div { display: grid; }\r\n.app .num { font-family: var(--body); font-weight: 900; font-size: 1.5rem; line-height: 1.15; letter-spacing: 0.02em; text-transform: uppercase; font-variant-numeric: tabular-nums; color: var(--accent); }\r\n.app .lbl { font-size: 0.72rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); }\r\n.app .bar { height: 8px; background: var(--tint-strong); border-radius: 999px; overflow: hidden; }\r\n.app .bar i { display: block; height: 100%; width: 0; background: var(--accent); border-radius: 999px; transition: width 0.4s ease; }\r\n\r\n.app .track { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 12px; }\r\n.app .track li { display: flex; align-items: center; gap: 10px; padding: 9px 16px; border: 1px solid var(--line); border-radius: 999px; background: var(--surface); color: var(--muted); min-width: 0; }\r\n.app .track .n { flex: none; width: 26px; height: 26px; display: grid; place-items: center; border-radius: 50%; border: 1.5px solid var(--gray-ring); background: var(--gray); font-family: var(--body); font-weight: 700; font-size: 0.85rem; }\r\n.app .track .t { font-size: 0.8rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; overflow-wrap: anywhere; }\r\n.app .track li.cur { border-color: var(--accent); color: var(--ink); }\r\n.app .track li.cur .n { border-color: var(--accent); color: var(--accent); }\r\n.app .track li.done { background: var(--tint); border-color: var(--tint-strong); color: var(--ink); }\r\n.app .track li.done .n { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }\r\n\r\n.app .card { background: var(--surface); border: 1px solid var(--line); border-radius: 20px; padding: 32px 40px; display: grid; gap: 26px; box-shadow: 0 18px 48px rgba(51, 51, 51, 0.09); min-width: 0; }\r\n.app .meta { font-size: 0.76rem; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; color: var(--accent); margin: 0; }\r\n.app .ptitle { font-size: 2.6rem; letter-spacing: 0.03em; line-height: 1.05; color: var(--title); }\r\n.app .ltitle { margin-top: 8px; font-size: 1.7rem; letter-spacing: 0.03em; line-height: 1.1; color: var(--title); }\r\n.app .q { font-size: 1.35rem; font-weight: 700; line-height: 1.45; margin: 0; font-family: var(--body); text-transform: none; color: var(--ink); }\r\n.app .path { margin: 0; font-size: 0.85rem; color: var(--muted); }\r\n.app [hidden] { display: none !important; }\r\n.app .path b { display: block; width: fit-content; max-width: 100%; margin-top: 4px; padding: 5px 14px; background: var(--tint); border-radius: 999px; color: var(--ink); font-weight: 700; overflow-wrap: anywhere; }\r\n.app .rule { margin: 0; max-width: 60ch; font-size: 1.05rem; }\r\n.app .opts { display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; }\r\n.app .opt {\r\n  font: inherit; text-align: left; color: var(--ink); background: var(--gray); border: 1.5px solid var(--gray-line);\r\n  border-radius: 16px; padding: 14px 18px; cursor: pointer; min-width: 0; overflow-wrap: anywhere; line-height: 1.5; display: flex; align-items: center; gap: 14px; font-size: 1.02rem;\r\n}\r\n.app .opt .ltr { flex: none; width: 32px; height: 32px; border-radius: 50%; background: var(--gray-dot); color: var(--title); display: grid; place-items: center; font-weight: 900; font-size: 0.85rem; }\r\n.app .opt.ok .ltr { background: var(--ok); color: #fff; }\r\n.app .opt.bad .ltr { background: var(--bad); color: #fff; }\r\n.app .opt:hover:not(:disabled) { border-color: var(--accent); background: var(--tint); box-shadow: 0 0 0 3px rgba(147, 17, 126, 0.10); }\r\n.app .opt:disabled { cursor: default; }\r\n.app .opt.ok { border-color: var(--ok); background: var(--ok-bg); }\r\n.app .opt.bad { border-color: var(--bad); background: var(--bad-bg); }\r\n.app .fb { margin: 0; padding: 18px 22px; border-radius: 16px; border: 1px solid var(--gray-line); background: var(--gray); font-size: 0.97rem; display: grid; gap: 8px; }\r\n.app .fb.ok { background: var(--ok-bg); border-color: #BFD9C9; }\r\n.app .fb.warn { background: #FFF4E5; border-color: #F2D9B3; }\r\n.app .fb p { margin: 0; max-width: 80ch; }\r\n.app .fb .btn { justify-self: end; margin-top: 4px; }\r\n.app .fb strong { display: block; font-family: var(--body); font-weight: 900; letter-spacing: 0.08em; text-transform: uppercase; color: var(--accent); }\r\n.app .fb.ok strong { color: var(--ok); }\r\n.app .fb.warn strong { color: #9A5B00; }\r\n.app .btn {\r\n  font: inherit; font-weight: 700; font-size: 0.95rem; letter-spacing: 0.02em;\r\n  background: var(--accent); color: var(--accent-ink); border: 1.5px solid var(--accent); border-radius: 13px; padding: 12px 26px; cursor: pointer; justify-self: start;\r\n  box-shadow: 0 10px 22px rgba(147, 17, 126, 0.22); transition: transform 0.15s ease, box-shadow 0.15s ease;\r\n}\r\n.app .btn:hover { filter: brightness(1.06); transform: translateY(-1px); }\r\n.app .btn.ghost { background: transparent; color: var(--accent); box-shadow: none; }\r\n.app button:focus-visible { outline: 3px solid var(--accent); outline-offset: 2px; }\r\n\r\n.app .lhead { display: flex; justify-content: space-between; align-items: flex-start; gap: 14px 32px; flex-wrap: wrap; }\r\n.app .lhead .path { min-width: 220px; max-width: 420px; }\r\n.app .cols { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; align-items: start; }\r\n.app .cols.one { grid-template-columns: minmax(0, 1fr); }\r\n.app .col { display: grid; gap: 12px; min-width: 0; }\r\n.app .bk { display: grid; gap: 8px; min-width: 0; background: var(--gray); border: 1px solid var(--gray-line); border-radius: 16px; padding: 12px 18px; align-content: start; }\r\n.app .bk p { margin: 0; max-width: 62ch; }\r\n.app .bk.check { background: var(--tint); border-color: var(--tint-strong); }\r\n.app .bk.stop { background: var(--bad-bg); border-color: #EBCFCB; }\r\n.app .bk.stop .lbl2 { color: var(--bad); }\r\n.app .lbl2 { margin: 0; font-size: 0.74rem; font-weight: 900; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent); }\r\n.app .steps { margin: 0; padding: 0; list-style: none; counter-reset: s; display: grid; gap: 7px; }\r\n.app .steps li { counter-increment: s; display: grid; grid-template-columns: 26px 1fr; gap: 12px; align-items: start; max-width: 62ch; }\r\n.app .steps li::before { content: counter(s); width: 26px; height: 26px; border-radius: 50%; background: var(--gray-dot); color: var(--title); display: grid; place-items: center; font-family: var(--body); font-weight: 700; font-size: 0.82rem; margin-top: 2px; }\r\n.app .bul { margin: 0; padding-left: 20px; display: grid; gap: 6px; max-width: 62ch; }\r\n.app .shot { margin: 0; padding: 10px; display: grid; gap: 8px; }\r\n.app .shot img { width: 100%; height: auto; display: block; border: 1px solid var(--line); border-radius: 10px; background: var(--surface); }\r\n.app .shot figcaption { font-size: 0.8rem; color: var(--muted); }\r\n.app .lt { min-width: 0; }\r\n.app .lt.wide { min-width: 480px; }\r\n.app .lt td, .app .lt th { overflow-wrap: break-word; }\r\n.app .refline { margin: 12px 4px 0; font-size: 0.85rem; color: var(--muted); }\r\n.app .refline a { color: var(--accent); font-weight: 700; text-decoration: underline; text-underline-offset: 3px; }\r\n.app .nav { display: flex; gap: 10px; flex-wrap: wrap; padding-top: 10px; }\r\n\r\n.app .reward { display: grid; gap: 14px; justify-items: start; }\r\n.app .big-medal { width: 96px; height: 96px; }\r\n.app .reward p { margin: 0; max-width: 56ch; }\r\n.app .closing { font-weight: 900; font-style: italic; color: var(--accent); border-left: 3px solid var(--accent); padding-left: 14px; }\r\n.app .review { color: var(--muted); font-size: 0.95rem; }\r\n\r\n.app .medals ul { list-style: none; margin: 18px 0 0; padding: 0; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 12px 8px; }\r\n.app .medals li { display: grid; justify-items: center; gap: 6px; text-align: center; font-size: 0.72rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); min-width: 0; overflow-wrap: anywhere; }\r\n.app .medals li.on { color: var(--ink); }\r\n.app .medal { width: 44px; height: 44px; }\r\n.app .medal .core { fill: var(--gray); }\r\n.app .medal .ring { fill: none; stroke: var(--gray-ring); stroke-width: 3; }\r\n.app .medal text { font-family: var(--body); font-weight: 900; font-size: 24px; fill: var(--gray-ring); }\r\n.app .medal .star { fill: var(--gray-ring); }\r\n.app .on .medal .core { fill: var(--accent); }\r\n.app .on .medal .ring { stroke: var(--tint-strong); }\r\n.app .on .medal text { fill: var(--accent-ink); }\r\n.app .on .medal .star { fill: var(--accent-ink); }\r\n.app .note { font-size: 0.8rem; color: var(--muted); margin: 0; max-width: 70ch; }\r\n.app .note a { color: var(--accent); text-decoration: none; }\r\n.app .note strong { letter-spacing: .06em; }\r\n\r\n.app .status { margin: 0; font-size: 0.85rem; color: var(--muted); }\r\n.app .btnrow { display: flex; gap: 10px; flex-wrap: wrap; }\r\n.app .copytext { margin: 0; padding: 10px 14px; background: var(--tint); border-radius: 12px; font-size: 0.9rem; overflow-wrap: anywhere; user-select: all; }\r\n.app .panel { display: grid; gap: 12px; }\r\n.app .tablewrap { overflow-x: auto; border: 1px solid var(--line); border-radius: 12px; background: var(--surface); }\r\n.app table { border-collapse: collapse; width: 100%; min-width: 0; font-size: 0.9rem; }\r\n.app .panel table { min-width: 540px; }\r\n.app th, .app td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--line); vertical-align: top; }\r\n.app th { font-size: 0.7rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); font-weight: 700; background: var(--tint); }\r\n.app tr:last-child td { border-bottom: 0; }\r\n.app td.n { font-variant-numeric: tabular-nums; font-weight: 700; white-space: nowrap; }\r\n.app .empty { margin: 0; color: var(--muted); font-size: 0.92rem; }\r\n\r\n\r\n.app .slide { display: grid; min-height: 320px; align-content: start; animation: slidein 0.35s ease; }\r\n.app .slide .bk { padding: 30px 36px; gap: 16px; font-size: 1.1rem; line-height: 1.6; }\r\n.app .slide .bk p { max-width: none; }\r\n.app .slide .steps { gap: 18px; }\r\n.app .slide .steps li { max-width: none; grid-template-columns: 30px 1fr; }\r\n.app .slide .steps li::before { width: 30px; height: 30px; font-size: 0.9rem; }\r\n.app .slide .bul { max-width: none; }\r\n.app .slide .lbl2 { font-size: 0.8rem; }\r\n.app .slide .shot { justify-items: center; }\r\n.app .slide .shot img { width: auto; max-width: 100%; max-height: 58vh; }\r\n.app .slide .tablewrap table { font-size: 1rem; }\r\n.app .nav { justify-content: space-between; align-items: center; gap: 12px 24px; }\r\n.app .navbtns { display: flex; gap: 10px; flex-wrap: wrap; }\r\n.app .pager { display: flex; align-items: center; gap: 12px; color: var(--muted); font-size: 0.85rem; }\r\n.app .dots { display: flex; gap: 6px; }\r\n.app .dots i { width: 9px; height: 9px; border-radius: 50%; background: var(--tint-strong); }\r\n.app .dots i.past { background: var(--accent); opacity: 0.45; }\r\n.app .dots i.on { background: var(--accent); }\r\n@keyframes slidein { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }\r\n@media (prefers-reduced-motion: reduce) { .app .slide { animation: none; } }\r\n\r\n.app .hud { display: flex; align-items: center; gap: 12px 16px; flex-wrap: wrap; }\r\n.app .hudl { flex: 1 1 260px; display: grid; gap: 8px; min-width: 0; }\r\n.app .hudt { font-size: 0.78rem; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent); }\r\n.app .hbar { height: 8px; background: var(--gray-dot); border-radius: 999px; overflow: hidden; }\r\n.app .hbar i { display: block; height: 100%; background: var(--accent); border-radius: 999px; transition: width 0.4s ease; }\r\n.app .chip { display: grid; justify-items: center; min-width: 96px; padding: 8px 18px; background: var(--gray); border: 1px solid var(--gray-line); border-radius: 16px; }\r\n.app .chip b { font-weight: 900; font-size: 1.15rem; color: var(--title); font-variant-numeric: tabular-nums; }\r\n\r\n@media (max-width: 900px) {\r\n  .app .cols { grid-template-columns: minmax(0, 1fr); }\r\n  .app .track { grid-template-columns: repeat(3, minmax(0, 1fr)); }\r\n  .app .medals ul { grid-template-columns: repeat(auto-fill, minmax(88px, 1fr)); }\r\n}\r\n@media (max-width: 480px) {\r\n  .app { padding: 20px 14px 36px; }\r\n  .app .track { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n  .app .card { padding: 20px; }\r\n}\r\n@media (prefers-reduced-motion: reduce) { .app .bar i { transition: none; } }\r\n<\/style>\r\n\r\n<main class=\"app\">\r\n  <header class=\"score\">\r\n    <div class=\"top\">\r\n      <div>\r\n        <p class=\"eyebrow\">Treinamento da recep\u00e7\u00e3o \u00b7 rotinas no Graces<\/p>\r\n        <h1>Trilha do Atendimento<\/h1>\r\n      <\/div>\r\n      <div class=\"stats\">\r\n        <div><span class=\"num\" id=\"lvl\">Iniciante<\/span><span class=\"lbl\">n\u00edvel<\/span><\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"bar\" role=\"progressbar\" aria-label=\"Pontos\" aria-valuemin=\"0\" aria-valuemax=\"200\" id=\"bar\"><i id=\"barfill\"><\/i><\/div>\r\n  <\/header>\r\n\r\n  <ol class=\"track\" id=\"track\"><\/ol>\r\n  <section class=\"card\" id=\"card\" aria-live=\"polite\"><\/section>\r\n\r\n  <section class=\"medals\">\r\n    <h2>Medalhas<\/h2>\r\n    <ul id=\"medals\"><\/ul>\r\n  <\/section>\r\n\r\n  <section class=\"panel\" id=\"panel\" hidden>\r\n    <h2>Resultados da trilha<\/h2>\r\n    <div id=\"panelbody\"><\/div>\r\n  <\/section>\r\n\r\n  <p class=\"note\"><strong>BEAUTY.CO.LAB EDUCA<\/strong><br><a href=\"https:\/\/beautycolabeduca.com.br\" target=\"_blank\" rel=\"noopener\">beautycolabeduca.com.br<\/a><\/p>\r\n<\/main>\r\n\r\n<script>\r\n(function () {\r\n  function esc(t) { return String(t).replace(\/&\/g, \"&amp;\").replace(\/<\/g, \"&lt;\").replace(\/>\/g, \"&gt;\"); }\r\n  function P(label, text, cls) { return { k: \"p\", label: label, text: text, cls: cls || \"\" }; }\r\n  function PATH(t) { return { k: \"path\", text: t }; }\r\n  function S(items) { return { k: \"steps\", items: items }; }\r\n  function B(label, items) { return { k: \"list\", label: label, items: items }; }\r\n  function T(head, rows, label) { return { k: \"table\", head: head, rows: rows, label: label || \"\" }; }\r\n  function I(src, alt, cap) { return { k: \"img\", src: src, alt: alt, cap: cap }; }\r\n  function proc(t, why, path, steps, check, wrong, extra, before) {\r\n    var b = [];\r\n    if (before) b = b.concat(before);\r\n    if (why) b = b.concat(Array.isArray(why) ? why : [P(\"\", why)]);\r\n    if (path) b.push(PATH(path));\r\n    b.push(S(steps));\r\n    if (extra) b = b.concat(extra);\r\n    if (check) b.push(P(\"Confira antes de concluir\", check, \"check\"));\r\n    if (wrong) b.push(P(\"Se houver diverg\u00eancia\", wrong, \"stop\"));\r\n    return { t: t, blocks: b };\r\n  }\r\n\r\n  var PRELUDE = [\r\n    { t: \"Bem-vindo ao treinamento\", blocks: [\r\n      P(\"\", \"Este treinamento apresenta, passo a passo, as rotinas do Graces utilizadas na recep\u00e7\u00e3o do Beauty.Co.Lab. Voc\u00ea vai aprender a organizar agendamentos, localizar e cadastrar pessoas, acompanhar comandas, registrar servi\u00e7os e produtos, controlar pacotes e realizar recebimentos com seguran\u00e7a. Cada li\u00e7\u00e3o pode ser consultada de forma independente sempre que precisar.\"),\r\n      P(\"Resultado esperado\", \"Utilizar o sistema com autonomia nas opera\u00e7\u00f5es autorizadas, manter informa\u00e7\u00f5es confi\u00e1veis e concluir cada procedimento com uma confer\u00eancia simples e objetiva. Registros corretos facilitam o trabalho de toda a equipe e evitam retrabalho.\"),\r\n      P(\"Princ\u00edpio de confer\u00eancia\", \"Antes de salvar, confirme pessoa, profissional, servi\u00e7o ou produto, quantidade e valor, conforme a opera\u00e7\u00e3o. Quando surgir uma diverg\u00eancia ou uma situa\u00e7\u00e3o fora de sua autonomia, interrompa a conclus\u00e3o e consulte a pessoa respons\u00e1vel.\", \"check\"),\r\n      P(\"Sobre as telas\", \"As imagens s\u00e3o simula\u00e7\u00f5es dos fluxos apresentados e n\u00e3o cont\u00eam dados reais. A apar\u00eancia dos bot\u00f5es e os acessos podem mudar conforme a vers\u00e3o do Graces e as permiss\u00f5es do usu\u00e1rio.\"),\r\n      T([\"\u00c1rea\", \"A recep\u00e7\u00e3o aprende a fazer\"], [\r\n        [\"Agenda\", \"Agendar, localizar, reagendar, encaixar, cancelar e comunicar\"],\r\n        [\"Clientes\", \"Pesquisar, cadastrar e registrar informa\u00e7\u00f5es \u00fateis\"],\r\n        [\"Comandas\", \"Abrir, revisar, lan\u00e7ar itens e corrigir antes do recebimento\"],\r\n        [\"Produtos\", \"Lan\u00e7ar produto na comanda e conferir finalidade, quantidade e vendedor\"],\r\n        [\"Pacotes\", \"Vender, lan\u00e7ar sess\u00e3o e consultar saldo\"],\r\n        [\"Caixa\", \"Abrir, receber, dividir pagamento, conferir e fechar\"]\r\n      ], \"Seu percurso de aprendizagem\"),\r\n      P(\"Como estudar on-line\", \"Siga a ordem das li\u00e7\u00f5es na primeira utiliza\u00e7\u00e3o; depois, consulte diretamente a opera\u00e7\u00e3o desejada. Em cada aula, leia a finalidade, acompanhe o passo a passo, confira os pontos de aten\u00e7\u00e3o e resolva uma situa\u00e7\u00e3o pr\u00e1tica.\"),\r\n      P(\"Limite de atua\u00e7\u00e3o\", \"Neste treinamento, a recep\u00e7\u00e3o aprende a lan\u00e7ar produtos nas comandas. Entrada, sa\u00edda, invent\u00e1rio, ajustes, transfer\u00eancias, inativa\u00e7\u00e3o e cadastro de produtos permanecem sob responsabilidade da pessoa designada para o estoque.\")\r\n    ]},\r\n    { t: \"Da abertura ao fechamento\", blocks: [\r\n      T([\"Momento\", \"A\u00e7\u00e3o\", \"Por que \u00e9 importante\"], [\r\n        [\"Antes de abrir\", \"Confirmar loja, usu\u00e1rio, agenda e caixa\", \"Evita trabalhar no dia, operador ou unidade errados\"],\r\n        [\"Na chegada\", \"Localizar o cliente antes de abrir a comanda\", \"Evita duplicidade e hist\u00f3rico separado\"],\r\n        [\"Durante\", \"Acompanhar servi\u00e7os, auxiliares, produtos e sess\u00f5es\", \"Impede que itens executados deixem de ser cobrados ou registrados\"],\r\n        [\"Antes de receber\", \"Bloquear e conferir a comanda com o cliente\", \"Evita novos lan\u00e7amentos durante o pagamento\"],\r\n        [\"No fechamento\", \"Conferir formas de pagamento e diverg\u00eancias\", \"Mant\u00e9m o caixa e os relat\u00f3rios corretos\"]\r\n      ])\r\n    ]},\r\n    { t: \"Autonomia e autoriza\u00e7\u00e3o\", blocks: [\r\n      T([\"Situa\u00e7\u00e3o\", \"Recep\u00e7\u00e3o\", \"Respons\u00e1vel\/gest\u00e3o\"], [\r\n        [\"Agendar e reagendar\", \"Executa e confere\", \"Apoia em exce\u00e7\u00f5es\"],\r\n        [\"Lan\u00e7ar item na comanda\", \"Executa ap\u00f3s confirma\u00e7\u00e3o\", \"Define cadastro, pre\u00e7o e regra\"],\r\n        [\"Desconto\", \"Aplica somente com autoriza\u00e7\u00e3o\", \"Autoriza e define quem assume\"],\r\n        [\"Estoque fora da comanda\", \"N\u00e3o executa\", \"Executa ajuste, entrada, sa\u00edda e invent\u00e1rio\"],\r\n        [\"Reabrir caixa\/comanda recebida\", \"N\u00e3o executa sem autoriza\u00e7\u00e3o\", \"Avalia e autoriza\"]\r\n      ])\r\n    ]}\r\n  ];\r\n\r\n  var PHASES = [\r\n    { name: \"Agenda\", title: \"Organize a agenda\", path: \"Opera\u00e7\u00f5es > Agenda\",\r\n      rule: \"Ao salvar, o cart\u00e3o deve mostrar a cliente certa, na coluna do profissional certo e no hor\u00e1rio combinado.\",\r\n      lessons: [\r\n        proc(\"Agendar um cliente\",\r\n          \"Um hor\u00e1rio reservado \u00e9 um compromisso. Registrar corretamente a data, o servi\u00e7o, a dura\u00e7\u00e3o e o profissional protege o tempo de todos e ajuda a manter a agenda organizada, sem sobreposi\u00e7\u00f5es indevidas.\",\r\n          \"Opera\u00e7\u00f5es > Agenda\",\r\n          [\"Abra a Agenda e confirme a data exibida no topo da tela.\",\r\n           \"Pesquise o cliente pelo nome completo ou telefone. Se n\u00e3o aparecer, repita a busca antes de cadastrar.\",\r\n           \"Selecione o profissional solicitado e clique no hor\u00e1rio dispon\u00edvel.\",\r\n           \"Escolha o servi\u00e7o correto. Confira a dura\u00e7\u00e3o para saber at\u00e9 que hor\u00e1rio a agenda ficar\u00e1 ocupada.\",\r\n           \"Revise cliente, servi\u00e7o, profissional, data, hor\u00e1rio de in\u00edcio e t\u00e9rmino.\",\r\n           \"Salve e confirme visualmente que o cart\u00e3o do agendamento apareceu na coluna correta.\"],\r\n          \"O cart\u00e3o deve mostrar o cliente certo, na coluna do profissional certo e no hor\u00e1rio combinado.\",\r\n          \"N\u00e3o force o hor\u00e1rio nem altere a dura\u00e7\u00e3o sem confirmar com o profissional.\",\r\n          [I(\"https:\/\/beautycolabeduca.com.br\/wp-content\/plugins\/trilha-atendimento\/app\/img\/agenda.png\", \"Tela da Agenda no Graces, com tr\u00eas colunas de profissionais e tr\u00eas agendamentos de exemplo\", \"Tela ilustrativa: 1 novo agendamento \u00b7 2 data da agenda \u00b7 3 cart\u00e3o do cliente\")]),\r\n        proc(\"Localizar um agendamento\",\r\n          \"Encontrar o hor\u00e1rio certo com rapidez evita informa\u00e7\u00f5es desencontradas. Consulte o agendamento pelo cadastro da pessoa e confira os detalhes antes de responder.\",\r\n          \"Opera\u00e7\u00f5es > Agenda > Pesquisa do cliente\",\r\n          [\"Digite nome ou telefone e selecione o cadastro correto.\",\r\n           \"Clique em Hor\u00e1rios para listar os pr\u00f3ximos agendamentos.\",\r\n           \"Confira servi\u00e7o, in\u00edcio, t\u00e9rmino e profissional antes de informar ao cliente.\"],\r\n          \"Confirme pelo menos dois dados do cadastro quando existirem nomes parecidos.\", null),\r\n        proc(\"Editar ou reagendar\",\r\n          \"Mudan\u00e7as de agenda precisam refletir exatamente o que foi combinado. Ao reagendar, confira a nova disponibilidade e comunique a altera\u00e7\u00e3o somente depois de salv\u00e1-la.\",\r\n          \"Opera\u00e7\u00f5es > Agenda > Agendamento > Editar\",\r\n          [\"Abra o agendamento correto e identifique o que precisa mudar.\",\r\n           \"Altere somente data, hor\u00e1rio, profissional ou servi\u00e7o que foi combinado.\",\r\n           \"Confira se o novo hor\u00e1rio est\u00e1 livre e se a dura\u00e7\u00e3o continua adequada.\",\r\n           \"Salve, confirme o novo cart\u00e3o na agenda e envie a mensagem de altera\u00e7\u00e3o.\"],\r\n          \"O hor\u00e1rio antigo n\u00e3o deve permanecer duplicado na agenda.\",\r\n          \"Se a mudan\u00e7a afetar outro atendimento, pe\u00e7a confirma\u00e7\u00e3o ao profissional antes de salvar.\"),\r\n        proc(\"Fazer um encaixe\",\r\n          \"Um encaixe s\u00f3 \u00e9 adequado quando existe tempo t\u00e9cnico real e o profissional confirma que poder\u00e1 atender sem prejudicar os compromissos j\u00e1 reservados.\",\r\n          \"Opera\u00e7\u00f5es > Agenda > Novo agendamento > Encaixe\",\r\n          [\"Confirme com o profissional que o encaixe \u00e9 poss\u00edvel.\",\r\n           \"Cadastre o atendimento no mesmo hor\u00e1rio e marque a op\u00e7\u00e3o de encaixe.\",\r\n           \"Revise a dura\u00e7\u00e3o e o tempo t\u00e9cnico de cada servi\u00e7o.\",\r\n           \"Salve e verifique se os dois atendimentos aparecem no mesmo per\u00edodo.\"],\r\n          \"O profissional deve conhecer e aceitar a sobreposi\u00e7\u00e3o.\",\r\n          \"N\u00e3o use encaixe para esconder atraso ou falta de espa\u00e7o na agenda.\",\r\n          [T([\"Use o encaixe quando\", \"N\u00e3o use quando\"], [[\"O profissional confirmou e existe tempo t\u00e9cnico\", \"A inten\u00e7\u00e3o \u00e9 esconder atraso ou falta de hor\u00e1rio\"]])]),\r\n        proc(\"Cancelar ou excluir um agendamento\",\r\n          \"Um cancelamento bem registrado libera o hor\u00e1rio e mant\u00e9m a agenda confi\u00e1vel. Fa\u00e7a a altera\u00e7\u00e3o no sistema, verifique o resultado e comunique a mudan\u00e7a com clareza.\",\r\n          \"Opera\u00e7\u00f5es > Agenda > Agendamento > Cancelar\/Excluir\",\r\n          [\"Confirme que \u00e9 o agendamento e o cliente corretos.\",\r\n           \"Registre ou confirme o motivo conforme a rotina interna.\",\r\n           \"Use Cancelar ou Excluir conforme a op\u00e7\u00e3o exibida e confirme a a\u00e7\u00e3o.\",\r\n           \"Verifique que o hor\u00e1rio ficou livre e ofere\u00e7a reagendamento quando fizer sentido.\",\r\n           \"Envie a mensagem de cancelamento pelo WhatsApp.\"],\r\n          \"O cart\u00e3o cancelado n\u00e3o deve continuar ocupando o hor\u00e1rio como atendimento ativo.\",\r\n          \"Se o atendimento j\u00e1 come\u00e7ou ou houver cobran\u00e7a, n\u00e3o exclua; chame o respons\u00e1vel.\"),\r\n        { t: \"Mensagens pelo WhatsApp\", blocks: [\r\n          T([\"Situa\u00e7\u00e3o\", \"Quando enviar\", \"Conferir antes\"], [\r\n            [\"Confirma\u00e7\u00e3o\", \"Na rotina definida para confirmar agenda\", \"Cliente, data, hor\u00e1rio, servi\u00e7o e profissional\"],\r\n            [\"Lembrete\", \"Pr\u00f3ximo ao atendimento\", \"Telefone e agendamento corretos\"],\r\n            [\"Altera\u00e7\u00e3o\", \"Depois de salvar a mudan\u00e7a\", \"Novo dia e novo hor\u00e1rio\"],\r\n            [\"Cancelamento\", \"Depois de cancelar no sistema\", \"Agendamento correto e comunica\u00e7\u00e3o adequada\"],\r\n            [\"Comanda aberta\", \"Durante a presen\u00e7a do cliente, se necess\u00e1rio\", \"Cliente e telefone da comanda\"]\r\n          ]),\r\n          P(\"Ponto de aten\u00e7\u00e3o\", \"Antes de enviar qualquer mensagem, confirme o n\u00famero e o agendamento. Al\u00e9m de evitar desencontros, essa confer\u00eancia protege as informa\u00e7\u00f5es pessoais.\", \"stop\")\r\n        ]}\r\n      ],\r\n      qs: [\r\n        { t: \"Voc\u00ea pesquisou a cliente pelo nome e ela n\u00e3o apareceu. O que fazer?\",\r\n          o: [\"Cadastrar na hora, para n\u00e3o perder o hor\u00e1rio.\", \"Repetir a busca pelo telefone, com e sem DDD, antes de cadastrar.\", \"Agendar o hor\u00e1rio sem cadastro e completar depois.\"], c: 1,\r\n          why: \"Cadastro duplicado separa hist\u00f3rico, pacotes e informa\u00e7\u00f5es. S\u00f3 crie um novo cadastro quando nenhuma busca localizar a pessoa.\" },\r\n        { t: \"Quando o encaixe \u00e9 a escolha certa?\",\r\n          o: [\"Quando a agenda est\u00e1 atrasada e \u00e9 preciso esconder a sobreposi\u00e7\u00e3o.\", \"Sempre que a cliente insiste em um hor\u00e1rio ocupado.\", \"Quando o profissional confirmou e existe tempo t\u00e9cnico.\"], c: 2,\r\n          why: \"Encaixe usa um intervalo t\u00e9cnico de forma transparente. Ele n\u00e3o serve para esconder atraso ou falta de hor\u00e1rio.\" },\r\n        { t: \"Caso 2. Uma cliente pediu para mudar o hor\u00e1rio e precisa receber a altera\u00e7\u00e3o pelo WhatsApp. Qual \u00e9 a sequ\u00eancia certa?\",\r\n          o: [\"Enviar a mensagem com o novo hor\u00e1rio e, depois, alterar o agendamento.\", \"Abrir o agendamento correto, alterar s\u00f3 o combinado, conferir se o novo hor\u00e1rio est\u00e1 livre, salvar, confirmar o cart\u00e3o e ent\u00e3o enviar a mensagem.\", \"Criar um novo agendamento e manter o antigo at\u00e9 a cliente confirmar.\"], c: 1,\r\n          why: \"Mudan\u00e7as de agenda precisam refletir exatamente o que foi combinado. A mensagem de altera\u00e7\u00e3o \u00e9 enviada depois de salvar, e o hor\u00e1rio antigo n\u00e3o pode permanecer duplicado na agenda.\" }\r\n      ]},\r\n    { name: \"Clientes\", title: \"Cadastre e consulte informa\u00e7\u00f5es\", path: \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Clientes\",\r\n      rule: \"Pesquise antes de cadastrar. Clique em Novo cliente somente quando nenhuma busca localizar a pessoa.\",\r\n      lessons: [\r\n        proc(\"Pesquisar antes de cadastrar\",\r\n          \"Antes de criar um cadastro, procure a pessoa pelo nome e telefone. Um hist\u00f3rico \u00fanico re\u00fane agendamentos, servi\u00e7os e pacotes e permite que a equipe encontre as informa\u00e7\u00f5es certas.\",\r\n          \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Clientes\",\r\n          [\"Pesquise pelo nome completo.\",\r\n           \"Pesquise novamente pelo telefone, com e sem DDD, se necess\u00e1rio.\",\r\n           \"Compare os resultados: sobrenome, celular e \u00faltimo atendimento ajudam a confirmar.\",\r\n           \"Selecione o cadastro existente quando os dados corresponderem.\",\r\n           \"Clique em Novo cliente somente quando nenhuma busca localizar a pessoa.\"],\r\n          \"Se houver dois cadastros parecidos, n\u00e3o escolha por adivinha\u00e7\u00e3o: confirme com o cliente.\",\r\n          \"Quando os dois cadastros j\u00e1 tiverem hist\u00f3rico ou saldo, sinalize a duplicidade ao respons\u00e1vel; n\u00e3o exclua nenhum.\",\r\n          [I(\"https:\/\/beautycolabeduca.com.br\/wp-content\/plugins\/trilha-atendimento\/app\/img\/clientes-busca.png\", \"Tela de pesquisa de clientes da recep\u00e7\u00e3o, com dois resultados parecidos e um aviso sobre cadastro duplicado\", \"Tela ilustrativa: 1 pesquisar \u00b7 2 comparar resultado \u00b7 3 cadastrar somente se n\u00e3o existir\")]),\r\n        proc(\"Cadastrar um cliente\",\r\n          \"Um cadastro completo e correto conecta agendamentos, hist\u00f3rico e comunica\u00e7\u00e3o. A origem do contato tamb\u00e9m ajuda o Beauty.Co.Lab a compreender como as pessoas chegam at\u00e9 ele; registre essa informa\u00e7\u00e3o conforme foi fornecida.\",\r\n          \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Clientes > Novo cliente\",\r\n          [\"Escolha pessoa f\u00edsica ou jur\u00eddica, conforme o caso.\",\r\n           \"Digite o nome como o cliente informa e complete o sobrenome quando dispon\u00edvel.\",\r\n           \"Digite o celular com DDD e repita o n\u00famero em voz baixa para conferir.\",\r\n           \"Preencha e-mail, CPF e data de nascimento quando fornecidos e necess\u00e1rios.\",\r\n           \"Pergunte de forma natural como a pessoa conheceu o Beauty.Co.Lab e registre a origem informada. Se houve indica\u00e7\u00e3o, identifique quem indicou quando o sistema permitir. Se a op\u00e7\u00e3o n\u00e3o estiver dispon\u00edvel, pe\u00e7a orienta\u00e7\u00e3o; n\u00e3o selecione uma origem qualquer.\",\r\n           \"Revise nome, telefone e origem, clique em Salvar e aguarde a confirma\u00e7\u00e3o.\",\r\n           \"Pesquise o cliente novamente para garantir que o cadastro foi criado uma \u00fanica vez.\"],\r\n          \"Nome e celular devem pertencer \u00e0 mesma pessoa, o telefone n\u00e3o pode ter d\u00edgito trocado e a origem da cliente precisa estar preenchida corretamente.\",\r\n          \"Se o sistema alertar telefone, CPF ou e-mail j\u00e1 existente, volte \u00e0 pesquisa e localize o cadastro anterior. Se a origem informada n\u00e3o aparecer nas op\u00e7\u00f5es, n\u00e3o escolha qualquer uma: pe\u00e7a orienta\u00e7\u00e3o.\",\r\n          [I(\"https:\/\/beautycolabeduca.com.br\/wp-content\/plugins\/trilha-atendimento\/app\/img\/cliente-novo.png\", \"Formul\u00e1rio de novo cliente com nome, celular, e-mail, CPF, data de nascimento e origem da cliente\", \"Tela ilustrativa: 1 nome \u00b7 2 contato \u00b7 3 origem da cliente \u00b7 4 salvar depois da confer\u00eancia\")]),\r\n        { t: \"Observa\u00e7\u00e3o, alerta e coment\u00e1rio\", blocks: [\r\n          T([\"Recurso\", \"Use para\", \"Exemplo adequado\", \"Evite\"], [\r\n            [\"Observa\u00e7\u00e3o\", \"Prefer\u00eancia geral\", \"Prefere confirma\u00e7\u00e3o por WhatsApp\", \"Julgamentos pessoais\"],\r\n            [\"Alerta\", \"Informa\u00e7\u00e3o que precisa aparecer imediatamente\", \"Confirmar autoriza\u00e7\u00e3o antes de aplicar desconto\", \"Texto longo ou sem a\u00e7\u00e3o\"],\r\n            [\"Coment\u00e1rio\", \"Registro relacionado a um atendimento\", \"Solicitou retorno sobre or\u00e7amento\", \"Informa\u00e7\u00e3o \u00edntima desnecess\u00e1ria\"]\r\n          ]),\r\n          P(\"\", \"Registros claros permitem que diferentes pessoas da equipe deem continuidade ao atendimento sem depender de informa\u00e7\u00f5es transmitidas verbalmente.\"),\r\n          P(\"\", \"Escreva de maneira objetiva, respeitosa e pr\u00e1tica. Uma observa\u00e7\u00e3o deve ajudar algu\u00e9m a agir, n\u00e3o apenas descrever uma impress\u00e3o.\"),\r\n          P(\"Privacidade\", \"Registre apenas dados necess\u00e1rios para a finalidade do atendimento. Evite julgamentos, informa\u00e7\u00f5es \u00edntimas e dados sens\u00edveis desnecess\u00e1rios; siga as orienta\u00e7\u00f5es internas de prote\u00e7\u00e3o de dados.\", \"stop\")\r\n        ]},\r\n        proc(\"Consultar o hist\u00f3rico do cliente\",\r\n          \"O hist\u00f3rico permite consultar o que est\u00e1 efetivamente registrado e responder com seguran\u00e7a, sem depender de lembran\u00e7as ou suposi\u00e7\u00f5es.\",\r\n          \"Clientes > Pesquisar > Cadastro > Hist\u00f3rico\",\r\n          [\"Pesquise e confirme o cadastro pelo nome e telefone.\",\r\n           \"Abra Hist\u00f3rico e filtre o per\u00edodo quando necess\u00e1rio.\",\r\n           \"Confira data, servi\u00e7o, profissional, produto ou pacote relacionado.\",\r\n           \"Use a informa\u00e7\u00e3o para orientar o cliente; n\u00e3o altere registros antigos sem autoriza\u00e7\u00e3o.\"],\r\n          \"A informa\u00e7\u00e3o consultada deve pertencer ao cliente correto.\", null)\r\n      ],\r\n      qs: [\r\n        { t: \"Existem dois cadastros da mesma cliente, e os dois t\u00eam hist\u00f3rico e saldo. O que fazer?\",\r\n          o: [\"Excluir o cadastro mais antigo.\", \"Sinalizar a duplicidade ao respons\u00e1vel, sem excluir nenhum.\", \"Escolher o cadastro que parecer mais completo.\"], c: 1,\r\n          why: \"Quando os dois cadastros j\u00e1 t\u00eam hist\u00f3rico ou saldo, a corre\u00e7\u00e3o \u00e9 do respons\u00e1vel. A recep\u00e7\u00e3o n\u00e3o exclui nem escolhe por adivinha\u00e7\u00e3o.\" },\r\n        { t: \"A origem que a cliente informou n\u00e3o aparece nas op\u00e7\u00f5es do campo \\\"Como conheceu o sal\u00e3o\\\". O que fazer?\",\r\n          o: [\"Escolher a op\u00e7\u00e3o mais parecida.\", \"Deixar em branco e completar depois.\", \"Pedir orienta\u00e7\u00e3o ao respons\u00e1vel.\"], c: 2,\r\n          why: \"O campo n\u00e3o pode ficar em branco, mas tamb\u00e9m n\u00e3o deve receber qualquer op\u00e7\u00e3o. Esse dado mostra quais canais e indica\u00e7\u00f5es trazem novas clientes.\" },\r\n        { t: \"Caso 1. Uma pessoa nova chegou sem cadastro e quer fazer escova com uma profissional espec\u00edfica. O que fazer?\",\r\n          o: [\"Pesquisar por nome e telefone (com e sem DDD); se nada for encontrado, cadastrar, agendar na coluna da profissional e conferir o cart\u00e3o.\", \"Agendar o hor\u00e1rio sem cadastro e completar os dados depois.\", \"Cadastrar imediatamente e agendar no primeiro hor\u00e1rio livre.\"], c: 0,\r\n          why: \"S\u00f3 se cria um novo cadastro quando nenhuma busca localizar a pessoa. Depois de salvar, o agendamento deve aparecer na coluna da profissional solicitada e no hor\u00e1rio combinado.\" },\r\n        { t: \"Caso 3. H\u00e1 dois cadastros com o mesmo primeiro nome e telefones diferentes. O que fazer?\",\r\n          o: [\"Escolher o cadastro mais recente.\", \"Comparar sobrenome, celular e \u00faltimo atendimento e, em caso de d\u00favida, confirmar com a cliente.\", \"Excluir um dos cadastros para evitar confus\u00e3o.\"], c: 1,\r\n          why: \"N\u00e3o se escolhe por adivinha\u00e7\u00e3o. Sobrenome, celular e \u00faltimo atendimento ajudam a confirmar; se os dois cadastros tiverem hist\u00f3rico ou saldo, sinalize a duplicidade ao respons\u00e1vel e n\u00e3o exclua nenhum.\" }\r\n      ]},\r\n    { name: \"Comandas\", title: \"Acompanhe as comandas\", path: \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Comanda\",\r\n      rule: \"Use a mesma comanda para todos os servi\u00e7os, produtos e sess\u00f5es do atendimento. Bloqueie antes de receber.\",\r\n      lessons: [\r\n        proc(\"Abrir a comanda pela agenda\",\r\n          \"Abrir a comanda a partir da agenda mant\u00e9m o atendimento vinculado ao agendamento e concentra os registros no hist\u00f3rico correto.\",\r\n          \"Opera\u00e7\u00f5es > Agenda > Agendamento > Abrir comanda\",\r\n          [\"Localize o cart\u00e3o do cliente na agenda e confira o profissional.\",\r\n           \"Abra as op\u00e7\u00f5es do agendamento e escolha Abrir comanda.\",\r\n           \"Confirme o cliente e os servi\u00e7os previstos.\",\r\n           \"Verifique o n\u00famero da comanda e se ela aparece em Opera\u00e7\u00f5es > Recep\u00e7\u00e3o.\"],\r\n          \"N\u00e3o pode existir outra comanda aberta para o mesmo atendimento sem justificativa.\",\r\n          \"Se uma comanda j\u00e1 existir, abra e revise a existente antes de criar outra.\"),\r\n        proc(\"Abrir a comanda pela recep\u00e7\u00e3o\",\r\n          \"Quando n\u00e3o h\u00e1 agendamento, a comanda pode ser aberta pela recep\u00e7\u00e3o. Antes, pesquise o cadastro e verifique se j\u00e1 existe uma comanda ativa para o mesmo atendimento.\",\r\n          \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Abrir comanda\",\r\n          [\"Pesquise o cliente por nome ou telefone.\",\r\n           \"Selecione o cadastro correto e clique em Abrir comanda.\",\r\n           \"Anote mentalmente o n\u00famero exibido e confirme o status Aberta.\",\r\n           \"Use essa mesma comanda para todos os servi\u00e7os, produtos e sess\u00f5es do atendimento.\"],\r\n          \"Nome, telefone e n\u00famero devem corresponder ao cliente presente.\", null,\r\n          [I(\"https:\/\/beautycolabeduca.com.br\/wp-content\/plugins\/trilha-atendimento\/app\/img\/recepcao-comandas.png\", \"Tela de recep\u00e7\u00e3o com a lista de comandas e as op\u00e7\u00f5es Abrir comanda e acessar a comanda existente\", \"Tela ilustrativa: 1 abrir comanda \u00b7 2 acessar a comanda j\u00e1 existente\"),\r\n           P(\"Como usar\", \"Pesquise primeiro e abra a comanda existente; use Abrir comanda somente quando o atendimento ainda n\u00e3o tiver uma.\")]),\r\n        proc(\"Lan\u00e7ar um servi\u00e7o\",\r\n          [P(\"\", \"Registre os servi\u00e7os executados com a descri\u00e7\u00e3o, o profissional, a quantidade e o valor corretos. Isso assegura uma cobran\u00e7a coerente e o direcionamento adequado dos repasses.\"), P(\"Por que isso importa\", \"Registrar o que foi executado, calcular o valor do cliente e direcionar o repasse ao profissional correto.\")],\r\n          \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Comanda > Lan\u00e7ar item > Servi\u00e7o\",\r\n          [\"Abra a comanda e clique em Lan\u00e7ar item.\",\r\n           \"Selecione a aba Servi\u00e7o.\",\r\n           \"Escolha o profissional que realizou o servi\u00e7o.\",\r\n           \"Pesquise a descri\u00e7\u00e3o correta e selecione somente uma op\u00e7\u00e3o.\",\r\n           \"Confira quantidade, pre\u00e7o e profissional; depois clique em Incluir.\",\r\n           \"Volte \u00e0 comanda e confirme que o servi\u00e7o apareceu uma \u00fanica vez.\"],\r\n          \"Descri\u00e7\u00e3o, profissional, quantidade e valor precisam estar corretos.\",\r\n          \"Se o pre\u00e7o cadastrado parecer incorreto, n\u00e3o altere por conta pr\u00f3pria; chame o respons\u00e1vel.\",\r\n          [I(\"https:\/\/beautycolabeduca.com.br\/wp-content\/plugins\/trilha-atendimento\/app\/img\/comanda.png\", \"Tela de uma comanda com as linhas lan\u00e7adas, o total e os bot\u00f5es para lan\u00e7ar item, bloquear e receber\", \"Tela ilustrativa: 1 lan\u00e7ar item \u00b7 2 conferir linhas \u00b7 3 bloquear\/receber\"),\r\n           P(\"Como usar\", \"Confira o cabe\u00e7alho do cliente, as linhas lan\u00e7adas e o total antes de bloquear ou receber.\")]),\r\n        proc(\"Lan\u00e7ar um auxiliar\",\r\n          \"A participa\u00e7\u00e3o de auxiliares deve ser registrada conforme a execu\u00e7\u00e3o real. Confirme os nomes com quem realizou o atendimento antes de salvar.\",\r\n          \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Comanda > Servi\u00e7o lan\u00e7ado > Auxiliar\",\r\n          [\"Abra o servi\u00e7o j\u00e1 lan\u00e7ado.\",\r\n           \"Confirme com o profissional quem auxiliou.\",\r\n           \"Selecione o auxiliar correto e salve.\",\r\n           \"Reabra o item e confira se o nome ficou registrado.\"],\r\n          \"N\u00e3o inclua auxiliar por suposi\u00e7\u00e3o.\", null),\r\n        proc(\"Excluir um item incorreto\",\r\n          \"Corrigir um item n\u00e3o significa alterar o resultado do atendimento. Retire apenas o lan\u00e7amento incorreto, fa\u00e7a a substitui\u00e7\u00e3o necess\u00e1ria e revise a comanda completa.\",\r\n          \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Comanda > Item > Excluir\",\r\n          [\"Confirme o item, o profissional, a quantidade e o valor que est\u00e3o errados.\",\r\n           \"Selecione Excluir e leia a confirma\u00e7\u00e3o antes de aceitar.\",\r\n           \"Fa\u00e7a o lan\u00e7amento correto imediatamente, quando necess\u00e1rio.\",\r\n           \"Revise a comanda inteira depois da corre\u00e7\u00e3o.\"],\r\n          \"O item correto deve permanecer e o lan\u00e7amento substituto n\u00e3o pode ficar duplicado.\",\r\n          \"N\u00e3o exclua servi\u00e7o executado apenas para ajustar o total; pe\u00e7a orienta\u00e7\u00e3o.\"),\r\n        proc(\"Trocar o cliente da comanda\",\r\n          \"Quando uma comanda est\u00e1 associada \u00e0 pessoa errada, a corre\u00e7\u00e3o deve acontecer antes do recebimento para preservar o hist\u00f3rico e o registro financeiro.\",\r\n          \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Comanda > Trocar cliente\",\r\n          [\"Confirme que a comanda realmente pertence a outra pessoa.\",\r\n           \"Clique em Trocar cliente e pesquise pelo nome ou telefone.\",\r\n           \"Selecione o cadastro correto e confirme.\",\r\n           \"Revise todos os itens, profissionais, pacotes e descontos ap\u00f3s a troca.\"],\r\n          \"O cabe\u00e7alho da comanda deve exibir o cliente certo.\",\r\n          \"Se a comanda j\u00e1 foi recebida, n\u00e3o tente corrigir sem autoriza\u00e7\u00e3o.\"),\r\n        proc(\"Bloquear e desbloquear a comanda\",\r\n          \"Durante a confer\u00eancia final, o bloqueio evita que novos itens sejam acrescentados enquanto o pagamento \u00e9 processado.\",\r\n          \"Opera\u00e7\u00f5es > Caixa\/Recep\u00e7\u00e3o > Comanda > Bloquear\",\r\n          [\"Bloqueie ao iniciar a confer\u00eancia final.\",\r\n           \"Se faltar um item, desbloqueie somente para corrigir.\",\r\n           \"Depois da corre\u00e7\u00e3o, confira novamente e bloqueie antes de receber.\"],\r\n          \"Ningu\u00e9m deve incluir item durante o recebimento.\", null,\r\n          [T([\"Situa\u00e7\u00e3o\", \"A\u00e7\u00e3o\"], [\r\n            [\"Confer\u00eancia final iniciada\", \"Bloquear a comanda\"],\r\n            [\"Faltou um item\", \"Desbloquear, corrigir, conferir e bloquear novamente\"]\r\n          ])]),\r\n        proc(\"Aplicar um desconto autorizado\",\r\n          \"Um desconto precisa reproduzir fielmente a autoriza\u00e7\u00e3o recebida: valor, aplica\u00e7\u00e3o e responsabilidade. N\u00e3o altere pre\u00e7os ou repasses por iniciativa pr\u00f3pria.\",\r\n          \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Comanda > Desconto\",\r\n          [\"Confirme a autoriza\u00e7\u00e3o e o limite do desconto.\",\r\n           \"Defina se ele ser\u00e1 aplicado a um servi\u00e7o, a um produto ou \u00e0 comanda inteira.\",\r\n           \"Escolha valor em reais ou percentual e digite exatamente o autorizado.\",\r\n           \"Defina quem assume: sal\u00e3o, profissional ou ambos, conforme a autoriza\u00e7\u00e3o.\",\r\n           \"Revise o valor anterior, o desconto e o novo total.\",\r\n           \"Salve e confirme que o desconto aparece no local correto.\"],\r\n          \"O total final e o respons\u00e1vel pelo desconto devem corresponder \u00e0 autoriza\u00e7\u00e3o.\",\r\n          \"Se n\u00e3o houver autoriza\u00e7\u00e3o clara, pare a opera\u00e7\u00e3o. Nunca escolha outro respons\u00e1vel apenas para fechar a comanda.\",\r\n          [T([\"Pergunta antes de salvar\", \"Resposta esperada\"], [\r\n            [\"Quem autorizou?\", \"Pessoa e condi\u00e7\u00e3o identificadas\"],\r\n            [\"Onde o desconto se aplica?\", \"Item espec\u00edfico ou comanda inteira\"],\r\n            [\"Qual \u00e9 o tipo?\", \"Valor em reais ou percentual\"],\r\n            [\"Quem assume?\", \"Sal\u00e3o, profissional ou ambos\"],\r\n            [\"Qual \u00e9 o novo total?\", \"Valor conferido com a autoriza\u00e7\u00e3o\"]\r\n          ])])\r\n      ],\r\n      qs: [\r\n        { t: \"Antes de clicar em Abrir comanda, o que voc\u00ea deve fazer?\",\r\n          o: [\"Abrir uma comanda nova para cada servi\u00e7o.\", \"Pesquisar e abrir a comanda que o atendimento j\u00e1 tem.\", \"Pedir que a cliente confirme o valor.\"], c: 1,\r\n          why: \"Se j\u00e1 existir uma comanda, revise a existente antes de criar outra. Duas comandas para o mesmo atendimento geram itens repetidos ou ausentes.\" },\r\n        { t: \"A comanda j\u00e1 estava bloqueada para a confer\u00eancia e voc\u00ea percebeu que faltou lan\u00e7ar um servi\u00e7o. O que fazer?\",\r\n          o: [\"Ajustar o total manualmente.\", \"Receber agora e lan\u00e7ar o servi\u00e7o depois.\", \"Desbloquear, lan\u00e7ar, conferir de novo e bloquear outra vez.\"], c: 2,\r\n          why: \"Ajustar o total n\u00e3o registra o servi\u00e7o executado nem o repasse ao profissional. Corrija o item e confira a comanda inteira.\" },\r\n        { t: \"Caso 7. Foi solicitado um desconto, mas n\u00e3o h\u00e1 autoriza\u00e7\u00e3o registrada. O que fazer?\",\r\n          o: [\"Aplicar o desconto e pedir a autoriza\u00e7\u00e3o depois.\", \"Pausar a opera\u00e7\u00e3o e solicitar a autoriza\u00e7\u00e3o antes de aplicar.\", \"Aplicar o desconto no nome de outro respons\u00e1vel para concluir a comanda.\"], c: 1,\r\n          why: \"A recep\u00e7\u00e3o aplica desconto somente com autoriza\u00e7\u00e3o, e nunca escolhe outro respons\u00e1vel apenas para fechar a comanda. Sem autoriza\u00e7\u00e3o clara, a opera\u00e7\u00e3o para.\" }\r\n      ]},\r\n    { name: \"Produtos\", title: \"Registre produtos corretamente\", path: \"\",\r\n      rule: \"A recep\u00e7\u00e3o s\u00f3 lan\u00e7a produtos nas comandas. Entrada, sa\u00edda, invent\u00e1rio e cadastro ficam com a pessoa respons\u00e1vel pelo estoque.\",\r\n      lessons: [\r\n        proc(\"Lan\u00e7ar um produto\",\r\n          [P(\"Por que isso importa\", \"Registrar a venda ou o uso vinculado ao atendimento, atualizar o hist\u00f3rico e evitar diferen\u00e7a entre produto entregue e produto cobrado.\"), P(\"\", \"Cada produto lan\u00e7ado precisa corresponder ao que foi efetivamente entregue ou utilizado. Confirme apresenta\u00e7\u00e3o, quantidade, finalidade, valor e profissional vendedor, quando houver comiss\u00e3o.\")],\r\n          null,\r\n          [\"Abra a comanda do cliente e confira nome e n\u00famero.\",\r\n           \"Clique em Lan\u00e7ar item e selecione a aba Produto.\",\r\n           \"Selecione o profissional vendedor somente quando houver comiss\u00e3o pela venda.\",\r\n           \"Pesquise pela descri\u00e7\u00e3o completa ou leia o c\u00f3digo de barras; pressione Enter ou use a lupa.\",\r\n           \"Compare linha, nome, apresenta\u00e7\u00e3o e tamanho antes de selecionar.\",\r\n           \"Informe a quantidade realmente entregue ou utilizada.\",\r\n           \"Confira valor unit\u00e1rio e subtotal; depois clique em Incluir.\",\r\n           \"Volte \u00e0 comanda e verifique se o produto apareceu uma \u00fanica vez.\"],\r\n          \"Produto, apresenta\u00e7\u00e3o, quantidade, profissional vendedor e valor precisam corresponder ao que ocorreu.\",\r\n          \"Se houver dois produtos com nomes parecidos ou pre\u00e7o inesperado, n\u00e3o escolha por tentativa; confirme com o respons\u00e1vel.\",\r\n          [I(\"https:\/\/beautycolabeduca.com.br\/wp-content\/plugins\/trilha-atendimento\/app\/img\/produto.png\", \"Tela de lan\u00e7amento de produto na comanda, com as abas, o vendedor, o item, a quantidade e o bot\u00e3o Incluir\", \"Tela ilustrativa: 1 Produto \u00b7 2 vendedor \u00b7 3 item \u00b7 4 quantidade\/valor \u00b7 5 incluir\"),\r\n           P(\"Como usar\", \"Siga os n\u00fameros na ordem e volte \u00e0 comanda para confirmar que o produto foi inclu\u00eddo uma \u00fanica vez.\")],\r\n          [P(\"Escopo\", \"Esta \u00e9 a \u00fanica rotina de estoque deste treinamento. A recep\u00e7\u00e3o registra o produto na comanda; n\u00e3o altera o cadastro nem movimenta o estoque por outras telas.\")]),\r\n        { t: \"Escolher a finalidade correta\", blocks: [\r\n          T([\"Situa\u00e7\u00e3o\", \"O que significa\", \"O que conferir\"], [\r\n            [\"Revenda\", \"Produto entregue ao cliente para uso em casa\", \"Descri\u00e7\u00e3o, apresenta\u00e7\u00e3o, quantidade, pre\u00e7o e vendedor\"],\r\n            [\"Repasse t\u00e9cnico\", \"Produto usado no procedimento e registrado no hist\u00f3rico\", \"Produto\/cor, quantidade, cobran\u00e7a e efeito no repasse\"],\r\n            [\"Venda vinculada\", \"Produto que comp\u00f5e um servi\u00e7o\", \"V\u00ednculo, valor do cliente e regra de comiss\u00e3o\"]\r\n          ]),\r\n          P(\"Por que diferenciar\", \"A mesma descri\u00e7\u00e3o de produto pode produzir efeitos diferentes no hist\u00f3rico, no pre\u00e7o e no repasse profissional.\", \"check\")\r\n        ]},\r\n        { t: \"Confer\u00eancia obrigat\u00f3ria\", blocks: [\r\n          T([\"Verificar\", \"Pergunta de controle\"], [\r\n            [\"Cliente\", \"Esta \u00e9 a comanda da pessoa que recebeu ou utilizou o produto?\"],\r\n            [\"Produto\", \"\u00c9 a linha, o nome e o tamanho corretos?\"],\r\n            [\"Finalidade\", \"\u00c9 revenda, repasse t\u00e9cnico ou venda vinculada?\"],\r\n            [\"Quantidade\", \"A quantidade lan\u00e7ada corresponde ao que saiu?\"],\r\n            [\"Profissional\", \"Existe comiss\u00e3o? Quem realizou a venda?\"],\r\n            [\"Valor\", \"O pre\u00e7o e o subtotal est\u00e3o corretos?\"],\r\n            [\"Duplicidade\", \"O produto j\u00e1 estava lan\u00e7ado na comanda?\"]\r\n          ])\r\n        ]}\r\n      ],\r\n      qs: [\r\n        { t: \"Um produto aparece com quantidade errada no estoque. O que a recep\u00e7\u00e3o faz?\",\r\n          o: [\"Ajusta a quantidade na tela de estoque.\", \"Chama a pessoa respons\u00e1vel pelo estoque.\", \"Altera o cadastro do produto para acertar o valor.\"], c: 1,\r\n          why: \"Ajuste, entrada, sa\u00edda, invent\u00e1rio e cadastro de produtos s\u00e3o tarefas do respons\u00e1vel pelo estoque. A recep\u00e7\u00e3o registra o produto na comanda.\" },\r\n        { t: \"O produto foi usado no procedimento e ficou registrado no hist\u00f3rico da cliente. Qual \u00e9 a finalidade correta?\",\r\n          o: [\"Revenda.\", \"Repasse t\u00e9cnico.\", \"Venda vinculada.\"], c: 1,\r\n          why: \"Revenda \u00e9 o produto entregue para uso em casa. Venda vinculada \u00e9 o produto que comp\u00f5e um servi\u00e7o. A mesma descri\u00e7\u00e3o pode gerar efeitos diferentes no hist\u00f3rico, no pre\u00e7o e no repasse.\" },\r\n        { t: \"Caso 4. Um produto foi vendido e existe comiss\u00e3o para quem realizou a venda. Como lan\u00e7ar?\",\r\n          o: [\"Na comanda do cliente, em Lan\u00e7ar item > Produto, selecionando o profissional vendedor, conferindo item, quantidade e valor, e verificando que apareceu uma \u00fanica vez.\", \"Sem profissional, porque a comiss\u00e3o \u00e9 ajustada no cadastro do produto.\", \"Ajustando o estoque na tela de estoque para registrar a sa\u00edda.\"], c: 0,\r\n          why: \"O profissional vendedor \u00e9 selecionado somente quando h\u00e1 comiss\u00e3o pela venda. A recep\u00e7\u00e3o registra o produto na comanda; n\u00e3o altera o cadastro nem movimenta o estoque por outras telas.\" },\r\n        { t: \"Caso 8. O pre\u00e7o do produto na comanda parece diferente do informado na prateleira. O que fazer?\",\r\n          o: [\"Corrigir o pre\u00e7o na comanda para o valor da prateleira.\", \"Alterar o cadastro do produto.\", \"Pausar e chamar o respons\u00e1vel.\"], c: 2,\r\n          why: \"Pre\u00e7o inesperado n\u00e3o se corrige por conta pr\u00f3pria. A recep\u00e7\u00e3o n\u00e3o modifica cadastro nem pre\u00e7o; confirme com o respons\u00e1vel antes de continuar.\" }\r\n      ]},\r\n    { name: \"Pacotes\", title: \"Controle pacotes e sess\u00f5es\", path: \"\",\r\n      rule: \"Na venda do pacote n\u00e3o h\u00e1 profissional. A sess\u00e3o baixa o saldo e define o repasse.\",\r\n      lessons: [\r\n        proc(\"Vender um pacote\",\r\n          [P(\"Por que isso importa\", \"Registrar a compra e criar o saldo de sess\u00f5es no cadastro correto.\"), P(\"\", \"A venda de um pacote cria um saldo de sess\u00f5es vinculado ao cadastro. Antes de concluir, confira os servi\u00e7os inclu\u00eddos, a quantidade, a validade e o valor combinados.\")],\r\n          null,\r\n          [\"Abra a comanda e selecione Lan\u00e7ar item.\",\r\n           \"Escolha Pacote e pesquise a op\u00e7\u00e3o combinada.\",\r\n           \"Confira servi\u00e7os inclu\u00eddos, quantidade de sess\u00f5es, valor e validade.\",\r\n           \"N\u00e3o selecione profissional na venda; a comiss\u00e3o ocorre na execu\u00e7\u00e3o da sess\u00e3o, conforme a configura\u00e7\u00e3o.\",\r\n           \"Inclua e confirme que o pacote apareceu na comanda uma \u00fanica vez.\"],\r\n          \"Pacote, quantidade, validade e valor precisam ser os combinados com o cliente.\",\r\n          \"Se houver d\u00favida sobre regra, validade ou cancelamento, consulte o respons\u00e1vel antes do recebimento.\"),\r\n        proc(\"Lan\u00e7ar uma sess\u00e3o\",\r\n          \"Ao lan\u00e7ar uma sess\u00e3o, registre a execu\u00e7\u00e3o realizada, atualize o saldo do pacote e vincule o profissional respons\u00e1vel. A sess\u00e3o j\u00e1 adquirida n\u00e3o deve ser cobrada novamente.\",\r\n          \"Opera\u00e7\u00f5es > Recep\u00e7\u00e3o > Comanda > Lan\u00e7ar item > Sess\u00e3o\",\r\n          [\"Selecione a aba Sess\u00e3o.\",\r\n           \"Escolha o profissional que executou o atendimento.\",\r\n           \"Selecione o pacote ativo e o servi\u00e7o correto.\",\r\n           \"Confira se h\u00e1 saldo e se a validade est\u00e1 vigente.\",\r\n           \"Inclua a sess\u00e3o e verifique que o cliente n\u00e3o est\u00e1 pagando novamente pelo servi\u00e7o j\u00e1 adquirido.\"],\r\n          \"Saldo, servi\u00e7o e profissional devem atualizar corretamente.\",\r\n          \"N\u00e3o d\u00ea baixa por aus\u00eancia, ajuste ou cortesia sem autoriza\u00e7\u00e3o.\"),\r\n        proc(\"Consultar o saldo de um pacote\",\r\n          \"Consultar o saldo antes de orientar a pessoa evita diverg\u00eancias sobre sess\u00f5es utilizadas, remanescentes e prazo de validade.\",\r\n          \"Opera\u00e7\u00f5es > Pacotes > Pesquisar cliente\",\r\n          [\"Pesquise e confirme o cliente pelo nome e telefone.\",\r\n           \"Abra o pacote correto e confira o status e a validade.\",\r\n           \"Verifique sess\u00f5es realizadas, datas e profissionais.\",\r\n           \"Informe ao cliente o saldo restante e registre um novo agendamento quando solicitado.\"],\r\n          \"N\u00e3o confunda dois pacotes parecidos nem conte sess\u00f5es canceladas como executadas.\", null,\r\n          [I(\"https:\/\/beautycolabeduca.com.br\/wp-content\/plugins\/trilha-atendimento\/app\/img\/pacotes.png\", \"Tela de pacotes do cliente, com a venda, o saldo de sess\u00f5es e o hist\u00f3rico\", \"Tela ilustrativa: 1 vender pacote \u00b7 2 conferir saldo \u00b7 3 ver hist\u00f3rico\")])\r\n      ],\r\n      qs: [\r\n        { t: \"Ao vender um pacote, qual profissional voc\u00ea seleciona?\",\r\n          o: [\"O que mais atende a cliente.\", \"Nenhum. A comiss\u00e3o ocorre na execu\u00e7\u00e3o da sess\u00e3o.\", \"O primeiro profissional da agenda do dia.\"], c: 1,\r\n          why: \"A comiss\u00e3o acontece quando a sess\u00e3o \u00e9 executada, conforme a configura\u00e7\u00e3o. Na venda, confira servi\u00e7os, sess\u00f5es, valor e validade.\" },\r\n        { t: \"A cliente faltou a uma sess\u00e3o do pacote. Voc\u00ea d\u00e1 baixa na sess\u00e3o?\",\r\n          o: [\"Sim, para n\u00e3o deixar saldo parado.\", \"Sim, como cortesia da recep\u00e7\u00e3o.\", \"N\u00e3o, sem autoriza\u00e7\u00e3o.\"], c: 2,\r\n          why: \"Baixa por aus\u00eancia, ajuste ou cortesia exige autoriza\u00e7\u00e3o. Sess\u00f5es canceladas tamb\u00e9m n\u00e3o contam como executadas.\" },\r\n        { t: \"Caso 6. Uma cliente quer usar uma sess\u00e3o de pacote, mas n\u00e3o sabe quantas ainda restam. O que fazer?\",\r\n          o: [\"Lan\u00e7ar a sess\u00e3o como servi\u00e7o comum e conferir depois.\", \"Consultar o pacote da cliente, conferir status, validade e saldo, e ent\u00e3o lan\u00e7ar a sess\u00e3o com o profissional que executou.\", \"Informar um n\u00famero de sess\u00f5es estimado pela mem\u00f3ria.\"], c: 1,\r\n          why: \"Consulte o saldo antes de orientar, para evitar diverg\u00eancias sobre sess\u00f5es utilizadas, remanescentes e validade. A sess\u00e3o adquirida n\u00e3o deve ser cobrada novamente.\" }\r\n      ]},\r\n    { name: \"Caixa\", title: \"Recebimentos e caixa\", path: \"Opera\u00e7\u00f5es > Caixa\",\r\n      rule: \"A soma das formas de pagamento deve ser exatamente o total da comanda, e a transa\u00e7\u00e3o precisa estar aprovada.\",\r\n      lessons: [\r\n        proc(\"Abrir o caixa\",\r\n          \"A abertura do caixa identifica o operador e o movimento do dia. Confira a unidade, a data e o saldo inicial antes de iniciar o registro de recebimentos.\",\r\n          \"Opera\u00e7\u00f5es > Caixa > Abrir caixa\",\r\n          [\"Confirme a loja e a data exibidas.\",\r\n           \"Selecione o operador que ficar\u00e1 respons\u00e1vel pelo movimento.\",\r\n           \"Informe o saldo inicial em dinheiro quando a rotina exigir.\",\r\n           \"Confirme a abertura e verifique o status do caixa.\"],\r\n          \"Operador, data e saldo inicial devem estar corretos.\",\r\n          \"N\u00e3o abra caixa em nome de outra pessoa sem orienta\u00e7\u00e3o.\"),\r\n        proc(\"Receber uma comanda\",\r\n          \"O recebimento encerra a opera\u00e7\u00e3o financeira do atendimento. Revise a comanda, apresente o total com clareza e confirme o pagamento apenas ap\u00f3s a aprova\u00e7\u00e3o efetiva da transa\u00e7\u00e3o.\",\r\n          \"Opera\u00e7\u00f5es > Caixa\/Recep\u00e7\u00e3o > Selecionar comanda > Receber\",\r\n          [\"Bloqueie a comanda e confirme o nome do cliente.\",\r\n           \"Revise servi\u00e7os, profissionais, auxiliares, produtos, pacotes, sess\u00f5es e descontos.\",\r\n           \"Confirme o total com o cliente e clique em Receber.\",\r\n           \"Escolha a forma de pagamento. Quando dividir, informe at\u00e9 tr\u00eas formas conforme o sistema permitir.\",\r\n           \"Digite o valor de cada forma e confira se a soma \u00e9 igual ao total da comanda.\",\r\n           \"Confirme o recebimento apenas depois de validar a transa\u00e7\u00e3o no meio correspondente.\",\r\n           \"Verifique a mensagem de sucesso e o novo status da comanda.\"],\r\n          \"A soma das formas deve ser exatamente igual ao total e a transa\u00e7\u00e3o precisa estar aprovada.\",\r\n          \"Se o cart\u00e3o ou PIX n\u00e3o confirmar, n\u00e3o finalize como pago; siga a rotina de tentativa ou chame o respons\u00e1vel.\",\r\n          [I(\"https:\/\/beautycolabeduca.com.br\/wp-content\/plugins\/trilha-atendimento\/app\/img\/recebimento.png\", \"Tela de recebimento com o resumo da comanda e a divis\u00e3o do pagamento em at\u00e9 tr\u00eas formas\", \"Tela ilustrativa: 1 resumo \u00b7 2 divis\u00e3o em at\u00e9 tr\u00eas formas \u00b7 3 confirmar somente ap\u00f3s conferir\"),\r\n           T([\"Total da comanda\", \"PIX\", \"Cr\u00e9dito\", \"Soma\", \"Pode concluir?\"], [\r\n             [\"R$ 180,00\", \"R$ 80,00\", \"R$ 100,00\", \"R$ 180,00\", \"Sim, ap\u00f3s confirmar as transa\u00e7\u00f5es\"],\r\n             [\"R$ 180,00\", \"R$ 80,00\", \"R$ 90,00\", \"R$ 170,00\", \"N\u00e3o: faltam R$ 10,00\"],\r\n             [\"R$ 180,00\", \"R$ 100,00\", \"R$ 100,00\", \"R$ 200,00\", \"N\u00e3o: excede R$ 20,00\"]\r\n           ], \"Exemplo de pagamento dividido\"),\r\n           P(\"Aten\u00e7\u00e3o\", \"N\u00e3o use pend\u00eancia, fiado, cr\u00e9dito interno ou forma diferente da transa\u00e7\u00e3o real apenas para conseguir concluir.\", \"stop\")]),\r\n        proc(\"Fechar o caixa\",\r\n          \"O fechamento re\u00fane os recebimentos e verifica se os valores registrados correspondem aos comprovantes e movimentos do dia. Diverg\u00eancias precisam ser identificadas e comunicadas antes da conclus\u00e3o.\",\r\n          \"Opera\u00e7\u00f5es > Caixa > Fechamento\",\r\n          [\"Selecione o operador e confira a data do movimento.\",\r\n           \"Verifique se existem comandas abertas ou em recebimento sem justificativa.\",\r\n           \"Confira o resumo separado por dinheiro, PIX, d\u00e9bito, cr\u00e9dito e outras formas usadas.\",\r\n           \"Compare os valores com comprovantes e movimenta\u00e7\u00f5es do dia.\",\r\n           \"Revise entradas e sa\u00eddas de caixa.\",\r\n           \"Registre e comunique qualquer diverg\u00eancia antes de fechar.\",\r\n           \"Finalize somente quando a confer\u00eancia estiver conclu\u00edda.\"],\r\n          \"Todas as diferen\u00e7as devem estar explicadas e comunicadas.\",\r\n          \"Aprovar, reprovar ou reabrir caixa s\u00e3o a\u00e7\u00f5es de gest\u00e3o e exigem autoriza\u00e7\u00e3o.\",\r\n          [I(\"https:\/\/beautycolabeduca.com.br\/wp-content\/plugins\/trilha-atendimento\/app\/img\/caixa-fechamento.png\", \"Tela de fechamento do caixa com o resumo por forma de pagamento\", \"Tela ilustrativa: resumo por forma e confer\u00eancia antes do fechamento\")]),\r\n        { t: \"Saiba como agir diante de diverg\u00eancias\", blocks: [\r\n          T([\"Situa\u00e7\u00e3o\", \"A\u00e7\u00e3o segura\", \"N\u00e3o fa\u00e7a\"], [\r\n            [\"Cliente n\u00e3o aparece\", \"Pesquisar por telefone e varia\u00e7\u00f5es do nome\", \"Criar cadastro imediatamente\"],\r\n            [\"Dois cadastros parecidos\", \"Confirmar dados e sinalizar duplicidade\", \"Excluir ou escolher por adivinha\u00e7\u00e3o\"],\r\n            [\"Comanda no cliente errado\", \"Trocar o cliente e revisar tudo\", \"Receber antes de corrigir\"],\r\n            [\"Servi\u00e7o ausente\", \"Desbloquear, lan\u00e7ar e conferir de novo\", \"Ajustar o total manualmente\"],\r\n            [\"Produto repetido\", \"Excluir s\u00f3 o lan\u00e7amento incorreto\", \"Alterar quantidade sem conferir\"],\r\n            [\"Pre\u00e7o inesperado\", \"Pausar e chamar o respons\u00e1vel\", \"Modificar cadastro ou pre\u00e7o\"],\r\n            [\"Desconto sem autoriza\u00e7\u00e3o\", \"Pausar e solicitar autoriza\u00e7\u00e3o\", \"Escolher outro respons\u00e1vel\"],\r\n            [\"Divis\u00e3o de pagamento errada\", \"Corrigir antes de confirmar\", \"Concluir para acertar depois\"],\r\n            [\"Sess\u00e3o n\u00e3o aparece\", \"Conferir pacote, validade e saldo\", \"Lan\u00e7ar como servi\u00e7o comum\"],\r\n            [\"Caixa divergente\", \"Conferir e comunicar\", \"Fechar sem registrar\"]\r\n          ]),\r\n          P(\"\", \"Use estas orienta\u00e7\u00f5es quando a rotina n\u00e3o seguir o previsto. Reconhecer o limite da pr\u00f3pria autoriza\u00e7\u00e3o tamb\u00e9m faz parte de uma opera\u00e7\u00e3o segura.\")\r\n        ]},\r\n        { t: \"Quando pedir ajuda\", blocks: [\r\n          B(\"Interrompa a conclus\u00e3o e consulte a gest\u00e3o quando\", [\r\n            \"o desconto n\u00e3o estiver claramente autorizado;\",\r\n            \"for necess\u00e1rio alterar pre\u00e7o, comiss\u00e3o ou repasse;\",\r\n            \"a corre\u00e7\u00e3o envolver comanda j\u00e1 recebida;\",\r\n            \"houver duplicidade de cliente com hist\u00f3rico ou saldo em ambos os cadastros;\",\r\n            \"a tarefa exigir ajuste, entrada, sa\u00edda, invent\u00e1rio, transfer\u00eancia ou cadastro de estoque;\",\r\n            \"for preciso reabrir, aprovar ou reprovar caixa;\",\r\n            \"a forma de pagamento real n\u00e3o corresponder \u00e0 op\u00e7\u00e3o dispon\u00edvel no sistema.\"\r\n          ])\r\n        ]},\r\n        { t: \"Confer\u00eancia | Abertura do dia\", blocks: [\r\n          B(\"Antes de come\u00e7ar o atendimento, confirme\", [\r\n            \"loja, usu\u00e1rio e data corretos;\",\r\n            \"caixa aberto no operador correto;\",\r\n            \"agenda do dia revisada;\",\r\n            \"confirma\u00e7\u00f5es e lembretes enviados;\",\r\n            \"encaixes, bloqueios e observa\u00e7\u00f5es conferidos.\"\r\n          ])\r\n        ]},\r\n        { t: \"Confer\u00eancia | Antes de receber cada comanda\", blocks: [\r\n          B(\"Antes de receber, confirme\", [\r\n            \"cliente e n\u00famero da comanda corretos;\",\r\n            \"servi\u00e7os, profissionais e auxiliares corretos;\",\r\n            \"produtos, finalidades e quantidades corretos;\",\r\n            \"pacotes vendidos e sess\u00f5es baixadas corretamente;\",\r\n            \"descontos autorizados e respons\u00e1veis definidos;\",\r\n            \"total confirmado com o cliente;\",\r\n            \"formas de pagamento e valores conferidos.\"\r\n          ])\r\n        ]},\r\n        { t: \"Confer\u00eancia | Fechamento e diverg\u00eancias\", blocks: [\r\n          B(\"Antes de fechar o caixa, confirme\", [\r\n            \"comandas abertas ou em recebimento revisadas;\",\r\n            \"dinheiro conferido;\",\r\n            \"PIX conferido;\",\r\n            \"d\u00e9bito e cr\u00e9dito conferidos;\",\r\n            \"outras formas de pagamento conferidas;\",\r\n            \"entradas e sa\u00eddas revisadas;\",\r\n            \"diverg\u00eancias registradas e comunicadas;\",\r\n            \"caixa fechado somente depois da confer\u00eancia.\"\r\n          ]),\r\n          B(\"Registro de diverg\u00eancia\", [\r\n            \"data e operador;\",\r\n            \"comanda ou opera\u00e7\u00e3o;\",\r\n            \"diferen\u00e7a encontrada;\",\r\n            \"a\u00e7\u00e3o realizada;\",\r\n            \"respons\u00e1vel comunicado.\"\r\n          ])\r\n        ]}\r\n      ],\r\n      qs: [\r\n        { t: \"A comanda soma R$ 180,00. A cliente paga R$ 80,00 no PIX e R$ 90,00 no cr\u00e9dito. Pode concluir?\",\r\n          o: [\"Sim, o restante fica como pend\u00eancia.\", \"N\u00e3o: faltam R$ 10,00.\", \"Sim, basta arredondar o valor.\"], c: 1,\r\n          why: \"A soma das formas precisa ser igual ao total. N\u00e3o use pend\u00eancia, fiado ou cr\u00e9dito interno s\u00f3 para concluir.\" },\r\n        { t: \"O PIX da cliente n\u00e3o confirmou. O que fazer?\",\r\n          o: [\"Finalizar como pago e conferir depois.\", \"Registrar como fiado.\", \"N\u00e3o finalizar como pago e seguir a rotina de tentativa ou chamar o respons\u00e1vel.\"], c: 2,\r\n          why: \"O recebimento s\u00f3 \u00e9 confirmado depois de validar a transa\u00e7\u00e3o no meio correspondente. Concluir para acertar depois cria diverg\u00eancia no caixa.\" },\r\n        { t: \"Caso 5. A comanda tem dois servi\u00e7os, um auxiliar e pagamento dividido entre cart\u00e3o e PIX. Qual \u00e9 a sequ\u00eancia certa?\",\r\n          o: [\"Conferir servi\u00e7os, profissionais e auxiliar, bloquear a comanda, informar os valores de cada forma, conferir que a soma \u00e9 igual ao total e confirmar somente depois de validar as transa\u00e7\u00f5es.\", \"Receber primeiro e conferir os servi\u00e7os e o auxiliar depois.\", \"Lan\u00e7ar o total no cart\u00e3o e acertar o PIX no fechamento do caixa.\"], c: 0,\r\n          why: \"Revise servi\u00e7os, profissionais e auxiliares antes de bloquear e receber. A soma das formas deve ser exatamente igual ao total e a transa\u00e7\u00e3o precisa estar aprovada.\" }\r\n      ]}\r\n  ];\r\n  var REFS = {\r\n    \"Agendar um cliente\": [\r\n      [\r\n        \"Agendar cliente\",\r\n        \"https:\/\/academy.graces.com.br\/agenda\/agendar-um-cliente\/\"\r\n      ]\r\n    ],\r\n    \"Localizar um agendamento\": [\r\n      [\r\n        \"Localizar agendamento\",\r\n        \"https:\/\/academy.graces.com.br\/agenda\/localizar-agendamento\/\"\r\n      ]\r\n    ],\r\n    \"Editar ou reagendar\": [\r\n      [\r\n        \"Editar agendamento\",\r\n        \"https:\/\/academy.graces.com.br\/agenda\/editar-agendamento\/\"\r\n      ]\r\n    ],\r\n    \"Fazer um encaixe\": [\r\n      [\r\n        \"Fazer encaixe\",\r\n        \"https:\/\/academy.graces.com.br\/agenda\/encaixe-de-agenda\/\"\r\n      ]\r\n    ],\r\n    \"Cancelar ou excluir um agendamento\": [\r\n      [\r\n        \"Excluir agendamento\",\r\n        \"https:\/\/academy.graces.com.br\/agenda\/excluir-agendamento\/\"\r\n      ]\r\n    ],\r\n    \"Mensagens pelo WhatsApp\": [\r\n      [\r\n        \"Confirmar agendamento pelo WhatsApp\",\r\n        \"https:\/\/academy.graces.com.br\/whatsapp\/confirmar-pelo-whatsapp\/\"\r\n      ]\r\n    ],\r\n    \"Cadastrar um cliente\": [\r\n      [\r\n        \"Cadastrar cliente pela recep\u00e7\u00e3o\",\r\n        \"https:\/\/academy.graces.com.br\/cliente\/cadastrar-cliente-pela-recepcao\/\"\r\n      ]\r\n    ],\r\n    \"Consultar o hist\u00f3rico do cliente\": [\r\n      [\r\n        \"Consultar hist\u00f3rico do cliente\",\r\n        \"https:\/\/academy.graces.com.br\/cliente\/historico-anamnese-contrato\/\"\r\n      ]\r\n    ],\r\n    \"Abrir a comanda pela agenda\": [\r\n      [\r\n        \"Abrir comanda pela agenda\",\r\n        \"https:\/\/academy.graces.com.br\/agenda\/abrir-comanda-agenda\/\"\r\n      ]\r\n    ],\r\n    \"Abrir a comanda pela recep\u00e7\u00e3o\": [\r\n      [\r\n        \"Abrir comanda\",\r\n        \"https:\/\/academy.graces.com.br\/recepcao\/abrir-comanda\/\"\r\n      ]\r\n    ],\r\n    \"Lan\u00e7ar um servi\u00e7o\": [\r\n      [\r\n        \"Lan\u00e7ar servi\u00e7o\",\r\n        \"https:\/\/academy.graces.com.br\/recepcao\/lancar-servico-na-comanda\/\"\r\n      ]\r\n    ],\r\n    \"Lan\u00e7ar um auxiliar\": [\r\n      [\r\n        \"Lan\u00e7ar auxiliar\",\r\n        \"https:\/\/academy.graces.com.br\/recepcao\/lancar-auxiliar-na-comanda\/\"\r\n      ]\r\n    ],\r\n    \"Excluir um item incorreto\": [\r\n      [\r\n        \"Excluir item da comanda\",\r\n        \"https:\/\/academy.graces.com.br\/recepcao\/excluir-item-da-comanda\/\"\r\n      ]\r\n    ],\r\n    \"Trocar o cliente da comanda\": [\r\n      [\r\n        \"Trocar cliente da comanda\",\r\n        \"https:\/\/academy.graces.com.br\/recepcao\/trocar-o-cliente\/\"\r\n      ]\r\n    ],\r\n    \"Bloquear e desbloquear a comanda\": [\r\n      [\r\n        \"Bloquear e desbloquear comanda\",\r\n        \"https:\/\/academy.graces.com.br\/caixa\/bloquear-e-desbloquear-comanda\/\"\r\n      ]\r\n    ],\r\n    \"Aplicar um desconto autorizado\": [\r\n      [\r\n        \"Conceder descontos\",\r\n        \"https:\/\/academy.graces.com.br\/recepcao\/conceder-descontos\/\"\r\n      ]\r\n    ],\r\n    \"Lan\u00e7ar um produto\": [\r\n      [\r\n        \"Lan\u00e7ar produto na comanda\",\r\n        \"https:\/\/academy.graces.com.br\/recepcao\/lancar-produto-na-comanda\/\"\r\n      ]\r\n    ],\r\n    \"Escolher a finalidade correta\": [\r\n      [\r\n        \"Repasse de produto\",\r\n        \"https:\/\/academy.graces.com.br\/recepcao\/repasse-de-produto\/\"\r\n      ],\r\n      [\r\n        \"Venda vinculada ao servi\u00e7o\",\r\n        \"https:\/\/academy.graces.com.br\/recepcao\/venda-produto-vinculada\/\"\r\n      ]\r\n    ],\r\n    \"Vender um pacote\": [\r\n      [\r\n        \"Vender pacote\",\r\n        \"https:\/\/academy.graces.com.br\/pacotes\/vender-pacote\/\"\r\n      ]\r\n    ],\r\n    \"Lan\u00e7ar uma sess\u00e3o\": [\r\n      [\r\n        \"Lan\u00e7ar sess\u00e3o de pacote\",\r\n        \"https:\/\/academy.graces.com.br\/pacotes\/lancar-sessao-de-pacote\/\"\r\n      ]\r\n    ],\r\n    \"Consultar o saldo de um pacote\": [\r\n      [\r\n        \"Consultar saldo de pacote\",\r\n        \"https:\/\/academy.graces.com.br\/pacotes\/consultar-pacote-de-cliente\/\"\r\n      ]\r\n    ],\r\n    \"Abrir o caixa\": [\r\n      [\r\n        \"Abrir caixa\",\r\n        \"https:\/\/academy.graces.com.br\/caixa\/abrir-caixa\/\"\r\n      ]\r\n    ],\r\n    \"Receber uma comanda\": [\r\n      [\r\n        \"Receber comanda\",\r\n        \"https:\/\/academy.graces.com.br\/caixa\/receber-comanda\/\"\r\n      ]\r\n    ],\r\n    \"Fechar o caixa\": [\r\n      [\r\n        \"Fechar caixa\",\r\n        \"https:\/\/academy.graces.com.br\/caixa\/fechar-caixa\/\"\r\n      ]\r\n    ]\r\n  };\r\n  var LEVELS = [[\"Iniciante\", 0], [\"Em pr\u00e1tica\", 50], [\"Confi\u00e1vel\", 100], [\"Especialista\", 150], [\"Refer\u00eancia\", 200]];\r\n  var MAX = 200;\r\n  var s;\r\n\r\n  function el(id) { return document.getElementById(id); }\r\n  function init() {\r\n    s = { p: 0, l: 0, sl: 0, q: 0, streak: 0, stage: \"pre\", pts: 0, phasePts: [0, 0, 0, 0, 0, 0], done: [false, false, false, false, false, false], tries: 0, answered: false, wrong: [], gain: null, miss: [] };\r\n    render();\r\n  }\r\n  function levelFor(p) {\r\n    var n = LEVELS[0][0];\r\n    for (var i = 0; i < LEVELS.length; i++) if (p >= LEVELS[i][1]) n = LEVELS[i][0];\r\n    return n;\r\n  }\r\n  function level() { return levelFor(s.pts); }\r\n  function medalSvg(glyph, cls) {\r\n    var inner = glyph === \"star\"\r\n      ? '<polygon class=\"star\" points=\"28,14 32,24 43,25 35,32 37,43 28,37 19,43 21,32 13,25 24,24\"\/>'\r\n      : '<text x=\"28\" y=\"37\" text-anchor=\"middle\">' + glyph + '<\/text>';\r\n    return '<svg class=\"' + (cls || \"medal\") + '\" viewBox=\"0 0 56 56\" aria-hidden=\"true\"><circle class=\"core\" cx=\"28\" cy=\"28\" r=\"24\"\/><circle class=\"ring\" cx=\"28\" cy=\"28\" r=\"24\"\/>' + inner + '<\/svg>';\r\n  }\r\n  function renderTop() {\r\n    el(\"lvl\").textContent = level();\r\n    el(\"barfill\").style.width = (s.pts \/ MAX * 100) + \"%\";\r\n    el(\"bar\").setAttribute(\"aria-valuenow\", s.pts);\r\n    el(\"track\").innerHTML = PHASES.map(function (ph, i) {\r\n      var cls = s.done[i] ? \"done\" : (i === s.p && s.stage !== \"pre\" && s.stage !== \"final\" ? \"cur\" : \"\");\r\n      return '<li class=\"' + cls + '\"><span class=\"n\">' + (i + 1) + '<\/span><span class=\"t\">' + ph.name + '<\/span><\/li>';\r\n    }).join(\"\");\r\n    var items = PHASES.map(function (ph, i) {\r\n      return '<li class=\"' + (s.done[i] ? \"on\" : \"\") + '\">' + medalSvg(i + 1) + ph.name + '<\/li>';\r\n    });\r\n    var perfect = s.stage === \"final\" && s.pts === MAX;\r\n    items.push('<li class=\"' + (perfect ? \"on\" : \"\") + '\">' + medalSvg(\"star\") + 'Gabarito<\/li>');\r\n    el(\"medals\").innerHTML = items.join(\"\");\r\n  }\r\n  function blockHtml(b) {\r\n    if (b.k === \"p\") {\r\n      return '<div class=\"blk bk ' + b.cls + '\">' + (b.label ? '<p class=\"lbl2\">' + esc(b.label) + '<\/p>' : \"\") + '<p>' + esc(b.text) + '<\/p><\/div>';\r\n    }\r\n    if (b.k === \"path\") {\r\n      return '<p class=\"path\">Caminho no sistema<br><b>' + esc(b.text) + '<\/b><\/p>';\r\n    }\r\n    if (b.k === \"steps\") {\r\n      return '<div class=\"blk bk\"><p class=\"lbl2\">Na pr\u00e1tica | passo a passo<\/p><ol class=\"steps\">' + b.items.map(function (t) { return '<li><span>' + esc(t) + '<\/span><\/li>'; }).join(\"\") + '<\/ol><\/div>';\r\n    }\r\n    if (b.k === \"list\") {\r\n      return '<div class=\"blk bk stop\"><p class=\"lbl2\">' + esc(b.label) + '<\/p><ul class=\"bul\">' + b.items.map(function (t) { return '<li>' + esc(t) + '<\/li>'; }).join(\"\") + '<\/ul><\/div>';\r\n    }\r\n    if (b.k === \"table\") {\r\n      var cls = \"lt\" + (b.head.length >= 5 ? \" wide\" : \"\");\r\n      return '<div class=\"blk bk\">' + (b.label ? '<p class=\"lbl2\">' + esc(b.label) + '<\/p>' : \"\") +\r\n        '<div class=\"tablewrap\"><table class=\"' + cls + '\"><thead><tr>' + b.head.map(function (h) { return '<th>' + esc(h) + '<\/th>'; }).join(\"\") + '<\/tr><\/thead><tbody>' +\r\n        b.rows.map(function (r) { return '<tr>' + r.map(function (c) { return '<td>' + esc(c) + '<\/td>'; }).join(\"\") + '<\/tr>'; }).join(\"\") +\r\n        '<\/tbody><\/table><\/div><\/div>';\r\n    }\r\n    if (b.k === \"img\") {\r\n      return '<figure class=\"shot bk\"><img loading=\"lazy\" decoding=\"async\" src=\"' + esc(b.src) + '\" alt=\"' + esc(b.alt) + '\" width=\"1680\" height=\"940\" loading=\"lazy\"><figcaption>' + esc(b.cap) + '<\/figcaption><\/figure>';\r\n    }\r\n    return \"\";\r\n  }\r\n  function lessonList() { return s.stage === \"pre\" ? PRELUDE : PHASES[s.p].lessons; }\r\n  function hud(label, frac) {\r\n    return '<div class=\"hud\"><div class=\"hudl\"><span class=\"hudt\">' + label + '<\/span><div class=\"hbar\"><i style=\"width:' + Math.round(Math.max(0, Math.min(1, frac)) * 100) + '%\"><\/i><\/div><\/div>' +\r\n      '<div class=\"chip\"><span class=\"lbl\">Pontos<\/span><b>' + s.pts + '<\/b><\/div>' +\r\n      '<div class=\"chip\"><span class=\"lbl\">Sequ\u00eancia<\/span><b>' + s.streak + ' \ud83d\udd25<\/b><\/div><\/div>';\r\n  }\r\n  function refHtml(les) {\r\n    var r = REFS[les.t];\r\n    if (!r) return \"\";\r\n    return '<p class=\"refline\">Refer\u00eancia Graces Academy: ' + r.map(function (x) {\r\n      return '<a href=\"' + esc(x[1]) + '\" target=\"_blank\" rel=\"noopener noreferrer\">' + esc(x[0]) + '<\/a>';\r\n    }).join(\" \u00b7 \") + '<\/p>';\r\n  }\r\n  function slidesOf(les) { return les.blocks.filter(function (b) { return b.k !== \"path\"; }); }\r\n  function renderLesson() {\r\n    var list = lessonList(), les = list[s.l];\r\n    var where = s.stage === \"pre\" ? \"Vis\u00e3o geral\" : \"Fase \" + (s.p + 1) + \" \u00b7 \" + PHASES[s.p].name;\r\n    var slides = slidesOf(les), lastSlide = s.sl === slides.length - 1, lastLesson = s.l === list.length - 1;\r\n    var nextLabel = !lastSlide ? \"Seguir\" : lastLesson ? (s.stage === \"pre\" ? \"Come\u00e7ar a fase 1\" : \"Ir para as perguntas\") : \"Pr\u00f3xima aula\";\r\n    var path = les.blocks.filter(function (b) { return b.k === \"path\"; })[0];\r\n    var dots = slides.map(function (_, i) { return '<i class=\"' + (i === s.sl ? \"on\" : i < s.sl ? \"past\" : \"\") + '\"><\/i>'; }).join(\"\");\r\n    var frac = (s.l + (s.sl + 1) \/ slides.length) \/ list.length;\r\n    el(\"card\").innerHTML =\r\n      hud(where + ' \u00b7 Aula ' + (s.l + 1) + ' de ' + list.length, frac) +\r\n      '<div class=\"lhead\"><div><h3 class=\"ltitle\">' + esc(les.t) + '<\/h3><\/div>' +\r\n      (path ? '<p class=\"path\">Caminho no sistema<b>' + esc(path.text) + '<\/b><\/p>' : \"\") + '<\/div>' +\r\n      '<div class=\"slide\" key=\"' + s.l + '-' + s.sl + '\">' + blockHtml(slides[s.sl]) + (lastSlide ? refHtml(les) : \"\") + '<\/div>' +\r\n      '<div class=\"nav\"><div class=\"navbtns\">' + ((s.l > 0 || s.sl > 0) ? '<button class=\"btn ghost\" id=\"prev\">Voltar<\/button>' : \"\") +\r\n      '<button class=\"btn\" id=\"nextl\">' + nextLabel + '<\/button><\/div>' +\r\n      '<div class=\"pager\" aria-label=\"P\u00e1gina ' + (s.sl + 1) + ' de ' + slides.length + '\"><span class=\"dots\" aria-hidden=\"true\">' + dots + '<\/span><span class=\"pg\">P\u00e1gina ' + (s.sl + 1) + ' de ' + slides.length + '<\/span><\/div><\/div>';\r\n  }\r\n  function renderIntro() {\r\n    var ph = PHASES[s.p];\r\n    el(\"card\").innerHTML =\r\n      '<p class=\"meta\">Fase ' + (s.p + 1) + ' de ' + PHASES.length + ' \u00b7 ' + esc(ph.name) + '<\/p>' +\r\n      '<h3 class=\"ptitle\">' + esc(ph.title || ph.name) + '<\/h3>' +\r\n      (ph.path ? '<p class=\"path\">Caminho no sistema<b>' + esc(ph.path) + '<\/b><\/p>' : \"\") +\r\n      '<p class=\"rule\">' + esc(ph.rule) + '<\/p>' +\r\n      '<p class=\"status\">' + ph.lessons.length + ' aulas e ' + ph.qs.length + ' perguntas. As perguntas v\u00eam depois das aulas.<\/p>' +\r\n      '<button class=\"btn\" id=\"start\">Come\u00e7ar a aula<\/button>';\r\n  }\r\n  function renderQuestion() {\r\n    var ph = PHASES[s.p], q = ph.qs[s.q], LT = [\"A\", \"B\", \"C\", \"D\", \"E\"];\r\n    var html = hud(ph.name + ' \u00b7 Pergunta ' + (s.q + 1) + ' de ' + ph.qs.length, s.q \/ ph.qs.length);\r\n    html += '<h3 class=\"q\">' + esc(q.t) + '<\/h3><div class=\"opts\">';\r\n    q.o.forEach(function (txt, i) {\r\n      var cls = \"opt\";\r\n      if (s.wrong.indexOf(i) > -1) cls += \" bad\";\r\n      if (s.answered && i === q.c) cls += \" ok\";\r\n      html += '<button class=\"' + cls + '\" data-i=\"' + i + '\"' + (s.answered || s.wrong.indexOf(i) > -1 ? \" disabled\" : \"\") + '><span class=\"ltr\">' + LT[i] + '<\/span><span>' + esc(txt) + '<\/span><\/button>';\r\n    });\r\n    html += '<\/div>';\r\n    if (s.answered) {\r\n      var head = s.gain === 10 ? \"Certo. +10 pontos\" : s.gain === 5 ? \"Certo na segunda. +5 pontos\" : \"Aten\u00e7\u00e3o: sem pontos desta vez\";\r\n      var last = s.q === ph.qs.length - 1;\r\n      html += '<div class=\"fb ' + (s.gain > 0 ? \"ok\" : \"warn\") + '\"><strong>' + head + '<\/strong><p>' + esc(q.why) + ' <em>M\u00f3dulo 0' + (s.p + 2) + '.<\/em><\/p>' +\r\n        '<button class=\"btn\" id=\"next\">' + (last ? \"Receber medalha\" : \"Pr\u00f3xima pergunta\") + '<\/button><\/div>';\r\n    } else if (s.wrong.length) {\r\n      html += '<div class=\"fb warn\"><strong>Quase<\/strong><p>Tente de novo. Acertando agora, vale 5 pontos.<\/p><\/div>';\r\n    }\r\n    el(\"card\").innerHTML = html;\r\n  }\r\n  function renderMedal() {\r\n    var ph = PHASES[s.p], last = s.p === PHASES.length - 1;\r\n    el(\"card\").innerHTML =\r\n      '<div class=\"reward\">' + medalSvg(s.p + 1, \"big-medal\") +\r\n      '<p class=\"meta\">Fase ' + (s.p + 1) + ' conclu\u00edda<\/p>' +\r\n      '<h3 class=\"q\">Medalha ' + ph.name + '. Voc\u00ea fez ' + s.phasePts[s.p] + ' de ' + (ph.qs.length * 10) + ' pontos.<\/h3>' +\r\n      '<button class=\"btn\" id=\"go\">' + (last ? \"Ver resultado\" : \"Ir para a fase \" + (s.p + 2)) + '<\/button><\/div>';\r\n  }\r\n  function revList() {\r\n    return s.miss.slice().sort().map(function (i) { return \"m\u00f3dulo 0\" + (i + 2) + \" (\" + PHASES[i].name + \")\"; });\r\n  }\r\n  function resultText() {\r\n    var rev = revList();\r\n    return \"Trilha do Atendimento: \" + s.pts + \" de \" + MAX + \" pontos, n\u00edvel \" + level() + \". \" +\r\n      (rev.length ? \"Revisar no treinamento: \" + rev.join(\", \") + \".\" : \"Gabarito completo, sem nenhum erro.\");\r\n  }\r\n  function renderFinal() {\r\n    var perfect = s.pts === MAX;\r\n    var rev = revList();\r\n    el(\"card\").innerHTML =\r\n      '<div class=\"reward\"><p class=\"meta\">Trilha conclu\u00edda<\/p>' +\r\n      '<h3 class=\"q\">' + s.pts + ' de ' + MAX + ' pontos. N\u00edvel ' + level() + '.<\/h3>' +\r\n      (perfect\r\n        ? '<p>Gabarito completo, sem nenhum erro.<\/p>'\r\n        : '<p class=\"review\">Para revisar no treinamento: ' + rev.join(\", \") + '.<\/p>') +\r\n      '<p class=\"closing\">Confira cliente, profissional, item, quantidade e valor antes de salvar.<\/p>' +\r\n      '<p class=\"refline\" style=\"margin:0\"><a href=\"https:\/\/academy.graces.com.br\/\" target=\"_blank\" rel=\"noopener noreferrer\">Acessar a Graces Academy<\/a><\/p>' +\r\n      '<p class=\"status\" id=\"rec\">Registrando seu resultado...<\/p>' +\r\n      '<div class=\"btnrow\"><button class=\"btn\" id=\"copy\">Copiar resultado<\/button>' +\r\n      '<button class=\"btn ghost\" id=\"again\">Refazer a trilha<\/button><\/div>' +\r\n      '<p class=\"copytext\" id=\"copytext\" hidden><\/p><\/div>';\r\n    if (!s.saved) {\r\n      s.saved = true;\r\n      record().then(function (ok) {\r\n        var r = el(\"rec\");\r\n        if (r) r.textContent = ok\r\n          ? \"Resultado registrado.\"\r\n          : \"Seu resultado n\u00e3o foi registrado automaticamente. Use Copiar resultado e envie para quem coordena o treinamento.\";\r\n      });\r\n    }\r\n  }\r\n  function render() {\r\n    renderTop();\r\n    if (s.stage === \"final\") renderFinal();\r\n    else if (s.stage === \"medal\") renderMedal();\r\n    else if (s.stage === \"intro\") renderIntro();\r\n    else if (s.stage === \"pre\" || s.stage === \"lesson\") renderLesson();\r\n    else renderQuestion();\r\n  }\r\n  function cap(name) {\r\n    try { return window.claude && window.claude.use ? window.claude.use(name) : Promise.resolve(null); }\r\n    catch (e) { return Promise.resolve(null); }\r\n  }\r\n  function record() {\r\n    var payload = { pontos: s.pts, fases: s.phasePts.slice(), revisar: s.miss.slice().sort(), concluidoEm: new Date().toISOString() };\r\n    return Promise.all([cap(\"db\"), cap(\"user\")]).then(function (r) {\r\n      var db = r[0], user = r[1];\r\n      if (!db || !user) return false;\r\n      return user.id().then(function (id) {\r\n        if (!id) return false;\r\n        return db.doc(\"resultados\/\" + id).set(payload).then(function () { return true; });\r\n      });\r\n    }).catch(function () { return false; });\r\n  }\r\n  function copyResult(btn) {\r\n    var text = resultText(), box = el(\"copytext\");\r\n    if (box) {\r\n      box.textContent = text; box.hidden = false;\r\n      try { var rg = document.createRange(); rg.selectNodeContents(box); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(rg); } catch (e) {}\r\n    }\r\n    try { navigator.clipboard.writeText(text).then(function () { btn.textContent = \"Copiado\"; }, function () {}); } catch (e) {}\r\n  }\r\n  function renderPanel(user, docs) {\r\n    var body = el(\"panelbody\");\r\n    if (!docs.length) { body.innerHTML = '<p class=\"empty\">Ningu\u00e9m concluiu a trilha ainda. Cada pessoa aparece aqui quando termina.<\/p>'; return; }\r\n    var rows = docs.map(function (d) { return { id: d.id, v: d.data() || {} }; });\r\n    rows.sort(function (a, b) { return String(b.v.concluidoEm || \"\").localeCompare(String(a.v.concluidoEm || \"\")); });\r\n    user.profiles(rows.map(function (r) { return r.id; })).then(function (ps) {\r\n      var table = document.createElement(\"table\");\r\n      var head = table.createTHead().insertRow();\r\n      [\"Pessoa\", \"Pontos\", \"N\u00edvel\", \"Revisar\", \"Quando\"].forEach(function (h) {\r\n        var th = document.createElement(\"th\"); th.textContent = h; head.appendChild(th);\r\n      });\r\n      var tb = table.createTBody();\r\n      rows.forEach(function (r) {\r\n        var tr = tb.insertRow();\r\n        var pts = Number(r.v.pontos);\r\n        var rev = Array.isArray(r.v.revisar)\r\n          ? r.v.revisar.map(Number).filter(function (i) { return i >= 0 && i < PHASES.length; }).sort().map(function (i) { return PHASES[i].name; })\r\n          : [];\r\n        var dt = new Date(r.v.concluidoEm);\r\n        var cells = [\r\n          (ps[r.id] && ps[r.id].name) || \"Pessoa sem nome vis\u00edvel\",\r\n          isFinite(pts) ? pts + \" de \" + MAX : \"\",\r\n          isFinite(pts) ? levelFor(pts) : \"\",\r\n          rev.join(\", \") || \"Nada\",\r\n          isNaN(dt) ? \"\" : dt.toLocaleString(\"pt-BR\", { day: \"2-digit\", month: \"2-digit\", hour: \"2-digit\", minute: \"2-digit\" })\r\n        ];\r\n        cells.forEach(function (c, i) {\r\n          var td = tr.insertCell(); td.textContent = c; if (i === 1) td.className = \"n\";\r\n        });\r\n      });\r\n      var wrap = document.createElement(\"div\"); wrap.className = \"tablewrap\"; wrap.appendChild(table);\r\n      var count = document.createElement(\"p\"); count.className = \"empty\";\r\n      count.textContent = rows.length + (rows.length === 1 ? \" pessoa concluiu a trilha.\" : \" pessoas conclu\u00edram a trilha.\");\r\n      body.textContent = \"\"; body.appendChild(count); body.appendChild(wrap);\r\n    });\r\n  }\r\n  function initPanel() {\r\n    Promise.all([cap(\"user\"), cap(\"db\")]).then(function (r) {\r\n      var user = r[0], db = r[1];\r\n      if (!user || !db) return;\r\n      return user.canEdit().then(function (ok) {\r\n        if (!ok) return;\r\n        el(\"panel\").hidden = false;\r\n        el(\"panelbody\").innerHTML = '<p class=\"empty\">Carregando resultados...<\/p>';\r\n        db.collection(\"resultados\").onSnapshot(\r\n          function (snap) { renderPanel(user, snap.docs); },\r\n          function () { el(\"panelbody\").innerHTML = '<p class=\"empty\">N\u00e3o foi poss\u00edvel carregar os resultados agora.<\/p>'; }\r\n        );\r\n      });\r\n    }).catch(function () {});\r\n  }\r\n  function toCard(top) {\r\n    try {\r\n      var reduce = window.matchMedia && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\r\n      el(\"card\").scrollIntoView({ behavior: reduce ? \"auto\" : \"smooth\", block: top ? \"start\" : \"nearest\" });\r\n    } catch (e) {}\r\n  }\r\n  function answer(i) {\r\n    if (s.answered) return;\r\n    var q = PHASES[s.p].qs[s.q];\r\n    if (i === q.c) {\r\n      s.gain = s.tries === 0 ? 10 : 5;\r\n      s.answered = true;\r\n      if (s.gain === 10) s.streak++;\r\n    } else {\r\n      s.wrong.push(i); s.tries++; s.streak = 0;\r\n      if (s.tries >= 2) { s.gain = 0; s.answered = true; }\r\n    }\r\n    if (s.answered) {\r\n      s.pts += s.gain; s.phasePts[s.p] += s.gain;\r\n      if (s.gain < 10 && s.miss.indexOf(s.p) < 0) s.miss.push(s.p);\r\n    }\r\n    render();\r\n  }\r\n  function next() {\r\n    var ph = PHASES[s.p];\r\n    s.tries = 0; s.answered = false; s.wrong = []; s.gain = null;\r\n    if (s.q < ph.qs.length - 1) { s.q++; }\r\n    else { s.done[s.p] = true; s.stage = \"medal\"; }\r\n    render(); toCard();\r\n  }\r\n  function go() {\r\n    if (s.p < PHASES.length - 1) { s.p++; s.l = 0; s.sl = 0; s.q = 0; s.stage = \"intro\"; } else { s.stage = \"final\"; }\r\n    render(); toCard();\r\n  }\r\n  function nextLesson() {\r\n    var list = lessonList();\r\n    if (s.sl < slidesOf(list[s.l]).length - 1) { s.sl++; }\r\n    else if (s.l < list.length - 1) { s.l++; s.sl = 0; }\r\n    else if (s.stage === \"pre\") { s.stage = \"intro\"; s.p = 0; s.l = 0; s.sl = 0; }\r\n    else { s.stage = \"q\"; s.q = 0; }\r\n    render(); toCard(true);\r\n  }\r\n  el(\"card\").addEventListener(\"click\", function (e) {\r\n    var b = e.target.closest(\"button\");\r\n    if (!b) return;\r\n    if (b.dataset.i !== undefined) answer(+b.dataset.i);\r\n    else if (b.id === \"start\") { s.stage = \"lesson\"; s.l = 0; s.sl = 0; render(); toCard(true); }\r\n    else if (b.id === \"nextl\") nextLesson();\r\n    else if (b.id === \"prev\") {\r\n      if (s.sl > 0) { s.sl--; }\r\n      else if (s.l > 0) { s.l--; s.sl = slidesOf(lessonList()[s.l]).length - 1; }\r\n      render(); toCard(true);\r\n    }\r\n    else if (b.id === \"next\") next();\r\n    else if (b.id === \"go\") go();\r\n    else if (b.id === \"copy\") copyResult(b);\r\n    else if (b.id === \"again\") { init(); toCard(true); }\r\n  });\r\n  init();\r\n  initPanel();\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\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Trilha do Atendimento Treinamento da recep\u00e7\u00e3o \u00b7 rotinas no Graces Trilha do Atendimento Inicianten\u00edvel Medalhas Resultados da trilha BEAUTY.CO.LAB EDUCAbeautycolabeduca.com.br<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"nf_dc_page":"","footnotes":""},"class_list":["post-20","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/beautycolabeduca.com.br\/home\/wp-json\/wp\/v2\/pages\/20","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beautycolabeduca.com.br\/home\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/beautycolabeduca.com.br\/home\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/beautycolabeduca.com.br\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/beautycolabeduca.com.br\/home\/wp-json\/wp\/v2\/comments?post=20"}],"version-history":[{"count":5,"href":"https:\/\/beautycolabeduca.com.br\/home\/wp-json\/wp\/v2\/pages\/20\/revisions"}],"predecessor-version":[{"id":146,"href":"https:\/\/beautycolabeduca.com.br\/home\/wp-json\/wp\/v2\/pages\/20\/revisions\/146"}],"wp:attachment":[{"href":"https:\/\/beautycolabeduca.com.br\/home\/wp-json\/wp\/v2\/media?parent=20"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}