Skip to content

Latest commit

 

History

History
4360 lines (3840 loc) · 259 KB

trend.org

File metadata and controls

4360 lines (3840 loc) · 259 KB

Trend

Что мы знаем о рынке недвижимости

Рынок недвижимости это аренда и продажа. Внутри этих разделов продается все - от квартир и комнат до участков и коммерческой недвижимости

Продажа

Квартиры в новостройках

Жилые комплексы

В исходной БД жилые комплексы определены так:

FieldTypeNullKeyDefaultExtra
idbinary(16)NOPRINULL
nb_sourceIdtinyint(4) unsignedNOMUL1
statusIdtinyint(4) unsignedNOMUL1
developerIdbinary(16)NOMULNULL
date_inserttimestampNOCURRENT_TIMESTAMP
date_updatedatetimeNONULL
regionIdint(11) unsignedNOMULNULL
districtIdint(11) unsignedNOMULNULL
district_namevarchar(255)YESNULL
city_namevarchar(255)YESNULL
street_namevarchar(255)YESNULL
subway1Idint(11) unsignedYESNULL
subway2Idint(11) unsignedYESNULL
subway3Idint(11) unsignedYESNULL
namevarchar(250)NOMULNULL
notetextYESNULL
longitudedecimal(18,10)YESNULL
latitudedecimal(18,10)YESNULL
dateUpdatedatetimeYESNULL
isPrivatetinyint(1)NOMUL0
bknIdbinary(16)YESMULNULL

А в целевой БД мы определили жилые комплексы в основном файле проекта в разделе Жилые комплексы

У каждого ЖК есть статус - например: активный или архивный (есть и другие)

У каждого ЖК есть источник данных - обычно это агентство, от которого получена информация об этом ЖК.

У каждого ЖК есть регион, район и несколько ближайших станций метро.

В каждом ЖК есть корпуса, т.е. построенные или строящиеся внутри проекта ЖК дома. Они могут быть объединены в очереди сдачи. У каждого корпуса есть адрес дома.

Корпуса могут быть в разных состояниях готовности, для этого у них есть поле status_buildId, указывающее на таблицу status_build, в которых эти состояния перечислены

SELECT DISTINCT
    REPLACE(REPLACE(bkn.name, '«', ''), '»', '') AS name,
    u.unidecode AS unidecode,
    du.unidecode AS developer_unidecode,
    toguid(ap.id) AS complexId,
    ap.regionId AS regionId,
    REPLACE(REPLACE(d.name, '«', ''), '»', '') AS developer,
    toguid(d.id) AS developerId,
    CONCAT('/BuildingComplexes/complex/', u.unidecode) AS complexLink,
    CONCAT('/BuildingComplexes/developers/', du.unidecode) AS developerLink,
    ap.city_name AS city_name,
    ap.street_name AS street_name,
    sbw.name AS subway,
    ap.subway1Id AS subwayId,
    ap.district_name AS district,
    ap.districtId AS districtId,
    ap.latitude,
    ap.longitude,
    ap.nb_sourceId AS sourceId,
    (SELECT
            CONCAT('http://alexander.pro.bkn.ru/images/b_preview/',
                        filename)
        FROM
            bkn_base.nb_photos ph
        WHERE
            ph.objectId = ap.id
        LIMIT 1) AS photo,
    (SELECT
            COUNT(*)
        FROM
            bkn_base.nb_photos ph
        WHERE
            ph.objectId = ap.id) AS pcount,
    (SELECT
            status_buildId
        FROM
            bkn_base.nb_block bl
        WHERE
            bl.nb_complexId = ap.id
                AND bl.statusId = 1
        ORDER BY bl.status_buildId
        LIMIT 1) AS status_buildId,
    (SELECT
            CONCAT(bl.quarter_end, '-', bl.year_end)
        FROM
            bkn_base.nb_block bl
        WHERE
            bl.nb_complexId = ap.id
                AND bl.statusId = 1
                AND bl.quarter_end IS NOT NULL
                AND bl.year_end IS NOT NULL
        ORDER BY bl.year_end
        LIMIT 1) AS year_end_min_string,
    (SELECT
            CONCAT(bl.quarter_end, '-', bl.year_end)
        FROM
            bkn_base.nb_block bl
        WHERE
            bl.nb_complexId = ap.id
                AND bl.statusId = 1
                AND bl.quarter_end IS NOT NULL
                AND bl.year_end IS NOT NULL
        ORDER BY bl.year_end DESC
        LIMIT 1) AS year_end_max_string,
    (SELECT
            COUNT(*)
        FROM
            bkn_base.nb_block bl
        WHERE
            bl.nb_complexId = ap.id
                AND bl.statusId = 1
        ORDER BY bl.year_end DESC
        LIMIT 1) AS bcount,
    (SELECT
            MIN(amount)
        FROM
            bkn_base.nb_appartment apa
                INNER JOIN
            bkn_base.nb_block bl ON apa.nb_blockId = bl.id
                AND bl.statusId = 1
        WHERE
            bl.nb_complexId = ap.id
                AND apa.statusId = 1
                AND apa.obj_typeId IN (1 , 3, 6)) AS minamount,
    (SELECT
            MIN(amount_metr)
        FROM
            bkn_base.nb_appartment apa
                INNER JOIN
            bkn_base.nb_block bl ON apa.nb_blockId = bl.id
                AND bl.statusId = 1
        WHERE
            bl.nb_complexId = ap.id
                AND apa.statusId = 1
                AND apa.obj_typeId IN (1 , 3, 6)) AS minamount_metr
FROM
    bkn_base.nb_complex bkn
        INNER JOIN
    bkn_base.nb_complex ap FORCE INDEX (AP) ON bkn.id = ap.bknid
        AND ap.nb_sourceId IN (1 , 3)
        AND ap.statusId = 1
        AND ap.isPrivate = 0
        LEFT JOIN
    bkn_base.subway sbw ON sbw.id = ap.subway1Id
        INNER JOIN
    bkn_base.developer d ON d.id = ap.developerId
        INNER JOIN
    bkn_base.unidecode u ON u.guid = ap.id AND u.type = 0
        INNER JOIN
    bkn_base.unidecode du ON du.guid = d.id AND du.type = 1
        INNER JOIN
    bkn_base.nb_block b ON b.nb_complexId = ap.id
        AND b.statusId = 1
        INNER JOIN
    bkn_base.nb_appartment a ON b.id = a.nb_blockId AND a.statusId = 1
        AND a.obj_typeId IN (1 , 3, 6)
WHERE
    bkn.nb_sourceId = 2 AND bkn.statusId = 1
ORDER BY ap.name
LIMIT $from, $cnt;

Таким образом мы можем получить все ЖК которые нам нужны и связанные с ними данные

Напишем функцию, которая возвращает все жилые комплексы.

Теперь будем обрабатывать получаемые из исходной базы данных комплексы, пытаясь найти соответствия в целевой БД. Если ничего похожего не нашли - добавляем комплекс в целевую БД. Добавляя, мы переносим также все связанные с комплексом данные - его застройщика, корпуса и квартиры.

Функция проверки на совпадение переданного комплекса cmpx с кандидатом candidat на совпадение из нашей целевой базы данных. Мы считаем, что если у комплекса совпадает название и guid застройщика - то это однозначное совпадение.

Запрос для получения застройщиков

SELECT
    toguid(d.id) AS guid,
    REPLACE(REPLACE(d.name, '«', ''), '»', '') AS name,
    d.deleted,
    d.address,
    d.url,
    d.phone,
    d.note,
    c.phone,
    c.logo,
    c.url,
    c.email,
    CONVERT (c.enabled, SIGNED) AS enabled,
    c.name
FROM
    bkn_base.developer d
        INNER JOIN
    bkn_base.developer_customs c ON c.developerId = d.id
WHERE
    d.id = guidtobinary('$developerId')
guidnamedeletedaddressurlphonenotephonelogourlemailenabledname
6945CE85-8335-11E4-B6C0-448A5BD44C07ЛСР-Недвижимость-СЗ0СПб, Кирочная ул., 39http://www.lsr.ru(812) 325-01-01<span style=”color: rgb(102, 102, 102); font-family: Verdana, Arial, Geneva, Helvetica, sans-serif; font-size: 13px; text-align: justify;”>Компания «</span><strong style=”color: rgb(102, 102, 102); font-family: Verdana, Arial, Geneva, Helvetica, sans-serif; font-size: 13px; text-align: justify;”>ЛСР. Недвижимость&nbsp;— Северо-Запад</strong><span style=”color: rgb(102, 102, 102); font-family: Verdana, Arial, Geneva, Helvetica, sans-serif; font-size: 13px; text-align: justify;”>», до&nbsp;2013 года известная как ГДСК («Городская ДомоСтроительная Компания»), занимается строительством объектов недвижимости более 10&nbsp;лет. На&nbsp;сегодняшний день это один из&nbsp;ведущих застройщиков Санкт-Петербурга. Основное направление «ЛСР. Недвижимость&nbsp;— Северо-Запад» - строительство жилых комплексов сегмента масс-маркет в&nbsp;Санкт-Петербурге. В&nbsp;основе позиционирования объектов компании - комфортное жилье по&nbsp;доступной цене.&nbsp; Квартиры от&nbsp;застройщика «ЛСР. Недвижимость&nbsp;— Северо-Запад», построенные с&nbsp;использованием передовых технологий, соответствуют европейским стандар-там качества. Продажа квартир в&nbsp;строящихся домах осуществляется путем заключения договоров долевого участия в&nbsp;рамках Федерального Закона №&nbsp;214. Соблюдение сроков строительства позволяет компании поддерживать репутацию одного из&nbsp;самых надежных застройщиков Петербурга, предлагающих качественное и&nbsp;в&nbsp;то&nbsp;же время доступное жилье.&nbsp;</span>(812)325-01-01logo_lsr.pnghttp://www.lsr.ru/NULL1ЛСР-Недвижимость-СЗ

