<?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/crm-dlya-bartera-i-postroeniya-ostatkov-i-tcepochek</id>
  <link href="https://www.pandoraburo.ru/crm-dlya-bartera-i-postroeniya-ostatkov-i-tcepochek.xml" rel="self"/>
  <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;Пандора CRM — Управленческая панель&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.googleapis.com" /&gt;
&lt;link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="crossorigin" /&gt;
&lt;link href="https://fonts.googleapis.com/css2?family=Unbounded:wght@600;700;800&amp;amp;family=Inter:wght@400;500;600;700;800&amp;amp;family=JetBrains+Mono:wght@400;600;700&amp;amp;display=swap" rel="stylesheet" /&gt;
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"&gt;&lt;/script&gt;
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"&gt;&lt;/script&gt;
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"&gt;&lt;/script&gt;
&lt;style&gt;
/* ═══════════ ПЕРЕМЕННЫЕ ═══════════ */
#pd-root{--bg:#f2f2f4;--panel:#ffffff;--panel2:#fafafb;--card:#ffffff;--txt:#1a1a1e;--txt-strong:#0d0d11;--dim:#52525a;--muted:#6e6e78;--pink:#c2185b;--green:#2e7d32;--gold:#a36a00;--orange:#d84e00;--violet:#5e35b1;--red:#c62828;--line:#d7d7dd;--line-strong:#b8b8c2;--shadow:0 1px 3px rgba(20,20,30,.08),0 1px 2px rgba(20,20,30,.05);--fd:'Unbounded','Arial Black',sans-serif;--fb:'Inter',system-ui,sans-serif;--fm:'JetBrains Mono',monospace;}
#pd-root *,#pd-root *::before,#pd-root *::after{box-sizing:border-box;margin:0;padding:0}
#pd-root ::selection{background:#c2185b;color:#fff}
#pd-root{font-family:var(--fb);background:var(--bg);color:var(--txt);min-height:100vh;line-height:1.55;-webkit-font-smoothing:antialiased}
#pd-root .sidebar{position:fixed;left:0;top:0;bottom:0;width:288px;z-index:50;background:#fff;border-right:2px solid var(--line-strong);overflow-y:auto;overflow-x:hidden;padding-bottom:30px}
#pd-root .sidebar::-webkit-scrollbar{width:6px}
#pd-root .sidebar::-webkit-scrollbar-thumb{background:#c8c8d2;border-radius:3px}
#pd-root .logo{padding:22px 20px 18px;font-size:1.5rem;font-weight:800;color:var(--txt-strong);font-family:var(--fd);border-bottom:3px solid var(--pink)}
#pd-root .logo .crm{font-size:.8rem;font-weight:700;color:var(--pink);margin-left:6px;letter-spacing:3px}
#pd-root .sync-status{margin:14px 16px;padding:10px 14px;display:flex;align-items:center;gap:10px;font-size:.82rem;font-weight:700;color:var(--green);background:#eef7ee;border:1px solid #bfe0bf;border-radius:10px}
#pd-root .sync-dot{width:9px;height:9px;border-radius:50%;background:var(--green);flex-shrink:0}
#pd-root .nav-section{padding:20px 20px 8px;font-size:.7rem;font-weight:800;letter-spacing:1.5px;text-transform:uppercase}
#pd-root .ns-pink{color:var(--pink)}#pd-root .ns-gold{color:var(--gold)}#pd-root .ns-green{color:var(--green)}
#pd-root .ns-violet{color:var(--violet)}#pd-root .ns-orange{color:var(--orange)}
#pd-root .nav-link{display:block;margin:4px 12px;padding:11px 14px;text-decoration:none;font-size:.92rem;font-weight:600;border-radius:9px;border:1px solid transparent;cursor:pointer;color:#2a2a30;transition:all .18s}
#pd-root .nav-link:hover{background:#f0f0f4;border-color:var(--line);color:var(--txt-strong)}
#pd-root .nav-link.active{background:var(--pink);border-color:var(--pink);color:#fff;font-weight:700}
#pd-root .main-content{margin-left:288px;min-height:100vh;padding:0 26px 60px}
#pd-root .topbar{position:sticky;top:0;z-index:40;display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;padding:16px 4px;margin-bottom:8px;background:var(--bg);border-bottom:2px solid var(--line-strong)}
#pd-root .breadcrumbs{font-size:.95rem;font-weight:800;color:var(--txt-strong)}
#pd-root .user-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
#pd-root .badge-1c{padding:5px 12px;font-size:.72rem;font-weight:800;color:var(--orange);border:2px solid var(--orange);border-radius:20px;background:#fff3ec}
#pd-root #role-switcher{padding:8px 12px;font-size:.85rem;font-weight:600;color:var(--txt);background:#fff;border:2px solid var(--line-strong);border-radius:8px;cursor:pointer}
#pd-root .tc{display:none;background:var(--panel);border:1px solid var(--line-strong);border-radius:14px;padding:28px;margin-bottom:22px;box-shadow:var(--shadow)}
#pd-root .tc.act{display:block}
#pd-root #fc-w h1{margin:0 0 1.4rem;font-size:1.55rem;font-weight:800;color:var(--txt-strong);font-family:var(--fd);padding-bottom:12px;border-bottom:3px solid var(--pink)}
#pd-root .gold{color:var(--gold)}#pd-root .success{color:var(--green)}#pd-root .err{color:var(--red)}#pd-root .ok{color:var(--green)}#pd-root .warn{color:var(--orange)}#pd-root .orange{color:var(--orange)}
#pd-root .btn{padding:.65rem 1.2rem;border:none;border-radius:9px;font-size:.92rem;font-weight:700;color:#fff;cursor:pointer;background:linear-gradient(90deg,var(--orange),var(--pink));font-family:var(--fb);transition:all .2s}
#pd-root .btn:hover{filter:brightness(1.08);transform:translateY(-1px)}
#pd-root .btn-s{padding:.35rem .7rem;font-size:.8rem}
#pd-root .btn-secondary{background:#5a5a66;color:#fff}
#pd-root .btn-green{background:linear-gradient(90deg,#2e7d32,#1b5e20)}
#pd-root .btn-o{background:#fff;color:var(--gold);border:2px solid var(--gold)}
#pd-root .btn-d{background:linear-gradient(90deg,var(--pink),var(--red))}
#pd-root .btn-p{background:linear-gradient(90deg,var(--violet),var(--pink))}
#pd-root .save-ind{font-size:.7rem;color:var(--green);font-weight:700}
#pd-root .stat-card{background:var(--panel);border:1px solid var(--line-strong);border-radius:12px;padding:18px;box-shadow:var(--shadow);border-top:4px solid var(--line-strong)}
#pd-root .stat-card .label{font-size:.72rem;color:var(--muted);font-weight:700;text-transform:uppercase;letter-spacing:.8px;margin-bottom:6px}
#pd-root .stat-card .value{font-family:var(--fd);font-size:1.5rem;font-weight:800;color:var(--txt-strong)}
#pd-root .stat-card.gold{border-top-color:var(--gold)}#pd-root .stat-card.gold .value{color:var(--gold)}
#pd-root .stat-card.green{border-top-color:var(--green)}#pd-root .stat-card.green .value{color:var(--green)}
#pd-root .stat-card.violet{border-top-color:var(--violet)}#pd-root .stat-card.violet .value{color:var(--violet)}
#pd-root .stat-card.pink{border-top-color:var(--pink)}#pd-root .stat-card.pink .value{color:var(--pink)}
#pd-root .stat-card.red{border-top-color:var(--red)}#pd-root .stat-card.red .value{color:var(--red)}
#pd-root .modal-overlay{position:fixed;inset:0;background:rgba(20,20,30,.5);display:none;align-items:center;justify-content:center;z-index:1000;padding:20px}
#pd-root .modal-overlay.active{display:flex}
#pd-root .modal{background:var(--panel);border:1px solid var(--line-strong);border-radius:14px;padding:32px;max-width:560px;width:100%;max-height:90vh;overflow-y:auto;box-shadow:0 10px 40px rgba(20,20,30,.25)}
#pd-root .modal.wide{max-width:720px}
#pd-root .modal h2{font-family:var(--fd);font-size:1.35rem;margin-bottom:24px;color:var(--txt-strong)}
#pd-root .form-row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
#pd-root .form-group{margin-bottom:16px}
#pd-root .form-group label{display:block;margin-bottom:6px;font-weight:700;color:var(--txt);font-size:.85rem}
#pd-root .form-group label .req{color:var(--pink)}
#pd-root .form-group input,#pd-root .form-group select,#pd-root .form-group textarea{width:100%;padding:10px 12px;background:#fff;border:2px solid var(--line-strong);border-radius:8px;color:var(--txt);font-size:.92rem;font-family:var(--fb);outline:none;transition:border-color .2s}
#pd-root .form-group input:focus,#pd-root .form-group select:focus{border-color:var(--violet)}
#pd-root .form-group textarea{resize:vertical;min-height:70px}
#pd-root .modal-actions{display:flex;gap:12px;margin-top:24px;justify-content:flex-end}
#pd-root .toast{position:fixed;bottom:24px;right:24px;background:var(--green);color:#fff;padding:14px 24px;border-radius:10px;font-weight:700;font-size:.9rem;transform:translateY(100px);opacity:0;transition:all .3s;z-index:2000}
#pd-root .toast.show{transform:translateY(0);opacity:1}
#pd-root .toast.error{background:var(--red)}
#pd-root .icon-btn{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line-strong);border-radius:8px;cursor:pointer;font-size:.85rem;background:#fff;color:var(--txt);transition:all .15s}
#pd-root .icon-btn:hover{transform:translateY(-2px)}
#pd-root .icon-btn.edit:hover{background:var(--violet);color:#fff}
#pd-root .icon-btn.del:hover{background:var(--red);color:#fff}
#pd-root .icon-btn.in:hover{background:var(--green);color:#fff}
#pd-root .icon-btn.out:hover{background:var(--orange);color:#fff}
#pd-root .module-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:16px}
#pd-root .module-header h1{margin-bottom:0;border-bottom:none;padding-bottom:0}
#pd-root .header-actions{display:flex;gap:10px;flex-wrap:wrap}
#pd-root .stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:16px;margin-bottom:24px}
#pd-root .type-badge{display:inline-block;padding:3px 10px;border-radius:20px;font-size:.72rem;font-weight:800;font-family:var(--fm);border:1px solid}
#pd-root .type-badge.legal{background:#f0ebfa;color:var(--violet);border-color:#d5c8f2}
#pd-root .type-badge.ip{background:#fdf6e8;color:var(--gold);border-color:#ecd9b0}
#pd-root .type-badge.person{background:#eef7ee;color:var(--green);border-color:#c5e2c5}
#pd-root .cat-badge{display:inline-block;padding:3px 10px;border-radius:20px;font-size:.72rem;font-weight:700;background:#f0ebfa;color:var(--violet);border:1px solid #d5c8f2}
#pd-root .status-badge{display:inline-flex;align-items:center;gap:6px;font-size:.78rem;font-weight:700;white-space:nowrap}
#pd-root .status-badge .dot{width:9px;height:9px;border-radius:50%}
#pd-root .status-badge.active{color:var(--green)}#pd-root .status-badge.active .dot{background:var(--green)}
#pd-root .status-badge.vip{color:var(--gold)}#pd-root .status-badge.vip .dot{background:var(--gold)}
#pd-root .status-badge.inactive{color:var(--muted)}#pd-root .status-badge.inactive .dot{background:var(--muted)}
#pd-root .status-badge.ok{color:var(--green)}#pd-root .status-badge.ok .dot{background:var(--green)}
#pd-root .status-badge.low{color:var(--gold)}#pd-root .status-badge.low .dot{background:var(--gold)}
#pd-root .status-badge.out{color:var(--red)}#pd-root .status-badge.out .dot{background:var(--red)}
#pd-root .dash-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:18px;margin-bottom:20px}
#pd-root .dash-card{background:var(--panel);border-radius:14px;padding:20px;border:1px solid var(--line-strong);box-shadow:var(--shadow);border-top:4px solid var(--line-strong);transition:transform .2s}
#pd-root .dash-card:hover{transform:translateY(-3px)}
#pd-root .dash-card h3{margin:0 0 14px;font-size:.82rem;font-weight:800;letter-spacing:1.2px;text-transform:uppercase;padding-bottom:10px;border-bottom:1px solid var(--line)}
#pd-root .dc-gold h3{color:var(--gold)}#pd-root .dc-gold{border-top-color:var(--gold)}
#pd-root .dc-pink h3{color:var(--pink)}#pd-root .dc-pink{border-top-color:var(--pink)}
#pd-root .dc-green h3{color:var(--green)}#pd-root .dc-green{border-top-color:var(--green)}
#pd-root .dc-violet h3{color:var(--violet)}#pd-root .dc-violet{border-top-color:var(--violet)}
#pd-root .dash-card .metric{font-size:2rem;font-weight:800;margin-bottom:6px;font-family:var(--fd)}
#pd-root .dash-card .metric.sm{font-size:1.15rem}
#pd-root .dc-gold .metric{color:var(--gold)}#pd-root .dc-pink .metric{color:var(--pink)}
#pd-root .dc-green .metric{color:var(--green)}#pd-root .dc-violet .metric{color:var(--violet)}
#pd-root .dash-card .sub-metric{font-size:.85rem;color:var(--dim);line-height:1.55}
#pd-root .dash-card .sub-metric strong{color:var(--txt-strong)}
#pd-root .int-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin-top:8px}
#pd-root .int-card{padding:15px;background:var(--panel2);border-radius:10px;border:1px solid var(--line);font-size:.85rem}
#pd-root .int-card strong{color:var(--txt-strong);display:block;margin-bottom:4px}
#pd-root .int-card .dim{color:var(--muted)}
#pd-root .ib{background:#eef7ee;border-left:4px solid var(--green);border-radius:8px;padding:.7rem .9rem;margin-bottom:1rem;font-size:.88rem}
#pd-root .deals-filters{display:flex;gap:12px;margin-bottom:20px;flex-wrap:wrap;align-items:center}
#pd-root .deals-filters input,#pd-root .deals-filters select{padding:10px 14px;background:#fff;border:2px solid var(--line-strong);border-radius:8px;color:var(--txt);font-size:.9rem;font-family:var(--fb);outline:none}
#pd-root .deals-filters input:focus,#pd-root .deals-filters select:focus{border-color:var(--violet)}
#pd-root .deals-filters input{flex:1;min-width:200px}
#fc-deals .kanban-board{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;padding-bottom:20px}
@media(max-width:1200px){#fc-deals .kanban-board{grid-template-columns:repeat(3,1fr)}}
@media(max-width:768px){#fc-deals .kanban-board{grid-template-columns:1fr}}
#pd-root .kanban-column{background:var(--panel2);border:2px solid var(--line-strong);border-radius:12px;padding:16px;min-height:400px;display:flex;flex-direction:column}
#pd-root .kanban-column.drag-over{border-color:var(--pink);background:#fdf0f5}
#pd-root .column-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid var(--line-strong)}
#pd-root .column-title{font-family:var(--fd);font-size:.95rem;font-weight:700;color:var(--txt-strong)}
#pd-root .column-count{background:var(--pink);color:#fff;font-size:.75rem;font-weight:800;padding:4px 10px;border-radius:12px;font-family:var(--fm)}
#pd-root .column-sum{font-size:.78rem;color:var(--dim);margin-top:4px;font-family:var(--fm);font-weight:600}
#pd-root .deals-list,#pd-root .tasks-list{flex:1;display:flex;flex-direction:column;gap:10px;min-height:100px}
#pd-root .deal-card{background:#fff;border:1px solid var(--line-strong);border-radius:8px;padding:14px;cursor:grab;transition:all .2s;box-shadow:var(--shadow)}
#pd-root .deal-card:hover{transform:translateY(-2px);border-color:var(--violet)}
#pd-root .deal-card.dragging{opacity:.5}
#pd-root .deal-card .deal-title{font-weight:700;color:var(--txt-strong);margin-bottom:8px;font-size:.95rem}
#pd-root .deal-card .deal-client{font-size:.82rem;color:var(--dim);margin-bottom:10px}
#pd-root .deal-card .deal-amount{font-family:var(--fm);font-weight:700;color:var(--gold);font-size:1.05rem;margin-bottom:8px}
#pd-root .deal-card .deal-meta{display:flex;justify-content:space-between;align-items:center;font-size:.75rem;color:var(--dim);font-weight:600}
#pd-root .deal-card .deal-prob{background:var(--violet);color:#fff;padding:3px 8px;border-radius:4px;font-family:var(--fm);font-size:.72rem;font-weight:700}
#pd-root .deal-card .deal-date{font-size:.72rem;color:var(--muted);margin-top:6px;font-family:var(--fm);font-weight:600}
#fc-tasks .kanban-board{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
@media(max-width:900px){#fc-tasks .kanban-board{grid-template-columns:1fr}}
#pd-root .task-card{background:#fff;border:1px solid var(--line-strong);border-left:5px solid var(--violet);border-radius:8px;padding:14px;cursor:grab;transition:all .2s;box-shadow:var(--shadow)}
#pd-root .task-card:hover{transform:translateY(-2px)}
#pd-root .task-card.p-high{border-left-color:var(--red)}
#pd-root .task-card.p-medium{border-left-color:var(--gold)}
#pd-root .task-card.p-low{border-left-color:var(--green)}
#pd-root .task-card.overdue{background:#fdeeee;border-left-color:var(--red)}
#pd-root .task-card.today{background:#fdf6e8;border-left-color:var(--gold)}
#pd-root .task-card .task-top{display:flex;justify-content:space-between;align-items:flex-start;gap:8px;margin-bottom:8px}
#pd-root .task-card .task-type-icon{font-size:1.1rem}
#pd-root .task-card .task-title{font-weight:700;color:var(--txt-strong);font-size:.95rem;flex:1}
#pd-root .task-card .task-desc{font-size:.8rem;color:var(--dim);margin-bottom:10px}
#pd-root .task-card .task-client{font-size:.78rem;color:var(--violet);margin-bottom:8px;font-weight:600}
#pd-root .task-card .task-footer{display:flex;justify-content:space-between;gap:8px;flex-wrap:wrap}
#pd-root .task-card .task-due{font-family:var(--fm);font-size:.75rem;color:var(--dim);font-weight:600}
#pd-root .task-card.overdue .task-due{color:var(--red);font-weight:800}
#pd-root .task-card.today .task-due{color:var(--gold);font-weight:800}
#pd-root .task-card .task-assignee{font-size:.72rem;background:var(--panel2);padding:3px 8px;border-radius:4px;border:1px solid var(--line);font-weight:600}
#pd-root .priority-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px}
#pd-root .priority-dot.high{background:var(--red)}
#pd-root .priority-dot.medium{background:var(--gold)}
#pd-root .priority-dot.low{background:var(--green)}
#pd-root .task-actions{display:flex;gap:4px}
#pd-root .task-actions button{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line-strong);border-radius:6px;cursor:pointer;font-size:.75rem;background:#fff;transition:all .15s}
#pd-root .task-actions button.done-btn:hover{background:var(--green);color:#fff;border-color:var(--green)}
#pd-root .task-actions button.edit-btn:hover{background:var(--violet);color:#fff}
#pd-root .task-actions button.del-btn:hover{background:var(--red);color:#fff}
#pd-root .type-selector{display:grid;grid-template-columns:repeat(5,1fr);gap:8px}
#pd-root .type-option{padding:10px 6px;text-align:center;border:2px solid var(--line);border-radius:8px;cursor:pointer;background:#fff}
#pd-root .type-option .icon{font-size:1.2rem;display:block;margin-bottom:4px}
#pd-root .type-option .label{font-size:.68rem;color:var(--muted);font-weight:600}
#pd-root .type-option.selected{border-color:var(--gold);background:#fdf6e8}
#pd-root .type-option.selected .label{color:var(--gold);font-weight:800}
#pd-root .clients-table-wrap{background:#fff;border:1px solid var(--line-strong);border-radius:14px;overflow-x:auto;box-shadow:var(--shadow)}
#pd-root .clients-table,#pd-root .wh-table{width:100%;border-collapse:collapse;font-size:.9rem;min-width:820px}
#pd-root .clients-table thead th,#pd-root .wh-table thead th{background:var(--panel2);padding:14px 16px;text-align:left;font-weight:800;color:var(--txt-strong);font-size:.75rem;text-transform:uppercase;border-bottom:3px solid var(--line-strong);white-space:nowrap}
#pd-root .wh-table thead th.num{text-align:right}
#pd-root .clients-table tbody td,#pd-root .wh-table tbody td{padding:14px 16px;border-bottom:1px solid var(--line);color:var(--txt);vertical-align:middle}
#pd-root .wh-table tbody td.num{text-align:right;font-family:var(--fm);font-weight:600}
#pd-root .clients-table tbody tr{cursor:pointer}
#pd-root .clients-table tbody tr:hover,#pd-root .wh-table tbody tr:hover{background:#f6f2fb}
#pd-root .clients-table tbody tr:last-child td,#pd-root .wh-table tbody tr:last-child td{border-bottom:none}
#pd-root .client-name-cell,#pd-root .prod-name-cell{font-weight:700;color:var(--txt-strong)}
#pd-root .client-name-cell .sub,#pd-root .prod-name-cell .sub{font-size:.75rem;color:var(--muted);margin-top:2px}
#pd-root .prod-name-cell .sub{font-family:var(--fm);font-size:.72rem}
#pd-root .row-actions{display:flex;gap:6px;justify-content:flex-end}
#pd-root .client-avatar{width:64px;height:64px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-family:var(--fd);font-size:1.6rem;font-weight:800;color:#fff;background:linear-gradient(135deg,var(--violet),var(--pink));flex-shrink:0}
#pd-root .client-card-header{display:flex;align-items:center;gap:16px;margin-bottom:24px;padding-bottom:20px;border-bottom:2px solid var(--line-strong)}
#pd-root .client-card-title h2{margin-bottom:4px}
#pd-root .client-card-title .meta{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
#pd-root .info-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px 24px;margin-bottom:24px}
#pd-root .info-item .label{font-size:.7rem;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:2px;font-weight:700}
#pd-root .info-item .value{font-size:.95rem;color:var(--txt);font-weight:600}
#pd-root .info-item .value.mono{font-family:var(--fm)}
#pd-root .card-section-title{font-family:var(--fd);font-size:.95rem;font-weight:700;color:var(--gold);margin:20px 0 12px}
#pd-root .linked-deal{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin-bottom:8px;display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
#pd-root .linked-deal .name{font-weight:700;color:var(--txt-strong)}
#pd-root .linked-deal .stage{font-size:.72rem;font-family:var(--fm);padding:3px 8px;border-radius:4px;background:#f0ebfa;color:var(--violet);font-weight:700}
#pd-root .linked-deal .amount{font-family:var(--fm);font-weight:700;color:var(--gold)}
#pd-root .file-input-hidden{display:none}
#pd-root .wh-filters{display:flex;gap:12px;margin-bottom:20px;flex-wrap:wrap;align-items:center}
#pd-root .wh-filters input,#pd-root .wh-filters select{padding:10px 14px;background:#fff;border:2px solid var(--line-strong);border-radius:8px;color:var(--txt);font-size:.9rem;font-family:var(--fb);outline:none}
#pd-root .wh-filters input:focus,#pd-root .wh-filters select:focus{border-color:var(--violet)}
#pd-root .wh-filters input[type=text]{flex:1;min-width:220px}
#pd-root .wh-filters label.chk{display:flex;align-items:center;gap:8px;font-size:.85rem;cursor:pointer;font-weight:600}
#pd-root .wh-filters input[type=checkbox]{width:18px;height:18px;accent-color:var(--pink)}
#pd-root .qty-badge{font-family:var(--fm);font-weight:800;font-size:.95rem}
#pd-root .qty-badge.ok{color:var(--green)}#pd-root .qty-badge.low{color:var(--gold)}#pd-root .qty-badge.out{color:var(--red)}
#pd-root .moves-section{background:#fff;border:1px solid var(--line-strong);border-radius:14px;padding:24px;box-shadow:var(--shadow);margin-top:28px}
#pd-root .moves-section h3{font-family:var(--fd);font-size:1.05rem;color:var(--gold);margin-bottom:16px}
#pd-root .move-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;border-radius:8px;margin-bottom:6px;background:var(--panel2);border:1px solid var(--line);flex-wrap:wrap}
#pd-root .move-row .left{display:flex;align-items:center;gap:10px;flex:1}
#pd-root .move-row .type-ico{width:30px;height:30px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-family:var(--fm)}
#pd-root .move-row .type-ico.in{background:#eef7ee;color:var(--green)}
#pd-root .move-row .type-ico.out{background:#fff3ec;color:var(--orange)}
#pd-root .move-row .m-prod{font-weight:700;color:var(--txt-strong);font-size:.88rem}
#pd-root .move-row .m-comment{font-size:.75rem;color:var(--muted);margin-top:2px}
#pd-root .move-row .right{display:flex;align-items:center;gap:14px;font-family:var(--fm);font-size:.82rem;font-weight:600}
#pd-root .move-row .m-qty.in{color:var(--green);font-weight:800}
#pd-root .move-row .m-qty.out{color:var(--orange);font-weight:800}
#pd-root .move-row .m-date{color:var(--muted)}
#pd-root .move-toggle{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:18px}
#pd-root .move-toggle .opt{padding:12px;text-align:center;border-radius:10px;border:2px solid var(--line);cursor:pointer;font-weight:700;background:#fff;color:var(--muted)}
#pd-root .move-toggle .opt.sel-in{background:#eef7ee;border-color:var(--green);color:var(--green)}
#pd-root .move-toggle .opt.sel-out{background:#fff3ec;border-color:var(--orange);color:var(--orange)}
#pd-root .cur-stock-hint{font-size:.8rem;color:var(--dim);margin-top:6px;font-family:var(--fm);font-weight:600}
#pd-root .alert-banner{background:#fdf6e8;border-left:4px solid var(--gold);border-radius:8px;padding:.8rem 1rem;margin-bottom:10px;display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
#pd-root .alert-banner.critical{background:#fdeeee;border-left-color:var(--red)}
#pd-root .alert-banner .alert-text{font-size:.88rem;font-weight:600;color:var(--txt)}
#pd-root .alert-banner .alert-actions{display:flex;gap:8px}
#pd-root .rules-accordion{background:var(--panel2);border:1px solid var(--line-strong);border-radius:10px;padding:16px;margin-top:16px}
#pd-root .rules-accordion summary{cursor:pointer;font-weight:700;color:var(--gold);font-size:.95rem}
#pd-root .rules-accordion[open]{margin-bottom:20px}
#pd-root .rules-accordion p{margin-top:10px;font-size:.88rem;line-height:1.6;color:var(--txt)}
#pd-root .rules-accordion .term{display:inline-block;background:#f0ebfa;color:var(--violet);padding:2px 8px;border-radius:4px;font-weight:700;font-size:.78rem;font-family:var(--fm)}
#pd-root .price-input{width:120px !important;padding:6px 10px !important;font-family:var(--fm);font-weight:700}
#pd-root .empty-state{text-align:center;padding:50px 20px;color:var(--muted);font-weight:600}
#pd-root .empty-state .icon{font-size:3rem;margin-bottom:12px}
@media(max-width:860px){
#pd-root .sidebar{position:static;width:100%;height:auto;border-right:none;border-bottom:2px solid var(--line-strong)}
#pd-root .main-content{margin-left:0;padding:0 14px 40px}
#pd-root .form-row,#pd-root .info-grid{grid-template-columns:1fr}
#pd-root .type-selector{grid-template-columns:repeat(3,1fr)}
#pd-root .hide-mobile{display:none}
}
@media print{
#pd-root .sidebar,#pd-root .topbar{display:none!important}
#pd-root .main-content{margin:0;padding:0}
#pd-root .tc{box-shadow:none;border:1px solid #ccc}
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="pd-root"&gt;
&lt;aside class="sidebar"&gt;
&lt;div class="logo"&gt;Пандора&lt;span class="crm"&gt;CRM&lt;/span&gt;&lt;/div&gt;
&lt;div class="sync-status"&gt;&lt;span class="sync-dot"&gt;&lt;/span&gt; 1С:Предприятие 8.3 · Онлайн&lt;/div&gt;
&lt;nav id="main-nav"&gt;
&lt;div class="nav-section ns-pink"&gt;CRM-система&lt;/div&gt;
&lt;a class="nav-link active" data-view="dash"&gt;? Дашборд&lt;/a&gt;
&lt;a class="nav-link" data-t="deals"&gt;? Сделки и воронка&lt;/a&gt;
&lt;a class="nav-link" data-t="clients"&gt;? База клиентов&lt;/a&gt;
&lt;a class="nav-link" data-t="tasks"&gt;✅ Задачи&lt;/a&gt;
&lt;a class="nav-link" data-t="warehouse"&gt;? Склад&lt;/a&gt;
&lt;div class="nav-section ns-orange"&gt;Бартерная платформа&lt;/div&gt;
&lt;a class="nav-link" data-t="steel"&gt;? Сталь и Поставщики&lt;/a&gt;
&lt;a class="nav-link" data-t="barter-engine"&gt;? Сведение цепочек&lt;/a&gt;
&lt;div class="nav-section ns-gold"&gt;Бухгалтерия и Налоги&lt;/div&gt;
&lt;a class="nav-link" data-t="usn"&gt;УСН&lt;/a&gt;
&lt;a class="nav-link" data-t="osn"&gt;ОСН&lt;/a&gt;
&lt;a class="nav-link" data-t="compare"&gt;Сравнение режимов&lt;/a&gt;
&lt;a class="nav-link" data-t="export"&gt;? Экспорт&lt;/a&gt;
&lt;/nav&gt;
&lt;/aside&gt;
&lt;main class="main-content"&gt;
&lt;header class="topbar"&gt;
&lt;div class="breadcrumbs" id="breadcrumbs"&gt;Пандора CRM / Дашборд&lt;/div&gt;
&lt;div class="user-actions"&gt;
&lt;button class="btn btn-p btn-s" id="fc-save-btn" type="button"&gt;Сохранить&lt;/button&gt;
&lt;button class="btn btn-o btn-s" id="fc-pdf-btn" type="button"&gt;PDF&lt;/button&gt;
&lt;button class="btn btn-d btn-s" id="fc-reset-btn" type="button"&gt;Сброс&lt;/button&gt;
&lt;span class="save-ind" id="fc-save-ind"&gt;&lt;/span&gt;
&lt;select id="role-switcher"&gt;
&lt;option value="biz"&gt;Бизнесмен&lt;/option&gt;
&lt;option value="acc"&gt;Бухгалтер&lt;/option&gt;
&lt;option value="mgm"&gt;Управленец&lt;/option&gt;
&lt;/select&gt;
&lt;/div&gt;
&lt;/header&gt;
&lt;div id="fc-w"&gt;


&lt;div id="fc-dash" class="tc act"&gt;
&lt;h1&gt;Приборная панель &lt;span class="gold" id="dash-role-title"&gt;Бизнесмена&lt;/span&gt;&lt;/h1&gt;
&lt;div class="dash-grid"&gt;
&lt;div class="dash-card dc-gold"&gt;&lt;h3&gt;Финансы (ДДС)&lt;/h3&gt;&lt;div class="metric"&gt;+ 1 250 000 ₽&lt;/div&gt;&lt;div class="sub-metric"&gt;Кассовый разрыв: &lt;strong class="success"&gt;Нет&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="dash-card dc-violet"&gt;&lt;h3&gt;Рентабельность&lt;/h3&gt;&lt;div class="metric"&gt;24.5%&lt;/div&gt;&lt;div class="sub-metric"&gt;Чистая прибыль: &lt;strong&gt;850 000 ₽&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="dash-card dc-pink"&gt;&lt;h3&gt;Бартерная платформа&lt;/h3&gt;&lt;div class="metric"&gt;3&lt;/div&gt;&lt;div class="sub-metric"&gt;Поставщика · &lt;strong&gt;~30 т бронестали&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="dash-card dc-green"&gt;&lt;h3&gt;Активных сделок&lt;/h3&gt;&lt;div class="metric"&gt;5&lt;/div&gt;&lt;div class="sub-metric"&gt;Прогноз: &lt;strong&gt;715 000 ₽&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ib"&gt;&lt;strong&gt;Совет:&lt;/strong&gt; Откройте раздел &lt;b&gt;? Сталь и Поставщики&lt;/b&gt; — там реальные остатки Ларисы, Ирины и Ольги по прайсу бронестали.&lt;/div&gt;
&lt;/div&gt;


&lt;div id="fc-deals" class="tc"&gt;
&lt;div class="module-header"&gt;&lt;h1&gt;Сделки &lt;span class="gold"&gt;и воронка продаж&lt;/span&gt;&lt;/h1&gt;&lt;button class="btn" id="deals-add-btn" type="button"&gt;+ Новая сделка&lt;/button&gt;&lt;/div&gt;
&lt;div class="stats-grid"&gt;
&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Всего сделок&lt;/div&gt;&lt;div class="value" id="stat-total"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card green"&gt;&lt;div class="label"&gt;Закрыто успешно&lt;/div&gt;&lt;div class="value" id="stat-won"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card violet"&gt;&lt;div class="label"&gt;Прогноз выручки&lt;/div&gt;&lt;div class="value" id="stat-forecast"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card pink"&gt;&lt;div class="label"&gt;Конверсия&lt;/div&gt;&lt;div class="value" id="stat-conv"&gt;0%&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="deals-filters"&gt;
&lt;input type="text" id="deals-search" placeholder="? Поиск..." /&gt;
&lt;select id="deals-manager-filter"&gt;&lt;option value=""&gt;Все менеджеры&lt;/option&gt;&lt;option&gt;Иванов&lt;/option&gt;&lt;option&gt;Петров&lt;/option&gt;&lt;option&gt;Сидоров&lt;/option&gt;&lt;/select&gt;
&lt;/div&gt;
&lt;div class="kanban-board" id="kanban-board"&gt;
&lt;div class="kanban-column" data-stage="new"&gt;&lt;div class="column-header"&gt;&lt;div&gt;&lt;div class="column-title"&gt;Новая&lt;/div&gt;&lt;div class="column-count" id="count-new"&gt;0&lt;/div&gt;&lt;/div&gt;&lt;div class="column-sum" id="sum-new"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;&lt;div class="deals-list" id="list-new"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="kanban-column" data-stage="progress"&gt;&lt;div class="column-header"&gt;&lt;div&gt;&lt;div class="column-title"&gt;В работе&lt;/div&gt;&lt;div class="column-count" id="count-progress"&gt;0&lt;/div&gt;&lt;/div&gt;&lt;div class="column-sum" id="sum-progress"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;&lt;div class="deals-list" id="list-progress"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="kanban-column" data-stage="negotiation"&gt;&lt;div class="column-header"&gt;&lt;div&gt;&lt;div class="column-title"&gt;Переговоры&lt;/div&gt;&lt;div class="column-count" id="count-negotiation"&gt;0&lt;/div&gt;&lt;/div&gt;&lt;div class="column-sum" id="sum-negotiation"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;&lt;div class="deals-list" id="list-negotiation"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="kanban-column" data-stage="won"&gt;&lt;div class="column-header"&gt;&lt;div&gt;&lt;div class="column-title"&gt;Сделка ✓&lt;/div&gt;&lt;div class="column-count" id="count-won"&gt;0&lt;/div&gt;&lt;/div&gt;&lt;div class="column-sum" id="sum-won"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;&lt;div class="deals-list" id="list-won"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="kanban-column" data-stage="lost"&gt;&lt;div class="column-header"&gt;&lt;div&gt;&lt;div class="column-title"&gt;Отказ ✗&lt;/div&gt;&lt;div class="column-count" id="count-lost"&gt;0&lt;/div&gt;&lt;/div&gt;&lt;div class="column-sum" id="sum-lost"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;&lt;div class="deals-list" id="list-lost"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="modal-overlay" id="deal-modal"&gt;&lt;div class="modal"&gt;
&lt;h2&gt;Новая сделка&lt;/h2&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Название&lt;/label&gt;&lt;input type="text" id="deal-name" /&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Клиент&lt;/label&gt;&lt;input type="text" id="deal-client" /&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Сумма (₽)&lt;/label&gt;&lt;input type="number" id="deal-amount" min="0" /&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Вероятность (%)&lt;/label&gt;&lt;select id="deal-prob"&gt;&lt;option value="10"&gt;10%&lt;/option&gt;&lt;option value="30"&gt;30%&lt;/option&gt;&lt;option value="50" selected="selected"&gt;50%&lt;/option&gt;&lt;option value="70"&gt;70%&lt;/option&gt;&lt;option value="90"&gt;90%&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Менеджер&lt;/label&gt;&lt;select id="deal-manager"&gt;&lt;option&gt;Иванов&lt;/option&gt;&lt;option&gt;Петров&lt;/option&gt;&lt;option&gt;Сидоров&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Дата закрытия&lt;/label&gt;&lt;input type="date" id="deal-date" /&gt;&lt;/div&gt;
&lt;div class="modal-actions"&gt;&lt;button class="btn btn-secondary" id="deal-cancel-btn" type="button"&gt;Отмена&lt;/button&gt;&lt;button class="btn" id="deal-save-btn" type="button"&gt;Создать&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;div id="fc-clients" class="tc"&gt;
&lt;div class="module-header"&gt;&lt;h1&gt;База &lt;span class="gold"&gt;клиентов&lt;/span&gt;&lt;/h1&gt;
&lt;div class="header-actions"&gt;
&lt;button class="btn btn-green btn-s" id="clients-import-btn" type="button"&gt;? Импорт CSV&lt;/button&gt;
&lt;button class="btn btn-secondary btn-s" id="clients-export-btn" type="button"&gt;? Экспорт CSV&lt;/button&gt;
&lt;button class="btn" id="clients-add-btn" type="button"&gt;+ Новый клиент&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="stats-grid"&gt;
&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Всего&lt;/div&gt;&lt;div class="value" id="cstat-total"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card violet"&gt;&lt;div class="label"&gt;Юр. лица&lt;/div&gt;&lt;div class="value" id="cstat-legal"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card green"&gt;&lt;div class="label"&gt;ИП&lt;/div&gt;&lt;div class="value" id="cstat-ip"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card pink"&gt;&lt;div class="label"&gt;VIP&lt;/div&gt;&lt;div class="value" id="cstat-vip"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="wh-filters"&gt;
&lt;input type="text" id="clients-search" placeholder="? Поиск..." /&gt;
&lt;select id="clients-type-filter"&gt;&lt;option value=""&gt;Все&lt;/option&gt;&lt;option value="legal"&gt;Юр. лицо&lt;/option&gt;&lt;option value="ip"&gt;ИП&lt;/option&gt;&lt;option value="person"&gt;Физ. лицо&lt;/option&gt;&lt;/select&gt;
&lt;select id="clients-status-filter"&gt;&lt;option value=""&gt;Все&lt;/option&gt;&lt;option value="active"&gt;Активный&lt;/option&gt;&lt;option value="vip"&gt;VIP&lt;/option&gt;&lt;option value="inactive"&gt;Неактивный&lt;/option&gt;&lt;/select&gt;
&lt;/div&gt;
&lt;div class="clients-table-wrap"&gt;&lt;table class="clients-table"&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Клиент&lt;/th&gt;&lt;th&gt;Тип&lt;/th&gt;&lt;th&gt;ИНН&lt;/th&gt;&lt;th&gt;Контакт&lt;/th&gt;&lt;th&gt;Менеджер&lt;/th&gt;&lt;th&gt;Статус&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody id="clients-tbody"&gt;&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;input type="file" id="clients-file-input" class="file-input-hidden" accept=".csv" /&gt;
&lt;div class="modal-overlay" id="client-form-modal"&gt;&lt;div class="modal"&gt;
&lt;h2 id="client-form-title"&gt;Новый клиент&lt;/h2&gt;
&lt;input type="hidden" id="client-edit-id" /&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Название / ФИО *&lt;/label&gt;&lt;input type="text" id="client-name" /&gt;&lt;/div&gt;
&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Тип&lt;/label&gt;&lt;select id="client-type"&gt;&lt;option value="legal"&gt;Юр. лицо&lt;/option&gt;&lt;option value="ip"&gt;ИП&lt;/option&gt;&lt;option value="person"&gt;Физ. лицо&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Статус&lt;/label&gt;&lt;select id="client-status"&gt;&lt;option value="active"&gt;Активный&lt;/option&gt;&lt;option value="vip"&gt;VIP&lt;/option&gt;&lt;option value="inactive"&gt;Неактивный&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;ИНН&lt;/label&gt;&lt;input type="text" id="client-inn" maxlength="12" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;КПП&lt;/label&gt;&lt;input type="text" id="client-kpp" maxlength="9" /&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Контакт&lt;/label&gt;&lt;input type="text" id="client-contact" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Телефон&lt;/label&gt;&lt;input type="text" id="client-phone" /&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Email&lt;/label&gt;&lt;input type="email" id="client-email" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Менеджер&lt;/label&gt;&lt;select id="client-manager"&gt;&lt;option&gt;Иванов&lt;/option&gt;&lt;option&gt;Петров&lt;/option&gt;&lt;option&gt;Сидоров&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Адрес&lt;/label&gt;&lt;input type="text" id="client-address" /&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Заметки&lt;/label&gt;&lt;textarea id="client-notes"&gt;&lt;/textarea&gt;&lt;/div&gt;
&lt;div class="modal-actions"&gt;&lt;button class="btn btn-secondary" id="client-cancel-btn" type="button"&gt;Отмена&lt;/button&gt;&lt;button class="btn" id="client-save-btn" type="button"&gt;Сохранить&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="modal-overlay" id="client-view-modal"&gt;&lt;div class="modal wide" id="client-view-content"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;div id="fc-tasks" class="tc"&gt;
&lt;div class="module-header"&gt;&lt;h1&gt;Задачи &lt;span class="gold"&gt;и напоминания&lt;/span&gt;&lt;/h1&gt;&lt;button class="btn" id="tasks-add-btn" type="button"&gt;+ Новая задача&lt;/button&gt;&lt;/div&gt;
&lt;div class="stats-grid"&gt;
&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Всего&lt;/div&gt;&lt;div class="value" id="tstat-total"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card red"&gt;&lt;div class="label"&gt;Просрочено&lt;/div&gt;&lt;div class="value" id="tstat-overdue"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card pink"&gt;&lt;div class="label"&gt;Сегодня&lt;/div&gt;&lt;div class="value" id="tstat-today"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card green"&gt;&lt;div class="label"&gt;Выполнено&lt;/div&gt;&lt;div class="value" id="tstat-done"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="kanban-board"&gt;
&lt;div class="kanban-column" data-status="todo"&gt;&lt;div class="column-header"&gt;&lt;div class="column-title"&gt;? К выполнению&lt;/div&gt;&lt;div class="column-count" id="count-todo"&gt;0&lt;/div&gt;&lt;/div&gt;&lt;div class="tasks-list" id="list-todo"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="kanban-column" data-status="progress"&gt;&lt;div class="column-header"&gt;&lt;div class="column-title"&gt;⚡ В работе&lt;/div&gt;&lt;div class="column-count" id="count-progress-t"&gt;0&lt;/div&gt;&lt;/div&gt;&lt;div class="tasks-list" id="list-progress-t"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="kanban-column" data-status="done"&gt;&lt;div class="column-header"&gt;&lt;div class="column-title"&gt;✅ Выполнено&lt;/div&gt;&lt;div class="column-count" id="count-done"&gt;0&lt;/div&gt;&lt;/div&gt;&lt;div class="tasks-list" id="list-done"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="modal-overlay" id="task-form-modal"&gt;&lt;div class="modal"&gt;
&lt;h2 id="task-form-title"&gt;Новая задача&lt;/h2&gt;
&lt;input type="hidden" id="task-edit-id" /&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Тип&lt;/label&gt;&lt;div class="type-selector" id="task-type-selector"&gt;
&lt;div class="type-option selected" data-type="call"&gt;&lt;span class="icon"&gt;?&lt;/span&gt;&lt;span class="label"&gt;Звонок&lt;/span&gt;&lt;/div&gt;
&lt;div class="type-option" data-type="meeting"&gt;&lt;span class="icon"&gt;?&lt;/span&gt;&lt;span class="label"&gt;Встреча&lt;/span&gt;&lt;/div&gt;
&lt;div class="type-option" data-type="email"&gt;&lt;span class="icon"&gt;?&lt;/span&gt;&lt;span class="label"&gt;Письмо&lt;/span&gt;&lt;/div&gt;
&lt;div class="type-option" data-type="task"&gt;&lt;span class="icon"&gt;?&lt;/span&gt;&lt;span class="label"&gt;Задача&lt;/span&gt;&lt;/div&gt;
&lt;div class="type-option" data-type="payment"&gt;&lt;span class="icon"&gt;?&lt;/span&gt;&lt;span class="label"&gt;Оплата&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Название *&lt;/label&gt;&lt;input type="text" id="task-title" /&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Описание&lt;/label&gt;&lt;textarea id="task-desc"&gt;&lt;/textarea&gt;&lt;/div&gt;
&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Приоритет&lt;/label&gt;&lt;select id="task-priority"&gt;&lt;option value="high"&gt;? Высокий&lt;/option&gt;&lt;option value="medium" selected="selected"&gt;? Средний&lt;/option&gt;&lt;option value="low"&gt;? Низкий&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Исполнитель&lt;/label&gt;&lt;select id="task-assignee"&gt;&lt;option&gt;Иванов&lt;/option&gt;&lt;option&gt;Петров&lt;/option&gt;&lt;option&gt;Сидоров&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Срок *&lt;/label&gt;&lt;input type="date" id="task-due" /&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Статус&lt;/label&gt;&lt;select id="task-status"&gt;&lt;option value="todo"&gt;? К выполнению&lt;/option&gt;&lt;option value="progress"&gt;⚡ В работе&lt;/option&gt;&lt;option value="done"&gt;✅ Выполнено&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="modal-actions"&gt;&lt;button class="btn btn-secondary" id="task-cancel-btn" type="button"&gt;Отмена&lt;/button&gt;&lt;button class="btn" id="task-save-btn" type="button"&gt;Сохранить&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;div id="fc-warehouse" class="tc"&gt;
&lt;div class="module-header"&gt;&lt;h1&gt;Склад &lt;span class="gold"&gt;и остатки&lt;/span&gt;&lt;/h1&gt;&lt;button class="btn" id="wh-add-btn" type="button"&gt;+ Новый товар&lt;/button&gt;&lt;/div&gt;
&lt;div class="stats-grid"&gt;
&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Позиций&lt;/div&gt;&lt;div class="value" id="wstat-items"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card violet"&gt;&lt;div class="label"&gt;Стоимость склада&lt;/div&gt;&lt;div class="value" id="wstat-value"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card pink"&gt;&lt;div class="label"&gt;Мало&lt;/div&gt;&lt;div class="value" id="wstat-low"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card red"&gt;&lt;div class="label"&gt;Нет в наличии&lt;/div&gt;&lt;div class="value" id="wstat-out"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="wh-filters"&gt;
&lt;input type="text" id="wh-search" placeholder="? Поиск..." /&gt;
&lt;select id="wh-cat-filter"&gt;&lt;option value=""&gt;Все категории&lt;/option&gt;&lt;/select&gt;
&lt;label class="chk"&gt;&lt;input type="checkbox" id="wh-low-only" /&gt; Только заканчивающиеся&lt;/label&gt;
&lt;/div&gt;
&lt;div class="clients-table-wrap"&gt;&lt;table class="wh-table"&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Товар&lt;/th&gt;&lt;th&gt;Категория&lt;/th&gt;&lt;th class="num"&gt;Остаток&lt;/th&gt;&lt;th class="num"&gt;Мин.&lt;/th&gt;&lt;th class="num"&gt;Цена&lt;/th&gt;&lt;th class="num"&gt;Сумма&lt;/th&gt;&lt;th&gt;Статус&lt;/th&gt;&lt;th style="text-align:right"&gt;Действия&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody id="wh-tbody"&gt;&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="moves-section"&gt;&lt;h3&gt;? Последние движения&lt;/h3&gt;&lt;div id="wh-moves-list"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="modal-overlay" id="wh-product-modal"&gt;&lt;div class="modal"&gt;
&lt;h2 id="wh-product-title"&gt;Новый товар&lt;/h2&gt;
&lt;input type="hidden" id="wh-edit-id" /&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Название *&lt;/label&gt;&lt;input type="text" id="wh-name" /&gt;&lt;/div&gt;
&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Артикул&lt;/label&gt;&lt;input type="text" id="wh-sku" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Категория&lt;/label&gt;&lt;input type="text" id="wh-category" /&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Ед.&lt;/label&gt;&lt;select id="wh-unit"&gt;&lt;option&gt;шт&lt;/option&gt;&lt;option&gt;кг&lt;/option&gt;&lt;option&gt;л&lt;/option&gt;&lt;option&gt;м&lt;/option&gt;&lt;option&gt;упак&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Количество *&lt;/label&gt;&lt;input type="number" id="wh-qty" min="0" value="0" /&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Мин. остаток&lt;/label&gt;&lt;input type="number" id="wh-minqty" min="0" value="5" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Цена (₽)&lt;/label&gt;&lt;input type="number" id="wh-price" min="0" value="0" /&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Себестоимость (₽)&lt;/label&gt;&lt;input type="number" id="wh-cost" min="0" value="0" /&gt;&lt;/div&gt;
&lt;div class="modal-actions"&gt;&lt;button class="btn btn-secondary" id="wh-cancel-btn" type="button"&gt;Отмена&lt;/button&gt;&lt;button class="btn" id="wh-save-btn" type="button"&gt;Сохранить&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="modal-overlay" id="wh-move-modal"&gt;&lt;div class="modal"&gt;
&lt;h2 id="wh-move-title"&gt;Движение&lt;/h2&gt;
&lt;input type="hidden" id="wh-move-product-id" /&gt;
&lt;div class="move-toggle"&gt;&lt;div class="opt sel-in" id="wh-move-in-opt"&gt;⬇ Приход&lt;/div&gt;&lt;div class="opt" id="wh-move-out-opt"&gt;⬆ Расход&lt;/div&gt;&lt;/div&gt;
&lt;div class="cur-stock-hint" id="wh-cur-stock"&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Количество *&lt;/label&gt;&lt;input type="number" id="wh-move-qty" min="1" value="1" /&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Комментарий&lt;/label&gt;&lt;input type="text" id="wh-move-comment" /&gt;&lt;/div&gt;
&lt;div class="modal-actions"&gt;&lt;button class="btn btn-secondary" id="wh-move-cancel-btn" type="button"&gt;Отмена&lt;/button&gt;&lt;button class="btn" id="wh-move-save-btn" type="button"&gt;Провести&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;div id="fc-steel" class="tc"&gt;
&lt;div class="module-header"&gt;
&lt;h1&gt;? Сталь &lt;span class="gold"&gt;и поставщики&lt;/span&gt;&lt;/h1&gt;
&lt;select id="steel-sup" style="padding:8px 12px;background:#fff;border:2px solid var(--line-strong);border-radius:8px;font-weight:700"&gt;
&lt;option value="all"&gt;? Владелец (все)&lt;/option&gt;
&lt;option value="Лариса"&gt;Лариса&lt;/option&gt;
&lt;option value="Ирина"&gt;Ирина&lt;/option&gt;
&lt;option value="Ольга"&gt;Ольга&lt;/option&gt;
&lt;/select&gt;
&lt;button class="btn" id="steel-add-btn" type="button"&gt;+ Добавить позицию&lt;/button&gt;
&lt;/div&gt;

&lt;div class="stats-grid"&gt;
&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Поставщиков&lt;/div&gt;&lt;div class="value" id="st-sup"&gt;3&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card violet"&gt;&lt;div class="label"&gt;Тоннаж&lt;/div&gt;&lt;div class="value" id="st-ton"&gt;0 т&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card pink"&gt;&lt;div class="label"&gt;Стоимость (без НДС)&lt;/div&gt;&lt;div class="value" id="st-val"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card green"&gt;&lt;div class="label"&gt;Позиций в прайсе&lt;/div&gt;&lt;div class="value" id="st-cat"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div id="steel-alerts" style="margin-bottom:20px"&gt;&lt;/div&gt;

&lt;details class="rules-accordion"&gt;
&lt;summary&gt;? Правила работы с кабинетом (матчинг, спред, разрывы)&lt;/summary&gt;
&lt;p&gt;
&lt;b&gt;Как это работает:&lt;/b&gt; Каждая позиция у поставщика — это «актив» для бартерной цепочки.&lt;br /&gt;&lt;br /&gt;
&lt;span class="term"&gt;Матчинг&lt;/span&gt; — поиск встречных потребностей. Например, Лариса отдаёт лист 6×1500, а Ирина хочет такую же позицию — система сводит их в цепочку.&lt;br /&gt;&lt;br /&gt;
&lt;span class="term"&gt;Спред&lt;/span&gt; — разница между ценой поставщика и рыночной ценой. Если поставщик ставит цену выше рынка — позиция не уйдёт в бартер (красная плашка).&lt;br /&gt;&lt;br /&gt;
&lt;span class="term"&gt;Красный разрыв&lt;/span&gt; — позиция, которую невозможно включить в цепочку (нет встречных потребностей или цена завышена).&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;Поле «Ваша цена»:&lt;/b&gt; если оставить 0 — берётся цена из прайса. Можно поставить ниже прайса для ускорения бартера.
&lt;/p&gt;
&lt;/details&gt;

&lt;div class="clients-table-wrap" style="margin-top:20px"&gt;&lt;table class="wh-table"&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Поставщик&lt;/th&gt;&lt;th&gt;Позиция&lt;/th&gt;&lt;th&gt;Марка&lt;/th&gt;&lt;th class="num"&gt;Листов&lt;/th&gt;&lt;th class="num"&gt;Вес, кг&lt;/th&gt;&lt;th class="num"&gt;Цена/лист&lt;/th&gt;&lt;th class="num"&gt;Сумма&lt;/th&gt;&lt;th style="text-align:right"&gt;Действия&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody id="steel-tbody"&gt;&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="modal-overlay" id="steel-modal"&gt;&lt;div class="modal"&gt;
&lt;h2&gt;Добавить позицию поставщику&lt;/h2&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Поставщик&lt;/label&gt;&lt;select id="steel-s"&gt;&lt;/select&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Позиция из прайса (цена и вес подставятся)&lt;/label&gt;&lt;select id="steel-item"&gt;&lt;/select&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Количество листов&lt;/label&gt;&lt;input type="number" id="steel-sheets" min="1" value="1" /&gt;&lt;/div&gt;
&lt;div class="form-group"&gt;&lt;label&gt;Ваша цена за лист (0 = цена прайса)&lt;/label&gt;&lt;input type="number" id="steel-my" min="0" value="0" /&gt;&lt;/div&gt;
&lt;div class="modal-actions"&gt;&lt;button class="btn btn-secondary" id="steel-cancel" type="button"&gt;Отмена&lt;/button&gt;&lt;button class="btn" id="steel-save" type="button"&gt;Сохранить&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;div id="fc-barter-engine" class="tc"&gt;
&lt;div class="module-header"&gt;&lt;h1&gt;? Сведение &lt;span class="gold"&gt;цепочек&lt;/span&gt;&lt;/h1&gt;&lt;button class="btn" id="barter-run-btn" type="button"&gt;? Запустить поиск&lt;/button&gt;&lt;/div&gt;
&lt;div class="stats-grid"&gt;
&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Найдено цепочек&lt;/div&gt;&lt;div class="value" id="bt-chains"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card green"&gt;&lt;div class="label"&gt;Оборот бартера&lt;/div&gt;&lt;div class="value" id="bt-volume"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card pink"&gt;&lt;div class="label"&gt;Красных разрывов&lt;/div&gt;&lt;div class="value" id="bt-gaps"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card violet"&gt;&lt;div class="label"&gt;Экономия на НДС&lt;/div&gt;&lt;div class="value" id="bt-saving"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="barter-result" class="ib" style="background:#fdf6e8;border-left-color:var(--gold)"&gt;Нажмите «Запустить поиск» для сведения цепочек между поставщиками.&lt;/div&gt;
&lt;/div&gt;


&lt;div id="fc-usn" class="tc"&gt;&lt;h1&gt;УСН 6%&lt;/h1&gt;&lt;div class="ib"&gt;ИП без сотрудников. Фикс. взносы и 1% с дохода свыше 300 000 руб.&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Год&lt;/label&gt;&lt;select id="u-y"&gt;&lt;option value="2025"&gt;2025&lt;/option&gt;&lt;option value="2026" selected="selected"&gt;2026&lt;/option&gt;&lt;option value="2027"&gt;2027&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;div class="form-row" style="grid-template-columns:repeat(4,1fr)"&gt;&lt;div class="form-group"&gt;&lt;label&gt;1 кв.&lt;/label&gt;&lt;input type="number" id="u-q1" min="0" value="0" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;2 кв.&lt;/label&gt;&lt;input type="number" id="u-q2" min="0" value="0" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;3 кв.&lt;/label&gt;&lt;input type="number" id="u-q3" min="0" value="0" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;4 кв.&lt;/label&gt;&lt;input type="number" id="u-q4" min="0" value="0" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class="btn" id="u-btn" type="button"&gt;Рассчитать&lt;/button&gt;&lt;div id="u-res" style="margin-top:1rem"&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div id="fc-osn" class="tc"&gt;&lt;h1&gt;ОСН&lt;/h1&gt;&lt;div class="ib"&gt;НДС 22%, прибыль 25%, взносы по категориям.&lt;/div&gt;&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Год&lt;/label&gt;&lt;select id="o-y"&gt;&lt;option value="2025"&gt;2025&lt;/option&gt;&lt;option value="2026" selected="selected"&gt;2026&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Категория&lt;/label&gt;&lt;select id="o-cat"&gt;&lt;option value="regular"&gt;Обычная (30%)&lt;/option&gt;&lt;option value="msp"&gt;МСП (15%)&lt;/option&gt;&lt;option value="it"&gt;ИТ (7,6%)&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Сотрудников&lt;/label&gt;&lt;input type="number" id="o-emp" min="1" value="1" /&gt;&lt;/div&gt;&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Выручка 1 полугодие&lt;/label&gt;&lt;input type="number" id="o-r1" min="0" value="0" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Выручка 2 полугодие&lt;/label&gt;&lt;input type="number" id="o-r2" min="0" value="0" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;ФОТ за год&lt;/label&gt;&lt;input type="number" id="o-pay" min="0" value="0" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Расходы без НДС&lt;/label&gt;&lt;input type="number" id="o-en" min="0" value="0" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class="btn" id="o-btn" type="button"&gt;Рассчитать&lt;/button&gt;&lt;div id="o-res" style="margin-top:1rem"&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div id="fc-compare" class="tc"&gt;&lt;h1&gt;Сравнение режимов&lt;/h1&gt;&lt;div class="ib"&gt;Сравнение УСН / ОСН / НПД. Рекомендация по прибыли.&lt;/div&gt;&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Форма&lt;/label&gt;&lt;select id="c-form"&gt;&lt;option value="ip"&gt;ИП&lt;/option&gt;&lt;option value="ooo"&gt;ООО&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Год&lt;/label&gt;&lt;select id="c-y"&gt;&lt;option value="2026" selected="selected"&gt;2026&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="form-row"&gt;&lt;div class="form-group"&gt;&lt;label&gt;Выручка&lt;/label&gt;&lt;input type="number" id="c-rev" min="0" value="10000000" /&gt;&lt;/div&gt;&lt;div class="form-group"&gt;&lt;label&gt;Расходы&lt;/label&gt;&lt;input type="number" id="c-exp" min="0" value="5000000" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class="btn" id="c-btn" type="button"&gt;Сравнить&lt;/button&gt;&lt;div id="c-res" style="margin-top:1rem"&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div id="fc-export" class="tc"&gt;&lt;h1&gt;? Экспорт&lt;/h1&gt;&lt;div class="ib"&gt;Экспорт результатов в PDF, Excel, CSV.&lt;/div&gt;&lt;div style="display:flex;gap:10px;flex-wrap:wrap"&gt;&lt;button class="btn btn-d" id="exp-pdf-btn"&gt;? PDF&lt;/button&gt;&lt;button class="btn btn-green" id="exp-excel-btn"&gt;? Excel&lt;/button&gt;&lt;button class="btn btn-p" id="exp-csv-btn"&gt;? CSV&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/main&gt;
&lt;div class="toast" id="main-toast"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
(function(){
'use strict';
function $(id){return document.getElementById(id);}
function F(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
function showToast(m,e){var t=$('main-toast');if(!t)return;t.textContent=m;t.className='toast show'+(e?' error':'');setTimeout(function(){t.className='toast';},3000);}
function esc(s){return s==null?'':String(s).replace(/[&amp;&lt;&gt;"']/g,function(c){return{'&amp;':'&amp;amp;','&lt;':'&amp;lt;','&gt;':'&amp;gt;','"':'&amp;quot;',"'":'&amp;#39;'}[c];});}
function todayISO(){var d=new Date();return d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2);}

function initNav(){var n=$('main-nav');if(!n)return;n.addEventListener('click',function(e){var l=e.target.closest('.nav-link');if(!l)return;e.preventDefault();var a=n.querySelectorAll('.nav-link');for(var i=0;i&lt;a.length;i++)a[i].classList.remove('active');l.classList.add('active');var tcs=document.querySelectorAll('#fc-w .tc');for(var j=0;j&lt;tcs.length;j++)tcs[j].classList.remove('act');var v=l.getAttribute('data-view'),t=l.getAttribute('data-t'),tgt=null;if(v==='dash'){tgt=$('fc-dash');$('breadcrumbs').textContent='Пандора CRM / Дашборд';}else if(t){tgt=$('fc-'+t);$('breadcrumbs').textContent='Пандора CRM / '+l.textContent;}if(tgt)tgt.classList.add('act');window.scrollTo({top:0,behavior:'smooth'});});}

var SK='fc_state_v1',SV=1;
function saveState(){try{var i=document.querySelectorAll('#fc-w input,#fc-w select'),s={version:SV,data:{}};for(var k=0;k&lt;i.length;k++){if(i[k].id)s.data[i[k].id]=i[k].value;}localStorage.setItem(SK,JSON.stringify(s));var ind=$('fc-save-ind');if(ind){ind.textContent='✓ Сохранено';setTimeout(function(){ind.textContent='';},2000);}}catch(e){}}
function loadState(){try{var r=localStorage.getItem(SK);if(!r)return;var s=JSON.parse(r);if(s.version!==SV)return;var i=document.querySelectorAll('#fc-w input,#fc-w select');for(var k=0;k&lt;i.length;k++){if(i[k].id&amp;&amp;s.data[i[k].id]!==undefined)i[k].value=s.data[i[k].id];}}catch(e){}}

/* ═══════ СДЕЛКИ ═══════ */
(function(){var K='pandora_deals_v1',D=[];
function ld(){try{var r=localStorage.getItem(K);if(r)D=JSON.parse(r);}catch(e){}if(!D.length){D=[{id:1,name:'Поставка серверов',client:'ООО «ТехноПарк»',amount:850000,prob:70,manager:'Иванов',date:'2026-09-15',stage:'negotiation'},{id:2,name:'Внедрение CRM',client:'ИП Смирнов',amount:120000,prob:50,manager:'Петров',date:'2026-08-30',stage:'progress'},{id:3,name:'Консалтинг',client:'АО «Инвест Групп»',amount:350000,prob:90,manager:'Сидоров',date:'2026-09-10',stage:'won'},{id:4,name:'Разработка сайта',client:'ООО «Стартап Лаб»',amount:200000,prob:30,manager:'Иванов',date:'2026-10-01',stage:'new'},{id:5,name:'Аудит',client:'Николаева',amount:180000,prob:10,manager:'Петров',date:'2026-08-20',stage:'lost'}];sv();}}
function sv(){try{localStorage.setItem(K,JSON.stringify(D));}catch(e){}}
function rn(){var s=($('deals-search')?$('deals-search').value:'').toLowerCase(),mf=$('deals-manager-filter')?$('deals-manager-filter').value:'',st=['new','progress','negotiation','won','lost'],stats={total:D.length,won:0,forecast:0};
for(var i=0;i&lt;st.length;i++){var S=st[i],l=$('list-'+S);if(!l)continue;var it=D.filter(function(d){return d.stage===S&amp;&amp;(!mf||d.manager===mf)&amp;&amp;(d.client.toLowerCase().indexOf(s)!==-1||d.name.toLowerCase().indexOf(s)!==-1);});var sum=0;for(var j=0;j&lt;it.length;j++){sum+=it[j].amount;if(S==='won')stats.won++;if(S!=='lost')stats.forecast+=it[j].amount*it[j].prob/100;}var h='';for(var k=0;k&lt;it.length;k++){var d=it[k];h+='&lt;div class="deal-card" draggable="true" data-id="'+d.id+'"&gt;&lt;div class="deal-title"&gt;'+esc(d.name)+'&lt;/div&gt;&lt;div class="deal-client"&gt;'+esc(d.client)+'&lt;/div&gt;&lt;div class="deal-amount"&gt;'+F(d.amount)+' ₽&lt;/div&gt;&lt;div class="deal-meta"&gt;&lt;span class="deal-prob"&gt;'+d.prob+'%&lt;/span&gt;&lt;span&gt;'+esc(d.manager)+'&lt;/span&gt;&lt;/div&gt;'+(d.date?'&lt;div class="deal-date"&gt;? '+d.date+'&lt;/div&gt;':'')+'&lt;/div&gt;';}l.innerHTML=h||'&lt;div style="text-align:center;color:var(--muted);font-size:.8rem;padding:20px 0"&gt;Пусто&lt;/div&gt;';var ce=$('count-'+S);if(ce)ce.textContent=it.length;var se=$('sum-'+S);if(se)se.textContent=F(sum)+' ₽';}if($('stat-total'))$('stat-total').textContent=stats.total;if($('stat-won'))$('stat-won').textContent=stats.won;if($('stat-forecast'))$('stat-forecast').textContent=F(stats.forecast)+' ₽';if($('stat-conv'))$('stat-conv').textContent=stats.total&gt;0?Math.round(stats.won/stats.total*100)+'%':'0%';}
document.addEventListener('DOMContentLoaded',function(){ld();rn();var ab=$('deals-add-btn');if(ab)ab.onclick=function(){$('deal-modal').classList.add('active');$('deal-name').value='';$('deal-client').value='';$('deal-amount').value='';$('deal-prob').value='50';$('deal-manager').value='Иванов';var d=new Date();d.setDate(d.getDate()+30);$('deal-date').value=d.toISOString().split('T')[0];};var cb=$('deal-cancel-btn');if(cb)cb.onclick=function(){$('deal-modal').classList.remove('active');};var sb=$('deal-save-btn');if(sb)sb.onclick=function(){var n=$('deal-name').value.trim(),c=$('deal-client').value.trim(),a=parseInt($('deal-amount').value)||0;if(!n||!c||a&lt;=0){showToast('✗ Заполните поля',true);return;}D.push({id:Date.now(),name:n,client:c,amount:a,prob:parseInt($('deal-prob').value)||50,manager:$('deal-manager').value,date:$('deal-date').value,stage:'new'});sv();rn();$('deal-modal').classList.remove('active');showToast('✓ Сделка создана');};});})();

/* ═══════ КЛИЕНТЫ ═══════ */
(function(){var K='pandora_clients_v1',C=[];var TL={legal:'Юр. лицо',ip:'ИП',person:'Физ. лицо'};var SL={active:'Активный',vip:'VIP',inactive:'Неактивный'};
function ld(){try{var r=localStorage.getItem(K);if(r)C=JSON.parse(r);}catch(e){}if(!C.length){C=[{id:1,name:'ООО «ТехноПарк»',type:'legal',inn:'7712345678',contact:'Смирнов Алексей',phone:'+7 495 123-45-67',email:'info@technopark.ru',manager:'Иванов',status:'vip',createdAt:'2026-01-15'},{id:2,name:'ИП Смирнов',type:'ip',inn:'771234567890',contact:'Смирнов Алексей',phone:'+7 916 000-11-22',email:'smirnov@mail.ru',manager:'Петров',status:'active',createdAt:'2026-03-20'},{id:3,name:'АО «Инвест Групп»',type:'legal',inn:'7798765432',contact:'Кузнецова Мария',phone:'+7 495 987-65-43',email:'invest@group.ru',manager:'Сидоров',status:'active',createdAt:'2026-05-10'},{id:4,name:'ООО «Стартап Лаб»',type:'legal',inn:'7755554444',contact:'Петров Дмитрий',phone:'+7 925 555-44-33',email:'hello@startuplab.ru',manager:'Иванов',status:'active',createdAt:'2026-06-01'},{id:5,name:'Николаева Елена',type:'person',contact:'Николаева Елена',phone:'+7 903 111-22-33',email:'nikolaeva@gmail.com',manager:'Петров',status:'inactive',createdAt:'2026-02-14'}];sv();}}
function sv(){try{localStorage.setItem(K,JSON.stringify(C));}catch(e){}}
function rn(){var tb=$('clients-tbody');if(!tb)return;if($('cstat-total'))$('cstat-total').textContent=C.length;if($('cstat-legal'))$('cstat-legal').textContent=C.filter(function(c){return c.type==='legal';}).length;if($('cstat-ip'))$('cstat-ip').textContent=C.filter(function(c){return c.type==='ip';}).length;if($('cstat-vip'))$('cstat-vip').textContent=C.filter(function(c){return c.status==='vip';}).length;var h='';for(var i=0;i&lt;C.length;i++){var c=C[i];h+='&lt;tr&gt;&lt;td&gt;&lt;div class="client-name-cell"&gt;'+esc(c.name)+(c.email?'&lt;div class="sub"&gt;'+esc(c.email)+'&lt;/div&gt;':'')+'&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="type-badge '+c.type+'"&gt;'+TL[c.type]+'&lt;/span&gt;&lt;/td&gt;&lt;td&gt;'+esc(c.inn||'—')+'&lt;/td&gt;&lt;td&gt;'+esc(c.contact||'—')+'&lt;/td&gt;&lt;td&gt;'+esc(c.manager||'—')+'&lt;/td&gt;&lt;td&gt;&lt;span class="status-badge '+c.status+'"&gt;&lt;span class="dot"&gt;&lt;/span&gt;'+SL[c.status]+'&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="row-actions"&gt;&lt;button class="icon-btn del" data-del="'+c.id+'"&gt;?&lt;/button&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;';}tb.innerHTML=h||'&lt;tr&gt;&lt;td colspan="7"&gt;&lt;div class="empty-state"&gt;Нет клиентов&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;';var dbs=tb.querySelectorAll('[data-del]');for(var j=0;j&lt;dbs.length;j++)dbs[j].onclick=function(e){e.stopPropagation();var id=parseInt(this.dataset.del);C=C.filter(function(x){return x.id!==id;});sv();rn();showToast('✓ Удалено');};}
document.addEventListener('DOMContentLoaded',function(){ld();rn();var ab=$('clients-add-btn');if(ab)ab.onclick=function(){$('client-form-title').textContent='Новый клиент';$('client-edit-id').value='';$('client-name').value='';$('client-type').value='legal';$('client-status').value='active';$('client-form-modal').classList.add('active');};var cb=$('client-cancel-btn');if(cb)cb.onclick=function(){$('client-form-modal').classList.remove('active');};var sb=$('client-save-btn');if(sb)sb.onclick=function(){var n=$('client-name').value.trim();if(!n){showToast('✗ Укажите имя',true);return;}C.push({id:Date.now(),name:n,type:$('client-type').value,status:$('client-status').value,inn:$('client-inn').value,contact:$('client-contact').value,phone:$('client-phone').value,email:$('client-email').value,manager:$('client-manager').value,createdAt:todayISO()});sv();rn();$('client-form-modal').classList.remove('active');showToast('✓ Добавлен');};});})();

/* ═══════ ЗАДАЧИ ═══════ */
(function(){var K='pandora_tasks_v1',T=[],sel='call';
function ld(){try{var r=localStorage.getItem(K);if(r)T=JSON.parse(r);}catch(e){}if(!T.length){var t=todayISO();T=[{id:1,title:'Позвонить по КП',desc:'Уточнить решение',type:'call',priority:'high',status:'todo',assignee:'Иванов',dueDate:t,createdAt:t},{id:2,title:'Встреча в офисе',desc:'Обсудить договор',type:'meeting',priority:'medium',status:'progress',assignee:'Петров',dueDate:t,createdAt:t},{id:3,title:'Отправить счёт',desc:'Счёт на предоплату',type:'payment',priority:'high',status:'todo',assignee:'Сидоров',dueDate:'2026-08-15',createdAt:t},{id:4,title:'Написать follow-up',desc:'Поблагодарить',type:'email',priority:'low',status:'done',assignee:'Иванов',dueDate:'2026-08-16',createdAt:t},{id:5,title:'Подготовить презентацию',desc:'Слайды по продукту',type:'task',priority:'medium',status:'progress',assignee:'Петров',dueDate:'2026-08-25',createdAt:t}];sv();}}
function sv(){try{localStorage.setItem(K,JSON.stringify(T));}catch(e){}}
function isO(t){return t.dueDate&amp;&amp;t.dueDate&lt;todayISO()&amp;&amp;t.status!=='done';}
function isT(t){return t.dueDate===todayISO()&amp;&amp;t.status!=='done';}
function rn(){if($('tstat-total'))$('tstat-total').textContent=T.length;if($('tstat-overdue'))$('tstat-overdue').textContent=T.filter(isO).length;if($('tstat-today'))$('tstat-today').textContent=T.filter(isT).length;if($('tstat-done'))$('tstat-done').textContent=T.filter(function(t){return t.status==='done';}).length;var st=[['todo','list-todo','count-todo'],['progress','list-progress-t','count-progress-t'],['done','list-done','count-done']];for(var s=0;s&lt;st.length;s++){var S=st[s][0],l=$(st[s][1]),ce=$(st[s][2]);if(!l)continue;var it=T.filter(function(t){return t.status===S;});var h='';for(var i=0;i&lt;it.length;i++){var t=it[i];var cls='task-card p-'+t.priority;if(isO(t))cls+=' overdue';else if(isT(t))cls+=' today';h+='&lt;div class="'+cls+'" data-id="'+t.id+'"&gt;&lt;div class="task-top"&gt;&lt;span class="task-type-icon"&gt;'+(t.type==='call'?'?':t.type==='meeting'?'?':t.type==='email'?'?':t.type==='payment'?'?':'?')+'&lt;/span&gt;&lt;div class="task-title"&gt;'+esc(t.title)+'&lt;/div&gt;&lt;div class="task-actions"&gt;'+(t.status!=='done'?'&lt;button class="done-btn" data-done="'+t.id+'"&gt;✓&lt;/button&gt;':'')+'&lt;button class="del-btn" data-del="'+t.id+'"&gt;?&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;'+(t.desc?'&lt;div class="task-desc"&gt;'+esc(t.desc)+'&lt;/div&gt;':'')+'&lt;div class="task-footer"&gt;&lt;span class="task-due"&gt;? '+t.dueDate+'&lt;/span&gt;&lt;span class="task-assignee"&gt;'+esc(t.assignee)+'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;';}l.innerHTML=h||'&lt;div style="text-align:center;color:var(--muted);font-size:.8rem;padding:20px 0"&gt;Пусто&lt;/div&gt;';if(ce)ce.textContent=it.length;}var d=document.querySelectorAll('#fc-tasks [data-done]');for(var j=0;j&lt;d.length;j++)d[j].onclick=function(){var id=parseInt(this.dataset.done);var t=T.find(function(x){return x.id===id;});if(t){t.status='done';sv();rn();showToast('✓ Выполнено');}};var dl=document.querySelectorAll('#fc-tasks [data-del]');for(var k=0;k&lt;dl.length;k++)dl[k].onclick=function(){var id=parseInt(this.dataset.del);T=T.filter(function(x){return x.id!==id;});sv();rn();};}
document.addEventListener('DOMContentLoaded',function(){ld();rn();var ab=$('tasks-add-btn');if(ab)ab.onclick=function(){$('task-form-title').textContent='Новая задача';$('task-edit-id').value='';$('task-title').value='';$('task-desc').value='';$('task-priority').value='medium';$('task-assignee').value='Иванов';$('task-status').value='todo';var d=new Date();d.setDate(d.getDate()+3);$('task-due').value=d.toISOString().split('T')[0];$('task-form-modal').classList.add('active');};var cb=$('task-cancel-btn');if(cb)cb.onclick=function(){$('task-form-modal').classList.remove('active');};var sb=$('task-save-btn');if(sb)sb.onclick=function(){var t=$('task-title').value.trim();if(!t){showToast('✗ Название',true);return;}T.push({id:Date.now(),title:t,desc:$('task-desc').value,type:sel,priority:$('task-priority').value,status:$('task-status').value,assignee:$('task-assignee').value,dueDate:$('task-due').value,createdAt:todayISO()});sv();rn();$('task-form-modal').classList.remove('active');showToast('✓ Добавлена');};var to=document.querySelectorAll('#fc-tasks .type-option');for(var i=0;i&lt;to.length;i++)to[i].onclick=function(){sel=this.dataset.type;for(var j=0;j&lt;to.length;j++)to[j].classList.remove('selected');this.classList.add('selected');};});})();

/* ═══════ СКЛАД ═══════ */
(function(){var PK='pandora_warehouse_v1',MK='pandora_warehouse_moves_v1',P=[],M=[],mt='in';
function ld(){try{var p=localStorage.getItem(PK);if(p)P=JSON.parse(p);var m=localStorage.getItem(MK);if(m)M=JSON.parse(m);}catch(e){}if(!P.length){P=[{id:1,name:'Ноутбук ASUS X515',sku:'ASU-001',category:'Электроника',unit:'шт',qty:12,minQty:5,price:65000,cost:50000},{id:2,name:'Монитор Dell 24"',sku:'DEL-024',category:'Электроника',unit:'шт',qty:3,minQty:5,price:18500,cost:13000},{id:3,name:'Клавиатура Logitech K380',sku:'LOG-380',category:'Периферия',unit:'шт',qty:25,minQty:10,price:3200,cost:2100},{id:4,name:'Мышь беспроводная',sku:'MOU-001',category:'Периферия',unit:'шт',qty:0,minQty:8,price:1500,cost:900},{id:5,name:'Кабель HDMI 2м',sku:'CAB-H2',category:'Аксессуары',unit:'шт',qty:40,minQty:15,price:650,cost:300},{id:6,name:'Бумага А4 (пачка)',sku:'PAP-A4',category:'Офис',unit:'упак',qty:7,minQty:10,price:450,cost:320}];M=[{id:1,productId:1,type:'in',qty:5,date:todayISO(),comment:'Поставка'},{id:2,productId:2,type:'out',qty:2,date:todayISO(),comment:'Продажа'}];sv();}}
function sv(){try{localStorage.setItem(PK,JSON.stringify(P));localStorage.setItem(MK,JSON.stringify(M));}catch(e){}}
function gs(p){return p.qty===0?'out':(p.qty&lt;=p.minQty?'low':'ok');}
var SM={ok:{l:'В наличии'},low:{l:'Заканчивается'},out:{l:'Нет'}};
function rn(){if($('wstat-items'))$('wstat-items').textContent=P.length;var tv=0;for(var i=0;i&lt;P.length;i++)tv+=P[i].qty*P[i].cost;if($('wstat-value'))$('wstat-value').textContent=F(tv)+' ₽';if($('wstat-low'))$('wstat-low').textContent=P.filter(function(p){return gs(p)==='low';}).length;if($('wstat-out'))$('wstat-out').textContent=P.filter(function(p){return gs(p)==='out';}).length;var tb=$('wh-tbody');if(!tb)return;var h='';for(var i=0;i&lt;P.length;i++){var p=P[i],st=gs(p),tot=p.qty*p.cost;h+='&lt;tr&gt;&lt;td&gt;&lt;div class="prod-name-cell"&gt;'+esc(p.name)+'&lt;div class="sub"&gt;'+esc(p.sku||'—')+'&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;'+(p.category?'&lt;span class="cat-badge"&gt;'+esc(p.category)+'&lt;/span&gt;':'—')+'&lt;/td&gt;&lt;td class="num"&gt;&lt;span class="qty-badge '+st+'"&gt;'+p.qty+' '+esc(p.unit)+'&lt;/span&gt;&lt;/td&gt;&lt;td class="num" style="color:var(--dim)"&gt;'+p.minQty+'&lt;/td&gt;&lt;td class="num"&gt;'+F(p.price)+' ₽&lt;/td&gt;&lt;td class="num" style="color:var(--gold)"&gt;'+F(tot)+' ₽&lt;/td&gt;&lt;td&gt;&lt;span class="status-badge '+st+'"&gt;&lt;span class="dot"&gt;&lt;/span&gt;'+SM[st].l+'&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="row-actions"&gt;&lt;button class="icon-btn in" data-in="'+p.id+'"&gt;⬇&lt;/button&gt;&lt;button class="icon-btn out" data-out="'+p.id+'"&gt;⬆&lt;/button&gt;&lt;button class="icon-btn del" data-del="'+p.id+'"&gt;?&lt;/button&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;';}tb.innerHTML=h||'&lt;tr&gt;&lt;td colspan="8"&gt;&lt;div class="empty-state"&gt;Нет товаров&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;';var rl=$('wh-moves-list');if(rl){var rc=M.slice().reverse().slice(0,10);var hm='';for(var j=0;j&lt;rc.length;j++){var m=rc[j],pr=P.find(function(x){return x.id===m.productId;});hm+='&lt;div class="move-row"&gt;&lt;div class="left"&gt;&lt;span class="type-ico '+m.type+'"&gt;'+(m.type==='in'?'+':'−')+'&lt;/span&gt;&lt;div&gt;&lt;div class="m-prod"&gt;'+esc(pr?pr.name:'(удалён)')+'&lt;/div&gt;'+(m.comment?'&lt;div class="m-comment"&gt;'+esc(m.comment)+'&lt;/div&gt;':'')+'&lt;/div&gt;&lt;/div&gt;&lt;div class="right"&gt;&lt;span class="m-qty '+m.type+'"&gt;'+(m.type==='in'?'+':'−')+m.qty+'&lt;/span&gt;&lt;span class="m-date"&gt;'+m.date+'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;';}rl.innerHTML=hm||'&lt;div style="color:var(--dim)"&gt;Нет движений&lt;/div&gt;';}var ib=tb.querySelectorAll('[data-in]');for(var k=0;k&lt;ib.length;k++)ib[k].onclick=function(){doMove(parseInt(this.dataset.in),'in');};var ob=tb.querySelectorAll('[data-out]');for(var l=0;l&lt;ob.length;l++)ob[l].onclick=function(){doMove(parseInt(this.dataset.out),'out');};var db=tb.querySelectorAll('[data-del]');for(var m2=0;m2&lt;db.length;m2++)db[m2].onclick=function(){var id=parseInt(this.dataset.del);P=P.filter(function(x){return x.id!==id;});sv();rn();};}
function doMove(pid,t){var qty=prompt('Количество:','1');if(!qty)return;var q=parseInt(qty);if(!q||q&lt;=0)return;var p=P.find(function(x){return x.id===pid;});if(!p)return;if(t==='out'&amp;&amp;q&gt;p.qty){showToast('✗ Нельзя списать больше',true);return;}if(t==='in')p.qty+=q;else p.qty-=q;M.push({id:Date.now(),productId:pid,type:t,qty:q,date:todayISO(),comment:''});sv();rn();showToast('✓ Проведено');}
document.addEventListener('DOMContentLoaded',function(){ld();rn();var ab=$('wh-add-btn');if(ab)ab.onclick=function(){$('wh-product-title').textContent='Новый товар';$('wh-edit-id').value='';$('wh-name').value='';$('wh-sku').value='';$('wh-category').value='';$('wh-unit').value='шт';$('wh-qty').value='0';$('wh-minqty').value='5';$('wh-price').value='0';$('wh-cost').value='0';$('wh-product-modal').classList.add('active');};var cb=$('wh-cancel-btn');if(cb)cb.onclick=function(){$('wh-product-modal').classList.remove('active');};var sb=$('wh-save-btn');if(sb)sb.onclick=function(){var n=$('wh-name').value.trim();if(!n){showToast('✗ Название',true);return;}P.push({id:Date.now(),name:n,sku:$('wh-sku').value,category:$('wh-category').value,unit:$('wh-unit').value,qty:parseInt($('wh-qty').value)||0,minQty:parseInt($('wh-minqty').value)||0,price:parseFloat($('wh-price').value)||0,cost:parseFloat($('wh-cost').value)||0});sv();rn();$('wh-product-modal').classList.remove('active');showToast('✓ Добавлен');};});})();

/* ═══════════ БЛОК 3: СТАЛЬ И ПОСТАВЩИКИ ═══════════ */
(function(){
var K='pandora_steel_v1';
var CAT=[
['Лист 2,3x1220x2080','C500',48,59900,73078],['Лист 4,3x1220x2080','C500',92,95800,116876],
['Лист 6,3x1220x2080','C500',131,116500,142130],['Лист 8,3x1220x2100','C500',170,165000,201300],
['Лист 4*1300*6000','C500',260,131500,160430],['Лист 5*1500*6000','C500',375,173250,211365],
['Лист 6*1500*6000','C500',430,215000,262300],['Лист 8*1500*6000','C500',570,262700,320494],
['Лист 8x2000x6000','C500',760,350200,427244],['Лист 10*1500*6000','C500',710,332500,405650],
['Лист 10x2000x6000','C500',950,443000,540460],['Лист 12x2000x6000','C500',1150,555000,677100],
['Лист 14x2000x6000','C500',1350,640400,781288],['Лист 15x2000x6000','C500',1413,660000,805200],
['Лист 16x2000x6000','C500',1520,752000,917440],['Лист 20x2000x6000','C500',1900,895000,1091900],
['Лист 25x2000x6000','C500',2380,999600,1219512],['Лист 30x2000x6000','C500',2850,1197000,1460340],
['Лист 40x2000x6000','C500',3840,1612800,1967616],['Лист 50x2000x6000','C500',4800,2016000,2459520],
['Лист 60x2000x6000','C500',5690,2732160,3333235],['Лист 70x2000x6000','C500',6594,3033240,3700553],
['Лист 2*1250*6000','БТВт-450',120,74400,90768],['Лист 3*1250*6000','БТВт-450',184,114100,139202],
['Лист 4*1500*6000','БТВт-450',285,176700,215574],['Лист 5*1250*6000','БТВт-450',296,183520,223894],
['Лист 5*1500*6000','БТВт-450',356,220720,269278],['Лист 6*1250*6000','БТВт-450',355,220100,268522],
['Лист 6*1500*6000','БТВт-450',427,264748,322993],['Лист 8*1500*6000','БТВт-450',571,354100,432002],
['Лист 10*1250*6000','БТВт-450',590,365800,446276],['Лист 12*1250*6000','БТВт-450',714,442680,540070]
];
var stock=[];
function ld(){try{var r=localStorage.getItem(K);if(r)stock=JSON.parse(r);}catch(e){}if(!stock.length){stock=[
{sup:'Лариса',item:'Лист 6*1500*6000',sheets:10,my:0},{sup:'Лариса',item:'Лист 10*1500*6000',sheets:5,my:0},{sup:'Лариса',item:'Лист 4*1300*6000',sheets:8,my:0},
{sup:'Ирина',item:'Лист 8*1500*6000',sheets:8,my:0},{sup:'Ирина',item:'Лист 12*1250*6000',sheets:4,my:0},{sup:'Ирина',item:'Лист 5*1500*6000',sheets:7,my:0},
{sup:'Ольга',item:'Лист 2,3x1220x2080',sheets:20,my:0},{sup:'Ольга',item:'Лист 6,3x1220x2080',sheets:15,my:0},{sup:'Ольга',item:'Лист 20x2000x6000',sheets:3,my:0},{sup:'Ольга',item:'Лист 8x2000x6000',sheets:3,my:0}
];sv();}}
function sv(){try{localStorage.setItem(K,JSON.stringify(stock));}catch(e){}}
function cf(n){for(var i=0;i&lt;CAT.length;i++)if(CAT[i][0]===n)return CAT[i];return null;}
function rn(){var sup=$('steel-sup').value;var l=stock.filter(function(x){return sup==='all'||x.sup===sup;});var kg=0,v=0;var tb=$('steel-tbody');var h='';
for(var i=0;i&lt;l.length;i++){var x=l[i],c=cf(x.item);if(!c)continue;var w=c[2]*x.sheets,pr=(x.my&gt;0?x.my:c[3]),sum=pr*x.sheets;kg+=w;v+=sum;
h+='&lt;tr&gt;&lt;td&gt;&lt;strong&gt;'+esc(x.sup)+'&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;'+esc(x.item)+'&lt;/td&gt;&lt;td&gt;&lt;span class="cat-badge"&gt;'+esc(c[1])+'&lt;/span&gt;&lt;/td&gt;&lt;td class="num"&gt;'+x.sheets+'&lt;/td&gt;&lt;td class="num"&gt;'+F(w)+'&lt;/td&gt;&lt;td class="num"&gt;'+F(pr)+' ₽&lt;/td&gt;&lt;td class="num" style="color:var(--gold)"&gt;'+F(sum)+' ₽&lt;/td&gt;&lt;td&gt;&lt;div class="row-actions"&gt;&lt;button class="icon-btn del" data-del="'+i+'"&gt;?&lt;/button&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;';}
tb.innerHTML=h||'&lt;tr&gt;&lt;td colspan="8"&gt;&lt;div class="empty-state"&gt;Нет позиций&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;';
var dbs=tb.querySelectorAll('[data-del]');for(var d=0;d&lt;dbs.length;d++)dbs[d].onclick=function(){stock.splice(parseInt(this.dataset.del),1);sv();rn();showToast('✓ Удалено');};
$('st-sup').textContent=['Лариса','Ирина','Ольга'].length;$('st-ton').textContent=(kg/1000).toFixed(1)+' т';$('st-val').textContent=F(v)+' ₽';$('st-cat').textContent=CAT.length;
// Умные плашки
var al=$('steel-alerts');var ah='';
for(var j=0;j&lt;stock.length;j++){var s2=stock[j],c2=cf(s2.item);if(!c2)continue;
if(s2.my&gt;c2[3]*1.1)ah+='&lt;div class="alert-banner critical"&gt;&lt;div class="alert-text"&gt;⚠ &lt;b&gt;'+esc(s2.sup)+'&lt;/b&gt; — «'+esc(s2.item)+'» цена выше рынка на '+Math.round((s2.my/c2[3]-1)*100)+'%&lt;/div&gt;&lt;div class="alert-actions"&gt;&lt;button class="btn btn-s btn-secondary" onclick="window.supMatch('+j+')"&gt;Снизить до рынка&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;';
else if(s2.my===0&amp;&amp;s2.sheets&lt;=3)ah+='&lt;div class="alert-banner"&gt;&lt;div class="alert-text"&gt;? &lt;b&gt;'+esc(s2.sup)+'&lt;/b&gt; — «'+esc(s2.item)+'» заканчивается ('+s2.sheets+' л.)&lt;/div&gt;&lt;div class="alert-actions"&gt;&lt;button class="btn btn-s btn-green" onclick="window.supRestock('+j+')"&gt;+10 шт&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;';}
al.innerHTML=ah;}
window.supRestock=function(i){stock[i].sheets+=10;sv();rn();showToast('✓ +10 шт');};
window.supMatch=function(i){var c=cf(stock[i].item);if(c){stock[i].my=c[3];sv();rn();showToast('✓ Цена снижена до рынка');}};
document.addEventListener('DOMContentLoaded',function(){ld();rn();
var sel=$('steel-sup');if(sel)sel.onchange=rn;
var ab=$('steel-add-btn');if(ab)ab.onclick=function(){$('steel-s').innerHTML=['Лариса','Ирина','Ольга'].map(function(s){return '&lt;option&gt;'+s+'&lt;/option&gt;';}).join('');$('steel-item').innerHTML=CAT.map(function(c){return '&lt;option&gt;'+c[0]+'&lt;/option&gt;';}).join('');$('steel-sheets').value='1';$('steel-my').value='0';$('steel-modal').classList.add('active');};
var cb=$('steel-cancel');if(cb)cb.onclick=function(){$('steel-modal').classList.remove('active');};
var sb=$('steel-save');if(sb)sb.onclick=function(){stock.push({sup:$('steel-s').value,item:$('steel-item').value,sheets:parseInt($('steel-sheets').value)||1,my:parseInt($('steel-my').value)||0});sv();rn();$('steel-modal').classList.remove('active');showToast('✓ Добавлено');};
var ov=$('steel-modal');if(ov)ov.onclick=function(e){if(e.target===ov)ov.classList.remove('active');};
});})();

/* ═══════ СВЕДЕНИЕ ЦЕПОЧЕК ═══════ */
(function(){
document.addEventListener('DOMContentLoaded',function(){var btn=$('barter-run-btn');if(btn)btn.onclick=function(){
var K='pandora_steel_v1',stock=[];try{var r=localStorage.getItem(K);if(r)stock=JSON.parse(r);}catch(e){}
if(!stock.length){showToast('✗ Нет данных по стали',true);return;}
var chains=0,volume=0,saving=0;
// Простой алгоритм: ищем совпадения позиций между поставщиками
var byItem={};for(var i=0;i&lt;stock.length;i++){var s=stock[i];if(!byItem[s.item])byItem[s.item]=[];byItem[s.item].push(s);}
var result='&lt;b&gt;Анализ завершён:&lt;/b&gt;&lt;br&gt;';
for(var item in byItem){var arr=byItem[item];if(arr.length&gt;=2){chains++;var sum=0;for(var j=0;j&lt;arr.length;j++)sum+=arr[j].sheets*(arr[j].my||200000);volume+=sum;saving+=Math.round(sum*0.2);}
else{result+='&lt;div style="color:var(--red);margin-top:8px"&gt;⚠ «'+item+'» — красный разрыв (нет встречных потребностей)&lt;/div&gt;';}}
$('bt-chains').textContent=chains;$('bt-volume').textContent=F(volume)+' ₽';$('bt-saving').textContent=F(saving)+' ₽';$('bt-gaps').textContent=Object.keys(byItem).length-chains;
if(chains&gt;0)result+='&lt;div style="color:var(--green);margin-top:8px;font-weight:700"&gt;✓ Найдено '+chains+' цепочек. Экономия на НДС: '+F(saving)+' ₽&lt;/div&gt;';
else result='&lt;b style="color:var(--red)"&gt;⚠ Цепочек не найдено.&lt;/b&gt; Поставщики не имеют встречных потребностей по одним позициям. Попробуйте добавить больше позиций или расширить прайс.';
$('barter-result').innerHTML=result;showToast('✓ Анализ завершён');};});})();

/* ═══════ УСН ═══════ */
document.addEventListener('DOMContentLoaded',function(){
var ub=$('u-btn');if(ub)ub.onclick=function(){var y=+$('u-y').value,q=[+$('u-q1').value,+$('u-q2').value,+$('u-q3').value,+$('u-q4').value];var tot=q[0]+q[1]+q[2]+q[3],tax=tot*0.06,fi=57390,extra=tot&gt;300000?(tot-300000)*0.01:0,ded=fi+extra,pay=Math.max(0,tax-ded);$('u-res').innerHTML='&lt;div style="background:var(--panel2);padding:1rem;border-radius:10px"&gt;&lt;b&gt;Доход:&lt;/b&gt; '+F(tot)+' ₽&lt;br&gt;&lt;b&gt;Налог 6%:&lt;/b&gt; '+F(tax)+' ₽&lt;br&gt;&lt;b&gt;Фикс. взносы:&lt;/b&gt; '+F(fi)+' ₽&lt;br&gt;&lt;b&gt;1% свыше 300к:&lt;/b&gt; '+F(extra)+' ₽&lt;br&gt;&lt;b style="color:var(--gold)"&gt;К уплате:&lt;/b&gt; &lt;span style="color:var(--green);font-size:1.2rem"&gt;'+F(pay)+' ₽&lt;/span&gt;&lt;/div&gt;';};

var ob=$('o-btn');if(ob)ob.onclick=function(){var r1=+$('o-r1').value,r2=+$('o-r2').value,rev=r1+r2,nds=Math.round(rev*22/122),pay=+$('o-pay').value,en=+$('o-en').value,prof=rev-nds-en-pay*1.3,prtax=Math.max(0,prof)*0.25,net=prof-prtax;$('o-res').innerHTML='&lt;div style="background:var(--panel2);padding:1rem;border-radius:10px"&gt;&lt;b&gt;Выручка (с НДС):&lt;/b&gt; '+F(rev)+' ₽&lt;br&gt;&lt;b&gt;НДС к уплате:&lt;/b&gt; '+F(nds)+' ₽&lt;br&gt;&lt;b&gt;Прибыль:&lt;/b&gt; '+F(prof)+' ₽&lt;br&gt;&lt;b&gt;Налог на прибыль:&lt;/b&gt; '+F(prtax)+' ₽&lt;br&gt;&lt;b style="color:var(--gold)"&gt;Чистая прибыль:&lt;/b&gt; &lt;span style="color:var(--green);font-size:1.2rem"&gt;'+F(net)+' ₽&lt;/span&gt;&lt;/div&gt;';};

var cb=$('c-btn');if(cb)cb.onclick=function(){var rev=+$('c-rev').value,exp=+$('c-exp').value,usn6=rev*0.06,usn15=Math.max(0,rev-exp)*0.15,osn=Math.max(0,rev-exp-rev*22/122)*0.25;$('c-res').innerHTML='&lt;div style="background:var(--panel2);padding:1rem;border-radius:10px"&gt;&lt;b&gt;УСН 6%:&lt;/b&gt; '+F(usn6)+' ₽&lt;br&gt;&lt;b&gt;УСН 15%:&lt;/b&gt; '+F(usn15)+' ₽&lt;br&gt;&lt;b&gt;ОСН (прибыль):&lt;/b&gt; '+F(osn)+' ₽&lt;br&gt;&lt;b style="color:var(--gold)"&gt;Рекомендация:&lt;/b&gt; '+((usn6&lt;usn15&amp;&amp;usn6&lt;osn)?'&lt;span style="color:var(--green)"&gt;УСН 6%&lt;/span&gt;':(usn15&lt;osn?'&lt;span style="color:var(--green)"&gt;УСН 15%&lt;/span&gt;':'&lt;span style="color:var(--green)"&gt;ОСН&lt;/span&gt;'))+'&lt;/div&gt;';};

var ep=$('exp-pdf-btn');if(ep)ep.onclick=function(){window.print();};
var ex=$('exp-excel-btn');if(ex)ex.onclick=function(){if(typeof XLSX==='undefined'){showToast('✗ SheetJS не загружен',true);return;}var wb=XLSX.utils.book_new();var ws=XLSX.utils.aoa_to_sheet([['Pandora CRM'],['Дата',new Date().toLocaleString('ru-RU')],['Выручка','1 250 000 ₽'],['Налог','185 610 ₽']]);XLSX.utils.book_append_sheet(wb,ws,'Данные');XLSX.writeFile(wb,'pandora-export.xlsx');showToast('✓ Excel сохранён');};
var ec=$('exp-csv-btn');if(ec)ec.onclick=function(){var csv='\uFEFFПараметр;Значение\nВыручка;1250000\nНалог;185610';var b=new Blob([csv],{type:'text/csv'});var l=document.createElement('a');l.href=URL.createObjectURL(b);l.download='pandora-export.csv';l.click();showToast('✓ CSV сохранён');};
});

function initCore(){initNav();loadState();var sb=$('fc-save-btn');if(sb)sb.onclick=function(){saveState();showToast('✓ Сохранено');};var rb=$('fc-reset-btn');if(rb)rb.onclick=function(){if(confirm('Сбросить?')){localStorage.clear();location.reload();}};var rs=$('role-switcher');if(rs)rs.onchange=function(){var t='Бизнесмена';if(this.value==='acc')t='Бухгалтера';if(this.value==='mgm')t='Управленца';$('dash-role-title').textContent=t;};var inps=document.querySelectorAll('#fc-w input,#fc-w select');for(var i=0;i&lt;inps.length;i++)inps[i].addEventListener('change',saveState);}
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',initCore);else initCore();
})();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;script&gt;
/* ═══════════ БЛОК 4: ГРАФ БАРТЕРНЫХ ЦЕПОЧЕК ═══════════ */
(function(){
'use strict';
function $(id){return document.getElementById(id);}
function F(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
function esc(s){return s==null?'':String(s).replace(/[&amp;&lt;&gt;"']/g,function(c){return{'&amp;':'&amp;amp;','&lt;':'&amp;lt;','&gt;':'&amp;gt;','"':'&amp;quot;',"'":'&amp;#39;'}[c];});}
function showToast(m,e){var t=$('main-toast');if(!t)return;t.textContent=m;t.className='toast show'+(e?' error':'');setTimeout(function(){t.className='toast';},3000);}

var GRAPH_HTML = `
&lt;div id="fc-graph" class="tc"&gt;
&lt;div class="module-header"&gt;
&lt;h1&gt;? Граф &lt;span class="gold"&gt;бартерных цепочек&lt;/span&gt;&lt;/h1&gt;
&lt;div class="header-actions"&gt;
&lt;button class="btn btn-secondary btn-s" id="graph-clear-btn" type="button"&gt;Очистить&lt;/button&gt;
&lt;button class="btn" id="graph-build-btn" type="button"&gt;? Построить граф&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="stats-grid"&gt;
&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Поставщиков в сети&lt;/div&gt;&lt;div class="value" id="g-sup"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card violet"&gt;&lt;div class="label"&gt;Связей найдено&lt;/div&gt;&lt;div class="value" id="g-links"&gt;0&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card pink"&gt;&lt;div class="label"&gt;Оборот бартера&lt;/div&gt;&lt;div class="value" id="g-vol"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
&lt;div class="stat-card green"&gt;&lt;div class="label"&gt;Экономия НДС (20%)&lt;/div&gt;&lt;div class="value" id="g-save"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class="ib"&gt;&lt;strong&gt;Как читать граф:&lt;/strong&gt; Каждый круг — поставщик. Линия между ними — совпадение по позиции. Толщина линии = объём сделки. Кликните на связь для детализации. Замкнутые треугольники = трёхсторонние цепочки (максимальная экономия).&lt;/div&gt;

&lt;div style="background:#fff;border:1px solid var(--line-strong);border-radius:14px;padding:20px;margin-top:20px;box-shadow:var(--shadow);overflow-x:auto"&gt;
&lt;svg id="graph-svg" viewBox="0 0 800 500" style="width:100%;height:auto;display:block;min-height:420px"&gt;&lt;/svg&gt;
&lt;/div&gt;

&lt;div id="graph-details" style="margin-top:20px"&gt;&lt;/div&gt;

&lt;details class="rules-accordion" style="margin-top:20px"&gt;
&lt;summary&gt;? Алгоритм сведения цепочек&lt;/summary&gt;
&lt;p&gt;
&lt;b&gt;Шаг 1:&lt;/b&gt; Группируем позиции всех поставщиков по наименованию.&lt;br&gt;
&lt;b&gt;Шаг 2:&lt;/b&gt; Если одна позиция есть у 2+ поставщиков — это бартерная связь.&lt;br&gt;
&lt;b&gt;Шаг 3:&lt;/b&gt; Объём = min(листов у A, листов у B) × цена прайса.&lt;br&gt;
&lt;b&gt;Шаг 4:&lt;/b&gt; Экономия НДС = объём × 20% (при бартере через упрощёнку не платим НДС).&lt;br&gt;
&lt;b&gt;Шаг 5:&lt;/b&gt; Треугольники (Лариса↔Ирина↔Ольга) = замкнутые цепочки с максимальной экономией.
&lt;/p&gt;
&lt;/details&gt;
&lt;/div&gt;
`;

var CAT=[
['Лист 2,3x1220x2080',59900],['Лист 4,3x1220x2080',95800],
['Лист 6,3x1220x2080',116500],['Лист 8,3x1220x2100',165000],
['Лист 4*1300*6000',131500],['Лист 5*1500*6000',173250],
['Лист 6*1500*6000',215000],['Лист 8*1500*6000',262700],
['Лист 8x2000x6000',350200],['Лист 10*1500*6000',332500],
['Лист 10x2000x6000',443000],['Лист 12x2000x6000',555000],
['Лист 14x2000x6000',640400],['Лист 15x2000x6000',660000],
['Лист 16x2000x6000',752000],['Лист 20x2000x6000',895000],
['Лист 25x2000x6000',999600],['Лист 30x2000x6000',1197000],
['Лист 40x2000x6000',1612800],['Лист 50x2000x6000',2016000],
['Лист 60x2000x6000',2732160],['Лист 70x2000x6000',3033240],
['Лист 2*1250*6000',74400],['Лист 3*1250*6000',114100],
['Лист 4*1500*6000',176700],['Лист 5*1250*6000',183520],
['Лист 6*1250*6000',220100],['Лист 8*1500*6000',354100],
['Лист 10*1250*6000',365800],['Лист 12*1250*6000',442680]
];
function priceOf(name){for(var i=0;i&lt;CAT.length;i++)if(CAT[i][0]===name)return CAT[i][1];return 200000;}

function inject(){
  if(document.getElementById('fc-graph'))return;
  var fcw=$('fc-w');
  if(fcw){var d=document.createElement('div');d.innerHTML=GRAPH_HTML;while(d.firstChild)fcw.appendChild(d.firstChild);}
  var nav=$('main-nav');
  if(nav){
    var link=document.createElement('a');
    link.className='nav-link';link.setAttribute('data-t','graph');
    link.textContent='? Граф цепочек';
    var sections=nav.querySelectorAll('.nav-section');
    var inserted=false;
    for(var i=0;i&lt;sections.length;i++){
      if(sections[i].classList.contains('ns-gold')){nav.insertBefore(link,sections[i]);inserted=true;break;}
    }
    if(!inserted)nav.appendChild(link);
  }
  bind();
}

function getStock(){try{var r=localStorage.getItem('pandora_steel_v1');return r?JSON.parse(r):[];}catch(e){return[];}}

var CHAINS=[];
var PAIR_MAP={};

function buildGraph(){
  var stock=getStock();
  if(!stock.length){showToast('✗ Нет данных по стали. Откройте «? Сталь и Поставщики».',true);return;}

  var byItem={};
  for(var i=0;i&lt;stock.length;i++){
    var s=stock[i];
    if(!byItem[s.item])byItem[s.item]=[];
    byItem[s.item].push(s);
  }

  var suppliers=[];
  var supSet={};
  for(var k=0;k&lt;stock.length;k++){if(!supSet[stock[k].sup]){supSet[stock[k].sup]=true;suppliers.push(stock[k].sup);}}

  var links=[];
  var totalVol=0;
  CHAINS=[];
  PAIR_MAP={};

  for(var item in byItem){
    var arr=byItem[item];
    if(arr.length&lt;2)continue;
    for(var a=0;a&lt;arr.length;a++){
      for(var b=a+1;b&lt;arr.length;b++){
        var minSh=Math.min(arr[a].sheets,arr[b].sheets);
        var pr=priceOf(item);
        var vol=minSh*pr;
        var link={from:arr[a].sup,to:arr[b].sup,item:item,sheets:minSh,vol:vol};
        links.push(link);
        CHAINS.push(link);
        totalVol+=vol;
        var key=[arr[a].sup,arr[b].sup].sort().join('|');
        if(!PAIR_MAP[key])PAIR_MAP[key]=[];
        PAIR_MAP[key].push(link);
      }
    }
  }

  var saving=Math.round(totalVol*0.20);
  var triCount=countTriangles(suppliers);

  $('g-sup').textContent=suppliers.length;
  $('g-links').textContent=links.length;
  $('g-vol').textContent=F(totalVol)+' ₽';
  $('g-save').textContent=F(saving)+' ₽';

  renderSVG(suppliers);
  renderDetails();
  showToast('✓ Граф построен: '+links.length+' связей, '+triCount+' треугольников');
}

function countTriangles(suppliers){
  var count=0;
  for(var i=0;i&lt;suppliers.length;i++){
    for(var j=i+1;j&lt;suppliers.length;j++){
      for(var k=j+1;k&lt;suppliers.length;k++){
        var k1=[suppliers[i],suppliers[j]].sort().join('|');
        var k2=[suppliers[j],suppliers[k]].sort().join('|');
        var k3=[suppliers[i],suppliers[k]].sort().join('|');
        if(PAIR_MAP[k1]&amp;&amp;PAIR_MAP[k2]&amp;&amp;PAIR_MAP[k3])count++;
      }
    }
  }
  return count;
}

function renderSVG(suppliers){
  var svg=$('graph-svg');
  if(!svg)return;
  var W=800,H=500;

  var colors={'Лариса':'#c2185b','Ирина':'#5e35b1','Ольга':'#2e7d32'};
  var defaultColor='#a36a00';
  var positions={
    'Лариса':{x:150,y:250},
    'Ирина':{x:650,y:150},
    'Ольга':{x:650,y:380}
  };
  // Если поставщик не в списке — позиционируем по кругу
  suppliers.forEach(function(s,idx){
    if(!positions[s]){
      var angle=(idx/suppliers.length)*2*Math.PI - Math.PI/2;
      positions[s]={x:W/2+Math.cos(angle)*220,y:H/2+Math.sin(angle)*180};
    }
  });

  var html='&lt;defs&gt;';
  html+='&lt;filter id="shadow" x="-20%" y="-20%" width="140%" height="140%"&gt;';
  html+='&lt;feDropShadow dx="0" dy="2" stdDeviation="3" flood-opacity="0.25"/&gt;&lt;/filter&gt;';
  html+='&lt;marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto"&gt;';
  html+='&lt;path d="M0,0 L10,5 L0,10 z" fill="#a36a00"/&gt;&lt;/marker&gt;';
  html+='&lt;/defs&gt;';

  html+='&lt;rect width="'+W+'" height="'+H+'" fill="#fafafb"/&gt;';
  for(var g=0;g&lt;W;g+=40)html+='&lt;line x1="'+g+'" y1="0" x2="'+g+'" y2="'+H+'" stroke="#e8e8ee" stroke-width="1"/&gt;';
  for(var g2=0;g2&lt;H;g2+=40)html+='&lt;line x1="0" y1="'+g2+'" x2="'+W+'" y2="'+g2+'" stroke="#e8e8ee" stroke-width="1"/&gt;';

  var maxVol=1;
  CHAINS.forEach(function(l){if(l.vol&gt;maxVol)maxVol=l.vol;});

  var idx=0;
  for(var key in PAIR_MAP){
    var items=PAIR_MAP[key];
    var pairVol=0;
    items.forEach(function(it){pairVol+=it.vol;});
    var parts=key.split('|');
    var p1=positions[parts[0]],p2=positions[parts[1]];
    if(!p1||!p2)continue;
    var thickness=2+(pairVol/maxVol)*12;
    var offset=(idx%3-1)*20;
    var mx=(p1.x+p2.x)/2+offset;
    var my=(p1.y+p2.y)/2+offset;
    html+='&lt;path d="M'+p1.x+','+p1.y+' Q'+mx+','+my+' '+p2.x+','+p2.y+'" fill="none" stroke="#a36a00" stroke-width="'+thickness+'" stroke-opacity="0.55" class="graph-link" data-pair="'+key+'" style="cursor:pointer"/&gt;';
    html+='&lt;text x="'+mx+'" y="'+(my-10)+'" font-size="11" fill="#a36a00" font-weight="800" text-anchor="middle" style="pointer-events:none;font-family:Inter,sans-serif"&gt;'+F(pairVol)+' ₽&lt;/text&gt;';
    html+='&lt;text x="'+mx+'" y="'+(my+6)+'" font-size="9" fill="#52525a" font-weight="600" text-anchor="middle" style="pointer-events:none;font-family:Inter,sans-serif"&gt;'+items.length+' поз.&lt;/text&gt;';
    idx++;
  }

  suppliers.forEach(function(sup){
    var pp=positions[sup];
    if(!pp)return;
    var color=colors[sup]||defaultColor;
    html+='&lt;circle cx="'+pp.x+'" cy="'+pp.y+'" r="62" fill="'+color+'" stroke="#fff" stroke-width="4" filter="url(#shadow)"/&gt;';
    html+='&lt;text x="'+pp.x+'" y="'+(pp.y+5)+'" font-size="18" fill="#fff" font-weight="800" text-anchor="middle" font-family="Unbounded,sans-serif"&gt;'+esc(sup)+'&lt;/text&gt;';
    var count=CHAINS.filter(function(c){return c.from===sup||c.to===sup;}).length;
    html+='&lt;text x="'+pp.x+'" y="'+(pp.y+25)+'" font-size="11" fill="#fff" font-weight="600" text-anchor="middle" font-family="Inter,sans-serif" opacity="0.9"&gt;'+count+' связей&lt;/text&gt;';
  });

  svg.innerHTML=html;

  var paths=svg.querySelectorAll('.graph-link');
  for(var k=0;k&lt;paths.length;k++){
    paths[k].addEventListener('click',function(){
      var pair=this.getAttribute('data-pair');
      showPairDetails(pair);
    });
    paths[k].addEventListener('mouseenter',function(){this.setAttribute('stroke-opacity','0.95');this.setAttribute('stroke-width',parseFloat(this.getAttribute('stroke-width'))*1.3);});
    paths[k].addEventListener('mouseleave',function(){this.setAttribute('stroke-opacity','0.55');this.setAttribute('stroke-width',parseFloat(this.getAttribute('stroke-width'))/1.3);});
  }
}

function showPairDetails(pair){
  var parts=pair.split('|');
  var items=PAIR_MAP[pair]||[];
  if(!items.length)return;
  var total=0;items.forEach(function(it){total+=it.vol;});
  var html='&lt;div class="alert-banner" style="background:#fdf6e8;border-left-color:var(--gold)"&gt;&lt;div class="alert-text"&gt;&lt;b&gt;Связь: '+esc(parts[0])+' ↔ '+esc(parts[1])+'&lt;/b&gt; · Позиций: '+items.length+' · Объём: '+F(total)+' ₽ · Экономия НДС: '+F(Math.round(total*0.2))+' ₽&lt;/div&gt;&lt;/div&gt;';
  html+='&lt;div class="clients-table-wrap"&gt;&lt;table class="wh-table"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Позиция&lt;/th&gt;&lt;th class="num"&gt;Листов&lt;/th&gt;&lt;th class="num"&gt;Цена/лист&lt;/th&gt;&lt;th class="num"&gt;Объём&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
  items.forEach(function(it){
    var pr=priceOf(it.item);
    html+='&lt;tr&gt;&lt;td&gt;'+esc(it.item)+'&lt;/td&gt;&lt;td class="num"&gt;'+it.sheets+'&lt;/td&gt;&lt;td class="num"&gt;'+F(pr)+' ₽&lt;/td&gt;&lt;td class="num" style="color:var(--gold)"&gt;'+F(it.vol)+' ₽&lt;/td&gt;&lt;/tr&gt;';
  });
  html+='&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;';
  $('graph-details').innerHTML=html;
  $('graph-details').scrollIntoView({behavior:'smooth',block:'nearest'});
}

function renderDetails(){
  var html='&lt;div class="card-section-title" style="margin-top:20px"&gt;? Все найденные связи ('+CHAINS.length+')&lt;/div&gt;';
  if(!CHAINS.length){html+='&lt;div class="empty-state"&gt;&lt;div class="icon"&gt;?&lt;/div&gt;&lt;div&gt;Связей не найдено. Добавьте больше позиций поставщикам.&lt;/div&gt;&lt;/div&gt;';$('graph-details').innerHTML=html;return;}
  html+='&lt;div class="clients-table-wrap"&gt;&lt;table class="wh-table"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;От кого&lt;/th&gt;&lt;th&gt;Кому&lt;/th&gt;&lt;th&gt;Позиция&lt;/th&gt;&lt;th class="num"&gt;Листов&lt;/th&gt;&lt;th class="num"&gt;Объём&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
  CHAINS.forEach(function(c){
    html+='&lt;tr&gt;&lt;td&gt;&lt;strong&gt;'+esc(c.from)+'&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;'+esc(c.to)+'&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;'+esc(c.item)+'&lt;/td&gt;&lt;td class="num"&gt;'+c.sheets+'&lt;/td&gt;&lt;td class="num" style="color:var(--gold)"&gt;'+F(c.vol)+' ₽&lt;/td&gt;&lt;/tr&gt;';
  });
  html+='&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;';
  $('graph-details').innerHTML=html;
}

function clearGraph(){
  $('g-sup').textContent='0';$('g-links').textContent='0';
  $('g-vol').textContent='0 ₽';$('g-save').textContent='0 ₽';
  $('graph-svg').innerHTML='';$('graph-details').innerHTML='';
  CHAINS=[];PAIR_MAP={};
}

function bind(){
  var b=$('graph-build-btn');if(b)b.onclick=buildGraph;
  var c=$('graph-clear-btn');if(c)c.onclick=clearGraph;
}

if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',inject);
else inject();
})();
&lt;/script&gt;</subtitle>
  <updated>2026-08-22T05:43:38Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/4b/bcd80a9d3e11f18b98ed4e8ec7cd6a/-/1787302250.png</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
