<?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/chernovik-srm</id>
  <link href="https://www.pandoraburo.ru/chernovik-srm.xml" rel="self"/>
  <title>Черновик СРМ</title>
  <subtitle type="html">
&lt;html lang="ru"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Пандора 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;style&gt;
#pd-root{--bg:#f2f2f4;--panel:#fff;--panel2:#fafafb;--card:#fff;--txt:#1a1a1e;--txt-strong:#0d0d11;--dim:#52525a;--muted:#6e6e78;--pink:#c2185b;--green:#2e7d32;--gold:#a36a00;--orange:#d84e00;--violet:#5e35b1;--red:#c62828;--blue:#1565c0;--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[data-theme="dark"]{--bg:#121218;--panel:#1a1a22;--panel2:#22222a;--card:#22222a;--txt:#e8eaf6;--txt-strong:#fff;--dim:#a0a3bd;--muted:#8084a0;--pink:#f06292;--green:#66bb6a;--gold:#ffca28;--orange:#ff9800;--violet:#b39ddb;--red:#ef5350;--blue:#64b5f6;--line:#333340;--line-strong:#44445a;--shadow:0 2px 6px rgba(0,0,0,.4),0 1px 2px rgba(0,0,0,.3)}
#pd-root *,#pd-root *::before,#pd-root *::after{box-sizing:border-box;margin:0;padding:0}
#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:280px;z-index:50;background:var(--panel);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:var(--line-strong);border-radius:3px}
#pd-root .logo{padding:22px 20px 18px;font-size:1.4rem;font-weight:800;color:var(--txt-strong);font-family:var(--fd);border-bottom:3px solid var(--pink)}
#pd-root .logo .crm{font-size:.78rem;font-weight:700;color:var(--pink);margin-left:6px;letter-spacing:3px}
#pd-root .nav-section{padding:18px 20px 8px;font-size:.68rem;font-weight:800;letter-spacing:1.5px;text-transform:uppercase;color:var(--muted)}
#pd-root .nav-section.ns-pink{color:var(--pink)}
#pd-root .nav-section.ns-gold{color:var(--gold)}
#pd-root .nav-section.ns-green{color:var(--green)}
#pd-root .nav-section.ns-violet{color:var(--violet)}
#pd-root .nav-section.ns-orange{color:var(--orange)}
#pd-root .nav-section.ns-blue{color:var(--blue)}
#pd-root .nav-link{display:flex;align-items:center;gap:8px;margin:3px 10px;padding:10px 12px;text-decoration:none;font-size:.88rem;font-weight:600;border-radius:8px;border:1px solid transparent;transition:background .18s,color .18s;cursor:pointer;color:var(--txt)}
#pd-root .nav-link:hover{background:var(--panel2);color:var(--txt-strong)}
#pd-root .nav-link.active{background:var(--pink);border-color:var(--pink);color:#fff;font-weight:700}
#pd-root .nav-link .badge-count{margin-left:auto;font-size:.7rem;font-weight:700;padding:2px 7px;border-radius:10px;background:var(--pink);color:#fff;min-width:22px;text-align:center}
#pd-root .nav-link.active .badge-count{background:#fff;color:var(--pink)}
#pd-root .main-content{margin-left:280px;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:14px 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 .topbar-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
#pd-root .global-search{padding:8px 14px;font-size:.85rem;font-weight:600;background:var(--panel);border:2px solid var(--line-strong);border-radius:8px;color:var(--txt);width:220px;outline:none;transition:border-color .2s}
#pd-root .global-search:focus{border-color:var(--violet)}
#pd-root .icon-btn-top{width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border:2px solid var(--line-strong);border-radius:8px;cursor:pointer;background:var(--panel);color:var(--txt);font-size:1rem;transition:all .15s}
#pd-root .icon-btn-top:hover{border-color:var(--violet);color:var(--violet)}
#pd-root .section{display:none}
#pd-root .section.active{display:block;animation:pdFade .25s ease}
@keyframes pdFade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}
#pd-root .section-title{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 .section-title .accent{color:var(--gold)}
#pd-root .section-header{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:14px;margin-bottom:20px}
#pd-root .section-header .section-title{margin:0;border:none;padding:0}
#pd-root .btn{padding:.6rem 1.1rem;border:none;border-radius:8px;font-size:.88rem;font-weight:700;color:#fff;cursor:pointer;background:linear-gradient(90deg,var(--orange),var(--pink));transition:filter .2s,transform .15s;font-family:var(--fb)}
#pd-root .btn:hover{filter:brightness(1.08);transform:translateY(-1px)}
#pd-root .btn:active{transform:translateY(1px)}
#pd-root .btn-s{padding:.35rem .7rem;font-size:.8rem}
#pd-root .btn-secondary{background:var(--muted)}
#pd-root .btn-green{background:linear-gradient(90deg,var(--green),#1b5e20)}
#pd-root .btn-violet{background:linear-gradient(90deg,var(--violet),#4527a0)}
#pd-root .btn-blue{background:linear-gradient(90deg,var(--blue),#0d47a1)}
#pd-root .btn-o{background:var(--panel);color:var(--txt);border:2px solid var(--line-strong)}
#pd-root .btn-o:hover{border-color:var(--violet);color:var(--violet)}
#pd-root .btn-d{background:var(--red)}
#pd-root .stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:16px;margin-bottom:24px}
#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);transition:transform .2s}
#pd-root .stat-card:hover{transform:translateY(-2px)}
#pd-root .stat-card .label{font-size:.7rem;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 .sub{font-size:.78rem;color:var(--dim);margin-top:4px;font-weight:600}
#pd-root .stat-card.gold{border-top-color:var(--gold)}.stat-card.gold .value{color:var(--gold)}
#pd-root .stat-card.green{border-top-color:var(--green)}.stat-card.green .value{color:var(--green)}
#pd-root .stat-card.violet{border-top-color:var(--violet)}.stat-card.violet .value{color:var(--violet)}
#pd-root .stat-card.pink{border-top-color:var(--pink)}.stat-card.pink .value{color:var(--pink)}
#pd-root .stat-card.red{border-top-color:var(--red)}.stat-card.red .value{color:var(--red)}
#pd-root .stat-card.blue{border-top-color:var(--blue)}.stat-card.blue .value{color:var(--blue)}
#pd-root .stat-card.orange{border-top-color:var(--orange)}.stat-card.orange .value{color:var(--orange)}
#pd-root .dash-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:18px;margin-bottom:20px}
#pd-root .dash-card{background:var(--panel);border-radius:12px;padding:20px;border:1px solid var(--line-strong);box-shadow:var(--shadow);border-top:4px solid var(--line-strong)}
#pd-root .dash-card h3{margin:0 0 14px;font-size:.8rem;font-weight:800;letter-spacing:1.2px;text-transform:uppercase;padding-bottom:10px;border-bottom:1px solid var(--line);color:var(--txt-strong)}
#pd-root .dash-card.dc-gold{border-top-color:var(--gold)}.dash-card.dc-gold h3{color:var(--gold)}
#pd-root .dash-card.dc-pink{border-top-color:var(--pink)}.dash-card.dc-pink h3{color:var(--pink)}
#pd-root .dash-card.dc-green{border-top-color:var(--green)}.dash-card.dc-green h3{color:var(--green)}
#pd-root .dash-card.dc-violet{border-top-color:var(--violet)}.dash-card.dc-violet h3{color:var(--violet)}
#pd-root .dash-card.dc-orange{border-top-color:var(--orange)}.dash-card.dc-orange h3{color:var(--orange)}
#pd-root .dash-card.dc-blue{border-top-color:var(--blue)}.dash-card.dc-blue h3{color:var(--blue)}
#pd-root .dash-row{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--line);font-size:.88rem}
#pd-root .dash-row:last-child{border-bottom:none}
#pd-root .dash-row .k{color:var(--dim);font-weight:600}
#pd-root .dash-row .v{color:var(--txt-strong);font-weight:800;font-family:var(--fm)}
#pd-root .dash-row .v.green{color:var(--green)}.dash-row .v.red{color:var(--red)}
#pd-root .dash-row .v.gold{color:var(--gold)}.dash-row .v.violet{color:var(--violet)}
#pd-root .kanban{display:grid;gap:16px;overflow-x:auto;padding-bottom:12px;align-items:flex-start}
#pd-root .kanban.cols-5{grid-template-columns:repeat(5,minmax(210px,1fr))}
#pd-root .kanban.cols-3{grid-template-columns:repeat(3,minmax(240px,1fr))}
#pd-root .kanban-col{background:var(--panel2);border:2px solid var(--line);border-radius:12px;padding:12px;min-height:220px;transition:border-color .15s,background .15s}
#pd-root .kanban-col.dragover{border-color:var(--pink);background:var(--panel)}
#pd-root .kanban-col-header{display:flex;justify-content:space-between;align-items:center;padding:6px 8px 12px;border-bottom:2px solid var(--line);margin-bottom:12px}
#pd-root .kanban-col-title{font-weight:800;font-size:.85rem;color:var(--txt-strong)}
#pd-root .kanban-col-count{font-size:.72rem;font-weight:800;padding:3px 9px;border-radius:10px;background:var(--pink);color:#fff}
#pd-root .kanban-col-sum{font-size:.72rem;color:var(--dim);font-family:var(--fm);margin-top:2px}
#pd-root .kanban-items{display:flex;flex-direction:column;gap:10px;min-height:60px}
#pd-root .k-card{background:var(--card);border:1px solid var(--line-strong);border-left:4px solid var(--violet);border-radius:10px;padding:12px;cursor:grab;transition:transform .15s,box-shadow .15s;box-shadow:var(--shadow)}
#pd-root .k-card:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(20,20,30,.12)}
#pd-root .k-card.dragging{opacity:.5;cursor:grabbing}
#pd-root .k-card.p-high{border-left-color:var(--red)}
#pd-root .k-card.p-medium{border-left-color:var(--gold)}
#pd-root .k-card.p-low{border-left-color:var(--green)}
#pd-root .k-card.overdue{background:#fdeeee;border-color:#f0c8c8}
#pd-root .k-card.today{background:#fdf6e8;border-color:#ecd9b0}
#pd-root[data-theme="dark"] .k-card.overdue{background:#2a1a1a;border-color:#4a2a2a}
#pd-root[data-theme="dark"] .k-card.today{background:#2a2518;border-color:#4a3f28}
#pd-root .k-card-top{display:flex;justify-content:space-between;align-items:flex-start;gap:6px;margin-bottom:6px}
#pd-root .k-card-title{font-weight:700;font-size:.88rem;color:var(--txt-strong);line-height:1.3}
#pd-root .k-card-client{font-size:.76rem;color:var(--violet);font-weight:600;margin-bottom:6px}
#pd-root .k-card-desc{font-size:.76rem;color:var(--dim);margin-bottom:8px;line-height:1.4}
#pd-root .k-card-amount{font-family:var(--fm);font-weight:700;color:var(--gold);font-size:.95rem;margin-bottom:6px}
#pd-root .k-card-footer{display:flex;justify-content:space-between;align-items:center;gap:6px;flex-wrap:wrap}
#pd-root .k-card-meta{font-size:.7rem;color:var(--dim);font-weight:600;font-family:var(--fm)}
#pd-root .k-card-actions{display:flex;gap:4px}
#pd-root .k-card-actions button{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line-strong);border-radius:6px;cursor:pointer;font-size:.7rem;background:var(--panel);color:var(--txt);transition:all .15s}
#pd-root .k-card-actions button:hover{transform:translateY(-1px)}
#pd-root .k-card-actions .act-done:hover{background:var(--green);color:#fff;border-color:var(--green)}
#pd-root .k-card-actions .act-edit:hover{background:var(--violet);color:#fff;border-color:var(--violet)}
#pd-root .k-card-actions .act-del:hover{background:var(--red);color:#fff;border-color:var(--red)}
#pd-root .prob-badge{background:var(--violet);color:#fff;padding:2px 7px;border-radius:4px;font-size:.68rem;font-weight:700;font-family:var(--fm)}
#pd-root .prio-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px}
#pd-root .prio-dot.high{background:var(--red)}
#pd-root .prio-dot.medium{background:var(--gold)}
#pd-root .prio-dot.low{background:var(--green)}
#pd-root .table-wrap{background:var(--panel);border:1px solid var(--line-strong);border-radius:12px;overflow-x:auto;box-shadow:var(--shadow)}
#pd-root .tbl{width:100%;border-collapse:collapse;font-size:.88rem;min-width:700px}
#pd-root .tbl thead th{background:var(--panel2);padding:13px 16px;text-align:left;font-weight:800;color:var(--txt-strong);font-size:.72rem;text-transform:uppercase;letter-spacing:.5px;border-bottom:3px solid var(--line-strong);white-space:nowrap}
#pd-root .tbl thead th.num{text-align:right}
#pd-root .tbl tbody td{padding:13px 16px;border-bottom:1px solid var(--line);color:var(--txt);vertical-align:middle}
#pd-root .tbl tbody td.num{text-align:right;font-family:var(--fm);font-weight:600}
#pd-root .tbl tbody tr{cursor:pointer;transition:background .15s}
#pd-root .tbl tbody tr:hover{background:var(--panel2)}
#pd-root .tbl tbody tr:last-child td{border-bottom:none}
#pd-root .cell-main{font-weight:700;color:var(--txt-strong)}
#pd-root .cell-sub{font-size:.74rem;color:var(--muted);margin-top:2px}
#pd-root .row-actions{display:flex;gap:6px;justify-content:flex-end}
#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:var(--panel);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;border-color:var(--violet)}
#pd-root .icon-btn.del:hover{background:var(--red);color:#fff;border-color:var(--red)}
#pd-root .icon-btn.in:hover{background:var(--green);color:#fff;border-color:var(--green)}
#pd-root .icon-btn.out:hover{background:var(--orange);color:#fff;border-color:var(--orange)}
#pd-root .icon-btn.view:hover{background:var(--blue);color:#fff;border-color:var(--blue)}
#pd-root .badge{display:inline-block;padding:3px 10px;border-radius:20px;font-size:.72rem;font-weight:800;border:1px solid}
#pd-root .badge.legal{background:#f0ebfa;color:var(--violet);border-color:#d5c8f2}
#pd-root .badge.ip{background:#fdf6e8;color:var(--gold);border-color:#ecd9b0}
#pd-root .badge.person{background:#eef7ee;color:var(--green);border-color:#c5e2c5}
#pd-root .badge.stage-new{background:#eef1fd;color:var(--blue);border-color:#c8d4f2}
#pd-root .badge.stage-progress{background:#fdf6e8;color:var(--gold);border-color:#ecd9b0}
#pd-root .badge.stage-negotiation{background:#f0ebfa;color:var(--violet);border-color:#d5c8f2}
#pd-root .badge.stage-won{background:#eef7ee;color:var(--green);border-color:#c5e2c5}
#pd-root .badge.stage-lost{background:#fdeeee;color:var(--red);border-color:#f0c8c8}
#pd-root .badge.status-active{background:#eef7ee;color:var(--green);border-color:#c5e2c5}
#pd-root .badge.status-vip{background:#fdf6e8;color:var(--gold);border-color:#ecd9b0}
#pd-root .badge.status-inactive{background:#f0f0f2;color:var(--muted);border-color:var(--line-strong)}
#pd-root .badge.stock-ok{background:#eef7ee;color:var(--green);border-color:#c5e2c5}
#pd-root .badge.stock-low{background:#fdf6e8;color:var(--gold);border-color:#ecd9b0}
#pd-root .badge.stock-out{background:#fdeeee;color:var(--red);border-color:#f0c8c8}
#pd-root .badge.move-in{background:#eef7ee;color:var(--green);border-color:#c5e2c5}
#pd-root .badge.move-out{background:#fff3ec;color:var(--orange);border-color:#f2d5c0}
#pd-root .badge.doc-invoice{background:#eef1fd;color:var(--blue);border-color:#c8d4f2}
#pd-root .badge.doc-act{background:#eef7ee;color:var(--green);border-color:#c5e2c5}
#pd-root .badge.doc-proposal{background:#f0ebfa;color:var(--violet);border-color:#d5c8f2}
#pd-root[data-theme="dark"] .badge.legal,#pd-root[data-theme="dark"] .badge.stage-negotiation,#pd-root[data-theme="dark"] .badge.doc-proposal{background:#2a2440;border-color:#443a66}
#pd-root[data-theme="dark"] .badge.ip,#pd-root[data-theme="dark"] .badge.stage-progress,#pd-root[data-theme="dark"] .badge.status-vip,#pd-root[data-theme="dark"] .badge.stock-low{background:#2a2518;border-color:#4a3f28}
#pd-root[data-theme="dark"] .badge.person,#pd-root[data-theme="dark"] .badge.status-active,#pd-root[data-theme="dark"] .badge.stage-won,#pd-root[data-theme="dark"] .badge.stock-ok,#pd-root[data-theme="dark"] .badge.move-in,#pd-root[data-theme="dark"] .badge.doc-act{background:#1a2a1a;border-color:#2a4a2a}
#pd-root[data-theme="dark"] .badge.status-inactive{background:#22222a;border-color:#3a3a44}
#pd-root[data-theme="dark"] .badge.stage-new,#pd-root[data-theme="dark"] .badge.doc-invoice{background:#1a2230;border-color:#2a3a55}
#pd-root[data-theme="dark"] .badge.stage-lost,#pd-root[data-theme="dark"] .badge.stock-out{background:#2a1a1a;border-color:#4a2a2a}
#pd-root[data-theme="dark"] .badge.move-out{background:#2a2018;border-color:#4a3a28}
#pd-root .filters{display:flex;gap:12px;flex-wrap:wrap;align-items:center;margin-bottom:18px}
#pd-root .filters input,#pd-root .filters select{padding:9px 13px;background:var(--panel);border:2px solid var(--line-strong);border-radius:8px;color:var(--txt);font-size:.86rem;font-family:var(--fb);outline:none;transition:border-color .2s}
#pd-root .filters input:focus,#pd-root .filters select:focus{border-color:var(--violet)}
#pd-root .filters input[type=text]{flex:1;min-width:200px}
#pd-root .filters label.chk{display:flex;align-items:center;gap:8px;font-size:.85rem;color:var(--txt);cursor:pointer;user-select:none;font-weight:600}
#pd-root .filters input[type=checkbox]{width:18px;height:18px;accent-color:var(--pink);cursor:pointer}
#pd-root .cal-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px;flex-wrap:wrap;gap:12px}
#pd-root .cal-title{font-family:var(--fd);font-size:1.1rem;font-weight:800;color:var(--txt-strong);text-transform:capitalize}
#pd-root .cal-nav{display:flex;gap:8px}
#pd-root .cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}
#pd-root .cal-dow{font-size:.7rem;font-weight:800;color:var(--muted);text-transform:uppercase;text-align:center;padding:8px 0;letter-spacing:.5px}
#pd-root .cal-day{background:var(--panel);border:1px solid var(--line);border-radius:10px;min-height:90px;padding:8px;transition:border-color .15s;position:relative;overflow:hidden}
#pd-root .cal-day:hover{border-color:var(--violet)}
#pd-root .cal-day.empty{background:transparent;border-color:transparent}
#pd-root .cal-day.today{border-color:var(--pink);box-shadow:0 0 0 2px rgba(194,24,91,.25)}
#pd-root .cal-day-num{font-size:.78rem;font-weight:700;color:var(--dim);margin-bottom:4px}
#pd-root .cal-day.today .cal-day-num{color:var(--pink);font-weight:800}
#pd-root .cal-task{font-size:.68rem;font-weight:600;padding:3px 6px;border-radius:5px;margin-bottom:3px;line-height:1.25;cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;border-left:3px solid}
#pd-root .cal-task.high{background:#fdeeee;color:var(--red);border-left-color:var(--red)}
#pd-root .cal-task.medium{background:#fdf6e8;color:var(--gold);border-left-color:var(--gold)}
#pd-root .cal-task.low{background:#eef7ee;color:var(--green);border-left-color:var(--green)}
#pd-root .cal-task.done{opacity:.5;text-decoration:line-through}
#pd-root[data-theme="dark"] .cal-task.high{background:#2a1a1a}
#pd-root[data-theme="dark"] .cal-task.medium{background:#2a2518}
#pd-root[data-theme="dark"] .cal-task.low{background:#1a2a1a}
#pd-root .cal-task-more{font-size:.66rem;color:var(--violet);font-weight:700;cursor:pointer}
#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;font-size:.9rem;background:var(--panel);color:var(--muted);transition:all .15s}
#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[data-theme="dark"] .move-toggle .opt.sel-in{background:#1a2a1a}
#pd-root[data-theme="dark"] .move-toggle .opt.sel-out{background:#2a2018}
#pd-root .cur-stock-hint{font-size:.8rem;color:var(--dim);margin-bottom:12px;font-family:var(--fm);font-weight:600}
#pd-root .client-profile-header{display:flex;align-items:center;gap:18px;margin-bottom:22px;padding-bottom:18px;border-bottom:2px solid var(--line-strong);flex-wrap:wrap}
#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.5rem;font-weight:800;color:#fff;background:linear-gradient(135deg,var(--violet),var(--pink));flex-shrink:0}
#pd-root .client-profile-title h2{font-family:var(--fd);font-size:1.3rem;color:var(--txt-strong);margin-bottom:6px}
#pd-root .client-profile-meta{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
#pd-root .info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px 24px;margin-bottom:22px}
#pd-root .info-item .label{font-size:.68rem;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:3px;font-weight:700}
#pd-root .info-item .value{font-size:.92rem;color:var(--txt);font-weight:600;word-break:break-word}
#pd-root .info-item .value.mono{font-family:var(--fm)}
#pd-root .card-section-title{font-family:var(--fd);font-size:.92rem;font-weight:700;color:var(--gold);margin:18px 0 12px;display:flex;align-items:center;gap:8px}
#pd-root .linked-item{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;cursor:pointer;transition:border-color .15s}
#pd-root .linked-item:hover{border-color:var(--violet)}
#pd-root .linked-item .name{font-weight:700;color:var(--txt-strong);font-size:.88rem}
#pd-root .linked-item .meta{font-size:.74rem;color:var(--muted);margin-top:2px}
#pd-root .linked-item .amount{font-family:var(--fm);font-weight:700;color:var(--gold)}
#pd-root .empty-note{color:var(--muted);font-size:.86rem;padding:12px 0;font-weight:600}
#pd-root .placeholder{background:var(--panel);border:2px dashed var(--line-strong);border-radius:14px;padding:50px 30px;text-align:center;color:var(--muted)}
#pd-root .placeholder .icon{font-size:3rem;margin-bottom:12px;display:block}
#pd-root .placeholder h3{font-family:var(--fd);font-size:1.1rem;color:var(--txt-strong);margin-bottom:8px}
#pd-root .placeholder p{font-size:.88rem;max-width:480px;margin:0 auto;line-height:1.6}
#pd-root .activity-item{display:flex;gap:12px;padding:10px 0;border-bottom:1px solid var(--line)}
#pd-root .activity-item:last-child{border-bottom:none}
#pd-root .activity-item .ico{width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:1rem}
#pd-root .activity-item .ico.green{background:#eef7ee;color:var(--green)}
#pd-root .activity-item .ico.pink{background:#fdeef5;color:var(--pink)}
#pd-root .activity-item .ico.gold{background:#fdf6e8;color:var(--gold)}
#pd-root .activity-item .ico.red{background:#fdeeee;color:var(--red)}
#pd-root .activity-item .ico.violet{background:#f0ebfa;color:var(--violet)}
#pd-root .activity-item .ico.blue{background:#eef1fd;color:var(--blue)}
#pd-root .activity-item .ico.orange{background:#fff3ec;color:var(--orange)}
#pd-root .activity-item .body{flex:1}
#pd-root .activity-item .title{font-weight:700;color:var(--txt-strong);font-size:.88rem}
#pd-root .activity-item .meta{font-size:.75rem;color:var(--muted);margin-top:2px}
#pd-root .settings-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:18px}
#pd-root .settings-card{background:var(--panel);border:1px solid var(--line-strong);border-radius:12px;padding:22px;box-shadow:var(--shadow)}
#pd-root .settings-card h3{font-family:var(--fd);font-size:.95rem;color:var(--txt-strong);margin-bottom:16px;display:flex;align-items:center;gap:8px}
#pd-root .settings-card p{font-size:.85rem;color:var(--dim);margin-bottom:14px;line-height:1.5}
#pd-root .fg{margin-bottom:14px}
#pd-root .fg label{display:block;margin-bottom:6px;font-weight:700;color:var(--txt);font-size:.85rem}
#pd-root .fg label .req{color:var(--pink)}
#pd-root .fg input,#pd-root .fg select,#pd-root .fg textarea{width:100%;padding:10px 12px;background:var(--panel);border:2px solid var(--line-strong);border-radius:8px;color:var(--txt);font-size:.88rem;font-family:var(--fb);outline:none;transition:border-color .2s}
#pd-root .fg input:focus,#pd-root .fg select:focus,#pd-root .fg textarea:focus{border-color:var(--violet)}
#pd-root .fg textarea{resize:vertical;min-height:70px}
#pd-root .fg input[type=checkbox]{width:auto;padding:0;margin-right:6px;accent-color:var(--pink)}
#pd-root .fg .hint{font-size:.75rem;color:var(--muted);margin-top:4px}
#pd-root .form-row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
#pd-root .form-row-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:14px}
#pd-root .form-row-4{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
#pd-root .modal-overlay{position:fixed;inset:0;background:rgba(20,20,30,.55);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:640px;width:100%;max-height:90vh;overflow-y:auto;box-shadow:0 10px 40px rgba(20,20,30,.3)}
#pd-root .modal.wide{max-width:860px}
#pd-root .modal h2{font-family:var(--fd);font-size:1.3rem;margin-bottom:20px;color:var(--txt-strong)}
#pd-root .modal-actions{display:flex;gap:12px;margin-top:22px;justify-content:flex-end;flex-wrap:wrap}
#pd-root .toast{position:fixed;bottom:24px;right:24px;background:var(--green);color:#fff;padding:14px 22px;border-radius:10px;font-weight:700;font-size:.88rem;transform:translateY(100px);opacity:0;transition:all .3s ease;z-index:2000;max-width:360px}
#pd-root .toast.show{transform:translateY(0);opacity:1}
#pd-root .toast.error{background:var(--red)}
#pd-root .toast.warn{background:var(--orange)}
#pd-root .ib{background:#eef7ee;border-left:4px solid var(--green);border-radius:8px;padding:.7rem .9rem;margin-bottom:1rem;font-size:.85rem;color:var(--txt);line-height:1.5}
#pd-root .ib.warn{background:#fdf6e8;border-left-color:var(--orange)}
#pd-root .ib.info{background:#eef1fd;border-left-color:var(--blue)}
#pd-root .ib.err{background:#fdeeee;border-left-color:var(--red)}
#pd-root .ib strong{color:var(--txt-strong)}
#pd-root[data-theme="dark"] .ib{background:#1a2a1a}
#pd-root[data-theme="dark"] .ib.warn{background:#2a2518}
#pd-root[data-theme="dark"] .ib.info{background:#1a2230}
#pd-root[data-theme="dark"] .ib.err{background:#2a1a1a}
#pd-root .tax-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:20px;background:var(--panel);border:1px solid var(--line-strong);border-radius:12px;padding:6px;box-shadow:var(--shadow)}
#pd-root .tax-tab{padding:10px 16px;border:none;background:transparent;border-radius:8px;cursor:pointer;font-size:.88rem;font-weight:700;color:var(--dim);transition:all .18s;font-family:var(--fb)}
#pd-root .tax-tab:hover{color:var(--txt-strong)}
#pd-root .tax-tab.active{background:var(--pink);color:#fff;box-shadow:0 2px 6px rgba(194,24,91,.3)}
#pd-root .tax-subsection{display:none}
#pd-root .tax-subsection.active{display:block;animation:pdFade .25s ease}
#pd-root .doc-item{background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:10px;margin-bottom:8px;display:grid;grid-template-columns:1fr 80px 100px 100px 32px;gap:8px;align-items:center}
#pd-root .doc-item input{padding:8px 10px;background:var(--panel);border:1px solid var(--line-strong);border-radius:6px;color:var(--txt);font-size:.85rem;font-family:var(--fb);outline:none;width:100%}
#pd-root .doc-item .sum{font-family:var(--fm);font-weight:700;color:var(--gold);text-align:right;font-size:.88rem}
#pd-root .doc-item .rm{background:var(--red);color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:.8rem;width:32px;height:32px}
#pd-root .doc-total{display:flex;justify-content:space-between;padding:12px 10px;background:var(--panel2);border-radius:8px;border:2px solid var(--line-strong);font-weight:800;color:var(--txt-strong);margin-top:8px}
#pd-root .doc-total .tv{font-family:var(--fm);font-size:1.1rem;color:var(--gold)}
#pd-root .res{background:var(--panel2);border:2px solid var(--line-strong);border-radius:12px;padding:18px;margin-top:18px}
#pd-root .ri{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--line);align-items:center;font-size:.88rem}
#pd-root .ri:last-child{border-bottom:none}
#pd-root .ri.hl{background:#eef7ee;padding:12px;border-radius:8px;margin:6px 0;border-bottom:none}
#pd-root .ri.hl .v{font-size:1.2rem;color:var(--green)}
#pd-root .v{font-weight:800;color:var(--txt-strong);font-family:var(--fm)}
#pd-root .v.d{color:var(--red)}
#pd-root .v.s{color:var(--green)}
#pd-root .v.gold{color:var(--gold)}
#pd-root .wr{border-left:4px solid var(--gold);background:#fdf6e8;padding:12px;margin-top:12px;border-radius:6px;font-size:.85rem;color:var(--txt);line-height:1.5}
#pd-root .wr.err{border-left-color:var(--red);background:#fdeeee;color:var(--red)}
#pd-root .wr.ok{border-left-color:var(--green);background:#eef7ee;color:var(--green)}
#pd-root .wr.warn{border-left-color:var(--orange);background:#fff3ec;color:var(--orange)}
#pd-root .ci{padding:10px 12px;border-radius:8px;margin-bottom:8px;display:flex;align-items:flex-start;gap:8px;font-size:.85rem;line-height:1.4}
#pd-root .ci.pass{background:#eef7ee;border-left:4px solid var(--green);color:var(--green)}
#pd-root .ci.fail{background:#fdeeee;border-left:4px solid var(--red);color:var(--red)}
#pd-root .ci.warn{background:#fdf6e8;border-left:4px solid var(--orange);color:var(--orange)}
#pd-root table{width:100%;border-collapse:collapse;margin-top:12px;font-size:.85rem}
#pd-root th{background:var(--panel2);padding:10px 12px;text-align:left;font-weight:800;color:var(--txt-strong);border-bottom:2px solid var(--line-strong);font-size:.75rem;text-transform:uppercase}
#pd-root td{padding:10px 12px;border-bottom:1px solid var(--line);color:var(--txt)}
#pd-root td.n,#pd-root th.n{text-align:right;font-family:var(--fm);font-weight:600}
#pd-root tr.best{background:#eef7ee;box-shadow:inset 3px 0 0 var(--green)}
#pd-root tr.unav{opacity:.45}
#docs-print-area{display:none}
@media print{
  body *{visibility:hidden}
  #docs-print-area,#docs-print-area *{visibility:visible}
  #docs-print-area{display:block!important;position:absolute;left:0;top:0;width:100%;background:#fff;color:#000;font-family:'Inter',Arial,sans-serif;padding:30px;font-size:13px;line-height:1.5}
  #docs-print-area .doc-head{display:flex;justify-content:space-between;border-bottom:3px solid #000;padding-bottom:14px;margin-bottom:18px}
  #docs-print-area .doc-company{font-size:14px;font-weight:700}
  #docs-print-area .doc-company .sub{font-size:11px;font-weight:400;color:#333;margin-top:3px}
  #docs-print-area .doc-title{font-size:20px;font-weight:800;text-align:center;margin:18px 0;text-transform:uppercase}
  #docs-print-area .doc-parties{display:flex;justify-content:space-between;gap:20px;margin-bottom:18px;font-size:12px}
  #docs-print-area .doc-party{flex:1}
  #docs-print-area .doc-party .lbl{font-weight:700;margin-bottom:4px;font-size:11px;text-transform:uppercase;color:#555}
  #docs-print-area table{width:100%;border-collapse:collapse;margin:16px 0}
  #docs-print-area table th{background:#f0f0f0;padding:8px;border:1px solid #999;text-align:left;font-size:11px;text-transform:uppercase}
  #docs-print-area table td{padding:8px;border:1px solid #999;font-size:12px}
  #docs-print-area table td.num,#docs-print-area table th.num{text-align:right}
  #docs-print-area .doc-total-row{display:flex;justify-content:flex-end;gap:30px;font-size:15px;font-weight:800;margin:14px 0}
  #docs-print-area .doc-comment{margin:16px 0;font-size:12px;font-style:italic;color:#333}
  #docs-print-area .doc-sign{margin-top:40px;display:flex;justify-content:space-between;gap:30px}
  #docs-print-area .doc-sign-block{flex:1}
  #docs-print-area .doc-sign-line{border-top:1px solid #000;margin-top:40px;padding-top:6px;font-size:11px;color:#333}
}
@media(max-width:860px){
  #pd-root .sidebar{position:static;width:100%;height:auto;overflow:visible;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 .form-row-3{grid-template-columns:1fr}
  #pd-root .form-row-4{grid-template-columns:1fr 1fr}
  #pd-root .kanban.cols-5,#pd-root .kanban.cols-3{grid-template-columns:1fr}
  #pd-root .doc-item{grid-template-columns:1fr 70px 90px 32px}
  #pd-root .doc-item .sum{display:none}
}
&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;nav id="main-nav"&gt;
    &lt;div class="nav-section ns-blue"&gt;Рабочее место&lt;/div&gt;
    &lt;a class="nav-link active" data-view="dashboard"&gt;? Дашборд&lt;/a&gt;
    &lt;a class="nav-link" data-view="search"&gt;? Поиск&lt;/a&gt;
    &lt;a class="nav-link" data-view="activity"&gt;? Лента событий&lt;/a&gt;
    &lt;div class="nav-section ns-pink"&gt;CRM&lt;/div&gt;
    &lt;a class="nav-link" data-view="deals"&gt;? Сделки &lt;span class="badge-count" id="nav-deals-count"&gt;0&lt;/span&gt;&lt;/a&gt;
    &lt;a class="nav-link" data-view="clients"&gt;? Клиенты &lt;span class="badge-count" id="nav-clients-count"&gt;0&lt;/span&gt;&lt;/a&gt;
    &lt;a class="nav-link" data-view="tasks"&gt;✅ Задачи &lt;span class="badge-count" id="nav-tasks-count"&gt;0&lt;/span&gt;&lt;/a&gt;
    &lt;a class="nav-link" data-view="calendar"&gt;? Календарь&lt;/a&gt;
    &lt;div class="nav-section ns-orange"&gt;Склад и документы&lt;/div&gt;
    &lt;a class="nav-link" data-view="warehouse"&gt;? Склад &lt;span class="badge-count" id="nav-wh-count"&gt;0&lt;/span&gt;&lt;/a&gt;
    &lt;a class="nav-link" data-view="docs"&gt;? Документы &lt;span class="badge-count" id="nav-docs-count"&gt;0&lt;/span&gt;&lt;/a&gt;
    &lt;div class="nav-section ns-gold"&gt;Бухгалтерия&lt;/div&gt;
    &lt;a class="nav-link" data-view="tax"&gt;? Налоги и режимы&lt;/a&gt;
    &lt;div class="nav-section ns-blue"&gt;Сервис&lt;/div&gt;
    &lt;a class="nav-link" data-view="settings"&gt;⚙️ Настройки&lt;/a&gt;
    &lt;a class="nav-link" data-view="backup"&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="topbar-actions"&gt;
      &lt;input type="text" class="global-search" id="global-search" placeholder="? Поиск по всей системе..." /&gt;
      &lt;button class="icon-btn-top" id="btn-backup" title="Резервная копия"&gt;?&lt;/button&gt;
      &lt;button class="icon-btn-top" id="btn-settings" title="Настройки"&gt;⚙️&lt;/button&gt;
      &lt;button class="icon-btn-top" id="btn-theme" title="Тема"&gt;?&lt;/button&gt;
    &lt;/div&gt;
  &lt;/header&gt;
  &lt;section class="section active" data-section="dashboard"&gt;
    &lt;h1 class="section-title"&gt;Приборная панель &lt;span class="accent" id="dash-role-title"&gt;Бизнесмена&lt;/span&gt;&lt;/h1&gt;
    &lt;div id="company-banner" class="ib" style="display:none"&gt;&lt;/div&gt;
    &lt;div class="stats-grid" id="dash-main-stats"&gt;&lt;/div&gt;
    &lt;div class="dash-grid"&gt;
      &lt;div class="dash-card dc-gold"&gt;&lt;h3&gt;? Продажи&lt;/h3&gt;&lt;div id="dash-deals"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="dash-card dc-pink"&gt;&lt;h3&gt;? Клиенты&lt;/h3&gt;&lt;div id="dash-clients"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="dash-card dc-violet"&gt;&lt;h3&gt;✅ Задачи&lt;/h3&gt;&lt;div id="dash-tasks"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="dash-card dc-orange"&gt;&lt;h3&gt;? Склад&lt;/h3&gt;&lt;div id="dash-warehouse"&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="dash-card dc-blue" style="margin-top:18px"&gt;&lt;h3&gt;⚡ Последние действия&lt;/h3&gt;&lt;div id="dash-activity"&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div class="dash-card" style="margin-top:18px;background:var(--panel2)"&gt;&lt;h3&gt;? Подсказки системы&lt;/h3&gt;&lt;div id="dash-tips"&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="deals"&gt;
    &lt;div class="section-header"&gt;&lt;h1 class="section-title"&gt;? Сделки &lt;span class="accent"&gt;и воронка продаж&lt;/span&gt;&lt;/h1&gt;&lt;button class="btn" id="deals-add-btn"&gt;+ Новая сделка&lt;/button&gt;&lt;/div&gt;
    &lt;div class="stats-grid" id="deals-stats"&gt;&lt;/div&gt;
    &lt;div class="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 value="Иванов"&gt;Иванов&lt;/option&gt;&lt;option value="Петров"&gt;Петров&lt;/option&gt;&lt;option value="Сидоров"&gt;Сидоров&lt;/option&gt;&lt;/select&gt;
    &lt;/div&gt;
    &lt;div class="kanban cols-5" id="deals-kanban"&gt;&lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="clients"&gt;
    &lt;div class="section-header"&gt;&lt;h1 class="section-title"&gt;? База &lt;span class="accent"&gt;клиентов&lt;/span&gt;&lt;/h1&gt;
      &lt;div style="display:flex;gap:10px;flex-wrap:wrap"&gt;
        &lt;button class="btn btn-o btn-s" id="clients-import-btn"&gt;? Импорт CSV&lt;/button&gt;
        &lt;button class="btn btn-o btn-s" id="clients-export-btn"&gt;? Экспорт CSV&lt;/button&gt;
        &lt;button class="btn" id="clients-add-btn"&gt;+ Новый клиент&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="stats-grid" id="clients-stats"&gt;&lt;/div&gt;
    &lt;div class="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="table-wrap"&gt;&lt;table class="tbl"&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;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-import" accept=".csv" style="display:none" /&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="tasks"&gt;
    &lt;div class="section-header"&gt;&lt;h1 class="section-title"&gt;✅ Задачи &lt;span class="accent"&gt;и напоминания&lt;/span&gt;&lt;/h1&gt;&lt;button class="btn" id="tasks-add-btn"&gt;+ Новая задача&lt;/button&gt;&lt;/div&gt;
    &lt;div class="stats-grid" id="tasks-stats"&gt;&lt;/div&gt;
    &lt;div class="filters"&gt;
      &lt;input type="text" id="tasks-search" placeholder="? Поиск по задаче или клиенту..." /&gt;
      &lt;select id="tasks-assignee-filter"&gt;&lt;option value=""&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;select id="tasks-priority-filter"&gt;&lt;option value=""&gt;Любой приоритет&lt;/option&gt;&lt;option value="high"&gt;? Высокий&lt;/option&gt;&lt;option value="medium"&gt;? Средний&lt;/option&gt;&lt;option value="low"&gt;? Низкий&lt;/option&gt;&lt;/select&gt;
    &lt;/div&gt;
    &lt;div class="kanban cols-3" id="tasks-kanban"&gt;&lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="calendar"&gt;
    &lt;div class="cal-header"&gt;
      &lt;h1 class="section-title" style="margin:0;border:none;padding:0"&gt;? Календарь &lt;span class="accent"&gt;задач&lt;/span&gt;&lt;/h1&gt;
      &lt;div class="cal-nav"&gt;
        &lt;button class="btn btn-o btn-s" id="cal-prev"&gt;← Пред.&lt;/button&gt;
        &lt;button class="btn btn-o btn-s" id="cal-today"&gt;Сегодня&lt;/button&gt;
        &lt;button class="btn btn-o btn-s" id="cal-next"&gt;След. →&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="cal-title" id="cal-month-title"&gt;&lt;/div&gt;
    &lt;div class="cal-grid" id="cal-grid"&gt;&lt;/div&gt;
    &lt;div class="ib info" style="margin-top:18px"&gt;Задачи отображаются по дате выполнения. Кликните по задаче, чтобы открыть её. Красным подсвечен сегодняшний день.&lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="warehouse"&gt;
    &lt;div class="section-header"&gt;&lt;h1 class="section-title"&gt;? Склад &lt;span class="accent"&gt;и остатки&lt;/span&gt;&lt;/h1&gt;&lt;button class="btn" id="wh-add-btn"&gt;+ Новый товар&lt;/button&gt;&lt;/div&gt;
    &lt;div class="stats-grid" id="wh-stats"&gt;&lt;/div&gt;
    &lt;div class="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="table-wrap"&gt;&lt;table class="tbl"&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&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="dash-card dc-orange" style="margin-top:20px"&gt;&lt;h3&gt;? Последние движения&lt;/h3&gt;&lt;div id="wh-moves-list"&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="docs"&gt;
    &lt;div class="section-header"&gt;&lt;h1 class="section-title"&gt;? Документы &lt;span class="accent"&gt;и шаблоны&lt;/span&gt;&lt;/h1&gt;&lt;button class="btn" id="docs-add-btn"&gt;+ Новый документ&lt;/button&gt;&lt;/div&gt;
    &lt;div class="ib info"&gt;Создавайте счета, акты и коммерческие предложения на основе базы клиентов. Реквизиты компании подтягиваются из настроек. Готовый документ можно распечатать или сохранить в PDF.&lt;/div&gt;
    &lt;div class="stats-grid" id="docs-stats"&gt;&lt;/div&gt;
    &lt;div class="table-wrap"&gt;&lt;table class="tbl"&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 style="text-align:right"&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="docs-tbody"&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="tax"&gt;
    &lt;h1 class="section-title"&gt;? Бухгалтерия &lt;span class="accent"&gt;и налоги&lt;/span&gt;&lt;/h1&gt;
    &lt;div class="ib info"&gt;Налоговые калькуляторы на 2026 год. Выберите режим, заполните данные и получите расчёт. Все расчёты информационные.&lt;/div&gt;
    &lt;div class="tax-tabs"&gt;
      &lt;button class="tax-tab active" data-taxtab="usn6" type="button"&gt;УСН 6%&lt;/button&gt;
      &lt;button class="tax-tab" data-taxtab="usn15" type="button"&gt;УСН 15%&lt;/button&gt;
      &lt;button class="tax-tab" data-taxtab="osn" type="button"&gt;ОСН&lt;/button&gt;
      &lt;button class="tax-tab" data-taxtab="npd" type="button"&gt;НПД&lt;/button&gt;
      &lt;button class="tax-tab" data-taxtab="compare" type="button"&gt;Сравнение режимов&lt;/button&gt;
      &lt;button class="tax-tab" data-taxtab="cal" type="button"&gt;Календарь&lt;/button&gt;
    &lt;/div&gt;
    &lt;div class="tax-subsection active" data-taxsub="usn6"&gt;
      &lt;div class="ib"&gt;ИП без сотрудников. Налог 6% уменьшается на фикс. взносы и 1% с дохода свыше 300 000 ₽.&lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Год&lt;/label&gt;&lt;select id="u6-year"&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="card-section-title" style="color:var(--gold)"&gt;Доходы по кварталам&lt;/div&gt;
      &lt;div class="form-row-4"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;1 кв.&lt;/label&gt;&lt;input type="number" id="u6-q1" min="0" value="0" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;2 кв.&lt;/label&gt;&lt;input type="number" id="u6-q2" min="0" value="0" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;3 кв.&lt;/label&gt;&lt;input type="number" id="u6-q3" min="0" value="0" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;4 кв.&lt;/label&gt;&lt;input type="number" id="u6-q4" min="0" value="0" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;button class="btn" id="u6-calc" type="button"&gt;Рассчитать&lt;/button&gt;
      &lt;div id="u6-res"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="tax-subsection" data-taxsub="usn15"&gt;
      &lt;div class="ib"&gt;УСН «Доходы минус расходы» 15%. Минимальный налог — 1% от доходов, если расходы велики.&lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Год&lt;/label&gt;&lt;select id="u15-year"&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"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Доходы за год, ₽&lt;/label&gt;&lt;input type="number" id="u15-income" min="0" value="10000000" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Расходы за год, ₽&lt;/label&gt;&lt;input type="number" id="u15-expense" min="0" value="6000000" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;button class="btn" id="u15-calc" type="button"&gt;Рассчитать&lt;/button&gt;
      &lt;div id="u15-res"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="tax-subsection" data-taxsub="osn"&gt;
      &lt;div class="ib"&gt;Общая система: НДС 22% (расчётная 22/122) + налог на прибыль 25% + страховые взносы по категориям.&lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Год&lt;/label&gt;&lt;select id="osn-year"&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="fg"&gt;&lt;label&gt;Категория взносов&lt;/label&gt;&lt;select id="osn-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;ИТ (15%/7,6%)&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;&lt;input type="checkbox" id="osn-priority" /&gt; Приоритетная отрасль (для МСП 15%)&lt;/label&gt;&lt;div class="hint"&gt;Основной ОКВЭД + доля дохода ≥ 70%&lt;/div&gt;&lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;&lt;input type="checkbox" id="osn-it-accred" checked="checked" /&gt; Аккредитация Минцифры&lt;/label&gt;&lt;div class="hint"&gt;Для ИТ-тарифа&lt;/div&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Доля IT-доходов, %&lt;/label&gt;&lt;input type="number" id="osn-it-share" min="0" max="100" value="70" /&gt;&lt;div class="hint"&gt;Минимум 70% для ИТ-тарифа&lt;/div&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Сотрудников&lt;/label&gt;&lt;input type="number" id="osn-emp" min="1" value="1" /&gt;&lt;/div&gt;
      &lt;div class="card-section-title" style="color:var(--gold)"&gt;Доходы (с НДС)&lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Выручка 1 полугодие&lt;/label&gt;&lt;input type="number" id="osn-r1" min="0" value="0" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Выручка 2 полугодие&lt;/label&gt;&lt;input type="number" id="osn-r2" min="0" value="0" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="card-section-title" style="color:var(--gold)"&gt;Расходы&lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Закупки с НДС&lt;/label&gt;&lt;input type="number" id="osn-ev" min="0" value="0" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Расходы без НДС&lt;/label&gt;&lt;input type="number" id="osn-en" min="0" value="0" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="card-section-title" style="color:var(--gold)"&gt;Персонал&lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;ФОТ за год&lt;/label&gt;&lt;input type="number" id="osn-pay" min="0" value="0" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;МРОТ&lt;/label&gt;&lt;input type="number" id="osn-mrot" min="0" value="25000" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;button class="btn" id="osn-calc" type="button"&gt;Рассчитать&lt;/button&gt;
      &lt;div id="osn-res"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="tax-subsection" data-taxsub="npd"&gt;
      &lt;div class="ib"&gt;Налог на профессиональный доход (самозанятые): 4% от физлиц, 6% от юрлиц. Лимит 2,4 млн ₽/год.&lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Год&lt;/label&gt;&lt;select id="npd-year"&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="fg"&gt;&lt;label&gt;Регион&lt;/label&gt;&lt;select id="npd-reg"&gt;&lt;option value="std"&gt;Стандартный&lt;/option&gt;&lt;option value="new"&gt;Новый (бонус 10 000)&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Доход от физлиц (4%)&lt;/label&gt;&lt;input type="number" id="npd-phys" min="0" value="0" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Доход от юрлиц (6%)&lt;/label&gt;&lt;input type="number" id="npd-legal" min="0" value="0" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Бонус&lt;/label&gt;&lt;input type="number" id="npd-bonus" min="0" max="10000" value="0" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Уже уплачено&lt;/label&gt;&lt;input type="number" id="npd-paid" min="0" value="0" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;button class="btn" id="npd-calc" type="button"&gt;Рассчитать&lt;/button&gt;
      &lt;div id="npd-res"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="tax-subsection" data-taxsub="compare"&gt;
      &lt;div class="ib"&gt;Сравнение всех режимов налогообложения. Система порекомендует оптимальный по прибыли.&lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Форма&lt;/label&gt;&lt;select id="cmp-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="fg"&gt;&lt;label&gt;Год&lt;/label&gt;&lt;select id="cmp-year"&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&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Категория взносов&lt;/label&gt;&lt;select id="cmp-cat"&gt;&lt;option value="regular"&gt;Обычная&lt;/option&gt;&lt;option value="msp"&gt;МСП (15%)&lt;/option&gt;&lt;option value="it"&gt;ИТ&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;&lt;input type="checkbox" id="cmp-priority" /&gt; Приоритетная отрасль (МСП)&lt;/label&gt;&lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;&lt;input type="checkbox" id="cmp-it-accred" checked="checked" /&gt; Аккредитация Минцифры (ИТ)&lt;/label&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Доля IT-доходов, %&lt;/label&gt;&lt;input type="number" id="cmp-it-share" min="0" max="100" value="70" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Выручка&lt;/label&gt;&lt;input type="number" id="cmp-rev" min="0" value="10000000" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Закупки&lt;/label&gt;&lt;input type="number" id="cmp-exp" min="0" value="5000000" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Прочие расходы&lt;/label&gt;&lt;input type="number" id="cmp-oe" min="0" value="500000" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;ФОТ&lt;/label&gt;&lt;input type="number" id="cmp-pay" min="0" value="2000000" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Сотрудников&lt;/label&gt;&lt;input type="number" id="cmp-emp" min="0" value="3" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Закупки с НДС?&lt;/label&gt;&lt;select id="cmp-iv"&gt;&lt;option value="y"&gt;Да&lt;/option&gt;&lt;option value="n"&gt;Нет&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;button class="btn" id="cmp-calc" type="button"&gt;Сравнить&lt;/button&gt;
      &lt;div id="cmp-res"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="tax-subsection" data-taxsub="cal"&gt;
      &lt;div class="ib"&gt;Сроки уплаты налогов и сдачи отчётности на выбранный год.&lt;/div&gt;
      &lt;div class="form-row"&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Режим&lt;/label&gt;&lt;select id="cal-regime"&gt;&lt;option value="usn_ip"&gt;ИП УСН без сотрудников&lt;/option&gt;&lt;option value="usn_emp"&gt;ИП УСН с сотрудниками&lt;/option&gt;&lt;option value="usn_ooo"&gt;ООО УСН&lt;/option&gt;&lt;option value="osn"&gt;ОСН&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Год&lt;/label&gt;&lt;select id="cal-year"&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&gt;
      &lt;button class="btn" id="taxcal-calc" type="button"&gt;Показать календарь&lt;/button&gt;
      &lt;div id="taxcal-res"&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="search"&gt;
    &lt;h1 class="section-title"&gt;? Глобальный &lt;span class="accent"&gt;поиск&lt;/span&gt;&lt;/h1&gt;
    &lt;div class="ib info"&gt;Введите запрос в строку поиска в верхней панели. Система найдёт сделки, клиентов, задачи и товары.&lt;/div&gt;
    &lt;div class="stats-grid"&gt;&lt;div class="stat-card blue"&gt;&lt;div class="label"&gt;Найдено&lt;/div&gt;&lt;div class="value" id="search-count"&gt;0&lt;/div&gt;&lt;div class="sub"&gt;результатов&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div id="search-results"&gt;&lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="activity"&gt;
    &lt;h1 class="section-title"&gt;? Лента &lt;span class="accent"&gt;событий&lt;/span&gt;&lt;/h1&gt;
    &lt;div class="dash-card"&gt;&lt;h3&gt;Все действия в системе&lt;/h3&gt;&lt;div id="activity-full-list"&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="settings"&gt;
    &lt;h1 class="section-title"&gt;⚙️ Настройки &lt;span class="accent"&gt;компании&lt;/span&gt;&lt;/h1&gt;
    &lt;div class="ib info"&gt;Реквизиты используются в экспорте PDF/Excel и при формировании документов.&lt;/div&gt;
    &lt;div class="settings-grid"&gt;
      &lt;div class="settings-card"&gt;&lt;h3&gt;? Реквизиты компании&lt;/h3&gt;&lt;p&gt;Основная информация для документов и отчётов.&lt;/p&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Название организации &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;input type="text" id="set-company-name" placeholder="ООО «Пандора Консалтинг»" /&gt;&lt;/div&gt;
        &lt;div class="form-row"&gt;&lt;div class="fg"&gt;&lt;label&gt;ИНН&lt;/label&gt;&lt;input type="text" id="set-inn" maxlength="12" placeholder="7700000000" /&gt;&lt;/div&gt;&lt;div class="fg"&gt;&lt;label&gt;КПП&lt;/label&gt;&lt;input type="text" id="set-kpp" maxlength="9" placeholder="770001001" /&gt;&lt;/div&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;ОГРН&lt;/label&gt;&lt;input type="text" id="set-ogrn" maxlength="15" placeholder="1027700000000" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Юридический адрес&lt;/label&gt;&lt;input type="text" id="set-address" placeholder="г. Москва, ул. Ленина, 1" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="settings-card"&gt;&lt;h3&gt;? Контакты&lt;/h3&gt;&lt;p&gt;Контактная информация компании.&lt;/p&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Телефон&lt;/label&gt;&lt;input type="text" id="set-phone" placeholder="+7 495 000-00-00" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Email&lt;/label&gt;&lt;input type="email" id="set-email" placeholder="info@company.ru" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Сайт&lt;/label&gt;&lt;input type="text" id="set-website" placeholder="https://company.ru" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="settings-card"&gt;&lt;h3&gt;✍️ Подписант&lt;/h3&gt;&lt;p&gt;Лицо, подписывающее документы.&lt;/p&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Должность&lt;/label&gt;&lt;input type="text" id="set-signer-role" placeholder="Генеральный директор" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;ФИО&lt;/label&gt;&lt;input type="text" id="set-signer-name" placeholder="Иванов Иван Иванович" /&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Действует на основании&lt;/label&gt;&lt;input type="text" id="set-signer-basis" placeholder="Устава" /&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="settings-card"&gt;&lt;h3&gt;? Внешний вид&lt;/h3&gt;&lt;p&gt;Персональные настройки интерфейса.&lt;/p&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Тема оформления&lt;/label&gt;&lt;select id="set-theme"&gt;&lt;option value="light"&gt;☀️ Светлая (высокий контраст)&lt;/option&gt;&lt;option value="dark"&gt;? Тёмная&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
        &lt;div class="fg"&gt;&lt;label&gt;Валюта по умолчанию&lt;/label&gt;&lt;select id="set-currency"&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;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div style="margin-top:24px;display:flex;gap:12px;flex-wrap:wrap"&gt;
      &lt;button class="btn btn-green" id="btn-save-settings"&gt;? Сохранить настройки&lt;/button&gt;
      &lt;button class="btn btn-o" id="btn-reset-settings"&gt;Сбросить&lt;/button&gt;
    &lt;/div&gt;
  &lt;/section&gt;
  &lt;section class="section" data-section="backup"&gt;
    &lt;h1 class="section-title"&gt;? Резервные &lt;span class="accent"&gt;копии&lt;/span&gt;&lt;/h1&gt;
    &lt;div class="ib"&gt;Резервная копия сохраняет ВСЕ данные системы: сделки, клиенты, задачи, склад, документы, настройки, история.&lt;/div&gt;
    &lt;div class="settings-grid"&gt;
      &lt;div class="settings-card"&gt;&lt;h3&gt;? Экспорт данных&lt;/h3&gt;&lt;p&gt;Скачать JSON-файл со всеми данными.&lt;/p&gt;
        &lt;div id="backup-export-info" style="font-family:var(--fm);font-size:.82rem;color:var(--dim);margin-bottom:14px;line-height:1.7"&gt;&lt;/div&gt;
        &lt;button class="btn btn-green" id="btn-export-all"&gt;? Скачать резервную копию&lt;/button&gt;
      &lt;/div&gt;
      &lt;div class="settings-card"&gt;&lt;h3&gt;? Импорт данных&lt;/h3&gt;&lt;p&gt;Загрузить данные из ранее созданного JSON-файла. &lt;strong&gt;Внимание:&lt;/strong&gt; текущие данные будут заменены!&lt;/p&gt;
        &lt;div class="ib warn"&gt;&lt;strong&gt;⚠️ Важно:&lt;/strong&gt; перед импортом рекомендуем сделать экспорт текущих данных.&lt;/div&gt;
        &lt;input type="file" id="file-import" accept=".json" style="display:none" /&gt;
        &lt;button class="btn btn-violet" id="btn-import-trigger"&gt;? Выбрать файл&lt;/button&gt;
      &lt;/div&gt;
      &lt;div class="settings-card"&gt;&lt;h3&gt;?️ Очистка данных&lt;/h3&gt;&lt;p&gt;Полностью удалить все данные. Действие необратимо.&lt;/p&gt;
        &lt;div class="ib err"&gt;&lt;strong&gt;⚠️ Опасная операция:&lt;/strong&gt; все данные будут удалены безвозвратно.&lt;/div&gt;
        &lt;button class="btn btn-d" id="btn-clear-all"&gt;Удалить все данные&lt;/button&gt;
      &lt;/div&gt;
      &lt;div class="settings-card"&gt;&lt;h3&gt;? Демо-данные&lt;/h3&gt;&lt;p&gt;Загрузить демонстрационные данные для ознакомления.&lt;/p&gt;
        &lt;div class="ib info"&gt;Будут добавлены: 5 сделок, 5 клиентов, 5 задач, 6 товаров.&lt;/div&gt;
        &lt;button class="btn btn-o" id="btn-load-demo"&gt;Загрузить демо-данные&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;
