<?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/srm-chernovik</id>
  <link href="https://www.pandoraburo.ru/srm-chernovik.xml" rel="self"/>
  <title/>
  <subtitle type="html">
&lt;html lang="ru"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Пандора CRM — Часть 4&lt;/title&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);--fd:'Unbounded','Arial Black',sans-serif;--fb:'Inter',system-ui,sans-serif;--fm:'JetBrains Mono',monospace}
#pd-root *,#pd-root *::before,#pd-root *::after{box-sizing:border-box;margin:0;padding:0}
#pd-root{font-family:var(--fb);background:var(--bg);color:var(--txt);min-height:100vh;line-height:1.55}
#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 .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-blue{color:var(--blue)}
#pd-root .nav-section.ns-pink{color:var(--pink)}
#pd-root .nav-section.ns-orange{color:var(--orange)}
#pd-root .nav-section.ns-gold{color:var(--gold)}
#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 .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-secondary{background:var(--muted)}
#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-green{background:linear-gradient(90deg,var(--green),#1b5e20)}
#pd-root .btn-violet{background:linear-gradient(90deg,var(--violet),#4527a0)}
#pd-root .btn-d{background:var(--red)}
#pd-root .btn-s{padding:.35rem .7rem;font-size:.8rem}
#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)}
#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 .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-violet{border-top-color:var(--violet)}.dash-card.dc-violet h3{color:var(--violet)}
#pd-root .dash-card.dc-green{border-top-color:var(--green)}.dash-card.dc-green h3{color:var(--green)}
#pd-root .dash-card.dc-orange{border-top-color:var(--orange)}.dash-card.dc-orange h3{color:var(--orange)}
#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)}
#pd-root .dash-row .v.violet{color:var(--violet)}
#pd-root .dash-row .v.red{color:var(--red)}
#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 .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 .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 .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 .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 .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 .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 .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}
#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 .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 .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 .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 .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)}
#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: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 .kanban.cols-5,#pd-root .kanban.cols-3{grid-template-columns:1fr}
  #pd-root .form-row,#pd-root .form-row-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;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;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="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 style="font-size:.8rem;color:var(--muted)"&gt;ЧАСТЬ 4 — Склад + Документы&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-company-name"&gt;&lt;/span&gt;&lt;/h1&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;/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" type="button"&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;button class="btn" id="clients-add-btn" type="button"&gt;+ Новый клиент&lt;/button&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;/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" type="button"&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="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" type="button"&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" type="button"&gt;+ Новый документ&lt;/button&gt;&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 class="num"&gt;Сумма&lt;/th&gt;&lt;th class="num"&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="settings"&gt;
    &lt;h1 class="section-title"&gt;Настройки &lt;span class="accent"&gt;компании&lt;/span&gt;&lt;/h1&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;/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-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&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&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" type="button"&gt;Сохранить настройки&lt;/button&gt;
      &lt;button class="btn btn-o" id="btn-reset-settings" type="button"&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="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" type="button"&gt;Скачать резервную копию&lt;/button&gt;
      &lt;/div&gt;
      &lt;div class="settings-card"&gt;&lt;h3&gt;Импорт данных&lt;/h3&gt;&lt;p&gt;Загрузить данные из JSON-файла. Текущие данные будут заменены!&lt;/p&gt;
        &lt;input type="file" id="file-import" accept=".json" style="display:none" /&gt;
        &lt;button class="btn btn-violet" id="btn-import-trigger" type="button"&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;button class="btn btn-d" id="btn-clear-all" type="button"&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;button class="btn btn-o" id="btn-load-demo" type="button"&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;input type="hidden" id="wh-move-type" value="in" /&gt;
    &lt;div id="wh-cur-stock" style="font-family:var(--fm);font-size:.85rem;color:var(--dim);margin-bottom:14px"&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&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="Например: Оплата по договору"&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;
