AnonSec Shell
Server IP : 162.214.74.102  /  Your IP : 216.73.216.192
Web Server : Apache
System : Linux dedi-4363141.lrsys.com.br 3.10.0-1160.119.1.el7.tuxcare.els25.x86_64 #1 SMP Wed Oct 1 17:37:27 UTC 2025 x86_64
User : lrsys ( 1015)
PHP Version : 5.6.40
Disable Function : exec,passthru,shell_exec,system
MySQL : ON  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/lrsys/www/lrsys_apps/leo/application/plugins/module_imobles/helpers/api/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/lrsys/www/lrsys_apps/leo/application/plugins/module_imobles/helpers/api/MainHelper.php
<?php

include_once "APIUtils.php";
class MainHelper {

    private $APIUtils;

    public function __construct() {
        $this->APIUtils = new APIUtils();
    }

    private function searchSQL($filter, $selectFilds, $groupBy = '', $orderBy = '', $limit = '', $extraParams = array()) {
        $whereParams = array();

        // Fixed conditions for API
        $whereParams[] = "imobles_client = 1";
        $whereParams[] = "searchable = 1";
        
        if (empty($filter['unit_type_ids'])) {

            // Fixed conditions for API
            $whereParams[] = "unit_type_site_enabled = 1";
            
            if(empty($filter['mobile_search']) || $filter['mobile_search'] == false){
                $whereParams[] = "site_enabled = 1";
            }

            if(empty($filter['amenities_complete']) || $filter['amenities_complete'] == false){
                // Filtro por Amenities da API
                if (isset($filter['amenities']) && $filter['amenities'] != '') {
                    $a = implode("','", $filter['amenities']);
                    if (!empty($a)) {
                        $whereParams[] = "module_imobles_enterprise_id IN (
                            SELECT sub.module_imobles_enterprise_id 
                            FROM module_imobles_enterprise_entreprise_amenities sub
                            WHERE sub.module_imobles_enterprise_id = view.module_imobles_enterprise_id
                            AND sub.module_imobles_enterprise_amenities_id IN ('" . $a . "'))";
                    }
                }
            } else {
                // Filtro por Amenities da Buscador
                if (isset($filter['amenities']) && $filter['amenities'] != '') {
                    $operator = " " . $filter['operatorAmenitiesDesired'] . " ";
                    $whereAmenities = array();
        
                    $amenit = explode(",", $filter['amenities']);
                    $a = array();
                    foreach ($amenit as $am) {
                        $e = explode("_", $am);
                        $a[$e[0]][] = $e[1];
                    }
        
                    if (isset($a['ENTERPRISE'])) {
                        $whereAmenitiesTemp = array();
                        foreach($a['ENTERPRISE'] as $amenitieID){
                            $whereAmenitiesTemp[] = "enterprise_amenities LIKE '%\"$amenitieID\"%'";
                        }
                        $whereAmenities[] = implode($operator, $whereAmenitiesTemp);
                    }
        
                    if (isset($a['TYPEUNITY'])) {
                        $whereAmenitiesTemp = array();
                        foreach($a['TYPEUNITY'] as $amenitieID){
                            $whereAmenitiesTemp[] = "type_unit_amenities LIKE '%\"$amenitieID\"%'";
                        }
                        $whereAmenities[] = implode($operator, $whereAmenitiesTemp);
        
                    }
        
                    if( count($whereAmenities) > 0 ){
                        $whereParams[] = "(" . implode($operator, $whereAmenities) . ")";
                    }
                }
            }

            // Filtro por Grupos de Amenities
            $development_aminities_ids = array();
            $unit_type_aminities_ids = array();
            $unit_aminities_ids = array();
            if (isset($filter['amenities_ids']) && $filter['amenities_ids'] != '') {
                foreach($filter['amenities_ids'] as $group_id){
                    $group = ORM::for_table('module_imobles_enterprise_group_amenities')->find_one($group_id);
                    $amenities_ids = json_decode($group->amenities_ids);
                    if(!empty($amenities_ids->development_amenities_ids)){
                        $development_aminities_ids = array_merge($development_aminities_ids, $amenities_ids->development_amenities_ids);
                    }

                    if(empty($filter['development_amenities_only']) || $filter['development_amenities_only'] === false){
                        if(!empty($amenities_ids->unit_type_amenities_ids)){
                            $unit_type_aminities_ids = array_merge($unit_type_aminities_ids, $amenities_ids->unit_type_amenities_ids);
                        }
    
                        if(!empty($amenities_ids->unit_amenities_ids)){
                            $unit_aminities_ids = array_merge($unit_aminities_ids, $amenities_ids->unit_amenities_ids);
                        }
                    }
                }
                
                $a = implode("','", $development_aminities_ids);
                if (!empty($a)) {
                    $whereParams[] = "EXISTS (
                        SELECT sub.module_imobles_enterprise_id 
                        FROM module_imobles_enterprise_entreprise_amenities sub 
                        WHERE sub.module_imobles_enterprise_id = view.module_imobles_enterprise_id
                        AND sub.module_imobles_enterprise_amenities_id IN ('" . $a . "')) ";
                }

                $b = implode("','", $unit_type_aminities_ids);
                if (!empty($b)) {
                    $whereParams[] = "EXISTS (
                        SELECT sub.module_imobles_enterprise_units_type_id 
                        FROM module_imobles_enterprise_units_type_amenities sub 
                        WHERE sub.module_imobles_enterprise_units_type_id = view.id
                        AND sub.module_imobles_type_units_amenities_id IN ('" . $b . "')) ";
                }