&lt;/main&gt;
&lt;div class="modal-overlay" id="deal-modal"&gt;
  &lt;div class="modal"&gt;
    &lt;h2 id="deal-modal-title"&gt;Новая сделка&lt;/h2&gt;
    &lt;input type="hidden" id="deal-edit-id" /&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Название сделки &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;input type="text" id="deal-name" placeholder="Поставка оборудования" /&gt;&lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Клиент&lt;/label&gt;&lt;select id="deal-client"&gt;&lt;option value=""&gt;— Не выбран —&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Сумма (₽) &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;input type="number" id="deal-amount" min="0" placeholder="500000" /&gt;&lt;/div&gt;
    &lt;div class="form-row"&gt;
      &lt;div class="fg"&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="fg"&gt;&lt;label&gt;Этап&lt;/label&gt;
        &lt;select id="deal-stage"&gt;&lt;option value="new"&gt;Новая&lt;/option&gt;&lt;option value="progress"&gt;В работе&lt;/option&gt;&lt;option value="negotiation"&gt;Переговоры&lt;/option&gt;&lt;option value="won"&gt;Сделка ✓&lt;/option&gt;&lt;option value="lost"&gt;Отказ ✗&lt;/option&gt;&lt;/select&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="form-row"&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Менеджер&lt;/label&gt;&lt;select id="deal-manager"&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;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Дата закрытия&lt;/label&gt;&lt;input type="date" id="deal-date" /&gt;&lt;/div&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 class="modal-overlay" id="client-modal"&gt;
  &lt;div class="modal"&gt;
    &lt;h2 id="client-modal-title"&gt;Новый клиент&lt;/h2&gt;
    &lt;input type="hidden" id="client-edit-id" /&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Название / ФИО &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;input type="text" id="client-name" placeholder="ООО «Ромашка» или Иванов Иван" /&gt;&lt;/div&gt;
    &lt;div class="form-row"&gt;
      &lt;div class="fg"&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="fg"&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="fg"&gt;&lt;label&gt;ИНН&lt;/label&gt;&lt;input type="text" id="client-inn" maxlength="12" placeholder="7700000000" /&gt;&lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;КПП&lt;/label&gt;&lt;input type="text" id="client-kpp" maxlength="9" placeholder="770001001" /&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="form-row"&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Контактное лицо&lt;/label&gt;&lt;input type="text" id="client-contact" placeholder="Иванов Иван" /&gt;&lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Телефон&lt;/label&gt;&lt;input type="text" id="client-phone" placeholder="+7 900 000-00-00" /&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="form-row"&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Email&lt;/label&gt;&lt;input type="email" id="client-email" placeholder="info@example.ru" /&gt;&lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Менеджер&lt;/label&gt;&lt;select id="client-manager"&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;/div&gt;
    &lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Адрес&lt;/label&gt;&lt;input type="text" id="client-address" placeholder="г. Москва, ул. Ленина, 1" /&gt;&lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Заметки&lt;/label&gt;&lt;textarea id="client-notes" placeholder="Дополнительная информация..."&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"&gt;&lt;div id="client-view-content"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="modal-overlay" id="task-modal"&gt;
  &lt;div class="modal"&gt;
    &lt;h2 id="task-modal-title"&gt;Новая задача&lt;/h2&gt;
    &lt;input type="hidden" id="task-edit-id" /&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Название задачи &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;input type="text" id="task-title" placeholder="Позвонить клиенту" /&gt;&lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Описание&lt;/label&gt;&lt;textarea id="task-desc" placeholder="Детали задачи..."&gt;&lt;/textarea&gt;&lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Клиент&lt;/label&gt;&lt;select id="task-client"&gt;&lt;option value=""&gt;— Не выбран —&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
    &lt;div class="form-row"&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Тип&lt;/label&gt;&lt;select id="task-type"&gt;&lt;option value="call"&gt;? Звонок&lt;/option&gt;&lt;option value="meeting"&gt;? Встреча&lt;/option&gt;&lt;option value="email"&gt;? Письмо&lt;/option&gt;&lt;option value="task"&gt;? Задача&lt;/option&gt;&lt;option value="payment"&gt;? Оплата&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
      &lt;div class="fg"&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&gt;
    &lt;div class="form-row"&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Исполнитель&lt;/label&gt;&lt;select id="task-assignee"&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;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Срок &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;input type="date" id="task-due" /&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Статус&lt;/label&gt;&lt;select id="task-status"&gt;&lt;option value="todo" selected="selected"&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 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 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="fg"&gt;&lt;label&gt;Название товара &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;input type="text" id="wh-name" placeholder="Ноутбук ASUS X515" /&gt;&lt;/div&gt;
    &lt;div class="form-row"&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Артикул (SKU)&lt;/label&gt;&lt;input type="text" id="wh-sku" placeholder="ASU-001" /&gt;&lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Категория&lt;/label&gt;&lt;input type="text" id="wh-category" placeholder="Электроника" list="wh-cat-list" /&gt;&lt;datalist id="wh-cat-list"&gt;&lt;/datalist&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="form-row"&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Ед. измерения&lt;/label&gt;&lt;select id="wh-unit"&gt;&lt;option value="шт"&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;option value="упак"&gt;упак&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Количество &lt;span class="req"&gt;*&lt;/span&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="fg"&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="fg"&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="fg"&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-product-cancel" type="button"&gt;Отмена&lt;/button&gt;
      &lt;button class="btn" id="wh-product-save" 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="fg"&gt;&lt;label&gt;Количество &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;input type="number" id="wh-move-qty" min="1" value="1" /&gt;&lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Связать со сделкой&lt;/label&gt;&lt;select id="wh-move-deal"&gt;&lt;option value=""&gt;— Не связывать —&lt;/option&gt;&lt;/select&gt;&lt;div class="hint"&gt;При расходе можно привязать к сделке/клиенту&lt;/div&gt;&lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Комментарий&lt;/label&gt;&lt;input type="text" id="wh-move-comment" placeholder="Поставка / Продажа клиенту" /&gt;&lt;/div&gt;
    &lt;div class="modal-actions"&gt;
      &lt;button class="btn btn-secondary" id="wh-move-cancel" type="button"&gt;Отмена&lt;/button&gt;
      &lt;button class="btn" id="wh-move-save" type="button"&gt;Провести&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="modal-overlay" id="doc-form-modal"&gt;
  &lt;div class="modal wide"&gt;
    &lt;h2 id="doc-form-title"&gt;Новый документ&lt;/h2&gt;
    &lt;input type="hidden" id="doc-edit-id" /&gt;
    &lt;div class="form-row-3"&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Тип документа &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;
        &lt;select id="doc-type"&gt;&lt;option value="invoice"&gt;Счёт на оплату&lt;/option&gt;&lt;option value="act"&gt;Акт выполненных работ&lt;/option&gt;&lt;option value="proposal"&gt;Коммерческое предложение&lt;/option&gt;&lt;/select&gt;
      &lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Номер&lt;/label&gt;&lt;input type="text" id="doc-number" placeholder="Авто" /&gt;&lt;/div&gt;
      &lt;div class="fg"&gt;&lt;label&gt;Дата &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;input type="date" id="doc-date" /&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Клиент &lt;span class="req"&gt;*&lt;/span&gt;&lt;/label&gt;&lt;select id="doc-client"&gt;&lt;option value=""&gt;— Выберите клиента —&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
    &lt;div class="fg"&gt;&lt;label&gt;Комментарий / назначение платежа&lt;/label&gt;&lt;textarea id="doc-comment" placeholder="Например: Оплата по договору № 12 от 01.01.2026"&gt;&lt;/textarea&gt;&lt;/div&gt;
    &lt;div style="display:flex;justify-content:space-between;align-items:center;margin:16px 0 10px"&gt;
      &lt;strong style="font-family:var(--fd);font-size:.95rem;color:var(--gold)"&gt;Позиции документа&lt;/strong&gt;
      &lt;div style="display:flex;gap:8px"&gt;
        &lt;button class="btn btn-o btn-s" id="doc-add-from-wh" type="button"&gt;? Со склада&lt;/button&gt;
        &lt;button class="btn btn-green btn-s" id="doc-add-item" type="button"&gt;+ Позиция&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div id="doc-items-list"&gt;&lt;/div&gt;
    &lt;div class="doc-total"&gt;&lt;span&gt;ИТОГО:&lt;/span&gt;&lt;span class="tv" id="doc-total-value"&gt;0 ₽&lt;/span&gt;&lt;/div&gt;
    &lt;div class="modal-actions"&gt;
      &lt;button class="btn btn-secondary" id="doc-cancel-btn" type="button"&gt;Отмена&lt;/button&gt;
      &lt;button class="btn" id="doc-save-btn" type="button"&gt;? Сохранить документ&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="modal-overlay" id="doc-preview-modal"&gt;
  &lt;div class="modal wide"&gt;
    &lt;h2&gt;Предпросмотр документа&lt;/h2&gt;
    &lt;div id="doc-preview-content" style="background:#fff;color:#000;border-radius:8px;padding:24px;border:1px solid var(--line-strong);font-size:13px;line-height:1.5"&gt;&lt;/div&gt;
    &lt;div class="modal-actions"&gt;
      &lt;button class="btn btn-secondary" id="doc-preview-close" type="button"&gt;Закрыть&lt;/button&gt;
      &lt;button class="btn btn-green" id="doc-print-btn" type="button"&gt;? Печать / PDF&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div id="docs-print-area"&gt;&lt;/div&gt;
