MACRO

Реестр расхождений графиков платежей и сумм договоров

Месторасположение отчёта: Отчёты → Финансы → Реестр расхождений графиков платежей и сумм договоров

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

#Работа с отчётом

Фильтры не предусмотрены. Отображаются все сделки с расхождением на текущий момент: объекты в статусе «Сделка в работе» или «Сделка проведена», по которым суммарный объём операций графика платежей не равен стоимости договора. При сравнении учитываются и оплаты (положительные операции), и возвраты (отрицательные).

#Структура отчёта

Категория — тип объекта: Квартира, Машино-место, Кладовая.

Объект — ссылка на карточку сделки. Содержит адрес объекта, площадь и стоимость. По клику открывается карточка сделки.

Контакт — покупатель по сделке.

Стоимость по договору — сумма сделки, зафиксированная в договоре.

Сумма по графику — суммарный объём операций графика платежей в статусах «Проведено» и «К оплате» с учётом знака. Оплаты учитываются со знаком плюс, возвраты — со знаком минус. Должна совпадать с итоговой суммой по графику в карточке сделки. Если значение равно нулю, операции по графику к договору не привязаны.

Проведено — сумма операций графика платежей в статусе «Проведено».

К оплате — сумма операций графика платежей в статусе «К оплате». Запланированные к выплате возвраты отображаются в этом столбце как отрицательные значения.

#Технический паспорт отчёта

Структура отчёта:

#Условия попадания в отчёт

Строка попадает в отчёт, если одновременно:

  • объект принадлежит текущей компании;
  • статус сделки — «Сделка в работе» или «Сделка проведена» (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)

Сумма сделки хранится непосредственно в сущности Сделка и не требует дополнительных связей помимо financesestate_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;