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

Платежі

Запис та відстеження платежів за об'єктами

Огляд

Модуль платежів дозволяє реєструвати оплати за комунальні послуги та роботу обслуговуючого персоналу. Кожен платіж прив'язаний до об'єкта нерухомості та може мати прикріплену квитанцію.

Облік платежів

Реєстрація платежів з сумою, датою та типом витрат

Завантаження квитанцій

Прикріплюйте 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