Тут нужно еще выкидывать теги

Теперь нужна функция, которая превращает комплекс в правильный plist, удаляя форматирование, если оно есть:

Теперь берем всех активных застройщиков из целевой БД, которых мы получили на предыдущем шаге, получаем все их комплексы из исходной базы и сохраняем в целевую

А вот так можно то же самое получить из EmacsLisp

Это запрос для получения всех комплексов (с необходимыми джойнами)

SELECT
    toguid(ap.id)
  , REPLACE(REPLACE(bkn.name, '«', ''), '»', '') AS name
  , ap.nb_sourceId
  , ap.statusId
  , ap.regionId
  , ap.districtId
  , ap.district_name
  , ap.city_name
  , ap.street_name
  , ap.subway1Id
  , ap.subway2Id
  , ap.subway3Id
  , ap.note
  , ap.longitude
  , ap.latitude
  , ap.dateUpdate
  , ap.isPrivate
  , toguid(ap.bknId)
FROM
    nb_complex bkn
        INNER JOIN
    developer d ON d.id = bkn.developerId
        INNER JOIN
    nb_complex ap FORCE INDEX (AP) ON bkn.id = ap.bknid
        AND ap.nb_sourceId IN (1 , 3)
        AND ap.statusId = 1
        AND ap.isPrivate = 0
        INNER JOIN
    nb_block b ON b.nb_complexId = ap.id
        AND b.statusId = 1
        INNER JOIN
    nb_appartment a ON b.id = a.nb_blockId AND a.statusId = 1
WHERE
        bkn.nb_sourceId = 2
    AND bkn.statusId = 1
    AND d.id = guidtobinary('$developerId')
GROUP BY ap.id , bkn.name , ap.nb_sourceId , d.id , d.name
ORDER BY name

Теперь можно сделать страничку комплекса

Застройщики

У нас есть некоторое количество (423) застройщиков, которые строят жилые комплексы. Квартиры в этих жилых комплексах продаются как самим застройщиком (его отделом продаж) так агенствами недвижимости и субагентами.

В исходной бд застройщики определены так:

FieldTypeNullKeyDefaultExtra
idbinary(16)NOPRINULL
namevarchar(255)NONULL
sortIndextinyint(4) unsignedNO0
deletedtinyint(1)NO0
dateUpdatedatetimeYESNULL
addressvarchar(255)YESNULL
urlvarchar(50)YESNULL
phonevarchar(50)YESNULL
notetextYESNULL

А в целевой БД мы определили застройщиков в основном файле проекта, в разделе <a href=”file:doc.org::Застройщики (developer)”>Застройщики

Это позволяет написать функцию, которая будет преобразовывать застройщика из исходной БД и класть его в целевую. Вот запрос, которым мы можем получать всех застройщиков, которые имеют активные корпуса в активных комплексах и isPrivate этих комплексах равно нулю. IsPrivate - флаг приватности, говорит о том, что эти комплексы нельзя рекламировать.

SELECT
    toguid(d.id) AS developerId,
    REPLACE(REPLACE(d.name, '«', ''), '»', '') AS developer_name,
    d.address,
    d.url,
    d.phone,
    d.note
FROM
    nb_complex cmpx
INNER JOIN
    developer d  ON  d.id = cmpx.developerId
INNER JOIN
    nb_complex ap FORCE INDEX (AP)  ON  cmpx.id = ap.bknid  AND  ap.nb_sourceId IN (1 , 3)  AND  ap.statusId = 1  AND  ap.isPrivate = 0
INNER JOIN
    nb_block b  ON  b.nb_complexId = ap.id  AND  b.statusId = 1
INNER JOIN
    nb_appartment a  ON  b.id = a.nb_blockId  AND  a.statusId = 1
WHERE
    cmpx.nb_sourceId = 2  AND  cmpx.statusId = 1
GROUP BY d.id , d.name
ORDER BY d.name
LIMIT $limit;

Обернув его в макрос, который осуществляет подключение к mysql и установку кодировки мы можем получить всех застройщиков, имеющих активные комплексы:

То же в EmacsLisp

Застройщики имеют описание, в котором есть html-форматирование, которое хотелось бы удалить. Я использую для этого php-функцию strip_tags

Вот так я вызывают PHP из Common Lisp:

А вот так можно вызвать его из Emacs Lisp:

Теперь всех полученных застройщиков можно сохранить в PostgreSQL:

Теперь, когда все застройщики у нас в базе - их можно отобразить в веб-интерфейсе. На странице застройщика оставим placeholder для того чтобы позже отобразить все жилые комплексы этого застройщика.

Корпуса жилых комплексов

В исходной БД корпуса жилых комплексов определены так:

FieldTypeNullKeyDefaultExtra
nb_sourceIdtinyint(4) unsignedNOMUL2
idbinary(16)NOPRINULL
nb_complexIdbinary(16)NOMULNULL
statusIdtinyint(4) unsignedNOMUL1
status_buildIdtinyint(4) unsignedYESNULL
housevarchar(15)YESNULL
blockvarchar(15)YESNULL
literavarchar(50)YESNULL
floorsvarchar(20)YESNULL
quarter_endtinyint(4) unsignedYESNULL
year_endsmallint(6) unsignedYESNULL
house_typeIdtinyint(4) unsignedYESNULL
bknIdbinary(16)YESNULL
dateUpdatedatetimeYESNULL

А в целевой БД мы определили жилые комплексы в основном файле проекта в разделе Корпуса жилых комплексов

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

SELECT toguid(id), nb_sourceId, toguid(nb_complexId), statusId, status_buildId, house, block, litera, floors, quarter_end, year_end, house_typeId, toguid(bknId), dateUpdate, toguid(nb_complexId)
FROM nb_block
WHERE
   nb_sourceId IN (2)
AND
   nb_complexId = guidtobinary('$complexId')

Напишем функцию, которая возвращает все жилые комплексы конкретного застройщика

Теперь нужна функция, которая превращает комплекс в правильный plist, удаляя форматирование, если оно есть:

Теперь для каждого блока получаем и перебрасываем в новую базу все его корпуса:

===TODO===

Данные комплексов

Здесь мы соберем все данные которые у нас есть по всем жилым комплексам. Все активные комплексы можно получить вот таким запросом:

SELECT
    toguid(ap.id),
    REPLACE(REPLACE(bkn.name, '«', ''),
        '»',
        '') AS name,
    ap.nb_sourceId,
    toguid(d.id) AS developerId,
    REPLACE(REPLACE(d.name, '«', ''),
        '»',
        '') AS developer_name,
    ap.statusId,
    ap.regionId,
    ap.districtId,
    ap.district_name,
    ap.city_name,
    ap.street_name,
    ap.subway1Id,
    ap.subway2Id,
    ap.subway3Id,
    ap.note,
    ap.longitude,
    ap.latitude,
    ap.dateUpdate,
    ap.isPrivate,
    toguid(ap.bknId)
FROM
    bkn_base.nb_complex bkn
        INNER JOIN
    bkn_base.developer d ON d.id = bkn.developerId
        INNER JOIN
    bkn_base.nb_complex ap FORCE INDEX (AP) ON bkn.id = ap.bknid
        AND ap.nb_sourceId IN (1 , 3)
        AND ap.statusId = 1
        AND ap.isPrivate = 0
        INNER JOIN
    bkn_base.nb_block b ON b.nb_complexId = ap.id
        AND b.statusId = 1
        INNER JOIN
    bkn_base.nb_appartment a ON b.id = a.nb_blockId AND a.statusId = 1
WHERE
    bkn.nb_sourceId = 2 AND bkn.statusId = 1
GROUP BY ap.id , bkn.name , ap.nb_sourceId , d.id , d.name
ORDER BY name
LIMIT 3

В процесе сбора данных будем забирать все корпуса этих комплексов

