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

Валюта (Currency)

Поле типа Валюта предназначено для хранения денежных сумм с поддержкой различных валют и автоматическим форматированием.

Основные характеристики

  • Тип данных: Число с кодом валюты
  • Точность: До 2 знаков после запятой (настраивается)
  • Поддержка валют: Все основные мировые валюты (ISO 4217)
  • Автоматическое форматирование: Символ валюты, разделители тысяч
  • Конвертация: Поддержка конвертации между валютами

Настройки поля

При создании поля типа "Валюта" доступны следующие настройки:

  • Название поля: Отображаемое имя поля
  • Системное имя: Уникальный идентификатор для API
  • Описание: Подсказка для пользователей
  • Обязательное поле: Требовать заполнения
  • Валюта по умолчанию: RUB, USD, EUR и т.д.
  • Разрешенные валюты: Ограничение списка валют
  • Точность: Количество знаков после запятой (обычно 2)
  • Минимальное значение: Нижняя граница
  • Максимальное значение: Верхняя граница

Примеры использования

Цена товара

{
"name": "price",
"type": "currency",
"required": true,
"defaultCurrency": "RUB",
"min": 0
}

Зарплата

{
"name": "salary",
"type": "currency",
"defaultCurrency": "USD",
"allowedCurrencies": ["USD", "EUR", "RUB"]
}

Бюджет проекта

{
"name": "budget",
"type": "currency",
"required": true,
"defaultCurrency": "EUR"
}

Работа через API

Создание записи

const record = await emd.database.collection('products').create({
name: 'Ноутбук',
price: {
amount: 89990,
currency: 'RUB'
}
});

// Или упрощенный формат (если валюта по умолчанию)
const record = await emd.database.collection('products').create({
name: 'Ноутбук',
price: 89990 // Будет использована валюта по умолчанию
});

Получение значения

const record = await emd.database.collection('products').get(recordId);

console.log(record.price);
// {
// amount: 89990,
// currency: "RUB",
// formatted: "89 990 ₽",
// symbol: "₽",
// code: "RUB"
// }

Поиск по цене

// Товары дороже 50000 рублей
const products = await emd.database.collection('products').find({
'price.amount': { $gt: 50000 },
'price.currency': 'RUB'
});

// Товары в диапазоне цен
const products = await emd.database.collection('products').find({
'price.amount': { $gte: 10000, $lte: 100000 }
});

Обновление цены

await emd.database.collection('products').update(recordId, {
price: {
amount: 99990,
currency: 'RUB'
}
});

Форматирование

Автоматическое форматирование

const record = await emd.database.collection('products').get(recordId);

// Различные форматы
console.log(record.price.formatted); // "89 990 ₽"
console.log(record.price.formattedShort); // "89,9K ₽"
console.log(record.price.formattedLong); // "89 990,00 ₽"

Форматирование для разных локалей

const price = record.price;

// Русский формат
const ruFormat = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: price.currency
}).format(price.amount);
// "89 990,00 ₽"

// Американский формат
const usFormat = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
}).format(price.amount);
// "$89,990.00"

Поддерживаемые валюты

Основные валюты

  • RUB — Российский рубль (₽)
  • USD — Доллар США ($)
  • EUR — Евро (€)
  • GBP — Фунт стерлингов (£)
  • JPY — Японская иена (¥)
  • CNY — Китайский юань (¥)
  • CHF — Швейцарский франк (CHF)
  • CAD — Канадский доллар (C$)
  • AUD — Австралийский доллар (A$)

Получение списка валют

const currencies = await emd.database.getCurrencies();

console.log(currencies);
// [
// { code: 'RUB', name: 'Российский рубль', symbol: '₽' },
// { code: 'USD', name: 'Доллар США', symbol: '$' },
// ...
// ]

Конвертация валют

Получение курса валют

const rates = await emd.database.getExchangeRates('RUB');