(function(){
'use strict';
var DEALS_KEY='pandora_deals_v1',CLIENTS_KEY='pandora_clients_v1',TASKS_KEY='pandora_tasks_v1',WH_KEY='pandora_warehouse_v1',DOCS_KEY='pandora_docs_v1',SET_KEY='pandora_settings_v1';
var deals=[],clients=[],tasks=[],products=[],moves=[],docs=[];
var settings={company:{name:'',inn:'',kpp:'',address:''},contacts:{phone:'',email:''},signer:{role:'',name:''}};
var STAGES=[{key:'new',label:'Новая'},{key:'progress',label:'В работе'},{key:'negotiation',label:'Переговоры'},{key:'won',label:'Сделка'},{key:'lost',label:'Отказ'}];
var TYPE_LABELS={legal:'Юр. лицо',ip:'ИП',person:'Физ. лицо'};
var STATUS_LABELS={active:'Активный',vip:'VIP',inactive:'Неактивный'};
var TASK_TYPES={call:'Звонок',meeting:'Встреча',email:'Письмо',task:'Задача',payment:'Оплата'};
var TASK_STATUS={todo:'К выполнению',progress:'В работе',done:'Выполнено'};
var DOC_TYPES={invoice:'Счёт на оплату',act:'Акт выполненных работ',proposal:'Коммерческое предложение'};
var WH_STATUS={ok:'В наличии',low:'Заканчивается',out:'Нет в наличии'};
function $(id){return document.getElementById(id)}
function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n))}
function esc(s){return s==null?'':String(s).replace(/[&amp;&lt;&gt;"']/g,function(c){return{'&amp;':'&amp;amp;','&lt;':'&amp;lt;','&gt;':'&amp;gt;','"':'&amp;quot;',"'":'&amp;#39;'}[c]})}
function todayISO(){return new Date().toISOString().slice(0,10)}
function fmtDate(iso){if(!iso)return '';var p=iso.split('-');if(p.length!==3)return iso;return p[2]+'.'+p[1]+'.'+p[0]}
function toast(msg,type){type=type||'success';var t=$('main-toast');if(!t)return;t.textContent=msg;t.className='toast show '+(type!=='success'?type:'');setTimeout(function(){t.className='toast'},3000)}
function load(){try{var d=localStorage.getItem(DEALS_KEY);if(d)deals=JSON.parse(d)}catch(e){}
try{var c=localStorage.getItem(CLIENTS_KEY);if(c)clients=JSON.parse(c)}catch(e){}
try{var t=localStorage.getItem(TASKS_KEY);if(t)tasks=JSON.parse(t)}catch(e){}
try{var w=localStorage.getItem(WH_KEY);if(w){var wobj=JSON.parse(w);products=wobj.products||[];moves=wobj.moves||[]}}catch(e){}
try{var dc=localStorage.getItem(DOCS_KEY);if(dc)docs=JSON.parse(dc)}catch(e){}
try{var st=localStorage.getItem(SET_KEY);if(st)settings=JSON.parse(st)}catch(e){}
if(!clients.length){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:'Разовая консультация'}]}
if(!deals.length){deals=[{id:1,name:'Поставка серверов',clientName:'ООО ТехноПарк',amount:850000,prob:70,manager:'Иванов',stage:'negotiation',date:'2026-09-15'},{id:2,name:'Внедрение CRM',clientName:'ИП Смирнов А.В.',amount:120000,prob:50,manager:'Петров',stage:'progress',date:'2026-09-05'},{id:3,name:'Консалтинг',clientName:'АО Инвест Групп',amount:350000,prob:90,manager:'Сидоров',stage:'won',date:'2026-08-19'},{id:4,name:'Разработка сайта',clientName:'ООО Стартап Лаб',amount:200000,prob:30,manager:'Иванов',stage:'new',date:'2026-09-25'}]}
if(!tasks.length){tasks=[{id:1,title:'Позвонить по КП',desc:'Уточнить решение по КП',type:'call',priority:'high',status:'todo',assignee:'Иванов',dueDate:todayISO(),clientName:'ООО ТехноПарк'},{id:2,title:'Встреча в офисе',desc:'Обсудить условия договора',type:'meeting',priority:'medium',status:'progress',assignee:'Петров',dueDate:todayISO(),clientName:'АО Инвест Групп'},{id:3,title:'Отправить счёт',desc:'Счёт на предоплату 50%',type:'payment',priority:'high',status:'todo',assignee:'Сидоров',dueDate:'2026-08-22',clientName:'ООО Стартап Лаб'}]}
if(!products.length){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}]}
if(!moves.length){moves=[{id:1,productId:1,type:'in',qty:5,date:todayISO(),comment:'Поставка от ASUS'},{id:2,productId:2,type:'out',qty:2,date:todayISO(),comment:'Продажа'},{id:3,productId:4,type:'out',qty:3,date:todayISO(),comment:'Продажа'}]}
if(!docs.length){docs=[{id:1,type:'invoice',clientId:1,number:'СЧ-2026-001',date:todayISO(),comment:'Оплата за поставку серверов',items:[{name:'Ноутбук ASUS X515',qty:5,price:65000},{name:'Монитор Dell 24',qty:5,price:18500]}]}
save()}
function save(){try{localStorage.setItem(DEALS_KEY,JSON.stringify(deals));localStorage.setItem(CLIENTS_KEY,JSON.stringify(clients));localStorage.setItem(TASKS_KEY,JSON.stringify(tasks));localStorage.setItem(WH_KEY,JSON.stringify({products:products,moves:moves}));localStorage.setItem(DOCS_KEY,JSON.stringify(docs));localStorage.setItem(SET_KEY,JSON.stringify(settings))}catch(e){}}
function nextId(arr){return arr.length?Math.max.apply(null,arr.map(function(x){return x.id}))+1:1}
function switchSection(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:'Дашборд',deals:'Сделки',clients:'Клиенты',tasks:'Задачи',warehouse:'Склад',docs:'Документы',settings:'Настройки',backup:'Резервные копии'};$('breadcrumbs').textContent='Пандора CRM / '+(names[view]||view);window.scrollTo({top:0,behavior:'smooth'})}
function updateBadges(){var de=$('nav-deals-count');if(de)de.textContent=deals.length;var ce=$('nav-clients-count');if(ce)ce.textContent=clients.length;var te=$('nav-tasks-count');if(te)te.textContent=tasks.filter(function(t){return t.status!=='done'}).length;var we=$('nav-wh-count');if(we)we.textContent=products.length;var doe=$('nav-docs-count');if(doe)doe.textContent=docs.length}
function isOverdue(t){return t.dueDate&amp;&amp;t.dueDate&lt;todayISO()&amp;&amp;t.status!=='done'}
function isToday(t){return t.dueDate===todayISO()&amp;&amp;t.status!=='done'}
function populateClientSelect(selectId,selectedName){var sel=$(selectId);if(!sel)return;sel.innerHTML='&lt;option value=""&gt;— Не выбран —&lt;/option&gt;';for(var i=0;i&lt;clients.length;i++){var opt=document.createElement('option');opt.value=clients[i].name;opt.textContent=clients[i].name;if(selectedName&amp;&amp;clients[i].name===selectedName)opt.selected=true;sel.appendChild(opt)}}
function populateDealSelect(selectId,selectedName){var sel=$(selectId);if(!sel)return;sel.innerHTML='&lt;option value=""&gt;— Не связывать —&lt;/option&gt;';for(var i=0;i&lt;deals.length;i++){var opt=document.createElement('option');opt.value=deals[i].name;opt.textContent=deals[i].name+' ('+(deals[i].clientName||'—')+')';if(selectedName&amp;&amp;deals[i].name===selectedName)opt.selected=true;sel.appendChild(opt)}}
function getStockStatus(p){if(p.qty===0)return 'out';if(p.qty&lt;=p.minQty)return 'low';return 'ok'}
function docTotal(doc){return(doc.items||[]).reduce(function(s,it){return s+(it.qty||0)*(it.price||0)},0)}
function renderDashboard(){var won=deals.filter(function(d){return d.stage==='won'});var active=deals.filter(function(d){return d.stage!=='won'&amp;&amp;d.stage!=='lost'});var totalRev=won.reduce(function(s,d){return s+(d.amount||0)},0);var forecast=active.reduce(function(s,d){return s+(d.amount||0)*(d.prob||0)/100},0);var conv=deals.length&gt;0?(won.length/deals.length*100).toFixed(1):0;var stockValue=products.reduce(function(s,p){return s+(p.qty||0)*(p.cost||0)},0);
var cn=$('dash-company-name');if(cn)cn.textContent=settings.company.name||'';
var stats=$('dash-main-stats');if(stats)stats.innerHTML='&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Выручка&lt;/div&gt;&lt;div class="value"&gt;'+fmt(totalRev)+'&lt;/div&gt;&lt;div class="sub"&gt;'+won.length+' закрытых сделок&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;'+fmt(forecast)+'&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;'+conv+'%&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;'+clients.length+'&lt;/div&gt;&lt;div class="sub"&gt;активных: '+clients.filter(function(c){return c.status==='active'||c.status==='vip'}).length+'&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;'+fmt(stockValue)+'&lt;/div&gt;&lt;div class="sub"&gt;'+products.length+' позиций&lt;/div&gt;&lt;/div&gt;';
var dealsEl=$('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;'+deals.length+'&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;'+active.length+'&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;'+won.length+'&lt;/span&gt;&lt;/div&gt;';
var clientsEl=$('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;'+clients.length+'&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 red"&gt;'+clients.filter(function(c){return c.status==='vip'}).length+'&lt;/span&gt;&lt;/div&gt;';
var tasksEl=$('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;'+tasks.length+'&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;'+tasks.filter(isOverdue).length+'&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;'+tasks.filter(isToday).length+'&lt;/span&gt;&lt;/div&gt;';
var whEl=$('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;'+products.length+'&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;'+fmt(stockValue)+'&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;'+products.filter(function(p){return getStockStatus(p)!=='ok'}).length+'&lt;/span&gt;&lt;/div&gt;'}
function renderDeals(){var won=deals.filter(function(d){return d.stage==='won'});var active=deals.filter(function(d){return d.stage!=='won'&amp;&amp;d.stage!=='lost'});var totalRev=won.reduce(function(s,d){return s+(d.amount||0)},0);var forecast=active.reduce(function(s,d){return s+(d.amount||0)*(d.prob||0)/100},0);
var stats=$('deals-stats');if(stats)stats.innerHTML='&lt;div class="stat-card gold"&gt;&lt;div class="label"&gt;Всего сделок&lt;/div&gt;&lt;div class="value"&gt;'+deals.length+'&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;'+active.length+'&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;'+fmt(totalRev)+'&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;'+fmt(forecast)+'&lt;/div&gt;&lt;div class="sub"&gt;взвешенный&lt;/div&gt;&lt;/div&gt;';
var search=($('deals-search').value||'').toLowerCase().trim();var manager=$('deals-manager-filter').value;
var filtered=deals.filter(function(d){if(manager&amp;&amp;d.manager!==manager)return false;if(search){var hay=((d.name||'')+' '+(d.clientName||'')+' '+(d.manager||'')).toLowerCase();if(hay.indexOf(search)===-1)return false}return true});
var kanban=$('deals-kanban');if(!kanban)return;
kanban.innerHTML=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)+'&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 '&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;'+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;V&lt;/button&gt;':'')+'&lt;button class="act-edit" data-edit="'+d.id+'" title="Редактировать"&gt;E&lt;/button&gt;&lt;button class="act-del" data-del="'+d.id+'" title="Удалить"&gt;X&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;'+(d.clientName?'&lt;div class="k-card-client"&gt;'+esc(d.clientName)+'&lt;/div&gt;':'')+'&lt;div class="k-card-amount"&gt;'+fmt(d.amount||0)+'&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?' · '+d.date:'')+'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;'}).join('')+'&lt;/div&gt;&lt;/div&gt;'}).join('');
attachDealsDnD();attachDealsActions()}
function attachDealsDnD(){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);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'));if(e.dataTransfer.getData('data-type')!=='deal')return;var newStage=col.dataset.stage;var deal=deals.find(function(d){return d.id===id});if(deal&amp;&amp;deal.stage!==newStage){deal.stage=newStage;save();renderDeals();renderDashboard();updateBadges();toast('Сделка перемещена: '+newStage)}})})}
function attachDealsActions(){var kanban=$('deals-kanban');if(!kanban)return;kanban.querySelectorAll('[data-done]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();var id=parseInt(btn.dataset.done);var deal=deals.find(function(d){return d.id===id});if(deal){deal.stage='won';save();renderDeals();renderDashboard();updateBadges();toast('Сделка закрыта')}}});kanban.querySelectorAll('[data-edit]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();openDealEdit(parseInt(btn.dataset.edit))}});kanban.querySelectorAll('[data-del]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();removeDeal(parseInt(btn.dataset.del))}})}
function openDealAdd(){$('deal-modal-title').textContent='Новая сделка';$('deal-edit-id').value='';$('deal-name').value='';populateClientSelect('deal-client');$('deal-amount').value='';$('deal-prob').value='50';$('deal-stage').value='new';$('deal-manager').value='Иванов';var d=new Date();d.setDate(d.getDate()+30);$('deal-date').value=d.toISOString().slice(0,10);$('deal-modal').classList.add('active')}
function openDealEdit(id){var d=deals.find(function(x){return x.id===id});if(!d)return;$('deal-modal-title').textContent='Редактировать сделку';$('deal-edit-id').value=d.id;$('deal-name').value=d.name||'';populateClientSelect('deal-client',d.clientName);$('deal-amount').value=d.amount||'';$('deal-prob').value=d.prob||'50';$('deal-stage').value=d.stage||'new';$('deal-manager').value=d.manager||'Иванов';$('deal-date').value=d.date||'';$('deal-modal').classList.add('active')}
function saveDeal(){var name=$('deal-name').value.trim();var amount=parseInt($('deal-amount').value)||0;if(!name){toast('Укажите название сделки','error');return}if(amount&lt;=0){toast('Укажите сумму сделки','error');return}var editId=$('deal-edit-id').value;var clientName=$('deal-client').value;var client=clients.find(function(c){return c.name===clientName});var payload={name:name,amount:amount,clientId:client?client.id:null,clientName:clientName,prob:parseInt($('deal-prob').value)||50,stage:$('deal-stage').value,manager:$('deal-manager').value,date:$('deal-date').value};if(editId){var idx=deals.findIndex(function(d){return d.id===parseInt(editId)});if(idx!==-1){deals[idx]=Object.assign({},deals[idx],payload);toast('Сделка обновлена')}}else{payload.id=nextId(deals);deals.push(payload);toast('Сделка создана')}save();renderDeals();renderDashboard();updateBadges();$('deal-modal').classList.remove('active')}
function removeDeal(id){var d=deals.find(function(x){return x.id===id});if(!d)return;if(!confirm('Удалить сделку "'+d.name+'"?'))return;deals=deals.filter(function(x){return x.id!==id});save();renderDeals();renderDashboard();updateBadges();toast('Сделка удалена')}
function renderClients(){var active=clients.filter(function(c){return c.status==='active'||c.status==='vip'});var vip=clients.filter(function(c){return c.status==='vip'});
var stats=$('clients-stats');if(stats)stats.innerHTML='&lt;div class="stat-card pink"&gt;&lt;div class="label"&gt;Всего клиентов&lt;/div&gt;&lt;div class="value"&gt;'+clients.length+'&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;'+active.length+'&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;'+vip.length+'&lt;/div&gt;&lt;div class="sub"&gt;приоритет&lt;/div&gt;&lt;/div&gt;';
var search=($('clients-search').value||'').toLowerCase().trim();var type=$('clients-type-filter').value;var status=$('clients-status-filter').value;
var filtered=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||'')).toLowerCase();if(hay.indexOf(search)===-1)return false}return true});
var tbody=$('clients-tbody');if(!tbody)return;
if(!filtered.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=filtered.map(function(c){return '&lt;tr data-id="'+c.id+'"&gt;&lt;td&gt;&lt;div class="cell-main"&gt;'+esc(c.name)+'&lt;/div&gt;'+(c.email?'&lt;div class="cell-sub"&gt;'+esc(c.email)+'&lt;/div&gt;':'')+'&lt;/td&gt;&lt;td&gt;&lt;span class="badge '+c.type+'"&gt;'+(TYPE_LABELS[c.type]||c.type)+'&lt;/span&gt;&lt;/td&gt;&lt;td style="font-family:var(--fm);font-size:.82rem"&gt;'+esc(c.inn||'—')+'&lt;/td&gt;&lt;td&gt;'+esc(c.contact||'—')+'&lt;/td&gt;&lt;td style="font-family:var(--fm);font-size:.82rem"&gt;'+esc(c.phone||'—')+'&lt;/td&gt;&lt;td&gt;'+esc(c.manager||'—')+'&lt;/td&gt;&lt;td&gt;&lt;span class="badge status-'+c.status+'"&gt;'+(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;E&lt;/button&gt;&lt;button class="icon-btn del" data-del="'+c.id+'" title="Удалить"&gt;X&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;openClientView(parseInt(row.dataset.id))}});
tbody.querySelectorAll('[data-edit]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();openClientEdit(parseInt(btn.dataset.edit))}});
tbody.querySelectorAll('[data-del]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();removeClient(parseInt(btn.dataset.del))}})}
function openClientAdd(){$('client-modal-title').textContent='Новый клиент';$('client-edit-id').value='';['client-name','client-inn','client-kpp','client-contact','client-phone','client-email','client-address','client-notes'].forEach(function(id){$(id).value=''});$('client-type').value='legal';$('client-status').value='active';$('client-manager').value='Иванов';$('client-modal').classList.add('active')}
function openClientEdit(id){var c=clients.find(function(x){return x.id===id});if(!c)return;$('client-modal-title').textContent='Редактировать клиента';$('client-edit-id').value=c.id;$('client-name').value=c.name||'';$('client-type').value=c.type||'legal';$('client-status').value=c.status||'active';$('client-inn').value=c.inn||'';$('client-kpp').value=c.kpp||'';$('client-contact').value=c.contact||'';$('client-phone').value=c.phone||'';$('client-email').value=c.email||'';$('client-manager').value=c.manager||'Иванов';$('client-address').value=c.address||'';$('client-notes').value=c.notes||'';$('client-modal').classList.add('active')}
function saveClient(){var name=$('client-name').value.trim();if(!name){toast('Укажите название клиента','error');return}var editId=$('client-edit-id').value;var payload={name:name,type:$('client-type').value,status:$('client-status').value,inn:$('client-inn').value.trim(),kpp:$('client-kpp').value.trim(),contact:$('client-contact').value.trim(),phone:$('client-phone').value.trim(),email:$('client-email').value.trim(),manager:$('client-manager').value,address:$('client-address').value.trim(),notes:$('client-notes').value.trim()};if(editId){var idx=clients.findIndex(function(c){return c.id===parseInt(editId)});if(idx!==-1){clients[idx]=Object.assign({},clients[idx],payload);toast('Клиент обновлён')}}else{payload.id=nextId(clients);payload.createdAt=todayISO();clients.push(payload);toast('Клиент добавлен')}save();renderClients();renderDashboard();updateBadges();$('client-modal').classList.remove('active')}
function removeClient(id){var c=clients.find(function(x){return x.id===id});if(!c)return;if(!confirm('Удалить клиента "'+c.name+'"?'))return;clients=clients.filter(function(x){return x.id!==id});save();renderClients();renderDashboard();updateBadges();toast('Клиент удалён')}
function openClientView(id){var c=clients.find(function(x){return x.id===id});if(!c)return;var cDeals=deals.filter(function(d){return d.clientId===id||(d.clientName&amp;&amp;d.clientName.toLowerCase()===c.name.toLowerCase())});var cTasks=tasks.filter(function(t){return t.clientName&amp;&amp;t.clientName.toLowerCase()===c.name.toLowerCase()});var initials=c.name.replace(/[«»"']/g,'').split(' ').map(function(w){return w[0]}).join('').slice(0,2).toUpperCase();
var html='&lt;div class="client-profile-header"&gt;&lt;div class="client-avatar"&gt;'+esc(initials)+'&lt;/div&gt;&lt;div class="client-profile-title"&gt;&lt;h2&gt;'+esc(c.name)+'&lt;/h2&gt;&lt;div class="client-profile-meta"&gt;&lt;span class="badge '+c.type+'"&gt;'+(TYPE_LABELS[c.type]||c.type)+'&lt;/span&gt;&lt;span class="badge status-'+c.status+'"&gt;'+(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;'+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;'+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;'+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;'+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;'+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;'+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;'+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;'+esc(c.notes)+'&lt;/div&gt;&lt;/div&gt;':'')+'&lt;/div&gt;&lt;div class="card-section-title"&gt;Сделки клиента ('+cDeals.length+')&lt;/div&gt;'+(cDeals.length?cDeals.map(function(d){return '&lt;div class="linked-item" data-goto="deals"&gt;&lt;div&gt;&lt;div class="name"&gt;'+esc(d.name)+'&lt;/div&gt;&lt;div class="meta"&gt;'+(d.manager||'—')+(d.date?' · '+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;'+((STAGES.find(function(s){return s.key===d.stage})||{}).label||d.stage)+'&lt;/span&gt;&lt;span class="amount"&gt;'+fmt(d.amount||0)+'&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;Задачи клиента ('+cTasks.length+')&lt;/div&gt;'+(cTasks.length?cTasks.map(function(t){return '&lt;div class="linked-item" data-goto="tasks"&gt;&lt;div&gt;&lt;div class="name"&gt;'+esc(t.title)+'&lt;/div&gt;&lt;div class="meta"&gt;'+(t.assignee||'—')+(t.dueDate?' · '+fmtDate(t.dueDate):'')+'&lt;/div&gt;&lt;/div&gt;&lt;span class="badge stage-'+(t.status==='done'?'won':t.status==='progress'?'progress':'new')+'"&gt;'+(TASK_STATUS[t.status]||t.status)+'&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" type="button"&gt;Закрыть&lt;/button&gt;&lt;button class="btn" id="view-edit-btn" type="button"&gt;Редактировать&lt;/button&gt;&lt;/div&gt;';
$('client-view-content').innerHTML=html;$('client-view-modal').classList.add('active');
$('client-view-content').querySelectorAll('[data-goto]').forEach(function(el){el.onclick=function(){var v=el.getAttribute('data-goto');$('client-view-modal').classList.remove('active');switchSection(v)}});
$('view-close-btn').onclick=function(){$('client-view-modal').classList.remove('active')};
$('view-edit-btn').onclick=function(){$('client-view-modal').classList.remove('active');openClientEdit(id)}}
function renderTasks(){var active=tasks.filter(function(t){return t.status!=='done'});
var stats=$('tasks-stats');if(stats)stats.innerHTML='&lt;div class="stat-card violet"&gt;&lt;div class="label"&gt;Всего задач&lt;/div&gt;&lt;div class="value"&gt;'+tasks.length+'&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;'+active.length+'&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;'+tasks.filter(isOverdue).length+'&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;'+tasks.filter(isToday).length+'&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;'+tasks.filter(function(t){return t.status==='done'}).length+'&lt;/div&gt;&lt;div class="sub"&gt;завершено&lt;/div&gt;&lt;/div&gt;';
var search=($('tasks-search').value||'').toLowerCase().trim();var assignee=$('tasks-assignee-filter').value;var priority=$('tasks-priority-filter').value;
var filtered=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||'')).toLowerCase();if(hay.indexOf(search)===-1)return false}return true});
var statuses=[{key:'todo',label:'К выполнению'},{key:'progress',label:'В работе'},{key:'done',label:'Выполнено'}];
var kanban=$('tasks-kanban');if(!kanban)return;
kanban.innerHTML=statuses.map(function(st){var items=filtered.filter(function(t){return t.status===st.key});var po={high:0,medium:1,low:2};items.sort(function(a,b){var score=function(t){return isOverdue(t)?0:isToday(t)?1: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){var cls='k-card p-'+t.priority;if(isOverdue(t))cls+=' overdue';else if(isToday(t))cls+=' today';var dueIcon=isOverdue(t)?'!':isToday(t)?'T':'D';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;'+(TASK_TYPES[t.type]||'')+' '+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;V&lt;/button&gt;':'')+'&lt;button class="act-edit" data-edit="'+t.id+'" title="Редактировать"&gt;E&lt;/button&gt;&lt;button class="act-del" data-del="'+t.id+'" title="Удалить"&gt;X&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;'+(t.clientName?'&lt;div class="k-card-client"&gt;'+esc(t.clientName)+'&lt;/div&gt;':'')+(t.desc?'&lt;div class="k-card-desc"&gt;'+esc(t.desc)+'&lt;/div&gt;':'')+'&lt;div class="k-card-footer"&gt;&lt;span class="k-card-meta"&gt;'+dueIcon+' '+fmtDate(t.dueDate)+'&lt;/span&gt;&lt;span class="k-card-meta"&gt;&lt;span class="prio-dot '+t.priority+'"&gt;&lt;/span&gt;'+esc(t.assignee||'—')+'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;'}).join('')+'&lt;/div&gt;&lt;/div&gt;'}).join('');
attachTasksDnD();attachTasksActions()}
function attachTasksDnD(){var cards=document.querySelectorAll('#tasks-kanban .k-card');var cols=document.querySelectorAll('#tasks-kanban .kanban-col');cards.forEach(function(card){card.addEventListener('dragstart',function(e){e.dataTransfer.setData('text/plain',card.dataset.id);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'));if(e.dataTransfer.getData('data-type')!=='task')return;var newStatus=col.dataset.status;var task=tasks.find(function(t){return t.id===id});if(task&amp;&amp;task.status!==newStatus){task.status=newStatus;save();renderTasks();renderDashboard();updateBadges();if(newStatus==='done')toast('Задача выполнена');else toast('Задача перемещена')}})})}
function attachTasksActions(){var kanban=$('tasks-kanban');if(!kanban)return;kanban.querySelectorAll('[data-done]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();var id=parseInt(btn.dataset.done);var t=tasks.find(function(x){return x.id===id});if(t){t.status='done';save();renderTasks();renderDashboard();updateBadges();toast('Задача выполнена')}}});kanban.querySelectorAll('[data-edit]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();openTaskEdit(parseInt(btn.dataset.edit))}});kanban.querySelectorAll('[data-del]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();removeTask(parseInt(btn.dataset.del))}})}
function openTaskAdd(){$('task-modal-title').textContent='Новая задача';$('task-edit-id').value='';$('task-title').value='';$('task-desc').value='';populateClientSelect('task-client');$('task-type').value='call';$('task-priority').value='medium';$('task-assignee').value='Иванов';var d=new Date();d.setDate(d.getDate()+3);$('task-due').value=d.toISOString().slice(0,10);$('task-status').value='todo';$('task-modal').classList.add('active')}
function openTaskEdit(id){var t=tasks.find(function(x){return x.id===id});if(!t)return;$('task-modal-title').textContent='Редактировать задачу';$('task-edit-id').value=t.id;$('task-title').value=t.title||'';$('task-desc').value=t.desc||'';populateClientSelect('task-client',t.clientName);$('task-type').value=t.type||'call';$('task-priority').value=t.priority||'medium';$('task-assignee').value=t.assignee||'Иванов';$('task-due').value=t.dueDate||'';$('task-status').value=t.status||'todo';$('task-modal').classList.add('active')}
function saveTask(){var title=$('task-title').value.trim();var due=$('task-due').value;if(!title){toast('Укажите название задачи','error');return}if(!due){toast('Укажите срок выполнения','error');return}var editId=$('task-edit-id').value;var payload={title:title,dueDate:due,desc:$('task-desc').value.trim(),clientName:$('task-client').value,type:$('task-type').value,priority:$('task-priority').value,assignee:$('task-assignee').value,status:$('task-status').value};if(editId){var idx=tasks.findIndex(function(t){return t.id===parseInt(editId)});if(idx!==-1){tasks[idx]=Object.assign({},tasks[idx],payload);toast('Задача обновлена')}}else{payload.id=nextId(tasks);payload.createdAt=todayISO();tasks.push(payload);toast('Задача создана')}save();renderTasks();renderDashboard();updateBadges();$('task-modal').classList.remove('active')}
function removeTask(id){var t=tasks.find(function(x){return x.id===id});if(!t)return;if(!confirm('Удалить задачу "'+t.title+'"?'))return;tasks=tasks.filter(function(x){return x.id!==id});save();renderTasks();renderDashboard();updateBadges();toast('Задача удалена')}
function renderWarehouse(){var stockValue=products.reduce(function(s,p){return s+(p.qty||0)*(p.cost||0)},0);var low=products.filter(function(p){return getStockStatus(p)==='low'}).length;var out=products.filter(function(p){return getStockStatus(p)==='out'}).length;
var stats=$('wh-stats');if(stats)stats.innerHTML='&lt;div class="stat-card orange"&gt;&lt;div class="label"&gt;Позиций&lt;/div&gt;&lt;div class="value"&gt;'+products.length+'&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;'+fmt(stockValue)+'&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;'+low+'&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;'+out+'&lt;/div&gt;&lt;div class="sub"&gt;нулевой остаток&lt;/div&gt;&lt;/div&gt;';
var cats={};products.forEach(function(p){if(p.category)cats[p.category]=true});var catSel=$('wh-cat-filter');if(catSel){var cur=catSel.value;catSel.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;catSel.appendChild(opt)});catSel.value=cur}
var dl=$('wh-cat-list');if(dl)dl.innerHTML=Object.keys(cats).map(function(c){return '&lt;option value="'+esc(c)+'"&gt;'}).join('');
var search=($('wh-search').value||'').toLowerCase().trim();var cat=catSel?catSel.value:'';var lowOnly=$('wh-low-only')&amp;&amp;$('wh-low-only').checked;
var filtered=products.filter(function(p){if(cat&amp;&amp;p.category!==cat)return false;if(lowOnly&amp;&amp;getStockStatus(p)==='ok')return false;if(search){var hay=((p.name||'')+' '+(p.sku||'')+' '+(p.category||'')).toLowerCase();if(hay.indexOf(search)===-1)return false}return true});
var tbody=$('wh-tbody');if(!tbody)return;
if(!filtered.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;';renderMoves();return}
tbody.innerHTML=filtered.map(function(p){var st=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;'+esc(p.name)+'&lt;/div&gt;&lt;div class="cell-sub"&gt;'+esc(p.sku||'—')+'&lt;/div&gt;&lt;/td&gt;&lt;td&gt;'+(p.category?'&lt;span class="badge ip"&gt;'+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+' '+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)+'&lt;/td&gt;&lt;td class="num" style="color:var(--gold)"&gt;'+fmt(total)+'&lt;/td&gt;&lt;td&gt;&lt;span class="badge stock-'+st+'"&gt;'+WH_STATUS[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;E&lt;/button&gt;&lt;button class="icon-btn del" data-del="'+p.id+'" title="Удалить"&gt;X&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();openMove(parseInt(btn.dataset.moveIn),'in')}});
tbody.querySelectorAll('[data-move-out]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();openMove(parseInt(btn.dataset.moveOut),'out')}});
tbody.querySelectorAll('[data-edit]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();openProductEdit(parseInt(btn.dataset.edit))}});
tbody.querySelectorAll('[data-del]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();removeProduct(parseInt(btn.dataset.del))}});
renderMoves()}
function renderMoves(){var listEl=$('wh-moves-list');if(!listEl)return;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;'+esc(prodName)+'&lt;/div&gt;&lt;div class="meta"&gt;'+fmtDate(mv.date)+(mv.comment?' · '+esc(mv.comment):'')+(mv.dealName?' · '+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('')}
function openProductAdd(){$('wh-product-title').textContent='Новый товар';$('wh-edit-id').value='';$('wh-name').value='';$('wh-sku').value='';$('wh-category').value='';$('wh-unit').value='шт';$('wh-qty').value='0';$('wh-minqty').value='5';$('wh-price').value='0';$('wh-cost').value='0';$('wh-product-modal').classList.add('active')}
function openProductEdit(id){var p=products.find(function(x){return x.id===id});if(!p)return;$('wh-product-title').textContent='Редактировать товар';$('wh-edit-id').value=p.id;$('wh-name').value=p.name||'';$('wh-sku').value=p.sku||'';$('wh-category').value=p.category||'';$('wh-unit').value=p.unit||'шт';$('wh-qty').value=p.qty||0;$('wh-minqty').value=p.minQty||0;$('wh-price').value=p.price||0;$('wh-cost').value=p.cost||0;$('wh-product-modal').classList.add('active')}
function saveProduct(){var name=$('wh-name').value.trim();if(!name){toast('Укажите название товара','error');return}var editId=$('wh-edit-id').value;var payload={name:name,sku:$('wh-sku').value.trim(),category:$('wh-category').value.trim(),unit:$('wh-unit').value,qty:parseInt($('wh-qty').value)||0,minQty:parseInt($('wh-minqty').value)||0,price:parseFloat($('wh-price').value)||0,cost:parseFloat($('wh-cost').value)||0};if(editId){var idx=products.findIndex(function(p){return p.id===parseInt(editId)});if(idx!==-1){products[idx]=Object.assign({},products[idx],payload);toast('Товар обновлён')}}else{payload.id=nextId(products);products.push(payload);toast('Товар добавлен')}save();renderWarehouse();renderDashboard();updateBadges();$('wh-product-modal').classList.remove('active')}
function removeProduct(id){var p=products.find(function(x){return x.id===id});if(!p)return;if(!confirm('Удалить товар "'+p.name+'"?'))return;products=products.filter(function(x){return x.id!==id});save();renderWarehouse();renderDashboard();updateBadges();toast('Товар удалён')}
function openMove(productId,type){var p=products.find(function(x){return x.id===productId});if(!p)return;$('wh-move-product-id').value=productId;$('wh-move-type').value=type;$('wh-move-title').textContent=(type==='in'?'+ Приход: ':'- Расход: ')+p.name;$('wh-cur-stock').textContent='Текущий остаток: '+p.qty+' '+p.unit+' (мин. '+p.minQty+')';$('wh-move-qty').value='1';$('wh-move-comment').value='';populateDealSelect('wh-move-deal');$('wh-move-modal').classList.add('active')}
function saveMove(){var productId=parseInt($('wh-move-product-id').value);var qty=parseInt($('wh-move-qty').value);var type=$('wh-move-type').value;var p=products.find(function(x){return x.id===productId});if(!p){$('wh-move-modal').classList.remove('active');return}if(!qty||qty&lt;=0){toast('Укажите корректное количество','error');return}if(type==='out'&amp;&amp;qty&gt;p.qty){toast('Нельзя списать больше, чем есть ('+p.qty+' '+p.unit+')','error');return}if(type==='in')p.qty+=qty;else p.qty-=qty;var dealName=$('wh-move-deal').value;moves.push({id:nextId(moves),productId:productId,type:type,qty:qty,date:todayISO(),comment:$('wh-move-comment').value.trim(),dealName:dealName||null});save();renderWarehouse();renderDashboard();updateBadges();$('wh-move-modal').classList.remove('active');if(type==='out'&amp;&amp;p.qty&lt;=p.minQty){toast('Внимание: "'+p.name+'" осталось '+p.qty+' '+p.unit+' — ниже минимума!','error')}else{toast('Движение проведено')}}
function renderDocs(){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 totalSum=docs.reduce(function(s,d){return s+docTotal(d)},0);
var stats=$('docs-stats');if(stats)stats.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;'+fmt(totalSum)+'&lt;/div&gt;&lt;div class="sub"&gt;по всем&lt;/div&gt;&lt;/div&gt;';
var tbody=$('docs-tbody');if(!tbody)return;
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=clients.find(function(c){return c.id===d.clientId});var total=docTotal(d);return '&lt;tr data-id="'+d.id+'"&gt;&lt;td class="cell-main" style="font-family:var(--fm)"&gt;'+esc(d.number||'—')+'&lt;/td&gt;&lt;td&gt;&lt;span class="badge doc-'+d.type+'"&gt;'+(DOC_TYPES[d.type]||d.type)+'&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="cell-main"&gt;'+(client?esc(client.name):'—')+'&lt;/div&gt;'+(client&amp;&amp;client.contact?'&lt;div class="cell-sub"&gt;'+esc(client.contact)+'&lt;/div&gt;':'')+'&lt;/td&gt;&lt;td style="font-family:var(--fm);font-size:.82rem"&gt;'+fmtDate(d.date)+'&lt;/td&gt;&lt;td class="num" style="color:var(--gold)"&gt;'+fmt(total)+'&lt;/td&gt;&lt;td class="num"&gt;'+(d.items||[]).length+'&lt;/td&gt;&lt;td&gt;&lt;div class="row-actions"&gt;&lt;button class="icon-btn in" data-view-doc="'+d.id+'" title="Просмотр"&gt;V&lt;/button&gt;&lt;button class="icon-btn edit" data-edit-doc="'+d.id+'" title="Редактировать"&gt;E&lt;/button&gt;&lt;button class="icon-btn del" data-del-doc="'+d.id+'" title="Удалить"&gt;X&lt;/button&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;'}).join('');
tbody.querySelectorAll('[data-view-doc]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();previewDoc(parseInt(btn.dataset.viewDoc))}});
tbody.querySelectorAll('[data-edit-doc]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();openDocEdit(parseInt(btn.dataset.editDoc))}});
tbody.querySelectorAll('[data-del-doc]').forEach(function(btn){btn.onclick=function(e){e.stopPropagation();removeDoc(parseInt(btn.dataset.delDoc))}})}
var currentDocItems=[];
function renderDocItems(){var list=$('doc-items-list');if(!list)return;if(!currentDocItems.length){list.innerHTML='&lt;div style="color:var(--muted);font-size:.85rem;padding:10px"&gt;Добавьте хотя бы одну позицию&lt;/div&gt;';updateDocTotal();return}
list.innerHTML=currentDocItems.map(function(it,idx){return '&lt;div class="doc-item" data-idx="'+idx+'"&gt;&lt;input type="text" class="item-name" placeholder="Наименование" value="'+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;'+fmt((it.qty||0)*(it.price||0))+'&lt;/div&gt;&lt;button class="rm" data-rm="'+idx+'" type="button"&gt;X&lt;/button&gt;&lt;/div&gt;'}).join('');
list.querySelectorAll('.item-name').forEach(function(inp){inp.oninput=function(e){currentDocItems[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);currentDocItems[idx].qty=parseFloat(e.target.value)||0;updateDocTotal();var sumEl=e.target.closest('.doc-item').querySelector('.sum');if(sumEl)sumEl.textContent=fmt((currentDocItems[idx].qty||0)*(currentDocItems[idx].price||0))}});
list.querySelectorAll('.item-price').forEach(function(inp){inp.oninput=function(e){var idx=parseInt(e.target.closest('.doc-item').dataset.idx);currentDocItems[idx].price=parseFloat(e.target.value)||0;updateDocTotal();var sumEl=e.target.closest('.doc-item').querySelector('.sum');if(sumEl)sumEl.textContent=fmt((currentDocItems[idx].qty||0)*(currentDocItems[idx].price||0))}});
list.querySelectorAll('[data-rm]').forEach(function(btn){btn.onclick=function(){currentDocItems.splice(parseInt(btn.dataset.rm),1);renderDocItems()}});
updateDocTotal()}
function updateDocTotal(){var total=currentDocItems.reduce(function(s,it){return s+(it.qty||0)*(it.price||0)},0);var el=$('doc-total-value');if(el)el.textContent=fmt(total)}
function nextDocNumber(type){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')}
function openDocAdd(){$('doc-form-title').textContent='Новый документ';$('doc-edit-id').value='';$('doc-type').value='invoice';$('doc-number').value=nextDocNumber('invoice');$('doc-date').value=todayISO();populateClientSelect('doc-client');$('doc-comment').value='';currentDocItems=[{name:'',qty:1,price:0}];renderDocItems();$('doc-form-modal').classList.add('active')}
function openDocEdit(id){var doc=docs.find(function(d){return d.id===id});if(!doc)return;$('doc-form-title').textContent='Редактировать документ';$('doc-edit-id').value=doc.id;$('doc-type').value=doc.type;$('doc-number').value=doc.number||'';$('doc-date').value=doc.date||'';populateClientSelect('doc-client',doc.clientId);$('doc-comment').value=doc.comment||'';currentDocItems=JSON.parse(JSON.stringify(doc.items||[]));if(!currentDocItems.length)currentDocItems=[{name:'',qty:1,price:0}];renderDocItems();$('doc-form-modal').classList.add('active')}
function saveDoc(){var clientId=parseInt($('doc-client').value);if(!clientId){toast('Выберите клиента','error');return}var items=currentDocItems.filter(function(it){return it.name&amp;&amp;it.name.trim()});if(!items.length){toast('Добавьте хотя бы одну позицию с наименованием','error');return}var editId=$('doc-edit-id').value;var type=$('doc-type').value;var payload={type:type,clientId:clientId,number:$('doc-number').value.trim()||nextDocNumber(type),date:$('doc-date').value||todayISO(),comment:$('doc-comment').value.trim(),items:items};if(editId){var idx=docs.findIndex(function(d){return d.id===parseInt(editId)});if(idx!==-1){docs[idx]=Object.assign({},docs[idx],payload);toast('Документ обновлён')}}else{payload.id=nextId(docs);docs.push(payload);toast('Документ создан')}save();renderDocs();updateBadges();$('doc-form-modal').classList.remove('active')}
function removeDoc(id){var doc=docs.find(function(d){return d.id===id});if(!doc)return;if(!confirm('Удалить документ "'+doc.number+'"?'))return;docs=docs.filter(function(d){return d.id!==id});save();renderDocs();updateBadges();toast('Документ удалён')}
function buildDocHTML(doc){var client=clients.find(function(c){return c.id===doc.clientId});var company=settings.company||{};var contacts=settings.contacts||{};var signer=settings.signer||{};var total=docTotal(doc);
var html='&lt;div class="doc-head"&gt;&lt;div class="doc-company"&gt;'+esc(company.name||'Название компании')+'&lt;div class="sub"&gt;ИНН: '+esc(company.inn||'—')+(company.kpp?' / КПП: '+esc(company.kpp):'')+'&lt;/div&gt;&lt;div class="sub"&gt;'+esc(company.address||'')+'&lt;/div&gt;'+((contacts.phone||contacts.email)?'&lt;div class="sub"&gt;'+esc(contacts.phone||'')+((contacts.email)?' · '+esc(contacts.email):'')+'&lt;/div&gt;':'')+'&lt;/div&gt;&lt;div style="text-align:right;font-size:11px;color:#555"&gt;Дата: '+fmtDate(doc.date)+'&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="doc-title"&gt;'+(DOC_TYPES[doc.type]||'Документ')+' № '+esc(doc.number)+' от '+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;'+esc(company.name||'—')+'&lt;br&gt;ИНН: '+esc(company.inn||'—')+'&lt;/div&gt;&lt;div class="doc-party"&gt;&lt;div class="lbl"&gt;Заказчик / Клиент&lt;/div&gt;'+(client?esc(client.name):'—')+'&lt;br&gt;'+(client&amp;&amp;client.inn?'ИНН: '+esc(client.inn):'')+(client&amp;&amp;client.address?'&lt;br&gt;'+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;'+esc(it.name)+'&lt;/td&gt;&lt;td class="num"&gt;'+it.qty+'&lt;/td&gt;&lt;td class="num"&gt;'+fmt(it.price)+'&lt;/td&gt;&lt;td class="num"&gt;'+fmt((it.qty||0)*(it.price||0))+'&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;'+fmt(total)+'&lt;/span&gt;&lt;/div&gt;';
if(doc.comment){html+='&lt;div class="doc-comment"&gt;'+(doc.type==='invoice'?'Назначение платежа: ':'Примечание: ')+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;'+esc(signer.role||'Должность')+' / '+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;';
return html}
function previewDoc(id){var doc=docs.find(function(d){return d.id===id});if(!doc)return;var html=buildDocHTML(doc);$('doc-preview-content').innerHTML=html;$('docs-print-area').innerHTML=html;$('doc-preview-modal').classList.add('active')}
function printDoc(){window.print()}
function addDocFromWarehouse(){if(!products.length){toast('На складе нет товаров','error');return}var names=products.map(function(p,i){return(i+1)+'. '+p.name+'('+(p.sku||'без арт.')+') — '+fmt(p.price)}).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];currentDocItems.push({name:p.name,qty:1,price:p.price});renderDocItems();toast('Товар добавлен из склада')}else{toast('Неверный номер товара','error')}}
function renderBackupInfo(){var el=$('backup-export-info');if(!el)return;el.innerHTML=['Сделки:        '+deals.length,'Клиенты:       '+clients.length,'Задачи:        '+tasks.length,'Товары:        '+products.length,'Движения:      '+moves.length,'Документы:     '+docs.length].join('&lt;br&gt;')}
function exportAll(){var data={deals:deals,clients:clients,tasks:tasks,warehouse:{products:products,moves:moves},docs:docs,settings:settings,exportDate:new Date().toISOString()};var blob=new Blob([JSON.stringify(data,null,2)],{type:'application/json;charset=utf-8'});var url=URL.createObjectURL(blob);var link=document.createElement('a');var date=new Date().toISOString().slice(0,10);var companyName=(settings.company.name||'pandora').replace(/[^a-zа-я0-9]/gi,'_');link.href=url;link.download='pandora-backup-'+companyName+'-'+date+'.json';link.click();setTimeout(function(){URL.revokeObjectURL(url)},100);toast('Резервная копия сохранена')}
function importFromFile(file){if(!confirm('Все текущие данные будут заменены данными из файла. Продолжить?'))return;var reader=new FileReader();reader.onload=function(e){try{var imported=JSON.parse(e.target.result);deals=imported.deals||[];clients=imported.clients||[];tasks=imported.tasks||[];if(imported.warehouse){products=imported.warehouse.products||[];moves=imported.warehouse.moves||[]}docs=imported.docs||[];if(imported.settings)settings=imported.settings;save();renderAll();toast('Данные успешно импортированы')}catch(err){toast('Ошибка импорта: '+err.message,'error')}};reader.readAsText(file,'utf-8')}
function clearAll(){if(!confirm('Вы уверены? Все данные будут удалены БЕЗВОЗВРАТНО.'))return;if(!confirm('Точно удалить ВСЕ данные? Это действие нельзя отменить.'))return;deals=[];clients=[];tasks=[];products=[];moves=[];docs=[];settings={company:{name:'',inn:'',kpp:'',address:''},contacts:{phone:'',email:''},signer:{role:'',name:''}};save();renderAll();toast('Все данные удалены')}
function loadDemo(){if(deals.length||clients.length){if(!confirm('В системе уже есть данные. Демо-данные будут добавлены к существующим. Продолжить?'))return}deals=[{id:1,name:'Поставка серверов',clientName:'ООО ТехноПарк',amount:850000,prob:70,manager:'Иванов',stage:'negotiation',date:'2026-09-15'},{id:2,name:'Внедрение CRM',clientName:'ИП Смирнов А.В.',amount:120000,prob:50,manager:'Петров',stage:'progress',date:'2026-09-05'},{id:3,name:'Консалтинг',clientName:'АО Инвест Групп',amount:350000,prob:90,manager:'Сидоров',stage:'won',date:'2026-08-19'}];clients=[{id:1,name:'ООО ТехноПарк',type:'legal',inn:'7712345678',contact:'Смирнов Алексей',phone:'+7 495 123-45-67',status:'vip',manager:'Иванов',notes:'Крупный клиент'},{id:2,name:'ИП Смирнов А.В.',type:'ip',inn:'771234567890',contact:'Смирнов Алексей',phone:'+7 916 000-11-22',status:'active',manager:'Петров',notes:''},{id:3,name:'АО Инвест Групп',type:'legal',inn:'7798765432',contact:'Кузнецова Мария',phone:'+7 495 987-65-43',status:'active',manager:'Сидоров',notes:''}];tasks=[{id:1,title:'Позвонить по КП',desc:'Уточнить решение по КП',type:'call',priority:'high',status:'todo',assignee:'Иванов',dueDate:todayISO(),clientName:'ООО ТехноПарк'}];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}];moves=[{id:1,productId:1,type:'in',qty:5,date:todayISO(),comment:'Поставка от ASUS'}];docs=[{id:1,type:'invoice',clientId:1,number:'СЧ-2026-001',date:todayISO(),comment:'Оплата за поставку серверов',items:[{name:'Ноутбук ASUS X515',qty:5,price:65000}]}];save();renderAll();toast('Демо-данные загружены')}
function loadSettingsForm(){$('set-company-name').value=settings.company.name||'';$('set-inn').value=settings.company.inn||'';$('set-kpp').value=settings.company.kpp||'';$('set-address').value=settings.company.address||'';$('set-phone').value=settings.contacts.phone||'';$('set-email').value=settings.contacts.email||'';$('set-signer-role').value=settings.signer.role||'';$('set-signer-name').value=settings.signer.name||''}
function saveSettings(){settings.company={name:$('set-company-name').value.trim(),inn:$('set-inn').value.trim(),kpp:$('set-kpp').value.trim(),address:$('set-address').value.trim()};settings.contacts={phone:$('set-phone').value.trim(),email:$('set-email').value.trim()};settings.signer={role:$('set-signer-role').value.trim(),name:$('set-signer-name').value.trim()};save();renderDashboard();toast('Настройки сохранены')}
function resetSettings(){if(!confirm('Сбросить все настройки к значениям по умолчанию?'))return;settings={company:{name:'',inn:'',kpp:'',address:''},contacts:{phone:'',email:''},signer:{role:'',name:''}};save();loadSettingsForm();renderDashboard();toast('Настройки сброшены')}
function renderAll(){renderDashboard();renderDeals();renderClients();renderTasks();renderWarehouse();renderDocs();renderBackupInfo();updateBadges()}
function init(){load();renderAll();loadSettingsForm();
var nav=$('main-nav');if(nav){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)switchSection(view)})}
var dealsAdd=$('deals-add-btn');if(dealsAdd)dealsAdd.onclick=function(){openDealAdd()};
var dealCancel=$('deal-cancel-btn');if(dealCancel)dealCancel.onclick=function(){$('deal-modal').classList.remove('active')};
var dealSave=$('deal-save-btn');if(dealSave)dealSave.onclick=function(){saveDeal()};
var dealsSearch=$('deals-search');if(dealsSearch)dealsSearch.oninput=function(){renderDeals()};
var dealsManager=$('deals-manager-filter');if(dealsManager)dealsManager.onchange=function(){renderDeals()};
var clientsAdd=$('clients-add-btn');if(clientsAdd)clientsAdd.onclick=function(){openClientAdd()};
var clientCancel=$('client-cancel-btn');if(clientCancel)clientCancel.onclick=function(){$('client-modal').classList.remove('active')};
var clientSave=$('client-save-btn');if(clientSave)clientSave.onclick=function(){saveClient()};
var clientsSearch=$('clients-search');if(clientsSearch)clientsSearch.oninput=function(){renderClients()};
var clientsType=$('clients-type-filter');if(clientsType)clientsType.onchange=function(){renderClients()};
var clientsStatus=$('clients-status-filter');if(clientsStatus)clientsStatus.onchange=function(){renderClients()};
var tasksAdd=$('tasks-add-btn');if(tasksAdd)tasksAdd.onclick=function(){openTaskAdd()};
var taskCancel=$('task-cancel-btn');if(taskCancel)taskCancel.onclick=function(){$('task-modal').classList.remove('active')};
var taskSave=$('task-save-btn');if(taskSave)taskSave.onclick=function(){saveTask()};
var tasksSearch=$('tasks-search');if(tasksSearch)tasksSearch.oninput=function(){renderTasks()};
var tasksAssignee=$('tasks-assignee-filter');if(tasksAssignee)tasksAssignee.onchange=function(){renderTasks()};
var tasksPriority=$('tasks-priority-filter');if(tasksPriority)tasksPriority.onchange=function(){renderTasks()};
var whAdd=$('wh-add-btn');if(whAdd)whAdd.onclick=function(){openProductAdd()};
var whProductCancel=$('wh-product-cancel');if(whProductCancel)whProductCancel.onclick=function(){$('wh-product-modal').classList.remove('active')};
var whProductSave=$('wh-product-save');if(whProductSave)whProductSave.onclick=function(){saveProduct()};
var whSearch=$('wh-search');if(whSearch)whSearch.oninput=function(){renderWarehouse()};
var whCatFilter=$('wh-cat-filter');if(whCatFilter)whCatFilter.onchange=function(){renderWarehouse()};
var whLowOnly=$('wh-low-only');if(whLowOnly)whLowOnly.onchange=function(){renderWarehouse()};
var whMoveCancel=$('wh-move-cancel');if(whMoveCancel)whMoveCancel.onclick=function(){$('wh-move-modal').classList.remove('active')};
var whMoveSave=$('wh-move-save');if(whMoveSave)whMoveSave.onclick=function(){saveMove()};
var docsAdd=$('docs-add-btn');if(docsAdd)docsAdd.onclick=function(){openDocAdd()};
var docCancel=$('doc-cancel-btn');if(docCancel)docCancel.onclick=function(){$('doc-form-modal').classList.remove('active')};
var docSave=$('doc-save-btn');if(docSave)docSave.onclick=function(){saveDoc()};
var docAddItem=$('doc-add-item');if(docAddItem)docAddItem.onclick=function(){currentDocItems.push({name:'',qty:1,price:0});renderDocItems()};
var docAddFromWh=$('doc-add-from-wh');if(docAddFromWh)docAddFromWh.onclick=function(){addDocFromWarehouse()};
var docTypeSel=$('doc-type');if(docTypeSel)docTypeSel.onchange=function(){if(!$('doc-edit-id').value){$('doc-number').value=nextDocNumber(docTypeSel.value)}};
var docPreviewClose=$('doc-preview-close');if(docPreviewClose)docPreviewClose.onclick=function(){$('doc-preview-modal').classList.remove('active')};
var docPrintBtn=$('doc-print-btn');if(docPrintBtn)docPrintBtn.onclick=function(){printDoc()};
var btnSaveSettings=$('btn-save-settings');if(btnSaveSettings)btnSaveSettings.onclick=function(){saveSettings()};
var btnResetSettings=$('btn-reset-settings');if(btnResetSettings)btnResetSettings.onclick=function(){resetSettings()};
var btnExport=$('btn-export-all');if(btnExport)btnExport.onclick=function(){exportAll()};
var btnImport=$('btn-import-trigger');var fileImport=$('file-import');if(btnImport&amp;&amp;fileImport){btnImport.onclick=function(){fileImport.click()};fileImport.onchange=function(e){var f=e.target.files[0];if(f)importFromFile(f);fileImport.value=''}}
var btnClear=$('btn-clear-all');if(btnClear)btnClear.onclick=function(){clearAll()};
var btnDemo=$('btn-load-demo');if(btnDemo)btnDemo.onclick=function(){loadDemo()};
document.addEventListener('keydown',function(e){if(e.key==='Escape'){['deal-modal','client-modal','client-view-modal','task-modal','wh-product-modal','wh-move-modal','doc-form-modal','doc-preview-modal'].forEach(function(id){var m=$(id);if(m)m.classList.remove('active')})}})}
if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',init)}else{init()}
})();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-08-19T16:16:38Z</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>
