<?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</id>
  <link href="https://www.pandoraburo.ru/schit-postavschika.xml" rel="self"/>
  <title>Щит поставщика</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;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{color:var(--text) !important;border-color:var(--muted) !important}
  #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 .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 .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 .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 .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="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="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";

  // ============================================================
  // КАТАЛОГ ВОПРОСОВ — ЧЕК-ЛИСТ ПО ДОГОВОРУ
  // ============================================================
  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_notes", type:"textarea", critical:false,
          text:"Что ещё вызывает сомнения в договоре или в позиции покупателя?" }
      ]
    },
    {
      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 resetBtn = app.querySelector("#spReset");
  var consent = app.querySelector("#spConsent");
  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 === "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(); });
    });
  }

  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;
    });
    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;
    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 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; filled &gt;= 8);

    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(),
        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.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 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 };
  }

  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;' + (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;';

    if (flags.red.length &gt; 0) {
      html += '&lt;h3&gt;Красные флаги — стоп (' + flags.red.length + ')&lt;/h3&gt;&lt;ul class="list red"&gt;';
      flags.red.forEach(function(r){
        html += '&lt;li&gt;' + r.num + ' ' + r.text + ' → ' + r.answer;
        if (r.warn) html += '&lt;span class="warn-note"&gt;⚠ ' + r.warn + '&lt;/span&gt;';
        html += '&lt;/li&gt;';
      });
      html += '&lt;/ul&gt;';
    }

    if (flags.yellow.length &gt; 0) {
      html += '&lt;h3&gt;Жёлтые флаги — устранить до отправки (' + flags.yellow.length + ')&lt;/h3&gt;&lt;ul class="list yellow"&gt;';
      flags.yellow.forEach(function(r){
        html += '&lt;li&gt;' + r.num + ' ' + r.text + ' → ' + r.answer;
        if (r.warn) html += '&lt;span class="warn-note"&gt;⚠ ' + r.warn + '&lt;/span&gt;';
        html += '&lt;/li&gt;';
      });
      html += '&lt;/ul&gt;';
    }

    if (flags.green.length &gt; 0) {
      html += '&lt;h3&gt;Закрытые пункты (' + flags.green.length + ')&lt;/h3&gt;&lt;ul class="list green"&gt;';
      flags.green.forEach(function(r){ html += '&lt;li&gt;' + r.num + ' ' + r.text + '&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 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("Клиент: " + 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){
        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); });
    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){
    var blob = new Blob([text], { type:"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);
  }

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

  form.addEventListener("submit", function(e){
    e.preventDefault();
    if (hpField.value.trim() !== "") return;
    if (countFilled() &lt; 8) {
      alert("Пожалуйста, ответьте хотя бы на 8 вопросов.");
      return;
    }

    var safe = (dealEl.value.trim() || "deal").replace(/[^\wа-яА-Я0-9\-_]+/g, "_").slice(0, 60);
    downloadFile("shchit_postavshchika_" + safe + "_" + Date.now() + ".txt", buildProtocolText());
    renderReport();
    reportBox.scrollIntoView({ behavior:"smooth", block:"start" });
  });

  resetBtn.addEventListener("click", function(){
    if (!confirm("Очистить все ответы?")) return;
    allTextareas.forEach(function(t){ t.value = ""; });
    allChoices.forEach(function(c){ c.checked = false; });
    consent.checked = false;
    clientEl.value = ""; dealEl.value = ""; managerEl.value = "";
    try { localStorage.removeItem(STORAGE_KEY); } catch(e){}
    reportBox.style.display = "none";
    updateUI();
  });

  [consent, 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>
