Appearance
Связь лицевой счёт ↔ услуга дома: период действия (вариант B)
Назначение
Сущность PersonalAccountService (таблица personal_account_services) связывает индивидуальную услугу дома (HouseService, isCommonService = false) с одним или несколькими лицевыми счетами.
Расширение вариант B добавляет:
validFrom/validTo— интервал, в котором связь участвует в начислениях (оба включительно при проверке по календарному месяцуYYYY-MM).NULL= нет ограничения с этой стороны.sourceDocumentRef— внешняя ссылка на документ-основание (номер акта, претензии и т.д.).comment— произвольный комментарий.
Типовой сценарий: возмещение ущерба («потоп») — фиксированный платёж по ЛС в течение 1–3 месяцев по соглашению.
Ограничения
- Для одной пары (personal_account_id, house_service_id) допускается несколько строк с непересекающимися интервалами
[validFrom, validTo](например, повторное соглашение через год). - Уникальный индекс
(personal_account_id, house_service_id)снят; поиск по связям — составной индексidx_personal_account_services_pa_house. - Миграция:
services/core-service/migrations/003_personal_account_service_periods.sql.
API
PUT /api/house-services/:houseServiceId/personal-accounts
Тело (приоритет у personalAccounts):
json
{
"personalAccounts": [
{
"personalAccountId": 42,
"validFrom": "2025-03-01T00:00:00Z",
"validTo": "2025-05-31T23:59:59Z",
"sourceDocumentRef": "Акт №12 от 01.03.2025",
"comment": "Затопление соседями",
"isActive": true
}
]
}Legacy: {"personalAccountIds": [1,2,3]} — связи без дат (без ограничения по времени).
Пустой personalAccounts и пустой personalAccountIds — услуга ко всем ЛС дома (как раньше).
Интеграция с расчётом (billing-service)
При выборе услуг для начисления по ЛС и периоду period (формат YYYY-MM):
- Учитывать только связи с
is_active = true. - Вызывать
PersonalAccountService.AppliesToBillingPeriod(period)(или эквивалентную логику пересечения интервалов в сервисе биллинга при запросе данных из core).
До реализации движка начислений достаточно зафиксировать контракт в этом документе и фильтровать связи в коде, который готовит строки Charge.
Модель (core-service)
internal/models/personal_account_service.go— поля,Validate(),AppliesToBillingPeriod(),IntervalsOverlap(),ValidatePersonalAccountServiceLinks().