select toguid(id), nb_sourceId, toguid(nb_complexId), statusId, status_buildId, house, block, litera, floors, quarter_end, year_end, house_typeId, bknId from nb_block limit $thevar;
toguid(id)nb_sourceIdtoguid(nb_complexId)statusIdstatus_buildIdhouseblockliterafloorsquarter_endyear_endhouse_typeIdbknId
BC594F00-300C-11E3-B13F-5404A6B2016129DFF6CEF-D7EE-11E4-9FBB-448A5BD44C071NULLNULLNULLуч.19-17220142NULL
03DA6000-C403-11E4-9FBB-448A5BD44C0729DFFDAC4-D7EE-11E4-9FBB-448A5BD44C071NULL236NULL5-8,18-20320152NULL
FF646B00-EA65-11E4-81F1-448A5BD44C0729E0006F5-D7EE-11E4-9FBB-448A5BD44C071121NULL251201622NULL
(save-excursion
  (replace-regexp-in-string "\"\"" ""
   (mapconcat
    (lambda (x)
      (org-babel-goto-named-src-block x)
      (format "%S" (cadr  (org-babel-get-src-block-info  t))))
    (split-string blk "," t)
    sep)
   t t))
(org-babel-execute-src-block "my_query")

Источники данных

Комплекс может прийти к нам от разных агенств. Источники собраны здесь, в таблице nb_source

fieldfield typenote
idtinyint(4) unsignedЧисловой идентификатор
namevarchar(255)Название источника
sortIndextinyint(4) unsignedИндекс сортировки
deletedtinyint(1)Признак удаленного
idnamesortIndexdeleted
1АЛЕКСАНДР Недвижимость00
2БКН-Профи00
3Пет.Недвижимость00

Статусы комплексов

fieldfield typenote
idtinyint(4) unsignedЧисловой идентификатор
namevarchar(40)Название статуса
nameShortvarchar(20)Короткое название статуса
sortIndextinyint(4) unsignedИндекс сортировки
deletedtinyint(1)Признак удаленного
idnamenameShortsortIndexdeleted
1Активные объектыАктивно10
2Архивные объектыАрхивно20
3Арендованные объектыСдано30
4Проданные объектыПродано40
5Удаленные объектыУдалено50

Регионы

fieldfield typenote
idint(11) unsignedЧисловой идентификатор
namevarchar(255)Название региона
sortIndextinyint(4) unsignedИндекс сортировки
deletedtinyint(1)Признак удаленного
idnamesortIndexdeleted
1Санкт-Петербург00
4000Москва20
4331Республика Карелия2550
4332Новгородская область2550
5001Ленинградская область10
16417Псковская область2550
17500Краснодарский край2550
17600Московская область30
17801Калининградская область2550
26500Вологодская область2550
26600Пензенская область2550
26700Тверская область2550
26926Ставропольский край2550
27475Ивановская область2550
27600Астраханская область2550
27700Мурманская область2550
27800Нижегородская область2550
28200Красноярский Край2550
40000Тульская область2550
40113Ярославская область2550
40122Крым респ.2550
40196Севастополь2550
41923Калужская область2550
41961Ростовская область2550
42202Воронежская область2550

Районы

