Месторасположение отчёта: Отчёты → Финансы → Реестр расхождений графиков платежей и сумм договоров
Отчёт показывает сделки, в которых суммарный объём операций графика платежей не совпадает со стоимостью договора. Используется финансовым блоком и руководителями продаж для выявления некорректно оформленных графиков.

#Работа с отчётом
Фильтры не предусмотрены. Отображаются все сделки с расхождением на текущий момент: объекты в статусе «Сделка в работе» или «Сделка проведена», по которым суммарный объём операций графика платежей не равен стоимости договора. При сравнении учитываются и оплаты (положительные операции), и возвраты (отрицательные).
#Структура отчёта
Категория — тип объекта: Квартира, Машино-место, Кладовая.
Объект — ссылка на карточку сделки. Содержит адрес объекта, площадь и стоимость. По клику открывается карточка сделки.
Контакт — покупатель по сделке.
Стоимость по договору — сумма сделки, зафиксированная в договоре.
Сумма по графику — суммарный объём операций графика платежей в статусах «Проведено» и «К оплате» с учётом знака. Оплаты учитываются со знаком плюс, возвраты — со знаком минус. Должна совпадать с итоговой суммой по графику в карточке сделки. Если значение равно нулю, операции по графику к договору не привязаны.
Проведено — сумма операций графика платежей в статусе «Проведено».
К оплате — сумма операций графика платежей в статусе «К оплате». Запланированные к выплате возвраты отображаются в этом столбце как отрицательные значения.
#Технический паспорт отчёта
Структура отчёта:

#Условия попадания в отчёт
Строка попадает в отчёт, если одновременно:
- объект принадлежит текущей компании;
- статус сделки — «Сделка в работе» или «Сделка проведена» (
estate_deals.deal_status IN (110, 150)); - по сделке есть финансовые операции, тип которых входит в типы графика платежей, в статусе «Проведено» или «К оплате» (
finances.status_name IN ('Проведено', 'К оплате')); - суммарный объём таких операций с учётом знака не равен стоимости по договору (
SUM(finances.summa) ≠ estate_deals.deal_sum).
#Данные в системе
Категория (1) и Объект (2)
Данные об объекте недвижимости хранятся в сущности Объект. Для их получения настройте связь между finances и estate_deals, а затем между estate_deals и estate_sells.
Принцип выбора данных в MacroData без учёта дополнительных фильтров:
SELECT
finances.id,
CASE estate_sells.estate_sell_category
WHEN 'flat' THEN 'Квартира'
WHEN 'garage' THEN 'Машино-место'
WHEN 'storageroom' THEN 'Кладовая'
END AS `Категория`,
estate_sells.estate_sell_id AS `ID объекта`
FROM finances
LEFT JOIN estate_deals ON finances.deal_id = estate_deals.deal_id
LEFT JOIN estate_sells ON estate_deals.estate_sell_id = estate_sells.estate_sell_id
WHERE estate_deals.deal_status IN (110, 150)
AND finances.status_name IN ('Проведено', 'К оплате')
AND finances.deal_id IN (
SELECT f.deal_id
FROM finances f
LEFT JOIN estate_deals ed ON f.deal_id = ed.deal_id
WHERE f.status_name IN ('Проведено', 'К оплате')
AND ed.deal_status IN (110, 150)
GROUP BY f.deal_id, ed.deal_sum
HAVING SUM(f.summa) <> ed.deal_sum
)
ORDER BY finances.id;
Контакт (3)
Покупатель по сделке хранится в сущности Участники сделки. Настройте связь между finances и estate_deals_participants по deal_id, затем — между estate_deals_participants и contacts.
Принцип выбора данных в MacroData без учёта дополнительных фильтров:
SELECT
finances.id,
contacts.contacts_buy_name AS `Контакт`
FROM finances
LEFT JOIN estate_deals ON finances.deal_id = estate_deals.deal_id
LEFT JOIN estate_deals_participants edp
ON finances.deal_id = edp.deal_id
AND edp.deal_role = 'buyer_main'
LEFT JOIN contacts ON edp.contacts_id = contacts.contacts_id
WHERE estate_deals.deal_status IN (110, 150)
AND finances.status_name IN ('Проведено', 'К оплате')
AND finances.deal_id IN (
SELECT f.deal_id
FROM finances f
LEFT JOIN estate_deals ed ON f.deal_id = ed.deal_id
WHERE f.status_name IN ('Проведено', 'К оплате')
AND ed.deal_status IN (110, 150)
GROUP BY f.deal_id, ed.deal_sum
HAVING SUM(f.summa) <> ed.deal_sum
)
ORDER BY finances.id;
Стоимость по договору (4)
Сумма сделки хранится непосредственно в сущности Сделка и не требует дополнительных связей помимо finances → estate_deals.
Принцип выбора данных в MacroData без учёта дополнительных фильтров:
SELECT
finances.id,
estate_deals.deal_sum AS `Стоимость по договору`
FROM finances
LEFT JOIN estate_deals ON finances.deal_id = estate_deals.deal_id
WHERE estate_deals.deal_status IN (110, 150)
AND finances.status_name IN ('Проведено', 'К оплате')
AND finances.deal_id IN (
SELECT f.deal_id
FROM finances f
LEFT JOIN estate_deals ed ON f.deal_id = ed.deal_id
WHERE f.status_name IN ('Проведено', 'К оплате')
AND ed.deal_status IN (110, 150)
GROUP BY f.deal_id, ed.deal_sum
HAVING SUM(f.summa) <> ed.deal_sum
)
ORDER BY finances.id;
Сумма по графику (5), Проведено (6), К оплате (7)
Все три показателя рассчитываются из таблицы finances агрегацией по статусу операции. Возвраты средств клиенту учитываются с отрицательным знаком и вычитаются из суммы. Условие расхождения применяется через HAVING.
Принцип выбора данных в MacroData без учёта дополнительных фильтров:
SELECT
estate_deals.deal_id,
SUM(finances.summa) AS `Сумма по графику`,
SUM(CASE WHEN finances.status_name = 'Проведено' THEN finances.summa ELSE 0 END) AS `Проведено`,
SUM(CASE WHEN finances.status_name = 'К оплате' THEN finances.summa ELSE 0 END) AS `К оплате`
FROM finances
LEFT JOIN estate_deals ON finances.deal_id = estate_deals.deal_id
WHERE finances.status_name IN ('Проведено', 'К оплате')
AND estate_deals.deal_status IN (110, 150)
GROUP BY estate_deals.deal_id, estate_deals.deal_sum
HAVING SUM(finances.summa) <> estate_deals.deal_sum
ORDER BY estate_deals.deal_id;