&lt;div class="toast" id="main-toast"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
'use strict';
const PandoraStore={STORAGE_KEY:'pandora_store_v1',VERSION:1,subscribers:[],
defaultData(){return{version:this.VERSION,deals:[],clients:[],tasks:[],docs:[],warehouse:{products:[],moves:[]},settings:{company:{name:'',inn:'',kpp:'',ogrn:'',address:''},contacts:{phone:'',email:'',website:''},signer:{role:'',name:'',basis:'Устава'},theme:'light',currency:'₽'},activity:[],history:[]}},
data:null,
load(){try{const raw=localStorage.getItem(this.STORAGE_KEY);if(raw){const parsed=JSON.parse(raw);if(parsed&amp;&amp;parsed.version===this.VERSION){this.data=parsed;const defaults=this.defaultData();for(const key in defaults)if(this.data[key]===undefined)this.data[key]=defaults[key];return}}}catch(e){console.warn('Load error:',e)}this.data=this.defaultData();this.save()},
save(){try{localStorage.setItem(this.STORAGE_KEY,JSON.stringify(this.data));this.notify()}catch(e){console.error('Save error:',e)}},
subscribe(fn){this.subscribers.push(fn)},
notify(){this.subscribers.forEach(fn=&gt;{try{fn(this.data)}catch(e){}})},
logActivity(type,title,meta=''){this.data.activity.unshift({type,title,meta,timestamp:new Date().toISOString()});if(this.data.activity.length&gt;200)this.data.activity.length=200},
exportAll(){const blob=new Blob([JSON.stringify(this.data,null,2)],{type:'application/json;charset=utf-8'});const url=URL.createObjectURL(blob);const link=document.createElement('a');const date=new Date().toISOString().slice(0,10);const companyName=(this.data.settings.company.name||'pandora').replace(/[^a-zа-я0-9]/gi,'_');link.href=url;link.download=`pandora-backup-${companyName}-${date}.json`;link.click();setTimeout(()=&gt;URL.revokeObjectURL(url),100);this.logActivity('backup','Сделан экспорт данных');this.save()},
importAll(file){return new Promise((resolve,reject)=&gt;{const reader=new FileReader();reader.onload=(e)=&gt;{try{const imported=JSON.parse(e.target.result);if(!imported||typeof imported!=='object')throw new Error('Invalid JSON');if(imported.version!==this.VERSION){if(!confirm('Версия данных отличается. Попробовать импортировать?')){reject();return}}this.data={...this.defaultData(),...imported};this.logActivity('import','Импорт данных из файла');this.save();resolve(true)}catch(err){reject(err)}};reader.onerror=()=&gt;reject(new Error('File read error'));reader.readAsText(file,'utf-8')})},
clearAll(){this.data=this.defaultData();this.logActivity('clear','Все данные очищены');this.save()},
loadDemo(){const today=new Date().toISOString().slice(0,10);const future=(days)=&gt;{const d=new Date();d.setDate(d.getDate()+days);return d.toISOString().slice(0,10)};
this.data.clients=[{id:1,name:'ООО «ТехноПарк»',type:'legal',inn:'7712345678',kpp:'771201001',contact:'Смирнов Алексей',phone:'+7 495 123-45-67',email:'info@technopark.ru',address:'Москва, ул. Тверская, 10',status:'vip',manager:'Иванов',notes:'Крупный клиент'},{id:2,name:'ИП Смирнов А.В.',type:'ip',inn:'771234567890',contact:'Смирнов Алексей',phone:'+7 916 000-11-22',email:'smirnov@mail.ru',status:'active',manager:'Петров',notes:''},{id:3,name:'АО «Инвест Групп»',type:'legal',inn:'7798765432',contact:'Кузнецова Мария',phone:'+7 495 987-65-43',email:'invest@group.ru',status:'active',manager:'Сидоров',notes:''},{id:4,name:'ООО «Стартап Лаб»',type:'legal',inn:'7755554444',contact:'Петров Дмитрий',phone:'+7 925 555-44-33',status:'active',manager:'Иванов',notes:''},{id:5,name:'Николаева Елена',type:'person',contact:'Николаева Елена',phone:'+7 903 111-22-33',status:'inactive',manager:'Петров',notes:'Разовая консультация'}];
this.data.deals=[{id:1,name:'Поставка серверов',clientId:1,clientName:'ООО «ТехноПарк»',amount:850000,prob:70,manager:'Иванов',stage:'negotiation',date:future(20)},{id:2,name:'Внедрение CRM',clientId:2,clientName:'ИП Смирнов А.В.',amount:120000,prob:50,manager:'Петров',stage:'progress',date:future(5)},{id:3,name:'Консалтинг',clientId:3,clientName:'АО «Инвест Групп»',amount:350000,prob:90,manager:'Сидоров',stage:'won',date:today},{id:4,name:'Разработка сайта',clientId:4,clientName:'ООО «Стартап Лаб»',amount:200000,prob:30,manager:'Иванов',stage:'new',date:future(35)},{id:5,name:'Аудит',clientId:5,clientName:'Николаева Елена',amount:180000,prob:10,manager:'Петров',stage:'lost',date:future(-10)}];
this.data.tasks=[{id:1,title:'Позвонить по КП',desc:'Уточнить решение по КП',type:'call',priority:'high',status:'todo',assignee:'Иванов',dueDate:today,clientName:'ООО «ТехноПарк»'},{id:2,title:'Встреча в офисе',desc:'Обсудить условия договора',type:'meeting',priority:'medium',status:'progress',assignee:'Петров',dueDate:today,clientName:'АО «Инвест Групп»'},{id:3,title:'Отправить счёт',desc:'Счёт на предоплату 50%',type:'payment',priority:'high',status:'todo',assignee:'Сидоров',dueDate:future(3),clientName:'ООО «Стартап Лаб»'},{id:4,title:'Написать follow-up',desc:'Поблагодарить за встречу',type:'email',priority:'low',status:'done',assignee:'Иванов',dueDate:future(-2),clientName:'ИП Смирнов А.В.'},{id:5,title:'Подготовить презентацию',desc:'Слайды по новому продукту',type:'task',priority:'medium',status:'progress',assignee:'Петров',dueDate:future(10)}];
this.data.warehouse={products:[{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}],moves:[{id:1,productId:1,type:'in',qty:5,date:today,comment:'Поставка от ASUS'},{id:2,productId:2,type:'out',qty:2,date:today,comment:'Продажа'},{id:3,productId:4,type:'out',qty:3,date:today,comment:'Продажа'},{id:4,productId:5,type:'in',qty:20,date:today,comment:'Пополнение склада'}]};
this.data.docs=[{id:1,type:'invoice',clientId:1,number:'СЧ-2026-001',date:today,comment:'Оплата за поставку серверов',items:[{name:'Ноутбук ASUS X515',qty:5,price:65000},{name:'Монитор Dell 24"',qty:5,price:18500}]}];
this.logActivity('demo','Загружены демо-данные');this.save()},
getMetrics(){const data=this.data;const currency=data.settings.currency||'₽';const fmt=(n)=&gt;new Intl.NumberFormat('ru-RU').format(Math.round(n));const todayISO=new Date().toISOString().slice(0,10);const deals=data.deals||[];const dealsWon=deals.filter(d=&gt;d.stage==='won');const dealsLost=deals.filter(d=&gt;d.stage==='lost');const dealsActive=deals.filter(d=&gt;!['won','lost'].includes(d.stage));const totalRevenue=dealsWon.reduce((s,d)=&gt;s+(d.amount||0),0);const forecast=dealsActive.reduce((s,d)=&gt;s+(d.amount||0)*(d.prob||0)/100,0);const conversion=deals.length&gt;0?(dealsWon.length/deals.length*100).toFixed(1):0;const clients=data.clients||[];const clientsActive=clients.filter(c=&gt;c.status==='active'||c.status==='vip');const clientsVip=clients.filter(c=&gt;c.status==='vip');const tasks=data.tasks||[];const tasksActive=tasks.filter(t=&gt;t.status!=='done');const tasksOverdue=tasks.filter(t=&gt;t.dueDate&amp;&amp;t.dueDate&lt;todayISO&amp;&amp;t.status!=='done');const tasksToday=tasks.filter(t=&gt;t.dueDate===todayISO&amp;&amp;t.status!=='done');const tasksDone=tasks.filter(t=&gt;t.status==='done');const products=(data.warehouse&amp;&amp;data.warehouse.products)||[];const stockValue=products.reduce((s,p)=&gt;s+(p.qty||0)*(p.cost||0),0);const stockLow=products.filter(p=&gt;p.qty&gt;0&amp;&amp;p.qty&lt;=p.minQty).length;const stockOut=products.filter(p=&gt;p.qty===0).length;const docs=data.docs||[];return{currency,fmt,deals:{total:deals.length,active:dealsActive.length,won:dealsWon.length,lost:dealsLost.length,totalRevenue,forecast,conversion},clients:{total:clients.length,active:clientsActive.length,vip:clientsVip.length},tasks:{total:tasks.length,active:tasksActive.length,overdue:tasksOverdue.length,today:tasksToday.length,done:tasksDone.length},warehouse:{total:products.length,stockValue,stockLow,stockOut},docs:{total:docs.length}}}};
const PandoraUI={$:function(id){return document.getElementById(id)},
toast:function(msg,type){type=type||'success';var t=this.$('main-toast');if(!t)return;t.textContent=msg;t.className='toast show '+(type!=='success'?type:'');setTimeout(function(){t.className='toast'},3000)},
switchSection:function(view){var links=document.querySelectorAll('#pd-root .nav-link');links.forEach(function(l){l.classList.remove('active')});var active=document.querySelector('#pd-root .nav-link[data-view="'+view+'"]');if(active)active.classList.add('active');document.querySelectorAll('#pd-root .section').forEach(function(s){s.classList.remove('active')});var section=document.querySelector('#pd-root .section[data-section="'+view+'"]');if(section)section.classList.add('active');var names={dashboard:'Дашборд',search:'Поиск',activity:'Лента событий',settings:'Настройки',backup:'Резервные копии',deals:'Сделки',clients:'Клиенты',tasks:'Задачи',calendar:'Календарь',warehouse:'Склад',docs:'Документы',tax:'Бухгалтерия и налоги'};this.$('breadcrumbs').textContent='Пандора CRM / '+(names[view]||view);if(view==='calendar')ModuleCalendar.render();window.scrollTo({top:0,behavior:'smooth'})},
initNav:function(){var nav=this.$('main-nav');if(!nav)return;var self=this;nav.addEventListener('click',function(e){var link=e.target.closest('.nav-link');if(!link)return;e.preventDefault();var view=link.getAttribute('data-view');if(view)self.switchSection(view)})},
applyTheme:function(theme){var root=this.$('pd-root');if(root)root.setAttribute('data-theme',theme);var btn=this.$('btn-theme');if(btn)btn.textContent=theme==='dark'?'☀️':'?';var sel=this.$('set-theme');if(sel)sel.value=theme},
todayISO:function(){return new Date().toISOString().slice(0,10)},
fmtDate:function(iso){if(!iso)return '';var p=iso.split('-');if(p.length!==3)return iso;return p[2]+'.'+p[1]+'.'+p[0]},
nextId:function(arr){return arr.length?Math.max.apply(null,arr.map(function(x){return x.id}))+1:1},
esc:function(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]})},
populateClientSelect:function(selectId,selectedName){var sel=this.$(selectId);if(!sel)return;var clients=PandoraStore.data.clients;sel.innerHTML='&lt;option value=""&gt;— Не выбран —&lt;/option&gt;';clients.forEach(function(c){var opt=document.createElement('option');opt.value=c.name;opt.textContent=c.name;if(selectedName&amp;&amp;c.name===selectedName)opt.selected=true;sel.appendChild(opt)})},
populateDealSelect:function(selectId,selectedName){var sel=this.$(selectId);if(!sel)return;var deals=PandoraStore.data.deals;sel.innerHTML='&lt;option value=""&gt;— Не связывать —&lt;/option&gt;';deals.forEach(function(d){var opt=document.createElement('option');opt.value=d.name;opt.textContent=d.name+' ('+(d.clientName||'—')+')';if(selectedName&amp;&amp;d.name===selectedName)opt.selected=true;sel.appendChild(opt)})},
updateNavBadges:function(){var d=PandoraStore.data;var set=function(id,val){var el=PandoraUI.$(id);if(el)el.textContent=val};set('nav-deals-count',d.deals.length);set('nav-clients-count',d.clients.length);set('nav-tasks-count',d.tasks.filter(function(t){return t.status!=='done'}).length);set('nav-wh-count',(d.warehouse&amp;&amp;d.warehouse.products)?d.warehouse.products.length:0);set('nav-docs-count',d.docs.length)}};
const ModuleDashboard={render:function(){var m=PandoraStore.getMetrics();var data=PandoraStore.data;var banner=PandoraUI.$('company-banner');if(banner){var c=data.settings.company;if(c.name){banner.innerHTML='&lt;strong&gt;'+PandoraUI.esc(c.name)+'&lt;/strong&gt;'+(c.inn?' · ИНН '+PandoraUI.esc(c.inn):'')+(c.address?' · '+PandoraUI.esc(c.address):'');banner.style.display='block'}else{banner.innerHTML='⚙️ &lt;strong&gt;Заполните реквизиты компании&lt;/strong&gt; в Настройках для документов и отчётов. &lt;a href="#" style="color:var(--violet);font-weight:700" id="go-settings"&gt;Перейти к настройкам →&lt;/a&gt;';banner.style.display='block';var link=PandoraUI.$('go-settings');if(link)link.onclick=function(e){e.preventDefault();PandoraUI.switchSection('settings')}}}
var mainStats=PandoraUI.$('dash-main-stats');if(mainStats){mainStats.innerHTML='&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Выручка (закрытые сделки)&lt;/div&gt;&lt;div class="value"&gt;'+m.fmt(m.deals.totalRevenue)+' '+m.currency+'&lt;/div&gt;&lt;div class="sub"&gt;'+m.deals.won+' из '+m.deals.total+' сделок&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"&gt;'+m.fmt(m.deals.forecast)+' '+m.currency+'&lt;/div&gt;&lt;div class="sub"&gt;взвешенный по воронке&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"&gt;'+m.deals.conversion+'%&lt;/div&gt;&lt;div class="sub"&gt;успешных сделок&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"&gt;'+m.clients.total+'&lt;/div&gt;&lt;div class="sub"&gt;активных: '+m.clients.active+', VIP: '+m.clients.vip+'&lt;/div&gt;&lt;/div&gt;&lt;div class="stat-card blue"&gt;&lt;div class="label"&gt;Стоимость склада&lt;/div&gt;&lt;div class="value"&gt;'+m.fmt(m.warehouse.stockValue)+' '+m.currency+'&lt;/div&gt;&lt;div class="sub"&gt;'+m.warehouse.total+' позиций&lt;/div&gt;&lt;/div&gt;&lt;div class="stat-card orange"&gt;&lt;div class="label"&gt;Документов&lt;/div&gt;&lt;div class="value"&gt;'+m.docs.total+'&lt;/div&gt;&lt;div class="sub"&gt;создано&lt;/div&gt;&lt;/div&gt;'}
var dealsEl=PandoraUI.$('dash-deals');if(dealsEl)dealsEl.innerHTML='&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Всего сделок&lt;/span&gt;&lt;span class="v"&gt;'+m.deals.total+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;В работе&lt;/span&gt;&lt;span class="v violet"&gt;'+m.deals.active+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Закрыто успешно&lt;/span&gt;&lt;span class="v green"&gt;'+m.deals.won+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Отказы&lt;/span&gt;&lt;span class="v red"&gt;'+m.deals.lost+'&lt;/span&gt;&lt;/div&gt;';
var clientsEl=PandoraUI.$('dash-clients');if(clientsEl)clientsEl.innerHTML='&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Всего&lt;/span&gt;&lt;span class="v"&gt;'+m.clients.total+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Активных&lt;/span&gt;&lt;span class="v green"&gt;'+m.clients.active+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;VIP&lt;/span&gt;&lt;span class="v gold"&gt;'+m.clients.vip+'&lt;/span&gt;&lt;/div&gt;';
var tasksEl=PandoraUI.$('dash-tasks');if(tasksEl)tasksEl.innerHTML='&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Всего задач&lt;/span&gt;&lt;span class="v"&gt;'+m.tasks.total+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Активных&lt;/span&gt;&lt;span class="v violet"&gt;'+m.tasks.active+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Просрочено&lt;/span&gt;&lt;span class="v red"&gt;'+m.tasks.overdue+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Сегодня&lt;/span&gt;&lt;span class="v gold"&gt;'+m.tasks.today+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Выполнено&lt;/span&gt;&lt;span class="v green"&gt;'+m.tasks.done+'&lt;/span&gt;&lt;/div&gt;';
var whEl=PandoraUI.$('dash-warehouse');if(whEl)whEl.innerHTML='&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Позиций&lt;/span&gt;&lt;span class="v"&gt;'+m.warehouse.total+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Стоимость&lt;/span&gt;&lt;span class="v gold"&gt;'+m.fmt(m.warehouse.stockValue)+' '+m.currency+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Заканчиваются&lt;/span&gt;&lt;span class="v gold"&gt;'+m.warehouse.stockLow+'&lt;/span&gt;&lt;/div&gt;&lt;div class="dash-row"&gt;&lt;span class="k"&gt;Нет в наличии&lt;/span&gt;&lt;span class="v red"&gt;'+m.warehouse.stockOut+'&lt;/span&gt;&lt;/div&gt;';
var actEl=PandoraUI.$('dash-activity');if(actEl){var acts=data.activity.slice(0,8);if(!acts.length){actEl.innerHTML='&lt;p style="color:var(--muted);font-size:.88rem;padding:10px 0"&gt;Пока нет действий. Загрузите демо-данные в разделе «Резервные копии».&lt;/p&gt;'}else{actEl.innerHTML=acts.map(function(a){var ic=ModuleActivity.getIcon(a.type);var time=new Date(a.timestamp);var timeStr=time.toLocaleDateString('ru-RU')+' '+time.toLocaleTimeString('ru-RU',{hour:'2-digit',minute:'2-digit'});return '&lt;div class="activity-item"&gt;&lt;div class="ico '+ic[1]+'"&gt;'+ic[0]+'&lt;/div&gt;&lt;div class="body"&gt;&lt;div class="title"&gt;'+PandoraUI.esc(a.title)+'&lt;/div&gt;&lt;div class="meta"&gt;'+timeStr+(a.meta?' · '+PandoraUI.esc(a.meta):'')+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'}).join('')}}
var tipsEl=PandoraUI.$('dash-tips');if(tipsEl){var tips=[];if(!data.settings.company.name)tips.push('⚙️ Заполните реквизиты компании в настройках — это нужно для документов и экспорта.');if(m.tasks.overdue&gt;0)tips.push('⚠️ Просроченных задач: '+m.tasks.overdue+'. Проверьте раздел «Задачи».');if(m.warehouse.stockOut&gt;0)tips.push('? Нет в наличии позиций: '+m.warehouse.stockOut+'. Возможно, нужно пополнить склад.');if(m.warehouse.stockLow&gt;0)tips.push('⚠️ Заканчиваются: '+m.warehouse.stockLow+' позиций на складе.');if(!data.deals.length&amp;&amp;!data.clients.length)tips.push('? Загрузите демо-данные в разделе «Резервные копии», чтобы увидеть работу системы.');tipsEl.innerHTML=tips.length?tips.map(function(t){return '&lt;div style="padding:6px 0;border-bottom:1px solid var(--line);font-size:.88rem"&gt;'+t+'&lt;/div&gt;'}).join(''):'&lt;p style="color:var(--green);font-weight:700;padding:8px 0"&gt;✓ Всё в порядке. Система работает нормально.&lt;/p&gt;'}}};
const ModuleDeals={STAGES:[{key:'new',label:'Новая'},{key:'progress',label:'В работе'},{key:'negotiation',label:'Переговоры'},{key:'won',label:'Сделка ✓'},{key:'lost',label:'Отказ ✗'}],
getFiltered:function(){var search=(PandoraUI.$('deals-search').value||'').toLowerCase().trim();var manager=PandoraUI.$('deals-manager-filter').value;return PandoraStore.data.deals.filter(function(d){if(manager&amp;&amp;d.manager!==manager)return false;if(search){var hay=(d.name||'')+' '+(d.clientName||'')+' '+(d.manager||'');hay=hay.toLowerCase();if(hay.indexOf(search)===-1)return false}return true})},
renderStats:function(){var m=PandoraStore.getMetrics();var el=PandoraUI.$('deals-stats');if(el)el.innerHTML='&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Всего сделок&lt;/div&gt;&lt;div class="value"&gt;'+m.deals.total+'&lt;/div&gt;&lt;div class="sub"&gt;в системе&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"&gt;'+m.deals.active+'&lt;/div&gt;&lt;div class="sub"&gt;активных&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"&gt;'+m.fmt(m.deals.totalRevenue)+'&lt;/div&gt;&lt;div class="sub"&gt;'+m.currency+' закрыто&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"&gt;'+m.fmt(m.deals.forecast)+'&lt;/div&gt;&lt;div class="sub"&gt;'+m.currency+' взвешенный&lt;/div&gt;&lt;/div&gt;&lt;div class="stat-card blue"&gt;&lt;div class="label"&gt;Конверсия&lt;/div&gt;&lt;div class="value"&gt;'+m.deals.conversion+'%&lt;/div&gt;&lt;div class="sub"&gt;успешных&lt;/div&gt;&lt;/div&gt;'},
render:function(){this.renderStats();var kanban=PandoraUI.$('deals-kanban');if(!kanban)return;var filtered=this.getFiltered();var currency=PandoraStore.data.settings.currency||'₽';var fmt=function(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n))};var self=this;kanban.innerHTML=this.STAGES.map(function(stage){var items=filtered.filter(function(d){return d.stage===stage.key});var sum=items.reduce(function(s,d){return s+(d.amount||0)},0);return '&lt;div class="kanban-col" data-stage="'+stage.key+'"&gt;&lt;div class="kanban-col-header"&gt;&lt;div&gt;&lt;div class="kanban-col-title"&gt;'+stage.label+'&lt;/div&gt;&lt;div class="kanban-col-sum"&gt;'+fmt(sum)+' '+currency+'&lt;/div&gt;&lt;/div&gt;&lt;span class="kanban-col-count"&gt;'+items.length+'&lt;/span&gt;&lt;/div&gt;&lt;div class="kanban-items"&gt;'+items.map(function(d){return self.renderCard(d,fmt,currency)}).join('')+'&lt;/div&gt;&lt;/div&gt;'}).join('');this.attachDnD();this.attachCardActions()},
renderCard:function(d,fmt,currency){return '&lt;div class="k-card" draggable="true" data-id="'+d.id+'" data-type="deal"&gt;&lt;div class="k-card-top"&gt;&lt;div class="k-card-title"&gt;'+PandoraUI.esc(d.name)+'&lt;/div&gt;&lt;div class="k-card-actions"&gt;'+(d.stage!=='won'?'&lt;button class="act-done" data-done="'+d.id+'" title="Завершить"&gt;✓&lt;/button&gt;':'')+'&lt;button class="act-edit" data-edit="'+d.id+'" title="Редактировать"&gt;✏️&lt;/button&gt;&lt;button class="act-del" data-del="'+d.id+'" title="Удалить"&gt;?&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;'+(d.clientName?'&lt;div class="k-card-client"&gt;? '+PandoraUI.esc(d.clientName)+'&lt;/div&gt;':'')+'&lt;div class="k-card-amount"&gt;'+fmt(d.amount||0)+' '+currency+'&lt;/div&gt;&lt;div class="k-card-footer"&gt;&lt;span class="prob-badge"&gt;'+(d.prob||0)+'%&lt;/span&gt;&lt;span class="k-card-meta"&gt;'+(d.manager||'—')+(d.date?' · '+PandoraUI.fmtDate(d.date):'')+'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;'},
attachDnD:function(){var cards=document.querySelectorAll('#deals-kanban .k-card');var cols=document.querySelectorAll('#deals-kanban .kanban-col');cards.forEach(function(card){card.addEventListener('dragstart',function(e){e.dataTransfer.setData('text/plain',card.dataset.id);e.dataTransfer.setData('data-type','deal');card.classList.add('dragging')});card.addEventListener('dragend',function(){card.classList.remove('dragging')})});cols.forEach(function(col){col.addEventListener('dragover',function(e){e.preventDefault();col.classList.add('dragover')});col.addEventListener('dragleave',function(){col.classList.remove('dragover')});col.addEventListener('drop',function(e){e.preventDefault();col.classList.remove('dragover');var id=parseInt(e.dataTransfer.getData('text/plain'));var type=e.dataTransfer.getData('data-type');if(type!=='deal')return;var newStage=col.dataset.stage;var deal=PandoraStore.data.deals.find(function(d){return d.id===id});if(deal&amp;&amp;deal.stage!==newStage){var oldStage=deal.stage;deal.stage=newStage;PandoraStore.logActivity('deal','Сделка «'+deal.name+'»: '+oldStage+' → '+newStage,deal.clientName||'');PandoraStore.save();PandoraUI.toast('✓ Сделка перемещена: '+newStage)}})})},
attachCardActions:function(){var kanban=PandoraUI.$('deals-kanban');if(!kanban)return;var self=this;kanban.querySelectorAll('[data-done]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();var id=parseInt(btn.dataset.done);var deal=PandoraStore.data.deals.find(function(d){return d.id===id});if(deal){deal.stage='won';PandoraStore.logActivity('deal','Сделка «'+deal.name+'» закрыта успешно',deal.clientName||'');PandoraStore.save();PandoraUI.toast('✓ Сделка закрыта')}}});kanban.querySelectorAll('[data-edit]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.openEdit(parseInt(btn.dataset.edit))}});kanban.querySelectorAll('[data-del]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.remove(parseInt(btn.dataset.del))}})},
openAdd:function(){PandoraUI.$('deal-modal-title').textContent='Новая сделка';PandoraUI.$('deal-edit-id').value='';PandoraUI.$('deal-name').value='';PandoraUI.populateClientSelect('deal-client');PandoraUI.$('deal-amount').value='';PandoraUI.$('deal-prob').value='50';PandoraUI.$('deal-stage').value='new';PandoraUI.$('deal-manager').value='Иванов';var d=new Date();d.setDate(d.getDate()+30);PandoraUI.$('deal-date').value=d.toISOString().slice(0,10);PandoraUI.$('deal-modal').classList.add('active')},
openEdit:function(id){var d=PandoraStore.data.deals.find(function(x){return x.id===id});if(!d)return;PandoraUI.$('deal-modal-title').textContent='Редактировать сделку';PandoraUI.$('deal-edit-id').value=d.id;PandoraUI.$('deal-name').value=d.name||'';PandoraUI.populateClientSelect('deal-client',d.clientName);PandoraUI.$('deal-amount').value=d.amount||'';PandoraUI.$('deal-prob').value=d.prob||'50';PandoraUI.$('deal-stage').value=d.stage||'new';PandoraUI.$('deal-manager').value=d.manager||'Иванов';PandoraUI.$('deal-date').value=d.date||'';PandoraUI.$('deal-modal').classList.add('active')},
save:function(){var name=PandoraUI.$('deal-name').value.trim();var amount=parseInt(PandoraUI.$('deal-amount').value)||0;if(!name){PandoraUI.toast('✗ Укажите название сделки','error');return}if(amount&lt;=0){PandoraUI.toast('✗ Укажите сумму сделки','error');return}var editId=PandoraUI.$('deal-edit-id').value;var clientName=PandoraUI.$('deal-client').value;var client=PandoraStore.data.clients.find(function(c){return c.name===clientName});var payload={name:name,amount:amount,clientId:client?client.id:null,clientName:clientName,prob:parseInt(PandoraUI.$('deal-prob').value)||50,stage:PandoraUI.$('deal-stage').value,manager:PandoraUI.$('deal-manager').value,date:PandoraUI.$('deal-date').value};if(editId){var idx=PandoraStore.data.deals.findIndex(function(d){return d.id===parseInt(editId)});if(idx!==-1){PandoraStore.data.deals[idx]=Object.assign({},PandoraStore.data.deals[idx],payload);PandoraStore.logActivity('deal','Сделка «'+name+'» обновлена',clientName);PandoraUI.toast('✓ Сделка обновлена')}}else{payload.id=PandoraUI.nextId(PandoraStore.data.deals);PandoraStore.data.deals.push(payload);PandoraStore.logActivity('deal','Создана сделка «'+name+'»',clientName);PandoraUI.toast('✓ Сделка создана')}PandoraStore.save();PandoraUI.$('deal-modal').classList.remove('active')},
remove:function(id){var d=PandoraStore.data.deals.find(function(x){return x.id===id});if(!d)return;if(!confirm('Удалить сделку «'+d.name+'»?'))return;PandoraStore.data.deals=PandoraStore.data.deals.filter(function(x){return x.id!==id});PandoraStore.logActivity('deal','Сделка «'+d.name+'» удалена',d.clientName||'');PandoraStore.save();PandoraUI.toast('✓ Сделка удалена')}};
const ModuleClients={TYPE_LABELS:{legal:'Юр. лицо',ip:'ИП',person:'Физ. лицо'},STATUS_LABELS:{active:'Активный',vip:'VIP',inactive:'Неактивный'},
getFiltered:function(){var search=(PandoraUI.$('clients-search').value||'').toLowerCase().trim();var type=PandoraUI.$('clients-type-filter').value;var status=PandoraUI.$('clients-status-filter').value;return PandoraStore.data.clients.filter(function(c){if(type&amp;&amp;c.type!==type)return false;if(status&amp;&amp;c.status!==status)return false;if(search){var hay=(c.name||'')+' '+(c.inn||'')+' '+(c.contact||'')+' '+(c.email||'')+' '+(c.phone||'');hay=hay.toLowerCase();if(hay.indexOf(search)===-1)return false}return true})},
renderStats:function(){var m=PandoraStore.getMetrics();var el=PandoraUI.$('clients-stats');if(el)el.innerHTML='&lt;div class="stat-card pink"&gt;&lt;div class="label"&gt;Всего клиентов&lt;/div&gt;&lt;div class="value"&gt;'+m.clients.total+'&lt;/div&gt;&lt;div class="sub"&gt;в базе&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"&gt;'+m.clients.active+'&lt;/div&gt;&lt;div class="sub"&gt;работаем&lt;/div&gt;&lt;/div&gt;&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;VIP&lt;/div&gt;&lt;div class="value"&gt;'+m.clients.vip+'&lt;/div&gt;&lt;div class="sub"&gt;приоритет&lt;/div&gt;&lt;/div&gt;'},
render:function(){this.renderStats();var tbody=PandoraUI.$('clients-tbody');if(!tbody)return;var list=this.getFiltered();var self=this;if(!list.length){tbody.innerHTML='&lt;tr&gt;&lt;td colspan="8" style="text-align:center;color:var(--muted);padding:30px"&gt;Клиенты не найдены&lt;/td&gt;&lt;/tr&gt;';return}
tbody.innerHTML=list.map(function(c){return '&lt;tr data-id="'+c.id+'"&gt;&lt;td&gt;&lt;div class="cell-main"&gt;'+PandoraUI.esc(c.name)+'&lt;/div&gt;'+(c.email?'&lt;div class="cell-sub"&gt;'+PandoraUI.esc(c.email)+'&lt;/div&gt;':'')+'&lt;/td&gt;&lt;td&gt;&lt;span class="badge '+c.type+'"&gt;'+(self.TYPE_LABELS[c.type]||c.type)+'&lt;/span&gt;&lt;/td&gt;&lt;td style="font-family:var(--fm);font-size:.82rem"&gt;'+PandoraUI.esc(c.inn||'—')+'&lt;/td&gt;&lt;td&gt;'+PandoraUI.esc(c.contact||'—')+'&lt;/td&gt;&lt;td style="font-family:var(--fm);font-size:.82rem"&gt;'+PandoraUI.esc(c.phone||'—')+'&lt;/td&gt;&lt;td&gt;'+PandoraUI.esc(c.manager||'—')+'&lt;/td&gt;&lt;td&gt;&lt;span class="badge status-'+c.status+'"&gt;'+(self.STATUS_LABELS[c.status]||c.status)+'&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="row-actions"&gt;&lt;button class="icon-btn edit" data-edit="'+c.id+'" title="Редактировать"&gt;✏️&lt;/button&gt;&lt;button class="icon-btn del" data-del="'+c.id+'" title="Удалить"&gt;?&lt;/button&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;'}).join('');
tbody.querySelectorAll('tr[data-id]').forEach(function(row){row.onclick=function(e){if(e.target.closest('.icon-btn'))return;self.openView(parseInt(row.dataset.id))}});tbody.querySelectorAll('[data-edit]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.openEdit(parseInt(btn.dataset.edit))}});tbody.querySelectorAll('[data-del]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.remove(parseInt(btn.dataset.del))}})},
openAdd:function(){PandoraUI.$('client-modal-title').textContent='Новый клиент';PandoraUI.$('client-edit-id').value='';['client-name','client-inn','client-kpp','client-contact','client-phone','client-email','client-address','client-notes'].forEach(function(id){PandoraUI.$(id).value=''});PandoraUI.$('client-type').value='legal';PandoraUI.$('client-status').value='active';PandoraUI.$('client-manager').value='Иванов';PandoraUI.$('client-modal').classList.add('active')},
openEdit:function(id){var c=PandoraStore.data.clients.find(function(x){return x.id===id});if(!c)return;PandoraUI.$('client-modal-title').textContent='Редактировать клиента';PandoraUI.$('client-edit-id').value=c.id;PandoraUI.$('client-name').value=c.name||'';PandoraUI.$('client-type').value=c.type||'legal';PandoraUI.$('client-status').value=c.status||'active';PandoraUI.$('client-inn').value=c.inn||'';PandoraUI.$('client-kpp').value=c.kpp||'';PandoraUI.$('client-contact').value=c.contact||'';PandoraUI.$('client-phone').value=c.phone||'';PandoraUI.$('client-email').value=c.email||'';PandoraUI.$('client-manager').value=c.manager||'Иванов';PandoraUI.$('client-address').value=c.address||'';PandoraUI.$('client-notes').value=c.notes||'';PandoraUI.$('client-modal').classList.add('active')},
save:function(){var name=PandoraUI.$('client-name').value.trim();if(!name){PandoraUI.toast('✗ Укажите название клиента','error');return}var editId=PandoraUI.$('client-edit-id').value;var payload={name:name,type:PandoraUI.$('client-type').value,status:PandoraUI.$('client-status').value,inn:PandoraUI.$('client-inn').value.trim(),kpp:PandoraUI.$('client-kpp').value.trim(),contact:PandoraUI.$('client-contact').value.trim(),phone:PandoraUI.$('client-phone').value.trim(),email:PandoraUI.$('client-email').value.trim(),manager:PandoraUI.$('client-manager').value,address:PandoraUI.$('client-address').value.trim(),notes:PandoraUI.$('client-notes').value.trim()};if(editId){var idx=PandoraStore.data.clients.findIndex(function(c){return c.id===parseInt(editId)});if(idx!==-1){PandoraStore.data.clients[idx]=Object.assign({},PandoraStore.data.clients[idx],payload);PandoraStore.logActivity('client','Клиент «'+name+'» обновлён');PandoraUI.toast('✓ Клиент обновлён')}}else{payload.id=PandoraUI.nextId(PandoraStore.data.clients);payload.createdAt=new Date().toISOString().slice(0,10);PandoraStore.data.clients.push(payload);PandoraStore.logActivity('client','Добавлен клиент «'+name+'»');PandoraUI.toast('✓ Клиент добавлен')}PandoraStore.save();PandoraUI.$('client-modal').classList.remove('active')},
remove:function(id){var c=PandoraStore.data.clients.find(function(x){return x.id===id});if(!c)return;if(!confirm('Удалить клиента «'+c.name+'»?'))return;PandoraStore.data.clients=PandoraStore.data.clients.filter(function(x){return x.id!==id});PandoraStore.logActivity('client','Клиент «'+c.name+'» удалён');PandoraStore.save();PandoraUI.toast('✓ Клиент удалён')},
openView:function(id){var c=PandoraStore.data.clients.find(function(x){return x.id===id});if(!c)return;var deals=PandoraStore.data.deals.filter(function(d){return d.clientId===id||(d.clientName&amp;&amp;d.clientName.toLowerCase()===c.name.toLowerCase())});var tasks=PandoraStore.data.tasks.filter(function(t){return t.clientName&amp;&amp;t.clientName.toLowerCase()===c.name.toLowerCase()});var currency=PandoraStore.data.settings.currency||'₽';var fmt=function(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n))};var initials=c.name.replace(/[«»"']/g,'').split(' ').map(function(w){return w[0]}).join('').slice(0,2).toUpperCase();var self=this;var content=PandoraUI.$('client-view-content');
content.innerHTML='&lt;div class="client-profile-header"&gt;&lt;div class="client-avatar"&gt;'+PandoraUI.esc(initials)+'&lt;/div&gt;&lt;div class="client-profile-title"&gt;&lt;h2&gt;'+PandoraUI.esc(c.name)+'&lt;/h2&gt;&lt;div class="client-profile-meta"&gt;&lt;span class="badge '+c.type+'"&gt;'+(self.TYPE_LABELS[c.type]||c.type)+'&lt;/span&gt;&lt;span class="badge status-'+c.status+'"&gt;'+(self.STATUS_LABELS[c.status]||c.status)+'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="info-grid"&gt;&lt;div class="info-item"&gt;&lt;div class="label"&gt;ИНН&lt;/div&gt;&lt;div class="value mono"&gt;'+PandoraUI.esc(c.inn||'—')+'&lt;/div&gt;&lt;/div&gt;&lt;div class="info-item"&gt;&lt;div class="label"&gt;КПП&lt;/div&gt;&lt;div class="value mono"&gt;'+PandoraUI.esc(c.kpp||'—')+'&lt;/div&gt;&lt;/div&gt;&lt;div class="info-item"&gt;&lt;div class="label"&gt;Контактное лицо&lt;/div&gt;&lt;div class="value"&gt;'+PandoraUI.esc(c.contact||'—')+'&lt;/div&gt;&lt;/div&gt;&lt;div class="info-item"&gt;&lt;div class="label"&gt;Телефон&lt;/div&gt;&lt;div class="value mono"&gt;'+PandoraUI.esc(c.phone||'—')+'&lt;/div&gt;&lt;/div&gt;&lt;div class="info-item"&gt;&lt;div class="label"&gt;Email&lt;/div&gt;&lt;div class="value"&gt;'+PandoraUI.esc(c.email||'—')+'&lt;/div&gt;&lt;/div&gt;&lt;div class="info-item"&gt;&lt;div class="label"&gt;Менеджер&lt;/div&gt;&lt;div class="value"&gt;'+PandoraUI.esc(c.manager||'—')+'&lt;/div&gt;&lt;/div&gt;&lt;div class="info-item" style="grid-column:1/-1"&gt;&lt;div class="label"&gt;Адрес&lt;/div&gt;&lt;div class="value"&gt;'+PandoraUI.esc(c.address||'—')+'&lt;/div&gt;&lt;/div&gt;'+(c.notes?'&lt;div class="info-item" style="grid-column:1/-1"&gt;&lt;div class="label"&gt;Заметки&lt;/div&gt;&lt;div class="value"&gt;'+PandoraUI.esc(c.notes)+'&lt;/div&gt;&lt;/div&gt;':'')+'&lt;/div&gt;&lt;div class="card-section-title"&gt;? Сделки клиента ('+deals.length+')&lt;/div&gt;'+(deals.length?deals.map(function(d){return '&lt;div class="linked-item" onclick="PandoraUI.switchSection(\'deals\')"&gt;&lt;div&gt;&lt;div class="name"&gt;'+PandoraUI.esc(d.name)+'&lt;/div&gt;&lt;div class="meta"&gt;'+(d.manager||'—')+(d.date?' · '+PandoraUI.fmtDate(d.date):'')+'&lt;/div&gt;&lt;/div&gt;&lt;div style="display:flex;align-items:center;gap:10px"&gt;&lt;span class="badge stage-'+d.stage+'"&gt;'+((ModuleDeals.STAGES.find(function(s){return s.key===d.stage})||{}).label||d.stage)+'&lt;/span&gt;&lt;span class="amount"&gt;'+fmt(d.amount||0)+' '+currency+'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;'}).join(''):'&lt;div class="empty-note"&gt;Сделок пока нет&lt;/div&gt;')+'&lt;div class="card-section-title"&gt;✅ Задачи клиента ('+tasks.length+')&lt;/div&gt;'+(tasks.length?tasks.map(function(t){return '&lt;div class="linked-item" onclick="PandoraUI.switchSection(\'tasks\')"&gt;&lt;div&gt;&lt;div class="name"&gt;'+PandoraUI.esc(t.title)+'&lt;/div&gt;&lt;div class="meta"&gt;'+(t.assignee||'—')+(t.dueDate?' · '+PandoraUI.fmtDate(t.dueDate):'')+'&lt;/div&gt;&lt;/div&gt;&lt;span class="badge stage-'+(t.status==='done'?'won':t.status==='progress'?'progress':'new')+'"&gt;'+(t.status==='done'?'Выполнено':t.status==='progress'?'В работе':'К выполнению')+'&lt;/span&gt;&lt;/div&gt;'}).join(''):'&lt;div class="empty-note"&gt;Задач пока нет&lt;/div&gt;')+'&lt;div class="modal-actions"&gt;&lt;button class="btn btn-secondary" id="view-close-btn"&gt;Закрыть&lt;/button&gt;&lt;button class="btn" id="view-edit-btn"&gt;✏️ Редактировать&lt;/button&gt;&lt;/div&gt;';
PandoraUI.$('client-view-modal').classList.add('active');PandoraUI.$('view-close-btn').onclick=function(){PandoraUI.$('client-view-modal').classList.remove('active')};PandoraUI.$('view-edit-btn').onclick=function(){PandoraUI.$('client-view-modal').classList.remove('active');self.openEdit(id)}},
exportCSV:function(){var clients=PandoraStore.data.clients;if(!clients.length){PandoraUI.toast('✗ Нет данных для экспорта','error');return}var headers=['id','name','type','status','inn','kpp','contact','phone','email','manager','address','notes','createdAt'];var rows=[headers];clients.forEach(function(c){rows.push(headers.map(function(h){return c[h]||''}))});var csv='\uFEFF'+rows.map(function(r){return r.map(function(cell){return '"'+String(cell).replace(/"/g,'""')+'"'}).join(';')}).join('\r\n');var blob=new Blob([csv],{type:'text/csv;charset=utf-8;'});var link=document.createElement('a');link.href=URL.createObjectURL(blob);link.download='pandora-clients-'+new Date().toISOString().slice(0,10)+'.csv';link.click();PandoraStore.logActivity('client','Экспорт клиентов в CSV');PandoraStore.save();PandoraUI.toast('✓ CSV экспортирован')},
importCSV:function(file){var reader=new FileReader();reader.onload=function(e){try{var text=e.target.result;if(text.charCodeAt(0)===0xFEFF)text=text.slice(1);var lines=text.split(/\r?\n/).filter(function(l){return l.trim()});if(lines.length&lt;2){PandoraUI.toast('✗ Файл пуст','error');return}var headers=lines[0].split(';').map(function(h){return h.replace(/^"|"$/g,'').trim()});var imported=0;for(var i=1;i&lt;lines.length;i++){var vals=lines[i].split(';').map(function(v){return v.replace(/^"|"$/g,'').replace(/""/g,'"').trim()});var obj={};headers.forEach(function(h,idx){obj[h]=vals[idx]||''});if(!obj.name)continue;obj.id=PandoraUI.nextId(PandoraStore.data.clients);if(!obj.type)obj.type='legal';if(!obj.status)obj.status='active';if(!obj.createdAt)obj.createdAt=new Date().toISOString().slice(0,10);PandoraStore.data.clients.push(obj);imported++}PandoraStore.logActivity('client','Импортировано клиентов из CSV: '+imported);PandoraStore.save();PandoraUI.toast('✓ Импортировано клиентов: '+imported)}catch(err){PandoraUI.toast('✗ Ошибка импорта CSV','error')}};reader.readAsText(file,'utf-8')}};
const ModuleTasks={TYPE_ICONS:{call:'?',meeting:'?',email:'?',task:'?',payment:'?'},STATUS_LABELS:{todo:'К выполнению',progress:'В работе',done:'Выполнено'},
getFiltered:function(){var search=(PandoraUI.$('tasks-search').value||'').toLowerCase().trim();var assignee=PandoraUI.$('tasks-assignee-filter').value;var priority=PandoraUI.$('tasks-priority-filter').value;return PandoraStore.data.tasks.filter(function(t){if(assignee&amp;&amp;t.assignee!==assignee)return false;if(priority&amp;&amp;t.priority!==priority)return false;if(search){var hay=(t.title||'')+' '+(t.desc||'')+' '+(t.clientName||'')+' '+(t.assignee||'');hay=hay.toLowerCase();if(hay.indexOf(search)===-1)return false}return true})},
isOverdue:function(t){return t.dueDate&amp;&amp;t.dueDate&lt;PandoraUI.todayISO()&amp;&amp;t.status!=='done'},
isToday:function(t){return t.dueDate===PandoraUI.todayISO()&amp;&amp;t.status!=='done'},
renderStats:function(){var m=PandoraStore.getMetrics();var el=PandoraUI.$('tasks-stats');if(el)el.innerHTML='&lt;div class="stat-card violet"&gt;&lt;div class="label"&gt;Всего задач&lt;/div&gt;&lt;div class="value"&gt;'+m.tasks.total+'&lt;/div&gt;&lt;div class="sub"&gt;в системе&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"&gt;'+m.tasks.active+'&lt;/div&gt;&lt;div class="sub"&gt;в работе&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"&gt;'+m.tasks.overdue+'&lt;/div&gt;&lt;div class="sub"&gt;требуют внимания&lt;/div&gt;&lt;/div&gt;&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Сегодня&lt;/div&gt;&lt;div class="value"&gt;'+m.tasks.today+'&lt;/div&gt;&lt;div class="sub"&gt;дедлайн сегодня&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"&gt;'+m.tasks.done+'&lt;/div&gt;&lt;div class="sub"&gt;завершено&lt;/div&gt;&lt;/div&gt;'},
render:function(){this.renderStats();var kanban=PandoraUI.$('tasks-kanban');if(!kanban)return;var filtered=this.getFiltered();var self=this;var statuses=[{key:'todo',label:'? К выполнению'},{key:'progress',label:'⚡ В работе'},{key:'done',label:'✅ Выполнено'}];kanban.innerHTML=statuses.map(function(st){var items=filtered.filter(function(t){return t.status===st.key});items.sort(function(a,b){var score=function(t){return self.isOverdue(t)?0:self.isToday(t)?1:2};var po={high:0,medium:1,low:2};if(score(a)!==score(b))return score(a)-score(b);return(po[a.priority]!==undefined?po[a.priority]:3)-(po[b.priority]!==undefined?po[b.priority]:3)});return '&lt;div class="kanban-col" data-status="'+st.key+'"&gt;&lt;div class="kanban-col-header"&gt;&lt;div class="kanban-col-title"&gt;'+st.label+'&lt;/div&gt;&lt;span class="kanban-col-count"&gt;'+items.length+'&lt;/span&gt;&lt;/div&gt;&lt;div class="kanban-items"&gt;'+items.map(function(t){return self.renderCard(t)}).join('')+'&lt;/div&gt;&lt;/div&gt;'}).join('');this.attachDnD();this.attachCardActions()},
renderCard:function(t){var cls='k-card p-'+t.priority;if(this.isOverdue(t))cls+=' overdue';else if(this.isToday(t))cls+=' today';var dueIcon=this.isOverdue(t)?'⚠️':this.isToday(t)?'⏰':'?';return '&lt;div class="'+cls+'" draggable="true" data-id="'+t.id+'" data-type="task"&gt;&lt;div class="k-card-top"&gt;&lt;div class="k-card-title"&gt;'+(this.TYPE_ICONS[t.type]||'?')+' '+PandoraUI.esc(t.title)+'&lt;/div&gt;&lt;div class="k-card-actions"&gt;'+(t.status!=='done'?'&lt;button class="act-done" data-done="'+t.id+'" title="Завершить"&gt;✓&lt;/button&gt;':'')+'&lt;button class="act-edit" data-edit="'+t.id+'" title="Редактировать"&gt;✏️&lt;/button&gt;&lt;button class="act-del" data-del="'+t.id+'" title="Удалить"&gt;?&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;'+(t.clientName?'&lt;div class="k-card-client"&gt;? '+PandoraUI.esc(t.clientName)+'&lt;/div&gt;':'')+(t.desc?'&lt;div class="k-card-desc"&gt;'+PandoraUI.esc(t.desc)+'&lt;/div&gt;':'')+'&lt;div class="k-card-footer"&gt;&lt;span class="k-card-meta"&gt;'+dueIcon+' '+PandoraUI.fmtDate(t.dueDate)+'&lt;/span&gt;&lt;span class="k-card-meta"&gt;&lt;span class="prio-dot '+t.priority+'"&gt;&lt;/span&gt;'+PandoraUI.esc(t.assignee||'—')+'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;'},
attachDnD:function(){var cards=document.querySelectorAll('#tasks-kanban .k-card');var cols=document.querySelectorAll('#tasks-kanban .kanban-col');var self=this;cards.forEach(function(card){card.addEventListener('dragstart',function(e){e.dataTransfer.setData('text/plain',card.dataset.id);e.dataTransfer.setData('data-type','task');card.classList.add('dragging')});card.addEventListener('dragend',function(){card.classList.remove('dragging')})});cols.forEach(function(col){col.addEventListener('dragover',function(e){e.preventDefault();col.classList.add('dragover')});col.addEventListener('dragleave',function(){col.classList.remove('dragover')});col.addEventListener('drop',function(e){e.preventDefault();col.classList.remove('dragover');var id=parseInt(e.dataTransfer.getData('text/plain'));var type=e.dataTransfer.getData('data-type');if(type!=='task')return;var newStatus=col.dataset.status;var task=PandoraStore.data.tasks.find(function(t){return t.id===id});if(task&amp;&amp;task.status!==newStatus){task.status=newStatus;PandoraStore.logActivity('task','Задача «'+task.title+'»: → '+self.STATUS_LABELS[newStatus],task.clientName||'');PandoraStore.save();if(newStatus==='done')PandoraUI.toast('✓ Задача выполнена')}})})},
attachCardActions:function(){var kanban=PandoraUI.$('tasks-kanban');if(!kanban)return;var self=this;kanban.querySelectorAll('[data-done]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();var id=parseInt(btn.dataset.done);var t=PandoraStore.data.tasks.find(function(x){return x.id===id});if(t){t.status='done';PandoraStore.logActivity('task','Задача «'+t.title+'» выполнена',t.clientName||'');PandoraStore.save();PandoraUI.toast('✓ Задача выполнена')}}});kanban.querySelectorAll('[data-edit]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.openEdit(parseInt(btn.dataset.edit))}});kanban.querySelectorAll('[data-del]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.remove(parseInt(btn.dataset.del))}})},
openAdd:function(){PandoraUI.$('task-modal-title').textContent='Новая задача';PandoraUI.$('task-edit-id').value='';PandoraUI.$('task-title').value='';PandoraUI.$('task-desc').value='';PandoraUI.populateClientSelect('task-client');PandoraUI.$('task-type').value='call';PandoraUI.$('task-priority').value='medium';PandoraUI.$('task-assignee').value='Иванов';var d=new Date();d.setDate(d.getDate()+3);PandoraUI.$('task-due').value=d.toISOString().slice(0,10);PandoraUI.$('task-status').value='todo';PandoraUI.$('task-modal').classList.add('active')},
openEdit:function(id){var t=PandoraStore.data.tasks.find(function(x){return x.id===id});if(!t)return;PandoraUI.$('task-modal-title').textContent='Редактировать задачу';PandoraUI.$('task-edit-id').value=t.id;PandoraUI.$('task-title').value=t.title||'';PandoraUI.$('task-desc').value=t.desc||'';PandoraUI.populateClientSelect('task-client',t.clientName);PandoraUI.$('task-type').value=t.type||'call';PandoraUI.$('task-priority').value=t.priority||'medium';PandoraUI.$('task-assignee').value=t.assignee||'Иванов';PandoraUI.$('task-due').value=t.dueDate||'';PandoraUI.$('task-status').value=t.status||'todo';PandoraUI.$('task-modal').classList.add('active')},
save:function(){var title=PandoraUI.$('task-title').value.trim();var due=PandoraUI.$('task-due').value;if(!title){PandoraUI.toast('✗ Укажите название задачи','error');return}if(!due){PandoraUI.toast('✗ Укажите срок выполнения','error');return}var editId=PandoraUI.$('task-edit-id').value;var payload={title:title,dueDate:due,desc:PandoraUI.$('task-desc').value.trim(),clientName:PandoraUI.$('task-client').value,type:PandoraUI.$('task-type').value,priority:PandoraUI.$('task-priority').value,assignee:PandoraUI.$('task-assignee').value,status:PandoraUI.$('task-status').value};if(editId){var idx=PandoraStore.data.tasks.findIndex(function(t){return t.id===parseInt(editId)});if(idx!==-1){PandoraStore.data.tasks[idx]=Object.assign({},PandoraStore.data.tasks[idx],payload);PandoraStore.logActivity('task','Задача «'+title+'» обновлена',payload.clientName);PandoraUI.toast('✓ Задача обновлена')}}else{payload.id=PandoraUI.nextId(PandoraStore.data.tasks);payload.createdAt=PandoraUI.todayISO();PandoraStore.data.tasks.push(payload);PandoraStore.logActivity('task','Создана задача «'+title+'»',payload.clientName);PandoraUI.toast('✓ Задача создана')}PandoraStore.save();PandoraUI.$('task-modal').classList.remove('active')},
remove:function(id){var t=PandoraStore.data.tasks.find(function(x){return x.id===id});if(!t)return;if(!confirm('Удалить задачу «'+t.title+'»?'))return;PandoraStore.data.tasks=PandoraStore.data.tasks.filter(function(x){return x.id!==id});PandoraStore.logActivity('task','Задача «'+t.title+'» удалена',t.clientName||'');PandoraStore.save();PandoraUI.toast('✓ Задача удалена')}};
const ModuleCalendar={current:new Date(),MONTH_NAMES:['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],DOW:['Пн','Вт','Ср','Чт','Пт','Сб','Вс'],
render:function(){var titleEl=PandoraUI.$('cal-month-title');var gridEl=PandoraUI.$('cal-grid');if(!titleEl||!gridEl)return;var cur=this.current;var year=cur.getFullYear();var month=cur.getMonth();titleEl.textContent=this.MONTH_NAMES[month]+' '+year;var firstDay=new Date(year,month,1);var daysInMonth=new Date(year,month+1,0).getDate();var startDow=firstDay.getDay()-1;if(startDow&lt;0)startDow=6;var todayISO=PandoraUI.todayISO();var tasks=PandoraStore.data.tasks;var html=this.DOW.map(function(d){return '&lt;div class="cal-dow"&gt;'+d+'&lt;/div&gt;'}).join('');for(var i=0;i&lt;startDow;i++)html+='&lt;div class="cal-day empty"&gt;&lt;/div&gt;';var self=this;for(var day=1;day&lt;=daysInMonth;day++){var dateStr=year+'-'+String(month+1).padStart(2,'0')+'-'+String(day).padStart(2,'0');var dayTasks=tasks.filter(function(t){return t.dueDate===dateStr});var isToday=dateStr===todayISO;var MAX_SHOW=3;var shown=dayTasks.slice(0,MAX_SHOW);var extra=dayTasks.length-MAX_SHOW;html+='&lt;div class="cal-day '+(isToday?'today':'')+'"&gt;&lt;div class="cal-day-num"&gt;'+day+'&lt;/div&gt;'+shown.map(function(t){return '&lt;div class="cal-task '+t.priority+' '+(t.status==='done'?'done':'')+'" data-task-id="'+t.id+'" title="'+PandoraUI.esc(t.title)+'"&gt;'+self.getIcon(t.type)+' '+PandoraUI.esc(t.title)+'&lt;/div&gt;'}).join('')+(extra&gt;0?'&lt;div class="cal-task-more" data-day="'+dateStr+'"&gt;+'+extra+' ещё&lt;/div&gt;':'')+'&lt;/div&gt;'}
gridEl.innerHTML=html;gridEl.querySelectorAll('.cal-task[data-task-id]').forEach(function(el){el.onclick=function(){ModuleTasks.openEdit(parseInt(el.dataset.taskId))}});gridEl.querySelectorAll('.cal-task-more').forEach(function(el){el.onclick=function(){PandoraUI.switchSection('tasks')}})},
getIcon:function(type){var icons={call:'?',meeting:'?',email:'?',task:'?',payment:'?'};return icons[type]||'?'},
prev:function(){this.current=new Date(this.current.getFullYear(),this.current.getMonth()-1,1);this.render()},
next:function(){this.current=new Date(this.current.getFullYear(),this.current.getMonth()+1,1);this.render()},
goToday:function(){this.current=new Date();this.render()}};
const ModuleWarehouse={moveType:'in',STATUS_LABELS:{ok:'В наличии',low:'Заканчивается',out:'Нет в наличии'},
getStockStatus:function(p){if(p.qty===0)return 'out';if(p.qty&lt;=p.minQty)return 'low';return 'ok'},
getFiltered:function(){var products=(PandoraStore.data.warehouse&amp;&amp;PandoraStore.data.warehouse.products)||[];var search=(PandoraUI.$('wh-search').value||'').toLowerCase().trim();var cat=PandoraUI.$('wh-cat-filter').value;var lowOnly=PandoraUI.$('wh-low-only').checked;var self=this;return products.filter(function(p){if(cat&amp;&amp;p.category!==cat)return false;if(lowOnly&amp;&amp;self.getStockStatus(p)==='ok')return false;if(search){var hay=(p.name||'')+' '+(p.sku||'')+' '+(p.category||'');hay=hay.toLowerCase();if(hay.indexOf(search)===-1)return false}return true})},
renderStats:function(){var m=PandoraStore.getMetrics();var el=PandoraUI.$('wh-stats');if(el)el.innerHTML='&lt;div class="stat-card orange"&gt;&lt;div class="label"&gt;Позиций&lt;/div&gt;&lt;div class="value"&gt;'+m.warehouse.total+'&lt;/div&gt;&lt;div class="sub"&gt;наименований&lt;/div&gt;&lt;/div&gt;&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Стоимость склада&lt;/div&gt;&lt;div class="value"&gt;'+m.fmt(m.warehouse.stockValue)+'&lt;/div&gt;&lt;div class="sub"&gt;'+m.currency+' по себестоимости&lt;/div&gt;&lt;/div&gt;&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Заканчиваются&lt;/div&gt;&lt;div class="value"&gt;'+m.warehouse.stockLow+'&lt;/div&gt;&lt;div class="sub"&gt;ниже минимума&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"&gt;'+m.warehouse.stockOut+'&lt;/div&gt;&lt;div class="sub"&gt;нулевой остаток&lt;/div&gt;&lt;/div&gt;'},
renderCatFilter:function(){var products=(PandoraStore.data.warehouse&amp;&amp;PandoraStore.data.warehouse.products)||[];var cats={};products.forEach(function(p){if(p.category)cats[p.category]=true});var sel=PandoraUI.$('wh-cat-filter');if(!sel)return;var cur=sel.value;sel.innerHTML='&lt;option value=""&gt;Все категории&lt;/option&gt;';Object.keys(cats).sort().forEach(function(c){var opt=document.createElement('option');opt.value=c;opt.textContent=c;sel.appendChild(opt)});sel.value=cur;var dl=PandoraUI.$('wh-cat-list');if(dl)dl.innerHTML=Object.keys(cats).map(function(c){return '&lt;option value="'+PandoraUI.esc(c)+'"&gt;'}).join('')},
render:function(){this.renderStats();this.renderCatFilter();var tbody=PandoraUI.$('wh-tbody');if(!tbody)return;var list=this.getFiltered();var currency=PandoraStore.data.settings.currency||'₽';var fmt=function(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n))};var self=this;if(!list.length){tbody.innerHTML='&lt;tr&gt;&lt;td colspan="8" style="text-align:center;color:var(--muted);padding:30px"&gt;Товары не найдены&lt;/td&gt;&lt;/tr&gt;';this.renderMoves();return}
tbody.innerHTML=list.map(function(p){var st=self.getStockStatus(p);var total=(p.qty||0)*(p.cost||0);return '&lt;tr data-id="'+p.id+'"&gt;&lt;td&gt;&lt;div class="cell-main"&gt;'+PandoraUI.esc(p.name)+'&lt;/div&gt;&lt;div class="cell-sub"&gt;'+PandoraUI.esc(p.sku||'—')+'&lt;/div&gt;&lt;/td&gt;&lt;td&gt;'+(p.category?'&lt;span class="badge ip"&gt;'+PandoraUI.esc(p.category)+'&lt;/span&gt;':'—')+'&lt;/td&gt;&lt;td class="num" style="font-weight:800;color:'+(st==='out'?'var(--red)':st==='low'?'var(--gold)':'var(--green)')+'"&gt;'+p.qty+' '+PandoraUI.esc(p.unit)+'&lt;/td&gt;&lt;td class="num" style="color:var(--dim)"&gt;'+p.minQty+'&lt;/td&gt;&lt;td class="num"&gt;'+fmt(p.price||0)+' '+currency+'&lt;/td&gt;&lt;td class="num" style="color:var(--gold)"&gt;'+fmt(total)+' '+currency+'&lt;/td&gt;&lt;td&gt;&lt;span class="badge stock-'+st+'"&gt;'+self.STATUS_LABELS[st]+'&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="row-actions"&gt;&lt;button class="icon-btn in" data-move-in="'+p.id+'" title="Приход"&gt;⬇&lt;/button&gt;&lt;button class="icon-btn out" data-move-out="'+p.id+'" title="Расход"&gt;⬆&lt;/button&gt;&lt;button class="icon-btn edit" data-edit="'+p.id+'" title="Редактировать"&gt;✏️&lt;/button&gt;&lt;button class="icon-btn del" data-del="'+p.id+'" title="Удалить"&gt;?&lt;/button&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;'}).join('');
tbody.querySelectorAll('[data-move-in]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.openMove(parseInt(btn.dataset.moveIn),'in')}});tbody.querySelectorAll('[data-move-out]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.openMove(parseInt(btn.dataset.moveOut),'out')}});tbody.querySelectorAll('[data-edit]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.openEdit(parseInt(btn.dataset.edit))}});tbody.querySelectorAll('[data-del]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.remove(parseInt(btn.dataset.del))}});this.renderMoves()},
renderMoves:function(){var listEl=PandoraUI.$('wh-moves-list');if(!listEl)return;var moves=(PandoraStore.data.warehouse&amp;&amp;PandoraStore.data.warehouse.moves)||[];var products=(PandoraStore.data.warehouse&amp;&amp;PandoraStore.data.warehouse.products)||[];var recent=moves.slice().reverse().slice(0,12);if(!recent.length){listEl.innerHTML='&lt;div class="empty-note"&gt;Движений пока нет&lt;/div&gt;';return}
listEl.innerHTML=recent.map(function(mv){var prod=products.find(function(p){return p.id===mv.productId});var prodName=prod?prod.name:'(товар удалён)';return '&lt;div class="linked-item" style="cursor:default"&gt;&lt;div style="display:flex;align-items:center;gap:12px;flex:1"&gt;&lt;span class="badge move-'+mv.type+'"&gt;'+(mv.type==='in'?'⬇ Приход':'⬆ Расход')+'&lt;/span&gt;&lt;div&gt;&lt;div class="name"&gt;'+PandoraUI.esc(prodName)+'&lt;/div&gt;&lt;div class="meta"&gt;'+PandoraUI.fmtDate(mv.date)+(mv.comment?' · '+PandoraUI.esc(mv.comment):'')+(mv.dealName?' · ? '+PandoraUI.esc(mv.dealName):'')+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="amount" style="color:'+(mv.type==='in'?'var(--green)':'var(--orange)')+'"&gt;'+(mv.type==='in'?'+':'−')+mv.qty+'&lt;/span&gt;&lt;/div&gt;'}).join('')},
openAdd:function(){PandoraUI.$('wh-product-title').textContent='Новый товар';PandoraUI.$('wh-edit-id').value='';PandoraUI.$('wh-name').value='';PandoraUI.$('wh-sku').value='';PandoraUI.$('wh-category').value='';PandoraUI.$('wh-unit').value='шт';PandoraUI.$('wh-qty').value='0';PandoraUI.$('wh-minqty').value='5';PandoraUI.$('wh-price').value='0';PandoraUI.$('wh-cost').value='0';PandoraUI.$('wh-product-modal').classList.add('active')},
openEdit:function(id){var products=(PandoraStore.data.warehouse&amp;&amp;PandoraStore.data.warehouse.products)||[];var p=products.find(function(x){return x.id===id});if(!p)return;PandoraUI.$('wh-product-title').textContent='Редактировать товар';PandoraUI.$('wh-edit-id').value=p.id;PandoraUI.$('wh-name').value=p.name||'';PandoraUI.$('wh-sku').value=p.sku||'';PandoraUI.$('wh-category').value=p.category||'';PandoraUI.$('wh-unit').value=p.unit||'шт';PandoraUI.$('wh-qty').value=p.qty||0;PandoraUI.$('wh-minqty').value=p.minQty||0;PandoraUI.$('wh-price').value=p.price||0;PandoraUI.$('wh-cost').value=p.cost||0;PandoraUI.$('wh-product-modal').classList.add('active')},
saveProduct:function(){var name=PandoraUI.$('wh-name').value.trim();if(!name){PandoraUI.toast('✗ Укажите название товара','error');return}if(!PandoraStore.data.warehouse)PandoraStore.data.warehouse={products:[],moves:[]};var editId=PandoraUI.$('wh-edit-id').value;var payload={name:name,sku:PandoraUI.$('wh-sku').value.trim(),category:PandoraUI.$('wh-category').value.trim(),unit:PandoraUI.$('wh-unit').value,qty:parseInt(PandoraUI.$('wh-qty').value)||0,minQty:parseInt(PandoraUI.$('wh-minqty').value)||0,price:parseFloat(PandoraUI.$('wh-price').value)||0,cost:parseFloat(PandoraUI.$('wh-cost').value)||0};if(editId){var idx=PandoraStore.data.warehouse.products.findIndex(function(p){return p.id===parseInt(editId)});if(idx!==-1){PandoraStore.data.warehouse.products[idx]=Object.assign({},PandoraStore.data.warehouse.products[idx],payload);PandoraStore.logActivity('warehouse','Товар «'+name+'» обновлён');PandoraUI.toast('✓ Товар обновлён')}}else{payload.id=PandoraUI.nextId(PandoraStore.data.warehouse.products);PandoraStore.data.warehouse.products.push(payload);PandoraStore.logActivity('warehouse','Добавлен товар «'+name+'»');PandoraUI.toast('✓ Товар добавлен')}PandoraStore.save();PandoraUI.$('wh-product-modal').classList.remove('active')},
remove:function(id){var products=(PandoraStore.data.warehouse&amp;&amp;PandoraStore.data.warehouse.products)||[];var p=products.find(function(x){return x.id===id});if(!p)return;if(!confirm('Удалить товар «'+p.name+'»?'))return;PandoraStore.data.warehouse.products=PandoraStore.data.warehouse.products.filter(function(x){return x.id!==id});PandoraStore.logActivity('warehouse','Товар «'+p.name+'» удалён');PandoraStore.save();PandoraUI.toast('✓ Товар удалён')},
setMoveType:function(type){this.moveType=type;var inOpt=PandoraUI.$('wh-move-in-opt');var outOpt=PandoraUI.$('wh-move-out-opt');inOpt.className='opt'+(type==='in'?' sel-in':'');outOpt.className='opt'+(type==='out'?' sel-out':'')},
openMove:function(productId,type){var products=(PandoraStore.data.warehouse&amp;&amp;PandoraStore.data.warehouse.products)||[];var p=products.find(function(x){return x.id===productId});if(!p)return;PandoraUI.$('wh-move-product-id').value=productId;PandoraUI.$('wh-move-title').textContent=(type==='in'?'⬇ Приход: ':'⬆ Расход: ')+p.name;PandoraUI.$('wh-cur-stock').textContent='Текущий остаток: '+p.qty+' '+p.unit+' (мин. '+p.minQty+')';PandoraUI.$('wh-move-qty').value='1';PandoraUI.$('wh-move-comment').value='';PandoraUI.populateDealSelect('wh-move-deal');this.setMoveType(type);PandoraUI.$('wh-move-modal').classList.add('active')},
saveMove:function(){var productId=parseInt(PandoraUI.$('wh-move-product-id').value);var qty=parseInt(PandoraUI.$('wh-move-qty').value);var products=(PandoraStore.data.warehouse&amp;&amp;PandoraStore.data.warehouse.products)||[];var p=products.find(function(x){return x.id===productId});if(!p){PandoraUI.$('wh-move-modal').classList.remove('active');return}if(!qty||qty&lt;=0){PandoraUI.toast('✗ Укажите корректное количество','error');return}if(this.moveType==='out'&amp;&amp;qty&gt;p.qty){PandoraUI.toast('✗ Нельзя списать больше, чем есть ('+p.qty+' '+p.unit+')','error');return}if(this.moveType==='in')p.qty+=qty;else p.qty-=qty;var dealName=PandoraUI.$('wh-move-deal').value;var moveId=PandoraUI.nextId(PandoraStore.data.warehouse.moves);PandoraStore.data.warehouse.moves.push({id:moveId,productId:productId,type:this.moveType,qty:qty,date:PandoraUI.todayISO(),comment:PandoraUI.$('wh-move-comment').value.trim(),dealName:dealName||null});var typeLabel=this.moveType==='in'?'приход':'расход';PandoraStore.logActivity('warehouse',(typeLabel==='приход'?'⬇ Приход':'⬆ Расход')+' «'+p.name+'»: '+qty+' '+p.unit,dealName||'');PandoraStore.save();PandoraUI.$('wh-move-modal').classList.remove('active');if(this.moveType==='out'&amp;&amp;p.qty&lt;=p.minQty){PandoraUI.toast('⚠ «'+p.name+'» осталось '+p.qty+' '+p.unit+' — ниже минимума!','warn')}else{PandoraUI.toast('✓ Движение проведено')}}};
const ModuleDocs={TYPE_LABELS:{invoice:'Счёт на оплату',act:'Акт выполненных работ',proposal:'Коммерческое предложение'},currentItems:[],
fmt:function(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n))},
currency:function(){return(PandoraStore.data.settings&amp;&amp;PandoraStore.data.settings.currency)||'₽'},
nextDocNumber:function(type){var docs=PandoraStore.data.docs||[];var year=new Date().getFullYear();var prefix={invoice:'СЧ',act:'АКТ',proposal:'КП'}[type]||'ДОК';var count=docs.filter(function(d){return d.type===type&amp;&amp;d.number&amp;&amp;d.number.indexOf(String(year))!==-1}).length+1;return prefix+'-'+year+'-'+String(count).padStart(3,'0')},
renderStats:function(){var docs=PandoraStore.data.docs||[];var el=PandoraUI.$('docs-stats');if(!el)return;var total=docs.length;var invoices=docs.filter(function(d){return d.type==='invoice'}).length;var acts=docs.filter(function(d){return d.type==='act'}).length;var proposals=docs.filter(function(d){return d.type==='proposal'}).length;var self=this;var totalSum=docs.reduce(function(s,d){return s+self.docTotal(d)},0);el.innerHTML='&lt;div class="stat-card violet"&gt;&lt;div class="label"&gt;Всего документов&lt;/div&gt;&lt;div class="value"&gt;'+total+'&lt;/div&gt;&lt;div class="sub"&gt;создано&lt;/div&gt;&lt;/div&gt;&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Счетов&lt;/div&gt;&lt;div class="value"&gt;'+invoices+'&lt;/div&gt;&lt;div class="sub"&gt;на оплату&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"&gt;'+acts+'&lt;/div&gt;&lt;div class="sub"&gt;выполненных работ&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"&gt;'+proposals+'&lt;/div&gt;&lt;div class="sub"&gt;предложений&lt;/div&gt;&lt;/div&gt;&lt;div class="stat-card orange"&gt;&lt;div class="label"&gt;Общая сумма&lt;/div&gt;&lt;div class="value"&gt;'+this.fmt(totalSum)+'&lt;/div&gt;&lt;div class="sub"&gt;'+this.currency()+' по всем&lt;/div&gt;&lt;/div&gt;'},
docTotal:function(doc){return(doc.items||[]).reduce(function(s,it){return s+(it.qty||0)*(it.price||0)},0)},
render:function(){this.renderStats();var tbody=PandoraUI.$('docs-tbody');if(!tbody)return;var docs=PandoraStore.data.docs||[];var self=this;if(!docs.length){tbody.innerHTML='&lt;tr&gt;&lt;td colspan="7" style="text-align:center;color:var(--muted);padding:30px"&gt;Документов пока нет. Создайте первый документ.&lt;/td&gt;&lt;/tr&gt;';return}
tbody.innerHTML=docs.map(function(d){var client=(PandoraStore.data.clients||[]).find(function(c){return c.id===d.clientId});var total=self.docTotal(d);return '&lt;tr data-id="'+d.id+'"&gt;&lt;td class="cell-main" style="font-family:var(--fm)"&gt;'+PandoraUI.esc(d.number||'—')+'&lt;/td&gt;&lt;td&gt;&lt;span class="badge doc-'+d.type+'"&gt;'+(self.TYPE_LABELS[d.type]||d.type)+'&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="cell-main"&gt;'+(client?PandoraUI.esc(client.name):'—')+'&lt;/div&gt;'+(client&amp;&amp;client.contact?'&lt;div class="cell-sub"&gt;'+PandoraUI.esc(client.contact)+'&lt;/div&gt;':'')+'&lt;/td&gt;&lt;td style="font-family:var(--fm);font-size:.82rem"&gt;'+PandoraUI.fmtDate(d.date)+'&lt;/td&gt;&lt;td style="text-align:right;font-family:var(--fm);font-weight:700;color:var(--gold)"&gt;'+self.fmt(total)+' '+self.currency()+'&lt;/td&gt;&lt;td style="text-align:center"&gt;'+(d.items||[]).length+'&lt;/td&gt;&lt;td&gt;&lt;div class="row-actions"&gt;&lt;button class="icon-btn view" data-view="'+d.id+'" title="Просмотр"&gt;?&lt;/button&gt;&lt;button class="icon-btn edit" data-edit="'+d.id+'" title="Редактировать"&gt;✏️&lt;/button&gt;&lt;button class="icon-btn del" data-del="'+d.id+'" title="Удалить"&gt;?&lt;/button&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;'}).join('');
tbody.querySelectorAll('[data-view]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.preview(parseInt(btn.dataset.view))}});tbody.querySelectorAll('[data-edit]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.openEdit(parseInt(btn.dataset.edit))}});tbody.querySelectorAll('[data-del]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();self.remove(parseInt(btn.dataset.del))}})},
populateClientSelect:function(selectedId){var sel=PandoraUI.$('doc-client');if(!sel)return;var clients=PandoraStore.data.clients||[];sel.innerHTML='&lt;option value=""&gt;— Выберите клиента —&lt;/option&gt;';clients.forEach(function(c){var opt=document.createElement('option');opt.value=c.id;opt.textContent=c.name;if(selectedId&amp;&amp;c.id===selectedId)opt.selected=true;sel.appendChild(opt)})},
renderItems:function(items){var list=PandoraUI.$('doc-items-list');if(!list)return;var self=this;if(!items.length){list.innerHTML='&lt;div style="color:var(--muted);font-size:.85rem;padding:10px"&gt;Добавьте хотя бы одну позицию&lt;/div&gt;';this.updateTotal(items);return}
list.innerHTML=items.map(function(it,idx){return '&lt;div class="doc-item" data-idx="'+idx+'"&gt;&lt;input type="text" class="item-name" placeholder="Наименование" value="'+PandoraUI.esc(it.name)+'"&gt;&lt;input type="number" class="item-qty" placeholder="Кол-во" min="0" value="'+it.qty+'"&gt;&lt;input type="number" class="item-price" placeholder="Цена" min="0" value="'+it.price+'"&gt;&lt;div class="sum"&gt;'+self.fmt((it.qty||0)*(it.price||0))+' '+self.currency()+'&lt;/div&gt;&lt;button class="rm" data-rm="'+idx+'" type="button"&gt;✕&lt;/button&gt;&lt;/div&gt;'}).join('');
list.querySelectorAll('.item-name').forEach(function(inp){inp.oninput=function(e){items[parseInt(e.target.closest('.doc-item').dataset.idx)].name=e.target.value}});list.querySelectorAll('.item-qty').forEach(function(inp){inp.oninput=function(e){var idx=parseInt(e.target.closest('.doc-item').dataset.idx);items[idx].qty=parseFloat(e.target.value)||0;self.updateTotal(items);var sumEl=e.target.closest('.doc-item').querySelector('.sum');if(sumEl)sumEl.textContent=self.fmt((items[idx].qty||0)*(items[idx].price||0))+' '+self.currency()}});list.querySelectorAll('.item-price').forEach(function(inp){inp.oninput=function(e){var idx=parseInt(e.target.closest('.doc-item').dataset.idx);items[idx].price=parseFloat(e.target.value)||0;self.updateTotal(items);var sumEl=e.target.closest('.doc-item').querySelector('.sum');if(sumEl)sumEl.textContent=self.fmt((items[idx].qty||0)*(items[idx].price||0))+' '+self.currency()}});list.querySelectorAll('[data-rm]').forEach(function(btn){btn.onclick=function(){items.splice(parseInt(btn.dataset.rm),1);self.renderItems(items)}});this.updateTotal(items)},
updateTotal:function(items){var total=items.reduce(function(s,it){return s+(it.qty||0)*(it.price||0)},0);var el=PandoraUI.$('doc-total-value');if(el)el.textContent=this.fmt(total)+' '+this.currency()},
openAdd:function(){PandoraUI.$('doc-form-title').textContent='Новый документ';PandoraUI.$('doc-edit-id').value='';PandoraUI.$('doc-type').value='invoice';PandoraUI.$('doc-number').value=this.nextDocNumber('invoice');PandoraUI.$('doc-date').value=PandoraUI.todayISO();this.populateClientSelect();PandoraUI.$('doc-comment').value='';this.currentItems=[{name:'',qty:1,price:0}];this.renderItems(this.currentItems);PandoraUI.$('doc-form-modal').classList.add('active')},
openEdit:function(id){var doc=(PandoraStore.data.docs||[]).find(function(d){return d.id===id});if(!doc)return;PandoraUI.$('doc-form-title').textContent='Редактировать документ';PandoraUI.$('doc-edit-id').value=doc.id;PandoraUI.$('doc-type').value=doc.type;PandoraUI.$('doc-number').value=doc.number||'';PandoraUI.$('doc-date').value=doc.date||'';this.populateClientSelect(doc.clientId);PandoraUI.$('doc-comment').value=doc.comment||'';this.currentItems=JSON.parse(JSON.stringify(doc.items||[]));if(!this.currentItems.length)this.currentItems=[{name:'',qty:1,price:0}];this.renderItems(this.currentItems);PandoraUI.$('doc-form-modal').classList.add('active')},
save:function(){var clientId=parseInt(PandoraUI.$('doc-client').value);if(!clientId){PandoraUI.toast('✗ Выберите клиента','error');return}var items=this.currentItems.filter(function(it){return it.name&amp;&amp;it.name.trim()});if(!items.length){PandoraUI.toast('✗ Добавьте хотя бы одну позицию с наименованием','error');return}var editId=PandoraUI.$('doc-edit-id').value;var type=PandoraUI.$('doc-type').value;var self=this;var payload={type:type,clientId:clientId,number:PandoraUI.$('doc-number').value.trim()||this.nextDocNumber(type),date:PandoraUI.$('doc-date').value||PandoraUI.todayISO(),comment:PandoraUI.$('doc-comment').value.trim(),items:items};if(!PandoraStore.data.docs)PandoraStore.data.docs=[];if(editId){var idx=PandoraStore.data.docs.findIndex(function(d){return d.id===parseInt(editId)});if(idx!==-1){PandoraStore.data.docs[idx]=Object.assign({},PandoraStore.data.docs[idx],payload);PandoraStore.logActivity('docs','Документ «'+payload.number+'» обновлён');PandoraUI.toast('✓ Документ обновлён')}}else{payload.id=PandoraUI.nextId(PandoraStore.data.docs);PandoraStore.data.docs.push(payload);PandoraStore.logActivity('docs','Создан документ «'+payload.number+'» ('+this.TYPE_LABELS[type]+')');PandoraUI.toast('✓ Документ создан')}PandoraStore.save();this.render();PandoraUI.$('doc-form-modal').classList.remove('active')},
remove:function(id){var doc=(PandoraStore.data.docs||[]).find(function(d){return d.id===id});if(!doc)return;if(!confirm('Удалить документ «'+doc.number+'»?'))return;PandoraStore.data.docs=PandoraStore.data.docs.filter(function(d){return d.id!==id});PandoraStore.logActivity('docs','Документ «'+doc.number+'» удалён');PandoraStore.save();this.render();PandoraUI.toast('✓ Документ удалён')},
buildDocHTML:function(doc){var client=(PandoraStore.data.clients||[]).find(function(c){return c.id===doc.clientId});var settings=PandoraStore.data.settings||{};var company=settings.company||{};var contacts=settings.contacts||{};var signer=settings.signer||{};var total=this.docTotal(doc);var cur=this.currency();var self=this;var html='';
html+='&lt;div class="doc-head"&gt;&lt;div class="doc-company"&gt;'+PandoraUI.esc(company.name||'Название компании')+'&lt;div class="sub"&gt;ИНН: '+PandoraUI.esc(company.inn||'—')+(company.kpp?' / КПП: '+PandoraUI.esc(company.kpp):'')+'&lt;/div&gt;&lt;div class="sub"&gt;'+PandoraUI.esc(company.address||'')+'&lt;/div&gt;'+((contacts.phone||contacts.email)?'&lt;div class="sub"&gt;'+PandoraUI.esc(contacts.phone||'')+((contacts.email)?' · '+PandoraUI.esc(contacts.email):'')+'&lt;/div&gt;':'')+'&lt;/div&gt;&lt;div style="text-align:right;font-size:11px;color:#555"&gt;Дата: '+PandoraUI.fmtDate(doc.date)+'&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="doc-title"&gt;'+(this.TYPE_LABELS[doc.type]||'Документ')+' № '+PandoraUI.esc(doc.number)+' от '+PandoraUI.fmtDate(doc.date)+'&lt;/div&gt;';
html+='&lt;div class="doc-parties"&gt;&lt;div class="doc-party"&gt;&lt;div class="lbl"&gt;Исполнитель / Поставщик&lt;/div&gt;'+PandoraUI.esc(company.name||'—')+'&lt;br&gt;ИНН: '+PandoraUI.esc(company.inn||'—')+'&lt;/div&gt;&lt;div class="doc-party"&gt;&lt;div class="lbl"&gt;Заказчик / Клиент&lt;/div&gt;'+(client?PandoraUI.esc(client.name):'—')+'&lt;br&gt;'+(client&amp;&amp;client.inn?'ИНН: '+PandoraUI.esc(client.inn):'')+(client&amp;&amp;client.address?'&lt;br&gt;'+PandoraUI.esc(client.address):'')+'&lt;/div&gt;&lt;/div&gt;';
html+='&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style="width:30px"&gt;№&lt;/th&gt;&lt;th&gt;Наименование&lt;/th&gt;&lt;th class="num" style="width:70px"&gt;Кол-во&lt;/th&gt;&lt;th class="num" style="width:100px"&gt;Цена&lt;/th&gt;&lt;th class="num" style="width:120px"&gt;Сумма&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;'+(doc.items||[]).map(function(it,idx){return '&lt;tr&gt;&lt;td&gt;'+(idx+1)+'&lt;/td&gt;&lt;td&gt;'+PandoraUI.esc(it.name)+'&lt;/td&gt;&lt;td class="num"&gt;'+it.qty+'&lt;/td&gt;&lt;td class="num"&gt;'+self.fmt(it.price)+' '+cur+'&lt;/td&gt;&lt;td class="num"&gt;'+self.fmt((it.qty||0)*(it.price||0))+' '+cur+'&lt;/td&gt;&lt;/tr&gt;'}).join('')+'&lt;/tbody&gt;&lt;/table&gt;';
html+='&lt;div class="doc-total-row"&gt;&lt;span&gt;ИТОГО к оплате:&lt;/span&gt;&lt;span&gt;'+this.fmt(total)+' '+cur+'&lt;/span&gt;&lt;/div&gt;';
if(doc.comment){html+='&lt;div class="doc-comment"&gt;'+(doc.type==='invoice'?'Назначение платежа: ':'Примечание: ')+PandoraUI.esc(doc.comment)+'&lt;/div&gt;'}
html+='&lt;div class="doc-sign"&gt;&lt;div class="doc-sign-block"&gt;&lt;div class="doc-sign-line"&gt;'+PandoraUI.esc(signer.role||'Должность')+' / '+PandoraUI.esc(signer.name||'ФИО')+'&lt;/div&gt;&lt;/div&gt;&lt;div class="doc-sign-block"&gt;&lt;div class="doc-sign-line"&gt;Подпись заказчика&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
if(signer.basis){html+='&lt;div style="font-size:10px;color:#777;margin-top:8px"&gt;Действует на основании: '+PandoraUI.esc(signer.basis)+'&lt;/div&gt;'}
return html},
preview:function(id){var doc=(PandoraStore.data.docs||[]).find(function(d){return d.id===id});if(!doc)return;var html=this.buildDocHTML(doc);PandoraUI.$('doc-preview-content').innerHTML=html;PandoraUI.$('docs-print-area').innerHTML=html;PandoraUI.$('doc-preview-modal').classList.add('active')},
printCurrent:function(){window.print()},
addFromWarehouse:function(){var products=(PandoraStore.data.warehouse&amp;&amp;PandoraStore.data.warehouse.products)||[];var self=this;if(!products.length){PandoraUI.toast('⚠ На складе нет товаров','warn');return}var names=products.map(function(p,i){return(i+1)+'. '+p.name+'('+(p.sku||'без арт.')+') — '+self.fmt(p.price)+' '+self.currency()}).join('\n');var choice=prompt('Выберите номер товара со склада:\n\n'+names+'\n\nВведите номер:');if(!choice)return;var idx=parseInt(choice)-1;if(idx&gt;=0&amp;&amp;idx&lt;products.length){var p=products[idx];this.currentItems.push({name:p.name,qty:1,price:p.price});this.renderItems(this.currentItems);PandoraUI.toast('✓ Товар добавлен из склада')}else{PandoraUI.toast('✗ Неверный номер товара','error')}}};
const TAX_DATA={2025:{usnRate:.06,fixedIp:53658,capIp:300888,profitRate:.25,vatRate:.20,mrot:22000,contribBase:2225000},2026:{usnRate:.06,fixedIp:57390,capIp:321818,profitRate:.25,vatRate:.22,mrot:25000,contribBase:2979000,vatThreshold:2e7,usn5Limit:2725e5,usn7Limit:4905e5},2027:{usnRate:.06,fixedIp:61000,capIp:343000,profitRate:.25,vatRate:.22,mrot:27000,contribBase:32e5,vatThreshold:2e7,usn5Limit:285e6,usn7Limit:51e7}};
const ModuleTax={fmt:function(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n))},pct:function(n){return(n*100).toFixed(2)+'%'},V:function(id,d){var el=PandoraUI.$(id);return el?(+el.value||0):(d||0)},
contrib:function(pay,emp,cat,base,mrot,isPriority,isITAccred,itShare){if(pay&lt;=0)return 0;var perEmp=emp&gt;0?pay/emp:pay;var t=0;if(cat==='regular'){t=perEmp&lt;=base?pay*.3:base*.3*emp+(pay-base*emp)*.151}else if(cat==='msp'){if(isPriority){var mrotTotal=mrot*emp;if(perEmp&lt;=mrot)t=pay*.3;else if(perEmp&lt;=base)t=mrotTotal*.3+(pay-mrotTotal)*.15;else t=mrotTotal*.3+(base*emp-mrotTotal)*.15+(pay-base*emp)*.151}else{t=perEmp&lt;=base?pay*.3:base*.3*emp+(pay-base*emp)*.151}}else if(cat==='it'){if(isITAccred&amp;&amp;itShare&gt;=0.7){t=perEmp&lt;=base?pay*.15:base*.15*emp+(pay-base*emp)*.076}else{t=perEmp&lt;=base?pay*.3:base*.3*emp+(pay-base*emp)*.151}}return t+pay*.002},
calcU6:function(){var year=this.V('u6-year',2026);var T=TAX_DATA[year]||TAX_DATA[2026];var q=[this.V('u6-q1'),this.V('u6-q2'),this.V('u6-q3'),this.V('u6-q4')];var totalIncome=q[0]+q[1]+q[2]+q[3];var taxBase=totalIncome*T.usnRate;var fixed=T.fixedIp;var onePercent=totalIncome&gt;3e5?Math.min((totalIncome-3e5)*.01,T.capIp):0;var totalDeduct=fixed+onePercent;var taxToPay=Math.max(0,taxBase-totalDeduct);var fq=fixed/4;var a1=Math.max(0,q[0]*T.usnRate-fq);var a2=Math.max(0,(q[0]+q[1])*T.usnRate-fq*2-a1);var a3=Math.max(0,(q[0]+q[1]+q[2])*T.usnRate-fq*3-a1-a2);var a4=Math.max(0,taxBase-a1-a2-a3-totalDeduct);var html='&lt;div class="res"&gt;';html+='&lt;div class="ri hl"&gt;&lt;span&gt;Налог УСН к уплате&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(taxToPay)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Доход за год&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(totalIncome)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Налог до вычетов (6%)&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(taxBase)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Фикс. взносы ИП&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(fixed)+' ₽&lt;/span&gt;&lt;/div&gt;';if(onePercent&gt;0)html+='&lt;div class="ri"&gt;&lt;span&gt;1% свыше 300 тыс.&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(onePercent)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Итого вычет&lt;/span&gt;&lt;span class="v gold"&gt;'+this.fmt(totalDeduct)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Эффективная ставка&lt;/span&gt;&lt;span class="v"&gt;'+(totalIncome&gt;0?this.pct(taxToPay/totalIncome):'0%')+'&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="st" style="color:var(--gold)"&gt;Авансы по кварталам&lt;/div&gt;';var adv=[[a1,'1 кв. (до 28.04)'],[a2,'2 кв. (до 28.07)'],[a3,'3 кв. (до 28.10)'],[a4,'Год (до 28.04 след.)']];for(var i=0;i&lt;adv.length;i++){html+='&lt;div class="ri"&gt;&lt;span&gt;'+adv[i][1]+'&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(adv[i][0])+' ₽&lt;/span&gt;&lt;/div&gt;'}var limit=year===2026?2868e5:2724e5;if(totalIncome&gt;limit)html+='&lt;div class="wr err"&gt;&lt;strong&gt;⚠ Доход превышает лимит УСН '+this.fmt(limit)+' ₽!&lt;/strong&gt; Право на УСН утрачено.&lt;/div&gt;';else if(year&gt;=2026&amp;&amp;totalIncome&gt;T.vatThreshold)html+='&lt;div class="wr warn"&gt;&lt;strong&gt;⚠ Доход &gt; 20 млн ₽&lt;/strong&gt; — с 2026 нужно платить НДС 5% или 7%.&lt;/div&gt;';else html+='&lt;div class="wr ok"&gt;&lt;strong&gt;✓ Лимиты соблюдены.&lt;/strong&gt; До лимита осталось '+this.fmt(limit-totalIncome)+' ₽.&lt;/div&gt;';html+='&lt;/div&gt;';PandoraUI.$('u6-res').innerHTML=html;PandoraStore.logActivity('tax','Расчёт УСН 6%');PandoraStore.save();PandoraUI.toast('✓ УСН 6% рассчитан')},
calcU15:function(){var year=this.V('u15-year',2026);var income=this.V('u15-income');var expense=this.V('u15-expense');var base=Math.max(0,income-expense);var tax15=base*.15;var minTax=income*.01;var taxToPay=Math.max(tax15,minTax);var isMin=minTax&gt;tax15;var html='&lt;div class="res"&gt;';html+='&lt;div class="ri hl"&gt;&lt;span&gt;Налог УСН 15% к уплате&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(taxToPay)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Доходы&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(income)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Расходы&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(expense)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;База (доходы − расходы)&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(base)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Налог 15%&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(tax15)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Минимальный налог 1%&lt;/span&gt;&lt;span class="v gold"&gt;'+this.fmt(minTax)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Эффективная ставка&lt;/span&gt;&lt;span class="v"&gt;'+(income&gt;0?this.pct(taxToPay/income):'0%')+'&lt;/span&gt;&lt;/div&gt;';if(isMin)html+='&lt;div class="wr warn"&gt;&lt;strong&gt;⚠ Расходы велики&lt;/strong&gt; — платится минимальный налог 1% от доходов ('+this.fmt(minTax)+' ₽), а не 15%.&lt;/div&gt;';if(expense&gt;income)html+='&lt;div class="wr err"&gt;&lt;strong&gt;⚠ Убыток:&lt;/strong&gt; расходы превышают доходы. Налог = 1% от доходов.&lt;/div&gt;';html+='&lt;/div&gt;';PandoraUI.$('u15-res').innerHTML=html;PandoraStore.logActivity('tax','Расчёт УСН 15%');PandoraStore.save();PandoraUI.toast('✓ УСН 15% рассчитан')},
calcOsn:function(){var year=this.V('osn-year',2026);var T=TAX_DATA[year]||TAX_DATA[2026];var cat=PandoraUI.$('osn-cat').value;var emp=this.V('osn-emp',1);var isPriority=PandoraUI.$('osn-priority').checked;var isITAccred=PandoraUI.$('osn-it-accred').checked;var itShare=this.V('osn-it-share',0)/100;var rev=this.V('osn-r1')+this.V('osn-r2');var ev=this.V('osn-ev');var en=this.V('osn-en');var pay=this.V('osn-pay');var mrot=this.V('osn-mrot',25000);var outVat=rev*T.vatRate/(1+T.vatRate);var revNoVat=rev-outVat;var inVat=ev*T.vatRate/(1+T.vatRate);var evNoVat=ev-inVat;var vatToPay=Math.max(0,outVat-inVat);var contribSum=this.contrib(pay,emp,cat,T.contribBase,mrot,isPriority,isITAccred,itShare);var injury=pay*.002;var totalExp=evNoVat+en+pay+contribSum+injury;var profitBase=revNoVat-totalExp;var profitTax=Math.max(0,profitBase)*T.profitRate;var netProfit=profitBase-profitTax;var totalTax=vatToPay+profitTax+contribSum+injury;var effRate=rev&gt;0?totalTax/rev:0;var html='&lt;div class="res"&gt;';html+='&lt;div class="ri hl"&gt;&lt;span&gt;Чистая прибыль&lt;/span&gt;&lt;span class="v '+(netProfit&lt;0?'d':'s')+'"&gt;'+this.fmt(netProfit)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Всего налогов и взносов&lt;/span&gt;&lt;span class="v d"&gt;'+this.fmt(totalTax)+' ₽ ('+this.pct(effRate)+')&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="st" style="color:var(--gold)"&gt;НДС '+Math.round(T.vatRate*100)+'%&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Начисленный с выручки&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(outVat)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;К вычету (с закупок)&lt;/span&gt;&lt;span class="v"&gt;−'+this.fmt(inVat)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;НДС к уплате&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(vatToPay)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="st" style="color:var(--gold)"&gt;Налог на прибыль '+Math.round(T.profitRate*100)+'%&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;База (прибыль)&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(profitBase)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Налог на прибыль&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(profitTax)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="st" style="color:var(--gold)"&gt;Страховые взносы&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Взносы ('+(cat==='regular'?'30%':cat==='msp'?'15%':'ИТ')+')&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(contribSum)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Травматизм 0,2%&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(injury)+' ₽&lt;/span&gt;&lt;/div&gt;';if(cat==='msp'){html+=isPriority?'&lt;div class="ci pass"&gt;✓ МСП: приоритетная отрасль — льгота 15% применена.&lt;/div&gt;':'&lt;div class="ci fail"&gt;✗ МСП: не приоритетная отрасль — применён общий тариф 30%/15,1%.&lt;/div&gt;'}if(cat==='it'){html+=(isITAccred&amp;&amp;itShare&gt;=0.7)?'&lt;div class="ci pass"&gt;✓ ИТ: аккредитация + доля ≥70% — тариф 15%/7,6% применён.&lt;/div&gt;':'&lt;div class="ci fail"&gt;✗ ИТ: условия не выполнены — применён общий тариф.&lt;/div&gt;'}if(netProfit&lt;0)html+='&lt;div class="wr err"&gt;&lt;strong&gt;⚠ Убыток!&lt;/strong&gt; Налог на прибыль = 0, но НДС и взносы платить нужно.&lt;/div&gt;';html+='&lt;/div&gt;';PandoraUI.$('osn-res').innerHTML=html;PandoraStore.logActivity('tax','Расчёт ОСН');PandoraStore.save();PandoraUI.toast('✓ ОСН рассчитан')},
calcNpd:function(){var phys=this.V('npd-phys');var legal=this.V('npd-legal');var bonus=this.V('npd-bonus');var paid=this.V('npd-paid');var total=phys+legal;var LIMIT=24e5;var taxPhys=phys*.04;var taxLegal=legal*.06;var taxBefore=taxPhys+taxLegal;var bonusApplied=Math.min(bonus,taxBefore);var taxAfterBonus=Math.max(0,taxBefore-bonusApplied);var taxDue=Math.max(0,taxAfterBonus-paid);var effRate=total&gt;0?taxDue/total:0;var html='&lt;div class="res"&gt;';html+='&lt;div class="ri hl"&gt;&lt;span&gt;НПД к уплате&lt;/span&gt;&lt;span class="v '+(taxDue&gt;0?'':'s')+'"&gt;'+this.fmt(taxDue)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;От физлиц (4%)&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(phys)+' ₽ → '+this.fmt(taxPhys)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;От юрлиц (6%)&lt;/span&gt;&lt;span class="v"&gt;'+this.fmt(legal)+' ₽ → '+this.fmt(taxLegal)+' ₽&lt;/span&gt;&lt;/div&gt;';if(bonusApplied&gt;0)html+='&lt;div class="ri"&gt;&lt;span&gt;Бонус&lt;/span&gt;&lt;span class="v s"&gt;−'+this.fmt(bonusApplied)+' ₽&lt;/span&gt;&lt;/div&gt;';if(paid&gt;0)html+='&lt;div class="ri"&gt;&lt;span&gt;Уже уплачено&lt;/span&gt;&lt;span class="v s"&gt;−'+this.fmt(paid)+' ₽&lt;/span&gt;&lt;/div&gt;';html+='&lt;div class="ri"&gt;&lt;span&gt;Эффективная ставка&lt;/span&gt;&lt;span class="v"&gt;'+this.pct(effRate)+'&lt;/span&gt;&lt;/div&gt;';if(total&gt;LIMIT)html+='&lt;div class="wr err"&gt;&lt;strong&gt;⚠ Доход '+this.fmt(total)+' ₽ &gt; лимита НПД '+this.fmt(LIMIT)+' ₽!&lt;/strong&gt; Переходите на УСН.&lt;/div&gt;';else if(total&gt;LIMIT*.8)html+='&lt;div class="wr warn"&gt;&lt;strong&gt;⚠ Приближается к лимиту.&lt;/strong&gt; Осталось '+this.fmt(LIMIT-total)+' ₽.&lt;/div&gt;';else html+='&lt;div class="wr ok"&gt;&lt;strong&gt;✓ В пределах лимита.&lt;/strong&gt; Запас '+this.fmt(LIMIT-total)+' ₽.&lt;/div&gt;';if(total&gt;0){var usn6Tax=Math.max(0,total*.06-57390);html+=usn6Tax&lt;taxDue?'&lt;div class="ci warn"&gt;? УСН 6% может быть выгоднее: '+this.fmt(usn6Tax)+' ₽ vs НПД '+this.fmt(taxDue)+' ₽.&lt;/div&gt;':'&lt;div class="ci pass"&gt;✓ НПД выгоднее УСН для вашего объёма.&lt;/div&gt;'}html+='&lt;/div&gt;';PandoraUI.$('npd-res').innerHTML=html;PandoraStore.logActivity('tax','Расчёт НПД');PandoraStore.save();PandoraUI.toast('✓ НПД рассчитан')},
calcCompare:function(){var year=this.V('cmp-year',2026);var T=TAX_DATA[year]||TAX_DATA[2026];var form=PandoraUI.$('cmp-form').value;var cat=PandoraUI.$('cmp-cat').value;var isPriority=PandoraUI.$('cmp-priority').checked;var isITAccred=PandoraUI.$('cmp-it-accred').checked;var itShare=this.V('cmp-it-share',0)/100;var rev=this.V('cmp-rev');var exp=this.V('cmp-exp');var oe=this.V('cmp-oe');var pay=this.V('cmp-pay');var emp=this.V('cmp-emp');var hasVat=PandoraUI.$('cmp-iv').value==='y';var contribSum=this.contrib(pay,emp,cat,T.contribBase,T.mrot,isPriority,isITAccred,itShare)+pay*.002;var ipFixed=form==='ip'?T.fixedIp+(rev&gt;3e5?Math.min((rev-3e5)*.01,T.capIp):0):0;var results=[];var t1=rev*.06;if(form==='ip'&amp;&amp;emp===0)t1=Math.max(0,t1-ipFixed);else if(form==='ip')t1=Math.max(0,t1-Math.min(ipFixed,t1*.5));else t1=Math.max(0,t1-contribSum*.5);results.push({n:'УСН 6%',av:year&lt;2026||rev&lt;=T.vatThreshold,np:Math.round(rev-exp-oe-pay-contribSum-t1)});var b2=Math.max(0,rev-exp-oe-pay-contribSum);var t2=Math.max(b2*.15,rev*.01);results.push({n:'УСН 15%',av:year&lt;2026||rev&lt;=T.vatThreshold,np:Math.round(rev-exp-oe-pay-contribSum-t2)});if(year&gt;=2026){var av5=rev&gt;T.vatThreshold&amp;&amp;rev&lt;=T.usn5Limit;var ov5=rev*.05/1.05;var rn5=rev-ov5;var ia5=hasVat?exp*.22/1.22:0;var b5=Math.max(0,rn5-(exp-ia5)-oe-pay-contribSum);results.push({n:'УСН+НДС 5%',av:av5,np:Math.round(rn5-(exp-ia5)-oe-pay-contribSum-b5*.15)});var av7=rev&gt;T.usn5Limit&amp;&amp;rev&lt;=T.usn7Limit;var ov7=rev*.07/1.07;var rn7=rev-ov7;var ia7=hasVat?exp*.22/1.22:0;var b7=Math.max(0,rn7-(exp-ia7)-oe-pay-contribSum);results.push({n:'УСН+НДС 7%',av:av7,np:Math.round(rn7-(exp-ia7)-oe-pay-contribSum-b7*.15)})}var ovO=rev*.22/1.22;var rnO=rev-ovO;var iaO=hasVat?exp*.22/1.22:0;var pbO=rnO-(exp-iaO)-oe-pay-contribSum;results.push({n:'ОСН',av:true,np:Math.round(rnO-(exp-iaO)-oe-pay-contribSum-Math.max(0,pbO)*.25)});results.sort(function(a,b){if(a.av!==b.av)return b.av-a.av;return b.np-a.np});var best=results.find(function(r){return r.av});var self=this;var html='&lt;div class="res"&gt;';html+='&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Режим&lt;/th&gt;&lt;th class="n"&gt;Прибыль&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';results.forEach(function(r){var isBest=best&amp;&amp;r.n===best.n;html+='&lt;tr class="'+(!r.av?'unav':isBest?'best':'')+'"&gt;&lt;td&gt;&lt;strong&gt;'+r.n+'&lt;/strong&gt;&lt;/td&gt;&lt;td class="n"&gt;'+self.fmt(r.np)+' ₽&lt;/td&gt;&lt;td&gt;'+(!r.av?'✗':isBest?'✓':'')+'&lt;/td&gt;&lt;/tr&gt;'});html+='&lt;/tbody&gt;&lt;/table&gt;';if(best)html+='&lt;div class="wr ok"&gt;&lt;strong&gt;✓ Рекомендация: '+best.n+'&lt;/strong&gt;&lt;br&gt;Прибыль: '+this.fmt(best.np)+' ₽/год — это лучший вариант среди доступных режимов.&lt;/div&gt;';if(cat==='msp'&amp;&amp;!isPriority)html+='&lt;div class="wr warn"&gt;⚠ МСП: не приоритетная отрасль — льгота 15% не применена.&lt;/div&gt;';if(cat==='it'&amp;&amp;(!isITAccred||itShare&lt;0.7))html+='&lt;div class="wr warn"&gt;⚠ ИТ: нет аккредитации или доля &lt;70% — тариф 15%/7,6% не применён.&lt;/div&gt;';html+='&lt;/div&gt;';PandoraUI.$('cmp-res').innerHTML=html;PandoraStore.logActivity('tax','Сравнение режимов налогообложения');PandoraStore.save();PandoraUI.toast('✓ Режимы сравнены')},
calcCalendar:function(){var regime=PandoraUI.$('cal-regime').value;var year=this.V('cal-year',2026);var events=[];if(regime.indexOf('usn')===0){events.push({d:year+'-04-28',n:'Аванс УСН за 1 квартал'});events.push({d:year+'-07-28',n:'Аванс УСН за 2 квартал'});events.push({d:year+'-10-28',n:'Аванс УСН за 3 квартал'});events.push({d:(year+1)+'-04-28',n:'Налог УСН за год + декларация'});if(regime==='usn_ip'){events.push({d:year+'-12-28',n:'Фикс. взносы ИП'});events.push({d:(year+1)+'-07-01',n:'1% взносов ИП (свыше 300 тыс.)'})}if(regime==='usn_emp'||regime==='usn_ooo'){for(var m=1;m&lt;=12;m++)events.push({d:year+'-'+String(m).padStart(2,'0')+'-15',n:'Взносы за сотрудников'})}}else if(regime==='osn'){var quarters=[[1,4],[2,7],[3,10],[4,1]];for(var qi=0;qi&lt;quarters.length;qi++){var q=quarters[qi][0],mm=quarters[qi][1];var yy=mm===1?year+1:year;events.push({d:yy+'-'+String(mm).padStart(2,'0')+'-25',n:'Декларация НДС за '+q+' кв.'});for(var i=0;i&lt;3;i++){var mmm=mm+i;var yyy=mmm&gt;12?year+1:year;var md=mmm&gt;12?mmm-12:mmm;events.push({d:yyy+'-'+String(md).padStart(2,'0')+'-28',n:'НДС за '+q+' кв. ('+(i+1)+'/3)'})}}events.push({d:year+'-04-28',n:'Аванс налог на прибыль 1 кв.'});events.push({d:year+'-07-28',n:'Аванс налог на прибыль 2 кв.'});events.push({d:year+'-10-28',n:'Аванс налог на прибыль 3 кв.'});events.push({d:(year+1)+'-03-28',n:'Налог на прибыль за год'});for(var m2=1;m2&lt;=12;m2++)events.push({d:year+'-'+String(m2).padStart(2,'0')+'-15',n:'Взносы за сотрудников'})}
events.sort(function(a,b){return a.d.localeCompare(b.d)});var html='&lt;div class="res"&gt;&lt;div class="st" style="color:var(--gold)"&gt;Календарь '+year+' ('+events.length+' событий)&lt;/div&gt;';for(var i2=0;i2&lt;events.length;i2++){var dateFormatted=events[i2].d.split('-').reverse().join('.');html+='&lt;div class="ri"&gt;&lt;span&gt;'+dateFormatted+' — '+events[i2].n+'&lt;/span&gt;&lt;/div&gt;'}html+='&lt;/div&gt;';PandoraUI.$('taxcal-res').innerHTML=html;PandoraStore.logActivity('tax','Налоговый календарь');PandoraStore.save();PandoraUI.toast('✓ Календарь сформирован')},
switchTab:function(tab){document.querySelectorAll('#pd-root .tax-tab').forEach(function(t){t.classList.remove('active')});document.querySelector('#pd-root .tax-tab[data-taxtab="'+tab+'"]').classList.add('active');document.querySelectorAll('#pd-root .tax-subsection').forEach(function(s){s.classList.remove('active')});document.querySelector('#pd-root .tax-subsection[data-taxsub="'+tab+'"]').classList.add('active')}};
const ModuleSettings={loadForm:function(){var s=PandoraStore.data.settings;var $=PandoraUI.$;$('set-company-name').value=s.company.name||'';$('set-inn').value=s.company.inn||'';$('set-kpp').value=s.company.kpp||'';$('set-ogrn').value=s.company.ogrn||'';$('set-address').value=s.company.address||'';$('set-phone').value=s.contacts.phone||'';$('set-email').value=s.contacts.email||'';$('set-website').value=s.contacts.website||'';$('set-signer-role').value=s.signer.role||'';$('set-signer-name').value=s.signer.name||'';$('set-signer-basis').value=s.signer.basis||'Устава';$('set-theme').value=s.theme||'light';$('set-currency').value=s.currency||'₽'},
save:function(){var $=PandoraUI.$;var s=PandoraStore.data.settings;s.company={name:$('set-company-name').value.trim(),inn:$('set-inn').value.trim(),kpp:$('set-kpp').value.trim(),ogrn:$('set-ogrn').value.trim(),address:$('set-address').value.trim()};s.contacts={phone:$('set-phone').value.trim(),email:$('set-email').value.trim(),website:$('set-website').value.trim()};s.signer={role:$('set-signer-role').value.trim(),name:$('set-signer-name').value.trim(),basis:$('set-signer-basis').value.trim()};s.theme=$('set-theme').value;s.currency=$('set-currency').value;PandoraStore.logActivity('settings','Обновлены настройки компании');PandoraStore.save();PandoraUI.applyTheme(s.theme);PandoraUI.toast('✓ Настройки сохранены')},
reset:function(){if(!confirm('Сбросить все настройки к значениям по умолчанию?'))return;PandoraStore.data.settings=PandoraStore.defaultData().settings;PandoraStore.logActivity('settings','Настройки сброшены');PandoraStore.save();this.loadForm();PandoraUI.applyTheme('light');PandoraUI.toast('✓ Настройки сброшены')}};
const ModuleBackup={renderInfo:function(){var el=PandoraUI.$('backup-export-info');if(!el)return;var d=PandoraStore.data;el.innerHTML=['Сделки:        '+d.deals.length,'Клиенты:       '+d.clients.length,'Задачи:        '+d.tasks.length,'Товары:        '+((d.warehouse&amp;&amp;d.warehouse.products)?d.warehouse.products.length:0),'Движения:      '+((d.warehouse&amp;&amp;d.warehouse.moves)?d.warehouse.moves.length:0),'Документы:     '+d.docs.length,'Событий:       '+d.activity.length,'История:       '+d.history.length].join('&lt;br&gt;')},
exportAll:function(){PandoraStore.exportAll();PandoraUI.toast('✓ Резервная копия сохранена')},
importFromFile:function(file){var self=this;if(!confirm('Все текущие данные будут заменены данными из файла. Продолжить?'))return;PandoraStore.importAll(file).then(function(){PandoraUI.toast('✓ Данные успешно импортированы');self.renderInfo();ModuleSettings.loadForm();PandoraUI.applyTheme(PandoraStore.data.settings.theme)}).catch(function(err){PandoraUI.toast('✗ Ошибка импорта: '+err.message,'error')})},
clearAll:function(){if(!confirm('Вы уверены? Все данные будут удалены БЕЗВОЗВРАТНО.'))return;if(!confirm('Точно удалить ВСЕ данные? Это действие нельзя отменить.'))return;PandoraStore.clearAll();PandoraUI.toast('✓ Все данные удалены');this.renderInfo();ModuleSettings.loadForm()},
loadDemo:function(){if(PandoraStore.data.deals.length||PandoraStore.data.clients.length){if(!confirm('В системе уже есть данные. Демо-данные будут добавлены к существующим. Продолжить?'))return}PandoraStore.loadDemo();PandoraUI.toast('✓ Демо-данные загружены');this.renderInfo()}};
const ModuleSearch={render:function(query){var q=(query||'').toLowerCase().trim();var countEl=PandoraUI.$('search-count');var resultsEl=PandoraUI.$('search-results');if(!countEl||!resultsEl)return;if(!q){countEl.textContent='0';resultsEl.innerHTML='&lt;div class="placeholder"&gt;&lt;span class="icon"&gt;?&lt;/span&gt;&lt;h3&gt;Введите запрос&lt;/h3&gt;&lt;p&gt;Поиск ищет по сделкам, клиентам, задачам и товарам.&lt;/p&gt;&lt;/div&gt;';return}var results=[];var data=PandoraStore.data;var currency=data.settings.currency||'₽';var fmt=function(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n))};
(data.deals||[]).forEach(function(d){var hay=((d.name||'')+' '+(d.clientName||'')+' '+(d.manager||'')).toLowerCase();if(hay.indexOf(q)!==-1)results.push({type:'Сделка',icon:'?',color:'pink',title:d.name,meta:'Клиент: '+(d.clientName||'—')+' · '+fmt(d.amount||0)+' '+currency})});
(data.clients||[]).forEach(function(c){var hay=((c.name||'')+' '+(c.inn||'')+' '+(c.contact||'')+' '+(c.email||'')+' '+(c.phone||'')).toLowerCase();if(hay.indexOf(q)!==-1)results.push({type:'Клиент',icon:'?',color:'violet',title:c.name,meta:(c.type||'')+' · '+(c.contact||'')})});
(data.tasks||[]).forEach(function(t){var hay=((t.title||'')+' '+(t.desc||'')+' '+(t.clientName||'')+' '+(t.assignee||'')).toLowerCase();if(hay.indexOf(q)!==-1)results.push({type:'Задача',icon:'✅',color:'green',title:t.title,meta:(t.assignee||'—')+' · '+(t.status||'')})});
var prods=(data.warehouse&amp;&amp;data.warehouse.products)||[];prods.forEach(function(p){var hay=((p.name||'')+' '+(p.sku||'')+' '+(p.category||'')).toLowerCase();if(hay.indexOf(q)!==-1)results.push({type:'Товар',icon:'?',color:'orange',title:p.name,meta:(p.sku||'—')+' · '+(p.qty||0)+' '+(p.unit||'')+' · '+fmt(p.price||0)+' '+currency})});
var docs=data.docs||[];docs.forEach(function(d){var hay=((d.number||'')+' '+(d.comment||'')).toLowerCase();if(hay.indexOf(q)!==-1)results.push({type:'Документ',icon:'?',color:'blue',title:d.number,meta:ModuleDocs.TYPE_LABELS[d.type]||d.type})});
countEl.textContent=results.length;if(!results.length){resultsEl.innerHTML='&lt;div class="placeholder"&gt;&lt;span class="icon"&gt;?&lt;/span&gt;&lt;h3&gt;Ничего не найдено&lt;/h3&gt;&lt;p&gt;Попробуйте изменить запрос.&lt;/p&gt;&lt;/div&gt;';return}
resultsEl.innerHTML='&lt;div class="dash-card"&gt;'+results.map(function(r){return '&lt;div class="activity-item"&gt;&lt;div class="ico '+r.color+'"&gt;'+r.icon+'&lt;/div&gt;&lt;div class="body"&gt;&lt;div class="title"&gt;&lt;span style="font-size:.7rem;color:var(--muted);font-weight:700;text-transform:uppercase;letter-spacing:.5px;margin-right:6px"&gt;'+r.type+'&lt;/span&gt;'+PandoraUI.esc(r.title)+'&lt;/div&gt;&lt;div class="meta"&gt;'+PandoraUI.esc(r.meta)+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'}).join('')+'&lt;/div&gt;'}};
const ModuleActivity={getIcon:function(type){var icons={backup:['?','green'],import:['?','violet'],clear:['?️','red'],demo:['?','gold'],settings:['⚙️','blue'],system:['?','blue'],deal:['?','pink'],client:['?','violet'],task:['✅','green'],warehouse:['?','orange'],docs:['?','blue'],tax:['?','gold']};return icons[type]||['?','violet']},
render:function(){var el=PandoraUI.$('activity-full-list');if(!el)return;var acts=PandoraStore.data.activity;if(!acts.length){el.innerHTML='&lt;p style="color:var(--muted);font-size:.88rem;padding:10px 0"&gt;В системе ещё нет событий.&lt;/p&gt;';return}
el.innerHTML=acts.map(function(a){var ic=ModuleActivity.getIcon(a.type);var time=new Date(a.timestamp);var timeStr=time.toLocaleDateString('ru-RU')+' '+time.toLocaleTimeString('ru-RU',{hour:'2-digit',minute:'2-digit',second:'2-digit'});return '&lt;div class="activity-item"&gt;&lt;div class="ico '+ic[1]+'"&gt;'+ic[0]+'&lt;/div&gt;&lt;div class="body"&gt;&lt;div class="title"&gt;'+PandoraUI.esc(a.title)+'&lt;/div&gt;&lt;div class="meta"&gt;'+timeStr+(a.meta?' · '+PandoraUI.esc(a.meta):'')+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'}).join('')}};
function init(){
PandoraStore.load();PandoraUI.initNav();PandoraUI.applyTheme(PandoraStore.data.settings.theme);
PandoraStore.subscribe(function(){ModuleDashboard.render();ModuleDeals.render();ModuleClients.render();ModuleTasks.render();ModuleWarehouse.render();ModuleDocs.render();ModuleActivity.render();ModuleBackup.renderInfo();PandoraUI.updateNavBadges();var calSection=document.querySelector('#pd-root .section[data-section="calendar"]');if(calSection&amp;&amp;calSection.classList.contains('active'))ModuleCalendar.render()});
var btnBackup=PandoraUI.$('btn-backup');if(btnBackup)btnBackup.onclick=function(){ModuleBackup.exportAll()};
var btnSettings=PandoraUI.$('btn-settings');if(btnSettings)btnSettings.onclick=function(){PandoraUI.switchSection('settings');ModuleSettings.loadForm()};
var btnTheme=PandoraUI.$('btn-theme');if(btnTheme)btnTheme.onclick=function(){var current=PandoraStore.data.settings.theme;var next=current==='dark'?'light':'dark';PandoraStore.data.settings.theme=next;PandoraStore.logActivity('settings','Переключена тема на '+(next==='dark'?'тёмную':'светлую'));PandoraStore.save();PandoraUI.applyTheme(next)};
var searchInput=PandoraUI.$('global-search');if(searchInput){searchInput.addEventListener('input',function(e){ModuleSearch.render(e.target.value);if(e.target.value.trim())PandoraUI.switchSection('search')});searchInput.addEventListener('keydown',function(e){if(e.key==='Escape'){searchInput.value='';ModuleSearch.render('')}})}
var btnSaveSettings=PandoraUI.$('btn-save-settings');if(btnSaveSettings)btnSaveSettings.onclick=function(){ModuleSettings.save()};
var btnResetSettings=PandoraUI.$('btn-reset-settings');if(btnResetSettings)btnResetSettings.onclick=function(){ModuleSettings.reset()};
var setTheme=PandoraUI.$('set-theme');if(setTheme)setTheme.onchange=function(e){PandoraUI.applyTheme(e.target.value)};
var btnExport=PandoraUI.$('btn-export-all');if(btnExport)btnExport.onclick=function(){ModuleBackup.exportAll()};
var btnImport=PandoraUI.$('btn-import-trigger');var fileImport=PandoraUI.$('file-import');if(btnImport&amp;&amp;fileImport){btnImport.onclick=function(){fileImport.click()};fileImport.onchange=function(e){var f=e.target.files[0];if(f)ModuleBackup.importFromFile(f);fileImport.value=''}}
var btnClear=PandoraUI.$('btn-clear-all');if(btnClear)btnClear.onclick=function(){ModuleBackup.clearAll()};
var btnDemo=PandoraUI.$('btn-load-demo');if(btnDemo)btnDemo.onclick=function(){ModuleBackup.loadDemo()};
var dealsAdd=PandoraUI.$('deals-add-btn');if(dealsAdd)dealsAdd.onclick=function(){ModuleDeals.openAdd()};
var dealCancel=PandoraUI.$('deal-cancel-btn');if(dealCancel)dealCancel.onclick=function(){PandoraUI.$('deal-modal').classList.remove('active')};
var dealSave=PandoraUI.$('deal-save-btn');if(dealSave)dealSave.onclick=function(){ModuleDeals.save()};
var dealsSearch=PandoraUI.$('deals-search');if(dealsSearch)dealsSearch.oninput=function(){ModuleDeals.render()};
var dealsManager=PandoraUI.$('deals-manager-filter');if(dealsManager)dealsManager.onchange=function(){ModuleDeals.render()};
var clientsAdd=PandoraUI.$('clients-add-btn');if(clientsAdd)clientsAdd.onclick=function(){ModuleClients.openAdd()};
var clientCancel=PandoraUI.$('client-cancel-btn');if(clientCancel)clientCancel.onclick=function(){PandoraUI.$('client-modal').classList.remove('active')};
var clientSave=PandoraUI.$('client-save-btn');if(clientSave)clientSave.onclick=function(){ModuleClients.save()};
var clientsSearch=PandoraUI.$('clients-search');if(clientsSearch)clientsSearch.oninput=function(){ModuleClients.render()};
var clientsType=PandoraUI.$('clients-type-filter');if(clientsType)clientsType.onchange=function(){ModuleClients.render()};
var clientsStatus=PandoraUI.$('clients-status-filter');if(clientsStatus)clientsStatus.onchange=function(){ModuleClients.render()};
var clientsExport=PandoraUI.$('clients-export-btn');if(clientsExport)clientsExport.onclick=function(){ModuleClients.exportCSV()};
var clientsImport=PandoraUI.$('clients-import-btn');var clientsFile=PandoraUI.$('clients-file-import');if(clientsImport&amp;&amp;clientsFile){clientsImport.onclick=function(){clientsFile.click()};clientsFile.onchange=function(e){var f=e.target.files[0];if(f)ModuleClients.importCSV(f);clientsFile.value=''}}
var tasksAdd=PandoraUI.$('tasks-add-btn');if(tasksAdd)tasksAdd.onclick=function(){ModuleTasks.openAdd()};
var taskCancel=PandoraUI.$('task-cancel-btn');if(taskCancel)taskCancel.onclick=function(){PandoraUI.$('task-modal').classList.remove('active')};
var taskSave=PandoraUI.$('task-save-btn');if(taskSave)taskSave.onclick=function(){ModuleTasks.save()};
var tasksSearch=PandoraUI.$('tasks-search');if(tasksSearch)tasksSearch.oninput=function(){ModuleTasks.render()};
var tasksAssignee=PandoraUI.$('tasks-assignee-filter');if(tasksAssignee)tasksAssignee.onchange=function(){ModuleTasks.render()};
var tasksPriority=PandoraUI.$('tasks-priority-filter');if(tasksPriority)tasksPriority.onchange=function(){ModuleTasks.render()};
var calPrev=PandoraUI.$('cal-prev');if(calPrev)calPrev.onclick=function(){ModuleCalendar.prev()};
var calNext=PandoraUI.$('cal-next');if(calNext)calNext.onclick=function(){ModuleCalendar.next()};
var calToday=PandoraUI.$('cal-today');if(calToday)calToday.onclick=function(){ModuleCalendar.goToday()};
var whAdd=PandoraUI.$('wh-add-btn');if(whAdd)whAdd.onclick=function(){ModuleWarehouse.openAdd()};
var whProductCancel=PandoraUI.$('wh-product-cancel');if(whProductCancel)whProductCancel.onclick=function(){PandoraUI.$('wh-product-modal').classList.remove('active')};
var whProductSave=PandoraUI.$('wh-product-save');if(whProductSave)whProductSave.onclick=function(){ModuleWarehouse.saveProduct()};
var whSearch=PandoraUI.$('wh-search');if(whSearch)whSearch.oninput=function(){ModuleWarehouse.render()};
var whCatFilter=PandoraUI.$('wh-cat-filter');if(whCatFilter)whCatFilter.onchange=function(){ModuleWarehouse.render()};
var whLowOnly=PandoraUI.$('wh-low-only');if(whLowOnly)whLowOnly.onchange=function(){ModuleWarehouse.render()};
var whMoveInOpt=PandoraUI.$('wh-move-in-opt');if(whMoveInOpt)whMoveInOpt.onclick=function(){ModuleWarehouse.setMoveType('in')};
var whMoveOutOpt=PandoraUI.$('wh-move-out-opt');if(whMoveOutOpt)whMoveOutOpt.onclick=function(){ModuleWarehouse.setMoveType('out')};
var whMoveCancel=PandoraUI.$('wh-move-cancel');if(whMoveCancel)whMoveCancel.onclick=function(){PandoraUI.$('wh-move-modal').classList.remove('active')};
var whMoveSave=PandoraUI.$('wh-move-save');if(whMoveSave)whMoveSave.onclick=function(){ModuleWarehouse.saveMove()};
var docsAdd=PandoraUI.$('docs-add-btn');if(docsAdd)docsAdd.onclick=function(){ModuleDocs.openAdd()};
var docCancel=PandoraUI.$('doc-cancel-btn');if(docCancel)docCancel.onclick=function(){PandoraUI.$('doc-form-modal').classList.remove('active')};
var docSave=PandoraUI.$('doc-save-btn');if(docSave)docSave.onclick=function(){ModuleDocs.save()};
var docAddItem=PandoraUI.$('doc-add-item');if(docAddItem)docAddItem.onclick=function(){ModuleDocs.currentItems.push({name:'',qty:1,price:0});ModuleDocs.renderItems(ModuleDocs.currentItems)};
var docAddFromWh=PandoraUI.$('doc-add-from-wh');if(docAddFromWh)docAddFromWh.onclick=function(){ModuleDocs.addFromWarehouse()};
var docTypeSel=PandoraUI.$('doc-type');if(docTypeSel)docTypeSel.onchange=function(){if(!PandoraUI.$('doc-edit-id').value){PandoraUI.$('doc-number').value=ModuleDocs.nextDocNumber(docTypeSel.value)}};
var docPreviewClose=PandoraUI.$('doc-preview-close');if(docPreviewClose)docPreviewClose.onclick=function(){PandoraUI.$('doc-preview-modal').classList.remove('active')};
var docPrintBtn=PandoraUI.$('doc-print-btn');if(docPrintBtn)docPrintBtn.onclick=function(){ModuleDocs.printCurrent()};
document.querySelectorAll('#pd-root .tax-tab').forEach(function(tab){tab.onclick=function(){ModuleTax.switchTab(tab.dataset.taxtab)}});
var u6Calc=PandoraUI.$('u6-calc');if(u6Calc)u6Calc.onclick=function(){ModuleTax.calcU6()};
var u15Calc=PandoraUI.$('u15-calc');if(u15Calc)u15Calc.onclick=function(){ModuleTax.calcU15()};
var osnCalc=PandoraUI.$('osn-calc');if(osnCalc)osnCalc.onclick=function(){ModuleTax.calcOsn()};
var npdCalc=PandoraUI.$('npd-calc');if(npdCalc)npdCalc.onclick=function(){ModuleTax.calcNpd()};
var cmpCalc=PandoraUI.$('cmp-calc');if(cmpCalc)cmpCalc.onclick=function(){ModuleTax.calcCompare()};
var taxCalCalc=PandoraUI.$('taxcal-calc');if(taxCalCalc)taxCalCalc.onclick=function(){ModuleTax.calcCalendar()};
document.addEventListener('keydown',function(e){if((e.ctrlKey||e.metaKey)&amp;&amp;e.key==='s'){e.preventDefault();var active=document.querySelector('#pd-root .section.active');if(active&amp;&amp;active.dataset.section==='settings')ModuleSettings.save();else ModuleBackup.exportAll()}if((e.ctrlKey||e.metaKey)&amp;&amp;e.key==='k'){e.preventDefault();var s=PandoraUI.$('global-search');if(s)s.focus()}if(e.key==='Escape'){document.querySelectorAll('#pd-root .modal-overlay.active').forEach(function(m){m.classList.remove('active')})}});
ModuleSettings.loadForm();ModuleDashboard.render();ModuleDeals.render();ModuleClients.render();ModuleTasks.render();ModuleWarehouse.render();ModuleDocs.render();ModuleActivity.render();ModuleBackup.renderInfo();ModuleSearch.render('');PandoraUI.updateNavBadges();
PandoraStore.logActivity('system','Система запущена');PandoraStore.save();
}
if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',init)}else{init()}
})();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-08-19T05:55:03Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/f1/ddc6349a4311f19817f9045e951988/-/logo.png</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
