Главная › Библиотека › Платежи

Платежи

Запись и отслеживание платежей по объектам

Обзор

Модуль платежей позволяет регистрировать оплаты за коммунальные услуги и работу обслуживающего персонала. Каждый платёж привязан к объекту недвижимости и может иметь прикреплённую квитанцию.

Учёт платежей

Регистрация платежей с суммой, датой и типом затрат

Загрузка квитанций

Прикрепляйте PDF, JPG или PNG файлы как подтверждение оплаты

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

Собственник может подтвердить или отклонить платёж

Поддержка мультивалют

Платежи автоматически конвертируются в валюту страны объекта, если она отличается от валюты платежа.

Архитектура платежей

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

Коммунальные / расходы
Payment
↓
ExpenseChargeРасчетный период расходов
↓
PropertyExpenseНастройка регулярных расходов
↓
ExpenseProviderПоставщик услуг или пользователь-получатель
Аренда
Payment
↓
RentalChargeЕжемесячное начисление аренды
↓
ContractДоговор аренды с арендатором
Целостность данных: Каждый платёж должен быть привязан либо к начислению за коммунальные услуги, либо к начислению аренды. Оба типа одновременно не допускаются.

Типы получателей

Платёж может быть адресован одному из двух типов получателей:

Поставщик услуг

Компания-поставщик коммунальных услуг (ДТЭК, Нафтогаз, водоканал и т.д.)

Пользователь

Обслуживающий персонал (с ролью MAINTENANCE) за выполненную работу

Резервный вариант получателя: Система сначала пытается получить получателя из PropertyExpense → ExpenseProvider. Если не найдено, использует ExpenseCharge → ServiceProvider для обратной совместимости.

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

При просмотре платежа, если валюта платежа отличается от официальной валюты страны объекта, сумма автоматически отображается в обеих валютах:

150.00 €
(7,521.66 ₴)

Конвертация использует ежедневные курсы обмена от Национального банка Украины с EUR как базовой валютой.

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

  • UA (Ukraine) → UAH (₴)
  • PL (Poland) → PLN (zł)
  • MD (Moldova) → MDL (L)
  • RO (Romania) → RON (lei)
  • CZ (Czech Republic) → CZK (Kč)
  • Eurozone countries → EUR (€) - no conversion needed

Статусы подтверждения

Собственник или его агент могут установить статус подтверждения платежа:

Не указано

Статус по умолчанию при создании платежа

Подтверждено

Собственник проверил и подтвердил платёж

Отклонено

Собственник отклонил платёж как некорректный

Видимость платежей

Кто видит платежи зависит от роли пользователя на объекте:

Роль Видит
LANDLORD / LANDLORD_AGENT Все платежи (активные и неактивные)
TENANT / TENANT_AGENT Свои платежи + активные чужие
MAINTENANCE Только платежи, где он является получателем
Неактивные платежи Неактивные платежи (is_active=false) видит только автор или собственник/агент объекта.

Загрузка файлов

К платежу можно прикрепить квитанцию. Поддерживаемые форматы:

  • PDF - документы
  • JPG, JPEG, PNG - изображения
  • HEIC - фото с iPhone (конвертируется в JPG)

Файлы хранятся в облачном хранилище S3 с уникальным путём для каждого платежа.

Безопасный доступ к файлам: Все файлы платежей используют защищенные URL с подписью HMAC для предотвращения несанкционированного доступа. Прямые URL S3 никогда не раскрываются клиентам.

Связь с квитанциями

Платежи привязываются к квитанциям через таблицу PaymentAllocation. Несколько платежей можно объединить в одну квитанцию (например, аренда + коммунальные).

Payment Исходящий платеж от арендатора
↔
PaymentAllocation Связывает платеж с квитанцией с суммой распределения
↔
Receipt Подтверждение получения от арендодателя

Объединение в квитанцию

Одна квитанция может объединять несколько платежей (например, аренда + коммунальные в одной квитанции). Каждый платёж привязывается к квитанции с указанием суммы.

Мультивалютное распределение

Суммы распределения могут отличаться от сумм платежа/квитанции при разных валютах (автоматическая конвертация).

Узнать больше: Для подробной информации о квитанциях см. Квитанции.

REST API

Платежи доступны через REST API с JWT авторизацией:

GET    /api/v1/payments                              - Мои платежи
GET    /api/v1/properties/{id}/payments              - Платежи объекта
POST   /api/v1/properties/{id}/payments              - Создать платёж
GET    /api/v1/properties/{id}/payments/{pid}        - Детали платежа
PUT    /api/v1/properties/{id}/payments/{pid}        - Обновить платёж
DELETE /api/v1/properties/{id}/payments/{pid}        - Удалить платёж
POST   /api/v1/properties/{id}/payments/{pid}/confirm - Подтвердить
POST   /api/v1/properties/{id}/payments/{pid}/reject  - Отклонить

Запрос на создание

Коммунальные / расходы (коммунальные)

{
  "payment_date": "2026-01-15",
  "amount": "150.50",
  "currency_id": 1,
  "expense_charge_id": 42,
  "contract_id": 5,
  "payer_user_id": 10,
  "notes": "January electricity payment"
}

Аренда (аренда)

{
  "payment_date": "2026-02-05",
  "amount": "25000.00",
  "currency_id": 3,
  "rental_charge_id": 34,
  "contract_id": 31,
  "payer_user_id": 13,
  "notes": "February rent"
}
Обязательные поля: payment_date, amount, currency_id всегда обязательны. Укажите один из: expense_charge_id (коммунальные) или rental_charge_id (аренда).

Пример ответа

{
  "data": {
    "id": 1,
    "payment_type": "expense",
    "property_id": 5,
    "property_name": "Apartment Kyiv",
    "payment_date": "2026-01-15",
    "amount": "1500.00",
    "amount_formatted": "1,500.00 ₴",
    "currency": { "id": 3, "code": "UAH", "symbol": "₴" },
    "expense_type": { "id": 2, "code": "ELECTRICITY", "name_key": "expense_type.electricity" },
    "rental_charge": null,
    "service_provider": { "id": 3, "name": "Kyivenergo" },
    "recipient_user": null,
    "is_active": true,
    "owner_confirmation": "CONFIRMED",
    "has_file": true,
    "file_url": "https://llm.com/file/...",
    "file_name": "receipt.pdf"
  }
}

Ответ для платежа за аренду

{
  "data": {
    "id": 500,
    "payment_type": "rental",
    "property_id": 5,
    "payment_date": "2026-02-05",
    "amount": "25000.00",
    "currency": { "id": 3, "code": "UAH", "symbol": "₴" },
    "expense_type": null,
    "rental_charge": {
      "id": 34,
      "charge_date": "2026-03-05",
      "period_start": "2026-02-05",
      "period_end": "2026-03-04",
      "rental_days": 28,
      "amount": "25000.00"
    },
    "service_provider": null,
    "is_active": true,
    "owner_confirmation": "CONFIRMED"
  }
}

Примечания API

  • Поле payment_type указывает "expense" или "rental"
  • expense_charge_id связывает платеж с расчетным периодом
  • rental_charge_id привязывает платёж к периоду начисления аренды
  • expense_charge_id и rental_charge_id взаимоисключающие
  • Используйте payment_type=rental или payment_type=expense для фильтрации по типу
  • Конвертация валюты страны выполняется автоматически на фронтенде
  • file_url использует защищенные URL с подписью HMAC и ограниченным сроком действия

Swagger / OpenAPI

Полная документация API с возможностью тестирования доступна по адресу /api/v1/doc