Проценты (Percent)
Поле типа Проценты используется для хранения процентных значений с автоматическим форматированием.
Основные характеристики
- Тип данных: Число (0-100 или 0-1)
- Формат хранения: Десятичное число
- Автоматическое форматирование: Добавление символа %
- Точность: До 2 знаков после запятой (настраивается)
- Диапазон: Обычно 0-100%
Настройки поля
При создании поля типа "Проценты" доступны следующие настройки:
- Название поля: Отображаемое имя поля
- Системное имя: Уникальный идентификатор для API
- Описание: Подсказка для пользователей
- Обязательное поле: Требовать заполнения
- Формат хранения: Проценты (0-100) или доли (0-1)
- Минимальное значение: Обычно 0
- Максимальное значение: Обычно 100
- Точность: Количество знаков после запятой
- Значение по умолчанию: Начальное значение
Примеры использования
Скидка
{
"name": "discount",
"type": "percent",
"min": 0,
"max": 100,
"default": 0,
"precision": 0
}
НДС
{
"name": "vat",
"type": "percent",
"default": 20,
"readonly": true
}
Прогресс выполнения
{
"name": "completion",
"type": "percent",
"min": 0,
"max": 100,
"default": 0
}
Комиссия
{
"name": "commission",
"type": "percent",
"min": 0,
"max": 30,
"precision": 2,
"default": 5
}
Работа через API
Создание записи
const record = await emd.database.collection('products').create({
name: 'Товар',
price: 10000,
discount: 15 // 15%
});
Получение значения
const record = await emd.database.collection('products').get(recordId);
console.log(record.discount);
// {
// value: 15,
// formatted: "15%",
// decimal: 0.15
// }
Вычисление с процентами
const record = await emd.database.collection('products').get(recordId);
// Применить скидку
const originalPrice = record.price;
const discountPercent = record.discount.decimal;
const discountedPrice = originalPrice * (1 - discountPercent);
console.log(`Цена: ${originalPrice} ₽`);
console.log(`Скидка: ${record.discount.formatted}`);
console.log(`Цена со скидкой: ${discountedPrice} ₽`);
Обновление процента
await emd.database.collection('products').update(recordId, {
discount: 20
});
Форматирование
Различные форматы отображения
const record = await emd.database.collection('tasks').get(recordId);
console.log(record.completion.value); // 75
console.log(record.completion.formatted); // "75%"
console.log(record.completion.decimal); // 0.75
console.log(record.completion.fraction); // "3/4" (если применимо)
Форматирование с точностью
const percent = {
value: 15.5678,
precision: 2
};
const formatted = percent.value.toFixed(percent.precision) + '%';
// "15.57%"
Типичные сценарии использования
Скидки и акции
const product = await emd.database.collection('products').get(recordId);
if (product.discount.value > 0) {
const originalPrice = product.price;
const finalPrice = originalPrice * (1 - product.discount.decimal);
const savings = originalPrice - finalPrice;
console.log(`Скидка ${product.discount.formatted}`);
console.log(`Экономия: ${savings} ₽`);
}
Налоги
const order = await emd.database.collection('orders').get(recordId);
const subtotal = order.subtotal;
const vatPercent = order.vat.decimal;
const vatAmount = subtotal * vatPercent;
const total = subtotal + vatAmount;
await emd.database.collection('orders').update(recordId, {
vat_amount: vatAmount,
total: total
});
Прогресс задачи
const task = await emd.database.collection('tasks').get(recordId);
// Обновить прогресс
const completedSteps = 7;
const totalSteps = 10;
const completion = (completedSteps / totalSteps) * 100;
await emd.database.collection('tasks').update(recordId, {
completion: completion
});
Комиссии
const transaction = await emd.database.collection('transactions').get(recordId);
const amount = transaction.amount;
const commissionPercent = transaction.commission.decimal;
const commissionAmount = amount * commissionPercent;
const netAmount = amount - commissionAmount;
console.log(`Сумма: ${amount} ₽`);
console.log(`Комиссия (${transaction.commission.formatted}): ${commissionAmount} ₽`);
console.log(`К получению: ${netAmount} ₽`);
Поиск и фильтрация
Найти товары со скидкой
const products = await emd.database.collection('products').find({
'discount.value': { $gt: 0 }
});
Найти товары с большой скидкой
const products = await emd.database.collection('products').find({
'discount.value': { $gte: 50 }
});
Найти задачи близкие к завершению
const tasks = await emd.database.collection('tasks').find({
'completion.value': { $gte: 80, $lt: 100 }
});
Валидация
Ограничение диапазона
{
"name": "discount",
"type": "percent",
"min": 0,
"max": 100
}
try {
await emd.database.collection('products').create({
name: 'Товар',
discount: 150 // Больше максимума
});
} catch (error) {
console.error(error.message); // "Discount must be between 0 and 100"
}
Отображение в интерфейсе
Прогресс-бар
const task = await emd.database.collection('tasks').get(recordId);
const progressBar = `
<div class="progress-bar">
<div class="progress-fill" style="width: ${task.completion.value}%">
${task.completion.formatted}
</div>
</div>
`;
Цветовое кодирование
function getProgressColor(percent) {
if (percent < 30) return 'red';
if (percent < 70) return 'orange';
return 'green';
}
const task = await emd.database.collection('tasks').get(recordId);
const color = getProgressColor(task.completion.value);
Индикатор скидки
const product = await emd.database.collection('products').get(recordId);
if (product.discount.value > 0) {
return `
<span class="discount-badge" style="background: red; color: white;">
-${product.discount.formatted}
</span>
`;
}
Математические операции
Увеличение процента
const record = await emd.database.collection('products').get(recordId);
// Увеличить скидку на 5%
const newDiscount = Math.min(record.discount.value + 5, 100);
await emd.database.collection('products').update(recordId, {
discount: newDiscount
});
Вычисление процента от числа
function calculatePercent(value, percent) {
return value * (percent / 100);
}
const price = 10000;
const discount = 15;
const discountAmount = calculatePercent(price, discount);
// 1500
Вычисление процента изменения
function calculatePercentChange(oldValue, newValue) {
return ((newValue - oldValue) / oldValue) * 100;
}
const oldPrice = 10000;
const newPrice = 12000;
const change = calculatePercentChange(oldPrice, newPrice);
// 20 (увеличение на 20%)
Агрегация
Средний процент скидки
const avgDiscount = await emd.database.collection('products').aggregate([
{
$group: {
_id: null,
averageDiscount: { $avg: '$discount.value' }
}
}
]);
Средний прогресс задач
const avgCompletion = await emd.database.collection('tasks').aggregate([
{
$match: { status: 'in_progress' }
},
{
$group: {
_id: null,
averageCompletion: { $avg: '$completion.value' }
}
}
]);
Формулы с процентами
Вычисляемое поле
{
"name": "final_price",
"type": "formula",
"formula": "price * (1 - discount.decimal)"
}
Процент выполнения
{
"name": "completion",
"type": "formula",
"formula": "(completed_tasks / total_tasks) * 100"
}
Рекомендации
- Используйте тип Percent для всех процентных значений
- Храните проценты как числа (0-100), а не доли (0-1)
- Устанавливайте разумные ограничения (обычно 0-100)
- Используйте точность 0 для целых процентов, 2 для дробных
- Для прогресса используйте диапазон 0-100
- Для скидок ограничивайте максимальное значение
- Визуализируйте проценты с помощью прогресс-баров
- Учитывайте округление при вычислениях
Специальные случаи
Проценты больше 100%
{
"name": "growth",
"type": "percent",
"min": 0,
"max": 1000 // Для роста может быть больше 100%
}
Отрицательные проценты
{
"name": "change",
"type": "percent",
"min": -100,
"max": 100 // Для изменений (рост/падение)
}
Отличие от других типов
- Percent vs Number: Percent для процентных значений с форматированием
- Percent vs Currency: Percent для процентов, Currency для денег
- Percent vs Rating: Percent для процентов, Rating для оценок (звезды)