Сформировать основу цифровой образовательной среды дисциплины через разработку интерактивной платформы, включающей базовый HR-бюджет (ФЗП), кейс-задание и инструмент самооценки студентов.
Спроектировать архитектуру цифрового сервиса дисциплины
Создать веб-сайт курса как единый интерфейс
Разместить образовательный контент (основы HR-бюджетирования и ФЗП)
Разработать структуру самооценки студентов
Создать форму самооценки (Google Forms / Apps Script)
Подготовить базовую финмодель ФЗП (Excel / Apps)
Обеспечить сбор первичных данных для аналитики
Интегрировать все элементы в единую цифровую среду
ChatGPT / Gemini / Qwen — генерация структуры и заданий
Google Forms — форма самооценки
Google Apps Script — автоматизация и расчеты (ФЗП)
Google Sites — платформа курса
Google Drive — хранение данных
Canva — визуализация структуры
Расчет ФЗП (укрупненный метод)
Разработка мини-финмодели HR
Создание формы самооценки
Интеграция формы и модели в сайт
По итогам урока:
создан веб-сайт дисциплины
размещен учебный контент и кейс
рассчитан базовый HR-бюджет (ФЗП)
разработана и внедрена форма самооценки
подготовлена база данных для аналитики
фсформирована единая цифровая среда курса
Digital Course Platform MVP (Lesson 1) — базовая цифровая платформа, которая:
объединяет HR-контент и структуру курса
включает расчет ФЗП как ядро финансовой модели
внедряет механизм самооценки студентов
формирует первичную базу образовательных данных
создает основу для AI-аналитики и автоматизации на следующих этапах
Зайдите в ChatGPT
В левом меню выберите GPTs / Создать GPT
или Explore GPTs → Create
Введите название, например:
AI HR
Вставьте инструкцию ниже в поле Instructions
Ты — AI-консультант в области HR преподавателя.
Твоя задача:
консультировать по вопросам трудового законодательства
создавать скрипты для автоматизации процессов бюджетирования HR
решать финансовые задачи в области HR
консультировать по воспроам оптимизации и автомаптизации процессов кадрового администрирования
Формат ответов:
Четко
Структурировано
Готово для использования в учебном процессе
С примерами и шаблонами
Нажмите Save / Publish
Преподаватель получает персональный GPT-помощник курса, который затем используется на всех milestones:
контент
формы
rubric
симуляторы
обратная связь
Google Apps Script — это облачная платформа на базе JavaScript для автоматизации задач в экосистеме Google (Таблицы, Документы, Gmail, Диск, Календарь и др.). Позволяет писать макросы, создавать пользовательские функции, простые веб-приложения и настраивать интеграции между сервисами Google и внешними API. Не требует установки: код хранится и выполняется на серверах Google, запускаясь прямо из браузера.
Создай простое веб-приложение на Google Apps Script для расчёта премиального фонда по модели Скэнлона.
Нужно сделать 2 файла:
1. Code.gs
2. index.html
Интерфейс:
- современный дизайн в графитовых тонах;
- центральная карточка приложения;
- аккуратная форма ввода данных;
- кнопка «Рассчитать»;
- блок с ключевыми результатами в виде карточек;
- таблица расчётов;
- итоговая сводка с выводами;
- подсветка важных результатов;
- адаптация под мобильный экран.
Поля ввода:
- объём продаж;
- нормативный уровень ФЗП;
- фактический уровень ФЗП;
- доля премиального фонда от экономии, %;
- доля премиального фонда АУП и коммерческого департамента, %;
- доля премиального фонда производственного персонала, %.
Логика расчёта:
- экономия = нормативный ФЗП − фактический ФЗП;
- премиальный фонд = экономия × доля премиального фонда;
- резерв компании = экономия − премиальный фонд;
- фонд АУП = премиальный фонд × доля АУП;
- фонд производственного персонала = премиальный фонд × доля производственного персонала;
- ФЗП производственного персонала = нормативный ФЗП × доля производственного персонала;
- размер премии = фонд производственного персонала / ФЗП производственного персонала × 100%.
Если экономия меньше или равна нулю, премиальный фонд равен 0.
Вывести результат в виде:
1. карточек с ключевыми показателями;
2. таблицы расчётов;
3. текстового вывода по результатам.
function doGet() {
return HtmlService.createHtmlOutputFromFile('index')
.setTitle('Калькулятор премиального фонда по модели Скэнлона')
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
function calculateScanlon(data) {
const sales = Number(data.sales);
const normativePayroll = Number(data.normativePayroll);
const actualPayroll = Number(data.actualPayroll);
const bonusShare = Number(data.bonusShare) / 100;
const adminShare = Number(data.adminShare) / 100;
const productionShare = Number(data.productionShare) / 100;
const saving = normativePayroll - actualPayroll;
let bonusFund = 0;
let companyReserve = 0;
let adminBonusFund = 0;
let productionBonusFund = 0;
let productionPayroll = 0;
let bonusPercent = 0;
if (saving > 0) {
bonusFund = saving * bonusShare;
companyReserve = saving - bonusFund;
adminBonusFund = bonusFund * adminShare;
productionBonusFund = bonusFund * productionShare;
productionPayroll = normativePayroll * productionShare;
bonusPercent = productionBonusFund / productionPayroll * 100;
}
return {
sales: sales,
normativePayroll: normativePayroll,
actualPayroll: actualPayroll,
saving: saving,
bonusFund: bonusFund,
companyReserve: companyReserve,
adminBonusFund: adminBonusFund,
productionBonusFund: productionBonusFund,
productionPayroll: productionPayroll,
bonusPercent: bonusPercent
};
}
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<meta charset="UTF-8">
<style>
body {
font-family: Arial, sans-serif;
background: #111827;
margin: 0;
padding: 30px;
color: #e5e7eb;
}
.container {
max-width: 1000px;
margin: 0 auto;
background: #1f2937;
padding: 32px;
border-radius: 18px;
box-shadow: 0 20px 45px rgba(0,0,0,0.35);
}
h1 {
text-align: center;
font-size: 26px;
margin-bottom: 8px;
color: #f9fafb;
}
.subtitle {
text-align: center;
color: #9ca3af;
margin-bottom: 30px;
}
.input-panel {
background: #374151;
padding: 24px;
border-radius: 16px;
border: 1px solid #4b5563;
margin-bottom: 24px;
}
.grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 18px;
}
label {
font-weight: 600;
font-size: 14px;
margin-bottom: 6px;
display: block;
color: #d1d5db;
}
input {
width: 100%;
padding: 12px;
border: 1px solid #4b5563;
border-radius: 10px;
font-size: 15px;
box-sizing: border-box;
background: #111827;
color: #f9fafb;
}
button {
width: 100%;
padding: 15px;
background: #2563eb;
color: white;
border: none;
border-radius: 12px;
font-size: 16px;
font-weight: 700;
cursor: pointer;
margin-top: 22px;
}
button:hover {
background: #1d4ed8;
}
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
margin-top: 26px;
display: none;
}
.card {
background: #111827;
border: 1px solid #374151;
border-radius: 16px;
padding: 18px;
}
.card-title {
color: #9ca3af;
font-size: 13px;
margin-bottom: 10px;
}
.card-value {
font-size: 24px;
font-weight: 800;
color: #f9fafb;
}
.accent {
border-left: 5px solid #22c55e;
}
.warning {
border-left: 5px solid #f97316;
}
.danger {
border-left: 5px solid #ef4444;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 28px;
font-size: 15px;
display: none;
}
th {
background: #374151;
color: #f9fafb;
padding: 13px;
text-align: left;
}
td {
border: 1px solid #374151;
padding: 13px;
color: #e5e7eb;
}
tr:nth-child(even) {
background: #273244;
}
.highlight {
background: #123524 !important;
font-weight: 700;
}
.conclusion {
display: none;
margin-top: 26px;
background: #0f172a;
border: 1px solid #334155;
border-left: 5px solid #38bdf8;
padding: 20px;
border-radius: 14px;
line-height: 1.6;
}
.conclusion h3 {
margin-top: 0;
color: #f9fafb;
}
@media (max-width: 800px) {
.grid,
.cards {
grid-template-columns: 1fr;
}
body {
padding: 15px;
}
}
</style>
</head>
<body>
<div class="container">
<h1>Калькулятор премиального фонда</h1>
<div class="subtitle">
Нормативный метод планирования премиального фонда по модели Скэнлона
</div>
<div class="input-panel">
<div class="grid">
<div>
<label>Объём продаж за отчётный месяц</label>
<input type="number" id="sales" value="180000000">
</div>
<div>
<label>Нормативный уровень ФЗП</label>
<input type="number" id="normativePayroll" value="30469078">
</div>
<div>
<label>Фактический уровень ФЗП</label>
<input type="number" id="actualPayroll" value="29900800">
</div>
<div>
<label>Доля премиального фонда от экономии, %</label>
<input type="number" id="bonusShare" value="80">
</div>
<div>
<label>Доля премиального фонда АУП и коммерческого департамента, %</label>
<input type="number" id="adminShare" value="30">
</div>
<div>
<label>Доля премиального фонда производственного персонала, %</label>
<input type="number" id="productionShare" value="70">
</div>
</div>
<button onclick="runCalculation()">Рассчитать премиальный фонд</button>
</div>
<div class="cards" id="summaryCards">
<div class="card accent">
<div class="card-title">Экономия ФЗП</div>
<div class="card-value" id="savingCard">0</div>
</div>
<div class="card accent">
<div class="card-title">Премиальный фонд ПП</div>
<div class="card-value" id="productionBonusCard">0</div>
</div>
<div class="card warning">
<div class="card-title">Премия к нормативной ЗП</div>
<div class="card-value" id="bonusPercentCard">0%</div>
</div>
</div>
<table id="resultTable">
<thead>
<tr>
<th>Показатель</th>
<th>Значение</th>
</tr>
</thead>
<tbody id="results"></tbody>
</table>
<div class="conclusion" id="conclusion"></div>
</div>
<script>
function formatNumber(value) {
return Math.round(value).toLocaleString('ru-RU') + ' у.е.';
}
function formatPercent(value) {
return value.toFixed(2).replace('.', ',') + '%';
}
function runCalculation() {
const data = {
sales: document.getElementById('sales').value,
normativePayroll: document.getElementById('normativePayroll').value,
actualPayroll: document.getElementById('actualPayroll').value,
bonusShare: document.getElementById('bonusShare').value,
adminShare: document.getElementById('adminShare').value,
productionShare: document.getElementById('productionShare').value
};
google.script.run
.withSuccessHandler(showResults)
.calculateScanlon(data);
}
function showResults(result) {
const tbody = document.getElementById('results');
const table = document.getElementById('resultTable');
const cards = document.getElementById('summaryCards');
const conclusion = document.getElementById('conclusion');
tbody.innerHTML = '';
const rows = [
['Сумма экономии от повышения производительности труда', formatNumber(result.saving)],
['Премиальный фонд', formatNumber(result.bonusFund)],
['Резерв компании', formatNumber(result.companyReserve)],
['Премиальный фонд АУП и коммерческого департамента', formatNumber(result.adminBonusFund)],
['Премиальный фонд производственного персонала', formatNumber(result.productionBonusFund), 'highlight'],
['ФЗП производственного персонала, участвующего в премировании', formatNumber(result.productionPayroll)],
['Размер премии на 1 производственного работника от нормативной ЗП', formatPercent(result.bonusPercent), 'highlight']
];
rows.forEach(row => {
const tr = document.createElement('tr');
if (row[2]) {
tr.className = row[2];
}
const td1 = document.createElement('td');
td1.textContent = row[0];
const td2 = document.createElement('td');
td2.textContent = row[1];
tr.appendChild(td1);
tr.appendChild(td2);
tbody.appendChild(tr);
});
document.getElementById('savingCard').textContent = formatNumber(result.saving);
document.getElementById('productionBonusCard').textContent = formatNumber(result.productionBonusFund);
document.getElementById('bonusPercentCard').textContent = formatPercent(result.bonusPercent);
if (result.saving > 0) {
conclusion.innerHTML = `
<h3>Вывод</h3>
По расчёту сформирована экономия ФЗП в размере <b>${formatNumber(result.saving)}</b>.
Из неё <b>${formatNumber(result.bonusFund)}</b> направляется в премиальный фонд.
Производственный персонал получает <b>${formatNumber(result.productionBonusFund)}</b>,
что составляет <b>${formatPercent(result.bonusPercent)}</b> от нормативной заработной платы.
Компания сохраняет резерв в размере <b>${formatNumber(result.companyReserve)}</b>.
`;
} else {
conclusion.innerHTML = `
<h3>Вывод</h3>
Экономия отсутствует. Фактический ФЗП выше нормативного уровня.
Премиальный фонд по модели Скэнлона не формируется.
`;
}
cards.style.display = 'grid';
table.style.display = 'table';
conclusion.style.display = 'block';
}
</script>
</body>
</html>