<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://www.pandoraburo.ru/" xml:lang="ru">
  <id>https://www.pandoraburo.ru/schit-postavschika-2</id>
  <link href="https://www.pandoraburo.ru/schit-postavschika-2.xml" rel="self"/>
  <title>Щит поставщика 2</title>
  <subtitle type="html">
&lt;html lang="ru"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Щит поставщика — проверка сделки по договору&lt;/title&gt;
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"&gt;&lt;/script&gt;
&lt;style&gt;
  #spApp, #spApp *{box-sizing:border-box !important;
    font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif !important;
    -webkit-font-smoothing:antialiased}
  #spApp{
    --bg:#0d1117; --panel:#161b22; --panel-2:#1c232c;
    --text:#e6edf3; --muted:#8b949e; --border:#2a323c;
    --green:#3fb950; --yellow:#d29922; --red:#f85149;
    --accent:#4493f8; --accent-2:#79b8ff;
    background:var(--bg) !important; color:var(--text) !important;
    font-size:15px !important; line-height:1.55 !important;
    padding:28px 18px 80px !important; border-radius:12px;
    text-align:left !important;
  }
  #spApp .wrap{max-width:1080px;margin:0 auto}
  #spApp h1,#spApp h2,#spApp h3{margin:0;color:var(--text) !important;
    letter-spacing:-0.01em;font-weight:600}
  #spApp p{margin:0}
  #spApp .screen{display:none}
  #spApp .screen.active{display:block}

  #spApp .hero{padding:24px 0 22px;border-bottom:1px solid var(--border);margin-bottom:24px}
  #spApp .hero h1{font-size:28px;margin-bottom:10px}
  #spApp .hero p{color:var(--muted);max-width:720px;margin-bottom:10px}
  #spApp .hero .quiet{font-size:13px;color:var(--muted);opacity:.85}

  #spApp button.primary{
    background:var(--accent) !important; color:#fff !important;
    border:none !important; padding:14px 28px !important;
    border-radius:8px !important; font:inherit !important;
    font-weight:700 !important; font-size:15px !important;
    cursor:pointer; transition:opacity .15s;
  }
  #spApp button.primary:hover{opacity:.9}
  #spApp button.primary:disabled{background:#2a323c !important;
    color:#6e7681 !important; cursor:not-allowed}
  #spApp button.ghost{
    background:transparent !important; color:var(--muted) !important;
    border:1px solid var(--border) !important; padding:13px 20px !important;
    border-radius:8px !important; font:inherit !important;
    font-weight:600 !important; font-size:14px !important; cursor:pointer;
  }
  #spApp button.ghost:hover:not(:disabled){color:var(--text) !important;border-color:var(--muted) !important}
  #spApp button.ghost:disabled{opacity:.45;cursor:not-allowed}
  #spApp button.blocked{
    background:#3a1d1d !important; color:#f85149 !important;
    border:1px solid #f85149 !important; padding:14px 28px !important;
    border-radius:8px !important; font:inherit !important;
    font-weight:700 !important; font-size:15px !important; cursor:not-allowed;
  }

  #spApp .progress-shell{margin:0 0 22px}
  #spApp .progress-info{display:flex;justify-content:space-between;
    font-size:13px;color:var(--muted);margin-bottom:10px;gap:12px;flex-wrap:wrap}
  #spApp .progress-info strong{color:var(--text)}
  #spApp .progress-track{height:5px;background:var(--panel-2);
    border-radius:3px;overflow:hidden}
  #spApp .progress-fill{height:100%;width:0;
    background:linear-gradient(90deg,var(--accent),var(--accent-2));
    transition:width .3s;border-radius:3px}
  #spApp .draft-note{font-size:12px;color:var(--muted);margin-top:8px;
    font-style:italic;opacity:.85;transition:opacity .4s}
  #spApp .draft-note.hidden{opacity:0}

  #spApp .flags-bar{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:22px}
  @media (max-width:640px){#spApp .flags-bar{grid-template-columns:1fr}}
  #spApp .flag-card{background:var(--panel);border:1px solid var(--border);
    border-radius:10px;padding:14px 16px;display:flex;align-items:center;gap:12px}
  #spApp .flag-card .dot{width:12px;height:12px;border-radius:50%;
    background:#6e7681;flex-shrink:0;transition:background .3s}
  #spApp .flag-card.g .dot{background:var(--green);box-shadow:0 0 8px var(--green)}
  #spApp .flag-card.y .dot{background:var(--yellow);box-shadow:0 0 8px var(--yellow)}
  #spApp .flag-card.r .dot{background:var(--red);box-shadow:0 0 8px var(--red)}
  #spApp .flag-card .lbl{font-size:12px;color:var(--muted)}
  #spApp .flag-card .val{font-size:14px;font-weight:600;color:var(--text)}

  #spApp .block{background:var(--panel);border:1px solid var(--border);
    border-radius:12px;padding:22px 22px 6px;margin-bottom:16px}
  #spApp .block-head{display:flex;justify-content:space-between;
    align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:6px}
  #spApp .block-head h2{font-size:16px}
  #spApp .block-head .weight{font-size:12px;color:var(--muted);
    background:var(--panel-2);border:1px solid var(--border);
    padding:3px 10px;border-radius:20px}
  #spApp .block-desc{font-size:13px;color:var(--muted);margin-bottom:16px}
  #spApp .q{padding:14px 0;border-top:1px solid var(--border)}
  #spApp .q:first-of-type{border-top:none}
  #spApp .q-label{font-size:14px;margin-bottom:10px;display:block;
    color:var(--text);line-height:1.5}
  #spApp .q-label .num{color:var(--muted);margin-right:6px;
    font-variant-numeric:tabular-nums;font-weight:600}
  #spApp .q-critical{display:inline-block;font-size:10px;
    color:var(--red);border:1px solid var(--red);padding:1px 7px;
    border-radius:10px;margin-left:8px;font-weight:700;
    vertical-align:middle;letter-spacing:.05em}
  #spApp .q-hint{font-size:12px;color:var(--muted);margin-top:-4px;
    margin-bottom:10px;font-style:italic}

  #spApp .q-body{display:flex;gap:16px;align-items:flex-start}
  #spApp .q-answers{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
  #spApp .q-warning{
    flex:0 0 280px;
    display:none;
    padding:12px 14px;
    background:rgba(248,81,73,.08);
    border:1px solid rgba(248,81,73,.45);
    border-left:3px solid var(--red);
    border-radius:8px;
    font-size:12.5px;
    line-height:1.55;
    color:#ffb8b0;
    animation:sp-warn-in .28s cubic-bezier(.2,.8,.3,1);
  }
  #spApp .q-warning.visible{display:block}
  #spApp .q-warning.y{
    background:rgba(210,153,34,.08);
    border-color:rgba(210,153,34,.45);
    border-left-color:var(--yellow);
    color:#f0d590;
  }
  #spApp .q-warning .wicon{
    display:inline-block;font-weight:700;
    margin-right:6px;color:var(--red);
  }
  #spApp .q-warning.y .wicon{color:var(--yellow)}
  @keyframes sp-warn-in{
    from{opacity:0;transform:translateX(8px)}
    to{opacity:1;transform:translateX(0)}
  }
  @media (max-width:900px){
    #spApp .q-body{flex-direction:column}
    #spApp .q-warning{flex:none;width:100%;order:2}
    #spApp .q-answers{order:1;width:100%}
  }

  #spApp .q-answer{padding:11px 13px;background:var(--panel-2);
    border:1px solid var(--border);border-radius:8px;font-size:14px;
    cursor:pointer;transition:.15s;display:flex;gap:10px;align-items:flex-start}
  #spApp .q-answer:hover{border-color:var(--accent)}
  #spApp .q-answer input{display:none}
  #spApp .q-answer .box{width:18px;height:18px;border:1px solid var(--border);
    border-radius:4px;flex-shrink:0;display:grid;place-items:center;
    margin-top:2px;transition:.15s}
  #spApp .q-answer .box::after{content:"";width:10px;height:10px;
    background:var(--accent);border-radius:2px;transform:scale(0);
    transition:.15s}
  #spApp .q-answer input:checked ~ .box{border-color:var(--accent);
    background:rgba(68,147,248,.1)}
  #spApp .q-answer input:checked ~ .box::after{transform:scale(1)}
  #spApp .q-answer .lbl{font-size:14px;color:var(--text);line-height:1.5}

  /* Чек-лист */
  #spApp .q-checklist{display:flex;flex-direction:column;gap:10px;margin-top:6px}
  #spApp .q-cl-item{background:var(--panel-2);border:1px solid var(--border);
    border-radius:8px;padding:10px 12px;transition:.15s}
  #spApp .q-cl-item.on{border-color:var(--accent);background:rgba(68,147,248,.06)}
  #spApp .q-cl-head{display:flex;align-items:center;gap:10px;cursor:pointer}
  #spApp .q-cl-head input{display:none}
  #spApp .q-cl-head .box{width:18px;height:18px;border:1px solid var(--border);
    border-radius:4px;flex-shrink:0;display:grid;place-items:center;transition:.15s}
  #spApp .q-cl-head .box::after{content:"";width:10px;height:10px;
    background:var(--accent);border-radius:2px;transform:scale(0);transition:.15s}
  #spApp .q-cl-head input:checked ~ .box{border-color:var(--accent);
    background:rgba(68,147,248,.1)}
  #spApp .q-cl-head input:checked ~ .box::after{transform:scale(1)}
  #spApp .q-cl-head .lbl{font-size:14px;color:var(--text);font-weight:600}
  #spApp .q-cl-input{margin-top:8px;display:none}
  #spApp .q-cl-item.on .q-cl-input{display:block}
  #spApp .q-cl-input input{width:100%;background:#0d1117 !important;
    border:1px solid var(--border);color:var(--text) !important;
    padding:9px 12px;border-radius:6px;font:inherit !important;
    outline:none;font-size:13px}
  #spApp .q-cl-input input:focus{border-color:var(--accent)}

  #spApp .consent{background:var(--panel);border:1px solid var(--border);
    border-radius:12px;padding:22px;margin-bottom:16px}
  #spApp .consent h2{font-size:16px;margin-bottom:12px}
  #spApp .consent .disclaimer{font-size:13px;color:var(--muted);
    background:var(--panel-2);border-left:3px solid var(--accent);
    padding:12px 16px;border-radius:6px;margin-bottom:14px;line-height:1.65}
  #spApp .consent label{display:flex;gap:10px;align-items:flex-start;
    font-size:13px;cursor:pointer;color:var(--text);line-height:1.6}
  #spApp .consent input[type=checkbox]{margin-top:3px;accent-color:var(--accent);
    width:16px;height:16px;flex-shrink:0;cursor:pointer}

  #spApp .info-box{background:var(--panel);border:1px solid var(--border);
    border-radius:12px;padding:22px;margin-bottom:16px}
  #spApp .info-box h2{font-size:16px;margin-bottom:14px}
  #spApp .field{margin-bottom:12px}
  #spApp .field label{display:block;font-size:13px;color:var(--muted);margin-bottom:6px}
  #spApp .field input{width:100%;background:var(--panel-2) !important;
    border:1px solid var(--border);color:var(--text) !important;
    padding:11px 13px;border-radius:8px;font:inherit !important;
    outline:none;font-size:14px}
  #spApp .field input:focus{border-color:var(--accent)}
  #spApp .field-error{color:#f85149;font-size:12px;margin-top:6px}

  #spApp .actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:18px}

  #spApp .report{background:var(--panel);border:1px solid var(--accent);
    border-radius:12px;padding:26px;margin-top:20px}
  #spApp .report.blocked{border-color:var(--red)}
  #spApp .report.warn{border-color:var(--yellow)}
  #spApp .report h2{font-size:19px;margin-bottom:16px}
  #spApp .report h3{font-size:12px;margin:22px 0 10px;color:var(--muted);
    text-transform:uppercase;letter-spacing:.08em;font-weight:600}
  #spApp .report .row{display:flex;justify-content:space-between;padding:9px 0;
    border-bottom:1px solid var(--border);font-size:14px;gap:12px}
  #spApp .report .row:last-child{border-bottom:none}
  #spApp .report .row span:first-child{color:var(--muted)}
  #spApp .report .row strong{color:var(--text)}
  #spApp .report .list{margin:0;padding-left:20px;font-size:13px;
    color:var(--text);line-height:1.7}
  #spApp .report .list li{margin-bottom:12px}
  #spApp .report .list.red li::marker{color:var(--red)}
  #spApp .report .list.yellow li::marker{color:var(--yellow)}
  #spApp .report .list.green li::marker{color:var(--green)}
  #spApp .report .list.blue li::marker{color:var(--accent)}
  #spApp .report .list .warn-note{display:block;font-size:12px;
    color:var(--muted);font-style:italic;margin-top:4px}
  #spApp .report .list.red .warn-note{color:#ffb8b0}
  #spApp .report .list.yellow .warn-note{color:#f0d590}
  #spApp .report .verdict{padding:16px 20px;border-radius:10px;
    font-weight:700;font-size:15px;margin-bottom:16px;
    text-transform:uppercase;letter-spacing:.05em}
  #spApp .report .verdict.stop{background:rgba(248,81,73,.1);
    color:var(--red);border:1px solid var(--red)}
  #spApp .report .verdict.go{background:rgba(63,185,80,.1);
    color:var(--green);border:1px solid var(--green)}
  #spApp .report .verdict.wait{background:rgba(210,153,34,.1);
    color:var(--yellow);border:1px solid var(--yellow)}
  #spApp .report .discl{font-size:12px;color:var(--muted);
    background:var(--panel-2);border-left:3px solid var(--accent);
    padding:12px 16px;border-radius:6px;margin-top:20px;line-height:1.65}

  #spApp .hp-field{position:absolute;left:-9999px;top:auto}
  #spApp footer{color:var(--muted);font-size:12px;text-align:center;
    margin-top:40px;padding-top:20px;border-top:1px solid var(--border)}

  @media (max-width:640px){
    #spApp{padding:18px 12px 60px !important}
    #spApp .hero h1{font-size:24px}
    #spApp .field input{font-size:16px !important}
    #spApp button.primary,#spApp button.blocked{width:100%;padding:15px 22px !important}
    #spApp button.ghost{width:100%}
    #spApp .actions{flex-direction:column;align-items:stretch}
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div id="spApp"&gt;
  &lt;div class="wrap"&gt;

    &lt;section class="screen active" id="spIntro"&gt;
      &lt;div class="hero"&gt;
        &lt;h1&gt;Щит поставщика&lt;/h1&gt;
        &lt;p&gt;Проверка сделки до отправки документов покупателю. Форма построена
        по чек-листу вашего типового договора — каждый вопрос привязан
        к конкретному защитному пункту.&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Щит от покупателя&lt;/strong&gt; — юридические ловушки в договоре.&lt;br /&gt;
        &lt;strong&gt;Щит от менеджера&lt;/strong&gt; — реалистичность сроков, наличие сырья,
        гарантии завода, согласование с производством.&lt;/p&gt;
        &lt;p class="quiet"&gt;Как только вы выбираете «неправильный» ответ — справа
        появляется предупреждение. Если критический пункт не закрыт — кнопка
        внизу блокируется.&lt;/p&gt;
      &lt;/div&gt;
      &lt;button type="button" class="primary" id="spStart"&gt;Начать проверку&lt;/button&gt;
    &lt;/section&gt;

    &lt;section class="screen" id="spForm"&gt;
      &lt;div class="progress-shell"&gt;
        &lt;div class="progress-info"&gt;
          &lt;span&gt;Отвечено: &lt;strong id="spFilled"&gt;0&lt;/strong&gt; из &lt;strong id="spTotal"&gt;0&lt;/strong&gt;&lt;/span&gt;
          &lt;span id="spTime"&gt;Осталось примерно 10 минут&lt;/span&gt;
        &lt;/div&gt;
        &lt;div class="progress-track"&gt;&lt;div class="progress-fill" id="spProgress"&gt;&lt;/div&gt;&lt;/div&gt;
        &lt;div class="draft-note" id="spDraftNote"&gt;Ответы сохраняются автоматически&lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="flags-bar"&gt;
        &lt;div class="flag-card" id="spFlagBuyer"&gt;
          &lt;div class="dot"&gt;&lt;/div&gt;
          &lt;div&gt;
            &lt;div class="lbl"&gt;Щит от покупателя&lt;/div&gt;
            &lt;div class="val" id="spFlagBuyerVal"&gt;— не проверено&lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="flag-card" id="spFlagManager"&gt;
          &lt;div class="dot"&gt;&lt;/div&gt;
          &lt;div&gt;
            &lt;div class="lbl"&gt;Щит от менеджера&lt;/div&gt;
            &lt;div class="val" id="spFlagManagerVal"&gt;— не проверено&lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;form id="spFormEl" autocomplete="off" novalidate="novalidate"&gt;
        &lt;div class="hp-field"&gt;
          &lt;label&gt;Не заполняйте &lt;input type="text" id="spHp" tabindex="-1" /&gt;&lt;/label&gt;
        &lt;/div&gt;

        &lt;div id="spBlocks"&gt;&lt;/div&gt;

        &lt;section class="info-box"&gt;
          &lt;h2&gt;Ответственные и сделка&lt;/h2&gt;
          &lt;div class="field"&gt;
            &lt;label&gt;Кто заполняет форму (ваше имя) *&lt;/label&gt;
            &lt;input type="text" id="spFiller" placeholder="Имя того, кто проходит чек-лист" /&gt;
            &lt;div class="field-error" id="spFillerErr" style="display:none;"&gt;Заполните себя&lt;/div&gt;
          &lt;/div&gt;
          &lt;div class="field"&gt;
            &lt;label&gt;Старший менеджер (кому направляется протокол) *&lt;/label&gt;
            &lt;input type="text" id="spSenior" placeholder="Имя старшего менеджера" /&gt;
            &lt;div class="field-error" id="spSeniorErr" style="display:none;"&gt;Заполните вашего старшего менеджера&lt;/div&gt;
          &lt;/div&gt;
          &lt;div class="field"&gt;
            &lt;label&gt;Клиент / покупатель (обезличенно) *&lt;/label&gt;
            &lt;input type="text" id="spClient" placeholder="Например: Клиент А, металлотрейдер" /&gt;
          &lt;/div&gt;
          &lt;div class="field"&gt;
            &lt;label&gt;Суть сделки *&lt;/label&gt;
            &lt;input type="text" id="spDeal" placeholder="Например: броня 50/25/16/10/6 мм, 5 позиций" /&gt;
          &lt;/div&gt;
          &lt;div class="field"&gt;
            &lt;label&gt;Менеджер, ведущий сделку *&lt;/label&gt;
            &lt;input type="text" id="spManager" placeholder="Имя менеджера" /&gt;
          &lt;/div&gt;
        &lt;/section&gt;

        &lt;section class="consent"&gt;
          &lt;h2&gt;Дисклеймер&lt;/h2&gt;
          &lt;div class="disclaimer"&gt;
            Инструмент является структурированной проверкой фактов, предоставленных
            пользователем. Не является юридической консультацией и не заменяет
            юридическую экспертизу договора. Ответственность за решения и подписание
            документов лежит на собственнике / руководителе.
          &lt;/div&gt;
          &lt;label&gt;
            &lt;input type="checkbox" id="spConsent" /&gt;
            &lt;span&gt;Я понимаю, что это проверка фактов, а не юридическая консультация.
            Финальное решение по сделке принимаю я.&lt;/span&gt;
          &lt;/label&gt;
        &lt;/section&gt;

        &lt;div class="actions"&gt;
          &lt;button type="submit" class="primary" id="spSubmit" disabled="disabled"&gt;Проверить сделку&lt;/button&gt;
          &lt;button type="button" class="ghost" id="spDownload" disabled="disabled"&gt;Скачать протокол (HTML + TXT + PDF)&lt;/button&gt;
          &lt;button type="button" class="ghost" id="spReset"&gt;Очистить&lt;/button&gt;
        &lt;/div&gt;
      &lt;/form&gt;

      &lt;div class="report" id="spReport" style="display:none"&gt;&lt;/div&gt;
    &lt;/section&gt;

    &lt;footer&gt;
      Щит поставщика · Второе мнение · © &lt;span id="spYear"&gt;&lt;/span&gt;
    &lt;/footer&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
(function(){
  "use strict";

  var STORAGE_KEY = "shchit_postavshchika_v2";
  var RECIPIENT_EMAIL = "setipandorra@internet.ru";

  // ============================================================
  // ВСТРОЕННЫЙ ШРИФТ ROBOTO REGULAR (кириллица)
  // ============================================================
  var ROBOTO_FONT_BASE64 = "AAEAAAASAQAABAAgR0RFRqZDpEwAAAOUAAACWEdQT1MH0trkAABd6AAAWMBHU1VCAP8A/wAAA+AAAAAgT1MvMqJ2n3QAABfkAAAAYGNtYXBpZkFqAAAYRAAAAVRnYXNwAAAAAMAAABfYAAAAEGdseWYAAAAAAAAAAAAAAABn2AAAaNxoZWFkC6f+3wAAE7wAAAA2aGhlYQ9uBGsAABe8AAAAJGhtdHi4WnU/AAAT9AAAA8hsb2NhAAAAAAAAAAAAAGfYAAAA5m1heHAAogHyAAATnAAAACBuYW1lV2wL7wAAGZgAAAGOcG9zdP+fADMAABsoAAAAIHByZXABAAAAAAAAZ9gAAAAUAAAAAAABAAAAAMw9os8AAAAAzD2izwAAAADMPaLPAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAHAABAAAAAADcAAMAAQAAABwABADAAAAALgAgAAQADgAAAAEAIAAgACYAKgAvADkAQwBJAE8AVwBbAF8AYwBpAG8AdQB7AIEAhwCNAJMAmQCfAKUAqwCxALcAvQDDAMkAzwDVANsA4QDnAO0A8wD5AP8BBQELAREBFwEdASMBKQEvATUBOwFBAUcBTQFTAVkBYQFnAW0BcwF5AX8BhQGLAY0BkwGZAaEBpwGtAbMBuQG/AcUBywHRAdcB3QHjAekB7wH1AfsCAQIAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAAAAgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0AngCfAKAAoQCiAKMApAClAKYApwCoAKkAqgCrAKwArQCuAK8AsACxALIAswC0ALUAtgC3ALgAuQC6ALsAvAC9AL4AvwDAAMEAwgDDAMQAxQDGAMcAyADJAMoAywDMAM0AzgDPANAA0QDSANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDnAOgA6QDqAOsA7ADtAO4A7wDwAPEA8gDzAPQA9QD2APcA+AD5APoA+wD8AP0A/gD/AQABAQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+Af8CAQ==";

  // ============================================================
  // КАТАЛОГ ВОПРОСОВ
  // ============================================================
  var BLOCKS = [
    {
      title:"Щит от покупателя — защитные пункты договора",
      weight:60,
      desc:"Проверка договора по чек-листу. Каждый пункт — по образцу типового договора. Если пункта нет — красный флаг, отправлять нельзя.",
      questions:[
        { id:"c_signed", type:"choice", critical:true,
          text:"Договор подписан покупателем?",
          hint:"Если нет — счёт и спецификацию отправлять нельзя. Это ключевая защита.",
          warn:"Менеджер, нельзя отправлять счёт и спецификацию без подписанного договора. Покупатель получит обязательство без защиты.",
          options:[
            { v:"yes", l:"Да, получен подписанный экземпляр" },
            { v:"no", l:"Нет, покупатель не подписал" },
            { v:"dont", l:"Пришлёт протокол разногласий" }
          ]},
        { id:"c_prepay", type:"choice", critical:true,
          text:"Есть ли пункт о 100% предоплате?",
          hint:"Аналог п. 2.2. Без этого — работа в долг.",
          warn:"Без 100% предоплаты сделка превращается в кредитование покупателя. Риск неоплаты и кассового разрыва.",
          options:[
            { v:"yes", l:"Да, 100% предоплата" },
            { v:"partial", l:"Частичная предоплата (не менее 50%)" },
            { v:"no", l:"Отсрочка / оплата по факту" }
          ]},
        { id:"c_offset", type:"choice", critical:true,
          text:"Есть ли запрет на односторонний зачёт, удержание, приостановку оплаты?",
          hint:"Аналог п. 2.3. Без этого покупатель может уменьшить оплату в одностороннем порядке.",
          warn:"Покупатель может односторонне уменьшить оплату или зачесть претензии. Спорные суммы зависнут.",
          options:[
            { v:"yes", l:"Да, запрет прописан" },
            { v:"no", l:"Нет, покупатель может зачесть" },
            { v:"dont", l:"Есть, но формальный" }
          ]},
        { id:"c_igk", type:"choice", critical:true,
          text:"Есть ли гарантия покупателя об отсутствии ИГК и ГОЗ?",
          hint:"Аналог п. 2.5. Без этого — риск блокировки счёта и казначейского сопровождения.",
          warn:"Платёж с ИГК = блокировка счёта и казначейское сопровождение. Это остановит всю работу.",
          options:[
            { v:"yes", l:"Да, гарантия прописана" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Есть упоминание, но без гарантии" }
          ]},
        { id:"c_goz", type:"choice", critical:true,
          text:"Есть ли пункт: Поставщик не участвует в ГОЗ и казначейском сопровождении?",
          hint:"Аналог п. 2.4 и 2.6. Спасает от принудительного сопровождения.",
          warn:"Без прямой оговорки Поставщик будет втянут в ГОЗ-процедуры: спецсчета, отчётность, нормативы рентабельности.",
          options:[
            { v:"yes", l:"Да, прописан" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Есть, но неполный" }
          ]},
        { id:"c_digital", type:"choice", critical:true,
          text:"Есть ли пункт: цифровой рубль — только по письменному соглашению Сторон?",
          hint:"Аналог п. 2.7. Без этого покупатель может оплатить в цифровых рублях.",
          warn:"Покупатель оплатит цифровым рублём, и вы не сможете отказаться. Деньги придут с условиями.",
          options:[
            { v:"yes", l:"Да, только по письменному соглашению" },
            { v:"no", l:"Нет ограничения" },
            { v:"dont", l:"Есть, но неполный" }
          ]},
        { id:"c_smart", type:"choice", critical:true,
          text:"Есть ли запрет на смарт-контракт цифрового рубля с отложенным переходом права собственности?",
          hint:"Аналог п. 2.8. Иначе покупатель привяжет оплату к приёмке.",
          warn:"Смарт-контракт отложит переход денег до приёмки. Вы отгрузите товар, но не получите оплату.",
          options:[
            { v:"yes", l:"Да, запрет прописан" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Не проработано" }
          ]},
        { id:"c_invoice_offer", type:"choice", critical:true,
          text:"Есть ли пункт: счёт без подписанного договора не является офертой?",
          hint:"ЭТО ПРОБЕЛ в вашем текущем договоре. Обязательно добавить (п. 2.9).",
          warn:"ПРОБЕЛ в договоре. Счёт без договора = покупатель оплатит и будет требовать поставки. Добавьте п. 2.9.",
          options:[
            { v:"yes", l:"Да, пункт добавлен" },
            { v:"no", l:"Нет — ЭТО ПРОБЕЛ, добавить п. 2.9" },
            { v:"dont", l:"Есть похожий, но неполный" }
          ]},
        { id:"c_start", type:"choice", critical:true,
          text:"Есть ли пункт: срок начала изготовления = 100% оплата?",
          hint:"Аналог п. 3.1. Без этого менеджер может начать производство без денег.",
          warn:"Менеджер запустит производство без денег. Оплата может не прийти, а сырьё уже заказано.",
          options:[
            { v:"yes", l:"Да, срок = оплата" },
            { v:"no", l:"Нет, срок фиксированный или от подписания" },
            { v:"dont", l:"Смешанно" }
          ]},
        { id:"c_tu", type:"choice", critical:true,
          text:"Есть ли пункт: ТУ — единственный документ качества, ГОСТ не применяется?",
          hint:"Аналог п. 5.1. Ключевая защита от претензий по ГОСТ.",
          warn:"Покупатель предъявит претензии по ГОСТ, которого вы не обязаны соблюдать. Рекламации вырастут.",
          options:[
            { v:"yes", l:"Да, ТУ как единственный документ" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"ТУ есть, но про ГОСТ не сказано" }
          ]},
        { id:"c_10days", type:"choice", critical:true,
          text:"Есть ли срок рекламации 10 рабочих дней?",
          hint:"Аналог п. 5.3. Молчание = приёмка.",
          warn:"Покупатель вернёт товар через месяц «после размышлений». Приёмка станет бесконечной.",
          options:[
            { v:"yes", l:"Да, 10 рабочих дней" },
            { v:"no", l:"Нет, срок дольше или не установлен" },
            { v:"dont", l:"Есть, но другой срок" }
          ]},
        { id:"c_passport", type:"choice", critical:true,
          text:"Есть ли пункт: только Паспорт качества формы Поставщика, ГОСТ и сертификаты не предоставляются?",
          hint:"Аналог п. 5.8. Спасает от бесконечных запросов документов.",
          warn:"Покупатель потребует сертификаты, декларации, паспорта ГОСТ. Затянет поставку, создаст основания для отказа.",
          options:[
            { v:"yes", l:"Да, только наш Паспорт" },
            { v:"no", l:"Нет, стандартные документы" },
            { v:"dont", l:"Частично" }
          ]},
        { id:"c_warranty", type:"choice", critical:true,
          text:"Есть ли пункт: гарантийный срок не устанавливается?",
          hint:"Аналог п. 5.12. Гарантия = бесконечные претензии.",
          warn:"Гарантия = бесконечные претензии и замена товара за ваш счёт.",
          options:[
            { v:"yes", l:"Да, гарантия не устанавливается" },
            { v:"no", l:"Нет, гарантия есть" },
            { v:"dont", l:"Не указан" }
          ]},
        { id:"c_limit", type:"choice", critical:true,
          text:"Есть ли лимит совокупных неустоек не более 10%?",
          hint:"Аналог п. 6.4. Без лимита неустойка может обрушить сделку.",
          warn:"Без лимита неустойка может превысить стоимость партии и обрушить сделку.",
          options:[
            { v:"yes", l:"Да, лимит есть" },
            { v:"no", l:"Нет лимита" },
            { v:"dont", l:"Лимит есть, но другой" }
          ]},
        { id:"c_indirect", type:"choice", critical:true,
          text:"Есть ли пункт: упущенная выгода и косвенные убытки не возмещаются?",
          hint:"Аналог п. 6.5. Без этого покупатель может требовать миллионы за простой.",
          warn:"Покупатель потребует упущенную выгоду и убытки третьих лиц. Это миллионы.",
          options:[
            { v:"yes", l:"Да, не возмещаются" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Частично" }
          ]},
        { id:"c_refusal", type:"choice", critical:true,
          text:"Есть ли право одностороннего отказа Поставщика (ст. 450.1, 523 ГК)?",
          hint:"Аналог п. 6.8. Спасает от невыгодной сделки.",
          warn:"Без права отказа Поставщик не сможет выйти из невыгодной сделки.",
          options:[
            { v:"yes", l:"Да, право есть" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Есть, но ограничено" }
          ]},
        { id:"c_annul", type:"choice", critical:true,
          text:"Есть ли пункт об аннулировании Спецификации при неоплате в срок?",
          hint:"ЭТО ПРОБЕЛ в вашем текущем договоре. Добавить п. 6.11.",
          warn:"ПРОБЕЛ в договоре. Нет аннулирования — придётся возвращать предоплату и терять время. Добавьте п. 6.11.",
          options:[
            { v:"yes", l:"Да, пункт добавлен" },
            { v:"no", l:"Нет — ЭТО ПРОБЕЛ, добавить п. 6.11" },
            { v:"dont", l:"Есть 6.7, но без слова аннулирование" }
          ]},
        { id:"c_refund", type:"choice", critical:true,
          text:"Есть ли фиксированный срок возврата предоплаты (10 рабочих дней)?",
          hint:"ПРОБЕЛ: п. 6.9 не устанавливает срок. Добавить конкретику.",
          warn:"ПРОБЕЛ в договоре. Размытый срок = покупатель потребует немедленный возврат, вы не успеете. Добавьте п. 6.11.",
          options:[
            { v:"yes", l:"Да, конкретный срок есть" },
            { v:"no", l:"Нет — ЭТО ПРОБЕЛ, добавить" },
            { v:"dont", l:"Есть, но размытый" }
          ]},
        { id:"c_court", type:"choice", critical:true,
          text:"Подсудность по месту Поставщика?",
          hint:"Аналог п. 7.4 — Арбитражный суд Свердловской области.",
          warn:"Споры будут идти в регионе покупателя. Расходы на юристов и поездки — за ваш счёт.",
          options:[
            { v:"yes", l:"Да, суд по месту Поставщика" },
            { v:"no", l:"Нет, по месту Покупателя" },
            { v:"dont", l:"Нейтральная / по закону" }
          ]},
        { id:"c_force", type:"choice", critical:false,
          text:"Учтён ли форс-мажор с санкциями и запретом вывоза металлопродукции?",
          hint:"Аналог п. 7.9. Важно для 2026 года.",
          warn:"Санкции и ограничения вывоза не учтены. Форс-мажор может быть оспорен.",
          options:[
            { v:"yes", l:"Да, санкции и ограничения вывоза учтены" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Стандартный форс-мажор" }
          ]},
        { id:"c_third", type:"choice", critical:false,
          text:"Есть ли запрет передачи Товара третьим лицам до приёмки?",
          hint:"Аналог п. 5.9.",
          warn:"Покупатель может передать товар третьим лицам до приёмки — претензии станут недоказуемыми.",
          options:[
            { v:"yes", l:"Да, запрет прописан" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Есть, но неполный" }
          ]},
        { id:"c_export", type:"choice", critical:false,
          text:"Есть ли запрет экспорта и штраф за вывоз?",
          hint:"Аналог п. 4.5.",
          warn:"Без штрафа запрет экспорта не работает — покупатель вывезет товар без последствий.",
          options:[
            { v:"yes", l:"Да, запрет и штраф" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Есть запрет без штрафа" }
          ]},
        { id:"c_accept", type:"choice", critical:false,
          text:"Порядок приёмки — на складе Поставщика?",
          hint:"Аналог п. 5.2.",
          warn:"Приёмка у покупателя = вы не контролируете условия. Спорные замеры будут в его пользу.",
          options:[
            { v:"yes", l:"Да, на складе Поставщика" },
            { v:"no", l:"У покупателя" },
            { v:"dont", l:"Смешанный" }
          ]},
        { id:"c_client_said", type:"checklist", critical:false,
          text:"Что клиент говорил или писал? Отметьте, что упоминалось.",
          hint:"Эти параметры часто обсуждаются в переписке, но забываются в договоре и спецификации.",
          items:[
            { id:"cs_class", label:"Класс защиты", placeholder:"Какой именно (ГОСТ, STANAG, иной)" },
            { id:"cs_wear", label:"Износ", placeholder:"Абразивный, ударный, коррозионный" },
            { id:"cs_frag", label:"Защита от осколков", placeholder:"Требования, класс, условия" },
            { id:"cs_weld", label:"Свариваемость", placeholder:"Высокая, ограниченная, не требуется" },
            { id:"cs_flat", label:"Плоскостность", placeholder:"Допуск, мм на 1 м" },
            { id:"cs_tol", label:"Допуски", placeholder:"По толщине, габаритам, массе" },
            { id:"cs_cold", label:"Хладостойкость", placeholder:"Температура эксплуатации, °C" },
            { id:"cs_heat", label:"Жаростойкость", placeholder:"Температура эксплуатации, °C" },
            { id:"cs_draw", label:"Чертежи", placeholder:"Есть, нет, будут позже" },
            { id:"cs_fix", label:"Тип крепления", placeholder:"Болты, сварка, заклёпки, фланцы" },
            { id:"cs_pack", label:"Упаковка", placeholder:"Требования, тара, маркировка" }
          ]},
        { id:"c_notes", type:"textarea", critical:false,
          text:"Прочие важные условия и сомнения",
          hint:"Всё, что не вошло в чек-лист выше: особые требования клиента, странности в переписке, дополнительные условия." }
      ]
    },
    {
      title:"Щит от менеджера — производство, сроки, документы",
      weight:40,
      desc:"Проверка реалистичности сделки до отправки документов. Цель — не дать менеджеру обещать то, что производство не выполнит.",
      questions:[
        { id:"m_promise", type:"choice", critical:true,
          text:"Срок, который обещал менеджер покупателю, реалистичен?",
          hint:"Реальная прокатка нового сырья — 90 рабочих дней. Обещание 25 дней — красный флаг.",
          warn:"Менеджер, обещанные 25 дней нереальны. Реальная прокатка — 90 рабочих дней. Срыв поставки = неустойка и потеря клиента.",
          options:[
            { v:"yes", l:"Да, соответствует производству" },
            { v:"no", l:"Нет, обещал нереалистично" },
            { v:"dont", l:"Ещё не называл" }
          ]},
        { id:"m_prod_ok", type:"choice", critical:true,
          text:"Срок согласован с начальником производства письменно?",
          hint:"Менеджер обещает — производство выполняет.",
          warn:"Менеджер, срок не согласован с производством. Ты обещаешь то, что не обеспечено.",
          options:[
            { v:"yes", l:"Да, есть письменное согласование" },
            { v:"no", l:"Нет, срок назвал только менеджер" },
            { v:"dont", l:"Устно" }
          ]},
        { id:"m_stock", type:"choice", critical:true,
          text:"Сырьё в наличии и зарезервировано?",
          hint:"Нет сырья — нечего закаливать.",
          warn:"Нет сырья — нечего закаливать. Сделка сорвётся, аванс придётся возвращать.",
          options:[
            { v:"yes", l:"Да, в наличии и зарезервировано" },
            { v:"no", l:"Нет, нужно заказывать у завода" },
            { v:"dont", l:"Частично" }
          ]},
        { id:"m_guarantee", type:"choice", critical:true,
          text:"Есть ли письменная гарантия завода о резервировании?",
          hint:"Слова менеджера без документа от завода — не гарантия.",
          warn:"Слова менеджера без документа от завода. Завод не зарезервирует — сырьё уйдёт другому покупателю.",
          options:[
            { v:"yes", l:"Да, письменная гарантия есть" },
            { v:"no", l:"Нет, только устные заверения" },
            { v:"dont", l:"Есть предварительная заявка" }
          ]},
        { id:"m_positions", type:"choice", critical:true,
          text:"Все позиции (50/25/16/10/6 мм) обеспечены сырьём?",
          hint:"Проверьте по каждой позиции, а не «в целом».",
          warn:"Не по всем позициям есть сырьё. Часть заказа повиснет, покупатель подаст рекламацию.",
          options:[
            { v:"yes", l:"Все закрыты" },
            { v:"no", l:"Не все" },
            { v:"dont", l:"Не проверял по позициям" }
          ]},
        { id:"m_send", type:"choice", critical:true,
          text:"Что именно отправляем покупателю прямо сейчас?",
          hint:"Счёт без подписанного договора = обязательство без защиты.",
          warn:"СТОП. Счёт и спецификация без подписанного договора = обязательство без защиты. Менеджер, сначала договор.",
          options:[
            { v:"yes", l:"Только договор на подпись" },
            { v:"no", l:"Договор + счёт + спецификация (после подписания)" },
            { v:"dont", l:"Счёт и спецификация БЕЗ подписанного договора — СТОП" }
          ]},
        { id:"m_digital_consent", type:"choice", critical:true,
          text:"Есть ли письменное согласие покупателя на цифровой рубль (если он предлагает)?",
          hint:"Без письменного согласия оплата цифровым рублём недопустима.",
          warn:"Без письменного согласия оплата цифровым рублём недопустима. Платёж зависнет.",
          options:[
            { v:"yes", l:"Согласия нет, оплата обычная" },
            { v:"no", l:"Есть согласие, но не письменное" },
            { v:"dont", l:"Не обсуждали" }
          ]},
        { id:"m_marka", type:"choice", critical:false,
          text:"Марка стали и класс защиты указаны в Спецификации?",
          hint:"Без марки — риск подмены.",
          warn:"Без марки стали — риск подмены материала. Покупатель предъявит претензию.",
          options:[
            { v:"yes", l:"Да, точно указаны" },
            { v:"no", l:"Нет, только размеры" },
            { v:"dont", l:"Варианты" }
          ]},
        { id:"m_reserve", type:"choice", critical:false,
          text:"Есть ли резервный поставщик сырья?",
          warn:"Один завод = один риск. Если он сорвёт поставку, заменить будет некем.",
          options:[
            { v:"yes", l:"Да, есть альтернатива" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Один завод, давно" }
          ]},
        { id:"m_responsibility", type:"choice", critical:false,
          text:"Есть ли у менеджера ответственность за нереалистичные обещания?",
          hint:"Внутренний регламент — если обещал невыполнимое, что происходит?",
          warn:"Без внутреннего регламента менеджер снова пообещает невыполнимое. Установите правила.",
          options:[
            { v:"yes", l:"Да, регламент и последствия" },
            { v:"no", l:"Нет" },
            { v:"dont", l:"Устно" }
          ]},
        { id:"m_notes", type:"textarea", critical:false,
          text:"Дополнительные сомнения по производству?" }
      ]
    }
  ];

  // ============================================================
  // ДВИЖОК
  // ============================================================
  var app = document.getElementById("spApp");
  var introScreen = app.querySelector("#spIntro");
  var formScreen  = app.querySelector("#spForm");
  var startBtn = app.querySelector("#spStart");
  var form = app.querySelector("#spFormEl");
  var blocksContainer = app.querySelector("#spBlocks");
  var filledEl = app.querySelector("#spFilled");
  var totalEl = app.querySelector("#spTotal");
  var progressFill = app.querySelector("#spProgress");
  var timeEl = app.querySelector("#spTime");
  var draftNote = app.querySelector("#spDraftNote");
  var flagBuyer = app.querySelector("#spFlagBuyer");
  var flagBuyerVal = app.querySelector("#spFlagBuyerVal");
  var flagManager = app.querySelector("#spFlagManager");
  var flagManagerVal = app.querySelector("#spFlagManagerVal");
  var submitBtn = app.querySelector("#spSubmit");
  var downloadBtnEl = app.querySelector("#spDownload");
  var resetBtn = app.querySelector("#spReset");
  var consent = app.querySelector("#spConsent");
  var fillerEl = app.querySelector("#spFiller");
  var seniorEl = app.querySelector("#spSenior");
  var fillerErr = app.querySelector("#spFillerErr");
  var seniorErr = app.querySelector("#spSeniorErr");
  var clientEl = app.querySelector("#spClient");
  var dealEl = app.querySelector("#spDeal");
  var managerEl = app.querySelector("#spManager");
  var hpField = app.querySelector("#spHp");
  var reportBox = app.querySelector("#spReport");
  var yearEl = app.querySelector("#spYear");

  yearEl.textContent = new Date().getFullYear();

  var allTextareas = [];
  var allChoices = [];
  var draftTimer = null;

  function showScreen(el){
    [introScreen, formScreen].forEach(function(s){
      s.classList.toggle("active", s === el);
    });
    window.scrollTo({ top:0, behavior:"smooth" });
  }

  function buildForm(){
    blocksContainer.innerHTML = "";
    var total = 0;

    BLOCKS.forEach(function(block, bi){
      var sec = document.createElement("section");
      sec.className = "block";
      sec.setAttribute("data-block", bi);
      sec.setAttribute("data-weight", block.weight);

      var html = '&lt;div class="block-head"&gt;&lt;h2&gt;' + block.title + '&lt;/h2&gt;'
               + '&lt;span class="weight"&gt;Вес: ' + block.weight + '%&lt;/span&gt;&lt;/div&gt;'
               + '&lt;p class="block-desc"&gt;' + block.desc + '&lt;/p&gt;';

      block.questions.forEach(function(q, qi){
        var qnum = (bi+1) + "." + (qi+1);
        total++;
        var critBadge = q.critical ? '&lt;span class="q-critical"&gt;КРИТИЧНО&lt;/span&gt;' : '';

        html += '&lt;div class="q" data-qid="' + q.id + '" data-critical="' + (q.critical ? "1" : "0") + '"&gt;';
        html += '&lt;label class="q-label"&gt;&lt;span class="num"&gt;' + qnum + '&lt;/span&gt;'
             +  q.text + critBadge + '&lt;/label&gt;';
        if (q.hint) html += '&lt;div class="q-hint"&gt;' + q.hint + '&lt;/div&gt;';

        if (q.type === "textarea") {
          html += '&lt;textarea data-id="' + q.id + '" placeholder="Опишите факты..."&gt;&lt;/textarea&gt;';
        } else if (q.type === "checklist") {
          html += '&lt;div class="q-checklist" data-cl="' + q.id + '"&gt;';
          q.items.forEach(function(item){
            html += '&lt;div class="q-cl-item" data-clitem="' + item.id + '"&gt;'
                 +  '&lt;label class="q-cl-head"&gt;'
                 +  '&lt;input type="checkbox" data-clcheck="' + item.id + '"&gt;'
                 +  '&lt;span class="box"&gt;&lt;/span&gt;'
                 +  '&lt;span class="lbl"&gt;' + item.label + '&lt;/span&gt;'
                 +  '&lt;/label&gt;'
                 +  '&lt;div class="q-cl-input"&gt;'
                 +  '&lt;input type="text" data-clinput="' + item.id + '" placeholder="' + item.placeholder + '"&gt;'
                 +  '&lt;/div&gt;'
                 +  '&lt;/div&gt;';
          });
          html += '&lt;/div&gt;';
        } else if (q.type === "choice") {
          html += '&lt;div class="q-body"&gt;';
          html += '&lt;div class="q-answers"&gt;';
          q.options.forEach(function(opt){
            html += '&lt;label class="q-answer"&gt;'
                 +  '&lt;input type="radio" name="' + q.id + '" value="' + opt.v + '"&gt;'
                 +  '&lt;span class="box"&gt;&lt;/span&gt;'
                 +  '&lt;span class="lbl"&gt;' + opt.l + '&lt;/span&gt;'
                 +  '&lt;/label&gt;';
          });
          html += '&lt;/div&gt;';
          html += '&lt;div class="q-warning" data-qwarn="' + q.id + '"&gt;&lt;/div&gt;';
          html += '&lt;/div&gt;';
        }
        html += '&lt;/div&gt;';
      });

      sec.innerHTML = html;
      blocksContainer.appendChild(sec);
    });

    allTextareas = Array.prototype.slice.call(blocksContainer.querySelectorAll("textarea[data-id]"));
    allChoices = Array.prototype.slice.call(blocksContainer.querySelectorAll("input[type=radio]"));
    totalEl.textContent = total;

    allTextareas.forEach(function(t){
      t.addEventListener("input", function(){ updateUI(); saveDraft(); });
    });
    allChoices.forEach(function(c){
      c.addEventListener("change", function(){ updateUI(); saveDraft(); });
    });
    var clChecks = blocksContainer.querySelectorAll("[data-clcheck]");
    var clInputs = blocksContainer.querySelectorAll("[data-clinput]");
    clChecks.forEach(function(c){
      c.addEventListener("change", function(){
        var id = c.getAttribute("data-clcheck");
        var wrap = blocksContainer.querySelector('[data-clitem="' + id + '"]');
        if (wrap) wrap.classList.toggle("on", c.checked);
        updateUI(); saveDraft();
      });
    });
    clInputs.forEach(function(inp){
      inp.addEventListener("input", function(){ updateUI(); saveDraft(); });
    });
  }

  function getAnswers(){
    var data = {};
    allTextareas.forEach(function(t){ data[t.getAttribute("data-id")] = t.value; });
    allChoices.forEach(function(c){
      if (c.checked) data[c.name] = c.value;
    });
    var clItems = {};
    var clChecks = blocksContainer.querySelectorAll("[data-clcheck]");
    var clInputs = blocksContainer.querySelectorAll("[data-clinput]");
    clChecks.forEach(function(c){
      var id = c.getAttribute("data-clcheck");
      if (c.checked) clItems[id] = { checked:true, note:"" };
    });
    clInputs.forEach(function(inp){
      var id = inp.getAttribute("data-clinput");
      if (clItems[id]) clItems[id].note = inp.value;
    });
    data.__checklist = clItems;
    return data;
  }

  function countFilled(){
    var count = 0;
    allTextareas.forEach(function(t){ if ((t.value || "").trim()) count++; });
    var groups = {};
    allChoices.forEach(function(c){ if (c.checked) groups[c.name] = true; });
    count += Object.keys(groups).length;
    var clChecks = blocksContainer.querySelectorAll("[data-clcheck]");
    var anyCl = false;
    clChecks.forEach(function(c){ if (c.checked) anyCl = true; });
    if (anyCl) count++;
    return count;
  }

  function computeTotal(){
    var n = 0;
    BLOCKS.forEach(function(b){ b.questions.forEach(function(){ n++; }); });
    return n;
  }

  function scoreAnswer(q, value){
    if (value === undefined || value === null || value === "") return null;
    if (value === "yes") return "g";
    if (value === "partial") return "y";
    if (value === "no") return q.critical ? "r" : "y";
    if (value === "dont") return q.critical ? "r" : "y";
    return "y";
  }

  function evaluateBlock(bi){
    var answers = getAnswers();
    var block = BLOCKS[bi];
    var counts = { g:0, y:0, r:0 };
    block.questions.forEach(function(q){
      if (q.type !== "choice") return;
      var s = scoreAnswer(q, answers[q.id]);
      if (s === null) return;
      counts[s]++;
    });
    var status;
    if (counts.r &gt; 0) status = "r";
    else if (counts.y &gt; 0) status = "y";
    else if (counts.g &gt; 0) status = "g";
    else status = null;
    return { status: status, counts: counts };
  }

  function applyFlag(cardEl, valEl, status, ready){
    cardEl.classList.remove("g","y","r");
    if (!ready || !status) { valEl.textContent = "— не проверено"; return; }
    if (status === "g") { cardEl.classList.add("g"); valEl.textContent = "Защита есть"; }
    else if (status === "y") { cardEl.classList.add("y"); valEl.textContent = "Есть пробелы"; }
    else if (status === "r") { cardEl.classList.add("r"); valEl.textContent = "КРИТИЧНО: не защищено"; }
  }

  function updateWarnings(){
    var answers = getAnswers();
    BLOCKS.forEach(function(block){
      block.questions.forEach(function(q){
        if (q.type !== "choice") return;
        var wrap = blocksContainer.querySelector('[data-qwarn="' + q.id + '"]');
        if (!wrap) return;
        var a = answers[q.id];
        var s = scoreAnswer(q, a);

        if (s === null || !q.warn) {
          wrap.classList.remove("visible", "y");
          wrap.innerHTML = "";
          return;
        }

        if (s === "r") {
          wrap.classList.remove("y");
          wrap.innerHTML = '&lt;span class="wicon"&gt;⚠&lt;/span&gt;' + q.warn;
          wrap.classList.add("visible");
        } else if (s === "y") {
          wrap.classList.add("y");
          wrap.innerHTML = '&lt;span class="wicon"&gt;⚠&lt;/span&gt;' + q.warn;
          wrap.classList.add("visible");
        } else {
          wrap.classList.remove("visible", "y");
          wrap.innerHTML = "";
        }
      });
    });
  }

  function updateUI(){
    var filled = countFilled();
    var total = computeTotal();
    filledEl.textContent = filled;
    progressFill.style.width = ((filled / total) * 100) + "%";

    var remaining = Math.max(0, total - filled);
    var minutesLeft = Math.ceil(remaining * 0.4);
    if (minutesLeft &lt;= 0) timeEl.textContent = "Почти готово";
    else if (minutesLeft === 1) timeEl.textContent = "Осталась примерно 1 минута";
    else if (minutesLeft &lt; 5) timeEl.textContent = "Осталось примерно " + minutesLeft + " минуты";
    else timeEl.textContent = "Осталось примерно " + minutesLeft + " минут";

    var ready = filled &gt;= 8;
    var b1 = evaluateBlock(0);
    var b2 = evaluateBlock(1);
    applyFlag(flagBuyer, flagBuyerVal, b1.status, ready);
    applyFlag(flagManager, flagManagerVal, b2.status, ready);

    updateWarnings();

    var fillerOk = fillerEl.value.trim().length &gt; 0;
    var seniorOk = seniorEl.value.trim().length &gt; 0;
    fillerErr.style.display = fillerOk ? "none" : "block";
    seniorErr.style.display = seniorOk ? "none" : "block";

    var contactOk = clientEl.value.trim().length &gt; 0
                 &amp;&amp; dealEl.value.trim().length &gt; 0
                 &amp;&amp; managerEl.value.trim().length &gt; 0;

    submitBtn.disabled = !(consent.checked &amp;&amp; contactOk &amp;&amp; fillerOk &amp;&amp; seniorOk &amp;&amp; filled &gt;= 8);
    downloadBtnEl.disabled = !(fillerOk &amp;&amp; seniorOk &amp;&amp; filled &gt;= 8);

    if (!fillerOk || !seniorOk) {
      submitBtn.className = "blocked";
      submitBtn.textContent = "СТОП: не заполнены ответственные";
    } else if (b1.status === "r" || b2.status === "r") {
      submitBtn.className = "blocked";
      submitBtn.textContent = "СТОП: красные флаги. Отправлять нельзя";
    } else if (ready &amp;&amp; filled &gt;= 8) {
      submitBtn.className = "primary";
      submitBtn.textContent = "Проверить сделку";
    }
  }

  function saveDraft(){
    try {
      var data = {
        answers: getAnswers(),
        filler: fillerEl.value,
        senior: seniorEl.value,
        client: clientEl.value,
        deal: dealEl.value,
        manager: managerEl.value
      };
      localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
      showDraftNote();
    } catch(e){}
  }

  function loadDraft(){
    try {
      var raw = localStorage.getItem(STORAGE_KEY);
      if (!raw) return;
      var data = JSON.parse(raw);
      if (data.answers) {
        allTextareas.forEach(function(t){
          var k = t.getAttribute("data-id");
          if (data.answers[k]) t.value = data.answers[k];
        });
        allChoices.forEach(function(c){
          if (data.answers[c.name] === c.value) c.checked = true;
        });
        if (data.answers.__checklist) {
          Object.keys(data.answers.__checklist).forEach(function(k){
            var item = data.answers.__checklist[k];
            var check = blocksContainer.querySelector('[data-clcheck="' + k + '"]');
            var input = blocksContainer.querySelector('[data-clinput="' + k + '"]');
            var wrap = blocksContainer.querySelector('[data-clitem="' + k + '"]');
            if (check) check.checked = true;
            if (wrap) wrap.classList.add("on");
            if (input &amp;&amp; item.note) input.value = item.note;
          });
        }
      }
      if (data.filler) fillerEl.value = data.filler;
      if (data.senior) seniorEl.value = data.senior;
      if (data.client) clientEl.value = data.client;
      if (data.deal) dealEl.value = data.deal;
      if (data.manager) managerEl.value = data.manager;
      showDraftNote("Черновик восстановлен");
    } catch(e){}
  }

  function showDraftNote(text){
    if (!draftNote) return;
    if (text) draftNote.textContent = text;
    draftNote.classList.remove("hidden");
    if (draftTimer) clearTimeout(draftTimer);
    draftTimer = setTimeout(function(){ draftNote.classList.add("hidden"); }, 2500);
  }

  function getChecklistLines(){
    var items = getAnswers().__checklist || {};
    var lines = [];
    Object.keys(items).forEach(function(k){
      var label = k;
      BLOCKS.forEach(function(block){
        block.questions.forEach(function(q){
          if (q.type === "checklist") {
            q.items.forEach(function(it){
              if (it.id === k) label = it.label;
            });
          }
        });
      });
      var note = items[k].note ? " — " + items[k].note : "";
      lines.push(label + note);
    });
    return lines;
  }

  function collectFlags(){
    var answers = getAnswers();
    var red = [];
    var yellow = [];
    var green = [];

    BLOCKS.forEach(function(block, bi){
      block.questions.forEach(function(q, qi){
        if (q.type !== "choice") return;
        var qnum = (bi+1) + "." + (qi+1);
        var a = answers[q.id];
        var s = scoreAnswer(q, a);

        var optLabel = "— не проверено —";
        if (a !== undefined) {
          var opt = q.options.filter(function(o){ return o.v === a; })[0];
          if (opt) optLabel = opt.l;
        }

        var line = { num: qnum, text: q.text, answer: optLabel, warn: q.warn || "" };

        if (s === "r") red.push(line);
        else if (s === "y") yellow.push(line);
        else if (s === "g") green.push(line);
      });
    });

    return { red: red, yellow: yellow, green: green };
  }

  // ============================================================
  // HTML-ПРОТОКОЛ (ЦВЕТНОЙ)
  // ============================================================
  function buildHtmlReport(){
    var flags = collectFlags();
    var b1 = evaluateBlock(0);
    var b2 = evaluateBlock(1);
    var now = new Date();

    var verdict, verdictClass, verdictColor;
    if (flags.red.length &gt; 0) {
      verdict = "СТОП. Сделка не защищена. Отправлять нельзя.";
      verdictClass = "stop"; verdictColor = "#f85149";
    } else if (flags.yellow.length &gt; 0) {
      verdict = "ЖДАТЬ. Есть пробелы. Устранить до отправки документов.";
      verdictClass = "wait"; verdictColor = "#d29922";
    } else {
      verdict = "МОЖНО ОТПРАВЛЯТЬ. Все критичные пункты закрыты.";
      verdictClass = "go"; verdictColor = "#3fb950";
    }

    function li(items, color, icon){
      if (!items.length) return "";
      var html = "";
      items.forEach(function(r){
        html += '&lt;li style="margin-bottom:10px;"&gt;'
             +  '&lt;b style="color:' + color + ';"&gt;' + icon + '&lt;/b&gt; '
             +  '&lt;span style="font-weight:600;"&gt;' + r.num + '&lt;/span&gt; ' + r.text
             +  '&lt;br&gt;&lt;span style="color:#8b949e;font-size:12px;"&gt;Ответ: ' + r.answer + '&lt;/span&gt;';
        if (r.warn) html += '&lt;br&gt;&lt;span style="color:' + color + ';font-size:12px;font-style:italic;"&gt;⚠ ' + r.warn + '&lt;/span&gt;';
        html += '&lt;/li&gt;';
      });
      return html;
    }

    var clLines = getChecklistLines();

    var html = '&lt;!DOCTYPE html&gt;&lt;html lang="ru"&gt;&lt;head&gt;&lt;meta charset="UTF-8"&gt;'
      + '&lt;title&gt;Щит поставщика — протокол&lt;/title&gt;'
      + '&lt;style&gt;'
      + 'body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;'
      + 'background:#0d1117;color:#e6edf3;padding:32px 20px;line-height:1.55;font-size:14px;max-width:820px;margin:0 auto;}'
      + 'h1{font-size:22px;color:#c9a876;margin-bottom:8px;}'
      + 'h2{font-size:14px;color:#8b949e;text-transform:uppercase;letter-spacing:.08em;'
      + 'margin:26px 0 10px;border-bottom:1px solid #2a323c;padding-bottom:6px;}'
      + '.verdict{padding:16px 20px;border-radius:10px;font-weight:700;font-size:15px;'
      + 'margin:20px 0;text-transform:uppercase;letter-spacing:.05em;}'
      + '.meta{color:#8b949e;font-size:13px;}'
      + '.meta b{color:#e6edf3;}'
      + 'ul{list-style:none;padding:0;margin:0;}'
      + 'li{padding:8px 0;border-bottom:1px solid #1c232c;}'
      + '.discl{font-size:12px;color:#8b949e;background:#1c232c;'
      + 'border-left:3px solid #4493f8;padding:12px 16px;border-radius:6px;margin-top:24px;}'
      + '@media print{body{background:#fff;color:#000;}'
      + '.discl{background:#f0f0f0;color:#333;}'
      + 'h1{color:#000;}h2{color:#333;}}'
      + '&lt;/style&gt;&lt;/head&gt;&lt;body&gt;';

    html += '&lt;h1&gt;Щит поставщика&lt;/h1&gt;';
    html += '&lt;p class="meta"&gt;Протокол проверки сделки от &lt;b&gt;' + now.toLocaleString("ru-RU") + '&lt;/b&gt;&lt;/p&gt;';
    html += '&lt;p class="meta"&gt;Заполнил: &lt;b&gt;' + (fillerEl.value.trim() || "—") + '&lt;/b&gt;';
    html += ' · Старший менеджер: &lt;b&gt;' + (seniorEl.value.trim() || "—") + '&lt;/b&gt;&lt;/p&gt;';
    html += '&lt;p class="meta"&gt;Клиент: &lt;b&gt;' + (clientEl.value.trim() || "—") + '&lt;/b&gt;';
    html += ' · Сделка: &lt;b&gt;' + (dealEl.value.trim() || "—") + '&lt;/b&gt;';
    html += ' · Менеджер: &lt;b&gt;' + (managerEl.value.trim() || "—") + '&lt;/b&gt;&lt;/p&gt;';

    html += '&lt;div class="verdict" style="background:rgba('
      + (verdictClass === "stop" ? "248,81,73" : verdictClass === "wait" ? "210,153,34" : "63,185,80")
      + ',.1);color:' + verdictColor + ';border:1px solid ' + verdictColor + ';"&gt;'
      + verdict + '&lt;/div&gt;';

    html += '&lt;p class="meta"&gt;Щит от покупателя: &lt;b&gt;' + (b1.status === "r" ? "КРИТИЧНО" : b1.status === "y" ? "Есть пробелы" : b1.status === "g" ? "Защита есть" : "—") + '&lt;/b&gt;';
    html += ' · Щит от менеджера: &lt;b&gt;' + (b2.status === "r" ? "КРИТИЧНО" : b2.status === "y" ? "Есть пробелы" : b2.status === "g" ? "Защита есть" : "—") + '&lt;/b&gt;&lt;/p&gt;';

    if (flags.red.length) {
      html += '&lt;h2 style="color:#f85149;"&gt;Красные флаги — стоп (' + flags.red.length + ')&lt;/h2&gt;';
      html += '&lt;ul&gt;' + li(flags.red, "#f85149", "✕") + '&lt;/ul&gt;';
    }
    if (flags.yellow.length) {
      html += '&lt;h2 style="color:#d29922;"&gt;Жёлтые флаги — устранить (' + flags.yellow.length + ')&lt;/h2&gt;';
      html += '&lt;ul&gt;' + li(flags.yellow, "#d29922", "!") + '&lt;/ul&gt;';
    }
    if (flags.green.length) {
      html += '&lt;h2 style="color:#3fb950;"&gt;Закрытые пункты (' + flags.green.length + ')&lt;/h2&gt;';
      html += '&lt;ul&gt;' + li(flags.green, "#3fb950", "✓") + '&lt;/ul&gt;';
    }
    if (clLines.length) {
      html += '&lt;h2 style="color:#4493f8;"&gt;Что клиент говорил или писал (' + clLines.length + ')&lt;/h2&gt;&lt;ul&gt;';
      clLines.forEach(function(l){
        html += '&lt;li&gt;&lt;b style="color:#4493f8;"&gt;✓&lt;/b&gt; ' + l + '&lt;/li&gt;';
      });
      html += '&lt;/ul&gt;';
    }

    html += '&lt;div class="discl"&gt;Документ является структурированной проверкой фактов, предоставленных пользователем. '
      + 'Не является юридической консультацией и не заменяет юридическую экспертизу договора. '
      + 'Ответственность за решения и подписание документов лежит на собственнике / руководителе.&lt;/div&gt;';

    html += '&lt;/body&gt;&lt;/html&gt;';
    return html;
  }

  // ============================================================
  // PDF-ПРОТОКОЛ
  // ============================================================
  function buildPdfReport(){
    var jsPDF = window.jspdf &amp;&amp; window.jspdf.jsPDF;
    if (!jsPDF) {
      alert("Библиотека PDF не загрузилась. Проверьте интернет и попробуйте снова.");
      return;
    }

    var flags = collectFlags();
    var b1 = evaluateBlock(0);
    var b2 = evaluateBlock(1);
    var now = new Date();

    var verdict, verdictColor;
    if (flags.red.length &gt; 0) {
      verdict = "СТОП. Сделка не защищена. Отправлять нельзя.";
      verdictColor = [248,81,73];
    } else if (flags.yellow.length &gt; 0) {
      verdict = "ЖДАТЬ. Есть пробелы. Устранить до отправки.";
      verdictColor = [210,153,34];
    } else {
      verdict = "МОЖНО ОТПРАВЛЯТЬ. Все критичные пункты закрыты.";
      verdictColor = [63,185,80];
    }

    var doc = new jsPDF({ unit:"mm", format:"a4" });
    var W = 210;
    var margin = 20;
    var y = margin;
    var lineHeight = 5;

    try {
      doc.addFileToVFS("Roboto-Regular.ttf", ROBOTO_FONT_BASE64);
      doc.addFont("Roboto-Regular.ttf", "Roboto", "normal");
      doc.setFont("Roboto", "normal");
    } catch(e) {
      console.warn("Не удалось загрузить кириллический шрифт для PDF.");
    }

    function checkPage(needed){
      if (y + needed &gt; 280) {
        doc.addPage();
        y = margin;
        doc.setFont("Roboto", "normal");
      }
    }

    function addLine(text, size, color, bold){
      doc.setFontSize(size || 10);
      doc.setTextColor.apply(doc, color || [230,237,243]);
      doc.setFont("Roboto", "normal");
      var lines = doc.splitTextToSize(text, W - margin * 2);
      lines.forEach(function(line){
        checkPage(lineHeight);
        doc.text(line, margin, y);
        y += lineHeight;
      });
    }

    function addSpacer(h){ y += (h || 3); }

    doc.setFillColor(13, 17, 23);
    doc.rect(0, 0, W, 32, "F");
    doc.setFontSize(18);
    doc.setTextColor(201, 168, 118);
    doc.setFont("Roboto", "normal");
    doc.text("ЩИТ ПОСТАВЩИКА", margin, 16);
    doc.setFontSize(10);
    doc.setTextColor(139, 148, 158);
    doc.text("Протокол проверки сделки", margin, 24);
    y = 42;

    addLine("Заполнил: " + (fillerEl.value.trim() || "—"), 10, [230,237,243]);
    addLine("Старший менеджер: " + (seniorEl.value.trim() || "—"), 10, [230,237,243]);
    addLine("Клиент: " + (clientEl.value.trim() || "—"), 10, [230,237,243]);
    addLine("Сделка: " + (dealEl.value.trim() || "—"), 10, [230,237,243]);
    addLine("Менеджер: " + (managerEl.value.trim() || "—"), 10, [230,237,243]);
    addLine("Дата: " + now.toLocaleString("ru-RU"), 10, [139,148,158]);
    addSpacer(6);

    doc.setFillColor(verdictColor[0], verdictColor[1], verdictColor[2]);
    doc.roundedRect(margin, y, W - margin * 2, 14, 2, 2, "S");
    doc.setFontSize(11);
    doc.setTextColor(verdictColor[0], verdictColor[1], verdictColor[2]);
    doc.text(verdict, margin + 4, y + 9);
    y += 22;

    addLine("Щит от покупателя: " + (b1.status === "r" ? "КРИТИЧНО" : b1.status === "y" ? "Есть пробелы" : b1.status === "g" ? "Защита есть" : "—"), 10, [230,237,243]);
    addLine("Щит от менеджера: " + (b2.status === "r" ? "КРИТИЧНО" : b2.status === "y" ? "Есть пробелы" : b2.status === "g" ? "Защита есть" : "—"), 10, [230,237,243]);
    addSpacer(6);

    if (flags.red.length) {
      addLine("КРАСНЫЕ ФЛАГИ — СТОП (" + flags.red.length + ")", 12, [248,81,73]);
      addSpacer(2);
      flags.red.forEach(function(r){
        checkPage(10);
        addLine("✕ " + r.num + " " + r.text, 10, [230,237,243]);
        addLine("   Ответ: " + r.answer, 9, [139,148,158]);
        if (r.warn) addLine("   ⚠ " + r.warn, 9, [248,81,73]);
        addSpacer(2);
      });
    }

    if (flags.yellow.length) {
      addSpacer(4);
      checkPage(12);
      addLine("ЖЁЛТЫЕ ФЛАГИ — УСТРАНИТЬ (" + flags.yellow.length + ")", 12, [210,153,34]);
      addSpacer(2);
      flags.yellow.forEach(function(r){
        checkPage(10);
        addLine("! " + r.num + " " + r.text, 10, [230,237,243]);
        addLine("   Ответ: " + r.answer, 9, [139,148,158]);
        if (r.warn) addLine("   ⚠ " + r.warn, 9, [210,153,34]);
        addSpacer(2);
      });
    }

    if (flags.green.length) {
      addSpacer(4);
      checkPage(12);
      addLine("ЗАКРЫТЫЕ ПУНКТЫ (" + flags.green.length + ")", 12, [63,185,80]);
      addSpacer(2);
      flags.green.forEach(function(r){
        checkPage(8);
        addLine("✓ " + r.num + " " + r.text, 10, [230,237,243]);
        addSpacer(1);
      });
    }

    var clLines = getChecklistLines();
    if (clLines.length) {
      addSpacer(4);
      checkPage(12);
      addLine("ЧТО КЛИЕНТ ГОВОРИЛ ИЛИ ПИСАЛ (" + clLines.length + ")", 12, [68,147,248]);
      addSpacer(2);
      clLines.forEach(function(l){
        checkPage(8);
        addLine("✓ " + l, 10, [230,237,243]);
        addSpacer(1);
      });
    }

    addSpacer(8);
    checkPage(30);
    doc.setDrawColor(201, 168, 118);
    doc.line(margin, y, W - margin, y);
    y += 6;
    addLine("ДИСКЛЕЙМЕР", 9, [139,148,158]);
    addLine("Документ является структурированной проверкой фактов, предоставленных пользователем. " +
      "Не является юридической консультацией и не заменяет юридическую экспертизу договора. " +
      "Ответственность за решения и подписание документов лежит на собственнике / руководителе.", 9, [139,148,158]);
    addSpacer(4);
    addLine("Связаться: " + RECIPIENT_EMAIL, 9, [201, 168, 118]);

    var safe = (dealEl.value.trim() || "deal").replace(/[^\wа-яА-Я0-9\-_]+/g, "_").slice(0, 60);
    doc.save("shchit_postavshchika_" + safe + "_" + Date.now() + ".pdf");
  }

  // ============================================================
  // TXT-ПРОТОКОЛ
  // ============================================================
  function buildProtocolText(){
    var answers = getAnswers();
    var flags = collectFlags();
    var b1 = evaluateBlock(0);
    var b2 = evaluateBlock(1);
    var now = new Date();

    var L = [];
    L.push("ЩИТ ПОСТАВЩИКА");
    L.push("Протокол проверки сделки");
    L.push("================================");
    L.push("Дата: " + now.toLocaleString("ru-RU"));
    L.push("Заполнил: " + fillerEl.value.trim());
    L.push("Старший менеджер: " + seniorEl.value.trim());
    L.push("Клиент: " + clientEl.value.trim());
    L.push("Сделка: " + dealEl.value.trim());
    L.push("Менеджер: " + managerEl.value.trim());
    L.push("");
    L.push("Щит от покупателя: " + (b1.status === "r" ? "КРИТИЧНО" : b1.status === "y" ? "Пробелы" : b1.status === "g" ? "Защита есть" : "—"));
    L.push("Щит от менеджера: " + (b2.status === "r" ? "КРИТИЧНО" : b2.status === "y" ? "Пробелы" : b2.status === "g" ? "Защита есть" : "—"));
    L.push("");

    var verdict = flags.red.length &gt; 0 ? "СТОП — отправлять нельзя"
                : flags.yellow.length &gt; 0 ? "ЖДАТЬ — устранить пробелы"
                : "МОЖНО ОТПРАВЛЯТЬ";
    L.push("РЕШЕНИЕ: " + verdict);
    L.push("");
    L.push("================================");

    BLOCKS.forEach(function(block, bi){
      L.push("");
      L.push(block.title.toUpperCase());
      L.push("---------------------------------");
      block.questions.forEach(function(q, qi){
        if (q.type === "checklist") return;
        var qnum = (bi+1) + "." + (qi+1);
        var a = answers[q.id];
        var out;
        if (q.type === "choice") {
          if (a === undefined) out = "— не проверено —";
          else {
            var opt = q.options.filter(function(o){ return o.v === a; })[0];
            out = opt ? opt.l : a;
          }
        } else {
          out = (a || "").trim() || "— не заполнено —";
        }
        L.push("");
        L.push(qnum + " " + q.text + (q.critical ? " [КРИТИЧНО]" : ""));
        L.push("Ответ: " + out);
      });
    });

    L.push("");
    L.push("================================");
    L.push("КРАСНЫЕ ФЛАГИ (" + flags.red.length + ")");
    flags.red.forEach(function(r){
      L.push("  • " + r.num + " " + r.text + " → " + r.answer);
      if (r.warn) L.push("    ⚠ " + r.warn);
    });
    L.push("");
    L.push("ЖЁЛТЫЕ ФЛАГИ (" + flags.yellow.length + ")");
    flags.yellow.forEach(function(r){
      L.push("  • " + r.num + " " + r.text + " → " + r.answer);
      if (r.warn) L.push("    ⚠ " + r.warn);
    });
    L.push("");
    L.push("ЗАКРЫТЫЕ ПУНКТЫ (" + flags.green.length + ")");
    flags.green.forEach(function(r){ L.push("  • " + r.num + " " + r.text); });

    var clLines = getChecklistLines();
    if (clLines.length) {
      L.push("");
      L.push("ЧТО КЛИЕНТ ГОВОРИЛ ИЛИ ПИСАЛ (" + clLines.length + ")");
      clLines.forEach(function(l){ L.push("  • " + l); });
    }

    L.push("");
    L.push("================================");
    L.push("ДИСКЛЕЙМЕР");
    L.push("Документ является структурированной проверкой фактов, предоставленных");
    L.push("пользователем. Не является юридической консультацией и не заменяет");
    L.push("юридическую экспертизу договора. Ответственность за решения и подписание");
    L.push("документов лежит на собственнике / руководителе.");
    L.push("");
    L.push("Связаться: " + RECIPIENT_EMAIL);
    return L.join("\n");
  }

  function downloadFile(name, text, mime){
    var blob = new Blob([text], { type: mime || "text/plain;charset=utf-8" });
    var url = URL.createObjectURL(blob);
    var a = document.createElement("a");
    a.href = url; a.download = name;
    document.body.appendChild(a); a.click(); document.body.removeChild(a);
    setTimeout(function(){ URL.revokeObjectURL(url); }, 2000);
  }

  function renderReport(){
    var flags = collectFlags();
    var b1 = evaluateBlock(0);
    var b2 = evaluateBlock(1);
    var verdict, verdictClass;

    if (flags.red.length &gt; 0) {
      verdict = "СТОП. Сделку отправлять нельзя, пока не закрыты красные флаги.";
      verdictClass = "stop";
    } else if (flags.yellow.length &gt; 0) {
      verdict = "ЖДАТЬ. Есть пробелы. Устранить до отправки документов.";
      verdictClass = "wait";
    } else {
      verdict = "МОЖНО ОТПРАВЛЯТЬ. Все критичные пункты закрыты.";
      verdictClass = "go";
    }

    var html = '&lt;h2&gt;Протокол проверки сделки&lt;/h2&gt;';
    html += '&lt;div class="verdict ' + verdictClass + '"&gt;' + verdict + '&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Заполнил&lt;/span&gt;&lt;strong&gt;' + (fillerEl.value.trim() || "—") + '&lt;/strong&gt;&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Старший менеджер&lt;/span&gt;&lt;strong&gt;' + (seniorEl.value.trim() || "—") + '&lt;/strong&gt;&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Клиент&lt;/span&gt;&lt;strong&gt;' + (clientEl.value.trim() || "—") + '&lt;/strong&gt;&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Сделка&lt;/span&gt;&lt;strong&gt;' + (dealEl.value.trim() || "—") + '&lt;/strong&gt;&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Менеджер&lt;/span&gt;&lt;strong&gt;' + (managerEl.value.trim() || "—") + '&lt;/strong&gt;&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Щит от покупателя&lt;/span&gt;&lt;strong&gt;'
         + (b1.status === "r" ? "КРИТИЧНО" : b1.status === "y" ? "Есть пробелы" : b1.status === "g" ? "Защита есть" : "—")
         + '&lt;/strong&gt;&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Щит от менеджера&lt;/span&gt;&lt;strong&gt;'
         + (b2.status === "r" ? "КРИТИЧНО" : b2.status === "y" ? "Есть пробелы" : b2.status === "g" ? "Защита есть" : "—")
         + '&lt;/strong&gt;&lt;/div&gt;';

    function li(items, icon){
      var out = "";
      items.forEach(function(r){
        out += '&lt;li&gt;' + icon + ' ' + r.num + ' ' + r.text + ' → ' + r.answer;
        if (r.warn) out += '&lt;span class="warn-note"&gt;⚠ ' + r.warn + '&lt;/span&gt;';
        out += '&lt;/li&gt;';
      });
      return out;
    }

    if (flags.red.length) {
      html += '&lt;h3&gt;Красные флаги — стоп (' + flags.red.length + ')&lt;/h3&gt;&lt;ul class="list red"&gt;'
           +  li(flags.red, "✕") + '&lt;/ul&gt;';
    }
    if (flags.yellow.length) {
      html += '&lt;h3&gt;Жёлтые флаги — устранить (' + flags.yellow.length + ')&lt;/h3&gt;&lt;ul class="list yellow"&gt;'
           +  li(flags.yellow, "!") + '&lt;/ul&gt;';
    }
    if (flags.green.length) {
      html += '&lt;h3&gt;Закрытые пункты (' + flags.green.length + ')&lt;/h3&gt;&lt;ul class="list green"&gt;'
           +  li(flags.green, "✓") + '&lt;/ul&gt;';
    }

    var clLines = getChecklistLines();
    if (clLines.length) {
      html += '&lt;h3&gt;Что клиент говорил или писал (' + clLines.length + ')&lt;/h3&gt;&lt;ul class="list blue"&gt;';
      clLines.forEach(function(l){ html += '&lt;li&gt;✓ ' + l + '&lt;/li&gt;'; });
      html += '&lt;/ul&gt;';
    }

    html += '&lt;div class="discl"&gt;'
         +  'Документ является структурированной проверкой фактов, предоставленных '
         +  'пользователем. Не является юридической консультацией и не заменяет '
         +  'юридическую экспертизу договора. Ответственность за решения и подписание '
         +  'документов лежит на собственнике / руководителе.'
         +  '&lt;/div&gt;';

    reportBox.innerHTML = html;
    reportBox.className = "report" + (verdictClass === "stop" ? " blocked" :
                                       verdictClass === "wait" ? " warn" : "");
    reportBox.style.display = "block";
  }

  function checkBeforeDownload(){
    if (countFilled() &lt; 8) {
      alert("Ответьте хотя бы на 8 вопросов.");
      return false;
    }
    if (!fillerEl.value.trim()) {
      alert("Заполните себя");
      fillerEl.focus();
      return false;
    }
    if (!seniorEl.value.trim()) {
      alert("Заполните вашего старшего менеджера");
      seniorEl.focus();
      return false;
    }
    return true;
  }

  function downloadAll(){
    var safe = (dealEl.value.trim() || "deal").replace(/[^\wа-яА-Я0-9\-_]+/g, "_").slice(0, 60);
    var stamp = Date.now();

    downloadFile("shchit_otchet_" + safe + "_" + stamp + ".html", buildHtmlReport(), "text/html;charset=utf-8");
    setTimeout(function(){
      downloadFile("shchit_protokol_" + safe + "_" + stamp + ".txt", buildProtocolText(), "text/plain;charset=utf-8");
    }, 400);
    setTimeout(function(){
      buildPdfReport();
    }, 800);
  }

  startBtn.addEventListener("click", function(){ showScreen(formScreen); });

  form.addEventListener("submit", function(e){
    e.preventDefault();
    if (hpField.value.trim() !== "") return;
    if (!checkBeforeDownload()) return;

    downloadAll();
    renderReport();
    reportBox.scrollIntoView({ behavior:"smooth", block:"start" });
  });

  downloadBtnEl.addEventListener("click", function(){
    if (!checkBeforeDownload()) return;
    downloadAll();
  });

  resetBtn.addEventListener("click", function(){
    if (!confirm("Очистить все ответы?")) return;
    allTextareas.forEach(function(t){ t.value = ""; });
    allChoices.forEach(function(c){ c.checked = false; });
    var clChecks = blocksContainer.querySelectorAll("[data-clcheck]");
    var clInputs = blocksContainer.querySelectorAll("[data-clinput]");
    clChecks.forEach(function(c){ c.checked = false; });
    clInputs.forEach(function(inp){ inp.value = ""; });
    var clItems = blocksContainer.querySelectorAll("[data-clitem]");
    clItems.forEach(function(it){ it.classList.remove("on"); });
    consent.checked = false;
    fillerEl.value = ""; seniorEl.value = "";
    clientEl.value = ""; dealEl.value = ""; managerEl.value = "";
    try { localStorage.removeItem(STORAGE_KEY); } catch(e){}
    reportBox.style.display = "none";
    updateUI();
  });

  [consent, fillerEl, seniorEl, clientEl, dealEl, managerEl].forEach(function(el){
    el.addEventListener("input", updateUI);
    el.addEventListener("change", updateUI);
  });

  buildForm();
  loadDraft();
  updateUI();
})();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-09-23T03:50:30Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/ef/f66878aa6d11f1abb9f7ceed6face4/-/image%20%284%29.jpg</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