console.log(rates);
// {
// base: 'RUB',
// rates: {
// USD: 0.011,
// EUR: 0.010,
// ...
// },
// updatedAt: '2025-11-25T10:00:00Z'
// }

Конвертация суммы

const record = await emd.database.collection('products').get(recordId);

// Конвертировать из RUB в USD
const convertedPrice = await emd.database.convertCurrency(
record.price.amount,
record.price.currency,
'USD'
);

console.log(convertedPrice);
// {
// amount: 989.89,
// currency: 'USD',
// formatted: '$989.89',
// rate: 0.011,
// originalAmount: 89990,
// originalCurrency: 'RUB'
// }

Автоматическая конвертация при получении

// Получить цену в определенной валюте
const record = await emd.database.collection('products').get(recordId, {
convertCurrency: {
price: 'USD'
}
});

console.log(record.price);
// {
// amount: 989.89,
// currency: 'USD',
// formatted: '$989.89',
// original: {
// amount: 89990,
// currency: 'RUB'
// }
// }

Математические операции

Увеличение цены

// Увеличить на 10%
const record = await emd.database.collection('products').get(recordId);
const newAmount = record.price.amount * 1.1;

await emd.database.collection('products').update(recordId, {
price: {
amount: newAmount,
currency: record.price.currency
}
});

Скидка

// Применить скидку 15%
const record = await emd.database.collection('products').get(recordId);
const discountedAmount = record.price.amount * 0.85;

await emd.database.collection('products').update(recordId, {
discounted_price: {
amount: discountedAmount,
currency: record.price.currency
}
});

Сумма

// Подсчитать общую стоимость корзины
const cartItems = await emd.database.collection('cart_items').find({
userId: currentUserId
});

const total = cartItems.reduce((sum, item) => {
return sum + (item.price.amount * item.quantity);
}, 0);

console.log({
amount: total,
currency: 'RUB',
formatted: new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
}).format(total)
});

Агрегация

Средняя цена

const avgPrice = await emd.database.collection('products').aggregate([
{
$match: { 'price.currency': 'RUB' }
},
{
$group: {
_id: null,
averagePrice: { $avg: '$price.amount' }
}
}
]);

Общая выручка

const totalRevenue = await emd.database.collection('orders').aggregate([
{
$match: {
status: 'completed',
'total.currency': 'RUB'
}
},
{
$group: {
_id: null,
total: { $sum: '$total.amount' }
}
}
]);

Валидация

Проверка минимальной суммы

{
"name": "price",
"type": "currency",
"min": 100,
"currency": "RUB"
}
try {
await emd.database.collection('products').create({
name: 'Товар',
price: {
amount: 50,
currency: 'RUB'
}
});
} catch (error) {
console.error(error.message); // "Price must be at least 100 RUB"
}

Отображение в интерфейсе

Цветовое кодирование

function getPriceColor(amount) {
if (amount < 1000) return 'green';
if (amount < 10000) return 'blue';
return 'red';
}

Сравнение цен

const product = await emd.database.collection('products').get(recordId);

if (product.discounted_price) {
return `
<span class="original-price">${product.price.formatted}</span>
<span class="discounted-price">${product.discounted_price.formatted}</span>
<span class="discount">-${Math.round((1 - product.discounted_price.amount / product.price.amount) * 100)}%</span>
`;
}

Рекомендации

  • Используйте тип Currency для всех денежных значений
  • Храните цены в минимальных единицах (копейки, центы) для точности
  • Всегда указывайте валюту явно
  • Используйте конвертацию для международных приложений
  • Обновляйте курсы валют регулярно
  • Учитывайте комиссии при конвертации
  • Используйте правильное форматирование для локали пользователя
  • Для криптовалют используйте большую точность (8 знаков)

Отличие от других типов

  • Currency vs Number: Currency включает валюту и форматирование
  • Currency vs String: Currency обеспечивает валидацию и математические операции
  • Currency vs Percent: Currency для денег, Percent для процентов