                $c = implode("','", $unit_aminities_ids);
                if (!empty($c)) {
                    // $whereParams[] = "module_imobles_enterprise_id IN (
                    //     SELECT sub.module_imobles_enterprise_id 
                    //     FROM module_imobles_enterprise_entreprise_amenities sub 
                    //     WHERE sub.module_imobles_enterprise_id = view.module_imobles_enterprise_id
                    //     AND sub.module_imobles_enterprise_amenities_id IN ('" . $c . "')) ";
                }
            }


            // Filtro pela data de entrega
            if (!empty($filter['release_date_start'])) {
                $whereParams[] = "release_date >= '" . $filter['release_date_start'] . "'";
            }
            if (!empty($filter['release_date_end'])) {
                $whereParams[] = "release_date <= '" . $filter['release_date_end'] . "'";
            }

            // Filtro pela Localização
            if (@$filter['locations']) {
                $address_neightborhood = "";
                $address_number = "";
                $state = '';
                $city = '';
                $log = '';
                $zip = '';

                foreach ($filter['locations'] as $d) {

                    if (!empty($d['address_number'])) {
                        $address_number .= "OR address_number  = '" . ($d['address_number']) . "' "
                                . "";
                    }

                    if (!empty($d['address_state'])) {
                        $state .= "OR uf_state  = '" . ($d['address_state']) . "' "
                                . "";
                    }

                    if (!empty($d['address_city'])) {
                        $city .= "OR city_name  = '" . ($d['address_city']) . "' ";
                    }
                    
                    if (!empty($d['address_log'])) {
                        $log .= "OR address_log_sanitized = '" . htmlentities(sanitizaText($d['address_log'])) . "'  ";
                    } else {
                        if (!empty($d['address_neighborhood'])) {
                            $address_neightborhood .= "OR address_neighborhood_sanitized  = '" . htmlentities(sanitizaText($d['address_neighborhood'])) . "' ";
                        }
                    }

                    if (!empty($filter['address_zip'])) {
                        $zip .= "OR address_zip  LIKE '%" . $filter['address_zip'] . "%' "
                                . "";
                    }
                }

                
                if (!empty($address_neightborhood)) {
                    $whereParams[] = "(" . substr($address_neightborhood, 2) . ")";
                }

                if (!empty($address_number)) {
                    $whereParams[] = "(" . substr($address_number, 2) . ")";
                }

                if (!empty($state)) {
                    $whereParams[] = "(" . substr($state, 2) . ")";
                }

                if (!empty($city)) {
                    $whereParams[] = "(" . substr($city, 2) . ")";
                }

                if (!empty($log)) {
                    $whereParams[] = "(" . substr($log, 2) . ")";
                }

                if (!empty($zip)) {
                    $whereParams[] = "(" . substr($zip, 2) . ")";
                }
            }
            
            
            /*
             * Filtro pelo Lat/Long para visualização do MAPA
             */
            if (@$filter['viewport']) {
                if(!empty($filter['viewport']['northeast']['lat']) 
                    && !empty($filter['viewport']['northeast']['lng'])
                    && !empty($filter['viewport']['southwest']['lat'])
                    && !empty($filter['viewport']['southwest']['lng'])) {
                        $whereParams[] = "ent.latitude  >= " . $filter['viewport']['southwest']['lat'];
                        $whereParams[] = "latitude  <= " .$filter['viewport']['northeast']['lat'];
                        $whereParams[] = "longitude  >= " .$filter['viewport']['southwest']['lng']; 
                        $whereParams[] = "longitude  <= " .$filter['viewport']['northeast']['lng']; 
                }
            }

            if (!empty($filter['area_min'])) {
                $whereParams[] = "area >= " . htmlentities(Finance::amount_fix($filter['area_min']));

            }

            if (!empty($filter['area_max'])) {
                $whereParams[] = "area <= " . htmlentities(Finance::amount_fix($filter['area_max']));
            }
    
            if (!empty($filter['bedrooms'])) {
                $n = implode("','", $filter['bedrooms']);
                if (!empty($n)) {
                    $whereParams[] = "number_rooms IN ('" . $n . "')";
                }
            }

            if (!empty($filter['suites'])) {
                $n = implode("','", $filter['suites']);
                if (!empty($n)) {
                    $whereParams[] = "number_suite IN ('" . $n . "')";
                }
            }

            if (!empty($filter['bathrooms'])) {
                $n = implode("','", $filter['bathrooms']);
                if (!empty($n)) {
                    $whereParams[] = "number_bathroom IN ('" . $n . "') ";
                }
            }

            if (!empty($filter['parking_spaces'])) {
                $n = implode("','", $filter['parking_spaces']);
                if (!empty($n)) {
                    $whereParams[] = "number_garage IN ('" . $n . "') ";
                }
            }

            if (!empty($filter['offers'])) {
                $whereParams[] = "promotion = 1";
            }

            if (!empty($filter['price_min'])) {
                $whereParams[] = "min >= " . htmlentities(Finance::amount_fix($filter['price_min']));
            }
            
            if (!empty($filter['price_max'])) {
                $whereParams[] = "min <= " . htmlentities(Finance::amount_fix($filter['price_max']));
            }

            if (!empty($filter['condo_fee_min'])) {
                $whereParams[] = "condo_fee >= " . htmlentities(Finance::amount_fix($filter['condo_fee_min']));
            }
            
            if (!empty($filter['condo_fee_max'])) {
                $whereParams[] = "condo_fee <= " . htmlentities(Finance::amount_fix($filter['condo_fee_max']));
            }

            if (!empty($filter['enterprise_id'])) {
                $whereParams[] = "module_imobles_enterprise_id = " . $filter['enterprise_id'];
            }

            if (isset($filter['development_name']) && !empty($filter['development_name'])) {
                $whereParams[] = "enterprise_name LIKE '%" . $filter['development_name'] . "%' ";
            }
            
            if (isset($filter['development_id']) && !empty($filter['development_id'])) {
                $whereParams[] = "module_imobles_enterprise_id = " . $filter['development_id'];
            }

            if (isset($filter['development_ids']) && !empty($filter['development_ids'])) {
                $whereParams[] = "module_imobles_enterprise_id IN (" . implode(",", $filter['development_ids']) . ") ";
            }

            if (isset($filter['development_ids_not_in']) && !empty($filter['development_ids_not_in'])) {
                $whereParams[] = "module_imobles_enterprise_id NOT IN (" . implode(",", $filter['development_ids_not_in']) . ") ";
            }

            if (isset($filter['construction_company_ids']) && !empty($filter['construction_company_ids'])) {
                $whereParams[] = "module_imobles_company_construction_id IN (" . implode(",", $filter['construction_company_ids']) . ") ";
            }

            if (isset($filter['construction_company_slug']) && !empty($filter['construction_company_slug'])) {
                $whereParams[] = "company_construction_slug = '".$filter['construction_company_slug']."'";
            }

            if (isset($filter['pre_launch']) && $filter['pre_launch'] === true) {
                $now = new DateTime('NOW');
                $now->modify('-3 months');
                $date_aux = $now->format('Y-m-d');
                $whereParams[] = "(init_sales >= '".$date_aux."' OR has_no_ri = 1) ";
            } else if (!empty($filter['towers_stage'])){
                $whereStages = '';
                if (!in_array('', $filter['towers_stage'])) {
                    foreach ($filter['towers_stage'] as $s) {
                        switch ($s) {
                            case 'Lauch':
                                if (!empty($whereStages)) {
                                    $whereStages .= " OR ";
                                }
                                $whereStages .= " init_sales > '" . date("Y-m-d") . "'";
                                break;
                            case 'In Works':
                                if (!empty($whereStages)) {
                                    $whereStages .= " OR ";
                                }
                                $whereStages .= " release_date > '" . date("Y-m-d") . "'";
                                break;
                            case 'Ready to move in':
                                if (!empty($whereStages)) {
                                    $whereStages .= " OR ";
                                }
                                $whereStages .= " release_date <= '" . date("Y-m-d") . "'";
                                break;
                        }
                    }
                }
                if (!empty($whereStages)) {
                    $whereParams[] = "$whereStages";
                }


            }

            if (isset($filter['gpt_unit_type_ids']) && !empty($filter['gpt_unit_type_ids'])) {
                $whereParams[] = "id IN ('" . implode("','", $filter['gpt_unit_type_ids']) . "')";
            }
            
        } else {
            $whereParams[] = "id IN ('" . implode("','", $filter['unit_type_ids']) . "')";
        }

        $whereParams = array_merge($whereParams, $extraParams);
        $where = "WHERE " . implode(" AND ", $whereParams);

        
        // $orderBy = $this->searchOrder();

        if($groupBy <> ''){
            $groupBy = "GROUP BY " . $groupBy;
        }
        if($orderBy <> ''){
            $orderBy = "ORDER BY " . $orderBy;
        }

        $sql = "SELECT
                $selectFilds 
                FROM module_imobles_view_type_units_search AS view
                $where
                $groupBy
                $orderBy
                $limit";        

        return $sql;

    }

    private function orderBy($filter, &$orderBy, &$orderTypeUnit = null){
        $orderTypeUnit = 'area asc';
        $orderBy = 'module_imobles_enterprise_id ASC';
        if (isset($filter['order_by'])) {
            $orderBy = "";
            foreach ($filter['order_by'] as $orde) {

                foreach ($orde as $key => $val) {
                    if (strtoupper($val) == 'DESC') {
                        $val = 'DESC';
                    } else {
                        $val = 'ASC';
                    }
                    switch ($key) {
                        case 'price':
                            $orderBy .= ', min ' . $val;
                            $orderTypeUnit = " min " . $val;
                            break;
                        case 'area':
                            $orderBy .= ', area ' . $val;
                            $orderTypeUnit = " area " . $val;
                            break;
                        case 'release_date':
                            $orderBy .= ', release_date ' . $val;
                            break;
                        case 'init_sales':
                            $orderBy .= ', pre_launch DESC, init_sales ' . $val;
                            break;
                    }
                }
            }
            if (!empty($orderBy)) {
                $orderBy = substr($orderBy, 1);
            } else {
                $orderBy .= 'release_date DESC';
            }
        } else {
            $orderBy = 'relevance DESC, release_date DESC';
        }
    }

    /*     * *
     * Função simplificada para reuso do search, em consulta de similares
     */
    private function resultDevelopments($filter) {
        // TODO: ajuste para excluir REVENDA do resultado de busca
        $filter['is_new'] = true;

        if(isset($filter['pre_launch']) && $filter['pre_launch'] === true){
            if(!isset($filter['order_by'])){
                $filter['order_by'] = array();
            }
            array_unshift($filter['order_by'],array("init_sales" => "DESC"));
        }

        // Verifico se é listagem para o Mapa e retiro a paginação
        if (!isset($filter['map_view']) || $filter['map_view'] != true) {
            if (!isset($filter['size']) || $filter['size'] < 0) {
                $filter['size'] = 10;
            } else {
                if ($filter['size'] > 1000) {
                    $filter['size'] = 1000;
                }
            }
            if (!isset($filter['page_token']) || $filter['page_token'] < 1) {
                $filter['page_token'] = 1;
            }
        } else {
            $filter['size'] = 10000;
            $filter['page_token'] = 1;
        }


        $limitMaxRegister = $filter['size'] * $filter['page_token'];
        $limit = " LIMIT " . $filter['size'] . " offset " . ( $limitMaxRegister - $filter['size']);

        $dataResults = array();
        //TRATAMENTO se somente total, não busca dados
        if (empty(@$filter['count_only']) || @$filter['count_only'] != true || @$filter['count_only'] != 1) {

            $selectFields = "*";
            $groupBy = 'module_imobles_enterprise_id';
            $this->orderBy($filter, $orderBy, $orderTypeUnit);
            $sql = $this->searchSQL($filter, $selectFields, $groupBy, $orderBy, $limit);

            $dat = ORM::for_table('module_imobles_view_type_units_search')
                ->raw_query($sql)
                ->find_array();

            if (count($dat) > 0) {
                $ent = "";
                $queryDispobibleUnit = "";

                foreach ($dat as $d) {
                    $dataResults[$d['module_imobles_enterprise_id']]['id'] = $d['module_imobles_enterprise_id'];
                    $dataResults[$d['module_imobles_enterprise_id']]['name'] = $d['enterprise_name'];
                    $dataResults[$d['module_imobles_enterprise_id']]['has_no_ri'] = $d['has_no_ri'];
                    $dataResults[$d['module_imobles_enterprise_id']]['hubspot_alias'] = $d['hubspot'];
                    $dataResults[$d['module_imobles_enterprise_id']]['development_url'] = $d['site_url'];
                    $dataResults[$d['module_imobles_enterprise_id']]['init_sales'] = $d['init_sales'];
                    $dataResults[$d['module_imobles_enterprise_id']]['development_id'] = $d['module_imobles_enterprise_id'];
                    $dataResults[$d['module_imobles_enterprise_id']]['relevance'] = $d['relevance'];
                    $dataResults[$d['module_imobles_enterprise_id']]['development_slug'] = $d['slug'];

                    if(!empty($d['price_type'])) {
                        $dataResults[$d['module_imobles_enterprise_id']]['development_price_type'] = $d['price_type'];
                    } else {
                        $dataResults[$d['module_imobles_enterprise_id']]['development_price_type'] = null;
                    }

                    if($d['pre_launch'] == 1) {
                        $dataResults[$d['module_imobles_enterprise_id']]['pre_launch'] = true;
                    } else {
                        $dataResults[$d['module_imobles_enterprise_id']]['pre_launch'] = false;
                    }

                    // Incluo os dados do hotsite
                    if (!empty($d['hotsite_params'])) {
                        $hotsite_json = json_decode($d['hotsite_params']);
                        if(isset($hotsite_json->development_hotsite_enabled)) {
                            $dataResults[$d['module_imobles_enterprise_id']]['hotsite'] = array("development_hotsite_enabled" => $hotsite_json->development_hotsite_enabled);
                        }

                        if(isset($hotsite_json->card_description)) {
                            $dataResults[$d['module_imobles_enterprise_id']]['card_description'] = $hotsite_json->card_description;
                        }
                    }

                    // Verifico se é imóvel NOVO ou REVENDA
                    $dataResults[$d['module_imobles_enterprise_id']]['is_new'] = false;
                    if ($d["imobles_client"] == 1) {
                        $dataResults[$d['module_imobles_enterprise_id']]['is_new'] = true;
                    }

                    if (strtotime(date("Y-m-d")) >= strtotime($d['release_date'])) {
                        $dataResults[$d['module_imobles_enterprise_id']]['construction_status'] = 'Ready to move in';
                    } else {
                        $dataResults[$d['module_imobles_enterprise_id']]['construction_status'] = 'In Works';
                    }

                    if (isset($d['release_date']) && !empty($d['release_date'])) {
                        $year = date("Y", strtotime($d['release_date']));
                        if ($year >= 1950) {
                            $dataResults[$d['module_imobles_enterprise_id']]['release_date'] = date("Y-m-d", strtotime($d['release_date']));
                        } else {
                            $dataResults[$d['module_imobles_enterprise_id']]['release_date'] = "0000-00-00";
                        }
                    } else {
                        $dataResults[$d['module_imobles_enterprise_id']]['release_date'] = "0000-00-00";
                    }


                    $dataResults[$d['module_imobles_enterprise_id']]['address'] = array(
                        'country' => 'BR',
                        'zip_code' => $d['address_zip'],
                        'city' => $d['city_name'],
                        'ibge_city_id' => $d['city_ibge'],
                        'state_acronym' => $d['uf_state'],
                        'state' => $d['state_name'],
                        'ibge_state_id' => $d['code_state'],
                        'street' => $d['address_log'],
                        'number' => $d['address_number'],
                        'neighborhood' => $d['address_neightborhood'],
                    );
                    $dataResults[$d['module_imobles_enterprise_id']]['construction_company'] = $d['company_construction_name'] == null ? "N/A" : $d['company_construction_name'];
                    $dataResults[$d['module_imobles_enterprise_id']]['construction_company_id'] = $d['module_imobles_company_construction_id'] == null ? 0 : $d['module_imobles_company_construction_id'];
                    $dataResults[$d['module_imobles_enterprise_id']]['construction_company_status'] = $d['company_construction_status'] == null ? 0 : $d['company_construction_status'];

                    $dataResults[$d['module_imobles_enterprise_id']]['financing']['entry'] = $d['value_input_porcentage'];
                    $dataResults[$d['module_imobles_enterprise_id']]['financing']['installment'] = $d['value_installment_porcentage'];
                    $dataResults[$d['module_imobles_enterprise_id']]['financing']['founding'] = $d['value_founding_porcentage'];

                    //IMB-19
                    if (!empty($d['google_geometry'])) {
                        $dataResults[$d['module_imobles_enterprise_id']]['geometry'] = json_decode($d['google_geometry']);
                        // TODO: RESOLVER O PROBLEMA DE SE PEGAR O LAT/LONG DO GOOGLE
                        if(isset($dataResults[$d['module_imobles_enterprise_id']]['geometry']->location)) {
                            $dataResults[$d['module_imobles_enterprise_id']]['geometry']->location = array("lat" => floatval($d['latitude']), "lng" => floatval($d['longitude']));
                        }
                    } else {
                        $dataResults[$d['module_imobles_enterprise_id']]['geometry'] = array("location" => array("lat" => floatval($d['latitude']), "lng" => floatval($d['longitude'])));
                    }

                    $ent .= "," . $d['module_imobles_enterprise_id'];
                }


                /*
                 *  Pego as imagens de backend
                 */
                $c = ORM::for_table('module_imobles_enterprise_imgs')
                    ->raw_query("SELECT s.module_imobles_enterprise_id, s.src, s.alt_text, s.resized, s.webp, s.tags, s.unit_type_id, s.description, s.id FROM"
                        . " module_imobles_enterprise_imgs as s"
                        . " WHERE (s.duplicated IS NULL OR s.duplicated=0) AND type = 'backend' "
                        . " AND s.module_imobles_enterprise_id IN(" . substr($ent, 1) . ") "
                        . " AND s.delete_at IS NULL AND s.tags IS NOT NULL ")
                    ->find_array();


                /*
                 * BUSCA as UNIT_TYPES
                 */
                $selectFields = "*";
                $extraParams = array();
                $extraParams[] = "module_imobles_enterprise_id IN (" . substr($ent, 1) . ")";
                $groupBy = "";
                $limit = "";
                $orderTypeUnit = $orderTypeUnit . " , id";
                $sql = $this->searchSQL($filter, $selectFields, $groupBy, $orderTypeUnit, $limit, $extraParams);
                
                $types = ORM::for_table('module_imobles_view_type_units_search')
                    ->raw_query($sql)
                    ->find_array();

                foreach ($types as $u) {

                    // Pego as imagens da Tipo de Unidade
                    $arr_unit_type_imgs = array();

                    if (count($c) > 0 && isset($filter['full_info']) && $filter['full_info'] === true) {
                        foreach ($c as $im) {
                            $arr_tags = array();
                            if ($im['unit_type_id'] != $u['id']) {
                                continue;
                            }
                            if (empty($arr_unit_type_imgs) || count($arr_unit_type_imgs) < 10) {
                                if (!empty($im['tags']) && $im['tags'] != "null") {
                                    $arr_tags_id = json_decode($im['tags']);
                                    if(!empty($arr_tags_id)){
                                        $arr_tags_aux = ORM::for_table('module_imobles_enterprise_img_backend_tags')
                                            ->select('name')
                                            ->where_in('id', $arr_tags_id)
                                            ->find_array();

                                        foreach ($arr_tags_aux as $tags) {
                                            $arr_tags[] = $tags['name'];
                                        }
                                    }

                                
                                    // Monto o array com os tamanhos alternativos das imagens
                                    $alternatives_sizes = null;
                                    if ($im['resized'] == 1) {
                                        $alternatives_sizes = array("1152x768" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xxl/" . $im['src'],
                                            "840x560" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xlg/" . $im['src'],
                                            "600x400" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/lrg/" . $im['src'],
                                            "450x300" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/med/" . $im['src'],
                                            "300x200" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/sml/" . $im['src'],
                                            "120x80" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xsm/" . $im['src'],
                                            "104x80" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/thumb/" . $im['src']);
                                    }

                                    $webp = false;
                                    if ($im['webp'] == 1) {
                                        $webp = true;
                                    }
                                    $arr_unit_type_imgs[] = array(
                                        "type" => 'IMAGE',
                                        "url" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/" . $im['src'],
                                        "description" => $im['description'],
                                        "alt_text" => $im['alt_text'],
                                        "tags" => $arr_tags,
                                        "alternatives_sizes" => $alternatives_sizes,
                                        "webp" => $webp);
                                }
                            } else {
                                break;
                            }
                        }
                    }

                    if ($u['avg'] < $u['min']) {
                        $u['avg'] = $u['min'];
                    }


                    // Pego os detalhes dos anúncios
                    $arr_listings = array();
                    if ($u["imobles_client"] != 1 && isset($filter['full_info']) && $filter['full_info'] === true) {
                        $unitTypeID = $u['id'];
                        $selectlistings = "SELECT sub_l.id, sub_l.crawler_price, sub_l.crawler_listing_link, sub_l.crawler_portal, sub_l.crawler_updatedAt, ads.logoUrl, ads.name as advertiser_name
                            FROM module_imobles_listings sub_l
                            JOIN module_imobles_advertisers as ads ON ads.id = sub_l.advertiser_id
                            WHERE sub_l.unit_type_id = $unitTypeID
                            AND (sub_l.unavailable IS NULL OR sub_l.unavailable = 0 ) AND sub_l.delete_at IS NULL
                            AND (sub_l.crawler_type_id IS NULL OR sub_l.crawler_type_id <> 4) AND sub_l.advertiser_id IS NOT NULL
                            AND (sub_l.crawler_businessType <> 'RENTAL' OR sub_l.crawler_businessType IS NULL)";
                        $arr_listings_aux = ORM::for_table('module_imobles_enterprise_units_type')
                                ->raw_query($selectlistings)
                                ->find_array();

                        if (count($arr_listings_aux) > 0) {
                            $count_aux = 0;
                            foreach ($arr_listings_aux as $listing_aux) {
                                if (!empty($listing_aux['logoUrl'])) {
                                    $listing_aux['logoUrl'] = str_replace('{width}', '870', $listing_aux['logoUrl']);
                                    $listing_aux['logoUrl'] = str_replace('{height}', '653', $listing_aux['logoUrl']);
                                    $listing_aux['logoUrl'] = str_replace('{action}', 'fit-in', $listing_aux['logoUrl']);
                                }

                                if ($listing_aux['crawler_portal'] == "VIVAREAL") {
                                    $listing_aux['crawler_listing_link'] = "https://vivareal.com.br" . $listing_aux['crawler_listing_link'];
                                }

                                if ($listing_aux['crawler_portal'] == "GRUPOZAP") {
                                    $listing_aux['crawler_listing_link'] = "https://zapimoveis.com.br" . $listing_aux['crawler_listing_link'];
                                }

                                $arr_listings[] = array("id" => $listing_aux['id'],
                                    "price" => $listing_aux['crawler_price'],
                                    "portal" => $listing_aux['crawler_portal'],
                                    "last_update" => $listing_aux['crawler_updatedAt'],
                                    "logo" => $listing_aux['logoUrl'],
                                    "link" => $listing_aux['crawler_listing_link'],
                                    "advertiser_name" => $listing_aux["advertiser_name"]);
                            }
                        }
                    }


                    $dataArray = array(
                        "id" => $u['id'],
                        "total_listing" => number_format($u['total_listings'], 0, "", ""),
                        "unit_available" => number_format($u['available_units'], 0, "", ""),
                        "min_value" => number_format($u['min'], 2, ".", ""),
                        "average_value" => number_format($u['avg'], 2, ".", ""),
                        "max_value" => number_format($u['max'], 2, ".", ""),
                        "bedrooms" => $u['number_rooms'],
                        "bathrooms" => $u['number_bathroom'],
                        "area" => $u['area'],
                        "suites" => $u['number_suite'],
                        "parking_spaces" => $u['number_garage'],
                        "medias" => $arr_unit_type_imgs,
                        "listings_details" => $arr_listings,
                        "is_offer" => $u['promotion']==1?true:false,
                    );

                    if ($u['promotion']==1){
                        $dataArray["description"] = $u['description'];
                        $dataArray['standard_price'] = number_format($u["standard_price"], 2, ".", "");
                    }

                    $dataResults[$u['module_imobles_enterprise_id']]['unit_type'] [] = $dataArray;

                    if (!isset($dataResults[$u['module_imobles_enterprise_id']]['total_units_available'])) {
                        $dataResults[$u['module_imobles_enterprise_id']]['total_units_available'] = 0;
                    }
                    $dataResults[$u['module_imobles_enterprise_id']]['total_units_available'] += $u['available_units'];
                }


                if (count($c) > 0) {
                    $arr_enterprise_imgs = array();
                    $arr_enterprise_gallery_imgs = array();
                    foreach ($c as $im) {
                        if (!empty($im['unit_type_id']) || empty($im['tags'])) {
                            continue;
                        }
                        $arr_tags = array();
                        if (!isset($dataResults[$im['module_imobles_enterprise_id']]['medias']) || count(@$dataResults[$im['module_imobles_enterprise_id']]['medias']) < 10) 
                        {    
                            $arr_tags_id = json_decode($im['tags']);
                            if (!empty($arr_tags_id)) {
                                
                                if(!in_array(10, $arr_tags_id) && !in_array(8, $arr_tags_id) && !in_array(5, $arr_tags_id)  && (!isset($filter['full_info']) || $filter['full_info'] !== true)) {
                                    continue;
                                }
                                
                                // Conto as imagens de galeria
                                if(in_array(10, $arr_tags_id)) {
                                    if(isset($arr_enterprise_gallery_imgs[$im['module_imobles_enterprise_id']]) && count($arr_enterprise_gallery_imgs[$im['module_imobles_enterprise_id']]) >= 5) {
                                        continue;
                                    }
                                    $arr_enterprise_gallery_imgs[$im['module_imobles_enterprise_id']][]= $im['id'];
                                }
                                
                                
                                $arr_tags_aux = ORM::for_table('module_imobles_enterprise_img_backend_tags')
                                    ->select('name')
                                    ->where_in('id', $arr_tags_id)
                                    ->find_array();
                                foreach ($arr_tags_aux as $tags) {
                                    $arr_tags[] = $tags['name'];
                                }
                            } else {
                                continue;
                            }

                            // Monto o array com os tamanhos alternativos das imagens
                            $alternatives_sizes = null;
                            if ($im['resized'] == 1) {
                                // $alternatives_sizes = array("1152x768" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xxl/" . $im['src'],
                                //     "840x560" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xlg/" . $im['src'],
                                //     "600x400" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/lrg/" . $im['src'],
                                //     "450x300" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/med/" . $im['src'],
                                //     "300x200" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/sml/" . $im['src'],
                                //     "120x80" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xsm/" . $im['src'],
                                //     "104x80" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/thumb/" . $im['src']);

                                $alternatives_sizes = array(
                                    "450x300" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/med/" . $im['src']
                                );
                            }

                            $webp = false;
                            if ($im['webp'] == 1) {
                                $webp = true;
                            }
                            $arr_enterprise_imgs[$im['module_imobles_enterprise_id']][] = array(
                                "type" => 'IMAGE',
                                "url" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/" . $im['src'],
                                "description" => $im['description'],
                                "alt_text" => $im['alt_text'],
                                "tags" => $arr_tags,
                                "alternatives_sizes" => $alternatives_sizes,
                                "webp" => $webp);
                        }
                    }

                    foreach ($arr_enterprise_imgs as $k => $v) {
                        $dataResults[$k]['medias'] = $v;
                    }
                }
            }
        }

        // Pego o total de empreendimentos
        $sql = $this->searchSQL($filter, "module_imobles_enterprise_id", "module_imobles_enterprise_id");
        $arr_enterprise_ids = ORM::for_table('module_imobles_view_type_units_search')
            ->raw_query($sql)
            ->find_array();
        
        $arr_enterprise_ids = array_column($arr_enterprise_ids, 'module_imobles_enterprise_id');
        $total_count = count($arr_enterprise_ids);
        $arr_enterprise_ids = implode(',', $arr_enterprise_ids);
        
        if($arr_enterprise_ids) {
            // Pego o total de Anúncios
            $query = "SELECT SUM(total_listings) as total_listings, SUM(available_units) as available_units, min(price_min) as price_from 
                FROM module_imobles_enterprise_units_type
                WHERE site_enabled = 1
                AND delete_at IS null
                AND module_imobles_enterprise_id IN ($arr_enterprise_ids)";
            $listings_aux = ORM::for_table('module_imobles_enterprise_units_type')
                ->raw_query($query)
                ->find_one();
            $total_listings_aux = $listings_aux->total_listings;
            $total_units_aux = $listings_aux->available_units;
            $prices_from = $listings_aux->price_from;

        } else {
            $total_listings_aux = 0;
            $total_units_aux = 0;
            $prices_from = 0;
        }

        // Verifico se é NOINDEX
        $no_index = true;
        if (isset($filter['url_search']) && !empty($filter['url_search'])) {
            
            $url_aux = $filter['url_search'];
            $url_aux = explode('?', $url_aux);
            $url_aux = $url_aux[0];
            $url = ORM::for_table("module_imobles_dynamic_urls")->where("url", $url_aux)->find_one();
            if(isset($url->id) && $url->id > 0){
                $no_index = false;
            }
        }

        $totalresults = count($dataResults);

        $output = array(
            "total_count" => $total_count,
            "total_listings" => $total_listings_aux,
            "total_units" => $total_units_aux,
            "price_from" => $prices_from,
            "page_token" => $totalresults == 0 ? 0 : ( ($total_count >= $limitMaxRegister ? $filter['page_token'] + 1 : "")),
            "size" => $filter['size'],
            "list_size" => $totalresults,
            "locations" => @$filter['locations'],
            "results" => array_values($dataResults),
            "tag_noindex" => $no_index
        );
        return $output;
    }

    public function searchDevelopments($filter = null) {
        ORM::configure('caching', true);

        if($filter == null){
            $filter = $this->APIUtils->getInputFilter();
        }
         

        // Verifico se o bairro é válido
        if (@$filter['locations']) {
            foreach ($filter['locations'] as $d) {

                // TODO: verificar a necessidade desse verificação
                if (!empty($d['address_neighborhood'])) {
                    $address_neightborhood = ORM::for_table('module_imobles_enterprise')
                        ->table_alias('s')
                        ->select_expr("s.address_neightborhood")
                        ->where("s.address_neighborhood_sanitized", sanitizaText($d['address_neighborhood']))
                        ->where_raw("s.delete_at IS NULL")
                        ->find_one();
                    
                    if(!isset($address_neightborhood->address_neightborhood)) {
                        $output = array(
                            "error" => array(
                                "status" => true,
                                "code" => 404,
                                "msg" => "Bairro não encontrado | ".$d['address_neighborhood']
                            ),
                            "total_count" => 0,
                            "page_token" => 0,
                            "size" => $filter['size'],
                            "list_size" => 0,
                            "locations" => @$filter['locations'],
                            "results" => []);
                        return $output;
                    }
                }
            }
        }
        
        return $this->resultDevelopments($filter);
    }

    public function developmentDetails() {
        
        $filter = $this->APIUtils->getInputFilter();

        $dataResults = array();

        $id = null;
        if(isset($filter['development_id']) && !empty($filter['development_id'])) {
            $id = intval($filter['development_id']);
        }
        
        $slug = null;
        if(isset($filter['development_slug']) && !empty($filter['development_slug'])) {
            $slug = $filter['development_slug'];
        }

        if ($id > 0 || !empty($slug)) {

            $selectFields = "*";
            $sql = $this->searchSQL($filter, $selectFields);

            $dat = ORM::for_table('module_imobles_view_type_units_search')
                ->raw_query($sql)
                ->find_array();

            if (count($dat) > 0) {
                $d = $dat[0];

                if (isset($d['imobles_client']) && $d['imobles_client'] == 1) {
                    $resale = false;
                } else {
                    $resale = true;
                }

                $dataResults['name'] = $d['enterprise_name'];
                $dataResults['description'] = $d['enterprise_description'];
                $dataResults['resale'] = $resale;
                $dataResults['has_no_ri'] = $d['has_no_ri'];
                $dataResults['construction_company'] = $d['company_construction_name'];
                $dataResults['construction_company_id'] = $d['module_imobles_company_construction_id'];
                $dataResults['construction_company_slug'] = $d['construction_company_slug'];

                // Verifico se temos os parâmetros adicionais da construtora
                $dataResults['construction_company_params'] = null;

                if (!empty($d['module_imobles_company_construction_id'])) {
                    // Pego as imagens de backend da Construtora
                    $tags = ORM::for_table('module_imobles_enterprise_img_backend_tags')
                        ->table_alias('s')
                        ->find_many();
                    $arrayTag = array();
                    foreach ($tags as $t) {
                        $arrayTag[$t->id] = $t->name;
                    }

                    // Pego as imagens de backend da construtora
                    $imagB = ORM::for_table('module_imobles_enterprise_imgs')
                        ->raw_query("SELECT s.module_imobles_enterprise_id, s.src, s.alt_text, s.resized, s.webp, s.tags, s.unit_type_id, s.description, s.construction_company_id FROM"
                            . " module_imobles_enterprise_imgs as s"
                            . " WHERE (s.duplicated IS NULL OR s.duplicated=0) AND type = 'backend' "
                            . " AND s.construction_company_id IN(" . $d['module_imobles_company_construction_id'] . ") "
                            . " AND s.delete_at IS NULL AND s.tags IN ('[\"23\"]', '[\"2\"]') ")
                        ->find_array();

                    if (count($imagB) > 0) {
                        foreach ($imagB as $im) {
                            $desc_tags = array();
                            try {
                                $tagsIm = json_decode($im['tags']);
                                if ($tagsIm) {
                                    foreach ($tagsIm as $t) {
                                        $desc_tags[] = $arrayTag[$t];
                                    }
                                }
                            } catch (Exception $e) {
                                $desc_tags = "";
                            }

                            // Monto o array com os tamanhos alternativos das imagens
                            $alternatives_sizes = null;
                            if ($im['resized'] == 1) {
                                $alternatives_sizes = array("1152x768" => APP_URL . "/application/plugins/module_imobles/uploads/companyconstruction/" . $im['construction_company_id'] . "/images/xxl/" . $im['src'],
                                    "840x560" => APP_URL . "/application/plugins/module_imobles/uploads/companyconstruction/" . $im['construction_company_id'] . "/images/xlg/" . $im['src'],
                                    "600x400" => APP_URL . "/application/plugins/module_imobles/uploads/companyconstruction/" . $im['construction_company_id'] . "/images/lrg/" . $im['src'],
                                    "450x300" => APP_URL . "/application/plugins/module_imobles/uploads/companyconstruction/" . $im['construction_company_id'] . "/images/med/" . $im['src'],
                                    "300x200" => APP_URL . "/application/plugins/module_imobles/uploads/companyconstruction/" . $im['construction_company_id'] . "/images/sml/" . $im['src'],
                                    "120x80" => APP_URL . "/application/plugins/module_imobles/uploads/companyconstruction/" . $im['construction_company_id'] . "/images/xsm/" . $im['src']);
                                
                                if(in_array("DEVELOPMENT_GALLERY_IMGS", $desc_tags)) {
                                    $alternatives_sizes["104x80"] =  APP_URL . "/application/plugins/module_imobles/uploads/companyconstruction/" . $im['construction_company_id'] . "/images/thumb/" . $im['src'];
                                }
                            }

                            $webp = false;
                            if ($im['webp'] == 1) {
                                $webp = true;
                            }
                            $dataResults['construction_company_params']['medias'][] = array(
                                "type" => 'IMAGE',
                                "url" => APP_URL . "/application/plugins/module_imobles/uploads/companyconstruction/" . $im['construction_company_id'] . "/images/" . $im['src'],
                                "description" => $im['description'],
                                "alt_text" => $im['alt_text'],
                                "tags" => $desc_tags,
                                "alternatives_sizes" => $alternatives_sizes,
                                "webp" => $webp
                            );
                        }
                    }

                    if (!empty($d['construction_company_params'])) {
                        $dataResults['construction_company_params']['hotsite'] = json_decode($d['construction_company_params']);
                    }
                }

                $dataResults['hubspot_alias'] = $d['hubspot'];
                $dataResults['development_url'] = $d['site_url'];
                $dataResults['init_sales'] = $d['init_sales'];
                $dataResults['development_id'] = $d['module_imobles_enterprise_id'];
                $dataResults['development_slug'] = $d['slug'];

                if(!empty($d['price_type'])) {
                    $dataResults['development_price_type'] = $d['price_type'];
                } else {
                    $dataResults['development_price_type'] = null;
                }

                // Verifico se é imóvel NOVO ou REVENDA
                $dataResults['is_new'] = false;
                if ($d["imobles_client"] == 1) {
                    $dataResults['is_new'] = true;
                }

                //tratamento do stagio conforme regra IMB-18
                if (empty($d['stage'])) {
                    if (strtotime(date("Y-m-d")) >= strtotime($d['release_date'])) {
                        $dataResults['construction_status'] = 'Ready to move in';
                    } else {
                        $dataResults['construction_status'] = 'In Works';
                    }
                    $dataResults['release_date'] = date("Y-m-d", strtotime($d['release_date']));
                } else {
                    $dataResults['construction_status'] = $d['stage'];
                    $dataResults['release_date'] = date("Y-m-d", strtotime($d['release_date']));
                }
                $dataResults['property_standard'] = $d['property_standard'];
                $dataResults['financing']['entry'] = $d['value_input_porcentage'];
                $dataResults['financing']['installment'] = $d['value_installment_porcentage'];
                $dataResults['financing']['founding'] = $d['value_founding_porcentage'];

                if (!empty($d['google_geometry'])) {
                    $dataResults['geometry'] = json_decode($d['google_geometry']);

                    // TODO: RESOLVER O PROBLEMA DE SE PEGAR O LAT/LONG DO GOOGLE
                    $dataResults['geometry']->location = array("lat" => floatval($d['latitude']), "lng" => floatval($d['longitude']));
                } else {
                    $dataResults['geometry'] = array("location" => array("lat" => floatval($d['latitude']), "lng" => floatval($d['longitude'])));
                }
                
                if (!empty($d['enterprise_google_json'])) {
                    $google_json = json_decode($d['enterprise_google_json']);
                    $dataResults['google_reviews'] = @$google_json->reviews;
                } else {
                    $dataResults['google_reviews'] = null;
                }

                if (!empty($d['google_rating'])) {
                    $dataResults['google_rating'] = $d['google_rating'];
                } else {
                    $dataResults['google_rating'] = null;
                }

                $dataResults['google']['place_id'] = $d['google_place_id'];
                $dataResults['google']['rating'] = $d['google_rating'];
                $dataResults['google']['link'] = $d['link_google'];

                $dataResults['link_presentation'] = $d['link_presentation'];

                $hotsiteTitle = '';
                $hotsiteText = '';
                if(!empty($d['neighborhood_params'])){
                    $neighborhoodParams = json_decode($d['neighborhood_params']);
                    $hotsiteTitle = $neighborhoodParams->hotsite_title;
                    $hotsiteText = $neighborhoodParams->hotsite_text;
                    $hotsiteTitle = str_replace('{{enterprise_name}}', $d['enterprise_name'], $hotsiteTitle);
                    $hotsiteText = str_replace('{{enterprise_name}}', $d['enterprise_name'], $hotsiteText);
                }

                // Pego a imagem do bairro
                $neighborhood_images_arr = array();
                if(!empty($d['neighborhood_id'])){
                    $neighborhood_images = ORM::for_table('module_imobles_enterprise_imgs')
                        ->raw_query("SELECT s.module_imobles_enterprise_id, s.src, s.alt_text, s.resized, s.webp, s.tags, s.unit_type_id, s.description, s.neighborhood_id FROM"
                            . " module_imobles_enterprise_imgs as s"
                            . " WHERE s.neighborhood_id = ".$d['neighborhood_id'] 
                            . " AND s.delete_at IS NULL")
                        ->find_array();
                        
                    if (count($neighborhood_images) > 0) {
                        foreach ($neighborhood_images as $im) {
                            $desc_tags = array();
                            // try {
                            //     $tagsIm = json_decode($im['tags']);
                            //     if ($tagsIm) {
                            //         foreach ($tagsIm as $t) {
                            //             $desc_tags[] = $arrayTag[$t];
                            //         }
                            //     }
                            // } catch (Exception $e) {
                            //     $desc_tags = "";
                            // }

                            // Monto o array com os tamanhos alternativos das imagens
                            $alternatives_sizes = null;
                            if ($im['resized'] == 1) {
                                $alternatives_sizes = array("1152x768" => APP_URL . "/application/plugins/module_imobles/uploads/neighborhood/" . $im['neighborhood_id'] . "/images/xxl/" . $im['src'],
                                    "840x560" => APP_URL . "/application/plugins/module_imobles/uploads/neighborhood/" . $im['neighborhood_id'] . "/images/xlg/" . $im['src'],
                                    "600x400" => APP_URL . "/application/plugins/module_imobles/uploads/neighborhood/" . $im['neighborhood_id'] . "/images/lrg/" . $im['src'],
                                    "450x300" => APP_URL . "/application/plugins/module_imobles/uploads/neighborhood/" . $im['neighborhood_id'] . "/images/med/" . $im['src'],
                                    "300x200" => APP_URL . "/application/plugins/module_imobles/uploads/neighborhood/" . $im['neighborhood_id'] . "/images/sml/" . $im['src'],
                                    "120x80" => APP_URL . "/application/plugins/module_imobles/uploads/neighborhood/" . $im['neighborhood_id'] . "/images/xsm/" . $im['src']);
                                
                                if(in_array("DEVELOPMENT_GALLERY_IMGS", $desc_tags)) {
                                    $alternatives_sizes["104x80"] =  APP_URL . "/application/plugins/module_imobles/uploads/neighborhood/" . $im['neighborhood_id'] . "/images/thumb/" . $im['src'];
                                }
                            }
                            
                            $webp = false;
                            if ($im['webp'] == 1) {
                                $webp = true;
                            }
                            $neighborhood_images_arr[] = array(
                                "type" => 'IMAGE',
                                "url" => APP_URL . "/application/plugins/module_imobles/uploads/neighborhood/" . $im['neighborhood_id'] . "/images/" . $im['src'],
                                "description" => $im['description'],
                                "alt_text" => $im['alt_text'],
                                "tags" => $desc_tags,
                                "alternatives_sizes" => $alternatives_sizes,
                                "webp" => $webp
                            );
                        }
                    }
                }

                $dataResults['address'] = array(
                    'country' => 'BR',
                    'zip_code' => $d['address_zip'],
                    'city' => $d['city_name'],
                    'ibge_city_id' => $d['city_ibge'],
                    'state_acronym' => $d['uf_state'],
                    'state' => $d['state_name'],
                    'ibge_state_id' => $d['code_state'],
                    'street' => $d['address_log'],
                    'number' => $d['address_number'],
                    'neighborhood' => $d['address_neightborhood'],
                    'hotsite_title' => $hotsiteTitle,
                    'hotsite_text' => $hotsiteText,
                    'neighborhood_google_place_details' => json_decode($d['neighborhood_google_place_details']),
                    'neighborhood_images' => $neighborhood_images_arr
                );

                $tags = ORM::for_table('module_imobles_enterprise_img_backend_tags')
                    ->table_alias('s')
                    ->find_many();
                $arrayTag = array();
                foreach ($tags as $t) {
                    $arrayTag[$t->id] = $t->name;
                }

                // Pego as imagens de backend
                $imagB = ORM::for_table('module_imobles_enterprise_imgs')
                    ->raw_query("SELECT s.module_imobles_enterprise_id, s.src, s.alt_text, s.resized, s.webp, s.tags, s.unit_type_id, s.description FROM"
                        . " module_imobles_enterprise_imgs as s"
                        . " WHERE (s.duplicated IS NULL OR s.duplicated=0) AND type = 'backend' "
                        . " AND s.module_imobles_enterprise_id IN(" . $d['module_imobles_enterprise_id'] . ") "
                        . " AND s.delete_at IS NULL AND s.tags IS NOT NULL ")
                    ->find_array();

                if (count($imagB) > 0) {
                    foreach ($imagB as $im) {
                        if (!empty($im['unit_type_id']) || empty($im['tags'])) {
                            continue;
                        }
                        $desc_tags = array();
                        try {
                            $tagsIm = json_decode($im['tags']);
                            if ($tagsIm) {
                                foreach ($tagsIm as $t) {
                                    if(isset($arrayTag[$t])){
                                        $desc_tags[] = $arrayTag[$t];
                                    }
                                }
                            }
                        } catch (Exception $e) {
                            $desc_tags = "";
                        }

                        // Monto o array com os tamanhos alternativos das imagens
                        $alternatives_sizes = null;
                        if ($im['resized'] == 1) {
                            $alternatives_sizes = array("1152x768" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xxl/" . $im['src'],
                                "840x560" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xlg/" . $im['src'],
                                "600x400" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/lrg/" . $im['src'],
                                "450x300" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/med/" . $im['src'],
                                "300x200" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/sml/" . $im['src'],
                                "120x80" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xsm/" . $im['src']);
                            
                            if(in_array("DEVELOPMENT_GALLERY_IMGS", $desc_tags))
                            {
                                $alternatives_sizes["104x80"] =  APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/thumb/" . $im['src'];
                            }
                        }

                        $webp = false;
                        if ($im['webp'] == 1) {
                            $webp = true;
                        }
                        $dataResults['medias'][] = array(
                            "type" => 'IMAGE',
                            "url" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/" . $im['src'],
                            "description" => $im['description'],
                            "alt_text" => $im['alt_text'],
                            "tags" => $desc_tags,
                            "alternatives_sizes" => $alternatives_sizes,
                            "webp" => $webp
                        );
                    }
                }

                $filterListMediaPriceLIsting = " AND (sub_price2.delete_at IS NULL AND "
                    . "(sub_price2.crawler_status IS NULL OR sub_price2.crawler_status='ACTIVE')"
                    . " AND (sub_price2.unavailable IS NULL OR sub_price2.unavailable=0)"
                    . ")";

                if ($resale === false) {
                    $query_resale = " AND  u.crawler_type_id = 4  ";
                    $query_resale .= " AND l.crawler_type_id = 4 AND l.advertiser_id IS NULL AND l.crawler_price > 0  AND u.delete_at IS NULL ";
                    $filterListMediaPriceLIsting .= " AND sub_price2.crawler_type_id = 4 AND sub_price2.advertiser_id IS NULL ";
                } else {
                    $query_resale = " ";
                    $filterListMediaPriceLIsting .= "AND (sub_price2.crawler_type_id  IS NULL OR sub_price2.crawler_type_id <> 4)  AND sub_price2.advertiser_id IS NOT NULL AND (sub_price2.crawler_businessType <> 'RENTAL' OR sub_price2.crawler_businessType IS NULL) ";
                    $query_resale .= " AND l.crawler_price > 0 AND u.delete_at IS NULL AND (l.crawler_type_id  IS NULL OR l.crawler_type_id <> 4)  AND l.advertiser_id IS NOT NULL AND (l.crawler_businessType <> 'RENTAL' OR l.crawler_businessType IS NULL)  ";
                }

                $arr_unit_type_imgs = array();

                $selectFields = "*";
                $groupBy = 'module_imobles_enterprise_id, id, number_rooms, number_suite, area, number_garage, number_bathroom';
                $this->orderBy($filter, $orderBy, $orderTypeUnit);
                $sql = $this->searchSQL($filter, $selectFields, $groupBy, $orderBy);

                $types = ORM::for_table('module_imobles_view_type_units_search')
                    ->raw_query($sql)
                    ->find_array();
                
                $total_units = 0;
                $total_development_units = null;
                if (count($types) > 0) {
                    foreach ($types as $u) {
                        if($total_development_units === null){
                            $total_development_units = $u['enterprise_total_units'];
                        }
                        if (count($imagB) > 0) {
                            foreach ($imagB as $im) {
                                $arr_tags = array();
                                if ($im['unit_type_id'] != $u['id'] || empty($im['tags'])) {
                                    continue;
                                }

                                if (empty($arr_unit_type_imgs[$u['id']]) || count($arr_unit_type_imgs[$u['id']]) < 10) {

                                    // TODO: erro quando imageem está quebrada ou sem tags
                                    $arr_tags_id = json_decode($im['tags']);
                                    if(count($arr_tags_id) == 0) {
                                        continue;
                                    }
                                    $arr_tags_aux = ORM::for_table('module_imobles_enterprise_img_backend_tags')->select('name')->where_in('id', $arr_tags_id)->find_array();

                                    foreach ($arr_tags_aux as $tags) {
                                        $arr_tags[] = $tags['name'];
                                    }

                                    // Monto o array com os tamanhos alternativos das imagens
                                    $alternatives_sizes = null;
                                    if ($im['resized'] == 1) {
                                        $alternatives_sizes = array("1152x768" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xxl/" . $im['src'],
                                            "840x560" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xlg/" . $im['src'],
                                            "600x400" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/lrg/" . $im['src'],
                                            "450x300" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/med/" . $im['src'],
                                            "300x200" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/sml/" . $im['src'],
                                            "120x80" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/xsm/" . $im['src']);
                                        
                                        if(in_array("DEVELOPMENT_GALLERY_IMGS", $arr_tags)) {
                                            $alternatives_sizes["104x80"] =  APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/thumb/" . $im['src'];
                                        }
                                    }

                                    $webp = false;
                                    if ($im['webp'] == 1) {
                                        $webp = true;
                                    }
                                    $arr_unit_type_imgs[$u['id']][] = array(
                                        "type" => 'IMAGE',
                                        "url" => APP_URL . "/application/plugins/module_imobles/uploads/enterprise/" . $im['module_imobles_enterprise_id'] . "/images/" . $im['src'],
                                        "description" => $im['description'],
                                        "alt_text" => $im['alt_text'],
                                        "tags" => $arr_tags,
                                        "alternatives_sizes" => $alternatives_sizes,
                                        "webp" => $webp);
                                } else {
                                    break;
                                }
                            }
                        }

                        //bbusca os tipos de unidade
                        $am = ORM::for_table('module_imobles_enterprise_units_type_amenities')
                            ->table_alias('s')
                            ->select("sub.name")
                            ->select_expr("sub.type")
                            ->select_expr("sub.icon")
                            ->join('module_imobles_type_units_amenities', 's.module_imobles_type_units_amenities_id = sub.id', 'sub')
                            ->where('s.module_imobles_enterprise_units_type_id', $u['id'])
                            ->find_array();
                        if ($u['avg'] < $u['min']) {
                            $u['avg'] = $u['min'];
                        }

                        // Pego os detalhes dos anúncios
                        $arr_listings = array();
                        if ($resale === true) {
                            $selectlistings = "select sub_l.id, sub_l.crawler_price, sub_l.crawler_listing_link, sub_l.crawler_portal, sub_l.crawler_updatedAt, ads.logoUrl, ads.name as advertiser_name "
                                . "from module_imobles_listings sub_l "
                                . " JOIN module_imobles_advertisers as ads ON ads.id = sub_l.advertiser_id "
                                . "  where sub_l.unit_type_id= " . $u['id'] . " AND (sub_l.unavailable IS NULL OR sub_l.unavailable = 0 ) AND sub_l.delete_at IS NULL AND "
                                . "(sub_l.crawler_type_id IS NULL OR sub_l.crawler_type_id <> 4) AND sub_l.advertiser_id IS NOT NULL AND "
                                . "(sub_l.crawler_businessType <> 'RENTAL' OR sub_l.crawler_businessType IS NULL)";
                            $arr_listings_aux = ORM::for_table('module_imobles_enterprise_units_type')
                                ->raw_query($selectlistings)
                                ->find_array();

                            if (count($arr_listings_aux) > 0) {
                                $count_aux = 0;
                                foreach ($arr_listings_aux as $listing_aux) {
                                    if (!empty($listing_aux['logoUrl'])) {
                                        $listing_aux['logoUrl'] = str_replace('{width}', '870', $listing_aux['logoUrl']);
                                        $listing_aux['logoUrl'] = str_replace('{height}', '653', $listing_aux['logoUrl']);
                                        $listing_aux['logoUrl'] = str_replace('{action}', 'fit-in', $listing_aux['logoUrl']);
                                    }

                                    if ($listing_aux['crawler_portal'] == "VIVAREAL") {
                                        $listing_aux['crawler_listing_link'] = "https://vivareal.com.br" . $listing_aux['crawler_listing_link'];
                                    }

                                    if ($listing_aux['crawler_portal'] == "GRUPOZAP") {
                                        $listing_aux['crawler_listing_link'] = "https://zapimoveis.com.br" . $listing_aux['crawler_listing_link'];
                                    }

                                    $arr_listings[] = array("id" => $listing_aux['id'],
                                        "price" => $listing_aux['crawler_price'],
                                        "portal" => $listing_aux['crawler_portal'],
                                        "last_update" => $listing_aux['crawler_updatedAt'],
                                        "logo" => $listing_aux['logoUrl'],
                                        "link" => $listing_aux['crawler_listing_link'],
                                        "advertiser_name" => $listing_aux["advertiser_name"]
                                    );
                                }
                            }
                        }

                        // TODO: recalcular esses valores chumbados para nova ficha do empreendimento. 
                        $financial_information = array(
                            "rent" => 5000.00,
                            "itbi"  => 500.55,
                            "notary_fees" => 5000.00,
                            "condo_fee" => 350.00,
                            "iptu" => 580.00,
                            "imobles_index" => -20.00
                        );

                        $dataArray = array(
                            "id" => $u['id'],
                            "total_listing" => $u['total_listings'],
                            "unit_available" => $u['available_units'],
                            "min_value" => number_format($u['min'], 2, ".", ""),
                            "average_value" => number_format($u['avg'], 2, ".", ""),
                            "max_value" => number_format($u['max'], 2, ".", ""),
                            "bedrooms" => $u['number_rooms'],
                            "bathrooms" => $u['number_bathroom'],
                            "area" => $u['area'],
                            "suites" => $u['number_suite'],
                            "parking_spaces" => $u['number_garage'],
                            "amenities" => $am,
                            "medias" => @$arr_unit_type_imgs[$u['id']],
                            "listings_details" => $arr_listings,
                            "financial_information" => $financial_information,
                            "highlighted" => $u['imobles_indicates']==1?true:false,
                            "is_offer" => $u['promotion']==1?true:false,
                        );
                      
                        if ($u['promotion']==1){
                            $dataArray["description"] = $u['description'];
                            $dataArray['standard_price'] = number_format($u["standard_price"], 2, ".", "");
                        }

                        $dataResults['unit_type'] [] = $dataArray;

                        $total_units += $u['available_units'];
                    }
                }

                $amenities = ORM::for_table('module_imobles_enterprise_entreprise_amenities')
                        ->table_alias('s')
                        ->select("sub.name")
                        ->select_expr("sub.type")
                        ->select_expr("sub.icon")
                        ->join('module_imobles_enterprise_amenities', 's.module_imobles_enterprise_amenities_id = sub.id', 'sub')
                        ->where('s.module_imobles_enterprise_id', $d['module_imobles_enterprise_id'])
                        ->find_array();
                $dataResults['amenities'] = $amenities;

                // Pego os amenities obrigatórios
                $required_amenities = ORM::for_table("module_imobles_enterprise_amenities")->select_many('name', 'type', 'icon')->where("required", 1)->find_array();
                $dataResults['required_amenities'] = $required_amenities;

                // Pego os dados do Hotsite
                if (!empty($d['hotsite_params'])) {
                    $dataResults['hotsite'] = json_decode($d['hotsite_params']);
                } else {
                    $dataResults['hotsite'] = null;
                }

                if (!empty($d['youtube_video'])) {
                    $dataResults['video_youtube'] = $d['youtube_video'];
                } else {
                    $dataResults['video_youtube'] = null;
                }

                // TODO: recalcular esses valores chumbados para nova ficha do empreendimento. 
                $dataResults['price_variation'] = "down";

                // Pego o total de unidades disponĩveis
                if($total_development_units > 0){
                    $dataResults['total_units'] = $total_development_units;
                } else {
                    $dataResults['total_units'] = null;
                }

                // Data de lançamento do empreendimento
                $dataResults['meeting_date'] = $d['meeting_date'];

                // Pego a data da última atualização da tabela de preço
                $query = 
                    "SELECT 
                        d.created_at, d.issued_date
                    FROM	
                        module_imobles_docs d
                    LEFT JOIN
                        module_imobles_docs_category dc ON d.module_imobles_docs_category_id = dc.id
                    WHERE
                        d.module_imobles_enterprise_id = " . $d['module_imobles_enterprise_id'] . "
                        AND d.delete_at IS NULL
                        AND d.module_imobles_docs_category_id
                        AND dc.name IN ('TABELA DE PREÇO')
                    ORDER BY d.id DESC
                    LIMIT 1";
                $docs_aux = ORM::for_table("module_imobles_docs_category")
                    ->raw_query($query)
                    ->find_one();
                if(!empty($docs_aux->issued_date)){
                    $expiration_date = strtotime($docs_aux->issued_date);
                    $expiration_date = date('Y-m-d',$expiration_date);
                    $expiration_date = new DateTime($expiration_date);
                    $now = new DateTime('NOW');
                    $diff = $expiration_date->diff($now)->days;
                    if($diff <= 90){
                        $dataResults['price_table_emission_date'] = $expiration_date->format('Y-m-d');
                    } else {
                        $dataResults['price_table_emission_date'] = null;
                        
                        // Salvo no log o erro na tabela de preços do empreendimento
                        $data = array(
                            "development_id" => $d['module_imobles_enterprise_id'],
                            "development_url" => $d['site_url'],
                            "error_type" => "documents",
                            "erro_msg" => "Tabela de preço expirada há mais de 60 dias"
                        );
                        $log = ORM::for_table('module_imobles_logs')->create();
                        $log->type = 'development_error';
                        $log->params = json_encode($data);
                        $log->save();
                    }
                } else {
                    if(!empty($docs_aux->created_at)){
                        $expiration_date = strtotime($docs_aux->created_at);
                        $expiration_date = date('Y-m-d',$expiration_date);
                        $expiration_date = new DateTime($expiration_date);
                        $now = new DateTime('NOW');
                        $diff = $expiration_date->diff($now)->days;
                        if($diff <= 90){
                            $dataResults['price_table_emission_date'] = $expiration_date->format('Y-m-d');
                        } else {
                            $dataResults['price_table_emission_date'] = null;
                            
                            // Salvo no log o erro na tabela de preços do empreendimento
                            $data = array(
                                "development_id" => $d['module_imobles_enterprise_id'],
                                "development_url" => $d['site_url'],
                                "error_type" => "documents",
                                "erro_msg" => "Tabela de preço expirada há mais de 60 dias"
                            );
                            $log = ORM::for_table('module_imobles_logs')->create();
                            $log->type = 'development_error';
                            $log->params = json_encode($data);
                            $log->save();
    
                        }
                    } else {
                        $dataResults['price_table_emission_date'] = null;
                    }
                }

                if($d['pre_launch'] == 1){
                    $dataResults['pre_launch'] = true;
                } else {
                    $dataResults['pre_launch'] = false;
                }
            }
        }

        $output = array(
            "results" => ($dataResults),
        );
        return $output;
    }

    public function searchDevelopmentsSimilar() {
        ORM::configure('caching', true);
        $filter = $this->APIUtils->getInputFilter();

        $id = intval(@$filter['development_id']);
        $dataResults = array();
        if ($id > 0) {
            $develop = $this->developmentDetails();
            if (count($develop['results']) > 0) {
                if ($develop['results']['unit_type']) {
                    $menorPrice = $develop['results']['unit_type'][0]['min_value'];
                    $menorArea = $develop['results']['unit_type'][0]['area'];
                    $arrayBedRooms = array();
                    foreach ($develop['results']['unit_type'] as $unit) {
                        if ($unit['area'] < $menorArea) {
                            $menorArea = $unit['area'];
                        }
                        if ($unit['min_value'] < $menorPrice) {
                            $menorPrice = $unit['min_value'];
                        }
                        $arrayBedRooms[] = $unit['bedrooms'];
                    }
                }
            } else {
                $output = array(
                    "total_count" => count($dataResults),
                    "results" => array_values($dataResults),
                );
                return $output;
            }

            if(!isset($filter['pre_launch']) || $filter['pre_launch'] === false){
                if (empty(@$filter['bedrooms'])) {
                    $filter['bedrooms'] = $arrayBedRooms;
                }
                if (empty(@$filter['area_min'])) {
                    $filter['area_min'] = $menorArea;
                }
                if (empty(@$filter['price_min'])) {
                    $filter['price_min'] = $menorPrice;
                }
            }

            if (empty(@$filter['is_new'])) {
                $filter['is_new'] = $develop['results']['is_new'];
            }

            if (!isset($filter['order_by'])){
                $filter['order_by'][] = array("price" => 'ASC', "release_date" => 'DESC');
            }

            if (empty(@$filter['locations'])) {
                $locations_aux = array();
                $locations_aux['address_neighborhood'] = $develop['results']['address']['neighborhood'];
                $locations_aux['address_city'] = $develop['results']['address']['city'];
                $locations_aux['address_state'] = $develop['results']['address']['state_acronym'];
                $filter['locations'][] = $locations_aux;
            }
            $filter['development_ids_not_in'][] = $id;
            unset($filter['development_id']);
            $results = $this->resultDevelopments($filter);

            $results2 = array();
            $results3 = array();
            // $size = $results['size'];
            if (!isset($results['list_size']) || $results['list_size'] < $results['size']) {
                //adiciona para não trazer os memos já carregados
                foreach ($results['results'] as $r) {
                    $filter['development_ids_not_in'][] = $r['id'];
                }
                $filter['size'] = $results['size'] - $results['list_size'];
                unset($filter['locations'][0]['address_neighborhood']);
                $results2 = $this->resultDevelopments($filter);
            }

            if (is_array($results['results'])) {
                //coloca todos os primeiros que vieram do mesmo bairro do empreendimento informado
                foreach ($results['results'] as $re) {
                    if ($re['address']['neighborhood'] == $develop['results']['address']['neighborhood']) {
                        $dataResults[] = $re;
                    }
                }
                //coloca os demais, que aplicou o filtro e não estão no mesmo bairrro
                foreach ($results['results'] as $re) {
                    if ($re['address']['neighborhood'] != $develop['results']['address']['neighborhood']) {
                        $dataResults[] = $re;
                    }
                }
            }

            if (is_array(@$results2['results'])) {
                foreach ($results2['results'] as $re) {
                    $dataResults[] = $re;
                }
            }

            if (is_array(@$results3['results'])) {
                foreach ($results3['results'] as $re) {
                    $dataResults[] = $re;
                }
            }
        }

        $output = array(
            "total_count" => count($dataResults),
            "results" => array_values($dataResults),
        );

        return $output;
    }

}

Anon7 - 2022
AnonSec Team