fieldfield typenote
idint(11) unsignedNO
regionIdint(11) unsignedNO
namevarchar(255)NO
sortIndextinyint(4) unsignedNO
deletedtinyint(1)NO
idregionIdnamesortIndexdeleted
41Адмиралтейский00
51Василеостровский00
61Выборгский00
71Калининский00
81Кировский00
91Красносельский00
101Московский00
111Невский00
121Петроградский00
131Приморский00
141Фрунзенский00
151Центральный р-н00
411Красногвардейский00
43334331Лахденпохский р-н00
43344332Чудовский р-н00
50025001Бокситогорский р-н00
50035001Волосовский р-н00
50045001Волховский р-н00
50055001Всеволожский р-н00
50065001Выборгский р-н00
50075001Гатчинский р-н00
50085001Кингисеппский р-н00
50095001Киришский р-н00
50105001Кировский р-н00
50115001Лодейнопольский р-н00
50125001Ломоносовский р-н00
50135001Лужский р-н00
50145001Подпорожский р-н00
50155001Приозерский р-н00
50165001Сланцевский р-н00
50175001Тихвинский р-н00
50185001Тосненский р-н00
130011Колпинский р-н00
130021Кронштадтский р-н00
130031Курортный р-н00
130041Петродворцовый р-н00
130051Пушкинский р-н00
159844332Новгородский р-н00
1641816417Гдовский р-н00
1644616417Опочецкий р-н00
166004332Валдайский р-н00
166024332Маловишерский р-н00
166054332Старорусский р-н00
1660716417Порховский р-н00
1661016417Пушкиногорский р-н00
166244331Прионежский р-н00
166254331Беломорский р-н00
166264331Калевальский р-н00
166274331Кемский р-н00
166284331Кондопожский р-н00
166304331Лоухский р-н00
166314331Медвежьегорский р-н00
166324331Муезерский р-н00
166334331Олонецкий р-н00
166344331Питкярантский р-н00
166354331Пряжинский р-н00
166364331Пудожский р-н00
166374331Сегежский р-н00
166384331Суоярвский р-н00
166524332Любытинский р-н00
1665316417Бежаницкий р-н00
1665416417Псковский р-н00
1665516417Великолукский р-н00
1665616417Дедовичский р-н00
1665716417Дновский р-н00
1665816417Красногородский р-н00
1666016417Локнянский р-н00
1666116417Невельский р-н00
1666216417Новоржевский р-н00
1666316417Новосокольнический р-н00
1666416417Островский р-н00
1666516417Палкинский р-н00
1666616417Печорский р-н00
1666716417Плюсский р-н00
1666816417Пустошкинский р-н00
1666916417Пыталовский р-н00
1667016417Себежский р-н00
1667116417Струго-Красненский р-н00
169634332Хвойнинский р-н00
1750117500Абинский р-н00
1750217500Анапский р-н00
1750317500Апшеронский р-н00
1750417500Белоглинский р-н00
1750517500Белореченский р-н00
1750817500Гулькевичский р-н00
1751017500Ейский р-н00
1751417500Кореновский р-н00
1751717500Крымский р-н00
1751817500Курганинский р-н00
1752017500Лабинский р-н00
1752217500Мостовский р-н00
1752317500Новокубанский р-н00
1752717500Приморско-Ахтарский р-н00
1752817500Северский р-н00
1752917500Славянский р-н00
1753217500Темрюкский р-н00
1753317500Тимашевский р-н00
1753417500Тихорецкий р-н00
1753517500Туапсинский р-н00
1753617500Успенский р-н00
1753717500Усть-Лабинский р-н00
1753817500Щербиновский р-н00
1760117600Балашихинский р-н00
1760217600Волоколамский р-н00
1760317600Воскресенский р-н00
1760417600Дмитровский р-н00
1760517600Домодедовский р-н00
1760617600Егорьевский р-н00
1760717600Зарайский р-н00
1760817600Истринский р-н00
1760917600Каширский р-н00
1761017600Клинский р-н00
1761217600Красногорский р-н00
1761317600Ленинский р-н00
1761417600Лотошинский р-н00
1761517600Луховицкий р-н00
1761617600Люберецкий р-н00
1761717600Можайский р-н00
1761817600Мытищинский р-н00
1761917600Наро-Фоминский р-н00
1762017600Ногинский р-н00
1762117600Одинцовский р-н00
1762217600Озерский р-н00
1762417600Павлово-Посадский р-н00
1762617600Пушкинский р-н00
1762717600Раменский р-н00
1762817600Рузский р-н00
1763217600Солнечногорский р-н00
1763317600Ступинский р-н00
1763417600Талдомский р-н00
1763517600Химкинский р-н00
1763617600Чеховский р-н00
1763717600Шатурский р-н00
1763817600Шаховской р-н00
1763917600Щелковский р-н00
1780217801Багратионовский р-н00
1780317801Гвардейский р-н00
1780417801Гурьевский р-н00
1780517801Гусевский р-н00
1780617801Зеленоградский р-н00
1780717801Краснознаменский р-н00
1780817801Неманский р-н00
1780917801Нестеровский р-н00
1781017801Озерский р-н00
1781117801Полесский р-н00
1781217801Правдинский р-н00
1781317801Славский р-н00
1781417801Черняховский р-н00
178424331Сортавальский р-н00
179034332Демянский р-н00
2650226500Бабаевский р-н00
2650926500Вытегорский р-н00
2652226500Устюженский р-н00
2652426500Чагодощенский р-н00
265324332Батецкий р-н00
265334332Боровичский р-н00
265354332Крестецкий р-н00
265364332Марёвский р-н00
265384332Окуловский р-н00
265394332Парфинский р-н00
265404332Пестовский р-н00
265414332Поддорский р-н00
265424332Солецкий р-н00
265434332Холмский р-н00
265444332Шимский р-н00
2660126600Башмаковский р-н00
2660326600Беднодемьяновский р-н00
2660526600Бековский р-н00
2660726600Белинский р-н00
2660926600Бессоновский р-н00
2661126600Вадинский р-н00
2661326600Городищенский р-н00
2661526600Земетчинский р-н00
2661726600Иссинский р-н00
2661926600Каменский р-н00
2662126600Камешкирский р-н00
2662326600Колышлейский р-н00
2662526600Кондольский р-н00
2662726600Кузнецкий р-н00
2662926600Лопатинский р-н00
2663126600Лунинский р-н00
2663326600Малосердобинский р-н00
2663526600Мокшанский р-н00
2663726600Наровчатский р-н00
2663926600Неверкинский р-н00
2664126600Нижнеломовский р-н00
2664326600Никольский р-н00
2664526600Пачелмский р-н00
2664726600Сердобский р-н00
2664926600Сосновоборский р-н00
2665126600Тамалинский р-н00
2665326600Шемышейский р-н00
2670126700Калининский р-н00
2670326700Андреапольский р-н00
2670526700Бежецкий р-н00
2670726700Бельский р-н00
2670926700Бологовский р-н00
2671126700Весьегонский р-н00
2671326700Вышневолоцкий р-н00
2671526700Жарковский р-н00
2671726700Западнодвинский р-н00
2671926700Зубцовский р-н00
2672126700Калязинский р-н00
2672326700Кашинский р-н00
2672526700Кесовогорский р-н00
2672826700Кимрский р-н00
2673026700Конаковский р-н00
2673226700Краснохолмский р-н00
2673426700Кувшиновский р-н00
2673626700Лесной р-н00
2673826700Лихославльский р-н00
2674026700Максатихинский р-н00
2674226700Молоковский р-н00
2674426700Нелидовский р-н00
2674626700Оленинский р-н00
2674826700Осташковский р-н00
2675026700Пеновский р-н00
2675226700Рамешковский р-н00
2675426700Ржевский р-н00
2675626700Сандовский р-н00
2675826700Селижаровский р-н00
2676026700Сонковский р-н00
2676226700Спировский р-н00
2676426700Старицкий р-н00
2676626700Торжокский р-н00
2676826700Торопецкий р-н00
2677026700Удомельский р-н00
2677226700Фировский р-н00
2678617500Хостинский р-н00
2694226926Минераловодский р-н00
2694726926Предгорный р-н00
2747627475Ивановский р-н00
2748616417Плюсская в-ть00
2760127600Ахтубинский р-н00
2760427600Володарский р-н00
2760627600Енотаевский р-н00
2760827600Икрянинский р-н00
2761027600Камызякский р-н00
2761227600Красноярский р-н00
2761427600Лиманский р-н00
2761627600Наримановский р-н00
2761827600Приволжский р-н00
2762027600Харабалинский р-н00
2762227600Черноярский р-н00
2770227700Ковдорский р-н00
2770427700Кольский р-н00
2770627700Ловозерский р-н00
2770827700Печенгский р-н00
2771127700Терский р-н00
2780127800Ардатовский р-н00
2780227800Арзамасский р-н00
2780327800Балахнинский р-н00
2780627800Богородский р-н00
2781027800Борский р-н00
2781527800Вачский р-н00
2781927800Володарский р-н00
2782227800Выксунский р-н00
2782527800Городецкий р-н00
2782927800Княгининский р-н00
2783427800Кстовский р-н00
2783627800Кулебакский р-н00
2783827800Лукояновский р-н00
2784027800Лысковский р-н00
2784227800Навашинский р-н00
2784427800Павловский р-н00
2784727800Первомайский р-н00
2784927800Перевозский р-н00
2785127800Пильнинский р-н00
2785427800Семеновский р-н00
2785627800Сергачский р-н00
2786427800Уренский р-н00
2786627800Чкаловский р-н00
2820128200Абанский р-н00
2820328200Ачинский р-н00
2820528200Балахтинский р-н00
2820728200Березовский р-н00
2820928200Бирилюсский р-н00
2821128200Боготольский р-н00
2821328200Богучанский р-н00
2821528200Большемуртинский р-н00
2821728200Дзержинский р-н00
2821928200Емельяновский р-н00
2822128200Енисейский р-н00
2822328200Идринский р-н00
2822528200Иланский р-н00
2822728200Ирбейский р-н00
2822928200Казачинский р-н00
2823128200Канский р-н00
2823328200Каратузский р-н00
2823528200Кежемский р-н00
2823728200Козульский р-н00
2823928200Краснотуранский р-н00
2824128200Курагинский р-н00
2824328200Манский р-н00
2824528200Минусинский р-н00
2824728200Мотыгинский р-н00
2824928200Назаровский р-н00
2825128200Нижнеингашский р-н00
2825328200Новоселовский р-н00
2825528200Партизанский р-н00
2825728200Пировский р-н00
2825928200Рыбинский р-н00
2826128200Саянский р-н00
2826328200Северо-Енисейский р-н00
2826528200Сухобузимский р-н00
2826728200Тасеевский р-н00
2826928200Туруханский р-н00
2827128200Тюхтетский р-н00
2827328200Ужурский р-н00
2827528200Уярский р-н00
2827728200Шарыповский р-н00
2827928200Шушенский р-н00
4000140000Алексинский р-н00
4000340000Арсеньевский р-н00
4000540000Белевский р-н00
4000740000Богородицкий р-н00
4000940000Веневский р-н00
4001140000Воловский р-н00
4001340000Дубенский р-н00
4001540000Ефремовский р-н00
4001740000Заокский р-н00
4001940000Каменский р-н00
4002140000Кимовский р-н00
4002340000Киреевский р-н00
4002540000Куркинский р-н00
4002740000Ленинский р-н00
4002940000Новомосковский р-н00
4003140000Одоевский р-н00
4003340000Плавский р-н00
4003540000Суворовский р-н00
4003740000Тепло-Огаревский р-н00
4003940000Узловский р-н00
4004140000Чернский р-н00
4004440000Щекинский р-н00
4004640000Ясногорский р-н00
4012340122Ялта г.00
415314000Академический р-н00
415324000Алексеевский р-н00
415334000Алтуфьевский р-н00
415344000Арбат р-н00
415354000Аэропорт р-н00
415364000Бабушкинский р-н00
415374000Басманный р-н00
415384000Беговой р-н00
415394000Бескудниковский р-н00
415404000Бибирево р-н00
415414000Бирюлёво Восточное р-н00
415424000Бирюлёво Западное р-н00
415434000Богородское р-н00
415444000Братеево р-н00
415454000Бутырский р-н00
415464000Вешняки р-н00
415474000Внуково р-н00
415484000Войковский р-н00
415494000Дегунино Восточное р-н00
415504000Измайлово Восточное р-н00
415524000Выхино-Жулебино р-н00
415534000Гагаринский р-н00
415544000Головинский р-н00
415554000Гольяново р-н00
415564000Даниловский р-н00
415574000Дмитровский р-н00
415584000Донской р-н00
415594000Дорогомилово р-н00
415604000Замоскворечье р-н00
415614000Дегунино Западное р-н00
415624000Зюзино р-н00
415634000Зябликово р-н00
415644000Ивановское р-н00
415654000Измайлово р-н00
415664000Капотня р-н00
415674000Коньково р-н00
415684000Коптево р-н00
415694000Косино-Ухтомский р-н00
415704000Котловка р-н00
415714000Красносельский р-н00
415724000Крылатское р-н00
415734000Крюково р-н00
415744000Кузьминки р-н00
415754000Кунцево р-н00
415764000Куркино р-н00
415774000Левобережный р-н00
415784000Лефортово р-н00
415794000Лианозово р-н00
415804000Ломоносовский р-н00
415814000Лосиноостровский р-н00
415824000Люблино р-н00
415834000Марфино р-н00
415844000Марьина Роща р-н00
415854000Марьино р-н00
415864000Матушкино р-н00
415874000Метрогородок р-н00
415884000Мещанский р-н00
415894000Митино р-н00
415904000Можайский р-н00
415914000Молжаниновский р-н00
415924000Москворечье-Сабурово р-н00
415934000Нагатино-Садовники р-н00
415944000Нагатинский Затон р-н00
415954000Нагорный р-н00
415974000Нижегородский р-н00
415984000Новогиреево р-н00
416004000Ново-Переделкино р-н00
416014000Обручевский р-н00
416024000Орехово-Борисово Северное р-н00
416034000Орехово-Борисово Южное р-н00
416044000Останкинский р-н00
416054000Отрадное р-н00
416064000Очаково-Матвеевское р-н00
416074000Перово р-н00
416084000Печатники р-н00
416094000Покровское-Стрешнево р-н00
416104000Преображенское р-н00
416114000Пресненский р-н00
416124000Проспект Вернадского р-н00
416134000Раменки р-н00
416144000Ростокино р-н00
416154000Рязанский р-н00
416164000Савёлки р-н00
416174000Савёловский р-н00
416184000Свиблово р-н00
416194000Бутово Северное р-н00
416204000Измайлово Северное р-н00
416214000Медведково Северное р-н00
416224000Тушино Северное р-н00
416234000Северный р-н00
416244000Силино р-н00
416254000Сокол р-н00
416264000Соколиная Гора р-н00
416274000Сокольники р-н00
416284000Солнцево р-н00
416294000Старое Крюково р-н00
416304000Строгино р-н00
416314000Таганский р-н00
416324000Тверской р-н00
416334000Текстильщики р-н00
416344000Тёплый Стан р-н00
416354000Тимирязевский р-н00
416364000Тропарёво-Никулино р-н00
416374000Филёвский Парк р-н00
416384000Фили-Давыдково р-н00
416394000Хамовники р-н00
416404000Ховрино р-н00
416414000Хорошёво-Мнёвники р-н00
416424000Хорошёвский р-н00
416434000Царицыно р-н00
416444000Черёмушки р-н00
416454000Чертаново Северное р-н00
416464000Чертаново Центральное р-н00
416474000Чертаново Южное р-н00
416484000Щукино р-н00
416494000Бутово Южное р-н00
416504000Медведково Южное р-н00
416514000Тушино Южное р-н00
416524000Южнопортовый р-н00
416534000Якиманка р-н00
416544000Ярославский р-н00
416554000Ясенево р-н00
4192441923Дзержинский р-н00
4196741961Кировский р-н00
420254000Метрогородок р-н00
4220442202Коминтерновский р-н00

