<?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/prozrachnyy-partnerskiy-reestr</id>
  <link href="https://www.pandoraburo.ru/prozrachnyy-partnerskiy-reestr.xml" rel="self"/>
  <title>Прозрачный Партнерский Реестр</title>
  <subtitle type="html">
&lt;html lang="ru"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;Прозрачный Партнерский Реестр&lt;/title&gt;
    &lt;style&gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            padding: 20px;
        }
        
        .container {
            max-width: 1400px;
            margin: 0 auto;
            background: white;
            border-radius: 20px;
            box-shadow: 0 20px 60px rgba(0,0,0,0.3);
            overflow: hidden;
        }
        
        .header {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 30px;
            text-align: center;
        }
        
        .header h1 {
            font-size: 2.5em;
            margin-bottom: 10px;
        }
        
        .header p {
            font-size: 1.1em;
            opacity: 0.9;
        }
        
        .nav-tabs {
            display: flex;
            background: #f8f9fa;
            border-bottom: 2px solid #e9ecef;
            overflow-x: auto;
        }
        
        .nav-tab {
            padding: 15px 25px;
            cursor: pointer;
            border: none;
            background: none;
            font-size: 1em;
            font-weight: 600;
            color: #6c757d;
            transition: all 0.3s;
            white-space: nowrap;
        }
        
        .nav-tab:hover {
            background: #e9ecef;
            color: #495057;
        }
        
        .nav-tab.active {
            background: white;
            color: #667eea;
            border-bottom: 3px solid #667eea;
        }
        
        .content {
            padding: 30px;
            min-height: 600px;
        }
        
        .tab-content {
            display: none;
        }
        
        .tab-content.active {
            display: block;
            animation: fadeIn 0.3s;
        }
        
        @keyframes fadeIn {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        .card {
            background: white;
            border: 1px solid #e9ecef;
            border-radius: 12px;
            padding: 25px;
            margin-bottom: 20px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.05);
        }
        
        .card h2 {
            color: #667eea;
            margin-bottom: 20px;
            font-size: 1.5em;
        }
        
        .btn {
            padding: 12px 24px;
            border: none;
            border-radius: 8px;
            font-size: 1em;
            font-weight: 600;
            cursor: pointer;
            transition: all 0.3s;
        }
        
        .btn-primary {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
        }
        
        .btn-primary:hover {
            transform: translateY(-2px);
            box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
        }
        
        .btn-secondary {
            background: #6c757d;
            color: white;
        }
        
        .btn-success {
            background: #28a745;
            color: white;
        }
        
        .btn-danger {
            background: #dc3545;
            color: white;
        }
        
        .form-group {
            margin-bottom: 20px;
        }
        
        .form-group label {
            display: block;
            margin-bottom: 8px;
            font-weight: 600;
            color: #495057;
        }
        
        .form-group input,
        .form-group select,
        .form-group textarea {
            width: 100%;
            padding: 12px;
            border: 2px solid #e9ecef;
            border-radius: 8px;
            font-size: 1em;
            transition: border-color 0.3s;
        }
        
        .form-group input:focus,
        .form-group select:focus,
        .form-group textarea:focus {
            outline: none;
            border-color: #667eea;
        }
        
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
        }
        
        th, td {
            padding: 12px;
            text-align: left;
            border-bottom: 1px solid #e9ecef;
        }
        
        th {
            background: #f8f9fa;
            font-weight: 600;
            color: #495057;
        }
        
        tr:hover {
            background: #f8f9fa;
        }
        
        .badge {
            display: inline-block;
            padding: 4px 12px;
            border-radius: 12px;
            font-size: 0.85em;
            font-weight: 600;
        }
        
        .badge-success {
            background: #d4edda;
            color: #155724;
        }
        
        .badge-warning {
            background: #fff3cd;
            color: #856404;
        }
        
        .badge-danger {
            background: #f8d7da;
            color: #721c24;
        }
        
        .stats-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
            gap: 20px;
            margin-bottom: 30px;
        }
        
        .stat-card {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 25px;
            border-radius: 12px;
            text-align: center;
        }
        
        .stat-card h3 {
            font-size: 2.5em;
            margin-bottom: 10px;
        }
        
        .stat-card p {
            font-size: 1.1em;
            opacity: 0.9;
        }
        
        @media print {
            body {
                background: white;
                padding: 0;
            }
            
            .container {
                box-shadow: none;
            }
            
            .nav-tabs, .btn {
                display: none;
            }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class="container"&gt;
        &lt;div class="header"&gt;
            &lt;h1&gt;? Прозрачный Партнерский Реестр&lt;/h1&gt;
            &lt;p&gt;Справедливое распределение прибыли для вашего партнерства&lt;/p&gt;
        &lt;/div&gt;
        
        &lt;div class="nav-tabs"&gt;
            &lt;button class="nav-tab active" onclick="showTab('dashboard')"&gt;? Дашборд&lt;/button&gt;
            &lt;button class="nav-tab" onclick="showTab('partners')"&gt;? Участники&lt;/button&gt;
            &lt;button class="nav-tab" onclick="showTab('assets')"&gt;? Активы&lt;/button&gt;
            &lt;button class="nav-tab" onclick="showTab('credits')"&gt;⚠️ Риски&lt;/button&gt;
            &lt;button class="nav-tab" onclick="showTab('time')"&gt;⏱️ Труд&lt;/button&gt;
            &lt;button class="nav-tab" onclick="showTab('valuation')"&gt;? Переоценка&lt;/button&gt;
            &lt;button class="nav-tab" onclick="showTab('profit')"&gt;? Прибыль&lt;/button&gt;
            &lt;button class="nav-tab" onclick="showTab('protocols')"&gt;? Протоколы&lt;/button&gt;
            &lt;button class="nav-tab" onclick="showTab('voting')"&gt;?️ Голосование&lt;/button&gt;
        &lt;/div&gt;
        
        &lt;div class="content"&gt;
            
            &lt;div id="dashboard" class="tab-content active"&gt;
                &lt;div class="stats-grid"&gt;
                    &lt;div class="stat-card"&gt;
                        &lt;h3 id="totalPartners"&gt;0&lt;/h3&gt;
                        &lt;p&gt;Участников&lt;/p&gt;
                    &lt;/div&gt;
                    &lt;div class="stat-card"&gt;
                        &lt;h3 id="totalAssets"&gt;0 ₽&lt;/h3&gt;
                        &lt;p&gt;Общий капитал&lt;/p&gt;
                    &lt;/div&gt;
                    &lt;div class="stat-card"&gt;
                        &lt;h3 id="totalHours"&gt;0&lt;/h3&gt;
                        &lt;p&gt;Часов за месяц&lt;/p&gt;
                    &lt;/div&gt;
                    &lt;div class="stat-card"&gt;
                        &lt;h3 id="totalProfit"&gt;0 ₽&lt;/h3&gt;
                        &lt;p&gt;Прибыль за период&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
                
                &lt;div class="card"&gt;
                    &lt;h2&gt;Добро пожаловать!&lt;/h2&gt;
                    &lt;p&gt;Это ваш центр управления партнерством. Начните с добавления участников и их вкладов.&lt;/p&gt;
                    &lt;br /&gt;
                    &lt;button class="btn btn-primary" onclick="showTab('partners')"&gt;Начать работу&lt;/button&gt;
                &lt;/div&gt;
            &lt;/div&gt;
            
            
            &lt;div id="partners" class="tab-content"&gt;&lt;/div&gt;
            &lt;div id="assets" class="tab-content"&gt;&lt;/div&gt;
            &lt;div id="credits" class="tab-content"&gt;&lt;/div&gt;
            &lt;div id="time" class="tab-content"&gt;&lt;/div&gt;
            &lt;div id="valuation" class="tab-content"&gt;&lt;/div&gt;
            &lt;div id="profit" class="tab-content"&gt;&lt;/div&gt;
            &lt;div id="protocols" class="tab-content"&gt;&lt;/div&gt;
            &lt;div id="voting" class="tab-content"&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;script&gt;
        // Глобальные данные
        let partners = [];
        let assets = [];
        let credits = [];
        let timeLogs = [];
        let valuations = [];
        let protocols = [];
        let votes = [];
        
        // Навигация по вкладкам
        function showTab(tabName) {
            // Скрыть все вкладки
            document.querySelectorAll('.tab-content').forEach(tab =&gt; {
                tab.classList.remove('active');
            });
            
            // Убрать активный класс со всех кнопок
            document.querySelectorAll('.nav-tab').forEach(btn =&gt; {
                btn.classList.remove('active');
            });
            
            // Показать выбранную вкладку
            document.getElementById(tabName).classList.add('active');
            
            // Добавить активный класс к кнопке
            event.target.classList.add('active');
        }
        
        // Обновление статистики на дашборде
        function updateDashboard() {
            document.getElementById('totalPartners').textContent = partners.length;
            
            const totalAssetsValue = assets.reduce((sum, asset) =&gt; sum + parseFloat(asset.value || 0), 0);
            document.getElementById('totalAssets').textContent = totalAssetsValue.toLocaleString('ru-RU') + ' ₽';
            
            const currentMonth = new Date().getMonth();
            const currentYear = new Date().getFullYear();
            const totalHoursValue = timeLogs
                .filter(log =&gt; {
                    const logDate = new Date(log.date);
                    return logDate.getMonth() === currentMonth &amp;&amp; logDate.getFullYear() === currentYear;
                })
                .reduce((sum, log) =&gt; sum + parseFloat(log.hours || 0), 0);
            document.getElementById('totalHours').textContent = totalHoursValue;
            
            document.getElementById('totalProfit').textContent = '0 ₽'; // Будет рассчитано позже
        }
        
        // Инициализация
        updateDashboard();
    &lt;/script&gt;
        &lt;script&gt;
        // ============================================
        // БЛОК 2: МОДУЛЬ УЧАСТНИКОВ
        // ============================================
        
        // Заполняем вкладку участников HTML-разметкой
        document.getElementById('partners').innerHTML = `
            &lt;div class="card"&gt;
                &lt;h2&gt;➕ Добавить нового участника&lt;/h2&gt;
                &lt;form id="partnerForm"&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;ФИО партнера *&lt;/label&gt;
                        &lt;input type="text" id="partnerName" required placeholder="Иванов Иван Иванович"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Роль в партнерстве *&lt;/label&gt;
                        &lt;select id="partnerRole" required&gt;
                            &lt;option value=""&gt;Выберите роль&lt;/option&gt;
                            &lt;option value="investor"&gt;Инвестор&lt;/option&gt;
                            &lt;option value="founder"&gt;Основатель&lt;/option&gt;
                            &lt;option value="manager"&gt;Управляющий&lt;/option&gt;
                            &lt;option value="specialist"&gt;Специалист&lt;/option&gt;
                            &lt;option value="partner"&gt;Равноправный партнер&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Часовая ставка (руб/час) *&lt;/label&gt;
                        &lt;input type="number" id="partnerHourlyRate" required min="0" step="100" placeholder="1500"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Контактные данные&lt;/label&gt;
                        &lt;input type="text" id="partnerContact" placeholder="Телефон, email, Telegram"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Описание вклада (кратко)&lt;/label&gt;
                        &lt;textarea id="partnerDescription" rows="3" placeholder="Что вносит партнер: деньги, имущество, компетенции, идеи..."&gt;&lt;/textarea&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Дата вступления *&lt;/label&gt;
                        &lt;input type="date" id="partnerJoinDate" required&gt;
                    &lt;/div&gt;
                    
                    &lt;button type="submit" class="btn btn-primary"&gt;Добавить участника&lt;/button&gt;
                    &lt;button type="button" class="btn btn-secondary" onclick="document.getElementById('partnerForm').reset()"&gt;Очистить&lt;/button&gt;
                &lt;/form&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Список участников&lt;/h2&gt;
                &lt;div id="partnersList"&gt;&lt;/div&gt;
            &lt;/div&gt;
        `;
        
        // Обработчик формы добавления участника
        document.getElementById('partnerForm').addEventListener('submit', function(e) {
            e.preventDefault();
            
            const partner = {
                id: Date.now(),
                name: document.getElementById('partnerName').value.trim(),
                role: document.getElementById('partnerRole').value,
                hourlyRate: parseFloat(document.getElementById('partnerHourlyRate').value) || 0,
                contact: document.getElementById('partnerContact').value.trim(),
                description: document.getElementById('partnerDescription').value.trim(),
                joinDate: document.getElementById('partnerJoinDate').value,
                createdAt: new Date().toISOString()
            };
            
            partners.push(partner);
            saveData();
            renderPartners();
            updateDashboard();
            
            this.reset();
            showToast('✅ Участник успешно добавлен!');
        });
        
        // Отрисовка списка участников
        function renderPartners() {
            const container = document.getElementById('partnersList');
            
            if (!container) return;
            
            if (partners.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;Пока нет участников. Добавьте первого!&lt;/p&gt;';
                return;
            }
            
            const roleLabels = {
                'investor': 'Инвестор',
                'founder': 'Основатель',
                'manager': 'Управляющий',
                'specialist': 'Специалист',
                'partner': 'Равноправный партнер'
            };
            
            let html = '&lt;table&gt;&lt;thead&gt;&lt;tr&gt;';
            html += '&lt;th&gt;ФИО&lt;/th&gt;';
            html += '&lt;th&gt;Роль&lt;/th&gt;';
            html += '&lt;th&gt;Ставка&lt;/th&gt;';
            html += '&lt;th&gt;Контакты&lt;/th&gt;';
            html += '&lt;th&gt;Дата вступления&lt;/th&gt;';
            html += '&lt;th&gt;Действия&lt;/th&gt;';
            html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
            
            partners.forEach(partner =&gt; {
                html += '&lt;tr&gt;';
                html += `&lt;td&gt;&lt;strong&gt;${escapeHtml(partner.name)}&lt;/strong&gt;&lt;br&gt;&lt;small style="color: #6c757d;"&gt;${escapeHtml(partner.description) || 'Нет описания'}&lt;/small&gt;&lt;/td&gt;`;
                html += `&lt;td&gt;&lt;span class="badge badge-success"&gt;${roleLabels[partner.role] || partner.role}&lt;/span&gt;&lt;/td&gt;`;
                html += `&lt;td&gt;${partner.hourlyRate.toLocaleString('ru-RU')} ₽/ч&lt;/td&gt;`;
                html += `&lt;td&gt;${escapeHtml(partner.contact) || '-'}&lt;/td&gt;`;
                html += `&lt;td&gt;${formatDate(partner.joinDate)}&lt;/td&gt;`;
                html += `&lt;td&gt;
                    &lt;button class="btn btn-secondary" onclick="editPartner(${partner.id})" style="padding: 6px 12px; font-size: 0.85em;"&gt;✏️&lt;/button&gt;
                    &lt;button class="btn btn-danger" onclick="deletePartner(${partner.id})" style="padding: 6px 12px; font-size: 0.85em;"&gt;?️&lt;/button&gt;
                &lt;/td&gt;`;
                html += '&lt;/tr&gt;';
            });
            
            html += '&lt;/tbody&gt;&lt;/table&gt;';
            container.innerHTML = html;
        }
        
        // Удаление участника
        function deletePartner(id) {
            const partner = partners.find(p =&gt; p.id === id);
            if (!partner) return;
            
            const hasAssets = assets.some(a =&gt; a.partnerId === id);
            const hasTimeLogs = timeLogs.some(t =&gt; t.partnerId === id);
            
            let warning = `Удалить участника "${partner.name}"?\n\n`;
            if (hasAssets || hasTimeLogs) {
                warning += '⚠️ ВНИМАНИЕ: У этого участника есть связанные записи (активы, трудозатраты). Они также будут удалены!\n\n';
            }
            warning += 'Это действие нельзя отменить.';
            
            if (confirm(warning)) {
                partners = partners.filter(p =&gt; p.id !== id);
                assets = assets.filter(a =&gt; a.partnerId !== id);
                timeLogs = timeLogs.filter(t =&gt; t.partnerId !== id);
                credits = credits.filter(c =&gt; c.partnerId !== id);
                saveData();
                renderPartners();
                updateDashboard();
                showToast('?️ Участник удалён');
            }
        }
        
        // Редактирование участника (упрощённая версия через prompt)
        function editPartner(id) {
            const partner = partners.find(p =&gt; p.id === id);
            if (!partner) return;
            
            const newName = prompt('ФИО партнера:', partner.name);
            if (newName === null) return;
            
            const newRate = prompt('Часовая ставка (руб/час):', partner.hourlyRate);
            if (newRate === null) return;
            
            const newContact = prompt('Контакты:', partner.contact);
            if (newContact === null) return;
            
            const newDesc = prompt('Описание вклада:', partner.description);
            if (newDesc === null) return;
            
            partner.name = newName.trim() || partner.name;
            partner.hourlyRate = parseFloat(newRate) || partner.hourlyRate;
            partner.contact = newContact.trim();
            partner.description = newDesc.trim();
            
            saveData();
            renderPartners();
            showToast('✅ Данные участника обновлены');
        }
        
        // Утилита: безопасный вывод HTML
        function escapeHtml(text) {
            if (!text) return '';
            const div = document.createElement('div');
            div.textContent = text;
            return div.innerHTML;
        }
        
        // Утилита: форматирование даты
        function formatDate(dateString) {
            if (!dateString) return '-';
            const date = new Date(dateString);
            return date.toLocaleDateString('ru-RU');
        }
        
        // Утилита: всплывающее уведомление
        function showToast(message) {
            const toast = document.createElement('div');
            toast.style.cssText = `
                position: fixed;
                top: 30px;
                right: 30px;
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                color: white;
                padding: 15px 25px;
                border-radius: 10px;
                box-shadow: 0 5px 20px rgba(0,0,0,0.3);
                z-index: 10000;
                font-weight: 600;
                animation: slideIn 0.3s;
            `;
            toast.textContent = message;
            document.body.appendChild(toast);
            
            setTimeout(() =&gt; {
                toast.style.opacity = '0';
                toast.style.transition = 'opacity 0.3s';
                setTimeout(() =&gt; toast.remove(), 300);
            }, 2500);
        }
        
        // Сохранение всех данных в localStorage
        function saveData() {
            localStorage.setItem('ppr_partners', JSON.stringify(partners));
            localStorage.setItem('ppr_assets', JSON.stringify(assets));
            localStorage.setItem('ppr_credits', JSON.stringify(credits));
            localStorage.setItem('ppr_timeLogs', JSON.stringify(timeLogs));
            localStorage.setItem('ppr_valuations', JSON.stringify(valuations));
            localStorage.setItem('ppr_protocols', JSON.stringify(protocols));
            localStorage.setItem('ppr_votes', JSON.stringify(votes));
        }
        
        // Загрузка всех данных из localStorage
        function loadData() {
            partners = JSON.parse(localStorage.getItem('ppr_partners') || '[]');
            assets = JSON.parse(localStorage.getItem('ppr_assets') || '[]');
            credits = JSON.parse(localStorage.getItem('ppr_credits') || '[]');
            timeLogs = JSON.parse(localStorage.getItem('ppr_timeLogs') || '[]');
            valuations = JSON.parse(localStorage.getItem('ppr_valuations') || '[]');
            protocols = JSON.parse(localStorage.getItem('ppr_protocols') || '[]');
            votes = JSON.parse(localStorage.getItem('ppr_votes') || '[]');
            
            renderPartners();
            updateDashboard();
        }
        
        // Загрузка данных при старте
        loadData();
    &lt;/script&gt;
        &lt;script&gt;
        // ============================================
        // БЛОК 3: РЕЕСТР АКТИВОВ
        // ============================================
        
        // Заполняем вкладку активов HTML-разметкой
        document.getElementById('assets').innerHTML = `
            &lt;div class="card"&gt;
                &lt;h2&gt;? Добавить актив&lt;/h2&gt;
                &lt;form id="assetForm"&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Партнер-вкладчик *&lt;/label&gt;
                        &lt;select id="assetPartner" required&gt;
                            &lt;option value=""&gt;Выберите партнера&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Тип актива *&lt;/label&gt;
                        &lt;select id="assetType" required onchange="updateAssetSubtype()"&gt;
                            &lt;option value=""&gt;Выберите тип&lt;/option&gt;
                            &lt;option value="money"&gt;? Деньги&lt;/option&gt;
                            &lt;option value="securities"&gt;? Акции, облигации, доли&lt;/option&gt;
                            &lt;option value="real_estate"&gt;? Недвижимость, земля&lt;/option&gt;
                            &lt;option value="equipment"&gt;⚙️ Оборудование, станки, транспорт&lt;/option&gt;
                            &lt;option value="inventory"&gt;? Товары, сырье, материалы&lt;/option&gt;
                            &lt;option value="ip"&gt;? Интеллектуальная собственность (бренд, патенты, ПО, КД)&lt;/option&gt;
                            &lt;option value="other"&gt;? Прочее&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Подтип / Детализация&lt;/label&gt;
                        &lt;input type="text" id="assetSubtype" placeholder="Например: Токарный станок, Патент №123, Бренд 'Название'"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Наименование актива *&lt;/label&gt;
                        &lt;input type="text" id="assetName" required placeholder="Например: Денежный взнос, Помещение на ул. Ленина, Станок XYZ"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Стоимость на момент внесения (руб) *&lt;/label&gt;
                        &lt;input type="number" id="assetValue" required min="0" step="100" placeholder="1000000"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Дата внесения *&lt;/label&gt;
                        &lt;input type="date" id="assetDate" required&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Описание / Примечание&lt;/label&gt;
                        &lt;textarea id="assetDescription" rows="3" placeholder="Дополнительная информация: инвентарный номер, документы, особенности..."&gt;&lt;/textarea&gt;
                    &lt;/div&gt;
                    
                    &lt;button type="submit" class="btn btn-primary"&gt;Добавить актив&lt;/button&gt;
                    &lt;button type="button" class="btn btn-secondary" onclick="document.getElementById('assetForm').reset()"&gt;Очистить&lt;/button&gt;
                &lt;/form&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Реестр активов&lt;/h2&gt;
                &lt;div id="assetsList"&gt;&lt;/div&gt;
            &lt;/div&gt;
        `;
        
        // Справочник типов активов
        const assetTypeLabels = {
            'money': '? Деньги',
            'securities': '? Ценные бумаги',
            'real_estate': '? Недвижимость',
            'equipment': '⚙️ Оборудование',
            'inventory': '? Товары/Сырье',
            'ip': '? Интеллектуальная собственность',
            'other': '? Прочее'
        };
        
        // Обновление подтипа (можно расширить)
        function updateAssetSubtype() {
            const type = document.getElementById('assetType').value;
            const subtypeInput = document.getElementById('assetSubtype');
            
            const placeholders = {
                'money': 'Валюта, счет, назначение',
                'securities': 'Название компании, тип бумаги',
                'real_estate': 'Адрес, кадастровый номер',
                'equipment': 'Модель, серийный номер',
                'inventory': 'Наименование, количество',
                'ip': 'Номер патента, свидетельство',
                'other': 'Уточнение'
            };
            
            subtypeInput.placeholder = placeholders[type] || 'Детализация';
        }
        
        // Обновление списка партнеров в select
        function updatePartnerSelect() {
            const select = document.getElementById('assetPartner');
            if (!select) return;
            
            select.innerHTML = '&lt;option value=""&gt;Выберите партнера&lt;/option&gt;';
            partners.forEach(partner =&gt; {
                const option = document.createElement('option');
                option.value = partner.id;
                option.textContent = partner.name;
                select.appendChild(option);
            });
        }
        
        // Обработчик формы добавления актива
        document.getElementById('assetForm').addEventListener('submit', function(e) {
            e.preventDefault();
            
            const partnerId = parseInt(document.getElementById('assetPartner').value);
            const partner = partners.find(p =&gt; p.id === partnerId);
            
            if (!partner) {
                alert('Ошибка: партнер не найден');
                return;
            }
            
            const asset = {
                id: Date.now(),
                partnerId: partnerId,
                partnerName: partner.name,
                type: document.getElementById('assetType').value,
                subtype: document.getElementById('assetSubtype').value.trim(),
                name: document.getElementById('assetName').value.trim(),
                value: parseFloat(document.getElementById('assetValue').value) || 0,
                date: document.getElementById('assetDate').value,
                description: document.getElementById('assetDescription').value.trim(),
                createdAt: new Date().toISOString()
            };
            
            assets.push(asset);
            saveData();
            renderAssets();
            updateDashboard();
            
            this.reset();
            showToast('✅ Актив успешно добавлен!');
        });
        
        // Отрисовка списка активов
        function renderAssets() {
            const container = document.getElementById('assetsList');
            
            if (!container) return;
            
            if (assets.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;Пока нет активов. Добавьте первый!&lt;/p&gt;';
                return;
            }
            
            // Группировка по партнерам
            const grouped = {};
            assets.forEach(asset =&gt; {
                if (!grouped[asset.partnerId]) {
                    grouped[asset.partnerId] = {
                        partnerName: asset.partnerName,
                        assets: [],
                        total: 0
                    };
                }
                grouped[asset.partnerId].assets.push(asset);
                grouped[asset.partnerId].total += asset.value;
            });
            
            let html = '';
            
            Object.keys(grouped).forEach(partnerId =&gt; {
                const group = grouped[partnerId];
                
                html += `&lt;div style="margin-bottom: 30px; border: 2px solid #e9ecef; border-radius: 12px; padding: 20px;"&gt;`;
                html += `&lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? ${escapeHtml(group.partnerName)}&lt;/h3&gt;`;
                html += `&lt;p style="margin-bottom: 15px;"&gt;&lt;strong&gt;Общая стоимость активов:&lt;/strong&gt; &lt;span style="color: #28a745; font-size: 1.2em;"&gt;${group.total.toLocaleString('ru-RU')} ₽&lt;/span&gt;&lt;/p&gt;`;
                
                html += '&lt;table&gt;&lt;thead&gt;&lt;tr&gt;';
                html += '&lt;th&gt;Тип&lt;/th&gt;';
                html += '&lt;th&gt;Наименование&lt;/th&gt;';
                html += '&lt;th&gt;Стоимость&lt;/th&gt;';
                html += '&lt;th&gt;Дата&lt;/th&gt;';
                html += '&lt;th&gt;Действия&lt;/th&gt;';
                html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
                
                group.assets.forEach(asset =&gt; {
                    html += '&lt;tr&gt;';
                    html += `&lt;td&gt;&lt;span class="badge badge-warning"&gt;${assetTypeLabels[asset.type] || asset.type}&lt;/span&gt;&lt;br&gt;&lt;small style="color: #6c757d;"&gt;${escapeHtml(asset.subtype) || ''}&lt;/small&gt;&lt;/td&gt;`;
                    html += `&lt;td&gt;&lt;strong&gt;${escapeHtml(asset.name)}&lt;/strong&gt;&lt;br&gt;&lt;small style="color: #6c757d;"&gt;${escapeHtml(asset.description) || ''}&lt;/small&gt;&lt;/td&gt;`;
                    html += `&lt;td&gt;&lt;strong&gt;${asset.value.toLocaleString('ru-RU')} ₽&lt;/strong&gt;&lt;/td&gt;`;
                    html += `&lt;td&gt;${formatDate(asset.date)}&lt;/td&gt;`;
                    html += `&lt;td&gt;
                        &lt;button class="btn btn-secondary" onclick="editAsset(${asset.id})" style="padding: 6px 12px; font-size: 0.85em;"&gt;✏️&lt;/button&gt;
                        &lt;button class="btn btn-danger" onclick="deleteAsset(${asset.id})" style="padding: 6px 12px; font-size: 0.85em;"&gt;?️&lt;/button&gt;
                    &lt;/td&gt;`;
                    html += '&lt;/tr&gt;';
                });
                
                html += '&lt;/tbody&gt;&lt;/table&gt;';
                html += '&lt;/div&gt;';
            });
            
            container.innerHTML = html;
        }
        
        // Удаление актива
        function deleteAsset(id) {
            const asset = assets.find(a =&gt; a.id === id);
            if (!asset) return;
            
            if (confirm(`Удалить актив "${asset.name}" стоимостью ${asset.value.toLocaleString('ru-RU')} ₽?\n\nЭто действие нельзя отменить.`)) {
                assets = assets.filter(a =&gt; a.id !== id);
                saveData();
                renderAssets();
                updateDashboard();
                showToast('?️ Актив удалён');
            }
        }
        
        // Редактирование актива
        function editAsset(id) {
            const asset = assets.find(a =&gt; a.id === id);
            if (!asset) return;
            
            const newName = prompt('Наименование актива:', asset.name);
            if (newName === null) return;
            
            const newValue = prompt('Стоимость (руб):', asset.value);
            if (newValue === null) return;
            
            const newDate = prompt('Дата внесения (ГГГГ-ММ-ДД):', asset.date);
            if (newDate === null) return;
            
            const newDesc = prompt('Описание:', asset.description);
            if (newDesc === null) return;
            
            asset.name = newName.trim() || asset.name;
            asset.value = parseFloat(newValue) || asset.value;
            asset.date = newDate || asset.date;
            asset.description = newDesc.trim();
            
            saveData();
            renderAssets();
            updateDashboard();
            showToast('✅ Актив обновлён');
        }
        
        // Обновление select при загрузке
        updatePartnerSelect();
    &lt;/script&gt;
        &lt;script&gt;
        // ============================================
        // БЛОК 4: ТРЕКЕР КРЕДИТОВ И РИСКОВ
        // ============================================
        
        // Заполняем вкладку рисков HTML-разметкой
        document.getElementById('credits').innerHTML = `
            &lt;div class="card"&gt;
                &lt;h2&gt;⚠️ Добавить кредит / поручительство&lt;/h2&gt;
                &lt;form id="creditForm"&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Заемщик (кто берет кредит) *&lt;/label&gt;
                        &lt;select id="creditBorrower" required&gt;
                            &lt;option value=""&gt;Выберите партнера&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Название кредита / обязательства *&lt;/label&gt;
                        &lt;input type="text" id="creditName" required placeholder="Например: Кредит на оборудование в Сбербанке"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Сумма кредита (руб) *&lt;/label&gt;
                        &lt;input type="number" id="creditAmount" required min="0" step="1000" placeholder="5000000"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Годовая ставка (%) *&lt;/label&gt;
                        &lt;input type="number" id="creditRate" required min="0" max="100" step="0.1" placeholder="15.5"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Срок кредита (месяцев) *&lt;/label&gt;
                        &lt;input type="number" id="creditTerm" required min="1" max="360" placeholder="36"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Дата начала *&lt;/label&gt;
                        &lt;input type="date" id="creditStartDate" required&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Поручители / Гаранты (можно выбрать несколько)&lt;/label&gt;
                        &lt;div id="guarantorsList" style="border: 2px solid #e9ecef; border-radius: 8px; padding: 15px; max-height: 200px; overflow-y: auto;"&gt;
                            &lt;p style="color: #6c757d; text-align: center;"&gt;Загрузите партнеров...&lt;/p&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Премия за риск для поручителей (% годовых от суммы поручительства)&lt;/label&gt;
                        &lt;input type="number" id="riskPremium" min="0" max="20" step="0.5" value="3" placeholder="3"&gt;
                        &lt;small style="color: #6c757d;"&gt;Рекомендуется: 2-5% годовых. Эта сумма выплачивается поручителям за риск их имуществом.&lt;/small&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Описание / Примечание&lt;/label&gt;
                        &lt;textarea id="creditDescription" rows="3" placeholder="Дополнительная информация: номер договора, банк, условия..."&gt;&lt;/textarea&gt;
                    &lt;/div&gt;
                    
                    &lt;button type="submit" class="btn btn-primary"&gt;Добавить кредит&lt;/button&gt;
                    &lt;button type="button" class="btn btn-secondary" onclick="document.getElementById('creditForm').reset()"&gt;Очистить&lt;/button&gt;
                &lt;/form&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Реестр кредитов и рисков&lt;/h2&gt;
                &lt;div id="creditsList"&gt;&lt;/div&gt;
            &lt;/div&gt;
        `;
        
        // Обновление списка заемщиков и поручителей
        function updateCreditSelects() {
            const borrowerSelect = document.getElementById('creditBorrower');
            const guarantorsContainer = document.getElementById('guarantorsList');
            
            if (!borrowerSelect || !guarantorsContainer) return;
            
            // Заемщик
            borrowerSelect.innerHTML = '&lt;option value=""&gt;Выберите партнера&lt;/option&gt;';
            partners.forEach(partner =&gt; {
                const option = document.createElement('option');
                option.value = partner.id;
                option.textContent = partner.name;
                borrowerSelect.appendChild(option);
            });
            
            // Поручители (чекбоксы)
            if (partners.length === 0) {
                guarantorsContainer.innerHTML = '&lt;p style="color: #6c757d; text-align: center;"&gt;Сначала добавьте участников&lt;/p&gt;';
                return;
            }
            
            guarantorsContainer.innerHTML = '';
            partners.forEach(partner =&gt; {
                const checkbox = document.createElement('label');
                checkbox.style.cssText = 'display: block; margin-bottom: 8px; cursor: pointer;';
                checkbox.innerHTML = `
                    &lt;input type="checkbox" class="guarantor-checkbox" value="${partner.id}" style="margin-right: 8px;"&gt;
                    ${escapeHtml(partner.name)}
                `;
                guarantorsContainer.appendChild(checkbox);
            });
        }
        
        // Обработчик формы добавления кредита
        document.getElementById('creditForm').addEventListener('submit', function(e) {
            e.preventDefault();
            
            const borrowerId = parseInt(document.getElementById('creditBorrower').value);
            const borrower = partners.find(p =&gt; p.id === borrowerId);
            
            if (!borrower) {
                alert('Ошибка: заемщик не найден');
                return;
            }
            
            // Собираем поручителей
            const guarantorIds = [];
            const guarantorNames = [];
            document.querySelectorAll('.guarantor-checkbox:checked').forEach(checkbox =&gt; {
                const gId = parseInt(checkbox.value);
                if (gId !== borrowerId) { // Заемщик не может быть своим поручителем
                    guarantorIds.push(gId);
                    const guarantor = partners.find(p =&gt; p.id === gId);
                    if (guarantor) {
                        guarantorNames.push(guarantor.name);
                    }
                }
            });
            
            const credit = {
                id: Date.now(),
                borrowerId: borrowerId,
                borrowerName: borrower.name,
                name: document.getElementById('creditName').value.trim(),
                amount: parseFloat(document.getElementById('creditAmount').value) || 0,
                rate: parseFloat(document.getElementById('creditRate').value) || 0,
                term: parseInt(document.getElementById('creditTerm').value) || 0,
                startDate: document.getElementById('creditStartDate').value,
                guarantorIds: guarantorIds,
                guarantorNames: guarantorNames,
                riskPremium: parseFloat(document.getElementById('riskPremium').value) || 0,
                description: document.getElementById('creditDescription').value.trim(),
                createdAt: new Date().toISOString()
            };
            
            credits.push(credit);
            saveData();
            renderCredits();
            updateDashboard();
            
            this.reset();
            updateCreditSelects();
            showToast('✅ Кредит успешно добавлен!');
        });
        
        // Отрисовка списка кредитов
        function renderCredits() {
            const container = document.getElementById('creditsList');
            
            if (!container) return;
            
            if (credits.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;Пока нет кредитов. Добавьте первый!&lt;/p&gt;';
                return;
            }
            
            let html = '';
            
            credits.forEach(credit =&gt; {
                // Расчет ежемесячного платежа (аннуитет)
                const monthlyRate = credit.rate / 100 / 12;
                const monthlyPayment = credit.amount * (monthlyRate * Math.pow(1 + monthlyRate, credit.term)) / (Math.pow(1 + monthlyRate, credit.term) - 1);
                
                // Общая переплата
                const totalPayment = monthlyPayment * credit.term;
                const overpayment = totalPayment - credit.amount;
                
                // Премия за риск для каждого поручителя в месяц
                const monthlyRiskPremiumPerGuarantor = credit.guarantorIds.length &gt; 0 
                    ? (credit.amount * (credit.riskPremium / 100) / 12) / credit.guarantorIds.length 
                    : 0;
                
                html += `&lt;div style="margin-bottom: 25px; border: 2px solid #e9ecef; border-radius: 12px; padding: 20px; background: #f8f9fa;"&gt;`;
                html += `&lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? ${escapeHtml(credit.name)}&lt;/h3&gt;`;
                
                html += '&lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 15px;"&gt;';
                html += `&lt;div&gt;&lt;strong&gt;Заемщик:&lt;/strong&gt;&lt;br&gt;&lt;span class="badge badge-danger"&gt;${escapeHtml(credit.borrowerName)}&lt;/span&gt;&lt;/div&gt;`;
                html += `&lt;div&gt;&lt;strong&gt;Сумма кредита:&lt;/strong&gt;&lt;br&gt;&lt;span style="font-size: 1.2em; color: #28a745;"&gt;${credit.amount.toLocaleString('ru-RU')} ₽&lt;/span&gt;&lt;/div&gt;`;
                html += `&lt;div&gt;&lt;strong&gt;Ставка:&lt;/strong&gt;&lt;br&gt;${credit.rate}% годовых&lt;/div&gt;`;
                html += `&lt;div&gt;&lt;strong&gt;Срок:&lt;/strong&gt;&lt;br&gt;${credit.term} мес.&lt;/div&gt;`;
                html += `&lt;div&gt;&lt;strong&gt;Дата начала:&lt;/strong&gt;&lt;br&gt;${formatDate(credit.startDate)}&lt;/div&gt;`;
                html += `&lt;div&gt;&lt;strong&gt;Ежемесячный платеж:&lt;/strong&gt;&lt;br&gt;&lt;span style="color: #dc3545;"&gt;${Math.round(monthlyPayment).toLocaleString('ru-RU')} ₽&lt;/span&gt;&lt;/div&gt;`;
                html += `&lt;div&gt;&lt;strong&gt;Общая переплата:&lt;/strong&gt;&lt;br&gt;&lt;span style="color: #dc3545;"&gt;${Math.round(overpayment).toLocaleString('ru-RU')} ₽&lt;/span&gt;&lt;/div&gt;`;
                html += '&lt;/div&gt;';
                
                // Поручители
                if (credit.guarantorIds.length &gt; 0) {
                    html += `&lt;div style="margin-top: 15px; padding: 15px; background: white; border-radius: 8px;"&gt;`;
                    html += `&lt;h4 style="color: #764ba2; margin-bottom: 10px;"&gt;⚠️ Поручители / Гаранты:&lt;/h4&gt;`;
                    html += '&lt;div style="display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 10px;"&gt;';
                    credit.guarantorNames.forEach(name =&gt; {
                        html += `&lt;span class="badge badge-warning"&gt;${escapeHtml(name)}&lt;/span&gt;`;
                    });
                    html += '&lt;/div&gt;';
                    html += `&lt;p style="color: #6c757d; font-size: 0.9em;"&gt;`;
                    html += `Премия за риск: &lt;strong&gt;${credit.riskPremium}% годовых&lt;/strong&gt;&lt;br&gt;`;
                    html += `Каждый поручитель получает: &lt;strong style="color: #28a745;"&gt;${Math.round(monthlyRiskPremiumPerGuarantor).toLocaleString('ru-RU')} ₽/мес&lt;/strong&gt;`;
                    html += `&lt;/p&gt;`;
                    html += '&lt;/div&gt;';
                } else {
                    html += `&lt;p style="margin-top: 15px; color: #6c757d;"&gt;&lt;em&gt;Поручители не указаны&lt;/em&gt;&lt;/p&gt;`;
                }
                
                if (credit.description) {
                    html += `&lt;p style="margin-top: 15px; padding: 10px; background: white; border-radius: 8px; color: #495057;"&gt;&lt;strong&gt;Примечание:&lt;/strong&gt; ${escapeHtml(credit.description)}&lt;/p&gt;`;
                }
                
                html += `&lt;div style="margin-top: 15px; text-align: right;"&gt;`;
                html += `&lt;button class="btn btn-secondary" onclick="editCredit(${credit.id})" style="padding: 8px 16px; font-size: 0.9em;"&gt;✏️ Редактировать&lt;/button&gt; `;
                html += `&lt;button class="btn btn-danger" onclick="deleteCredit(${credit.id})" style="padding: 8px 16px; font-size: 0.9em;"&gt;?️ Удалить&lt;/button&gt;`;
                html += '&lt;/div&gt;';
                
                html += '&lt;/div&gt;';
            });
            
            container.innerHTML = html;
        }
        
        // Удаление кредита
        function deleteCredit(id) {
            const credit = credits.find(c =&gt; c.id === id);
            if (!credit) return;
            
            if (confirm(`Удалить кредит "${credit.name}"?\n\nЭто действие нельзя отменить.`)) {
                credits = credits.filter(c =&gt; c.id !== id);
                saveData();
                renderCredits();
                updateDashboard();
                showToast('?️ Кредит удалён');
            }
        }
        
        // Редактирование кредита
        function editCredit(id) {
            const credit = credits.find(c =&gt; c.id === id);
            if (!credit) return;
            
            const newName = prompt('Название кредита:', credit.name);
            if (newName === null) return;
            
            const newAmount = prompt('Сумма кредита (руб):', credit.amount);
            if (newAmount === null) return;
            
            const newRate = prompt('Годовая ставка (%):', credit.rate);
            if (newRate === null) return;
            
            const newPremium = prompt('Премия за риск для поручителей (% годовых):', credit.riskPremium);
            if (newPremium === null) return;
            
            credit.name = newName.trim() || credit.name;
            credit.amount = parseFloat(newAmount) || credit.amount;
            credit.rate = parseFloat(newRate) || credit.rate;
            credit.riskPremium = parseFloat(newPremium) || credit.riskPremium;
            
            saveData();
            renderCredits();
            showToast('✅ Кредит обновлён');
        }
        
        // Обновление select при загрузке
        updateCreditSelects();
    &lt;/script&gt;
        &lt;script&gt;
        // ============================================
        // БЛОК 5: ТАЙМ-ТРЕКЕР И УЧЁТ ТРУДОЗАТРАТ
        // ============================================
        
        // Заполняем вкладку труда HTML-разметкой
        document.getElementById('time').innerHTML = `
            &lt;div class="card"&gt;
                &lt;h2&gt;⏱️ Добавить трудозатраты&lt;/h2&gt;
                &lt;form id="timeForm"&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Партнер *&lt;/label&gt;
                        &lt;select id="timePartner" required&gt;
                            &lt;option value=""&gt;Выберите партнера&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Дата *&lt;/label&gt;
                        &lt;input type="date" id="timeDate" required&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Количество часов *&lt;/label&gt;
                        &lt;input type="number" id="timeHours" required min="0.5" max="24" step="0.5" placeholder="8"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Тип деятельности *&lt;/label&gt;
                        &lt;select id="timeActivityType" required&gt;
                            &lt;option value=""&gt;Выберите тип&lt;/option&gt;
                            &lt;option value="management"&gt;? Управление / Стратегия&lt;/option&gt;
                            &lt;option value="production"&gt;? Производство / Цех&lt;/option&gt;
                            &lt;option value="sales"&gt;? Продажи / Клиенты&lt;/option&gt;
                            &lt;option value="marketing"&gt;? Маркетинг / Продвижение&lt;/option&gt;
                            &lt;option value="finance"&gt;? Финансы / Бухгалтерия&lt;/option&gt;
                            &lt;option value="development"&gt;? Разработка / IT&lt;/option&gt;
                            &lt;option value="hr"&gt;? HR / Подбор персонала&lt;/option&gt;
                            &lt;option value="legal"&gt;⚖️ Юридические вопросы&lt;/option&gt;
                            &lt;option value="meetings"&gt;? Встречи / Переговоры&lt;/option&gt;
                            &lt;option value="learning"&gt;? Обучение / Развитие&lt;/option&gt;
                            &lt;option value="other"&gt;? Прочее&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Описание задач&lt;/label&gt;
                        &lt;textarea id="timeDescription" rows="3" placeholder="Что конкретно было сделано за это время..."&gt;&lt;/textarea&gt;
                    &lt;/div&gt;
                    
                    &lt;div id="timeCostPreview" style="padding: 15px; background: #e7f3ff; border-radius: 8px; margin-bottom: 20px; display: none;"&gt;
                        &lt;strong&gt;? Стоимость этого труда:&lt;/strong&gt; &lt;span id="previewAmount"&gt;0 ₽&lt;/span&gt;
                        &lt;small style="display: block; color: #6c757d; margin-top: 5px;"&gt;Рассчитано по часовой ставке партнера&lt;/small&gt;
                    &lt;/div&gt;
                    
                    &lt;button type="submit" class="btn btn-primary"&gt;Добавить запись&lt;/button&gt;
                    &lt;button type="button" class="btn btn-secondary" onclick="document.getElementById('timeForm').reset()"&gt;Очистить&lt;/button&gt;
                &lt;/form&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Статистика трудозатрат за текущий месяц&lt;/h2&gt;
                &lt;div id="timeStats"&gt;&lt;/div&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Журнал трудозатрат&lt;/h2&gt;
                &lt;div style="margin-bottom: 15px; display: flex; gap: 10px; flex-wrap: wrap;"&gt;
                    &lt;select id="timeFilterPartner" onchange="renderTimeLogs()" style="padding: 8px; border: 2px solid #e9ecef; border-radius: 8px;"&gt;
                        &lt;option value=""&gt;Все партнеры&lt;/option&gt;
                    &lt;/select&gt;
                    &lt;select id="timeFilterMonth" onchange="renderTimeLogs()" style="padding: 8px; border: 2px solid #e9ecef; border-radius: 8px;"&gt;
                        &lt;option value=""&gt;Все месяцы&lt;/option&gt;
                    &lt;/select&gt;
                &lt;/div&gt;
                &lt;div id="timeLogsList"&gt;&lt;/div&gt;
            &lt;/div&gt;
        `;
        
        // Установка даты по умолчанию — сегодня
        document.getElementById('timeDate').valueAsDate = new Date();
        
        // Обновление списков партнеров
        function updateTimeSelects() {
            const partnerSelect = document.getElementById('timePartner');
            const filterPartner = document.getElementById('timeFilterPartner');
            
            if (!partnerSelect || !filterPartner) return;
            
            partnerSelect.innerHTML = '&lt;option value=""&gt;Выберите партнера&lt;/option&gt;';
            filterPartner.innerHTML = '&lt;option value=""&gt;Все партнеры&lt;/option&gt;';
            
            partners.forEach(partner =&gt; {
                const opt1 = document.createElement('option');
                opt1.value = partner.id;
                opt1.textContent = `${partner.name} (${partner.hourlyRate.toLocaleString('ru-RU')} ₽/ч)`;
                partnerSelect.appendChild(opt1);
                
                const opt2 = document.createElement('option');
                opt2.value = partner.id;
                opt2.textContent = partner.name;
                filterPartner.appendChild(opt2);
            });
        }
        
        // Заполнение фильтра по месяцам
        function updateTimeMonthFilter() {
            const filterMonth = document.getElementById('timeFilterMonth');
            if (!filterMonth) return;
            
            const months = new Set();
            timeLogs.forEach(log =&gt; {
                if (log.date) {
                    const d = new Date(log.date);
                    months.add(`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`);
                }
            });
            
            filterMonth.innerHTML = '&lt;option value=""&gt;Все месяцы&lt;/option&gt;';
            Array.from(months).sort().reverse().forEach(m =&gt; {
                const [y, mo] = m.split('-');
                const monthNames = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
                const opt = document.createElement('option');
                opt.value = m;
                opt.textContent = `${monthNames[parseInt(mo) - 1]} ${y}`;
                filterMonth.appendChild(opt);
            });
        }
        
        // Предпросмотр стоимости труда при изменении полей
        function updateCostPreview() {
            const partnerId = parseInt(document.getElementById('timePartner').value);
            const hours = parseFloat(document.getElementById('timeHours').value) || 0;
            const preview = document.getElementById('timeCostPreview');
            const amount = document.getElementById('previewAmount');
            
            if (!partnerId || !hours) {
                preview.style.display = 'none';
                return;
            }
            
            const partner = partners.find(p =&gt; p.id === partnerId);
            if (!partner) {
                preview.style.display = 'none';
                return;
            }
            
            const cost = hours * partner.hourlyRate;
            amount.textContent = cost.toLocaleString('ru-RU') + ' ₽';
            preview.style.display = 'block';
        }
        
        document.getElementById('timePartner').addEventListener('change', updateCostPreview);
        document.getElementById('timeHours').addEventListener('input', updateCostPreview);
        
        // Обработчик формы добавления трудозатрат
        document.getElementById('timeForm').addEventListener('submit', function(e) {
            e.preventDefault();
            
            const partnerId = parseInt(document.getElementById('timePartner').value);
            const partner = partners.find(p =&gt; p.id === partnerId);
            
            if (!partner) {
                alert('Ошибка: партнер не найден');
                return;
            }
            
            const hours = parseFloat(document.getElementById('timeHours').value) || 0;
            
            const log = {
                id: Date.now(),
                partnerId: partnerId,
                partnerName: partner.name,
                hourlyRate: partner.hourlyRate,
                date: document.getElementById('timeDate').value,
                hours: hours,
                activityType: document.getElementById('timeActivityType').value,
                description: document.getElementById('timeDescription').value.trim(),
                cost: hours * partner.hourlyRate,
                createdAt: new Date().toISOString()
            };
            
            timeLogs.push(log);
            saveData();
            renderTimeLogs();
            renderTimeStats();
            updateTimeMonthFilter();
            updateDashboard();
            
            this.reset();
            document.getElementById('timeDate').valueAsDate = new Date();
            document.getElementById('timeCostPreview').style.display = 'none';
            showToast('✅ Трудозатраты добавлены!');
        });
        
        // Справочник типов деятельности
        const activityTypeLabels = {
            'management': '? Управление',
            'production': '? Производство',
            'sales': '? Продажи',
            'marketing': '? Маркетинг',
            'finance': '? Финансы',
            'development': '? Разработка',
            'hr': '? HR',
            'legal': '⚖️ Юридическое',
            'meetings': '? Встречи',
            'learning': '? Обучение',
            'other': '? Прочее'
        };
        
        // Отрисовка журнала трудозатрат
        function renderTimeLogs() {
            const container = document.getElementById('timeLogsList');
            if (!container) return;
            
            const filterPartner = document.getElementById('timeFilterPartner').value;
            const filterMonth = document.getElementById('timeFilterMonth').value;
            
            let filtered = timeLogs.slice();
            
            if (filterPartner) {
                filtered = filtered.filter(l =&gt; l.partnerId === parseInt(filterPartner));
            }
            
            if (filterMonth) {
                const [y, m] = filterMonth.split('-').map(Number);
                filtered = filtered.filter(l =&gt; {
                    const d = new Date(l.date);
                    return d.getFullYear() === y &amp;&amp; d.getMonth() + 1 === m;
                });
            }
            
            if (filtered.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;Нет записей. Добавьте первую!&lt;/p&gt;';
                return;
            }
            
            // Сортировка по дате (новые сверху)
            filtered.sort((a, b) =&gt; new Date(b.date) - new Date(a.date));
            
            let html = '&lt;table&gt;&lt;thead&gt;&lt;tr&gt;';
            html += '&lt;th&gt;Дата&lt;/th&gt;';
            html += '&lt;th&gt;Партнер&lt;/th&gt;';
            html += '&lt;th&gt;Часы&lt;/th&gt;';
            html += '&lt;th&gt;Тип&lt;/th&gt;';
            html += '&lt;th&gt;Стоимость&lt;/th&gt;';
            html += '&lt;th&gt;Описание&lt;/th&gt;';
            html += '&lt;th&gt;Действия&lt;/th&gt;';
            html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
            
            filtered.forEach(log =&gt; {
                html += '&lt;tr&gt;';
                html += `&lt;td&gt;${formatDate(log.date)}&lt;/td&gt;`;
                html += `&lt;td&gt;&lt;strong&gt;${escapeHtml(log.partnerName)}&lt;/strong&gt;&lt;/td&gt;`;
                html += `&lt;td&gt;&lt;span class="badge badge-success"&gt;${log.hours} ч&lt;/span&gt;&lt;/td&gt;`;
                html += `&lt;td&gt;${activityTypeLabels[log.activityType] || log.activityType}&lt;/td&gt;`;
                html += `&lt;td&gt;&lt;strong style="color: #28a745;"&gt;${log.cost.toLocaleString('ru-RU')} ₽&lt;/strong&gt;&lt;/td&gt;`;
                html += `&lt;td&gt;&lt;small&gt;${escapeHtml(log.description) || '-'}&lt;/small&gt;&lt;/td&gt;`;
                html += `&lt;td&gt;
                    &lt;button class="btn btn-secondary" onclick="editTimeLog(${log.id})" style="padding: 6px 12px; font-size: 0.85em;"&gt;✏️&lt;/button&gt;
                    &lt;button class="btn btn-danger" onclick="deleteTimeLog(${log.id})" style="padding: 6px 12px; font-size: 0.85em;"&gt;?️&lt;/button&gt;
                &lt;/td&gt;`;
                html += '&lt;/tr&gt;';
            });
            
            html += '&lt;/tbody&gt;&lt;/table&gt;';
            
            // Итоги по отфильтрованным
            const totalHours = filtered.reduce((s, l) =&gt; s + l.hours, 0);
            const totalCost = filtered.reduce((s, l) =&gt; s + l.cost, 0);
            html += `&lt;div style="margin-top: 20px; padding: 15px; background: #f8f9fa; border-radius: 8px; display: flex; justify-content: space-around; flex-wrap: wrap; gap: 15px;"&gt;`;
            html += `&lt;div&gt;&lt;strong&gt;Всего записей:&lt;/strong&gt; ${filtered.length}&lt;/div&gt;`;
            html += `&lt;div&gt;&lt;strong&gt;Всего часов:&lt;/strong&gt; &lt;span style="color: #667eea;"&gt;${totalHours}&lt;/span&gt;&lt;/div&gt;`;
            html += `&lt;div&gt;&lt;strong&gt;Общая стоимость труда:&lt;/strong&gt; &lt;span style="color: #28a745;"&gt;${totalCost.toLocaleString('ru-RU')} ₽&lt;/span&gt;&lt;/div&gt;`;
            html += '&lt;/div&gt;';
            
            container.innerHTML = html;
        }
        
        // Статистика за текущий месяц
        function renderTimeStats() {
            const container = document.getElementById('timeStats');
            if (!container) return;
            
            const now = new Date();
            const currentMonth = now.getMonth();
            const currentYear = now.getFullYear();
            
            const monthLogs = timeLogs.filter(l =&gt; {
                const d = new Date(l.date);
                return d.getMonth() === currentMonth &amp;&amp; d.getFullYear() === currentYear;
            });
            
            if (monthLogs.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 20px;"&gt;В этом месяце пока нет записей&lt;/p&gt;';
                return;
            }
            
            // Группировка по партнерам
            const byPartner = {};
            monthLogs.forEach(log =&gt; {
                if (!byPartner[log.partnerId]) {
                    byPartner[log.partnerId] = {
                        name: log.partnerName,
                        hours: 0,
                        cost: 0,
                        records: 0
                    };
                }
                byPartner[log.partnerId].hours += log.hours;
                byPartner[log.partnerId].cost += log.cost;
                byPartner[log.partnerId].records += 1;
            });
            
            // Нормированный фонд: 160 часов в месяц
            const normHours = 160;
            
            let html = '&lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px;"&gt;';
            
            Object.values(byPartner).forEach(p =&gt; {
                const percent = Math.min(100, Math.round((p.hours / normHours) * 100));
                let statusColor = '#28a745';
                let statusText = '✅ Отлично';
                if (percent &lt; 50) {
                    statusColor = '#dc3545';
                    statusText = '? Критически мало';
                } else if (percent &lt; 80) {
                    statusColor = '#ffc107';
                    statusText = '⚠️ Ниже нормы';
                } else if (percent &gt;= 100) {
                    statusText = '? Сверхнорма';
                }
                
                html += `&lt;div style="border: 2px solid #e9ecef; border-radius: 12px; padding: 15px; background: white;"&gt;`;
                html += `&lt;h4 style="color: #667eea; margin-bottom: 10px;"&gt;${escapeHtml(p.name)}&lt;/h4&gt;`;
                html += `&lt;div style="margin-bottom: 10px;"&gt;`;
                html += `&lt;div style="display: flex; justify-content: space-between; margin-bottom: 5px;"&gt;`;
                html += `&lt;span&gt;Часов: &lt;strong&gt;${p.hours}&lt;/strong&gt; / ${normHours}&lt;/span&gt;`;
                html += `&lt;span style="color: ${statusColor};"&gt;&lt;strong&gt;${percent}%&lt;/strong&gt;&lt;/span&gt;`;
                html += `&lt;/div&gt;`;
                html += `&lt;div style="background: #e9ecef; border-radius: 10px; height: 10px; overflow: hidden;"&gt;`;
                html += `&lt;div style="background: ${statusColor}; height: 100%; width: ${percent}%; transition: width 0.5s;"&gt;&lt;/div&gt;`;
                html += `&lt;/div&gt;`;
                html += `&lt;/div&gt;`;
                html += `&lt;div style="font-size: 0.9em; color: #6c757d;"&gt;`;
                html += `Стоимость труда: &lt;strong style="color: #28a745;"&gt;${p.cost.toLocaleString('ru-RU')} ₽&lt;/strong&gt;&lt;br&gt;`;
                html += `Записей: ${p.records} | Статус: &lt;span style="color: ${statusColor};"&gt;${statusText}&lt;/span&gt;`;
                html += `&lt;/div&gt;`;
                html += `&lt;/div&gt;`;
            });
            
            html += '&lt;/div&gt;';
            container.innerHTML = html;
        }
        
        // Удаление записи
        function deleteTimeLog(id) {
            const log = timeLogs.find(l =&gt; l.id === id);
            if (!log) return;
            
            if (confirm(`Удалить запись от ${formatDate(log.date)} (${log.hours} ч)?`)) {
                timeLogs = timeLogs.filter(l =&gt; l.id !== id);
                saveData();
                renderTimeLogs();
                renderTimeStats();
                updateTimeMonthFilter();
                updateDashboard();
                showToast('?️ Запись удалена');
            }
        }
        
        // Редактирование записи
        function editTimeLog(id) {
            const log = timeLogs.find(l =&gt; l.id === id);
            if (!log) return;
            
            const newHours = prompt('Количество часов:', log.hours);
            if (newHours === null) return;
            
            const newDesc = prompt('Описание задач:', log.description);
            if (newDesc === null) return;
            
            log.hours = parseFloat(newHours) || log.hours;
            log.cost = log.hours * log.hourlyRate;
            log.description = newDesc.trim();
            
            saveData();
            renderTimeLogs();
            renderTimeStats();
            updateDashboard();
            showToast('✅ Запись обновлена');
        }
        
        // Инициализация
        updateTimeSelects();
        updateTimeMonthFilter();
        renderTimeLogs();
        renderTimeStats();
    &lt;/script&gt;
        &lt;script&gt;
        // ============================================
        // БЛОК 6: ДИНАМИЧЕСКАЯ ПЕРЕОЦЕНКА АКТИВОВ
        // ============================================
        
        // Заполняем вкладку переоценки HTML-разметкой
        document.getElementById('valuation').innerHTML = `
            &lt;div class="card"&gt;
                &lt;h2&gt;? Зафиксировать переоценку актива&lt;/h2&gt;
                &lt;p style="color: #6c757d; margin-bottom: 20px;"&gt;
                    Активы меняют стоимость: недвижимость дорожает, оборудование изнашивается, бренд растёт. 
                    Фиксируйте изменения, чтобы распределение прибыли оставалось справедливым.
                &lt;/p&gt;
                &lt;form id="valuationForm"&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Выберите актив для переоценки *&lt;/label&gt;
                        &lt;select id="valuationAsset" required onchange="updateValuationPreview()"&gt;
                            &lt;option value=""&gt;Выберите актив&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    
                    &lt;div id="valuationCurrentInfo" style="padding: 15px; background: #f8f9fa; border-radius: 8px; margin-bottom: 20px; display: none;"&gt;
                        &lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"&gt;
                            &lt;div&gt;&lt;strong&gt;Текущая стоимость:&lt;/strong&gt;&lt;br&gt;&lt;span id="valCurrent" style="color: #667eea; font-size: 1.2em;"&gt;0 ₽&lt;/span&gt;&lt;/div&gt;
                            &lt;div&gt;&lt;strong&gt;Партнер:&lt;/strong&gt;&lt;br&gt;&lt;span id="valPartner"&gt;-&lt;/span&gt;&lt;/div&gt;
                            &lt;div&gt;&lt;strong&gt;Тип:&lt;/strong&gt;&lt;br&gt;&lt;span id="valType"&gt;-&lt;/span&gt;&lt;/div&gt;
                            &lt;div&gt;&lt;strong&gt;Последняя переоценка:&lt;/strong&gt;&lt;br&gt;&lt;span id="valLast"&gt;-&lt;/span&gt;&lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Новая стоимость (руб) *&lt;/label&gt;
                        &lt;input type="number" id="valuationNewValue" required min="0" step="100" placeholder="1500000" oninput="updateValuationDelta()"&gt;
                    &lt;/div&gt;
                    
                    &lt;div id="valuationDelta" style="padding: 15px; border-radius: 8px; margin-bottom: 20px; display: none;"&gt;
                        &lt;strong&gt;Изменение стоимости:&lt;/strong&gt; &lt;span id="deltaAmount"&gt;0 ₽&lt;/span&gt;
                        (&lt;span id="deltaPercent"&gt;0%&lt;/span&gt;)
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Дата переоценки *&lt;/label&gt;
                        &lt;input type="date" id="valuationDate" required&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Причина переоценки *&lt;/label&gt;
                        &lt;select id="valuationReason" required&gt;
                            &lt;option value=""&gt;Выберите причину&lt;/option&gt;
                            &lt;option value="market"&gt;? Рыночная конъюнктура (цены выросли/упали)&lt;/option&gt;
                            &lt;option value="appraisal"&gt;? Независимая оценка&lt;/option&gt;
                            &lt;option value="wear"&gt;? Износ / амортизация&lt;/option&gt;
                            &lt;option value="upgrade"&gt;⚡ Модернизация / улучшение&lt;/option&gt;
                            &lt;option value="brand"&gt;? Рост бренда / репутации&lt;/option&gt;
                            &lt;option value="agreement"&gt;? Договорённость партнеров&lt;/option&gt;
                            &lt;option value="other"&gt;? Другое&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Обоснование / Комментарий&lt;/label&gt;
                        &lt;textarea id="valuationComment" rows="3" placeholder="Почему изменилась стоимость? Ссылки на отчёты, рыночные данные..."&gt;&lt;/textarea&gt;
                    &lt;/div&gt;
                    
                    &lt;button type="submit" class="btn btn-primary"&gt;Зафиксировать переоценку&lt;/button&gt;
                    &lt;button type="button" class="btn btn-secondary" onclick="document.getElementById('valuationForm').reset(); document.getElementById('valuationCurrentInfo').style.display='none'; document.getElementById('valuationDelta').style.display='none';"&gt;Очистить&lt;/button&gt;
                &lt;/form&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Общая динамика стоимости активов&lt;/h2&gt;
                &lt;div id="valuationSummary"&gt;&lt;/div&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Журнал переоценок&lt;/h2&gt;
                &lt;div style="margin-bottom: 15px; display: flex; gap: 10px; flex-wrap: wrap;"&gt;
                    &lt;select id="valuationFilterPartner" onchange="renderValuations()" style="padding: 8px; border: 2px solid #e9ecef; border-radius: 8px;"&gt;
                        &lt;option value=""&gt;Все партнеры&lt;/option&gt;
                    &lt;/select&gt;
                    &lt;select id="valuationFilterType" onchange="renderValuations()" style="padding: 8px; border: 2px solid #e9ecef; border-radius: 8px;"&gt;
                        &lt;option value=""&gt;Все типы&lt;/option&gt;
                    &lt;/select&gt;
                &lt;/div&gt;
                &lt;div id="valuationsList"&gt;&lt;/div&gt;
            &lt;/div&gt;
        `;
        
        // Установка даты по умолчанию — сегодня
        document.getElementById('valuationDate').valueAsDate = new Date();
        
        // Справочник причин переоценки
        const valuationReasonLabels = {
            'market': '? Рыночная конъюнктура',
            'appraisal': '? Независимая оценка',
            'wear': '? Износ / амортизация',
            'upgrade': '⚡ Модернизация',
            'brand': '? Рост бренда',
            'agreement': '? Договорённость партнеров',
            'other': '? Другое'
        };
        
        // Заполнение списка активов для переоценки
        function updateValuationAssetSelect() {
            const select = document.getElementById('valuationAsset');
            if (!select) return;
            
            select.innerHTML = '&lt;option value=""&gt;Выберите актив&lt;/option&gt;';
            
            if (assets.length === 0) {
                select.innerHTML = '&lt;option value=""&gt;Сначала добавьте активы&lt;/option&gt;';
                return;
            }
            
            assets.forEach(asset =&gt; {
                const currentVal = getCurrentAssetValue(asset.id);
                const opt = document.createElement('option');
                opt.value = asset.id;
                opt.textContent = `${asset.name} (${asset.partnerName}) — ${currentVal.toLocaleString('ru-RU')} ₽`;
                select.appendChild(opt);
            });
        }
        
        // Получение текущей стоимости актива (с учётом переоценок)
        function getCurrentAssetValue(assetId) {
            const asset = assets.find(a =&gt; a.id === assetId);
            if (!asset) return 0;
            
            const assetValuations = valuations
                .filter(v =&gt; v.assetId === assetId)
                .sort((a, b) =&gt; new Date(b.date) - new Date(a.date));
            
            if (assetValuations.length === 0) return asset.value;
            return assetValuations[0].newValue;
        }
        
        // Предпросмотр информации об активе
        function updateValuationPreview() {
            const assetId = parseInt(document.getElementById('valuationAsset').value);
            const infoBlock = document.getElementById('valuationCurrentInfo');
            
            if (!assetId) {
                infoBlock.style.display = 'none';
                return;
            }
            
            const asset = assets.find(a =&gt; a.id === assetId);
            if (!asset) {
                infoBlock.style.display = 'none';
                return;
            }
            
            const currentValue = getCurrentAssetValue(assetId);
            const assetValuations = valuations
                .filter(v =&gt; v.assetId === assetId)
                .sort((a, b) =&gt; new Date(b.date) - new Date(a.date));
            
            document.getElementById('valCurrent').textContent = currentValue.toLocaleString('ru-RU') + ' ₽';
            document.getElementById('valPartner').textContent = asset.partnerName;
            document.getElementById('valType').textContent = assetTypeLabels[asset.type] || asset.type;
            document.getElementById('valLast').textContent = assetValuations.length &gt; 0 
                ? formatDate(assetValuations[0].date) 
                : 'Не было переоценок';
            
            infoBlock.style.display = 'block';
            updateValuationDelta();
        }
        
        // Расчет дельты при вводе новой стоимости
        function updateValuationDelta() {
            const assetId = parseInt(document.getElementById('valuationAsset').value);
            const newValue = parseFloat(document.getElementById('valuationNewValue').value);
            const deltaBlock = document.getElementById('valuationDelta');
            
            if (!assetId || !newValue) {
                deltaBlock.style.display = 'none';
                return;
            }
            
            const currentValue = getCurrentAssetValue(assetId);
            const delta = newValue - currentValue;
            const percent = currentValue &gt; 0 ? (delta / currentValue) * 100 : 0;
            
            const deltaAmount = document.getElementById('deltaAmount');
            const deltaPercent = document.getElementById('deltaPercent');
            
            deltaAmount.textContent = (delta &gt;= 0 ? '+' : '') + delta.toLocaleString('ru-RU') + ' ₽';
            deltaPercent.textContent = (percent &gt;= 0 ? '+' : '') + percent.toFixed(2) + '%';
            
            if (delta &gt; 0) {
                deltaBlock.style.background = '#d4edda';
                deltaBlock.style.color = '#155724';
            } else if (delta &lt; 0) {
                deltaBlock.style.background = '#f8d7da';
                deltaBlock.style.color = '#721c24';
            } else {
                deltaBlock.style.background = '#e9ecef';
                deltaBlock.style.color = '#495057';
            }
            
            deltaBlock.style.display = 'block';
        }
        
        // Обработчик формы переоценки
        document.getElementById('valuationForm').addEventListener('submit', function(e) {
            e.preventDefault();
            
            const assetId = parseInt(document.getElementById('valuationAsset').value);
            const asset = assets.find(a =&gt; a.id === assetId);
            
            if (!asset) {
                alert('Ошибка: актив не найден');
                return;
            }
            
            const newValue = parseFloat(document.getElementById('valuationNewValue').value);
            const currentValue = getCurrentAssetValue(assetId);
            
            const valuation = {
                id: Date.now(),
                assetId: assetId,
                assetName: asset.name,
                partnerId: asset.partnerId,
                partnerName: asset.partnerName,
                assetType: asset.type,
                oldValue: currentValue,
                newValue: newValue,
                delta: newValue - currentValue,
                deltaPercent: currentValue &gt; 0 ? ((newValue - currentValue) / currentValue) * 100 : 0,
                date: document.getElementById('valuationDate').value,
                reason: document.getElementById('valuationReason').value,
                comment: document.getElementById('valuationComment').value.trim(),
                createdAt: new Date().toISOString()
            };
            
            valuations.push(valuation);
            saveData();
            renderValuations();
            renderValuationSummary();
            updateValuationAssetSelect();
            updateDashboard();
            
            this.reset();
            document.getElementById('valuationDate').valueAsDate = new Date();
            document.getElementById('valuationCurrentInfo').style.display = 'none';
            document.getElementById('valuationDelta').style.display = 'none';
            
            showToast('✅ Переоценка зафиксирована!');
        });
        
        // Заполнение фильтров
        function updateValuationFilters() {
            const filterPartner = document.getElementById('valuationFilterPartner');
            const filterType = document.getElementById('valuationFilterType');
            
            if (!filterPartner || !filterType) return;
            
            // Партнеры
            const partnerIds = new Set();
            valuations.forEach(v =&gt; partnerIds.add(v.partnerId));
            filterPartner.innerHTML = '&lt;option value=""&gt;Все партнеры&lt;/option&gt;';
            Array.from(partnerIds).forEach(pid =&gt; {
                const partner = partners.find(p =&gt; p.id === pid);
                if (partner) {
                    const opt = document.createElement('option');
                    opt.value = pid;
                    opt.textContent = partner.name;
                    filterPartner.appendChild(opt);
                }
            });
            
            // Типы
            const types = new Set();
            valuations.forEach(v =&gt; types.add(v.assetType));
            filterType.innerHTML = '&lt;option value=""&gt;Все типы&lt;/option&gt;';
            Array.from(types).forEach(t =&gt; {
                const opt = document.createElement('option');
                opt.value = t;
                opt.textContent = assetTypeLabels[t] || t;
                filterType.appendChild(opt);
            });
        }
        
        // Отрисовка журнала переоценок
        function renderValuations() {
            const container = document.getElementById('valuationsList');
            if (!container) return;
            
            const filterPartner = document.getElementById('valuationFilterPartner').value;
            const filterType = document.getElementById('valuationFilterType').value;
            
            let filtered = valuations.slice();
            
            if (filterPartner) {
                filtered = filtered.filter(v =&gt; v.partnerId === parseInt(filterPartner));
            }
            if (filterType) {
                filtered = filtered.filter(v =&gt; v.assetType === filterType);
            }
            
            if (filtered.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;Нет записей о переоценках&lt;/p&gt;';
                return;
            }
            
            // Сортировка по дате (новые сверху)
            filtered.sort((a, b) =&gt; new Date(b.date) - new Date(a.date));
            
            let html = '&lt;table&gt;&lt;thead&gt;&lt;tr&gt;';
            html += '&lt;th&gt;Дата&lt;/th&gt;';
            html += '&lt;th&gt;Актив&lt;/th&gt;';
            html += '&lt;th&gt;Партнер&lt;/th&gt;';
            html += '&lt;th&gt;Было&lt;/th&gt;';
            html += '&lt;th&gt;Стало&lt;/th&gt;';
            html += '&lt;th&gt;Изменение&lt;/th&gt;';
            html += '&lt;th&gt;Причина&lt;/th&gt;';
            html += '&lt;th&gt;Действия&lt;/th&gt;';
            html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
            
            filtered.forEach(v =&gt; {
                const deltaColor = v.delta &gt; 0 ? '#28a745' : v.delta &lt; 0 ? '#dc3545' : '#6c757d';
                const deltaSign = v.delta &gt; 0 ? '+' : '';
                
                html += '&lt;tr&gt;';
                html += `&lt;td&gt;${formatDate(v.date)}&lt;/td&gt;`;
                html += `&lt;td&gt;&lt;strong&gt;${escapeHtml(v.assetName)}&lt;/strong&gt;&lt;br&gt;&lt;small style="color: #6c757d;"&gt;${escapeHtml(v.comment) || ''}&lt;/small&gt;&lt;/td&gt;`;
                html += `&lt;td&gt;${escapeHtml(v.partnerName)}&lt;/td&gt;`;
                html += `&lt;td&gt;${v.oldValue.toLocaleString('ru-RU')} ₽&lt;/td&gt;`;
                html += `&lt;td&gt;&lt;strong&gt;${v.newValue.toLocaleString('ru-RU')} ₽&lt;/strong&gt;&lt;/td&gt;`;
                html += `&lt;td style="color: ${deltaColor}; font-weight: 600;"&gt;
                    ${deltaSign}${v.delta.toLocaleString('ru-RU')} ₽&lt;br&gt;
                    &lt;small&gt;(${deltaSign}${v.deltaPercent.toFixed(2)}%)&lt;/small&gt;
                &lt;/td&gt;`;
                html += `&lt;td&gt;&lt;span class="badge badge-warning"&gt;${valuationReasonLabels[v.reason] || v.reason}&lt;/span&gt;&lt;/td&gt;`;
                html += `&lt;td&gt;
                    &lt;button class="btn btn-danger" onclick="deleteValuation(${v.id})" style="padding: 6px 12px; font-size: 0.85em;"&gt;?️&lt;/button&gt;
                &lt;/td&gt;`;
                html += '&lt;/tr&gt;';
            });
            
            html += '&lt;/tbody&gt;&lt;/table&gt;';
            container.innerHTML = html;
        }
        
        // Сводка по переоценкам
        function renderValuationSummary() {
            const container = document.getElementById('valuationSummary');
            if (!container) return;
            
            if (valuations.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 20px;"&gt;Переоценки ещё не проводились&lt;/p&gt;';
                return;
            }
            
            // Общая динамика по партнерам
            const byPartner = {};
            valuations.forEach(v =&gt; {
                if (!byPartner[v.partnerId]) {
                    byPartner[v.partnerId] = {
                        name: v.partnerName,
                        totalDelta: 0,
                        upCount: 0,
                        downCount: 0
                    };
                }
                byPartner[v.partnerId].totalDelta += v.delta;
                if (v.delta &gt; 0) byPartner[v.partnerId].upCount++;
                else if (v.delta &lt; 0) byPartner[v.partnerId].downCount++;
            });
            
            // Общая сумма изменений
            const totalDelta = valuations.reduce((s, v) =&gt; s + v.delta, 0);
            const upCount = valuations.filter(v =&gt; v.delta &gt; 0).length;
            const downCount = valuations.filter(v =&gt; v.delta &lt; 0).length;
            
            let html = '&lt;div class="stats-grid"&gt;';
            html += `&lt;div class="stat-card" style="background: ${totalDelta &gt;= 0 ? 'linear-gradient(135deg, #28a745 0%, #20c997 100%)' : 'linear-gradient(135deg, #dc3545 0%, #c82333 100%)'};"&gt;
                &lt;h3&gt;${totalDelta &gt;= 0 ? '+' : ''}${totalDelta.toLocaleString('ru-RU')} ₽&lt;/h3&gt;
                &lt;p&gt;Суммарное изменение стоимости&lt;/p&gt;
            &lt;/div&gt;`;
            html += `&lt;div class="stat-card" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);"&gt;
                &lt;h3&gt;${valuations.length}&lt;/h3&gt;
                &lt;p&gt;Всего переоценок&lt;/p&gt;
            &lt;/div&gt;`;
            html += `&lt;div class="stat-card" style="background: linear-gradient(135deg, #28a745 0%, #20c997 100%);"&gt;
                &lt;h3&gt;${upCount}&lt;/h3&gt;
                &lt;p&gt;Рост стоимости&lt;/p&gt;
            &lt;/div&gt;`;
            html += `&lt;div class="stat-card" style="background: linear-gradient(135deg, #dc3545 0%, #c82333 100%);"&gt;
                &lt;h3&gt;${downCount}&lt;/h3&gt;
                &lt;p&gt;Снижение стоимости&lt;/p&gt;
            &lt;/div&gt;`;
            html += '&lt;/div&gt;';
            
            // Детализация по партнерам
            html += '&lt;h3 style="color: #667eea; margin: 20px 0 15px;"&gt;? Динамика по партнерам&lt;/h3&gt;';
            html += '&lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px;"&gt;';
            
            Object.values(byPartner).forEach(p =&gt; {
                const color = p.totalDelta &gt;= 0 ? '#28a745' : '#dc3545';
                const sign = p.totalDelta &gt;= 0 ? '+' : '';
                
                html += `&lt;div style="border: 2px solid #e9ecef; border-radius: 12px; padding: 15px; background: white;"&gt;`;
                html += `&lt;h4 style="color: #667eea; margin-bottom: 10px;"&gt;${escapeHtml(p.name)}&lt;/h4&gt;`;
                html += `&lt;div style="font-size: 1.3em; color: ${color}; font-weight: 600; margin-bottom: 10px;"&gt;
                    ${sign}${p.totalDelta.toLocaleString('ru-RU')} ₽
                &lt;/div&gt;`;
                html += `&lt;div style="font-size: 0.9em; color: #6c757d;"&gt;
                    ? Рост: ${p.upCount} | ? Снижение: ${p.downCount}
                &lt;/div&gt;`;
                html += `&lt;/div&gt;`;
            });
            
            html += '&lt;/div&gt;';
            container.innerHTML = html;
        }
        
        // Удаление записи переоценки
        function deleteValuation(id) {
            const v = valuations.find(val =&gt; val.id === id);
            if (!v) return;
            
            if (confirm(`Удалить запись о переоценке актива "${v.assetName}" от ${formatDate(v.date)}?\n\nЭто действие нельзя отменить.`)) {
                valuations = valuations.filter(val =&gt; val.id !== id);
                saveData();
                renderValuations();
                renderValuationSummary();
                updateValuationAssetSelect();
                updateDashboard();
                showToast('?️ Запись удалена');
            }
        }
        
        // Инициализация
        updateValuationAssetSelect();
        updateValuationFilters();
        renderValuations();
        renderValuationSummary();
    &lt;/script&gt;
        &lt;script&gt;
        // ============================================
        // БЛОК 7: КАЛЬКУЛЯТОР РАСПРЕДЕЛЕНИЯ ПРИБЫЛИ
        // ============================================
        
        // Заполняем вкладку прибыли HTML-разметкой
        document.getElementById('profit').innerHTML = `
            &lt;div class="card"&gt;
                &lt;h2&gt;? Калькулятор распределения прибыли&lt;/h2&gt;
                &lt;p style="color: #6c757d; margin-bottom: 20px;"&gt;
                    Введите чистую прибыль за период и настройте коэффициенты распределения. 
                    Система автоматически рассчитает доли каждого партнёра по трёхуровневой модели.
                &lt;/p&gt;
                
                &lt;form id="profitForm"&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Период (месяц/квартал) *&lt;/label&gt;
                        &lt;input type="month" id="profitPeriod" required&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Чистая прибыль за период (руб) *&lt;/label&gt;
                        &lt;input type="number" id="profitAmount" required min="0" step="1000" placeholder="500000" oninput="calculateProfitDistribution()"&gt;
                    &lt;/div&gt;
                    
                    &lt;div style="background: #e7f3ff; border-radius: 12px; padding: 20px; margin-bottom: 20px;"&gt;
                        &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;⚙️ Настройки распределения&lt;/h3&gt;
                        
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Уровень 1: Фонд развития и подушка безопасности (%)&lt;/label&gt;
                            &lt;input type="number" id="devFundPercent" min="0" max="100" step="5" value="20" oninput="calculateProfitDistribution()"&gt;
                            &lt;small style="color: #6c757d;"&gt;Рекомендуется: 15-30%. Эти деньги идут на развитие бизнеса.&lt;/small&gt;
                        &lt;/div&gt;
                        
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Уровень 2: Премии за риски и кредиты (%)&lt;/label&gt;
                            &lt;input type="number" id="riskPremiumPercent" min="0" max="50" step="5" value="15" oninput="calculateProfitDistribution()"&gt;
                            &lt;small style="color: #6c757d;"&gt;Рекомендуется: 10-20%. Выплаты заёмщикам и поручителям за риск.&lt;/small&gt;
                        &lt;/div&gt;
                        
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Уровень 3: Остаток делится между Капиталом и Трудом&lt;/label&gt;
                            &lt;div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"&gt;
                                &lt;div&gt;
                                    &lt;label style="font-size: 0.9em;"&gt;Доля Капитала (%)&lt;/label&gt;
                                    &lt;input type="number" id="capitalPercent" min="0" max="100" step="5" value="50" oninput="syncCapitalLabor(); calculateProfitDistribution();"&gt;
                                &lt;/div&gt;
                                &lt;div&gt;
                                    &lt;label style="font-size: 0.9em;"&gt;Доля Труда (%)&lt;/label&gt;
                                    &lt;input type="number" id="laborPercent" min="0" max="100" step="5" value="50" oninput="syncCapitalLabor(); calculateProfitDistribution();"&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                            &lt;small style="color: #6c757d;"&gt;Капитал — пропорционально вложенным активам. Труд — пропорционально отработанным часам.&lt;/small&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                    
                    &lt;button type="button" class="btn btn-primary" onclick="calculateProfitDistribution()"&gt;? Рассчитать распределение&lt;/button&gt;
                    &lt;button type="button" class="btn btn-success" onclick="saveProfitCalculation()"&gt;? Сохранить расчёт&lt;/button&gt;
                &lt;/form&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Результат распределения&lt;/h2&gt;
                &lt;div id="profitDistributionResult"&gt;&lt;/div&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? История расчётов&lt;/h2&gt;
                &lt;div id="profitHistory"&gt;&lt;/div&gt;
            &lt;/div&gt;
        `;
        
        // Установка текущего месяца по умолчанию
        const now = new Date();
        document.getElementById('profitPeriod').value = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`;
        
        // Синхронизация долей капитала и труда (сумма должна быть 100%)
        function syncCapitalLabor() {
            const capitalInput = document.getElementById('capitalPercent');
            const laborInput = document.getElementById('laborPercent');
            
            const capital = parseFloat(capitalInput.value) || 0;
            const labor = parseFloat(laborInput.value) || 0;
            
            if (capital + labor !== 100) {
                // Автоматически корректируем труд
                laborInput.value = 100 - capital;
            }
        }
        
        // Основная функция расчёта распределения прибыли
        function calculateProfitDistribution() {
            const container = document.getElementById('profitDistributionResult');
            if (!container) return;
            
            const profitAmount = parseFloat(document.getElementById('profitAmount').value) || 0;
            
            if (profitAmount &lt;= 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;Введите сумму прибыли для расчёта&lt;/p&gt;';
                return;
            }
            
            if (partners.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #dc3545; padding: 40px;"&gt;⚠️ Сначала добавьте участников&lt;/p&gt;';
                return;
            }
            
            const devFundPercent = parseFloat(document.getElementById('devFundPercent').value) || 0;
            const riskPremiumPercent = parseFloat(document.getElementById('riskPremiumPercent').value) || 0;
            const capitalPercent = parseFloat(document.getElementById('capitalPercent').value) || 0;
            const laborPercent = parseFloat(document.getElementById('laborPercent').value) || 0;
            
            // Уровень 1: Фонд развития
            const devFund = profitAmount * (devFundPercent / 100);
            const afterDevFund = profitAmount - devFund;
            
            // Уровень 2: Премии за риски
            const riskPremiumTotal = profitAmount * (riskPremiumPercent / 100);
            const afterRiskPremium = afterDevFund - riskPremiumTotal;
            
            // Уровень 3: Разделение на капитал и труд
            const capitalPool = afterRiskPremium * (capitalPercent / 100);
            const laborPool = afterRiskPremium * (laborPercent / 100);
            
            // Расчёт долей капитала (по текущей стоимости активов)
            const partnerCapitalShares = {};
            let totalCapital = 0;
            
            partners.forEach(partner =&gt; {
                const partnerAssets = assets.filter(a =&gt; a.partnerId === partner.id);
                let partnerCapital = 0;
                
                partnerAssets.forEach(asset =&gt; {
                    partnerCapital += getCurrentAssetValue(asset.id);
                });
                
                partnerCapitalShares[partner.id] = {
                    name: partner.name,
                    capital: partnerCapital,
                    share: 0,
                    capitalIncome: 0
                };
                
                totalCapital += partnerCapital;
            });
            
            // Нормализация долей капитала
            if (totalCapital &gt; 0) {
                Object.values(partnerCapitalShares).forEach(p =&gt; {
                    p.share = (p.capital / totalCapital) * 100;
                    p.capitalIncome = capitalPool * (p.share / 100);
                });
            }
            
            // Расчёт долей труда (по часам за период)
            const period = document.getElementById('profitPeriod').value;
            const [year, month] = period.split('-').map(Number);
            
            const partnerLaborShares = {};
            let totalLaborCost = 0;
            
            partners.forEach(partner =&gt; {
                const periodLogs = timeLogs.filter(log =&gt; {
                    const d = new Date(log.date);
                    return d.getFullYear() === year &amp;&amp; d.getMonth() + 1 === month &amp;&amp; log.partnerId === partner.id;
                });
                
                const totalHours = periodLogs.reduce((s, l) =&gt; s + l.hours, 0);
                const laborCost = totalHours * partner.hourlyRate;
                
                partnerLaborShares[partner.id] = {
                    name: partner.name,
                    hours: totalHours,
                    laborCost: laborCost,
                    share: 0,
                    laborIncome: 0
                };
                
                totalLaborCost += laborCost;
            });
            
            // Нормализация долей труда
            if (totalLaborCost &gt; 0) {
                Object.values(partnerLaborShares).forEach(p =&gt; {
                    p.share = (p.laborCost / totalLaborCost) * 100;
                    p.laborIncome = laborPool * (p.share / 100);
                });
            }
            
            // Расчёт премий за риски (поручительства)
            const partnerRiskPremiums = {};
            let totalRiskWeight = 0;
            
            credits.forEach(credit =&gt; {
                if (credit.guarantorIds.length &gt; 0) {
                    const premiumPerGuarantor = riskPremiumTotal / credit.guarantorIds.length;
                    
                    credit.guarantorIds.forEach(gId =&gt; {
                        if (!partnerRiskPremiums[gId]) {
                            const guarantor = partners.find(p =&gt; p.id === gId);
                            partnerRiskPremiums[gId] = {
                                name: guarantor ? guarantor.name : 'Неизвестный',
                                premium: 0,
                                credits: []
                            };
                        }
                        partnerRiskPremiums[gId].premium += premiumPerGuarantor;
                        partnerRiskPremiums[gId].credits.push(credit.name);
                        totalRiskWeight += premiumPerGuarantor;
                    });
                }
            });
            
            // Итоговый расчёт для каждого партнёра
            const partnerTotals = {};
            partners.forEach(partner =&gt; {
                partnerTotals[partner.id] = {
                    name: partner.name,
                    capitalIncome: partnerCapitalShares[partner.id]?.capitalIncome || 0,
                    laborIncome: partnerLaborShares[partner.id]?.laborIncome || 0,
                    riskPremium: partnerRiskPremiums[partner.id]?.premium || 0,
                    total: 0
                };
                
                partnerTotals[partner.id].total = 
                    partnerTotals[partner.id].capitalIncome + 
                    partnerTotals[partner.id].laborIncome + 
                    partnerTotals[partner.id].riskPremium;
            });
            
            // Отрисовка результата
            let html = '&lt;div style="background: #f8f9fa; border-radius: 12px; padding: 20px; margin-bottom: 20px;"&gt;';
            html += '&lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? Структура распределения&lt;/h3&gt;';
            html += '&lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"&gt;';
            html += `&lt;div style="background: white; padding: 15px; border-radius: 8px; text-align: center;"&gt;
                &lt;div style="font-size: 0.9em; color: #6c757d;"&gt;Чистая прибыль&lt;/div&gt;
                &lt;div style="font-size: 1.5em; font-weight: 600; color: #28a745;"&gt;${profitAmount.toLocaleString('ru-RU')} ₽&lt;/div&gt;
            &lt;/div&gt;`;
            html += `&lt;div style="background: white; padding: 15px; border-radius: 8px; text-align: center;"&gt;
                &lt;div style="font-size: 0.9em; color: #6c757d;"&gt;Фонд развития (${devFundPercent}%)&lt;/div&gt;
                &lt;div style="font-size: 1.5em; font-weight: 600; color: #667eea;"&gt;${Math.round(devFund).toLocaleString('ru-RU')} ₽&lt;/div&gt;
            &lt;/div&gt;`;
            html += `&lt;div style="background: white; padding: 15px; border-radius: 8px; text-align: center;"&gt;
                &lt;div style="font-size: 0.9em; color: #6c757d;"&gt;Премии за риски (${riskPremiumPercent}%)&lt;/div&gt;
                &lt;div style="font-size: 1.5em; font-weight: 600; color: #ffc107;"&gt;${Math.round(riskPremiumTotal).toLocaleString('ru-RU')} ₽&lt;/div&gt;
            &lt;/div&gt;`;
            html += `&lt;div style="background: white; padding: 15px; border-radius: 8px; text-align: center;"&gt;
                &lt;div style="font-size: 0.9em; color: #6c757d;"&gt;Остаток для распределения&lt;/div&gt;
                &lt;div style="font-size: 1.5em; font-weight: 600; color: #764ba2;"&gt;${Math.round(afterRiskPremium).toLocaleString('ru-RU')} ₽&lt;/div&gt;
            &lt;/div&gt;`;
            html += '&lt;/div&gt;&lt;/div&gt;';
            
            // Детализация по партнёрам
            html += '&lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? Доли партнёров&lt;/h3&gt;';
            html += '&lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 20px;"&gt;';
            
            Object.values(partnerTotals).forEach(p =&gt; {
                const totalPercent = profitAmount &gt; 0 ? (p.total / profitAmount) * 100 : 0;
                
                html += `&lt;div style="border: 2px solid #e9ecef; border-radius: 12px; padding: 20px; background: white;"&gt;`;
                html += `&lt;h4 style="color: #667eea; margin-bottom: 15px;"&gt;? ${escapeHtml(p.name)}&lt;/h4&gt;`;
                
                html += `&lt;div style="font-size: 2em; font-weight: 600; color: #28a745; margin-bottom: 15px; text-align: center;"&gt;
                    ${Math.round(p.total).toLocaleString('ru-RU')} ₽
                &lt;/div&gt;`;
                
                html += `&lt;div style="font-size: 0.9em; color: #6c757d; text-align: center; margin-bottom: 15px;"&gt;
                    ${totalPercent.toFixed(2)}% от прибыли
                &lt;/div&gt;`;
                
                html += '&lt;div style="border-top: 1px solid #e9ecef; padding-top: 15px;"&gt;';
                
                if (p.capitalIncome &gt; 0) {
                    const capitalShare = partnerCapitalShares[partners.findIndex(partner =&gt; partner.name === p.name)]?.share || 0;
                    html += `&lt;div style="margin-bottom: 10px;"&gt;
                        &lt;div style="display: flex; justify-content: space-between; margin-bottom: 5px;"&gt;
                            &lt;span&gt;? Капитал (${capitalShare.toFixed(1)}%)&lt;/span&gt;
                            &lt;strong style="color: #667eea;"&gt;${Math.round(p.capitalIncome).toLocaleString('ru-RU')} ₽&lt;/strong&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;`;
                }
                
                if (p.laborIncome &gt; 0) {
                    const laborData = partnerLaborShares[partners.findIndex(partner =&gt; partner.name === p.name)];
                    const laborShare = laborData?.share || 0;
                    const hours = laborData?.hours || 0;
                    html += `&lt;div style="margin-bottom: 10px;"&gt;
                        &lt;div style="display: flex; justify-content: space-between; margin-bottom: 5px;"&gt;
                            &lt;span&gt;⏱️ Труд (${hours}ч, ${laborShare.toFixed(1)}%)&lt;/span&gt;
                            &lt;strong style="color: #764ba2;"&gt;${Math.round(p.laborIncome).toLocaleString('ru-RU')} ₽&lt;/strong&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;`;
                }
                
                if (p.riskPremium &gt; 0) {
                    const riskData = partnerRiskPremiums[partners.findIndex(partner =&gt; partner.name === p.name)];
                    html += `&lt;div style="margin-bottom: 10px;"&gt;
                        &lt;div style="display: flex; justify-content: space-between; margin-bottom: 5px;"&gt;
                            &lt;span&gt;⚠️ Премия за риск&lt;/span&gt;
                            &lt;strong style="color: #ffc107;"&gt;${Math.round(p.riskPremium).toLocaleString('ru-RU')} ₽&lt;/strong&gt;
                        &lt;/div&gt;
                        &lt;small style="color: #6c757d;"&gt;Поручитель по: ${riskData?.credits.join(', ') || '-'}&lt;/small&gt;
                    &lt;/div&gt;`;
                }
                
                html += '&lt;/div&gt;&lt;/div&gt;';
            });
            
            html += '&lt;/div&gt;';
            
            // Проверка баланса
            const distributedTotal = Object.values(partnerTotals).reduce((s, p) =&gt; s + p.total, 0);
            const undistributed = profitAmount - devFund - distributedTotal;
            
            if (Math.abs(undistributed) &gt; 1) {
                html += `&lt;div style="margin-top: 20px; padding: 15px; background: #fff3cd; border-radius: 8px; color: #856404;"&gt;
                    ⚠️ Внимание: Нераспределённый остаток: ${Math.round(undistributed).toLocaleString('ru-RU')} ₽
                &lt;/div&gt;`;
            }
            
            container.innerHTML = html;
        }
        
        // Сохранение расчёта
        function saveProfitCalculation() {
            const profitAmount = parseFloat(document.getElementById('profitAmount').value) || 0;
            
            if (profitAmount &lt;= 0) {
                alert('Введите сумму прибыли');
                return;
            }
            
            const period = document.getElementById('profitPeriod').value;
            const devFundPercent = parseFloat(document.getElementById('devFundPercent').value) || 0;
            const riskPremiumPercent = parseFloat(document.getElementById('riskPremiumPercent').value) || 0;
            const capitalPercent = parseFloat(document.getElementById('capitalPercent').value) || 0;
            const laborPercent = parseFloat(document.getElementById('laborPercent').value) || 0;
            
            const calculation = {
                id: Date.now(),
                period: period,
                profitAmount: profitAmount,
                devFundPercent: devFundPercent,
                riskPremiumPercent: riskPremiumPercent,
                capitalPercent: capitalPercent,
                laborPercent: laborPercent,
                createdAt: new Date().toISOString()
            };
            
            protocols.push(calculation);
            saveData();
            renderProfitHistory();
            showToast('✅ Расчёт сохранён в историю');
        }
        
        // Отрисовка истории расчётов
        function renderProfitHistory() {
            const container = document.getElementById('profitHistory');
            if (!container) return;
            
            if (protocols.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;История расчётов пуста&lt;/p&gt;';
                return;
            }
            
            // Сортировка по дате (новые сверху)
            const sorted = protocols.slice().sort((a, b) =&gt; new Date(b.createdAt) - new Date(a.createdAt));
            
            let html = '&lt;table&gt;&lt;thead&gt;&lt;tr&gt;';
            html += '&lt;th&gt;Период&lt;/th&gt;';
            html += '&lt;th&gt;Прибыль&lt;/th&gt;';
            html += '&lt;th&gt;Фонд развития&lt;/th&gt;';
            html += '&lt;th&gt;Премии за риски&lt;/th&gt;';
            html += '&lt;th&gt;Капитал/Труд&lt;/th&gt;';
            html += '&lt;th&gt;Дата расчёта&lt;/th&gt;';
            html += '&lt;th&gt;Действия&lt;/th&gt;';
            html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
            
            sorted.forEach(calc =&gt; {
                const devFund = calc.profitAmount * (calc.devFundPercent / 100);
                const riskPremium = calc.profitAmount * (calc.riskPremiumPercent / 100);
                
                html += '&lt;tr&gt;';
                html += `&lt;td&gt;&lt;strong&gt;${calc.period}&lt;/strong&gt;&lt;/td&gt;`;
                html += `&lt;td style="color: #28a745; font-weight: 600;"&gt;${calc.profitAmount.toLocaleString('ru-RU')} ₽&lt;/td&gt;`;
                html += `&lt;td&gt;${Math.round(devFund).toLocaleString('ru-RU')} ₽ (${calc.devFundPercent}%)&lt;/td&gt;`;
                html += `&lt;td&gt;${Math.round(riskPremium).toLocaleString('ru-RU')} ₽ (${calc.riskPremiumPercent}%)&lt;/td&gt;`;
                html += `&lt;td&gt;${calc.capitalPercent}% / ${calc.laborPercent}%&lt;/td&gt;`;
                html += `&lt;td&gt;${formatDate(calc.createdAt)}&lt;/td&gt;`;
                html += `&lt;td&gt;
                    &lt;button class="btn btn-danger" onclick="deleteProfitCalculation(${calc.id})" style="padding: 6px 12px; font-size: 0.85em;"&gt;?️&lt;/button&gt;
                &lt;/td&gt;`;
                html += '&lt;/tr&gt;';
            });
            
            html += '&lt;/tbody&gt;&lt;/table&gt;';
            container.innerHTML = html;
        }
        
        // Удаление расчёта из истории
        function deleteProfitCalculation(id) {
            if (confirm('Удалить этот расчёт из истории?')) {
                protocols = protocols.filter(p =&gt; p.id !== id);
                saveData();
                renderProfitHistory();
                showToast('?️ Расчёт удалён');
            }
        }
        
        // Инициализация
        renderProfitHistory();
    &lt;/script&gt;
        &lt;script&gt;
        // ============================================
        // БЛОК 8: ГЕНЕРАТОР ПРОТОКОЛОВ И ПЕЧАТЬ
        // ============================================
        
        // Заполняем вкладку протоколов HTML-разметкой
        document.getElementById('protocols').innerHTML = `
            &lt;div class="card"&gt;
                &lt;h2&gt;? Генерация протоколов&lt;/h2&gt;
                &lt;p style="color: #6c757d; margin-bottom: 20px;"&gt;
                    Создавайте официальные протоколы для фиксации договорённостей между партнёрами. 
                    Протоколы можно распечатать и подписать.
                &lt;/p&gt;
                
                &lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-bottom: 30px;"&gt;
                    &lt;div style="border: 2px solid #e9ecef; border-radius: 12px; padding: 20px; background: white;"&gt;
                        &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? Протокол распределения прибыли&lt;/h3&gt;
                        &lt;p style="color: #6c757d; margin-bottom: 15px; font-size: 0.9em;"&gt;
                            Фиксирует распределение прибыли за выбранный период между всеми партнёрами.
                        &lt;/p&gt;
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Период&lt;/label&gt;
                            &lt;input type="month" id="protocolPeriod"&gt;
                        &lt;/div&gt;
                        &lt;button class="btn btn-primary" onclick="generateProfitProtocol()"&gt;? Создать протокол&lt;/button&gt;
                    &lt;/div&gt;
                    
                    &lt;div style="border: 2px solid #e9ecef; border-radius: 12px; padding: 20px; background: white;"&gt;
                        &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? Протокол внесения активов&lt;/h3&gt;
                        &lt;p style="color: #6c757d; margin-bottom: 15px; font-size: 0.9em;"&gt;
                            Фиксирует все активы, внесённые партнёрами на текущий момент.
                        &lt;/p&gt;
                        &lt;button class="btn btn-primary" onclick="generateAssetsProtocol()"&gt;? Создать протокол&lt;/button&gt;
                    &lt;/div&gt;
                    
                    &lt;div style="border: 2px solid #e9ecef; border-radius: 12px; padding: 20px; background: white;"&gt;
                        &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? Протокол трудозатрат&lt;/h3&gt;
                        &lt;p style="color: #6c757d; margin-bottom: 15px; font-size: 0.9em;"&gt;
                            Фиксирует все трудозатраты партнёров за выбранный период.
                        &lt;/p&gt;
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Период&lt;/label&gt;
                            &lt;input type="month" id="timeProtocolPeriod"&gt;
                        &lt;/div&gt;
                        &lt;button class="btn btn-primary" onclick="generateTimeProtocol()"&gt;? Создать протокол&lt;/button&gt;
                    &lt;/div&gt;
                    
                    &lt;div style="border: 2px solid #e9ecef; border-radius: 12px; padding: 20px; background: white;"&gt;
                        &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? Полный протокол партнёрства&lt;/h3&gt;
                        &lt;p style="color: #6c757d; margin-bottom: 15px; font-size: 0.9em;"&gt;
                            Комплексный отчёт: все активы, трудозатраты, кредиты и текущее состояние.
                        &lt;/p&gt;
                        &lt;button class="btn btn-primary" onclick="generateFullProtocol()"&gt;? Создать протокол&lt;/button&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Предпросмотр протокола&lt;/h2&gt;
                &lt;div id="protocolPreview" style="background: white; border: 2px solid #e9ecef; border-radius: 12px; padding: 30px; min-height: 400px;"&gt;
                    &lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;
                        Выберите тип протокола для генерации
                    &lt;/p&gt;
                &lt;/div&gt;
                
                &lt;div id="protocolActions" style="margin-top: 20px; display: none;"&gt;
                    &lt;button class="btn btn-success" onclick="printProtocol()"&gt;?️ Распечатать&lt;/button&gt;
                    &lt;button class="btn btn-primary" onclick="downloadProtocolText()"&gt;? Скачать текстовый файл&lt;/button&gt;
                    &lt;button class="btn btn-secondary" onclick="copyProtocolToClipboard()"&gt;? Копировать в буфер&lt;/button&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        `;
        
        // Установка текущих месяцев по умолчанию
        const currentMonth = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`;
        document.getElementById('protocolPeriod').value = currentMonth;
        document.getElementById('timeProtocolPeriod').value = currentMonth;
        
        // Генерация протокола распределения прибыли
        function generateProfitProtocol() {
            const period = document.getElementById('protocolPeriod').value;
            const [year, month] = period.split('-').map(Number);
            
            const monthNames = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
            const periodName = `${monthNames[month - 1]} ${year}`;
            
            let html = `
                &lt;div style="font-family: 'Times New Roman', serif; line-height: 1.6;"&gt;
                    &lt;h1 style="text-align: center; color: #000; margin-bottom: 10px;"&gt;ПРОТОКОЛ&lt;/h1&gt;
                    &lt;h2 style="text-align: center; color: #000; margin-bottom: 30px;"&gt;распределения прибыли за ${periodName}&lt;/h2&gt;
                    
                    &lt;p style="text-align: right; margin-bottom: 30px;"&gt;Дата составления: ${formatDate(new Date().toISOString().split('T')[0])}&lt;/p&gt;
                    
                    &lt;p style="text-indent: 2em; margin-bottom: 15px;"&gt;
                        Настоящий протокол составлен в отношении деятельности партнёрства в составе:
                    &lt;/p&gt;
                    
                    &lt;ul style="margin-bottom: 20px;"&gt;
            `;
            
            partners.forEach(p =&gt; {
                html += `&lt;li&gt;${escapeHtml(p.name)} (${p.role})&lt;/li&gt;`;
            });
            
            html += `
                    &lt;/ul&gt;
                    
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;1. Участники партнёрства&lt;/h3&gt;
                    &lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;
                        &lt;thead&gt;
                            &lt;tr style="background: #f0f0f0;"&gt;
                                &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;ФИО&lt;/th&gt;
                                &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Роль&lt;/th&gt;
                                &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Дата вступления&lt;/th&gt;
                            &lt;/tr&gt;
                        &lt;/thead&gt;
                        &lt;tbody&gt;
            `;
            
            partners.forEach(p =&gt; {
                html += `
                    &lt;tr&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${escapeHtml(p.name)}&lt;/td&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${p.role}&lt;/td&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${formatDate(p.joinDate)}&lt;/td&gt;
                    &lt;/tr&gt;
                `;
            });
            
            html += `
                        &lt;/tbody&gt;
                    &lt;/table&gt;
                    
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;2. Активы партнёров&lt;/h3&gt;
                    &lt;p style="text-indent: 2em; margin-bottom: 15px;"&gt;
                        Общая стоимость активов: &lt;strong&gt;${assets.reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0).toLocaleString('ru-RU')} ₽&lt;/strong&gt;
                    &lt;/p&gt;
            `;
            
            // Группировка активов по партнёрам
            const groupedAssets = {};
            assets.forEach(asset =&gt; {
                if (!groupedAssets[asset.partnerId]) {
                    groupedAssets[asset.partnerId] = {
                        name: asset.partnerName,
                        total: 0,
                        items: []
                    };
                }
                const currentValue = getCurrentAssetValue(asset.id);
                groupedAssets[asset.partnerId].total += currentValue;
                groupedAssets[asset.partnerId].items.push({
                    name: asset.name,
                    type: assetTypeLabels[asset.type],
                    value: currentValue
                });
            });
            
            html += '&lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;';
            html += '&lt;thead&gt;&lt;tr style="background: #f0f0f0;"&gt;';
            html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Партнёр&lt;/th&gt;';
            html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Активы&lt;/th&gt;';
            html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;Стоимость&lt;/th&gt;';
            html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
            
            Object.values(groupedAssets).forEach(g =&gt; {
                html += `
                    &lt;tr&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px; vertical-align: top;"&gt;${escapeHtml(g.name)}&lt;/td&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px;"&gt;
                            &lt;ul style="margin: 0; padding-left: 20px;"&gt;
                `;
                g.items.forEach(item =&gt; {
                    html += `&lt;li&gt;${escapeHtml(item.name)} (${item.type})&lt;/li&gt;`;
                });
                html += `
                            &lt;/ul&gt;
                        &lt;/td&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px; text-align: right; vertical-align: top;"&gt;
                            &lt;strong&gt;${g.total.toLocaleString('ru-RU')} ₽&lt;/strong&gt;
                        &lt;/td&gt;
                    &lt;/tr&gt;
                `;
            });
            
            html += '&lt;/tbody&gt;&lt;/table&gt;';
            
            html += `
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;3. Трудозатраты за ${periodName}&lt;/h3&gt;
            `;
            
            // Трудозатраты за период
            const periodLogs = timeLogs.filter(log =&gt; {
                const d = new Date(log.date);
                return d.getFullYear() === year &amp;&amp; d.getMonth() + 1 === month;
            });
            
            const groupedTime = {};
            periodLogs.forEach(log =&gt; {
                if (!groupedTime[log.partnerId]) {
                    groupedTime[log.partnerId] = {
                        name: log.partnerName,
                        hours: 0,
                        cost: 0
                    };
                }
                groupedTime[log.partnerId].hours += log.hours;
                groupedTime[log.partnerId].cost += log.cost;
            });
            
            html += '&lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;';
            html += '&lt;thead&gt;&lt;tr style="background: #f0f0f0;"&gt;';
            html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Партнёр&lt;/th&gt;';
            html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: center;"&gt;Часов&lt;/th&gt;';
            html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;Стоимость труда&lt;/th&gt;';
            html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
            
            Object.values(groupedTime).forEach(g =&gt; {
                html += `
                    &lt;tr&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${escapeHtml(g.name)}&lt;/td&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px; text-align: center;"&gt;${g.hours}&lt;/td&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;${g.cost.toLocaleString('ru-RU')} ₽&lt;/td&gt;
                    &lt;/tr&gt;
                `;
            });
            
            html += '&lt;/tbody&gt;&lt;/table&gt;';
            
            html += `
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;4. Подписи участников&lt;/h3&gt;
                    &lt;p style="text-indent: 2em; margin-bottom: 30px;"&gt;
                        Настоящий протокол составлен в ${partners.length} экземплярах, по одному для каждого участника.
                    &lt;/p&gt;
                    
                    &lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 30px; margin-top: 50px;"&gt;
            `;
            
            partners.forEach(p =&gt; {
                html += `
                    &lt;div style="border-top: 1px solid #000; padding-top: 10px;"&gt;
                        &lt;p style="margin-bottom: 5px;"&gt;&lt;strong&gt;${escapeHtml(p.name)}&lt;/strong&gt;&lt;/p&gt;
                        &lt;p style="color: #666; font-size: 0.9em;"&gt;${p.role}&lt;/p&gt;
                        &lt;p style="margin-top: 30px;"&gt;_________________ / ${escapeHtml(p.name.split(' ')[0])} /&lt;/p&gt;
                    &lt;/div&gt;
                `;
            });
            
            html += `
                    &lt;/div&gt;
                &lt;/div&gt;
            `;
            
            document.getElementById('protocolPreview').innerHTML = html;
            document.getElementById('protocolActions').style.display = 'block';
        }
        
        // Генерация протокола активов
        function generateAssetsProtocol() {
            let html = `
                &lt;div style="font-family: 'Times New Roman', serif; line-height: 1.6;"&gt;
                    &lt;h1 style="text-align: center; color: #000; margin-bottom: 10px;"&gt;ПРОТОКОЛ&lt;/h1&gt;
                    &lt;h2 style="text-align: center; color: #000; margin-bottom: 30px;"&gt;внесения активов в партнёрство&lt;/h2&gt;
                    
                    &lt;p style="text-align: right; margin-bottom: 30px;"&gt;Дата составления: ${formatDate(new Date().toISOString().split('T')[0])}&lt;/p&gt;
                    
                    &lt;p style="text-indent: 2em; margin-bottom: 20px;"&gt;
                        Настоящий протокол фиксирует все активы, внесённые участниками в партнёрство на текущую дату.
                    &lt;/p&gt;
                    
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;Реестр активов&lt;/h3&gt;
            `;
            
            if (assets.length === 0) {
                html += '&lt;p style="text-align: center; color: #666;"&gt;Активы не внесены&lt;/p&gt;';
            } else {
                // Группировка по партнёрам
                const grouped = {};
                assets.forEach(asset =&gt; {
                    if (!grouped[asset.partnerId]) {
                        grouped[asset.partnerId] = {
                            name: asset.partnerName,
                            items: [],
                            total: 0
                        };
                    }
                    const currentValue = getCurrentAssetValue(asset.id);
                    grouped[asset.partnerId].items.push({
                        ...asset,
                        currentValue: currentValue
                    });
                    grouped[asset.partnerId].total += currentValue;
                });
                
                Object.values(grouped).forEach(g =&gt; {
                    html += `
                        &lt;h4 style="margin-top: 20px; margin-bottom: 10px; color: #333;"&gt;
                            ${escapeHtml(g.name)} — Итого: ${g.total.toLocaleString('ru-RU')} ₽
                        &lt;/h4&gt;
                        &lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;
                            &lt;thead&gt;
                                &lt;tr style="background: #f0f0f0;"&gt;
                                    &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Наименование&lt;/th&gt;
                                    &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Тип&lt;/th&gt;
                                    &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Дата внесения&lt;/th&gt;
                                    &lt;th style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;Стоимость&lt;/th&gt;
                                &lt;/tr&gt;
                            &lt;/thead&gt;
                            &lt;tbody&gt;
                    `;
                    
                    g.items.forEach(item =&gt; {
                        html += `
                            &lt;tr&gt;
                                &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${escapeHtml(item.name)}&lt;/td&gt;
                                &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${assetTypeLabels[item.type]}&lt;/td&gt;
                                &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${formatDate(item.date)}&lt;/td&gt;
                                &lt;td style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;${item.currentValue.toLocaleString('ru-RU')} ₽&lt;/td&gt;
                            &lt;/tr&gt;
                        `;
                    });
                    
                    html += '&lt;/tbody&gt;&lt;/table&gt;';
                });
            }
            
            html += `
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;Подписи участников&lt;/h3&gt;
                    &lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 30px; margin-top: 50px;"&gt;
            `;
            
            partners.forEach(p =&gt; {
                html += `
                    &lt;div style="border-top: 1px solid #000; padding-top: 10px;"&gt;
                        &lt;p style="margin-bottom: 5px;"&gt;&lt;strong&gt;${escapeHtml(p.name)}&lt;/strong&gt;&lt;/p&gt;
                        &lt;p style="margin-top: 30px;"&gt;_________________ / ${escapeHtml(p.name.split(' ')[0])} /&lt;/p&gt;
                    &lt;/div&gt;
                `;
            });
            
            html += '&lt;/div&gt;&lt;/div&gt;';
            
            document.getElementById('protocolPreview').innerHTML = html;
            document.getElementById('protocolActions').style.display = 'block';
        }
        
        // Генерация протокола трудозатрат
        function generateTimeProtocol() {
            const period = document.getElementById('timeProtocolPeriod').value;
            const [year, month] = period.split('-').map(Number);
            const monthNames = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
            const periodName = `${monthNames[month - 1]} ${year}`;
            
            let html = `
                &lt;div style="font-family: 'Times New Roman', serif; line-height: 1.6;"&gt;
                    &lt;h1 style="text-align: center; color: #000; margin-bottom: 10px;"&gt;ПРОТОКОЛ&lt;/h1&gt;
                    &lt;h2 style="text-align: center; color: #000; margin-bottom: 30px;"&gt;учёта трудозатрат за ${periodName}&lt;/h2&gt;
                    
                    &lt;p style="text-align: right; margin-bottom: 30px;"&gt;Дата составления: ${formatDate(new Date().toISOString().split('T')[0])}&lt;/p&gt;
            `;
            
            const periodLogs = timeLogs.filter(log =&gt; {
                const d = new Date(log.date);
                return d.getFullYear() === year &amp;&amp; d.getMonth() + 1 === month;
            });
            
            if (periodLogs.length === 0) {
                html += '&lt;p style="text-align: center; color: #666; margin-top: 50px;"&gt;Нет записей о трудозатратах за выбранный период&lt;/p&gt;';
            } else {
                const grouped = {};
                periodLogs.forEach(log =&gt; {
                    if (!grouped[log.partnerId]) {
                        grouped[log.partnerId] = {
                            name: log.partnerName,
                            logs: [],
                            totalHours: 0,
                            totalCost: 0
                        };
                    }
                    grouped[log.partnerId].logs.push(log);
                    grouped[log.partnerId].totalHours += log.hours;
                    grouped[log.partnerId].totalCost += log.cost;
                });
                
                Object.values(grouped).forEach(g =&gt; {
                    html += `
                        &lt;h3 style="margin-top: 25px; margin-bottom: 15px; color: #333;"&gt;
                            ${escapeHtml(g.name)}
                        &lt;/h3&gt;
                        &lt;p style="margin-bottom: 15px;"&gt;
                            Всего часов: &lt;strong&gt;${g.totalHours}&lt;/strong&gt; | 
                            Стоимость труда: &lt;strong&gt;${g.totalCost.toLocaleString('ru-RU')} ₽&lt;/strong&gt;
                        &lt;/p&gt;
                        &lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;
                            &lt;thead&gt;
                                &lt;tr style="background: #f0f0f0;"&gt;
                                    &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Дата&lt;/th&gt;
                                    &lt;th style="border: 1px solid #000; padding: 8px; text-align: center;"&gt;Часы&lt;/th&gt;
                                    &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Тип деятельности&lt;/th&gt;
                                    &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Описание&lt;/th&gt;
                                &lt;/tr&gt;
                            &lt;/thead&gt;
                            &lt;tbody&gt;
                    `;
                    
                    g.logs.sort((a, b) =&gt; new Date(a.date) - new Date(b.date)).forEach(log =&gt; {
                        html += `
                            &lt;tr&gt;
                                &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${formatDate(log.date)}&lt;/td&gt;
                                &lt;td style="border: 1px solid #000; padding: 8px; text-align: center;"&gt;${log.hours}&lt;/td&gt;
                                &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${activityTypeLabels[log.activityType] || log.activityType}&lt;/td&gt;
                                &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${escapeHtml(log.description) || '-'}&lt;/td&gt;
                            &lt;/tr&gt;
                        `;
                    });
                    
                    html += '&lt;/tbody&gt;&lt;/table&gt;';
                });
            }
            
            html += `
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;Подписи участников&lt;/h3&gt;
                    &lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 30px; margin-top: 50px;"&gt;
            `;
            
            partners.forEach(p =&gt; {
                html += `
                    &lt;div style="border-top: 1px solid #000; padding-top: 10px;"&gt;
                        &lt;p style="margin-bottom: 5px;"&gt;&lt;strong&gt;${escapeHtml(p.name)}&lt;/strong&gt;&lt;/p&gt;
                        &lt;p style="margin-top: 30px;"&gt;_________________ / ${escapeHtml(p.name.split(' ')[0])} /&lt;/p&gt;
                    &lt;/div&gt;
                `;
            });
            
            html += '&lt;/div&gt;&lt;/div&gt;';
            
            document.getElementById('protocolPreview').innerHTML = html;
            document.getElementById('protocolActions').style.display = 'block';
        }
        
        // Генерация полного протокола
        function generateFullProtocol() {
            let html = `
                &lt;div style="font-family: 'Times New Roman', serif; line-height: 1.6;"&gt;
                    &lt;h1 style="text-align: center; color: #000; margin-bottom: 10px;"&gt;ПОЛНЫЙ ПРОТОКОЛ&lt;/h1&gt;
                    &lt;h2 style="text-align: center; color: #000; margin-bottom: 30px;"&gt;состояния партнёрства&lt;/h2&gt;
                    
                    &lt;p style="text-align: right; margin-bottom: 30px;"&gt;Дата составления: ${formatDate(new Date().toISOString().split('T')[0])}&lt;/p&gt;
                    
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;1. Участники партнёрства&lt;/h3&gt;
                    &lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;
                        &lt;thead&gt;
                            &lt;tr style="background: #f0f0f0;"&gt;
                                &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;ФИО&lt;/th&gt;
                                &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Роль&lt;/th&gt;
                                &lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Дата вступления&lt;/th&gt;
                                &lt;th style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;Ставка (руб/ч)&lt;/th&gt;
                            &lt;/tr&gt;
                        &lt;/thead&gt;
                        &lt;tbody&gt;
            `;
            
            partners.forEach(p =&gt; {
                html += `
                    &lt;tr&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${escapeHtml(p.name)}&lt;/td&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${p.role}&lt;/td&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${formatDate(p.joinDate)}&lt;/td&gt;
                        &lt;td style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;${p.hourlyRate.toLocaleString('ru-RU')}&lt;/td&gt;
                    &lt;/tr&gt;
                `;
            });
            
            html += `
                        &lt;/tbody&gt;
                    &lt;/table&gt;
                    
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;2. Активы (всего: ${assets.reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0).toLocaleString('ru-RU')} ₽)&lt;/h3&gt;
            `;
            
            if (assets.length === 0) {
                html += '&lt;p&gt;Активы не внесены&lt;/p&gt;';
            } else {
                html += '&lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;';
                html += '&lt;thead&gt;&lt;tr style="background: #f0f0f0;"&gt;';
                html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Партнёр&lt;/th&gt;';
                html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Наименование&lt;/th&gt;';
                html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Тип&lt;/th&gt;';
                html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;Стоимость&lt;/th&gt;';
                html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
                
                assets.forEach(a =&gt; {
                    html += `
                        &lt;tr&gt;
                            &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${escapeHtml(a.partnerName)}&lt;/td&gt;
                            &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${escapeHtml(a.name)}&lt;/td&gt;
                            &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${assetTypeLabels[a.type]}&lt;/td&gt;
                            &lt;td style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;${getCurrentAssetValue(a.id).toLocaleString('ru-RU')} ₽&lt;/td&gt;
                        &lt;/tr&gt;
                    `;
                });
                
                html += '&lt;/tbody&gt;&lt;/table&gt;';
            }
            
            html += `
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;3. Кредиты и риски&lt;/h3&gt;
            `;
            
            if (credits.length === 0) {
                html += '&lt;p&gt;Кредиты отсутствуют&lt;/p&gt;';
            } else {
                html += '&lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;';
                html += '&lt;thead&gt;&lt;tr style="background: #f0f0f0;"&gt;';
                html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Название&lt;/th&gt;';
                html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Заемщик&lt;/th&gt;';
                html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;Сумма&lt;/th&gt;';
                html += '&lt;th style="border: 1px solid #000; padding: 8px; text-align: left;"&gt;Поручители&lt;/th&gt;';
                html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
                
                credits.forEach(c =&gt; {
                    html += `
                        &lt;tr&gt;
                            &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${escapeHtml(c.name)}&lt;/td&gt;
                            &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${escapeHtml(c.borrowerName)}&lt;/td&gt;
                            &lt;td style="border: 1px solid #000; padding: 8px; text-align: right;"&gt;${c.amount.toLocaleString('ru-RU')} ₽&lt;/td&gt;
                            &lt;td style="border: 1px solid #000; padding: 8px;"&gt;${c.guarantorNames.map(n =&gt; escapeHtml(n)).join(', ') || 'Нет'}&lt;/td&gt;
                        &lt;/tr&gt;
                    `;
                });
                
                html += '&lt;/tbody&gt;&lt;/table&gt;';
            }
            
            html += `
                    &lt;h3 style="margin-top: 30px; margin-bottom: 15px;"&gt;4. Подписи участников&lt;/h3&gt;
                    &lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 30px; margin-top: 50px;"&gt;
            `;
            
            partners.forEach(p =&gt; {
                html += `
                    &lt;div style="border-top: 1px solid #000; padding-top: 10px;"&gt;
                        &lt;p style="margin-bottom: 5px;"&gt;&lt;strong&gt;${escapeHtml(p.name)}&lt;/strong&gt;&lt;/p&gt;
                        &lt;p style="margin-top: 30px;"&gt;_________________ / ${escapeHtml(p.name.split(' ')[0])} /&lt;/p&gt;
                    &lt;/div&gt;
                `;
            });
            
            html += '&lt;/div&gt;&lt;/div&gt;';
            
            document.getElementById('protocolPreview').innerHTML = html;
            document.getElementById('protocolActions').style.display = 'block';
        }
        
        // Печать протокола
        function printProtocol() {
            const content = document.getElementById('protocolPreview').innerHTML;
            const printWindow = window.open('', '', 'width=800,height=600');
            
            printWindow.document.write(`
                &lt;!DOCTYPE html&gt;
                &lt;html&gt;
                &lt;head&gt;
                    &lt;title&gt;Протокол&lt;/title&gt;
                    &lt;style&gt;
                        body { font-family: 'Times New Roman', serif; line-height: 1.6; padding: 20px; }
                        table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }
                        th, td { border: 1px solid #000; padding: 8px; }
                        th { background: #f0f0f0; }
                        @media print {
                            body { padding: 0; }
                        }
                    &lt;/style&gt;
                &lt;/head&gt;
                &lt;body&gt;${content}&lt;/body&gt;
                &lt;/html&gt;
            `);
            
            printWindow.document.close();
            printWindow.focus();
            setTimeout(() =&gt; {
                printWindow.print();
                printWindow.close();
            }, 250);
        }
        
        // Скачивание текстового файла
        function downloadProtocolText() {
            const content = document.getElementById('protocolPreview').innerText;
            const blob = new Blob([content], { type: 'text/plain;charset=utf-8' });
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = `Протокол_${formatDate(new Date().toISOString().split('T')[0])}.txt`;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            URL.revokeObjectURL(url);
            showToast('✅ Файл скачан');
        }
        
        // Копирование в буфер обмена
        function copyProtocolToClipboard() {
            const content = document.getElementById('protocolPreview').innerText;
            navigator.clipboard.writeText(content).then(() =&gt; {
                showToast('✅ Скопировано в буфер обмена');
            }).catch(() =&gt; {
                alert('Не удалось скопировать. Попробуйте вручную.');
            });
        }
    &lt;/script&gt;
        &lt;script&gt;
        // ============================================
        // БЛОК 9: ГОЛОСОВАНИЕ И SMART PROTOCOL
        // ============================================
        
        // Заполняем вкладку голосования HTML-разметкой
        document.getElementById('voting').innerHTML = `
            &lt;div class="card"&gt;
                &lt;h2&gt;?️ Система голосования партнёров&lt;/h2&gt;
                &lt;p style="color: #6c757d; margin-bottom: 20px;"&gt;
                    Создавайте голосования для принятия важных решений: добавление новых типов активов, 
                    принятие новых партнёров, изменение правил распределения и т.д.
                &lt;/p&gt;
                
                &lt;button class="btn btn-primary" onclick="showCreateVoteForm()" style="margin-bottom: 20px;"&gt;
                    ➕ Создать новое голосование
                &lt;/button&gt;
                
                &lt;div id="createVoteForm" style="display: none; background: #f8f9fa; border-radius: 12px; padding: 20px; margin-bottom: 20px;"&gt;
                    &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;Новое голосование&lt;/h3&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Тип голосования *&lt;/label&gt;
                        &lt;select id="voteType" required onchange="updateVoteFormFields()"&gt;
                            &lt;option value=""&gt;Выберите тип&lt;/option&gt;
                            &lt;option value="new_asset_type"&gt;Добавить новый тип актива&lt;/option&gt;
                            &lt;option value="new_partner"&gt;Принять нового партнёра&lt;/option&gt;
                            &lt;option value="change_distribution"&gt;Изменить правила распределения&lt;/option&gt;
                            &lt;option value="revaluation"&gt;Провести массовую переоценку&lt;/option&gt;
                            &lt;option value="custom"&gt;Произвольное решение&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Название / Суть предложения *&lt;/label&gt;
                        &lt;input type="text" id="voteTitle" required placeholder="Например: Добавить тип актива 'Криптовалюта'"&gt;
                    &lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Описание / Обоснование&lt;/label&gt;
                        &lt;textarea id="voteDescription" rows="4" placeholder="Подробное описание предложения, почему это важно..."&gt;&lt;/textarea&gt;
                    &lt;/div&gt;
                    
                    &lt;div id="voteSpecificFields"&gt;&lt;/div&gt;
                    
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Срок голосования (дней)&lt;/label&gt;
                        &lt;input type="number" id="voteDeadline" min="1" max="30" value="7" placeholder="7"&gt;
                    &lt;/div&gt;
                    
                    &lt;button class="btn btn-success" onclick="createVote()"&gt;✅ Создать голосование&lt;/button&gt;
                    &lt;button class="btn btn-secondary" onclick="hideCreateVoteForm()"&gt;Отмена&lt;/button&gt;
                &lt;/div&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Активные голосования&lt;/h2&gt;
                &lt;div id="activeVotes"&gt;&lt;/div&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? История голосований&lt;/h2&gt;
                &lt;div id="voteHistory"&gt;&lt;/div&gt;
            &lt;/div&gt;
        `;
        
        // Показать форму создания голосования
        function showCreateVoteForm() {
            document.getElementById('createVoteForm').style.display = 'block';
        }
        
        // Скрыть форму создания голосования
        function hideCreateVoteForm() {
            document.getElementById('createVoteForm').style.display = 'none';
            document.getElementById('voteType').value = '';
            document.getElementById('voteTitle').value = '';
            document.getElementById('voteDescription').value = '';
            document.getElementById('voteDeadline').value = '7';
            document.getElementById('voteSpecificFields').innerHTML = '';
        }
        
        // Обновление полей формы в зависимости от типа голосования
        function updateVoteFormFields() {
            const type = document.getElementById('voteType').value;
            const container = document.getElementById('voteSpecificFields');
            
            if (!type) {
                container.innerHTML = '';
                return;
            }
            
            let html = '';
            
            if (type === 'new_asset_type') {
                html = `
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Название нового типа актива *&lt;/label&gt;
                        &lt;input type="text" id="newAssetTypeName" placeholder="Например: Криптовалюта"&gt;
                    &lt;/div&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Описание типа&lt;/label&gt;
                        &lt;textarea id="newAssetTypeDescription" rows="2" placeholder="Что относится к этому типу..."&gt;&lt;/textarea&gt;
                    &lt;/div&gt;
                `;
            } else if (type === 'new_partner') {
                html = `
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;ФИО нового партнёра *&lt;/label&gt;
                        &lt;input type="text" id="newPartnerName" placeholder="Петров Петр Петрович"&gt;
                    &lt;/div&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Роль&lt;/label&gt;
                        &lt;select id="newPartnerRole"&gt;
                            &lt;option value="partner"&gt;Равноправный партнер&lt;/option&gt;
                            &lt;option value="investor"&gt;Инвестор&lt;/option&gt;
                            &lt;option value="manager"&gt;Управляющий&lt;/option&gt;
                            &lt;option value="specialist"&gt;Специалист&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Что вносит (кратко)&lt;/label&gt;
                        &lt;textarea id="newPartnerContribution" rows="2" placeholder="Деньги, имущество, компетенции..."&gt;&lt;/textarea&gt;
                    &lt;/div&gt;
                `;
            } else if (type === 'change_distribution') {
                html = `
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Новый % фонда развития&lt;/label&gt;
                        &lt;input type="number" id="newDevFundPercent" min="0" max="100" step="5" value="20"&gt;
                    &lt;/div&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Новый % премий за риски&lt;/label&gt;
                        &lt;input type="number" id="newRiskPremiumPercent" min="0" max="50" step="5" value="15"&gt;
                    &lt;/div&gt;
                    &lt;div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"&gt;
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Доля Капитала (%)&lt;/label&gt;
                            &lt;input type="number" id="newCapitalPercent" min="0" max="100" step="5" value="50"&gt;
                        &lt;/div&gt;
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Доля Труда (%)&lt;/label&gt;
                            &lt;input type="number" id="newLaborPercent" min="0" max="100" step="5" value="50"&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                `;
            }
            
            container.innerHTML = html;
        }
        
        // Создание голосования
        function createVote() {
            const type = document.getElementById('voteType').value;
            const title = document.getElementById('voteTitle').value.trim();
            const description = document.getElementById('voteDescription').value.trim();
            const deadlineDays = parseInt(document.getElementById('voteDeadline').value) || 7;
            
            if (!type || !title) {
                alert('Заполните обязательные поля');
                return;
            }
            
            const deadline = new Date();
            deadline.setDate(deadline.getDate() + deadlineDays);
            
            const vote = {
                id: Date.now(),
                type: type,
                title: title,
                description: description,
                createdAt: new Date().toISOString(),
                deadline: deadline.toISOString(),
                status: 'active', // active, approved, rejected
                votes: {}, // { partnerId: 'yes' | 'no' }
                specificData: {}
            };
            
            // Сбор специфических данных
            if (type === 'new_asset_type') {
                vote.specificData = {
                    typeName: document.getElementById('newAssetTypeName')?.value || '',
                    typeDescription: document.getElementById('newAssetTypeDescription')?.value || ''
                };
            } else if (type === 'new_partner') {
                vote.specificData = {
                    partnerName: document.getElementById('newPartnerName')?.value || '',
                    partnerRole: document.getElementById('newPartnerRole')?.value || 'partner',
                    contribution: document.getElementById('newPartnerContribution')?.value || ''
                };
            } else if (type === 'change_distribution') {
                vote.specificData = {
                    devFundPercent: parseFloat(document.getElementById('newDevFundPercent')?.value) || 20,
                    riskPremiumPercent: parseFloat(document.getElementById('newRiskPremiumPercent')?.value) || 15,
                    capitalPercent: parseFloat(document.getElementById('newCapitalPercent')?.value) || 50,
                    laborPercent: parseFloat(document.getElementById('newLaborPercent')?.value) || 50
                };
            }
            
            votes.push(vote);
            saveData();
            renderActiveVotes();
            renderVoteHistory();
            hideCreateVoteForm();
            showToast('✅ Голосование создано!');
        }
        
        // Голосование партнёра
        function castVote(voteId, choice) {
            const vote = votes.find(v =&gt; v.id === voteId);
            if (!vote) return;
            
            // Здесь должна быть авторизация, но для простоты используем prompt
            const partnerName = prompt('Введите ваше ФИО для голосования:');
            if (!partnerName) return;
            
            const partner = partners.find(p =&gt; p.name.toLowerCase() === partnerName.toLowerCase());
            if (!partner) {
                alert('Партнёр не найден. Проверьте правильность написания ФИО.');
                return;
            }
            
            if (vote.votes[partner.id]) {
                if (!confirm('Вы уже голосовали. Изменить свой голос?')) return;
            }
            
            vote.votes[partner.id] = choice;
            saveData();
            renderActiveVotes();
            showToast('✅ Ваш голос учтён!');
            
            // Проверка завершения голосования
            checkVoteCompletion(voteId);
        }
        
        // Проверка завершения голосования
        function checkVoteCompletion(voteId) {
            const vote = votes.find(v =&gt; v.id === voteId);
            if (!vote || vote.status !== 'active') return;
            
            const totalPartners = partners.length;
            const totalVotes = Object.keys(vote.votes).length;
            
            // Если проголосовали все или истёк срок
            const now = new Date();
            const deadline = new Date(vote.deadline);
            
            if (totalVotes &gt;= totalPartners || now &gt; deadline) {
                finalizeVote(voteId);
            }
        }
        
        // Завершение голосования и подсчёт результатов
        function finalizeVote(voteId) {
            const vote = votes.find(v =&gt; v.id === voteId);
            if (!vote) return;
            
            const yesVotes = Object.values(vote.votes).filter(v =&gt; v === 'yes').length;
            const noVotes = Object.values(vote.votes).filter(v =&gt; v === 'no').length;
            const totalVotes = yesVotes + noVotes;
            
            // Большинство (более 50%)
            const approved = totalVotes &gt; 0 &amp;&amp; (yesVotes / totalVotes) &gt; 0.5;
            
            vote.status = approved ? 'approved' : 'rejected';
            vote.finalizedAt = new Date().toISOString();
            vote.result = {
                yes: yesVotes,
                no: noVotes,
                approved: approved
            };
            
            // Применение решения
            if (approved) {
                applyVoteDecision(vote);
            }
            
            saveData();
            renderActiveVotes();
            renderVoteHistory();
            
            showToast(approved ? '✅ Решение принято!' : '❌ Решение отклонено');
        }
        
        // Применение решения голосования
        function applyVoteDecision(vote) {
            if (vote.type === 'new_asset_type') {
                // Добавление нового типа актива в справочник
                assetTypeLabels[vote.specificData.typeName.toLowerCase().replace(/\s+/g, '_')] = 
                    vote.specificData.typeName;
                showToast('✅ Новый тип актива добавлен в справочник');
            } else if (vote.type === 'new_partner') {
                // Автоматическое создание нового партнёра
                const newPartner = {
                    id: Date.now(),
                    name: vote.specificData.partnerName,
                    role: vote.specificData.partnerRole,
                    hourlyRate: 0,
                    contact: '',
                    description: vote.specificData.contribution,
                    joinDate: new Date().toISOString().split('T')[0],
                    createdAt: new Date().toISOString()
                };
                partners.push(newPartner);
                renderPartners();
                updatePartnerSelect();
                updateDashboard();
                showToast('✅ Новый партнёр добавлен!');
            } else if (vote.type === 'change_distribution') {
                // Обновление настроек распределения
                document.getElementById('devFundPercent').value = vote.specificData.devFundPercent;
                document.getElementById('riskPremiumPercent').value = vote.specificData.riskPremiumPercent;
                document.getElementById('capitalPercent').value = vote.specificData.capitalPercent;
                document.getElementById('laborPercent').value = vote.specificData.laborPercent;
                showToast('✅ Настройки распределения обновлены!');
            }
        }
        
        // Отрисовка активных голосований
        function renderActiveVotes() {
            const container = document.getElementById('activeVotes');
            if (!container) return;
            
            const activeVotes = votes.filter(v =&gt; v.status === 'active');
            
            if (activeVotes.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;Нет активных голосований&lt;/p&gt;';
                return;
            }
            
            let html = '';
            
            activeVotes.forEach(vote =&gt; {
                const yesVotes = Object.values(vote.votes).filter(v =&gt; v === 'yes').length;
                const noVotes = Object.values(vote.votes).filter(v =&gt; v === 'no').length;
                const totalVotes = yesVotes + noVotes;
                const totalPartners = partners.length;
                const deadline = new Date(vote.deadline);
                const now = new Date();
                const daysLeft = Math.ceil((deadline - now) / (1000 * 60 * 60 * 24));
                
                const typeLabels = {
                    'new_asset_type': '? Новый тип актива',
                    'new_partner': '? Новый партнёр',
                    'change_distribution': '⚙️ Изменение правил',
                    'revaluation': '? Переоценка',
                    'custom': '? Произвольное'
                };
                
                html += `&lt;div style="border: 2px solid #667eea; border-radius: 12px; padding: 20px; margin-bottom: 20px; background: white;"&gt;`;
                html += `&lt;div style="display: flex; justify-content: space-between; align-items: start; margin-bottom: 15px;"&gt;`;
                html += `&lt;div&gt;`;
                html += `&lt;span class="badge badge-warning"&gt;${typeLabels[vote.type] || vote.type}&lt;/span&gt;`;
                html += `&lt;h3 style="color: #667eea; margin-top: 10px;"&gt;${escapeHtml(vote.title)}&lt;/h3&gt;`;
                html += `&lt;/div&gt;`;
                html += `&lt;div style="text-align: right; font-size: 0.9em; color: #6c757d;"&gt;`;
                html += `Осталось дней: &lt;strong style="color: ${daysLeft &lt; 2 ? '#dc3545' : '#667eea'};"&gt;${daysLeft}&lt;/strong&gt;`;
                html += `&lt;/div&gt;`;
                html += `&lt;/div&gt;`;
                
                if (vote.description) {
                    html += `&lt;p style="color: #495057; margin-bottom: 15px;"&gt;${escapeHtml(vote.description)}&lt;/p&gt;`;
                }
                
                // Специфические данные
                if (vote.type === 'new_asset_type' &amp;&amp; vote.specificData.typeName) {
                    html += `&lt;div style="background: #e7f3ff; padding: 10px; border-radius: 8px; margin-bottom: 15px;"&gt;`;
                    html += `&lt;strong&gt;Новый тип:&lt;/strong&gt; ${escapeHtml(vote.specificData.typeName)}`;
                    if (vote.specificData.typeDescription) {
                        html += `&lt;br&gt;&lt;small&gt;${escapeHtml(vote.specificData.typeDescription)}&lt;/small&gt;`;
                    }
                    html += `&lt;/div&gt;`;
                } else if (vote.type === 'new_partner' &amp;&amp; vote.specificData.partnerName) {
                    html += `&lt;div style="background: #e7f3ff; padding: 10px; border-radius: 8px; margin-bottom: 15px;"&gt;`;
                    html += `&lt;strong&gt;Новый партнёр:&lt;/strong&gt; ${escapeHtml(vote.specificData.partnerName)}&lt;br&gt;`;
                    html += `&lt;strong&gt;Роль:&lt;/strong&gt; ${vote.specificData.partnerRole}&lt;br&gt;`;
                    if (vote.specificData.contribution) {
                        html += `&lt;strong&gt;Вклад:&lt;/strong&gt; ${escapeHtml(vote.specificData.contribution)}`;
                    }
                    html += `&lt;/div&gt;`;
                }
                
                // Прогресс голосования
                html += `&lt;div style="margin-bottom: 15px;"&gt;`;
                html += `&lt;div style="display: flex; justify-content: space-between; margin-bottom: 5px;"&gt;`;
                html += `&lt;span&gt;Проголосовало: ${totalVotes} / ${totalPartners}&lt;/span&gt;`;
                html += `&lt;span&gt;✅ ${yesVotes} | ❌ ${noVotes}&lt;/span&gt;`;
                html += `&lt;/div&gt;`;
                html += `&lt;div style="background: #e9ecef; border-radius: 10px; height: 10px; overflow: hidden;"&gt;`;
                const yesPercent = totalVotes &gt; 0 ? (yesVotes / totalVotes) * 100 : 0;
                html += `&lt;div style="background: linear-gradient(90deg, #28a745 0%, #28a745 ${yesPercent}%, #dc3545 ${yesPercent}%, #dc3545 100%); height: 100%;"&gt;&lt;/div&gt;`;
                html += `&lt;/div&gt;`;
                html += `&lt;/div&gt;`;
                
                // Кнопки голосования
                html += `&lt;div style="display: flex; gap: 10px;"&gt;`;
                html += `&lt;button class="btn btn-success" onclick="castVote(${vote.id}, 'yes')" style="flex: 1;"&gt;✅ ЗА&lt;/button&gt;`;
                html += `&lt;button class="btn btn-danger" onclick="castVote(${vote.id}, 'no')" style="flex: 1;"&gt;❌ ПРОТИВ&lt;/button&gt;`;
                html += `&lt;/div&gt;`;
                
                html += `&lt;/div&gt;`;
            });
            
            container.innerHTML = html;
        }
        
        // Отрисовка истории голосований
        function renderVoteHistory() {
            const container = document.getElementById('voteHistory');
            if (!container) return;
            
            const finishedVotes = votes.filter(v =&gt; v.status !== 'active');
            
            if (finishedVotes.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;История голосований пуста&lt;/p&gt;';
                return;
            }
            
            let html = '&lt;table&gt;&lt;thead&gt;&lt;tr&gt;';
            html += '&lt;th&gt;Название&lt;/th&gt;';
            html += '&lt;th&gt;Тип&lt;/th&gt;';
            html += '&lt;th&gt;Результат&lt;/th&gt;';
            html += '&lt;th&gt;Голоса&lt;/th&gt;';
            html += '&lt;th&gt;Дата завершения&lt;/th&gt;';
            html += '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
            
            finishedVotes.sort((a, b) =&gt; new Date(b.finalizedAt) - new Date(a.finalizedAt)).forEach(vote =&gt; {
                const statusBadge = vote.status === 'approved' 
                    ? '&lt;span class="badge badge-success"&gt;✅ Принято&lt;/span&gt;'
                    : '&lt;span class="badge badge-danger"&gt;❌ Отклонено&lt;/span&gt;';
                
                html += '&lt;tr&gt;';
                html += `&lt;td&gt;&lt;strong&gt;${escapeHtml(vote.title)}&lt;/strong&gt;&lt;/td&gt;`;
                html += `&lt;td&gt;${vote.type}&lt;/td&gt;`;
                html += `&lt;td&gt;${statusBadge}&lt;/td&gt;`;
                html += `&lt;td&gt;✅ ${vote.result.yes} | ❌ ${vote.result.no}&lt;/td&gt;`;
                html += `&lt;td&gt;${formatDate(vote.finalizedAt.split('T')[0])}&lt;/td&gt;`;
                html += '&lt;/tr&gt;';
            });
            
            html += '&lt;/tbody&gt;&lt;/table&gt;';
            container.innerHTML = html;
        }
        
        // Инициализация
        renderActiveVotes();
        renderVoteHistory();
    &lt;/script&gt;
        &lt;script&gt;
        // ============================================
        // БЛОК 10: ДАШБОРД, АНАЛИТИКА И СИМУЛЯТОР
        // ============================================
        
        // Переопределяем содержимое вкладки "Дашборд" с реальной аналитикой
        document.getElementById('dashboard').innerHTML = `
            &lt;div class="stats-grid"&gt;
                &lt;div class="stat-card"&gt;
                    &lt;h3 id="totalPartners"&gt;0&lt;/h3&gt;
                    &lt;p&gt;Участников&lt;/p&gt;
                &lt;/div&gt;
                &lt;div class="stat-card" style="background: linear-gradient(135deg, #28a745 0%, #20c997 100%);"&gt;
                    &lt;h3 id="totalAssets"&gt;0 ₽&lt;/h3&gt;
                    &lt;p&gt;Общий капитал&lt;/p&gt;
                &lt;/div&gt;
                &lt;div class="stat-card" style="background: linear-gradient(135deg, #ffc107 0%, #fd7e14 100%);"&gt;
                    &lt;h3 id="totalHours"&gt;0&lt;/h3&gt;
                    &lt;p&gt;Часов за месяц&lt;/p&gt;
                &lt;/div&gt;
                &lt;div class="stat-card" style="background: linear-gradient(135deg, #dc3545 0%, #c82333 100%);"&gt;
                    &lt;h3 id="totalCredits"&gt;0 ₽&lt;/h3&gt;
                    &lt;p&gt;Кредитная нагрузка&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
            
            &lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 20px; margin-bottom: 20px;"&gt;
                &lt;div class="card"&gt;
                    &lt;h2&gt;? Распределение капитала&lt;/h2&gt;
                    &lt;div id="capitalPieChart" style="display: flex; justify-content: center; align-items: center; min-height: 300px;"&gt;&lt;/div&gt;
                &lt;/div&gt;
                
                &lt;div class="card"&gt;
                    &lt;h2&gt;⏱️ Трудозатраты за месяц&lt;/h2&gt;
                    &lt;div id="laborBarChart" style="min-height: 300px;"&gt;&lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Симулятор «Что если?»&lt;/h2&gt;
                &lt;p style="color: #6c757d; margin-bottom: 20px;"&gt;
                    Смоделируйте изменения до принятия решения: как изменятся доли, если принять нового партнёра, 
                    внести новый актив или изменить правила распределения.
                &lt;/p&gt;
                
                &lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 20px;"&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Тип сценария&lt;/label&gt;
                        &lt;select id="simScenario" onchange="updateSimFields()"&gt;
                            &lt;option value="new_partner"&gt;➕ Принять нового партнёра&lt;/option&gt;
                            &lt;option value="new_asset"&gt;? Внести новый актив&lt;/option&gt;
                            &lt;option value="revaluation"&gt;? Переоценить актив&lt;/option&gt;
                            &lt;option value="change_profit"&gt;? Изменить прибыль&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                    &lt;div id="simFieldsContainer"&gt;&lt;/div&gt;
                &lt;/div&gt;
                
                &lt;button class="btn btn-primary" onclick="runSimulation()"&gt;? Запустить симуляцию&lt;/button&gt;
                &lt;button class="btn btn-secondary" onclick="resetSimulation()"&gt;? Сбросить&lt;/button&gt;
                
                &lt;div id="simulationResult" style="margin-top: 20px;"&gt;&lt;/div&gt;
            &lt;/div&gt;
            
            &lt;div class="card"&gt;
                &lt;h2&gt;? Аналитика по партнёрам&lt;/h2&gt;
                &lt;div id="partnerAnalytics"&gt;&lt;/div&gt;
            &lt;/div&gt;
        `;
        
        // Обновление полей симулятора
        function updateSimFields() {
            const scenario = document.getElementById('simScenario').value;
            const container = document.getElementById('simFieldsContainer');
            
            let html = '';
            
            if (scenario === 'new_partner') {
                html = `
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Имя нового партнёра&lt;/label&gt;
                        &lt;input type="text" id="simNewPartnerName" placeholder="Петров П.П."&gt;
                    &lt;/div&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Его капитал (руб)&lt;/label&gt;
                        &lt;input type="number" id="simNewPartnerCapital" min="0" value="1000000"&gt;
                    &lt;/div&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Его часовая ставка (руб/ч)&lt;/label&gt;
                        &lt;input type="number" id="simNewPartnerRate" min="0" value="1500"&gt;
                    &lt;/div&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Ожидаемые часы в месяц&lt;/label&gt;
                        &lt;input type="number" id="simNewPartnerHours" min="0" value="160"&gt;
                    &lt;/div&gt;
                `;
            } else if (scenario === 'new_asset') {
                html = `
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Партнёр-вкладчик&lt;/label&gt;
                        &lt;select id="simAssetPartner"&gt;&lt;/select&gt;
                    &lt;/div&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Стоимость актива (руб)&lt;/label&gt;
                        &lt;input type="number" id="simAssetValue" min="0" value="500000"&gt;
                    &lt;/div&gt;
                `;
                // Заполнение select
                setTimeout(() =&gt; {
                    const select = document.getElementById('simAssetPartner');
                    if (select) {
                        select.innerHTML = '&lt;option value=""&gt;Выберите&lt;/option&gt;';
                        partners.forEach(p =&gt; {
                            const opt = document.createElement('option');
                            opt.value = p.id;
                            opt.textContent = p.name;
                            select.appendChild(opt);
                        });
                    }
                }, 50);
            } else if (scenario === 'revaluation') {
                html = `
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Актив для переоценки&lt;/label&gt;
                        &lt;select id="simRevalAsset"&gt;&lt;/select&gt;
                    &lt;/div&gt;
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Новая стоимость (руб)&lt;/label&gt;
                        &lt;input type="number" id="simRevalValue" min="0" value="0"&gt;
                    &lt;/div&gt;
                `;
                setTimeout(() =&gt; {
                    const select = document.getElementById('simRevalAsset');
                    if (select) {
                        select.innerHTML = '&lt;option value=""&gt;Выберите&lt;/option&gt;';
                        assets.forEach(a =&gt; {
                            const opt = document.createElement('option');
                            opt.value = a.id;
                            opt.textContent = `${a.name} (${a.partnerName}) — ${getCurrentAssetValue(a.id).toLocaleString('ru-RU')} ₽`;
                            select.appendChild(opt);
                        });
                    }
                }, 50);
            } else if (scenario === 'change_profit') {
                html = `
                    &lt;div class="form-group"&gt;
                        &lt;label&gt;Новая прибыль за период (руб)&lt;/label&gt;
                        &lt;input type="number" id="simProfitAmount" min="0" value="500000"&gt;
                    &lt;/div&gt;
                `;
            }
            
            container.innerHTML = html;
        }
        
        // Запуск симуляции
        function runSimulation() {
            const scenario = document.getElementById('simScenario').value;
            const container = document.getElementById('simulationResult');
            
            if (partners.length === 0) {
                container.innerHTML = '&lt;p style="color: #dc3545;"&gt;⚠️ Сначала добавьте хотя бы одного партнёра&lt;/p&gt;';
                return;
            }
            
            // Создаём копии данных для симуляции
            let simPartners = JSON.parse(JSON.stringify(partners));
            let simAssets = JSON.parse(JSON.stringify(assets));
            let simTimeLogs = JSON.parse(JSON.stringify(timeLogs));
            
            // Применяем сценарий
            if (scenario === 'new_partner') {
                const name = document.getElementById('simNewPartnerName')?.value || 'Новый партнёр';
                const capital = parseFloat(document.getElementById('simNewPartnerCapital')?.value) || 0;
                const rate = parseFloat(document.getElementById('simNewPartnerRate')?.value) || 0;
                const hours = parseFloat(document.getElementById('simNewPartnerHours')?.value) || 0;
                
                const newId = Date.now();
                simPartners.push({
                    id: newId,
                    name: name,
                    role: 'partner',
                    hourlyRate: rate,
                    joinDate: new Date().toISOString().split('T')[0]
                });
                
                if (capital &gt; 0) {
                    simAssets.push({
                        id: Date.now() + 1,
                        partnerId: newId,
                        partnerName: name,
                        type: 'money',
                        name: 'Моделируемый взнос',
                        value: capital
                    });
                }
                
                if (hours &gt; 0) {
                    simTimeLogs.push({
                        id: Date.now() + 2,
                        partnerId: newId,
                        partnerName: name,
                        hourlyRate: rate,
                        date: new Date().toISOString().split('T')[0],
                        hours: hours,
                        cost: hours * rate
                    });
                }
            } else if (scenario === 'new_asset') {
                const partnerId = parseInt(document.getElementById('simAssetPartner')?.value);
                const value = parseFloat(document.getElementById('simAssetValue')?.value) || 0;
                
                if (!partnerId) {
                    container.innerHTML = '&lt;p style="color: #dc3545;"&gt;⚠️ Выберите партнёра&lt;/p&gt;';
                    return;
                }
                
                const partner = simPartners.find(p =&gt; p.id === partnerId);
                simAssets.push({
                    id: Date.now(),
                    partnerId: partnerId,
                    partnerName: partner.name,
                    type: 'other',
                    name: 'Моделируемый актив',
                    value: value
                });
            } else if (scenario === 'revaluation') {
                const assetId = parseInt(document.getElementById('simRevalAsset')?.value);
                const newValue = parseFloat(document.getElementById('simRevalValue')?.value) || 0;
                
                if (!assetId) {
                    container.innerHTML = '&lt;p style="color: #dc3545;"&gt;⚠️ Выберите актив&lt;/p&gt;';
                    return;
                }
                
                const asset = simAssets.find(a =&gt; a.id === assetId);
                if (asset) asset.value = newValue;
            }
            
            // Расчёт долей капитала
            const capitalByPartner = {};
            let totalCapital = 0;
            simPartners.forEach(p =&gt; {
                const pAssets = simAssets.filter(a =&gt; a.partnerId === p.id);
                const capital = pAssets.reduce((s, a) =&gt; s + a.value, 0);
                capitalByPartner[p.id] = capital;
                totalCapital += capital;
            });
            
            // Расчёт долей труда
            const now = new Date();
            const currentMonth = now.getMonth();
            const currentYear = now.getFullYear();
            
            const laborByPartner = {};
            let totalLaborCost = 0;
            simPartners.forEach(p =&gt; {
                const pLogs = simTimeLogs.filter(l =&gt; {
                    const d = new Date(l.date);
                    return d.getMonth() === currentMonth &amp;&amp; d.getFullYear() === currentYear &amp;&amp; l.partnerId === p.id;
                });
                const laborCost = pLogs.reduce((s, l) =&gt; s + l.cost, 0);
                laborByPartner[p.id] = laborCost;
                totalLaborCost += laborCost;
            });
            
            // Отрисовка результата
            let html = `
                &lt;div style="background: #e7f3ff; border-radius: 12px; padding: 20px; margin-bottom: 20px;"&gt;
                    &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? Результат симуляции&lt;/h3&gt;
                    &lt;p style="color: #495057; margin-bottom: 15px;"&gt;
                        &lt;strong&gt;Сценарий:&lt;/strong&gt; ${scenario === 'new_partner' ? 'Принятие нового партнёра' : 
                                                   scenario === 'new_asset' ? 'Внесение нового актива' :
                                                   scenario === 'revaluation' ? 'Перееоценка актива' :
                                                   'Изменение прибыли'}
                    &lt;/p&gt;
                &lt;/div&gt;
                
                &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? Доли в капитале (после изменений)&lt;/h3&gt;
                &lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;
                    &lt;thead&gt;
                        &lt;tr style="background: #f8f9fa;"&gt;
                            &lt;th style="padding: 12px; text-align: left; border-bottom: 2px solid #e9ecef;"&gt;Партнёр&lt;/th&gt;
                            &lt;th style="padding: 12px; text-align: right; border-bottom: 2px solid #e9ecef;"&gt;Капитал&lt;/th&gt;
                            &lt;th style="padding: 12px; text-align: right; border-bottom: 2px solid #e9ecef;"&gt;Доля (%)&lt;/th&gt;
                            &lt;th style="padding: 12px; text-align: left; border-bottom: 2px solid #e9ecef;"&gt;Визуализация&lt;/th&gt;
                        &lt;/tr&gt;
                    &lt;/thead&gt;
                    &lt;tbody&gt;
            `;
            
            const colors = ['#667eea', '#764ba2', '#28a745', '#ffc107', '#dc3545', '#17a2b8', '#fd7e14', '#20c997'];
            let colorIndex = 0;
            
            simPartners.forEach(p =&gt; {
                const capital = capitalByPartner[p.id] || 0;
                const share = totalCapital &gt; 0 ? (capital / totalCapital) * 100 : 0;
                const color = colors[colorIndex % colors.length];
                colorIndex++;
                
                // Сравнение с текущей ситуацией
                const currentCapital = assets.filter(a =&gt; a.partnerId === p.id).reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0);
                const currentTotal = assets.reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0);
                const currentShare = currentTotal &gt; 0 ? (currentCapital / currentTotal) * 100 : 0;
                const delta = share - currentShare;
                const deltaColor = delta &gt; 0 ? '#28a745' : delta &lt; 0 ? '#dc3545' : '#6c757d';
                const deltaSign = delta &gt; 0 ? '+' : '';
                
                html += `
                    &lt;tr&gt;
                        &lt;td style="padding: 12px; border-bottom: 1px solid #e9ecef;"&gt;
                            &lt;strong&gt;${escapeHtml(p.name)}&lt;/strong&gt;
                            ${scenario === 'new_partner' &amp;&amp; p.id === simPartners[simPartners.length - 1].id ? '&lt;span class="badge badge-warning" style="margin-left: 8px;"&gt;НОВЫЙ&lt;/span&gt;' : ''}
                        &lt;/td&gt;
                        &lt;td style="padding: 12px; text-align: right; border-bottom: 1px solid #e9ecef;"&gt;
                            ${capital.toLocaleString('ru-RU')} ₽
                        &lt;/td&gt;
                        &lt;td style="padding: 12px; text-align: right; border-bottom: 1px solid #e9ecef;"&gt;
                            &lt;strong&gt;${share.toFixed(2)}%&lt;/strong&gt;
                            &lt;br&gt;&lt;small style="color: ${deltaColor};"&gt;${deltaSign}${delta.toFixed(2)}%&lt;/small&gt;
                        &lt;/td&gt;
                        &lt;td style="padding: 12px; border-bottom: 1px solid #e9ecef;"&gt;
                            &lt;div style="background: #e9ecef; border-radius: 10px; height: 20px; overflow: hidden; position: relative;"&gt;
                                &lt;div style="background: ${color}; height: 100%; width: ${share}%; transition: width 0.5s;"&gt;&lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/td&gt;
                    &lt;/tr&gt;
                `;
            });
            
            html += `
                        &lt;tr style="background: #f8f9fa; font-weight: 600;"&gt;
                            &lt;td style="padding: 12px;"&gt;ИТОГО&lt;/td&gt;
                            &lt;td style="padding: 12px; text-align: right;"&gt;${totalCapital.toLocaleString('ru-RU')} ₽&lt;/td&gt;
                            &lt;td style="padding: 12px; text-align: right;"&gt;100%&lt;/td&gt;
                            &lt;td&gt;&lt;/td&gt;
                        &lt;/tr&gt;
                    &lt;/tbody&gt;
                &lt;/table&gt;
                
                &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;⏱️ Доли в трудовом фонде (за текущий месяц)&lt;/h3&gt;
                &lt;table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;"&gt;
                    &lt;thead&gt;
                        &lt;tr style="background: #f8f9fa;"&gt;
                            &lt;th style="padding: 12px; text-align: left; border-bottom: 2px solid #e9ecef;"&gt;Партнёр&lt;/th&gt;
                            &lt;th style="padding: 12px; text-align: right; border-bottom: 2px solid #e9ecef;"&gt;Стоимость труда&lt;/th&gt;
                            &lt;th style="padding: 12px; text-align: right; border-bottom: 2px solid #e9ecef;"&gt;Доля (%)&lt;/th&gt;
                        &lt;/tr&gt;
                    &lt;/thead&gt;
                    &lt;tbody&gt;
            `;
            
            colorIndex = 0;
            simPartners.forEach(p =&gt; {
                const labor = laborByPartner[p.id] || 0;
                const share = totalLaborCost &gt; 0 ? (labor / totalLaborCost) * 100 : 0;
                const color = colors[colorIndex % colors.length];
                colorIndex++;
                
                html += `
                    &lt;tr&gt;
                        &lt;td style="padding: 12px; border-bottom: 1px solid #e9ecef;"&gt;&lt;strong&gt;${escapeHtml(p.name)}&lt;/strong&gt;&lt;/td&gt;
                        &lt;td style="padding: 12px; text-align: right; border-bottom: 1px solid #e9ecef;"&gt;${labor.toLocaleString('ru-RU')} ₽&lt;/td&gt;
                        &lt;td style="padding: 12px; text-align: right; border-bottom: 1px solid #e9ecef;"&gt;
                            &lt;strong&gt;${share.toFixed(2)}%&lt;/strong&gt;
                            &lt;div style="background: #e9ecef; border-radius: 10px; height: 8px; overflow: hidden; margin-top: 5px;"&gt;
                                &lt;div style="background: ${color}; height: 100%; width: ${share}%;"&gt;&lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/td&gt;
                    &lt;/tr&gt;
                `;
            });
            
            html += `
                        &lt;tr style="background: #f8f9fa; font-weight: 600;"&gt;
                            &lt;td style="padding: 12px;"&gt;ИТОГО&lt;/td&gt;
                            &lt;td style="padding: 12px; text-align: right;"&gt;${totalLaborCost.toLocaleString('ru-RU')} ₽&lt;/td&gt;
                            &lt;td style="padding: 12px; text-align: right;"&gt;100%&lt;/td&gt;
                        &lt;/tr&gt;
                    &lt;/tbody&gt;
                &lt;/table&gt;
            `;
            
            // Предупреждение о размывании долей
            if (scenario === 'new_partner' || scenario === 'new_asset') {
                const existingPartners = partners.filter(p =&gt; p.id !== simPartners[simPartners.length - 1]?.id);
                const hasDilution = existingPartners.some(p =&gt; {
                    const oldCapital = assets.filter(a =&gt; a.partnerId === p.id).reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0);
                    const oldTotal = assets.reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0);
                    const oldShare = oldTotal &gt; 0 ? (oldCapital / oldTotal) * 100 : 0;
                    const newShare = totalCapital &gt; 0 ? ((capitalByPartner[p.id] || 0) / totalCapital) * 100 : 0;
                    return newShare &lt; oldShare;
                });
                
                if (hasDilution) {
                    html += `
                        &lt;div style="background: #fff3cd; border-left: 4px solid #ffc107; padding: 15px; border-radius: 8px; margin-top: 20px;"&gt;
                            &lt;strong&gt;⚠️ Внимание:&lt;/strong&gt; Доли существующих партнёров будут размыты. 
                            Рекомендуется обсудить условия с текущими участниками перед принятием решения.
                        &lt;/div&gt;
                    `;
                }
            }
            
            container.innerHTML = html;
        }
        
        // Сброс симуляции
        function resetSimulation() {
            document.getElementById('simulationResult').innerHTML = '';
        }
        
        // Отрисовка круговой диаграммы капитала
        function renderCapitalPieChart() {
            const container = document.getElementById('capitalPieChart');
            if (!container) return;
            
            if (partners.length === 0 || assets.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d;"&gt;Добавьте партнёров и активы&lt;/p&gt;';
                return;
            }
            
            const data = partners.map(p =&gt; {
                const capital = assets
                    .filter(a =&gt; a.partnerId === p.id)
                    .reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0);
                return { name: p.name, value: capital };
            }).filter(d =&gt; d.value &gt; 0);
            
            if (data.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d;"&gt;Нет данных о капитале&lt;/p&gt;';
                return;
            }
            
            const total = data.reduce((s, d) =&gt; s + d.value, 0);
            const colors = ['#667eea', '#764ba2', '#28a745', '#ffc107', '#dc3545', '#17a2b8', '#fd7e14', '#20c997'];
            
            // Построение conic-gradient
            let gradientParts = [];
            let currentAngle = 0;
            
            data.forEach((d, i) =&gt; {
                const percent = (d.value / total) * 100;
                const color = colors[i % colors.length];
                gradientParts.push(`${color} ${currentAngle}% ${currentAngle + percent}%`);
                currentAngle += percent;
            });
            
            const gradient = `conic-gradient(${gradientParts.join(', ')})`;
            
            let html = `
                &lt;div style="display: flex; flex-wrap: wrap; gap: 20px; align-items: center; justify-content: center;"&gt;
                    &lt;div style="width: 200px; height: 200px; border-radius: 50%; background: ${gradient}; box-shadow: 0 5px 20px rgba(0,0,0,0.1);"&gt;&lt;/div&gt;
                    &lt;div style="flex: 1; min-width: 200px;"&gt;
            `;
            
            data.forEach((d, i) =&gt; {
                const percent = (d.value / total) * 100;
                const color = colors[i % colors.length];
                html += `
                    &lt;div style="display: flex; align-items: center; margin-bottom: 10px;"&gt;
                        &lt;div style="width: 16px; height: 16px; background: ${color}; border-radius: 4px; margin-right: 10px;"&gt;&lt;/div&gt;
                        &lt;div style="flex: 1;"&gt;
                            &lt;strong&gt;${escapeHtml(d.name)}&lt;/strong&gt;
                            &lt;div style="font-size: 0.85em; color: #6c757d;"&gt;${percent.toFixed(1)}% • ${d.value.toLocaleString('ru-RU')} ₽&lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                `;
            });
            
            html += `
                    &lt;/div&gt;
                &lt;/div&gt;
            `;
            
            container.innerHTML = html;
        }
        
        // Отрисовка столбчатой диаграммы трудозатрат
        function renderLaborBarChart() {
            const container = document.getElementById('laborBarChart');
            if (!container) return;
            
            const now = new Date();
            const currentMonth = now.getMonth();
            const currentYear = now.getFullYear();
            
            const data = partners.map(p =&gt; {
                const hours = timeLogs
                    .filter(l =&gt; {
                        const d = new Date(l.date);
                        return d.getMonth() === currentMonth &amp;&amp; d.getFullYear() === currentYear &amp;&amp; l.partnerId === p.id;
                    })
                    .reduce((s, l) =&gt; s + l.hours, 0);
                return { name: p.name, hours: hours, norm: 160 };
            });
            
            if (data.every(d =&gt; d.hours === 0)) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;Нет трудозатрат за текущий месяц&lt;/p&gt;';
                return;
            }
            
            const maxHours = Math.max(...data.map(d =&gt; d.hours), 160);
            const colors = ['#667eea', '#764ba2', '#28a745', '#ffc107', '#dc3545', '#17a2b8'];
            
            let html = '&lt;div style="display: flex; flex-direction: column; gap: 15px;"&gt;';
            
            data.forEach((d, i) =&gt; {
                const percent = (d.hours / maxHours) * 100;
                const normPercent = (d.hours / d.norm) * 100;
                const color = colors[i % colors.length];
                const statusColor = normPercent &gt;= 100 ? '#28a745' : normPercent &gt;= 80 ? '#ffc107' : '#dc3545';
                
                html += `
                    &lt;div&gt;
                        &lt;div style="display: flex; justify-content: space-between; margin-bottom: 5px;"&gt;
                            &lt;strong style="color: #495057;"&gt;${escapeHtml(d.name)}&lt;/strong&gt;
                            &lt;span&gt;
                                &lt;strong style="color: ${statusColor};"&gt;${d.hours} ч&lt;/strong&gt;
                                &lt;small style="color: #6c757d;"&gt;/ ${d.norm} ч&lt;/small&gt;
                                &lt;span style="color: ${statusColor}; margin-left: 8px;"&gt;(${normPercent.toFixed(0)}%)&lt;/span&gt;
                            &lt;/span&gt;
                        &lt;/div&gt;
                        &lt;div style="background: #e9ecef; border-radius: 10px; height: 25px; overflow: hidden; position: relative;"&gt;
                            &lt;div style="background: ${color}; height: 100%; width: ${percent}%; transition: width 0.5s;"&gt;&lt;/div&gt;
                            &lt;div style="position: absolute; right: 10px; top: 50%; transform: translateY(-50%); color: white; font-size: 0.85em; font-weight: 600; text-shadow: 0 1px 2px rgba(0,0,0,0.5);"&gt;
                                ${d.hours} ч
                            &lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                `;
            });
            
            html += '&lt;/div&gt;';
            container.innerHTML = html;
        }
        
        // Аналитика по партнёрам
        function renderPartnerAnalytics() {
            const container = document.getElementById('partnerAnalytics');
            if (!container) return;
            
            if (partners.length === 0) {
                container.innerHTML = '&lt;p style="text-align: center; color: #6c757d; padding: 40px;"&gt;Добавьте партнёров для просмотра аналитики&lt;/p&gt;';
                return;
            }
            
            const now = new Date();
            const currentMonth = now.getMonth();
            const currentYear = now.getFullYear();
            
            let html = '&lt;div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 20px;"&gt;';
            
            partners.forEach(p =&gt; {
                // Капитал
                const capital = assets
                    .filter(a =&gt; a.partnerId === p.id)
                    .reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0);
                
                // Труд за месяц
                const monthHours = timeLogs
                    .filter(l =&gt; {
                        const d = new Date(l.date);
                        return d.getMonth() === currentMonth &amp;&amp; d.getFullYear() === currentYear &amp;&amp; l.partnerId === p.id;
                    })
                    .reduce((s, l) =&gt; s + l.hours, 0);
                
                const monthLaborCost = monthHours * p.hourlyRate;
                const normPercent = (monthHours / 160) * 100;
                
                // Кредиты
                const borrowerCredits = credits.filter(c =&gt; c.borrowerId === p.id);
                const guarantorCredits = credits.filter(c =&gt; c.guarantorIds.includes(p.id));
                
                // Доля в капитале
                const totalCapital = assets.reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0);
                const capitalShare = totalCapital &gt; 0 ? (capital / totalCapital) * 100 : 0;
                
                html += `
                    &lt;div style="border: 2px solid #e9ecef; border-radius: 12px; padding: 20px; background: white;"&gt;
                        &lt;h3 style="color: #667eea; margin-bottom: 15px;"&gt;? ${escapeHtml(p.name)}&lt;/h3&gt;
                        &lt;div style="font-size: 0.9em; color: #6c757d; margin-bottom: 15px;"&gt;${p.role} • с ${formatDate(p.joinDate)}&lt;/div&gt;
                        
                        &lt;div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 15px;"&gt;
                            &lt;div style="background: #f8f9fa; padding: 12px; border-radius: 8px;"&gt;
                                &lt;div style="font-size: 0.8em; color: #6c757d;"&gt;? Капитал&lt;/div&gt;
                                &lt;div style="font-size: 1.3em; font-weight: 600; color: #28a745;"&gt;${capital.toLocaleString('ru-RU')} ₽&lt;/div&gt;
                                &lt;div style="font-size: 0.85em; color: #667eea;"&gt;${capitalShare.toFixed(1)}% доли&lt;/div&gt;
                            &lt;/div&gt;
                            &lt;div style="background: #f8f9fa; padding: 12px; border-radius: 8px;"&gt;
                                &lt;div style="font-size: 0.8em; color: #6c757d;"&gt;⏱️ Труд (мес.)&lt;/div&gt;
                                &lt;div style="font-size: 1.3em; font-weight: 600; color: #764ba2;"&gt;${monthHours} ч&lt;/div&gt;
                                &lt;div style="font-size: 0.85em; color: #6c757d;"&gt;${monthLaborCost.toLocaleString('ru-RU')} ₽&lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                        
                        &lt;div style="margin-bottom: 15px;"&gt;
                            &lt;div style="display: flex; justify-content: space-between; margin-bottom: 5px;"&gt;
                                &lt;span style="font-size: 0.85em;"&gt;Выполнение нормы (160 ч)&lt;/span&gt;
                                &lt;strong style="color: ${normPercent &gt;= 100 ? '#28a745' : normPercent &gt;= 80 ? '#ffc107' : '#dc3545'};"&gt;${normPercent.toFixed(0)}%&lt;/strong&gt;
                            &lt;/div&gt;
                            &lt;div style="background: #e9ecef; border-radius: 10px; height: 8px; overflow: hidden;"&gt;
                                &lt;div style="background: ${normPercent &gt;= 100 ? '#28a745' : normPercent &gt;= 80 ? '#ffc107' : '#dc3545'}; height: 100%; width: ${Math.min(100, normPercent)}%;"&gt;&lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                        
                        &lt;div style="font-size: 0.85em; color: #6c757d; border-top: 1px solid #e9ecef; padding-top: 10px;"&gt;
                            &lt;div&gt;? Кредитов взято: &lt;strong&gt;${borrowerCredits.length}&lt;/strong&gt;&lt;/div&gt;
                            &lt;div&gt;⚠️ Поручительств: &lt;strong&gt;${guarantorCredits.length}&lt;/strong&gt;&lt;/div&gt;
                            &lt;div&gt;? Ставка: &lt;strong&gt;${p.hourlyRate.toLocaleString('ru-RU')} ₽/ч&lt;/strong&gt;&lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                `;
            });
            
            html += '&lt;/div&gt;';
            container.innerHTML = html;
        }
        
        // Обновление дашборда (переопределение)
        function updateDashboard() {
            const el = (id) =&gt; document.getElementById(id);
            if (!el('totalPartners')) return; // Если дашборд ещё не инициализирован
            
            el('totalPartners').textContent = partners.length;
            
            const totalAssetsValue = assets.reduce((s, a) =&gt; s + getCurrentAssetValue(a.id), 0);
            el('totalAssets').textContent = totalAssetsValue.toLocaleString('ru-RU') + ' ₽';
            
            const now = new Date();
            const currentMonth = now.getMonth();
            const currentYear = now.getFullYear();
            const totalHoursValue = timeLogs
                .filter(l =&gt; {
                    const d = new Date(l.date);
                    return d.getMonth() === currentMonth &amp;&amp; d.getFullYear() === currentYear;
                })
                .reduce((s, l) =&gt; s + l.hours, 0);
            el('totalHours').textContent = totalHoursValue;
            
            const totalCreditsValue = credits.reduce((s, c) =&gt; s + c.amount, 0);
            el('totalCredits').textContent = totalCreditsValue.toLocaleString('ru-RU') + ' ₽';
            
            renderCapitalPieChart();
            renderLaborBarChart();
            renderPartnerAnalytics();
        }
        
        // Инициализация симулятора
        updateSimFields();
        updateDashboard();
    &lt;/script&gt;</subtitle>
  <updated>2026-08-25T05:36:18Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/23/28e0c6a04211f1a10691d899ddef63/-/1787633987.png</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
