Перейти к основному содержимому

Проценты (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 для оценок (звезды)