Метро

fieldfield typenote
idsmallint(6) unsignedЧисловой идентификатор
namevarchar(255)Название станции
linevarchar(10)Линия метро
sortIndextinyint(4) unsignedИндекс сортировки
deletedtinyint(1)Признак удаления
idnamelinesortIndexdeleted
1Автово100
2Адмиралтейская500
3Академическая100
4Балтийская100
5Бухарестская500
6Василеостровская300
7Владимирская100
8Волковская500
9Выборгская100
10Горьковская200
11Гостиный двор300
12Гражданский проспект100
13Девяткино100
14Достоевская400
15Елизаровская300
16Звездная200
17Звенигородская500
18Канал Грибоедова200
19Кировский завод100
20Комендантский проспект500
21Крестовский остров500
22Купчино200
23Ладожская400
24Ленинский проспект100
25Лесная100
26Лиговский проспект400
27Ломоносовская300
28Маяковская300
29Международная500
30Московская200
31Московские ворота200
32Нарвская100
33Невский проспект200
34Новочеркасская400
35Обводный канал500
36Обухово300
37Озерки200
38Парк победы200
39Парнас200
40Петроградская200
41Пионерская200
42Площадь Александра Невского340
43Площадь Восстания100
44Площадь Ленина100
45Площадь Мужества100
46Политехническая100
47Приморская300
48Пролетарская300
49Проспект Большевиков400
50Проспект Ветеранов100
51Проспект Просвещения200
52Пушкинская100
53Рыбацкое300
54Садовая500
55Сенная площадь200
56Спасская400
57Спортивная500
58Старая деревня500
59Технологический институт120
60Удельная200
61Улица Дыбенко400
62Фрунзенская200
63Черная Речка200
64Чернышевская100
65Чкаловская500
66Электросила200

Корпуса ЖК

fieldfield typenote
idbinary(16)Идентификатор в виде GUID-а
nb_sourceIdtinyint(4) unsignedИдентификатор источника данных reftbl:nb_source
nb_complexIdbinary(16)Идентификатор комплекса в виде GUID-а
statusIdtinyint(4) unsignedСтатус комплекса reftbl:status
status_buildIdtinyint(4) unsignedСтатус в котором находится корпус reftbl:status_build
housevarchar(15)Дом
blockvarchar(15)Корпус дома
literavarchar(50)Литера
floorsvarchar(20)Этажность
quarter_endtinyint(4) unsignedКвартал окончания постройки
year_endsmallint(6) unsignedГод окончания постройки
house_typeIdtinyint(4) unsignedТип дома reftbl:? - Нет таблицы с типами домов
bknIdbinary(16)Привязка к БКН-овскому корпусу

Типы домов (house_typeId) могут быть:

  • Блочный
  • Индивидуальный
  • Кирпично-монолитный
  • Кирпичный
  • Монолитный
  • Панельно-монолитный
  • Панельный

Данные корпусов ЖК

Здесь мы соберем все данные которые у нас есть по всем жилым комплексам. Все активные комплексы можно получить вот таким запросом:

select toguid(id), nb_sourceId, toguid(nb_complexId), statusId, status_buildId, house, block, litera, floors, quarter_end, year_end, house_typeId, bknId from nb_block limit 200000;

| status_build

Оставшиеся таблицы

Tables_in_bkn_base
advertising
decoration
developer_banks
developer_customs
nb_appartment
nb_contacts
nb_photos
obj_type_p
status_build
test_log
wc

Переуступки

Квартиры на вторичном рынке

Комнаты

Загородные участки

Загородные дома

Аренда

Переделать

Субсидии, ипотека и рассрочка должные отноститься не к очереди а к корпусу.

одна и та же планировка может быть в двух очередях и даже в двух комплексах.

Бизнес-процесс и цели

Мы делаем сайт-аггрегатор всех квартир-новостроек в С-Пб.

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

Многие застройщики работают с 3-5 крупных агенств, которые в свою очередь привлекают других субагентов за комиссию.

Цель сайта для нашей компании - инициировать обращение посетителя в компанию.

Цель пользователя - найти квартиру под его возможности и потребности. На сайте пользователю предоставляется не вся информация по квартире, чтобы он имел стимул обратиться в нашу компанию, где его обработает менеджер по продажам.

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

Цель сайта для менеджера - найти квартиру под любые параметры клиента и обеспечить ответ на любые вопросы клиента по застройщику и квартире.

Причины обращений частных клиентов:

  • большой выбор и возможность получить ответы на все вопросы
  • ипотечный центр (берет на себя сложности с ипотекой)
  • показ квартир, который осуществляет компания:
    • индивидуальный показ (на автомобиле)
    • автобусные туры (срез по району) в выходные
  • реализация квартир клиентов (чтобы купить квартиру, клиенту иногда надо продать квартиру)
  • Люди не покупают квартиры с сайта. Им психологически сложно расстаться с такой большой суммой денег, поэтому они ищут иллюзии понимания этого рынка, которую предоставляет им менеджер компании.
  • Вторичку вообще продают через знакомых агентов. Поэтому практически единственное бизнес-value агенств вторички - широта связей их менеджеров. Все продается только через знакомых.

Взаимодействие с застройщиками:

  • Застройщики регулярно отправляют информацию о объектах (или мы ее самостоятельно забираем). У поставщиков информация представлена в очень разных форматах. Мы конкурируем с отделом продаж застройщиков, поэтому они не заинтересованы предоставлять нам данные в нашем формате.
  • Небольшая часть застройщиков предоставляет данные через т.н. “агентский портал”, куда менеджер компании может попасть по логину и паролю.
  • У ряда застройщиков есть достаточно актуальное наличие планировок на сайте.
  • Мы сопровождаем договора клиентов с застройщиком.

Взаимодействие с агентствами:

  • Мы выступаем для суб-агентов в роли застройщика, отправляя им данные о квартирах.
  • Отдел диллерских продаж принимает обращения от агенств, бронируют квартиры.

Стратегия: Сумма проданных компанией квартир = кол-во обращений клиентов компании * конверсия отдела продаж * кол-во менеджеров.

Новый сайт необходим чтобы увеличить конверсию клик-обращение, и конверсию отдела продаж.

Компания также хочет чтобы сайт был для пользователя более ценным чем сайты застройщиков, для этого планируются дополнительные сервисы - ипотечный калькулятор, расчет инвестиционной привлекательности, итп.

Компания считает что сможет также сократить время обучения используя новый сайт.

Какая-то часть обработки информации будет производиться контент-менеджерами вручную. Необходимо заложить возможности для них. Например: У застройщика есть базовая цена квартиры и регламент - как рассчитывать стоимость квартир, иногда очень сложный. Менеджер по развитию проектов должен иметь возможность создавать набор правил применяющихся в определенном порядке.

Менеджер по продаже должен иметь возможность на странице квартиры накидать скидок (иногородний покупатель, итп), влиящих на цену квартиры. Это очень важное бизнес-требование.

С точки зрения бизнес-процесса, продуктом компании яаляется специалист по недвижимости. Его время покупает клиент. Поэтому компания заинтересована:

  • Занять нишу ресурса, который позволяет выбрать квартиру в новостройке С-Пб.
  • Сэкономить на обучении специалистов.

Основные проблемы на этом пути:

  • Товарная линейка ограничена
  • Актуальность данных
  • Юзабилити

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

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

Если кто-то логинится под логином и паролем под которым в данный момент сидит другой пользователь - реализуем перехват сессии - старый пользователь автоматически теряет сессию.

Логин и пароль нужен и посетителю. Но он не будет регистрироваться, а скорее отправит на почту себе письмо со ссылкой на варианты которые он выбрал в избранном и сравнении.

Роли и их типичные сценарии:

  • Посетитель
    • Поиск квартиры
    • Сравнение
    • Добавление в избранное
    • Печать
  • Менеджер компании
    • Поиск квартиры
    • Сравнение
    • Добавление в избранное - избранное нужно как-то шарить клиенту.
    • Печать
  • Контент-менеджер
    • Забивает информацию в базу
  • Менеджеры по развитию (продукт-менеджеры)
    • Создают правила расчета цен
    • Проверяют (пока раз в месяц) качество работы контент-менеджеров.
  • Менеджер субагента выпоняет примерно те же задачи что менеджер по продажам компании, но, возможно, использует меньше данных, чем сотрудник компании
  • Администратор сайта
    • Управляет пользователями
  • Робот
    • Загрузка данных со сторонних сайтов
    • Выгрузка данных на рекламные ресурсы

Определения сущностей

Застройщики (developer)

fieldfield typedefaultmetanote
idserial(primary)Идентификатор
guidvarcharИдентификатор в виде GUID-а
namevarcharНазвание компании
addressvarcharАдрес компании
urlvarcharАдрес сайта
phonevarcharТелефон
notetextОписание застройщика

Жилой комплекс (cmpx)

Эта сущность нужна только чтобы объединять очереди жилого комплекса

field namefield typenote
idserialидентификатор
namevarcharназвание
addr(or db-null varchar)адрес
district-id(or db-null integer)идентификатор района
metro-id(or db-null integer)идентификатор метро

С жилыми комплексами может быть связан один интересный казус - некоторые жилые комплексы занимают целый квартал и состоят из нескольких корпусов. В этом случае каждый из этих корпусов может находиться на своей улице. Поэтому адрес следует привязывать к корпусу, а не к комплексу.

С другой стороны, всегда будет существовать вопрос “на какой улице находится такой-то комплекс?”. Поэтому мы оставляем поле street_name в таблице жилых комплексов.

fieldfield typedefaultmetanote
idserial(primary)Идентификатор
guidvarcharИдентификатор в виде GUID-а
nb_sourceIdintegerИдентификатор источника данных reftbl:nb_source
statusIdintegerСтатус объекта reftbl:status
developerIdvarcharИдентификатор застройщика reftbl:developer
date_insert(or db-null timestamp)Дата вставки
regionIdintegerИдентификтор региона reftbl:status
districtIdintegerИдентификтор района reftbk:district
district_namevarcharРайон (и город, или область) строкой
city_namevarcharГород или населенный пункт строкой
street_namevarcharУлица
subway1Id(or db-null integer)Идентификатор ближайшено метро №1 reftbl:subway
subway2Id(or db-null integer)Идентификатор ближайшено метро №2 reftbl:subway
subway3Id(or db-null integer)Идентификатор ближайшено метро №3 reftbl:subway
namevarcharНаименование комплекса
notetextОписание комплекса
longitudevarcharДолгота
latitudevarcharШирота
dateUpdate(or db-null timestamp)Дата обновления
isPrivateintegerПризнак приватности - если равен 1, то нельзя показывать ЖК на сайте
bknIdvarcharПривязка к БКН-овскому комплексу откуда мы забираем описания

Очередь жилого комплекса (plex)

field namefield typenote
idserialидентификатор
cmpx-idintegerидентификатор жилого комплекса
name(or db-null varchar)название
distance(or db-null varchar)расстояние до метро
deadline-id(or db-null integer)срок сдачи
subsidy(or db-null boolean)субсидия
finishing(or db-null varchar)отделка
ipoteka(or db-null boolean)ипотека
installment(or db-null boolean)рассрочка

Корпус очереди жилого комплекса (crps)

field namefield typenote
idserialидентификатор
plex-idintegerидентификатор очереди жилого комплекса
name(or db-null varchar)название (номер корпуса)
fieldfield typedefaultmetanote
idserial(primary)Идентификатор
guidvarcharИдентификатор в виде GUID-а
nb_sourceIdintegerИдентификатор источника данных reftbl:nb_source
nb_cmpxIdvarcharИдентификатор жилого комплекса, которому принадлежит этот корпус
statusIdintegerСтатус корпуса reftbl:status
street(or db-null varchar)Улица
house(or db-null varchar)Дом
corpus(or db-null varchar)Корпус (в смысле адреса)
litera(or db-null varchar)Литера
floors(or db-null varchar)Этажность
quarter_end(or db-null integer)Квартал завершения строительства
year_end(or db-null integer)Год завершения строительства
house_typeId(or db-null integer)Тип дома reftbl:?
bknId(or db-null varchar)Привязка к БКН-овскому корпусу
dateUpdate(or db-null timestamp)Дата обновления

Планировка (flat)

field namefield typenote
idserialидентификатор
crps-id(or db-null integer)идентификатор корпуса очереди жилого комплекса
rooms(or db-null integer)кол-во комнат
area-sum(or db-null varchar)общая площадь квартиры (может быть дробное)
area-living(or db-null varchar)жилая площадь квартиры (именно varchar)
area-kitchen(or db-null varchar)площадь кухни (может быть дробное)
price(or db-null integer)цена
balcon(or db-null varchar)балкон/лоджия
sanuzel(or db-null boolean)Санузел раздельный/совмещенный

Город (city)

Город в котором находится объект

field namefield typenote
idserialидентификатор
namevarcharназвание города

Район (district)

Район города, в котором находится объект

field namefield typenote
idserialидентификатор
namevarcharназвание района

Метро (metro)

Метро неподалеку от объекта

field namefield typenote
idserialидентификатор
namevarcharназвание станции

Сроки сдачи (deadline)

Сроки сдачи объектов

field namefield typenote
idserialидентификатор
namevarcharназвание станции

Картинки очередей ЖК

Картинки планировок

Картинки хода строительства

Загрузка данных

В папке ./data лежат ЖК, в каждом из них есть подпапки, в которых лежат очереди. Очереди в себе содержат подпапки, содержащие изображения:

  • Планировки
  • Рендеры
  • Ход строительства

и файлы:

  • паспорт.txt - паспорт объекта
  • описание.txt - описание объекта
  • местоположение
  • комфорт
  • квартиры, в формате CSV
    корпустипметражжилая площадьплощадь кухнибалкон/лоджиясанузелцена

Утилиты

Напишем проход по всем этим директориям, но перед этим необходимо определить ряд вспомогательных макросов и функций.

Начнем с макроса поиска файла в наборе. В случае, если файл найден, мы выполняем body

Нам также понадобится цикл внутри директории, который умеет предоставлять нам поддиректории и файловое содержимое этих предоставленных поддиректорий.

Еще маленький вспомогательный макрос для извлечения значения по ключу из ассоциативного списка:

Для работы с данными, извлекаемыми из файлов в формате ключ:значение напишем функцию-парсер:

Для работы с xls-файлами напишем парсер и декодер:

Загрузчик

Теперь переходим к загрузке данных:

Шаблоны

Interface

Соберем веб-интерфейс:

Тестовая страница шаблонов

Описание интерфейса поиска

Страничка загрузки данных

Список ЖК

Страница ЖК

На самом деле это не карточка Жилищного Комплекса, а скорее карточка одной из его очередей, т.к. большинство параметров различаются между очередями. С другой стороны все очереди одного комплекса между собой связаны, так что нужна какая-то обьединяющая сущность.

Дизайн-макет: Карточка ЖК

Если пользователь попал на эту страницу НЕ через поиск - ему надо показать кнопку “К поиску (378)”, которая содержит кол-во вариантов при самых широких параметров поиска.

Есть пользователь попал на эту страницу из выборки - эта кнопка должна вести на его выборку и содержать кол-во вариантов его выборки.

Тут может быть мемоизация и предвычисления, которые мы на первом этапе можем не делать.

Если пользователь зашел на этот обьект - этот объект нужно добавить в его “просмотренные”.

Отсюда пользователь может перейти к сценарию “сравнение”, “добавить в избранное”, “распечатать объект”.

Когда все квартиры в очереди закончились необходимо не удалять очередь с сайта, а убирать их в архив, чтобы она не показывалась в поиске, но были доступна администратору.

Видим:

  • Название ЖК
  • Метро
  • Расстояние до метро
  • Район
  • Улица (или пересчение улиц)
  • Картинки (неограниченно, можно листать)
  • Минимальные цены в этом ЖК в формате “тип квартиры - цена - метры”. При выборе этой ссылки мы сдвигаемся по странице до раздела “планировки и цены” где разворачивается аккордеон с выбранным им вариантом”.
  • Возможность выбора очереди (с инфой о сроке сдачи) Когда пользователь выбирает другую очередь - он переходит на другую карточку (здесь очевидно нужна таблица связи)
  • Возможность выбора корпуса От корпуса зависят цены, карта корпусов, цены в разделе “планировки и цены”, “преимущества”
  • Кнопка “все корпуса и цены”, открывает pop-up “Очереди и корпуса”
  • Преимущества
  • Карта расположения корпусов комплекса
  • Карта объекта с ценой
  • Раздел планировки и цены
    • Форма поиска по квартирам (внутри квартир этой карточки)
      • Сортировка по цене (убыванию и возрастанию)
      • Выбор корпуса
      • Выбор кол-ва комнат
      • Стоимость квартиры (от .. до .. тыс.руб)
      • Первоначальный взнос, от … до …
      • Метраж
      • Кнопка поиска
    • Выдача, в аккордеоне, сгруппированные по кол-ву комнат, колонки
      • Номер корпуса
      • Кол-во комнат
      • Общая площадь
      • Жилая площадь
      • Площадь кухни
      • Балкон/лоджия
      • Санузел
      • Отделка
      • Первый взнос от ..
      • Цена с доп. скидками
      • Инвест. привлекательность
      • Добавить в сравнение?
      • Избранное?
      • Подробнее

      При клике на ячейку в таблице или на кнопку “подробнее” мы попадаем в карточку квартиры.

  • Картинки (еще раз)
  • Описание
  • Паспорт обьекта
    • Список параметров-значений, и параметры и значения могут добавлять контент-менеджеры.
  • Ход строительства диаграмма месяцев по годам, к каждому месяцу несколько фотографий
  • Кнопка “записаться на тур бесплатно”
  • Похожие предложения Как выбирать и группировать - непонятно. Нужно сделать алгоритм и вручную.
  • Регламент (условия продажи: 100% оплата, рассрочка, ипотека). В дизайне его нет. Надо ли его показывать клиентам.
  • Дата обновления. Показывать ли это клиентам?

Страница очереди ЖК

Страница корпуса очереди ЖК

Страничка планировки

Дизайн-макет: Карточка квартиры

Дизайн-макет: Карточка квартиры - версия для печати

Есть вариант открывать карточку квартиры в pop-up окне. Но на каждую квартиру должна быть прямая ссылка - очевидно надо менять адресную строку. Также должна быть версия для печати, чтобы распечатать интересующий вариант.

Менеджер по продаже должен иметь возможность на странице квартиры накидать скидок (иногородний покупатель, итп), влиящих на цену квартиры. Это очень важное бизнес-требование.

Видим:

  • Пдф
  • Печать
  • Почта
  • Соцсети (шаринг)
  • Тип квартиры (студия, 1комнатная)
  • id
  • Цена при 100% оплате
  • Кнопка “подробности у менедждера” - ссылка на контакты

Справа карточка комплекса идентичная поисковой выдачи - она оттуда и берется.

  • Планировка квартиры - рисунок
  • План этажа
  • Карта на который мы отмечаем где в корпусе расположена квартира - чтобы сориентироваться по виду.
  • Карта с минимальной ценой
  • Характеристики квартиры
    • Кол-во комнат
    • жилая площадь
    • общая площадь
    • Пллощадь кухни
    • Санузел
    • Отделка
    • Балкон

    Нужно иметь возможность добавлять сюда параметры

  • Сравнение
  • Избранное
  • Четыре ключевых преимущетва из ЖК
  • калькулятор ипотеки и рассрочки - отдельный кейс
  • Возможность баннеров (автобусные туры)
  • Инфо о жилом комплексе (потому что попадает в распечатку)
  • Сссылка “подробно о комплексе” - к ЖК
  • Квартиры в этом комплексе - ведут в карточку комплекса с открытыми двухкомнатными квартирами.
  • Сообщить об ошибке.
  • Когда было последнее обновление информации о квартире. Обновлено и дату. Чтобы менеджер видел актуальность. Показывать ли клиентам?

Соберем шаблоны страницы планировки

Соберем определения страниц

Pop-up

Есть вариант открывать карточку квартиры в pop-up окне. Но на каждую квартиру должна быть прямая ссылка - очевидно надо менять адресную строку.

Версия для печати

Также должна быть версия для печати, чтобы распечатать интересующий вариант.

Менеджер хочет накидать скидок

Менеджер по продаже должен иметь возможность на странице квартиры накидать скидок (иногородний покупатель, итп), влиящих на цену квартиры. Это очень важное бизнес-требование.

Pdf-версия

Отправить на почту

Рассказать в социальных сетях

Тип квартиры

Тип квартиры показывается исходя из кол-ва комнат:

Идентификатор квартиры

Идентификатор квартиры показывается для быстрого доступа

Цена при 100% оплате

Кнопка “подробности у менеджера”

ссылка на контакты

<a href="/contactsПодробности у менеджера</a>
<br />

Карточка комплекса

Справа карточка комплекса идентичная поисковой выдачи - она оттуда и берется.

  • Планировка квартиры - рисунок
  • План этажа
  • Карта на который мы отмечаем где в корпусе расположена квартира - чтобы сориентироваться по виду.
  • Карта с минимальной ценой

Характеристики квартиры

Нужно иметь возможность добавлять сюда параметры, но в первом прототипе мы это пока не делаем

Добавить в сравнение

Добавить в избранное

Четыре ключевых преимущетва из ЖК

калькулятор ипотеки и рассрочки - отдельный кейс

Возможность баннеров (автобусные туры)

Инфо о жилом комплексе (потому что попадает в распечатку)

Сссылка “подробно о комплексе” - к ЖК

Квартиры в этом комплексе - ведут в карточку комплекса с открытыми двухкомнатными квартирами.

Сообщить об ошибке.

Когда было последнее обновление информации о квартире.

Обновлено и дату. Чтобы менеджер видел актуальность. Показывать ли клиентам?

START Поиск квартиры в новостройке

Клиент может искать квартиру используя простой поиск или расширенный поиск. В сложном поиске больше параметров. В обоих случаях он получает одну и ту же выдачу, которая может быть представлена в двух разных форматах: поисковая выдача с картой или поисковая выдача таблицей.

Экcпертов также часто интересует id квартиры - при вводе в строку поиска числового значения, находится должен искомый объект.

START Простой поиск

Дизайн-макет: Простой поиск на главной странице

При поиске клиенту интересны следующие параметры:

  • Район
  • Метро
  • Название жилищного комплекса
  • Количество комнат
  • Срок сдачи (не позднее)
  • Стоимость квартиры

Требуется выводить подсказки в поисковой строке Пример подсказок в дизайн-макете

Пользователь, выполнивший простой поиск попадает в выдачу.

Расширенный поиск

Дизайн-макет: Расширенный поиск на главной странице

Все тоже самое что и в простом поиске, но:

  • Вместо “Срока сдачи” можно задать интервал (от … до …) тоже списком выбора
  • Добавляется блок “ипотека”, в котором есть “первоначальный взнос” и “ежемесячный платеж”. Клиент должен ввести число либо в одно поле либо в другое.
  • Рассрочка - либо “первоначальный взнос” либо “ежемесячный платеж”. Если клиент готов рассматривать или ипотеку или рассрочку - то в выдаче мы выдаем и те и другие варианты
  • Метраж (от … до …)
  • Субсидия (галочка) - квартиру можно приобрести с помощью жилищного сертификата, который покрывает часть стоимости квартиры. Это можно объяснять всплывающей подсказкой
  • Отделка (галочка) - если клиент ставит галочку, то мы выдаем только те квартиры в которых есть обои, раковины и можно сразу жить.
  • Инвестиционная привлекательность удорожание в процентах или предоставить форму с двумя полями:
    • Сумма которую хочет инвестировать клиент
    • Срок на который хочет инвестировать клиент (поквартально)

Также нужен поиск по расстоянию до метро, но мы будем стараться чтобы этот параметр был доступен только для менеджера компании

Поисковая выдача с картой

Дизайн-макет: Поисковая выдача с картой

Выдача отдается в две колонки - слева список, включающий:

  • Фото комплекса
  • Название
  • Район
  • Метро
  • Расстояние до метро
  • Срок сдачи
  • Тип отделки
  • Ипотека (если есть)
  • Рассрочка (если есть)
  • Цена квартир которых он искал (от…). Если он в поиске выбрал и однушку и двушку и трешку показывается самое дешевое с метражом
  • Цена всех вариантов (однушку и двушку и трешку), по клику на плюсике (с метражом)
  • В избранное
  • В сравнение

В правой колонке выводятся маркеры на карте, содержащие цену и синхронизированные со списком выдачи (рамки при наведении итп)

При этом при скроллировании карта остается на месте, а выдача прокручивается.

Сортировать можно:

  • по цене туда и обратно
  • по сроку сдачи
  • по району
  • по станции метро
  • возможно, по расстоянию до метро

Надо указывать число найденных комплексов.

Возможность переключения между выдачей на карте и выдачей списком

Нажимая на элемент выдачи он попадает в карточку ЖК

После выдачи идет блок похожих предложений, но возможно откажемся от этого блока здесь.

START Поисковая выдача таблицей

Дизайн-макет: Поисковая выдача таблицей

Выдается таблица с колонками:

  • Район
  • Название ЖК
  • Станция метро
  • До метро
  • Срок сдачи
  • Отделка
  • Ипотека/Рассрочка
  • Кол-во комнат
  • Общая площадь
  • Цена с доп. скидками
  • Цена всех вариантов (однушку и двушку и трешку), по клику на плюсике (с метражом)
  • В избранное
  • В сравнение

Сортировать необходимо по столбцам.

Нажимая на элемент выдачи он попадает в карточку ЖК

После выдачи идет блок похожих предложений, но возможно откажемся от этого блока здесь.

Проект CRM-системы для отдела продаж

Обращение стоит денег, его надо оформлять в объект базы CRM - чтобы не терялись. В первую очередь необходимо зафиксировать телефон, с которого звонит клиент

Сценарии использования

Просто карта

Макета нет, но можно ориентировать на Trend_search_map.

Title: Все ЖК.

ostrovok.ru

Закрыть карту.

Нам надо развернуть карту на целый экран или свернуть чтобы показть выборку.

Надо подумать делать просто большую карту или вместе с выборкой и фильтрами

По умолчанию открыватся большая, после клика на маркер нужно что-то показать об выбранном комплексе. Можно попапом, или в карту уменьшить и сбоку.

Все комплексы.

Карта не должна скроллиться

Поиск вторичного жилья

В первом релизе не будет.

Вторичное жилье не так критично, т.к. занимает 1% от реализаций, ему можно оставить только простой поиск.

Для вторички нет срока сдачи, но есть тип дома (список выбора)

Экпертов также часто интересует id обьекта - при вводе в строку поиска числа находится должен искомый объект. id должен печататься и на карточке квартиры, для того чтобы, можно было по телефону объяснить о каком объекте идет речь.

Ипотечный калькулятор в карточке квартиры

Задачи:

  • Показать клиенту что он может взять квартиру в ипотеку
  • Дать клиенту возможность оценить свои возможности, поиграв с калькулятором.

Мы должны иметь возможность присваивать программы корпусу очереди. У одного корпуса может быть множество разных программ от множества разных банков. На карточке квартиры нужно показать расчет с эвристически лучшей программой - например, с самой низкой процентной ставкой и самым длинным сроком кредита - но есть вариант рекомендовать это вручную. Мы не показываем ему инфу по программе банка (даже наименование банка не светим), чтобы он консультировался с нашим специалистом. Но менеджеры получают подробную инфу.

Параметры:

  • Стоимость квартиры (мин 10% от стоимости квартиры) - не давать клиенту забить меньше
  • Первоначальный взнаос (мин 10%) - не давать клиенту забить меньше
  • Срок кредита (макс 25 лет)
  • Процентная ставка % в год - по идее если клиенту показывается оптимальный банк то он не должен мочь ее менять.
  • Менеджеру видно банки, % и ежемесячный платеж.

Результат

  • Ежемесячный платеж

Ипотечный калькулятор в отдельном разделе

Ипотечный калькулятор используется клиентом чтобы расчитать ипотеку неважно для какой квартиры. После рассчета можно отдать клиенту выборку подходящих квартир.

Есть банки, у них есть “программы”. Мы дожны создавать базу по банкам и их программам. У программы банка есть:

  • Наименование
  • Максимальный срок кредита
  • Процентная ставка
  • Минимальный первый взнос в процентах.

Сценарии проговаривать с ипотечниками - уточнять по ходу дела.

Варианты расчета:

  • Отталкиваемся от дохода
    • Ставим максммальный срок
    • Подбираем сумму кредита (доход 50.000, может ли взять 2.000.000)
    • Определяем ежемесячный платеж - смотрим сможет ли платить.
    • Манипулируем суммами чтобы учесть все интересы.
  • Отталкиваемся от максимального размера ежемесячный платежей
  • Отталкиваемся от максимального срока погашения (из-за возраста)
  • Отталкиваемся от единственного банка или от суммы кредита

Калькулятор рассрочки

Чем сложнее чем ипотечный калькулятор?

Если мы говорм про рассрочку, то параметры там те же самые что и в ипотеке:

  • мин перв взнос
  • срок
  • процент

но если вносишь 10% и платишь за 2 года, то тебе такая процентная ставка Там очень много программ и все они зависят сложным образом от входных параметров, которых неопределенное число, и иногда даже зависит от типа квартир или, например, от этажности, акции и фазы луны.

Застройщик делает программы рассрочки со сложными условиями..

Как формализовать условия? У нас есть менеддеры по внутреннему развитию проектов. Они умеют делать экселевские калькуляторы для себя. Также многие застройщики деляют экселевские файлы для рассчетов своих рассрочек.

Запись на демонстрацию квартир

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

Похожие предложения

Первый вариант - назначает менеджер вручную, в первом релизе можно ограничиться им. Второй вариант - назначить алгоритмом:

  • Берем за базу цену, отсекаем все что выходит за коридор цены.
  • Срок сдачи (коридор срока)
  • Район (тут все сложно - рядом по территориальности, например)

Вариант:

Продажа своей квартиры

Ссылка на контакты пока или форму заявки.

Обращение в компанию

Контакты

Подписка на рассылку

В первом релизе можно обойтись без нее. Рассылка долждна быть в нескольких вариантах.

  • Возможность подписаться на новости по конкретному объекту
  • Возможность подписать на инвестиционные предложения, которые мы сами генерируем
  • Подписка на старте продаж.

Сравнение

Trend_comparisioon

В сравнение можно добавлять и жилые комплексы и квартиры. Если человек добавляет квартиру, то ЖК добавляется автоматически.

О ЖК:

При нажатии менеджером “отправить на почту” нужно генерировать ссылку с этими объектами, добавленными в сравнение. Это нужно чтобы отдать клиенту “на подумать”.

Карта с объектами с автоматическим расчетом центра и масштаба

Скроллер влево-вправо Сердечко - добавить в избранное Удалить их сравнения Блок “о комплексе”

  • Рендер (кликабельно в объект)
  • Название ЖК и очередь
  • Район
  • Метро и расстояние до него
  • Срок сдачи
  • Цена минимальных квартир
  • Тип отделки
  • Ипотека с указанием макс срока
  • Рассрочка с указанием макс срока
  • Стандартный блок “тип квартиры- цена от - метраж по всем типам квартир”

Блок сравнения по паспорту объекта … поднимаем из комплекса

О квартирах:

  • Сердечко - добавить в избранное
  • Удалить их сравнения
  • Планировка (картинка с увеличением)
  • Сравнение по данным таблицы по квартирам, которую мы описывали в карточке ЖК.

Избранное

Trend_favorite_map

Избранное согласно поисковой выдаче. Все так же, только избранное. Но в избранном может быть как комплекс так и квартира. Как отображать это таблицей - понятно. А как отображать на карте?

“Просмотрено” - список объектов просмотренных пользователем ранее

Отображается точно также как избранное, но заносим мы туда только комплексы, без квартир. Непонятно почему?

Хранение и визуализация истории цен по объекту (!) (менеджер и возможно клиент)

Это нужно чтобы показать клиенту инвестиционную привлекательность квартиры в этом корпусе.

График с четырьмя кривыми цен по типам квартиры.

Нам нужна цена квадратного метра в зависимости от типа квартиры.

Контенщик или робот заносит в базу базовую цену квадратного метра (разную в зависимости от типа квартиры)

Внесение данных контентщиком

Внесение данных объектов роботом

Скачать pdf

Тесты

Остальное

Элементарный поиск (то что есть на существующем сайте) Карточки квартир Поиск по большому кол-ву параметров:

  • первый взнос
  • платеж в месяц
  • инвестиционная привлекательность

Личный кабинет менеджера

  • Графики чтобы обосновать клиенту инвест. привлекательность
  • Статистика работы менеджеров

Конкуренты

cian.ru петербургская недвижимость миан миель инком ндв-недвижимость

Инвест-привлекательность:

В идеале для клиента надо предоставить форму с двумя полями:

  • Сумма которую хочет инвестировать клиент
  • Срок на который хочет инвестировать клиент

И система автоматически подберет ему подходящие варианты (из числа заранее отобранных менеджерами компании)

Точки входа

Соберем шаблоны:

Скомпилируем шаблоны при подготовке модуля

Соберем контроллеры и все функции, которые контроллеры вызывают

Сборка

Сущности и автоматы

Соберем все сущности и автоматы

Жилой комплекс

Очередь жилого комплекса

Корпус очереди жилого комплекса

Планировка

Город

Районы

Метро

Сроки сдачи

Загрузчик данных из файлов

Соберем загрузчик