AnonSec Shell
Server IP : 162.214.74.102  /  Your IP : 216.73.217.114
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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

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

include_once __DIR__ . "/../helpers/console/UnitTypeUpdate.php";

class CrawlerHelper {

    function imageWater($src,$newFile) {
        $image = new imagick();
        $image->readImage($src);
        list($width, $height) = getimagesize($src);

        // Open the watermark
        $watermark = new imagick();
        $watermark->readImage("application/plugins/module_imobles/assets/imgs/marca_dagua.png");
        // Overlay the watermark on the original image
        $image->compositeImage($watermark, imagick::COMPOSITE_OVER, $width-150, $height-150);
        
        return $image->writeImage($newFile);     
    }
    
    function handleListing($listings, $modelEnterprises, $modelUnitType, $modelUnit, $listing_id = null, $listing_enterprise_id = null, $enterprise_target_id = null, $crawlerType = null){

        // inicio as variáveis
        $arr_enterprise = array();
        $arr_unitType  = array();
        $arr_unit       = array();
        $arr_listing    = array();
        $obs_info       = null;
        $msg_return     = null;
        $listing_review = true;

        if($crawlerType){
            $crawlerTypeStr = $crawlerType->type;
            $crawlerTypeID  = $crawlerType->id;
        } else {
            $crawlerTypeStr = 'vivareal';
            $crawlerTypeID  = 1;
        }

        // Resultado da API
        if(!isset($listings->listing))
        {
            $return = array("enterprise_new" => null);
            return $return;
        }

        $result_listing     = $listings->listing;
        $result_account     = $listings->account;
        $result_medias      = $listings->medias;
        $result_accountLink = $listings->accountLink;
        $result_link        = $listings->link;


        // Monto a string de camparação com empreendimentos já cadastrados
        $description = $listings->listing->description;
        $title = $listings->listing->title;
        $complement = @$listings->listing->address->complement;
        $codigo_ext = $listings->listing->externalId;
        $str_compare = $description.' @@@ '.$title.' @@@ '.$complement.' @@@ '.$codigo_ext;

        $newPriceInserted = false;

        /*
         *  Verifico se o anúncio já está cadastrado
         */
        if($listing_id === null)
        {
            $listing_review = false;
            $listing_aux = ORM::for_table('module_imobles_listings')
                                ->where('crawler_listing_id', $result_listing->id)
                                ->where('crawler_type', $crawlerTypeStr)
                                ->where('crawler_portal', $result_listing->portal)
                                ->find_one();

            if(isset($listing_aux->id) && $listing_aux->id > 0)
            {
                $updateAux = false;
                if ($listing_aux->crawler_updatedAt < $result_listing->updatedAt) {
                    $updateAux = true;
                }

                $listing_id = $listing_aux->id;
                $listing_aux->crawler_status = $result_listing->status;
                $listing_aux->crawler_json = json_encode($listings);
                $listing_aux->updated_at = date('Y-m-d H:i:s');
                $listing_aux->description = $result_listing->description;
                $listing_aux->title = $result_listing->title;

                // TODO: criar um planilha para salvar a evolução de preços de cada anúncio
                $listing_aux->crawler_pricingInfos = json_encode($result_listing->pricingInfos);
                $listing_aux->crawler_businessType = $result_listing->pricingInfos[0]->businessType;
                $listing_aux->crawler_price = isset($result_listing->pricingInfos[0]->price)?$result_listing->pricingInfos[0]->price:null;

                $listing_aux->crawler_whatsappNumber = $result_listing->whatsappNumber;
                $listing_aux->crawler_listing_link = $result_link->href;
                $listing_aux->crawler_type_id = $crawlerTypeID;

                // Do not change field "unavailable" used for manually disable
                if($result_listing->status != "ACTIVE") {
                    $listing_aux->crawler_status = "INACTIVE";
                    $listing_aux->delete_at = date("Y-m-d H:i:s");
                } else {                    
                    $listing_aux->crawler_status = "ACTIVE";
                    $listing_aux->delete_at = null;
                }

                $listing_aux->save();

                //persist pricing obj
                $price = $listing_aux->crawler_price;
                $yearlyIptu = @$result_listing->pricingInfos[0]->yearlyIptu;
                $monthlyCondoFee = @$result_listing->pricingInfos[0]->monthlyCondoFee;
                $listing_id = $listing_aux->id;
                $unit_type_id = $listing_aux->unit_type_id;
                $rental = $listing_aux->crawler_businessType == "RENTAL" ? 1 : null;
                $this->persistPricing($price, $yearlyIptu, $monthlyCondoFee, $listing_id, $unit_type_id, $rental);
                $newPriceInserted = true;

//                echo "##################### ANÚNCIO JÁ CADASTRADO ###################\n\n";

                $return = array("listing_id" => $listing_id, "update" => $updateAux);
                return $return;
            }
        }



        /*
         * 
         * CADASTRO DO EMPREENDIMENTO
         * 
         */

        // Inicio as variáveis de controle
        $enterprise_id = null;
        $isNewEnterprise = true;

        if($enterprise_target_id == null)
        {
            // Monto o array com o endereço do empreendimento
            $address_cep = preg_replace('/\D/', '', $result_listing->address->zipCode);
            $arr_address_listing = array(
                                        'state' => null,
                                        'city' => null,
                                        'zipcode' => $address_cep,
                                        'neighborhood' => null,
                                        'street' => null,
                                        'number' => null);

            // Pego a Rua do Anúncio
            $address_logradouro = null;
            if(isset($result_listing->address->street) && $result_listing->address->street !=  '')
            {
                $address_logradouro = $result_listing->address->street;
            }
            $arr_address_listing['street'] = $address_logradouro;


            // Pego o Bairro do Anúncio
            $address_bairro = null;
            if(isset($result_listing->address->neighborhood) && $result_listing->address->neighborhood !=  '')
            {
                $address_bairro = $result_listing->address->neighborhood;
            }
            $arr_address_listing['neighborhood'] = $address_bairro;


            // Pego o Número do Anúncio
            $address_number = null;
            if(isset($result_listing->address->streetNumber) && intval($result_listing->address->streetNumber) > 0)
            {
                $address_number = intval($result_listing->address->streetNumber);
            }
            $arr_address_listing['number'] = $address_number;


            // Pego a Cidade do Anúncio
            $address_city = $result_listing->address->city;
            $arr_address_listing['city'] = $address_city;

            // Pego o Estado do Anúncio
            $address_state = $result_listing->address->stateAcronym;
            $arr_address_listing['state'] = $address_state;

            if(isset($result_listing->address->stateAcronym) && !empty($result_listing->address->stateAcronym)) 
            {
                $c = ORM::for_table("state")->where("uf_state", trim($result_listing->address->stateAcronym))->find_one();
                if($c) 
                {
                    $address_state_id = $c->id;
                    $arr_address_listing['state_id'] = $address_state_id;

                    // Pego o ID da Cidade
                    if(isset($result_listing->address->city) && !empty($result_listing->address->city))
                    {
                        $c = ORM::for_table("city")
                                ->where("city_name", trim($result_listing->address->city))
                                ->where("id_state", $c->id)
                                ->find_one();
                        if ($c) 
                        {
                            $address_city_id = $c->id;
                            $arr_address_listing['city_id'] = $address_city_id;
                        }
                    }
                }
            }


            /*
             * Comparo o anúncio atual com a base de anúncios
             * para verificar se trata-se de um empreendimento já cadastrado
             */
            $listing_similaridade = null;
            $listing_compare = $listings;
            $compare_resut = $this->compareEnterprise($str_compare,
                                                        $address_state_id,
                                                        $address_city_id,
                                                        $address_cep,
                                                        $address_bairro,
                                                        $address_logradouro, 
                                                        $address_number, 
                                                        $listing_compare,
                                                        $listing_enterprise_id);
            // Monto o array com as imagens do anúncio
            $listing_arr_images = isset($compare_resut['arr_imgs'])?$compare_resut['arr_imgs']:array();

            // Verifico se deu Match com algum outro anúncio
            if($compare_resut && isset($compare_resut['enterprise']->id))
            {
                $isNewEnterprise = false;
                $enterprise_id = $compare_resut['enterprise']->id;
                $listing_similaridade = isset($compare_resut['similaridade'])?$compare_resut['similaridade']:null;

    //                            echo "######################### | EMPREENDIMENTO JÁ CADASTRADO | "
    //                            . "MATCH TYPE: ".$compare_resut['similaridade']['type']." | ".$compare_resut['enterprise']->id." | ".$compare_resut['enterprise']->name.".\n";
            }
            elseif($address_logradouro)
            {
                $compare_resut = $this->compareEnterprise($str_compare,
                                                        $address_state_id,
                                                        $address_city_id,
                                                        $address_cep,
                                                        $address_bairro,
                                                        null, 
                                                        $address_number, 
                                                        $listing_compare,
                                                        $listing_enterprise_id);

                if($compare_resut && isset($compare_resut['enterprise']->id))
                {
                    $isNewEnterprise = false;
                    $enterprise_id = $compare_resut['enterprise']->id;
                    $listing_similaridade = isset($compare_resut['similaridade'])?$compare_resut['similaridade']:null;

    //                                echo "######################### | EMPREENDIMENTO JÁ CADASTRADO | BUSCA POR BAIRRO | "
    //                                . "MATCH TYPE: ".$compare_resut['similaridade']['type']." | ".$compare_resut['enterprise']->id." | ".$compare_resut['enterprise']->name.".\n";
                }
            }
            // Verifico se está revisando um anúncio e se o empreendimento encontrado é o mesmo do atual
            if(isset($compare_resut['enterprise']->id) && $compare_resut['enterprise']->id === $listing_enterprise_id)
            {
                $return = array("enterprise_new" => $compare_resut['enterprise'],
                                "match_type" => $compare_resut['similaridade']['type']);
                return $return;
            }
        }
        else
        {
            $isNewEnterprise = false;
            $enterprise_id = $enterprise_target_id;
            $listing_similaridade = null;
            $compare_resut['enterprise'] = ORM::for_table("module_imobles_enterprise")->find_one($enterprise_id);
            $compare_resut['similaridade']['type'] = 'manual';
            $listing_similaridade['merge_type'] = 'manual';
            
            // Verifico se está revisando um anúncio e se o empreendimento encontrado é o mesmo do atual
            if($enterprise_target_id === $listing_enterprise_id)
            {
                $return = array("enterprise_new" => $compare_resut['enterprise'],
                                "match_type" => $compare_resut['similaridade']['type']);
                return $return;
            }
        }
        
        


        /*
         *  Se não encontrar nenhum empreendimento no mesmo endereço, cadastro um novo
         */
        if($isNewEnterprise == true)
        {

            // if($listing_id > 0)
            // {
            //     $return = array("enterprise_new" => null);
            //     return $return;
            // }

            // pego os dados do endereço
//                            $address_number = 2394;
//                            $address_logradouro = 'Rodovia Virgílio Várzea';
//                            $address_cep = '88054-605';
//                            $address_state = 'SC';
//                            $address_city = 'Florianópolis';
//                            $address_bairro = 'Saco Grande';
//                            $address_encoded = 'Rodovia Virgílio Várzea, 2394 - Saco Grande, Florianópolis - SC, 88054-605';

            // 
            // Procuro pelo endereço no Google
            //
            $address_encoded = null;
//            if($address_logradouro && $address_number && $address_bairro)
//            {
//                $address_encoded .= $address_logradouro.', ';
//                $address_encoded .= $address_number.' - ';
//                $address_encoded .= $address_bairro.', ';
//                $address_encoded .= $address_city.' - '.$address_state;
//            }
            if($address_logradouro && $address_bairro)
            {
                $address_encoded .= $address_logradouro.' - ';
                $address_encoded .= $address_bairro.', ';
                $address_encoded .= $address_city.' - '.$address_state;
            }
            elseif($address_bairro)
            {
                $address_encoded .= $address_bairro.', ';
                $address_encoded .= $address_city.' - '.$address_state;
            }

            $address_encoded = $this->cleanString(strtolower($address_encoded));

            $address_encoded_query = $address_logradouro.' - '.$address_bairro.', '.$address_city.' - '.$address_state;

            // Verifico se já foi feita a pesquisa na API NEARBY do Google para esse endereço
            $google_nearby = true;
            $arr_google_nearby = ORM::for_table('module_imobles_google_nearby')
                                ->find_many()->order_by_desc('id');

            foreach ($arr_google_nearby as $gnb)
            {
                if($gnb->address_encoded == $address_encoded)
                {
                    $google_nearby = false;
//                    echo "GOOGLE PLACE JÁ VERIFICADO: ".$gnb->address_encoded."\n";
                    $arr_enterprise['latitude'] = $gnb->latitude;
                    $arr_enterprise['longitude'] = $gnb->longitude;
                    break;
                }
            }

            if($address_encoded && $google_nearby == true)
            {
                //  echo "ENDEREÇO DO EMPREENDIMENTO: ".$address_encoded."\n";
                
                $address_encoded_url = urlencode($address_encoded_query);
                $url = 'https://maps.googleapis.com/maps/api/geocode/json?'
                        . 'address='.$address_encoded_url
                        . '&key=AIzaSyDV8EiKB-3-jeqoB9qGR7oeQb-y9kLHoCU';


                $json_google = curl_init($url);
                curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
                $json_response = curl_exec($json_google);
                $result = json_decode($json_response);

                if(isset($result->results) && count($result->results))
                {
                    $geocode = $result->results[0];

                    // pego os dados do endereço
                    $geo_address_number = null;
                    $geo_address_log = null;
                    $geo_address_zipcode = null;
                    $geo_address_state = null;
                    $geo_address_city = null;
                    $geo_address_neighborhood = null;

                    $arr_address = $geocode->address_components;
                    foreach($arr_address as $address)
                    {
                        if(in_array('street_number', $address->types))
                        {
                            if(intval($address->long_name) == $address->long_name)
                            {
                                $geo_address_number = intval($address->long_name);
                            }
                        }

                        if(in_array('postal_code', $address->types))
                        {
                            $geo_address_zipcode = preg_replace('/\D/', '', $address->long_name);
                        }

                        if(in_array('administrative_area_level_1', $address->types))
                        {
                            $geo_address_state = $address->short_name;
                        }

                        if(in_array('administrative_area_level_2', $address->types))
                        {
                            $geo_address_city = $address->long_name;
                        }

                        if(in_array('sublocality_level_1', $address->types))
                        {
                            $geo_address_neighborhood = $address->long_name;
                        }

                        if(in_array('route', $address->types))
                        {
                            $geo_address_log = $address->long_name;
                        }
                    }


                    if($geo_address_zipcode != $address_cep)
                    {
                        $obs_info .= 'DIVERGÊNCIA DE CEP | Crawler: '.$address_cep.' | GOOGLE MAPS: '.$geo_address_zipcode.'<br/>';
                    }

                    $geocode_lat = $geocode->geometry->location->lat;
                    $geocode_lng = $geocode->geometry->location->lng;
                    $arr_enterprise['latitude'] = $geocode_lat;
                    $arr_enterprise['longitude'] = $geocode_lng;


                    /*
                     * Pego os Empreendimentos cadastrados no Google Maps perto do local
                     */
                    $search_nearby = true;
                    foreach ($arr_google_nearby as $gnb)
                    {
                        $dist = $this->getDistanceBetweenPoints($geocode_lat, $geocode_lng, $gnb->latitude, $gnb->longitude);
                        $dist = $dist['meters'];
                        if($dist <= 250)
                        {
                            $search_nearby = false;
//                            echo "######################### | NEAR BY JÁ EXECUTADO | RAIO: ".$dist." metros.\n";
                            break;
                        }
                    }

                    if($search_nearby == true)
                    {
                        $place_details = $this->googlePlaces($address_encoded_query,
                                                            $address_number, 
                                                            $address_logradouro, 
                                                            $address_bairro, 
                                                            $address_encoded,
                                                            $listings, $modelEnterprises);
                    }
                }
                else
                {
                    // Registro a pesquisa na API NEARBY do Google
                    $google_nearby = ORM::for_table('module_imobles_google_nearby')->create();
                    $google_nearby->address_encoded = $address_encoded;
                    $google_nearby->save();
                }
            }


            /*
             * Realizo o cadastro do empreendimento
             */
            if(isset($place_details->arr_address_gp))
            {
                // Trato os dados do endereço
                $address_number         = $place_details->arr_address_gp['address_number'];
                $address_logradouro     = $place_details->arr_address_gp['address_log'];
                $address_bairro         = $place_details->arr_address_gp['address_neighborhood'];
                $address_cep            = $place_details->arr_address_gp['address_zipcode'];

                $arr_enterprise['latitude'] = $place_details->geometry->location->lat;
                $arr_enterprise['longitude'] = $place_details->geometry->location->lng;
                $arr_enterprise['link_google'] = $place_details->url;
                $arr_enterprise['google_geometry'] = json_encode($place_details->geometry);
                $arr_enterprise['google_phone'] = isset($place_details->formatted_phone_number)?$place_details->formatted_phone_number:null;
                $arr_enterprise['google_place_id'] = $place_details->place_id;
                $arr_enterprise['google_plus_code'] = json_encode($place_details->plus_code);
                $arr_enterprise['google_rating'] = isset($place_details->rating)?$place_details->rating:null;
                $arr_enterprise['google_reference'] = $place_details->reference;
                $arr_enterprise['google_reviews'] = isset($place_details->reviews)?json_encode($place_details->reviews):null;
                $arr_enterprise['google_user_ratings_total'] = isset($place_details->user_ratings_total)?$place_details->user_ratings_total:null;
                $arr_enterprise['google_json'] = json_encode($place_details);
                $arr_enterprise['name'] = $place_details->name;
            }
            else
            {
                $arr_enterprise['name'] = $result_listing->portal.' | '.$result_listing->id;
            }

            // Endereço
            $arr_enterprise['address_log'] = $address_logradouro;
            $arr_enterprise['address_log_sanitized'] = $this->sanitizaLogradouro($address_logradouro);
            $arr_enterprise['address_neighborhood'] = $this->sanitizaLogradouro($address_bairro);
            $arr_enterprise['address_number'] = $address_number;
            $arr_enterprise['address_neightborhood'] = $address_bairro;
            $arr_enterprise['address_neighborhood_sanitized'] = $this->sanitizaLogradouro($address_bairro);
            $arr_enterprise['address_zip'] = $address_cep;
            $arr_enterprise['address_complement'] = isset($result_listing->address->complement)?$result_listing->address->complement:null;
            $arr_enterprise['crawler_poisList'] = isset($result_listing->address->poisList)?json_encode($result_listing->address->poisList):null;

            // Populo o array do empreendimento
            $arr_enterprise['alias'] = $arr_enterprise['name'];
            $arr_enterprise['enable'] = 0;
            $arr_enterprise['videoTourLink'] = $result_listing->videoTourLink;
            $arr_enterprise['unitTypes'] = $result_listing->unitTypes[0];
            $arr_enterprise['comparator_status'] = "Backlog";
            $arr_enterprise['crawler_type'] = $crawlerTypeStr;
            $arr_enterprise['crawler_listing_id'] = $result_listing->id;
            $arr_enterprise['crawler_listing_link'] = $result_link->href;
            $arr_enterprise['crawler_portal'] = $result_listing->portal;
            $arr_enterprise['created_by'] = 0;
            $arr_enterprise['crawler_type_id'] = $crawlerTypeID;


            // Pego o ID do Estado e Cidade
            $arr_enterprise['address_state_id'] = $address_state_id;
            $arr_enterprise['address_city_id'] = $address_city_id;

            // Verifico a data da entrega
            $arr_enterprise['release_date'] = (isset($result_listing->deliveredAt)) ? substr($result_listing->deliveredAt, 0, 10) : '';


            // Verifico se o Status do Empreendimento
            $arr_enterprise['release_status'] = null;
            if($result_listing->listingType == 'DEVELOPMENT')
            {
                switch($result_listing->constructionStatus)
                {
                    case "PLAN_ONLY": $arr_enterprise['release_status'] = "Launch";
                        break;
                    case "UNDER_CONSTRUCTION": $arr_enterprise['release_status'] = "In Works";
                        break;
                    case "BUILT": $arr_enterprise['release_status'] = "Ready to move in";
                        break;
                    default:   $arr_enterprise['release_status'] = null;
                        break;
                }
            }
            else 
            {
                if($arr_enterprise['release_date'])
                {
                    if($arr_enterprise['release_date'] > date('Y-m-d'))
                    {
                        $arr_enterprise['release_status'] = "In Works";
                    }
                    else
                    {
                        $arr_enterprise['release_status'] = "Ready to move in";
                    }
                }
            }


            // Pego o Link do Google para o empreendimento
            if(isset($arr_enterprise['latitude']) && isset($arr_enterprise['longitude']) && !isset($arr_enterprise['link_google']))
            {
                $arr_enterprise['link_google'] = 'http://maps.google.com/maps?q='.$arr_enterprise['latitude'].','.$arr_enterprise['longitude'];
            }


            // Verifico se aceita permuta
            if(isset($result_listing->acceptExchange))
            {
                $data['permute'] = $result_listing->acceptExchange == false?'No':'Yes';
            }
            else 
            {
                $arr_enterprise['permute'] = 'Uninformed';
            }


            // Pego o Padrão do Empreendimento
            if(isset($result_listing->pricingInfos[0]->businessType) && $result_listing->pricingInfos[0]->businessType == 'SALE' && isset($result_listing->pricingInfos[0]->price))
            {
                if($result_listing->pricingInfos[0]->price >= 1500000)
                {
                    $arr_enterprise['module_imobles_enterprise_standard_id'] = 3;
                }
                elseif($result_listing->pricingInfos[0]->price < 1500000 && $result_listing->pricingInfos[0]->price >= 800000)
                {
                    $arr_enterprise['module_imobles_enterprise_standard_id'] = 1;
                }
                elseif($result_listing->pricingInfos[0]->price < 800000 && $result_listing->pricingInfos[0]->price >= 300000)
                {
                    $arr_enterprise['module_imobles_enterprise_standard_id'] = 2;
                }
                elseif($result_listing->pricingInfos[0]->price < 300000 && $result_listing->pricingInfos[0]->price >= 200000)
                {
                    $arr_enterprise['module_imobles_enterprise_standard_id'] = 4;
                }
                elseif($result_listing->pricingInfos[0]->price < 200000)
                {
                    $arr_enterprise['module_imobles_enterprise_standard_id'] = 5;
                }
            }

            $arr_enterprise['obs'] = $obs_info;

            // Salvo o empreendimento
            $save = $modelEnterprises->createEnterprises($arr_enterprise);
            if(is_numeric($save->id))
            {
//                echo "NOVO Empreendimento Cadastrado com Sucesso | ".$arr_enterprise['name'].".\n";
                $enterprise_id = $save->id;
            }
            else
            {
                echo "OCORREU UM ERRO AO SALVAR O EMPREENDIMENTO";
                var_dump($arr_enterprise);
                exit;
            }


            // Cadastro as Torres
            if(isset($result_listing->buildings) && $result_listing->buildings >= 1)
            {
                $towers = $result_listing->buildings;
            }
            else
            {
                $towers = 1;
            }

            $unit_tower_id = null;
            for ($i = 0; $i < $towers; $i++) 
            {
                $torre = $i + 1;
                $tower = ORM::for_table('module_imobles_enterprise_towers')->create();
                $tower->title = 'Torre '.$torre;
                $tower->floors = isset($result_listing->floors[0])?$result_listing->floors[0]:null;
                $tower->alias = 'torre_'.$torre;
                $tower->stage =$arr_enterprise['release_status'];
                $tower->module_imobles_enterprise_id = $enterprise_id;
                $tower->unitsOnTheFloor = isset($result_listing->unitsOnTheFloor)?$result_listing->unitsOnTheFloor:null;
                $tower->created_at = date('Y-m-d H:i:s');
                $tower->updated_at = date('Y-m-d H:i:s');
                $tower->save();

                if($i == 0)
                {
                    $unit_tower_id = $tower->id;
                }
            }
        }
        else
        {
            // Pego a Torre para cadastrar a unidade
            $tower = ORM::for_table('module_imobles_enterprise_towers')->where('module_imobles_enterprise_id', $enterprise_id)->find_one();

            if(isset($tower->id))
            {
                $unit_tower_id = $tower->id;
            }
            else
            {
                // Cadastro as Torres
                $torre_place = 1;
                $tower_place = ORM::for_table('module_imobles_enterprise_towers')->create();
                $tower_place->title = 'Torre '.$torre_place;
                $tower_place->alias = 'torre_'.$torre_place;
                $tower_place->stage = 'Ready to move in';
                $tower_place->module_imobles_enterprise_id = $enterprise_id;
                $tower_place->created_at = date('Y-m-d H:i:s');
                $tower_place->save();
                $unit_tower_id = $tower_place->id;
            }
        }


        /*
         * FAÇO O CADASTRO DAS AMINITIES
         */

        if($listing_id === null)
        {
            // Verifico se o empreendimento já está sanitizado
            $enterprise_sanit = ORM::for_table("module_imobles_enterprise")
                                    ->select("site_enabled")
                                    ->select("sanitized")
                                    ->find_one($enterprise_id);
            if($enterprise_sanit->site_enabled != 1 && $enterprise_sanit->sanitized != 1)
            {
                $arr_listing_amenities = $result_listing->amenities;

                // Pego as Amenities do Empreendimento
                $arr_enterprise_amenities = ORM::for_table('module_imobles_enterprise_entreprise_amenities')->where('module_imobles_enterprise_id', $enterprise_id)->find_many();
                $amenitiModel = new Enterprise_amenitiesModel();
                foreach ($arr_listing_amenities as $area) 
                {
                    if (!empty(trim($area))) {
                        $c = $amenitiModel->getOneCollum('alias', mb_strtoupper(trim($area)));
                        if (!$c) {
                            // if didn't find by alias, try alternative names
                            $c = ORM::for_table($amenitiModel->table)
                                ->where_like('alternative_names', "%" . mb_strtoupper(trim($area)) . "%" )
                                ->find_one();
                        }

                        if ($c) {
                            $insert_amenitie = true;
                            foreach ($arr_enterprise_amenities as $i)
                            {
                                if($i->module_imobles_enterprise_amenities_id == $c->id)
                                {
                                    $insert_amenitie = false;
                                }
                            }

                            if($insert_amenitie == true)
                            {
                                $a = ORM::for_table("module_imobles_enterprise_entreprise_amenities")->create();
                                $a->module_imobles_enterprise_id = $enterprise_id;
                                $a->module_imobles_enterprise_amenities_id = $c->id;
                                $a->save();
    //                                            echo "######## AMENITIE DO EMPREENDIMENTO CADASTRADA COM SUCESSO | ".mb_strtoupper(trim($area))."\n";
                            }
                        } 
                    }
                }
            }
        }


        /*
         * Verifico se está revisando um anúncio já cadastrado
         */
        $now = new DateTime('now', new DateTimeZone('America/Sao_Paulo'));
        $unit_unique = false;
        $unit_type_unique = false;
        $enterprise_unique = false;
        if($listing_id)
        {
            $deleted_unit_type = false;

            // Pego os dados do anúncio
            $listing_aux = ORM::for_table("module_imobles_listings")->find_one($listing_id);

            // Verifico se a Unidade está vinculada somente ao anúncio
            $unit_unique = false;
            $unit_type_unique = false;
            $enterprise_unique = false;
            $count_aux = ORM::for_table('module_imobles_listings')
                                ->where("unit_id", $listing_aux->unit_id)
                                ->count('id');


            $enterprise_old = ORM::for_table('module_imobles_enterprise')
                                        ->find_one($listing_aux->entreprise_id);
            if($count_aux <= 1)
            {
                $unit_unique = true;
                $unit_old = ORM::for_table('module_imobles_enterprise_units')
                            ->find_one($listing_aux->unit_id);

                $unit_old->delete_at = $now->format('Y-m-d H:i:s');
                $unit_old->delete_by = 0;
                $unit_old->save();

                // Verifico se o Tipo Unidade está vinculada somente ao anúncio
                $count_aux = ORM::for_table('module_imobles_listings')
                                    ->where("unit_type_id", $listing_aux->unit_type_id)
                                    ->count('id');
                if($count_aux <= 1)
                {
                    $unit_unique = true;
                    $unit_type_old = ORM::for_table('module_imobles_enterprise_units_type')
                                                ->find_one($listing_aux->unit_type_id);

                    // Verifico se o Empreendimento está vinculado somente ao anúncio
                    $count_aux = ORM::for_table('module_imobles_listings')
                                        ->where("entreprise_id", $listing_aux->entreprise_id)
                                        ->count('id');
                    if($count_aux <= 1)
                    {
                        $enterprise_unique = true;

                        if($enterprise_old->google_place_id == null && $enterprise_old->crawler_enterprise_id == null && $enterprise_old->verified != 1)
                        {
                            $enterprise_old->delete_at = $now->format('Y-m-d H:i:s');
                            $enterprise_old->delete_by = 0;
                            $enterprise_old->save();

                            //Deleto a torre
                            $tower_old = ORM::for_table('module_imobles_enterprise_towers')
                                            ->where('module_imobles_enterprise_id', $enterprise_old->id)
                                            ->find_one();

                            $tower_old->deleted_at = $now->format('Y-m-d H:i:s');
                            $tower_old->deleted_by = 0;
                            $tower_old->save();
                        }

                    }
                }
            }
        }


        /*
         *  Verifico se o tipo de unidade já está cadastrado
         */
        $arr_unit_type = array();
        $arr_unit_type_id = array();
        $unit_type_IsNew = true;
        $review_unit_type = null;
        $count_planta = 0;

        // pego os tipos de áreas úteis do anúncio
        if(isset($result_listing->usableAreas) && count($result_listing->usableAreas) >= 1)
        {
                // Salvo apenas a primeira planta do anúncio
                $planta = $result_listing->usableAreas[0];
                $unit_type_aux = null;
                $unit_type_id_aux = null;
                $num_garagens = isset($result_listing->parkingSpaces[$count_planta])?$result_listing->parkingSpaces[$count_planta]:isset($result_listing->parkingSpaces[0])?$result_listing->parkingSpaces[0]:null;
                $num_suites = isset($result_listing->suites[$count_planta])?$result_listing->suites[$count_planta]:isset($result_listing->suites[0])?$result_listing->suites[0]:null;
                $num_banheiros = isset($result_listing->bathrooms[$count_planta])?$result_listing->bathrooms[$count_planta]:isset($result_listing->bathrooms[0])?$result_listing->bathrooms[0]:null;
                $num_quartos = isset($result_listing->bedrooms[$count_planta])?$result_listing->bedrooms[$count_planta]:isset($result_listing->bedrooms[0])?$result_listing->bedrooms[0]:null;

                if($isNewEnterprise == false)
                {
                    if(isset($listing_similaridade['unit_type_id']) && !empty($listing_similaridade['unit_type_id']))
                    {
                        $unit_type_aux = json_decode(json_encode(array("id" => $listing_similaridade['unit_type_id'])));
                    }
                    else
                    {
                        // verifico se os Tipos de Unidade do empreendimento já foram VERIFICADAS
                        $enterprise_sanit = ORM::for_table("module_imobles_enterprise")
                                                ->select("site_enabled")
                                                ->select("sanitized")
                                                ->find_one($enterprise_id);
                        if($enterprise_sanit->site_enabled == 1 || $enterprise_sanit->sanitized == 1)
                        {
                            $arr_unit_type_match = array();
                            $count_units = 0;
                            $unit_type_arr = ORM::for_table('module_imobles_enterprise_units_type')
                                            ->where('module_imobles_enterprise_id', $enterprise_id)
                                            ->where_null('delete_at')
                                            ->where('site_enabled', 1)
                                            ->find_many();
                            foreach ($unit_type_arr as $unit_type_verified)
                            {
                                // Verifco qual Tipo de Unidade é mais próxima do anúncio
                                $weight = 0;
                                if($planta >= $unit_type_verified->area - 2 && $planta <= $unit_type_verified->area + 2)
                                {
                                    $weight += 5;
                                }
                                
                                if($unit_type_verified->number_rooms == $num_quartos)
                                {
                                    $weight += 3;
                                }
                                
                                if($unit_type_verified->number_suite == $num_suites)
                                {
                                    $weight += 1;
                                }
                                
                                $arr_unit_type_match[$count_units] = $weight;
                                
                                $count_units++;
                            }
                            
                            $unit_weight = 0;
                            $unit_index = null;
                            foreach ($arr_unit_type_match as $key => $value)
                            {
                                if($value >= $unit_weight)
                                {
                                    $unit_weight = $value;
                                    $unit_index = $key;
                                }
                            }
                            
                            $unit_type_aux = $unit_type_arr[$unit_index];
                            
                            if($unit_weight < 9)
                            {
                                $review_unit_type = 1;
                            }
                        }
                        else
                        {
                            $unit_type_aux = ORM::for_table('module_imobles_enterprise_units_type')
                                ->where('number_rooms', $num_quartos)
//                                ->where('number_garage', $num_garagens)
//                                ->where('number_suite', $num_suites)
                                ->where('module_imobles_enterprise_id', $enterprise_id)
                                ->where_gte('area',$planta - 2)
                                ->where_lte('area',$planta + 2)
                                ->find_one();
                        }
                    }
                }

                if(isset($unit_type_aux->id) && $unit_type_aux->id > 0)
                {   
                    $isNew = false;
                    $arr_unit_type_id[] = $unit_type_aux->id;
                    $unit_type_id_aux = $unit_type_aux->id;


                    // Verifico se tem que excluir o tipo de unidade
                    if($unit_type_unique === true && $deleted_unit_type == false)
                    {
                        $unit_type_old->delete_at = $now->format('Y-m-d H:i:s');
                        $unit_type_old->save();
                        $deleted_unit_type = true;
                    }
                }
                else
                {
                    // Se estiver revisando um anúncio, aponto o Tipo de Unidade para o novo Empreendimento
                    $insert_unit = true;
                    if(isset($listing_aux->id))
                    {
                        if($unit_type_unique === true && $deleted_unit_type == false)
                        {
                            $unit_type_old->module_imobles_enterprise_id = $enterprise_id;
                            $unit_type_old->save();
                            $deleted_unit_type = true;
                            $insert_unit = false;
                        }
                    }


                    if($insert_unit == true)
                    {
                        $arr_unit_type['title'] = $planta.'m² | '.$num_quartos.' Quartos'
                                                .($num_suites > 0?' | '.$num_suites.' Suites':'')
                                                .($num_banheiros > 0?' | '.$num_banheiros.' Banheiros':'')
                                                .($num_garagens > 0?' | '.$num_garagens.' Garagens':'');
                        $arr_unit_type['desc'] = $arr_unit_type['title'];
                        $arr_unit_type['alias'] = $arr_unit_type['title'];
                        $arr_unit_type['area'] = $planta;
                        $arr_unit_type['number_rooms'] = $num_quartos;
                        $arr_unit_type['number_suite'] = $num_suites;
                        $arr_unit_type['number_garage'] = $num_garagens;
                        $arr_unit_type['number_bathroom'] = $num_banheiros;
                        $arr_unit_type['module_imobles_enterprise_id'] = $enterprise_id;

                        $save = $modelUnitType->createTypeunity($arr_unit_type);
                        if(is_numeric($save->id))
                        {
//                                            echo "Tipo de Unidade Cadastrado com sucesso.\n";
                            $arr_unit_type_id[] = $save->id;
                            $unit_type_id_aux = $save->id;
                        }
                        else
                        {
                            echo "OCORREU UM ERRO AO SALVAR O TIPO DE UNIDADE";
                            return($arr_enterprise);
                            exit;
                        }
                    }
                }

                // Pego as Amenities do Tipo de Unidade
                if($unit_type_id_aux && $listing_id == null)
                {
                    $arr_unit_type_amenities = ORM::for_table('module_imobles_enterprise_units_type_amenities')->where('module_imobles_enterprise_units_type_id', $unit_type_id_aux)->find_many();
                    if($arr_unit_type_amenities){
                        foreach ($arr_listing_amenities as $area) 
                        {
                            if (!empty(trim($area))) {
                                $c = ORM::for_table('module_imobles_type_units_amenities')->where('alias', trim(mb_strtoupper($area)))->find_one();
                                if ($c) 
                                {
                                    $insert_amenitie = true;
                                    foreach ($arr_unit_type_amenities as $i)
                                    {
                                        if($i->module_imobles_type_units_amenities_id == $c->id)
                                        {
                                            $insert_amenitie = false;
                                        }
                                    }

                                    if($insert_amenitie == true)
                                    {
                                        $a = ORM::for_table("module_imobles_enterprise_units_type_amenities")->create();
                                        $a->module_imobles_enterprise_units_type_id = $unit_type_id_aux;
                                        $a->module_imobles_type_units_amenities_id = $c->id;
                                        $a->save();
    //                                                    echo "######## AMENITIE DO TIPO DE UNIDADE CADASTRADA COM SUCESSO | ".mb_strtoupper(trim($area))."\n";
                                    }
                                }
                            }
                        }   
                    }
                }
                $count_planta++;
        }


        /*
         *  Faço o cadastro d UNIDADE
         *  Crio uma unidade DUMMY pois não temos o número do apartamento
         */
        $arr_unit = array();
        $arr_unit_id = array();
        $count_units = 0;
        foreach ($arr_unit_type_id as $unit_type_id)
        {
            $unit_IsNew = true;
            $unit_id_aux = null;
            // Verifico se o Complemento informa o número da unidade
            $unidade = null;
            $complemento = @$result_listing->address->complement;
            $complemento = $this->cleanString(strtolower($complemento));
            $pattern1 = '(unidade\.?|uni\.?|un\.?|apartamento\.?|apto\.?|ap\.?|apt\.?|apat\.?)+\s*';
            $pattern2 = '[0-9]+';
            preg_match('/' . $pattern1 . $pattern2 . '/', $complemento, $matches, PREG_OFFSET_CAPTURE);
            if (isset($matches[0][0])) {
                $unidade = $matches[0][0];
                $unidade = preg_split('/' . $pattern1 . '/', $unidade);
                $unidade = $unidade[1];
            }

            // verifico se o anúncio tem similaridade com algum outro.
            if(isset($listing_similaridade['count_imgs']) && $listing_similaridade['count_imgs'])
            {
                if($listing_similaridade['count_imgs'] == count($result_medias))
                {
                    $arr_unit_id[] = $listing_similaridade['unit_id'];
                    $unit_IsNew = false;
                    $unit_id_aux = $listing_similaridade['unit_id'];
                }
            }

            if($unit_IsNew == true)
            {
                $now = new DateTime('now', new DateTimeZone('America/Sao_Paulo'));
                $unit_aux = ORM::for_table('module_imobles_enterprise_units')->create();

                $arr_unit['floor'] = isset($result_listing->unitFloor)?$result_listing->unitFloor:null;
                $arr_unit['number_unity'] = $unidade;
                $arr_unit['module_imobles_enterprise_towers_id'] = $unit_tower_id;
                $arr_unit['module_imobles_enterprise_units_type_id'] = $unit_type_id;
                $arr_unit['created_at'] = $now->format('Y-m-d H:i:s');
                $arr_unit['created_by'] = 0;
                $arr_unit['crawler_type_id'] = $crawlerTypeID;

                $save = $modelUnit->createEnterprise_unity($arr_unit);
                if(is_numeric($save->id))
                {
//                                    echo "Unidade Cadastrado com sucesso.\n";
                    $arr_unit_id[] = $save->id;
                    $unit_id_aux = $save->id;
                }
                else
                {
//                                    echo "OCORREU UM ERRO AO SALVAR O TIPO DE UNIDADE";
                    return($arr_enterprise);
                    exit;
                }
            }


            // Pego as Amenities da Unidade
            if($unit_id_aux && $listing_id == null)
            {
                $arr_unit_amenities = ORM::for_table('module_imobles_enterprise_units_amenities')->where('module_imobles_enterprise_units_id', $unit_id_aux)->find_many();
                if($arr_unit_amenities){
                    foreach ($arr_listing_amenities as $area) 
                    {
                        if (!empty(trim($area))) {
                            $c = ORM::for_table('module_imobles_units_amenities')->where('alias', trim(mb_strtoupper($area)))->find_one();
                            if ($c) 
                            {
                                $insert_amenitie = true;
                                foreach ($arr_unit_amenities as $i)
                                {
                                    if($i->module_imobles_units_amenities_id == $c->id)
                                    {
                                        $insert_amenitie = false;
                                    }
                                }

                                if($insert_amenitie == true)
                                {
                                    $a = ORM::for_table("module_imobles_enterprise_units_amenities")->create();
                                    $a->module_imobles_enterprise_units_id = $unit_id_aux;
                                    $a->module_imobles_units_amenities_id = $c->id;
                                    $a->save();
    //                                                echo "######## AMENITIE DA UNIDADE CADASTRADA COM SUCESSO | ".mb_strtoupper(trim($area))."\n";
                                }
                            }
                        }
                    }
                }
            }
            $count_units++;
        }


        /*
         *  Verifico se o anunciannte já está cadastrado
         */
        $advertiser_aux = ORM::for_table('module_imobles_advertisers')
                            ->where('crawler_advertiser_id', $result_listing->advertiserId)
                            ->where('crawler_type', $crawlerTypeStr)
                            ->where('crawler_portal', $result_listing->portal)
                            ->find_one();

        if(isset($advertiser_aux->id) && $advertiser_aux->id > 0)
        {   
            if($listing_id != null) {
                /*
                * PW-1249
                * If $listing_id is not null, the listing is being updated (updated_at already verified at line 78)
                * Check id any information has changed
                */ 
                if (
                    $advertiser_aux->name != $result_account->name ||
                    $advertiser_aux->licenseNumber != $result_account->licenseNumber ||
                    (isset($result_account->phones) && $advertiser_aux->phones != json_encode($result_account->phones)) ||
                    (isset($result_account->logoUrl) && $advertiser_aux->logoUrl = $result_account->logoUrl) ||
                    (isset($result_account->websiteUrl) && $advertiser_aux->websiteUrl != $result_account->websiteUrl)
                    )
                {
                    $advertiser_aux->name = $result_account->name;
                    $advertiser_aux->phones = isset($result_account->phones)?json_encode($result_account->phones):null;
                    $advertiser_aux->logoUrl = isset($result_account->logoUrl)?$result_account->logoUrl:null;
                    $advertiser_aux->licenseNumber = $result_account->licenseNumber;
                    $advertiser_aux->websiteUrl = isset($result_account->websiteUrl)?$result_account->websiteUrl:null;   
                    if(!$advertiser_aux->save())
                    {
                        echo "OCORREU UM ERRO AO SALVAR O ANUNCIANTE";
                        return($arr_enterprise);
                        exit;
                    }
                }    
            }
        }
        else
        {
            $now = new DateTime('now', new DateTimeZone('America/Sao_Paulo'));
            // $user = User::_info();
            $advertiser_aux = ORM::for_table('module_imobles_advertisers')->create();
            $advertiser_aux->name = $result_account->name;
            $advertiser_aux->phones = isset($result_account->phones)?json_encode($result_account->phones):null;
            $advertiser_aux->logoUrl = isset($result_account->logoUrl)?$result_account->logoUrl:null;
            $advertiser_aux->licenseNumber = $result_account->licenseNumber;
            $advertiser_aux->websiteUrl = isset($result_account->websiteUrl)?$result_account->websiteUrl:null;
            $advertiser_aux->crawler_type = $crawlerTypeStr;
            $advertiser_aux->crawler_createdDate = $result_account->createdDate;
            $advertiser_aux->crawler_accountLink = $result_accountLink->href;
            $advertiser_aux->crawler_advertiser_id = $result_account->id;
            $advertiser_aux->crawler_listing_id = $result_listing->id;
            $advertiser_aux->crawler_listing_link = $result_link->href;
            $advertiser_aux->crawler_portal = $result_listing->portal;
            $advertiser_aux->created_at = $now->format('Y-m-d H:i:s');
            $advertiser_aux->created_by = 0;
            if(!$advertiser_aux->save())
            {
                echo "OCORREU UM ERRO AO SALVAR O ANUNCIANTE";
                return($arr_enterprise);
                exit;
            }
        }
        $advertiser_id = $advertiser_aux->id;

        /*
         *  Verifico se o anúncio já está cadastrado
         */
        if($listing_id == null)
        {
            $listing_aux = ORM::for_table('module_imobles_listings')
                                ->where('crawler_listing_id', $result_listing->id)
                                ->where('crawler_type', $crawlerTypeStr)
                                ->where('crawler_portal', $result_listing->portal)
                                ->find_one();

            if(isset($listing_aux->id) && $listing_aux->id > 0)
            {   
                $listing_id = $listing_aux->id;
                
                // Verifico se tem que revisar o tipo de unidade do anúncio
                $listing_aux->review_unit_type = $review_unit_type;
                $listing_aux->save();
            }
            else
            {
                $now = new DateTime('now', new DateTimeZone('America/Sao_Paulo'));
//                        $user = User::_info();

                $listing_aux = ORM::for_table('module_imobles_listings')->create();

                $listing_aux->entreprise_id = $enterprise_id;
                $listing_aux->unit_type_id = isset($arr_unit_type_id[0])?$arr_unit_type_id[0]:null;
                $listing_aux->unit_id = isset($arr_unit_id[0])?$arr_unit_id[0]:null;
                $listing_aux->advertiser_id = $advertiser_id;
                $listing_aux->listingType = $result_listing->listingType;
                $listing_aux->description = $result_listing->description;
                $listing_aux->title = $result_listing->title;
                $listing_aux->crawler_type = $crawlerTypeStr;
                $listing_aux->crawler_type_id = $crawlerTypeID;
                $listing_aux->crawler_contractType = $result_listing->contractType;
                $listing_aux->crawler_createdAt = $result_listing->createdAt;
                $listing_aux->crawler_updatedAt = $result_listing->updatedAt;
                $listing_aux->crawler_publicationType = $result_listing->publicationType;
                $listing_aux->crawler_externalId = $result_listing->externalId;
                $listing_aux->crawler_stamps = json_encode($result_listing->stamps);
                $listing_aux->crawler_pricingInfos = json_encode($result_listing->pricingInfos);
                $listing_aux->crawler_businessType = $result_listing->pricingInfos[0]->businessType;
                $listing_aux->crawler_price = isset($result_listing->pricingInfos[0]->price)?$result_listing->pricingInfos[0]->price:null;
                $listing_aux->crawler_status = $result_listing->status;
                $listing_aux->crawler_whatsappNumber = $result_listing->whatsappNumber;
                $listing_aux->crawler_listing_id = $result_listing->id;
                $listing_aux->crawler_listing_link = $result_link->href;
                $listing_aux->crawler_portal = $result_listing->portal;
                $listing_aux->created_at = $now->format('Y-m-d H:i:s');
                $listing_aux->crawler_json = json_encode($listings);
                $listing_aux->merge_type = isset($listing_similaridade['merge_type'])?$listing_similaridade['merge_type']:null;
                $listing_aux->created_by = 0;
                
                // Verifico se tem que revisar o tipo de unidade do anúncio
                $listing_aux->review_unit_type = $review_unit_type;

                $save = $listing_aux->save();
                if($save)
                {
//                                    echo "ANÚNCIO Cadastrado com sucesso.\n";
                    $listing_id = $listing_aux->id;

                    //persist pricing obj
                    $price = $listing_aux->crawler_price;
                    $yearlyIptu = @$result_listing->pricingInfos[0]->yearlyIptu;
                    $monthlyCondoFee = @$result_listing->pricingInfos[0]->monthlyCondoFee;
                    $listing_id = $listing_aux->id;
                    $unit_type_id = $listing_aux->unit_type_id;
                    $rental = $listing_aux->crawler_businessType == "RENTAL" ? 1 : null;
                    $this->persistPricing($price, $yearlyIptu, $monthlyCondoFee, $listing_id, $unit_type_id, $rental);
                }
                else
                {
                    echo "OCORREU UM ERRO AO SALVAR O ANÚNCIO";
                    return($arr_enterprise);
                    exit;
                }
            }
        }
        else
        {
            $listing_aux->entreprise_id = $enterprise_id;
            $listing_aux->unit_type_id = isset($arr_unit_type_id[0])?$arr_unit_type_id[0]:null;
            $listing_aux->unit_id = isset($arr_unit_id[0])?$arr_unit_id[0]:null;
            $listing_aux->updated_at = $now->format('Y-m-d H:i:s');
            $listing_aux->merge_type = isset($listing_similaridade['merge_type'])?$listing_similaridade['merge_type']:null;
            
            // Verifico se tem que revisar o tipo de unidade do anúncio
            $listing_aux->review_unit_type = $review_unit_type;

            $listing_aux->crawler_status = $result_listing->status;
            $listing_aux->crawler_json = json_encode($listings);
            
            $listing_aux->description = $result_listing->description;
            $listing_aux->title = $result_listing->title;

            $listing_aux->crawler_pricingInfos = json_encode($result_listing->pricingInfos);
            $listing_aux->crawler_businessType = $result_listing->pricingInfos[0]->businessType;
            $listing_aux->crawler_price = isset($result_listing->pricingInfos[0]->price)?$result_listing->pricingInfos[0]->price:null;

            $listing_aux->crawler_whatsappNumber = $result_listing->whatsappNumber;
            $listing_aux->crawler_listing_link = $result_link->href;
            $listing_aux->crawler_type_id = $crawlerTypeID;

            // Do not change field "unavailable" used for manually disable
            if($result_listing->status != "ACTIVE") {
                $listing_aux->crawler_status = "INACTIVE";
                $listing_aux->delete_at = date("Y-m-d H:i:s");
            } else {                    
                $listing_aux->crawler_status = "ACTIVE";
                $listing_aux->delete_at = null;
            }

            $listing_aux->crawler_updatedAt = $result_listing->updatedAt;
            $listing_aux->advertiser_id = $advertiser_id;

            $save = $listing_aux->save();
            if($save)
            {
//                                echo "ANÚNCIO Cadastrado com sucesso.\n";
                $listing_id = $listing_aux->id;

                if($newPriceInserted === false){
                    //persist pricing obj
                    $price = $listing_aux->crawler_price;
                    $yearlyIptu = @$result_listing->pricingInfos[0]->yearlyIptu;
                    $monthlyCondoFee = @$result_listing->pricingInfos[0]->monthlyCondoFee;
                    $unit_type_id = $listing_aux->unit_type_id;
                    $rental = $listing_aux->crawler_businessType == "RENTAL" ? 1 : null;
                    $this->persistPricing($price, $yearlyIptu, $monthlyCondoFee, $listing_id, $unit_type_id, $rental);
                }                
            }
            else
            {
                echo "OCORREU UM ERRO AO SALVAR O ANÚNCIO";
                return($arr_enterprise);
                exit;
            }
        }
        
        
        // Registro o has_listing do empreendimento
        $enterprise_aux = ORM::for_table("module_imobles_enterprise")->find_one($enterprise_id);
        $enterprise_aux->has_listing = 1;
        $enterprise_aux->save();



        /*
         * TODO Faço o cadastro das imagens do anúncio
         */
        if($listing_review === false)
        {
            if(!empty($listing_arr_images))
            {
                foreach ($listing_arr_images as $image)
                {
                    $image_aux = $image['image'];
                    $ext = strtolower($image_aux->getimageformat());
                    $image_aux->setImageFormat ($ext);
                    if($ext == 'jpeg')
                    {
                        $ext = 'jpg';
                    }
                    $dir = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise_id . '/images';
                    if (!is_dir($dir)) {
                        mkdir($dir, 0755, true);
                    }
                    $name_aux = $listing_id."_".substr(md5(rand(1111,9999)),0,8).$this->getRandom().rand(1111,1000).rand(99,9999);
                    $name = $name_aux.".".$ext;
                    file_put_contents ($dir."/".$name, $image_aux); 
                    $d = ORM::for_table('module_imobles_enterprise_imgs')->create();
                    $d->src = $name;
            //                    $d->name = $name;
                    $d->module_imobles_enterprise_id = $enterprise_id;
                    $d->listing_id = $listing_id;
                    $d->type = 'listing';
                    $d->created_at = date('Y-m-d H:i:s');
                    $d->created_by = 0;
                    $d->duplicated = $image['duplicated'];
                    $d->save();
                    
                                        // Crio a versão webp da imagem
                    //                    if($ext != 'png')
                    //                    {
                    //                        $jpg=imagecreatefromjpeg($dir."/".$name);
                    //                        $w=imagesx($jpg);
                    //                        $h=imagesy($jpg);
                    //                        $webp=imagecreatetruecolor($w,$h);
                    //                        imagecopy($webp,$jpg,0,0,0,0,$w,$h);
                    //                        imagewebp($webp, $dir.'/'.$name_aux.".webp", 80);
                    //                        imagedestroy($jpg);
                    //                        imagedestroy($webp);
                    //                    }
                }
            }
            else
            {
                foreach ($result_medias as $medias)
                {
                    if($medias->type == 'IMAGE')
                    {
                        $url = $medias->url;
                        $url = str_replace('{width}', '870', $url);
                        $url = str_replace('{height}', '653', $url);
                        $url = str_replace('{action}', 'fit-in', $url);
                        $image = file_get_contents($url);
                        if($image)
                        {
                            try
                            {
                                //TODO: imagick não funciona no ambiente local do LEONARDO LOPES
            //                                        $image = new imagick($url);
            //                                        $ext = strtolower($image->getimageformat());
            //                                        $image->setImageFormat ($ext);

                                
                                $ext = substr($url, strlen($url)-3);
                                if($ext != 'png')
                                {
                                    $ext = 'jpg';
                                }
                                $dir = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise_id . '/images';
                                if (!is_dir($dir)) {
                                    mkdir($dir, 0755, true);
                                }
                                $name_aux = $listing_id."_".substr(md5(rand(1111,9999)),0,8).$this->getRandom().rand(1111,1000).rand(99,9999);
                                $name = $name_aux.".".$ext;
                                file_put_contents ($dir."/".$name, $image); 
                                $d = ORM::for_table('module_imobles_enterprise_imgs')->create();
                                $d->src = $name;
                                $d->name = $url;
                                $d->module_imobles_enterprise_id = $enterprise_id;
                                $d->listing_id = $listing_id;
                                $d->type = 'listing';
                                $d->created_at = date('Y-m-d H:i:s');
                                $d->created_by = 0;
                                $d->save();

                                // Crio a versão webp da imagem
            //                                if($ext != 'png')
            //                                {
            //                                    $jpg=imagecreatefromjpeg($dir."/".$name);
            //                                    $w=imagesx($jpg);
            //                                    $h=imagesy($jpg);
            //                                    $webp=imagecreatetruecolor($w,$h);
            //                                    imagecopy($webp,$jpg,0,0,0,0,$w,$h);
            //                                    imagewebp($webp, $dir.'/'.$name_aux.".webp", 80);
            //                                    imagedestroy($jpg);
            //                                    imagedestroy($webp);
            //                                }
                //                                            echo $dir."/".$name."\n";
                            } 
                            catch (Exception $ex) 
                            {
            //                                            echo $ex->getMessage()."\n";
                            }
                        }
                    }
                }
            }
        }
        else
        {
            $imgs = ORM::for_table('module_imobles_enterprise_imgs')
                                ->where('listing_id',$listing_id)
                                ->find_many();
            foreach($imgs as $d)
            {
                $origem     = 'application/plugins/module_imobles/uploads/enterprise/' . $d->module_imobles_enterprise_id . '/images/'.$d->src;
                if(!is_file($origem))
                {
                    $d->module_imobles_enterprise_id = $enterprise_id;
                    $d->type = 'listing';
                    $d->delete_at = date('Y-m-d H:i:s');
                    $d->save();
                }
                elseif($d->module_imobles_enterprise_id != $enterprise_id)
                {
                    $dir = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise_id . '/images';
                    if (!is_dir($dir)) {
                        mkdir($dir, 0755, true);
                    }
                    $destino    = $dir. '/'.$d->src;
                    rename($origem, $destino);

                    $d->module_imobles_enterprise_id = $enterprise_id;
                    $d->type = 'listing';
                    $d->updated_at = date('Y-m-d H:i:s');
                    $d->updated_by = 0;
                    $d->save();
                    
                    // Movo a versão webp da imagem
//                    if(is_file($destino))
//                    {
//                        
//                    }
                }
            }
        }

//        echo "FIM DO CADASTRO DO ANÚNCIO\n##########################\n\n";
//        exit;

        if($listing_review == true)
        {
            $return = array("enterprise_new"    => $compare_resut['enterprise'],
                            "match_type"        => @$compare_resut['similaridade']['type'],
                            "listing_id"        => $listing_id);
            return $return;
        }
        else
        {
            return $listing_id;
        }
    }
    
    
    /*
     * Função para comparar empreendimentos
     */
    public function compareEnterprise(
                                        $str_compare,
                                        $address_state_id,
                                        $address_city_id,
                                        $address_cep = null, 
                                        $address_bairro = null, 
                                        $address_logradouro = null, 
                                        $address_number = null, 
                                        $listing_compare = null,
                                        $listing_enterprise_id = null)
    {
        // Compara a string com as Empreendimentos já cadastrados
        $enterprises = ORM::for_table('module_imobles_enterprise')
                ->select_many('id','name','alternative_names','verified','google_place_id','crawler_enterprise_id',
                            'address_log','address_number','address_neightborhood', 'address_log_sanitized', 'address_neighborhood_sanitized')
                ->where('address_city_id', $address_city_id)
                ->where('address_state_id', $address_state_id)
                ->where_null('delete_at');
        
        if($address_bairro)
        {
            $enterprises->where('address_neighborhood_sanitized', $this->sanitizaLogradouro(trim($address_bairro)));
        }
        else
        {
            return false;
        }
        
        if($address_logradouro)
        {
            $enterprises->where('address_log_sanitized', $this->sanitizaLogradouro($address_logradouro));
        }
        else
        {
//            return false;
        }
        
        // Quebro a String de camparação
        $arr_str_compare = explode(' @@@ ', $str_compare);
        $str_compare_description = trim($arr_str_compare[0]);
        $str_compare_title = trim($arr_str_compare[1]);
        $arr_imgs_compare = array();
        $arr_dummys = array();
        
        $enterprises->order_by_asc('id');
        $enterprises_aux = $enterprises->find_many();
        
//        if($address_logradouro === null)
//        {
//            var_dump(count($enterprises_aux));
//            foreach ($enterprises_aux as $enterprise)
//            {
//                var_dump($enterprise->address_log);
//                var_dump($enterprise->name);
//                var_dump($enterprise->alternative_names);
//            }
//            exit;
//        }
        
        
        if(count($enterprises_aux))
        {
            foreach ($enterprises_aux as $enterprise)
            {
                $dummy = true;
                
                // TODO: usado para TESTES no crawler. Retirar no futuro.
                if($enterprise->id != 91)
                {
//                    continue;
                }
                
                // Verifico se o nome do empreendimento bate com o json do anúncio
                if($enterprise->verified || $enterprise->google_place_id || $enterprise->crawler_enterprise_id || $enterprise->sanitized == 1 || $enterprise->site_enabled == 1)
                {
                    $dummy = false;
                    if($enterprise->name)
                    {
                        // Monto o array de nomes do Empreendimento
                        $arr_names = array();
                        if($enterprise->alternative_names)
                        {
                            $alt_names = trim($enterprise->alternative_names);
                            if (substr($alt_names, -1) == ';'){
                                $alt_names = substr($alt_names, 0, -1);
                            }
                            $arr_names = explode(';', $alt_names);
                            
                        }
                        $arr_names[] = $enterprise->name;
                        $arr_exclude = array();
                        foreach ($arr_names as $name_aux)
                        {
                            $name = $this->cleanString(trim($name_aux));
                            $name = mb_strtolower($name.' ');
                            $name = preg_replace('/(residencial|edificio|condominio|'
                                            . 'res\.+|ed\.+|c\.+|cd\.+|cond\.+|con\.+|co\.+|cod\.+|condo\.+|resid\.+|'
                                    . 'Condominium|Residential|Building|Residence|Condominio do|Condominio de|Condominio da)\s+/i', '', $name);
                            $name = trim($name);
                            $name = str_replace('/', ' ', $name);

                            if($name == '') {
                                continue;
                            }

                            // Verifico se o nome do empreendimento é similar ao bairro
                            $arr_name_test = explode(' ', $name);
                            $arr_exclude_aux = ORM::for_table('module_imobles_crawler_forbidden_terms')->select('term')->find_many();
                            foreach ($arr_exclude_aux as $term)
                            {
                                $term_aux = $this->cleanString(mb_strtolower(trim($term->term)));
                                $arr_exclude[] = trim($term_aux);
                            }
                            $arr_exclude[] = $this->cleanString(mb_strtolower($address_bairro));
                            if(in_array($name, $arr_exclude) || strlen($name) < 5 || count($arr_name_test) < 2)
                            {
                                $pattern = '/((residencial|residence|edificio|condominio|res\.+|ed\.+|c\.+|'
                                    . 'edf\.+|\.+edi\.+|cd\.+|cond\.+|con\.+|\.+co\.+|cod\.+|\.+condo\.+){1}\s+'
                                    . '('.$name.'){1}|('.$name.'){1}\s+(residencial|residence|edificio|condominio|res\.+|ed\.+|'
                                    . 'cd\.+|cond\.+)\s{1})/i';
                            }
                            else
                            {
                                $pattern =  "/".$name."/i";
                            }
                            $str_compare = $this->cleanString(mb_strtolower(strip_tags($str_compare)));
                            if(empty($pattern) || empty($str_compare))
                            {
                                continue;
                            }
                            
                            $matches = array();
                            try
                            {
                                preg_match_all($pattern, $str_compare, $matches, PREG_OFFSET_CAPTURE);
                            } 
                            catch (Exception $ex) 
                            {
                                echo $ex->getMessage();
                            }
                            
                            if(count($matches) && !empty($matches[0]))
                            {
                                $similaridade = array(
                                                'merge_type' => 'enterprise_name',
                                                'type' => 'NOME EMPREENDIMENTO',
                                                'arr_imgs' => null,
                                                'count_imgs' => null,
                                                'unit_type_id' => null,
                                                'unit_id' => null
                                );
                                $return = array('enterprise' => $enterprise,
                                                'arr_imgs' => $arr_imgs_compare,
                                                'similaridade' => $similaridade);
                                return $return;
                            }
                        }
                    }
                }
                else
                {
                    if($listing_enterprise_id)
                    {
                        continue;
                    }
                }
                
                
                // Comparo os Tipos de Unidade do Empreendimento com o Anúncio
                if($address_logradouro && $enterprise->sanitized == 1)
                {
                    $arr_unit_types_enterprise = ORM::for_table('module_imobles_enterprise_units_type')
                                                ->where('module_imobles_enterprise_id', $enterprise->id)
                                                ->find_many();
                    foreach ($arr_unit_types_enterprise as $unit_types_obj)
                    {
                        $result_listing = $listing_compare->listing;
                        if(isset($result_listing->usableAreas) && count($result_listing->usableAreas) >= 1)
                        {
                            $count_planta = 0;
                            
                            // Comparo apenas a primeira Planta do anúncio
                            $area = $result_listing->usableAreas[0];
                            
                            $num_garagens = isset($result_listing->parkingSpaces[$count_planta])?$result_listing->parkingSpaces[$count_planta]:isset($result_listing->parkingSpaces[0])?$result_listing->parkingSpaces[0]:null;
                            $num_suites = isset($result_listing->suites[$count_planta])?$result_listing->suites[$count_planta]:isset($result_listing->suites[0])?$result_listing->suites[0]:null;
                            $num_banheiros = isset($result_listing->bathrooms[$count_planta])?$result_listing->bathrooms[$count_planta]:isset($result_listing->bathrooms[0])?$result_listing->bathrooms[0]:null;
                            $num_quartos = isset($result_listing->bedrooms[$count_planta])?$result_listing->bedrooms[$count_planta]:isset($result_listing->bedrooms[0])?$result_listing->bedrooms[0]:null;

                            if($area <= $unit_types_obj->area + 1 && $area >= $unit_types_obj->area - 1)
                            {
                                if($num_quartos == $unit_types_obj->number_rooms)
                                {
                                    if($num_garagens == $unit_types_obj->number_garage)
                                    {
                                        if($num_suites == $unit_types_obj->number_suite)
                                        {
                                        //  echo "MATCH TYPE: PLANTA: ".$enterprise->name."\n";

                                            $similaridade = array(
                                                            'merge_type' => 'unit_type',
                                                            'type' => 'TIPO DE UNIDADE',
                                                            'arr_imgs' => null,
                                                            'count_imgs' => null,
                                                            'unit_type_id' => $unit_types_obj->id,
                                                            'unit_id' => null
                                            );
                                            $return = array('enterprise' => $enterprise,
                                                            'arr_imgs' => $arr_imgs_compare,
                                                            'similaridade' => $similaridade);
                                            return $return;
                                        }
                                    }
                                }
                                $count_planta++;
                            }
                        }
                    }
                    
                    // Verifico se é a mesma rua e número
                    $address_logradouro_sanit = $this->sanitizaLogradouro($address_logradouro);
                    $enterprise_address_sanit = $enterprise->address_log_sanitized;
                    
                    // Pego o bairro sanitizado
                    $address_bairro_sanit = $this->sanitizaLogradouro($address_bairro);
                    
                    
                    if(intval($address_number) > 10
                        && $address_number == $enterprise->address_number 
                        && $address_logradouro_sanit == $enterprise_address_sanit
                        && $address_bairro_sanit == $enterprise->address_neighborhood_sanitized)
                    {
                        $similaridade = array(
                                'merge_type' => 'adrress',
                                'type' => 'ENDEREÇO'
                        );
                        $return = array('enterprise' => $enterprise,
                                        'arr_imgs' => $arr_imgs_compare,
                                        'similaridade' => $similaridade);
                        return $return;
                    }
                    
                    
                    // Pego todos os anúncios vinculados ao empreendimento
                    $listings = ORM::for_table('module_imobles_listings')
                                    ->where('entreprise_id', $enterprise->id)
                                    ->find_many();
                    if(count($listings))
                    {
                        foreach ($listings as $listing)
                        {
                            $description = $listing->description;
                            $title = $listing->title;

                            // Comparo a descrição
                            similar_text(mb_strtolower($description), mb_strtolower($str_compare_description), $sim_description);

                            // Comparo o título
                            similar_text(mb_strtolower($title), mb_strtolower($str_compare_title), $sim_title);

                            if(strlen($description) > 500 && $sim_description >= 95)
                            {
                                $similaridade = array(
                                        'merge_type' => 'desc',
                                        'type' => 'text',
                                        'title' => $sim_title,
                                        'description' => $sim_description,
                                        'unit_type_id' => $listing->unit_type_id,
                                        'unit_id' => $listing->unit_id
                                );
                                $return = array('enterprise' => $enterprise,
                                                'arr_imgs' => $arr_imgs_compare,
                                                'similaridade' => $similaridade);
                                return $return;
                            }
                            
                            //TODO: pulo a comparação por imagem
                            continue;

                            // Baixo todas as imagens do anúncio que está sendo cadastrado
                            if(empty($arr_imgs_compare))
                            {
                                foreach ($listing_compare->medias as $media_compare)
                                {
                                    if($media_compare->type == 'IMAGE')
                                    {
                                        $url = $media_compare->url;
                                        $url = str_replace('{width}', '870', $url);
                                        $url = str_replace('{height}', '653', $url);
                                        $url = str_replace('{action}', 'fit-in', $url);
                                        try
                                        {
                                            $image = new imagick($url);
                                            $arr_imgs_compare[] = array('image' => $image,
                                                                        'url'   => $url,
                                                                        'duplicated' => 0);
                                        } 
                                        catch (Exception $ex) 
                                        {
                                            echo $ex->getMessage()."\n";
                                        }
                                    }
                                }
                            }

                            
                            // comparo as imagens do anuncio
                            $json_listing = json_decode($listing->crawler_json);
                            $count_imgs = 0;
                            $arr_imgs = array();

                            $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                                                ->where('listing_id',$listing->id)
                                                ->where('duplicated',0)
                                                ->find_many();
                            if(!empty($arr_imgs_aux))
                            {
                                foreach ($arr_imgs_aux as $medias)
                                {
                                    $url = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise->id . "/images/".$medias->src;
                                    try
                                    {
                                        $image = new imagick($url);
                                        foreach($arr_imgs_compare as $key => $img_compare)
                                        {
                                            $img_match = false;
                                            $result = $image->compareImages($img_compare['image'], Imagick::METRIC_MEANSQUAREERROR);
                                            if($result[1] <= 0.005)
                                            {
                                                $count_imgs++;
                                                $arr_imgs[] = $url;
                                                $img_match = true;
                                                $arr_imgs_compare[$key]['duplicated'] = 1;
                                            }

                                            if($count_imgs >= 2)
                                            {
                                                $similaridade = array(
                                                            'merge_type' => 'img',
                                                            'type' => 'image',
                                                            'arr_imgs' => $arr_imgs,
                                                            'count_imgs' => $count_imgs,
                                                            'unit_type_id' => $listing->unit_type_id,
                                                            'unit_id' => $listing->unit_id
                                                );
                                                $return = array('enterprise'    => $enterprise,
                                                                'arr_imgs'      => $arr_imgs_compare,
                                                                'similaridade'  => $similaridade);
                                                return $return;
                                            }
                                        }
                                // echo $json_listing->listing->id." | RESULT: ".$result[1].($img_match?" | MATCH":null)." | ".$url."\n";
                                    } 
                                    catch (Exception $ex) 
                                    {
                                        echo $ex->getMessage()."\n";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        $return = array('enterprise' => false,
                        'arr_imgs' => $arr_imgs_compare);
        return $return;
    }

    /**
     * cleanString
     * Remove todos dos caracteres especiais do texto e os acentos
     *
     * @param  string $texto
     * @return string Texto sem caractere especiais
     */
    public function cleanString($texto = '')
    {
        $texto = trim($texto);
        $aFind = array('&','á','à','ã','â','é','ê','í','ó','ô','õ','ú','ü',
            'ç','Á','À','Ã','Â','É','Ê','Í','Ó','Ô','Õ','Ú','Ü','Ç',
            'ï','Ï','ñ','Ñ','è','È','ä','Ä','ö','Ö','ë','Ë','ì','Ì','ò','Ò','ù','Ù','ũ','Ũ');

        $aSubs = array('e','a','a','a','a','e','e','i','o','o','o','u','u',
            'c','A','A','A','A','E','E','I','O','O','O','U','U','C',
            'i','I','n','N','e','E','a','A','o','O','e','E','i','I','o','O','u','U','u','U');
        $novoTexto = str_replace($aFind, $aSubs, $texto);
        $novoTexto = preg_replace("/[^a-zA-Z0-9 @,-.;:\/]/", "", $novoTexto);
        return $novoTexto;
    }
    
    
    
    /*
     * Função para sanitizar o Logradouro do anúncio e realizar a comparação com Google Place
     */
    public function sanitizaLogradouro($string)
    {
        $sanit = $this->cleanString(mb_strtolower(trim($string)));
        $sanit = preg_replace('/[^a-zA-Z0-9\']/', '', $sanit);
        return $sanit;
    }
    
    
    
    /**
    * Calculates the distance between two points, given their 
    * latitude and longitude, and returns an array of values 
    * of the most common distance units
    *
    * @param  {coord} $lat1 Latitude of the first point
    * @param  {coord} $lon1 Longitude of the first point
    * @param  {coord} $lat2 Latitude of the second point
    * @param  {coord} $lon2 Longitude of the second point
    * @return {array}       Array of values in many distance units
    */
   function getDistanceBetweenPoints($lat1, $lon1, $lat2, $lon2) {
       $theta = $lon1 - $lon2;
       $miles = (sin(deg2rad($lat1)) * sin(deg2rad($lat2))) + (cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)));
       $miles = acos($miles);
       $miles = rad2deg($miles);
       $miles = $miles * 60 * 1.1515;
       $feet = $miles * 5280;
       $yards = $feet / 3;
       $kilometers = $miles * 1.609344;
       $meters = $kilometers * 1000;
       return compact('miles','feet','yards','kilometers','meters'); 
   }
   
    
   
    /*
     * Função para consultar a API NEAR BY do Google e procurar empreendimentos 
     * próximos do local do anúncio
     */
    public function googlePlaces($address_encoded_query, 
                                $geo_address_number, 
                                $geo_address_log, 
                                $geo_address_neighborhood, 
                                $geo_address_encoded,
                                $listings, $modelEnterprises) 
    {
        
        // Inicio as variáveis de controle
        $continue = true;
        $page_token = null;
        $count = 0;
        $arr_return = array();
        $arr_results = array();
        $count_repetidos = 0;
        $geocode_lat = null;
        $geocode_lng = null;
        while($continue === true)
        {
//            $url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?'
//                    . 'location='.$geocode_lat.','.$geocode_lng
//                    . '&keyword=tower|premier|home|garden|living|privilege|condomínio|edifício|residencial|'
//                    . 'Complexo+de+Condomínio|'
//                    . 'Edifício+de+Apartamentos'
//                    . '&key=AIzaSyDV8EiKB-3-jeqoB9qGR7oeQb-y9kLHoCU'
//                    . '&pagetoken='.$page_token
//                    . '&rankby=distance';
//            $address_encoded_query = $this->cleanString($address_encoded_query);
            $address_encoded_query = urlencode($address_encoded_query);
            $url = "https://maps.googleapis.com/maps/api/place/textsearch/json?"
                    . "query=Residencial|Edificio|Condominio|"
                    . $address_encoded_query 
                    . "&key=AIzaSyDV8EiKB-3-jeqoB9qGR7oeQb-y9kLHoCU"
                    . "&type=establishment"
                    . "&pagetoken=".$page_token;
            
            $json_google = curl_init($url);
            curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
            $json_response = curl_exec($json_google);
            $result = json_decode($json_response);
            if(!isset($result->results))
            {
                var_dump($result);
                echo '%%%%%%%%%%%%%%%%%    ERRO   %%%%%%%%%%%%%%\n\n\n';
                exit;
            }
            else
            {
                // Verifico a quantidade de anúncios para encerrar a paginação
                $count_results  = count($result->results);
                $arr_results    = array_merge($arr_results, $result->results);
                
                if($count_results < 20 || $count_repetidos >= 5)
                {
                    $continue = false;
                }
                
                if(isset($result->next_page_token))
                {
                    $page_token = $result->next_page_token;
                }
                else
                {
                    $continue = false;
                }
                
                foreach ($result->results as $empreendimentos)
                {
                    $count++;
                    
                    $arr_teste = ['lawyer','beauty_salon', 'night_club', 'general_contractor',
                                    'shopping_mall','dentist', 'health', 'store', 
                                    'place_of_worship', 'church', 'school', 'home_goods_store', 'florist', 'accounting', 
                                    'finance', 'gym', 'clothing_store', 'park', 'travel_agency', 'car_repair', 
                                    'hospital', 'doctor', 'route', 'street_address', 
                                    'meal_takeaway', 'restaurant', 'food', 'insurance_agency', 'electrician', 
                                    'bar', 'sublocality_level_1', 'sublocality', 'political', 
                                    'premise', 'pharmacy', 'drugstore', 'university', 'laundry', 'supermarket', 'grocery_or_supermarket', 'liquor_store', 'pet_store', 'veterinary_care'];
                    $exclude_type = false;
                    foreach ($empreendimentos->types as $type)
                    {
                        if(in_array($type, $arr_teste))
                        {
                            $exclude_type = true;
                            continue;
                        }
                    }
                    if($exclude_type === true)
                    {
                        continue;
                    }
                    
                    if(empty($geocode_lat) || empty($geocode_lng))
                    {
                        $geocode_lat = $empreendimentos->geometry->location->lat;
                        $geocode_lng = $empreendimentos->geometry->location->lng;
                    }

                    // inicio as variáveis
                    $arr_enterprise = array();
                    $arr_unitType  = array();
                    $arr_unit       = array();
                    $arr_listing    = array();


                    /*
                     *  Verifico se o empreendimento já foi cadastrado
                     */
                    $enterprise_id = null;
                    $enterprise_aux = ORM::for_table('module_imobles_enterprise')
                        ->where('google_place_id', $empreendimentos->place_id)
                        ->find_one();
                    if(isset($enterprise_aux->id) && $enterprise_aux->id > 0)
                    {
                        $enterprise_id = $enterprise_aux->id;
                        $count_repetidos ++;
                        if($count_repetidos >= 5)
                        {
                            $continue = false;
                        }
//                        echo "##################### GOOGLE MAPS - EMPREENDIMENTO JÁ CADASTRADO ".$empreendimentos->name." ###################\n\n";
                        continue;
                    }



                    /*
                     * 
                     * CADASTRO DO EMPREENDIMENTO
                     * 
                     */
                    $url = 'https://maps.googleapis.com/maps/api/place/details/json?'
                                . 'key=AIzaSyDV8EiKB-3-jeqoB9qGR7oeQb-y9kLHoCU'
                                . '&place_id='.$empreendimentos->place_id.'&language=pt-BR&reviews_no_translations=true';
                    $json_google = curl_init($url);
                    curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
                    $json_response = curl_exec($json_google);
                    $result_details = json_decode($json_response);
                    
                    if(!isset($result_details->result))
                    {
                        continue;
                    }
                    $place_details = $result_details->result;
//                    var_dump($place_details);exit;
                    
                    // Trato os dados do endereço
                    $address_number = null;
                    $address_log = null;
                    $address_zipcode = null;
                    $arr_address = isset($place_details->address_components)?$place_details->address_components:array();
                    foreach($arr_address as $address)
                    {
                        if(in_array('street_number', $address->types))
                        {
                            $address_number = intval($address->long_name);
                            if($address_number != $address->long_name)
                            {
                                $address_number = null;
                            }
                        }
                        
                        
                        if(in_array('postal_code', $address->types))
                        {
                            $address_zipcode = preg_replace('/\D/', '', $address->long_name);
                        }
                        
                        if(in_array('administrative_area_level_1', $address->types))
                        {
                            $address_state = $address->short_name;
                        }
                        
                        if(in_array('administrative_area_level_2', $address->types))
                        {
                            $address_city = $address->long_name;
                        }
                        
                        if(in_array('sublocality_level_1', $address->types))
                        {
                            $address_neighborhood = $address->long_name;
                        }
                        
                        if(in_array('route', $address->types))
                        {
                            $address_log = $address->long_name;
                        }
                    }
                    
                    // Se não tem endereço completo com o número, tratamos o endereço formatado
                    if($address_number == null)
                    {
                        // Verifico se tem o Número no campo formatted_address
                        $formatted_address = $place_details->formatted_address;
                        $arr_log = explode(',', $formatted_address);
                        $logradouro = $arr_log[0];
                        $discard_place = true;

                        if(isset($arr_log[1]) && !empty($arr_log[1]))
                        {
                            $end_number_aux = trim(strtolower($arr_log[1]));
                            $end_number_aux = preg_replace('/^(número|numero|num\.?|nu\.?|nu\.?|n\.?)?(º)?\s+/', '', $end_number_aux);
                            $pattern = '/^[0-9]+(\s+|\-+)?/';
                            preg_match($pattern, $end_number_aux, $matches, PREG_OFFSET_CAPTURE);
                            if(!empty($matches[0]))
                            {
                                $arr_number_aux = preg_split('/(\s+|\-+)+/',$end_number_aux);
                                $end_number_aux = trim($arr_number_aux[0]);
                                if(intval($end_number_aux) == $end_number_aux && $end_number_aux > 0)
                                {
                                    $address_number = $end_number_aux;
                                    if($address_log == null)
                                    {
                                        $address_log = $arr_log[0];
                                    }
                                    $discard_place = false;
                                }
                            }
                        }
                        
                        if($discard_place == true)
                        {
//                            continue;
                        }
                    }
                    
                    $arr_address_gp = array(
                        'address_state'         => $address_state,
                        'address_city'          => $address_city,
                        'address_neighborhood'  => $address_neighborhood,
                        'address_zipcode'       => $address_zipcode,
                        'address_log'           => $address_log,
                        'address_number'        => $address_number
                    );
                    
                    
                    // Verifico se o endereço bate com o do Empreendimento
                    if($address_number && 
                        $geo_address_number == $address_number && 
                        $this->sanitizaLogradouro($geo_address_log) == $this->sanitizaLogradouro($address_log) && 
                        $this->sanitizaLogradouro($geo_address_neighborhood) == $this->sanitizaLogradouro($address_neighborhood))
                    {
                        $result_details->result->arr_address_gp = $arr_address_gp;
                        $arr_return = $result_details->result;
                        continue;
                    }
                    elseif(empty ($arr_return))
                    {
                        // Monta a string de comparação
                        $description = $listings->listing->description;
                        $title = $listings->listing->title;
                        $complement = $listings->listing->address->complement;
                        $codigo_ext = $listings->listing->externalId;
                        $str_compare = $description.' @@@ '.$title.' @@@ '.$complement.' @@@ '.$codigo_ext;
                        
                        $arr_exclude = array();
                        
                        // Verifico se o nome do empreendimento aparece no anúncio
                        $compare_name = $this->searchEnterpriseNames($place_details->name, $str_compare, $address_neighborhood);
                        if($compare_name)
                        {
                            $result_details->result->arr_address_gp = $arr_address_gp;
                            $arr_return = $result_details->result;
                            continue;
                        }
                    }
                    
                    // Pesquiso pelo endereço
                    $enterprise_aux = null;
                    if($address_number)
                    {
                        $enterprise_aux = ORM::for_table('module_imobles_enterprise')
                //                        ->where('address_zip', $address_zipcode)
                                        ->where('address_log_sanitized', $this->sanitizaLogradouro($address_log))
                                        ->where('address_number', $address_number)
                                        ->where('address_neighborhood_sanitized', $this->sanitizaLogradouro($address_neighborhood))
                                        ->find_one();
                    }
                    

                    if(isset($enterprise_aux->id) && $enterprise_aux->id > 0)
                    {   
                        if(empty($enterprise_aux->google_place_id))
                        {
                            // Atualizo os dados com o Google
                            $enterprise_aux->name = $place_details->name;
                            $enterprise_aux->latitude = $place_details->geometry->location->lat;
                            $enterprise_aux->longitude = $place_details->geometry->location->lng;
                            $enterprise_aux->google_geometry = json_encode($place_details->geometry);
                            $enterprise_aux->google_phone = isset($place_details->formatted_phone_number)?$place_details->formatted_phone_number:null;
                            $enterprise_aux->google_place_id = $place_details->place_id;
                            $enterprise_aux->google_plus_code = isset($place_details->plus_code)?json_encode($place_details->plus_code):null;
                            $enterprise_aux->google_rating = isset($place_details->rating)?$place_details->rating:null;
                            $enterprise_aux->google_reference = $place_details->reference;
                            $enterprise_aux->google_reviews = isset($place_details->reviews)?json_encode($place_details->reviews):null;
                            $enterprise_aux->google_user_ratings_total = isset($place_details->user_ratings_total)?$place_details->user_ratings_total:null;
                            $enterprise_aux->google_json = json_encode($place_details);
                            $enterprise_aux->link_google = $place_details->url;
                            $enterprise_aux->updated_at = date('Y-m-d H:i:s');
                            $enterprise_aux->save();
                        }
                    }
                    else
                    {
                        // Populo o array do empreendimento
                        $arr_enterprise['name'] = $place_details->name;
                        $arr_enterprise['alias'] = $arr_enterprise['name'];
                        $arr_enterprise['enable'] = 0;
//                        $arr_enterprise['comparator_status'] = "Backlog";                        
//                        $arr_enterprise['created_by'] = 0;


                        // Endereço
                        $arr_enterprise['address_log'] = $address_log;
                        $arr_enterprise['address_log_sanitized'] = $this->sanitizaLogradouro($address_log);
                        $arr_enterprise['address_number'] = $address_number;
                        $arr_enterprise['address_neightborhood'] = $address_neighborhood;
                        $arr_enterprise['address_neighborhood_sanitized'] = $this->sanitizaLogradouro($address_neighborhood);
                        $arr_enterprise['address_zip'] = $address_zipcode;
                        
                        $arr_enterprise['latitude'] = $place_details->geometry->location->lat;
                        $arr_enterprise['longitude'] = $place_details->geometry->location->lng;
                        $arr_enterprise['link_google'] = $place_details->url;
                        $arr_enterprise['google_geometry'] = json_encode($place_details->geometry);
                        $arr_enterprise['google_phone'] = isset($place_details->formatted_phone_number)?$place_details->formatted_phone_number:null;
                        $arr_enterprise['google_place_id'] = $place_details->place_id;
                        $arr_enterprise['google_plus_code'] = isset($place_details->plus_code)?json_encode($place_details->plus_code):null;
                        $arr_enterprise['google_rating'] = isset($place_details->rating)?$place_details->rating:null;
                        $arr_enterprise['google_reference'] = $place_details->reference;
                        $arr_enterprise['google_reviews'] = isset($place_details->reviews)?json_encode($place_details->reviews):null;
                        $arr_enterprise['google_user_ratings_total'] = isset($place_details->user_ratings_total)?$place_details->user_ratings_total:null;
                        $arr_enterprise['google_json'] = json_encode($place_details);

                        // Pego o ID do Estado
                        if($address_state) 
                        {
                            $c = ORM::for_table("state")->where("uf_state", $address_state)->find_one();
                            if($c) 
                            {
                                $arr_enterprise['address_state_id'] = $c->id;
                                
                                // Pego o ID da Cidade
                                if($address_city)
                                {
                                    $c = ORM::for_table("city")
                                            ->where("city_name", $address_city)
                                            ->where("id_state", $c->id)
                                            ->find_one();
                                    if ($c) {
                                        $arr_enterprise['address_city_id'] = $c->id;
                                    }
                                }
                            }
                        }
                        $arr_enterprise['obs'] = null;

                        // Salvo o empreendimento
                        $save = $modelEnterprises->createEnterprises($arr_enterprise);
                        if(is_numeric($save->id))
                        {
//                            echo "GOOGLE - NOVO Empreendimento Cadastrado com Sucesso.\n";
                            $enterprise_id = $save->id;
                        }
                        else
                        {
                            echo 'OCORREU UM ERRO AO SALVAR O EMPREENDIMENTO';
                            var_dump($arr_enterprise);
                            exit;
                        }


                        // Cadastro as Torres
                        $torre = 1;
                        $tower = ORM::for_table('module_imobles_enterprise_towers')->create();
                        $tower->title = 'Torre '.$torre;
//                        $tower->floors = isset($result_listing->floors[0])?$result_listing->floors[0]:null;
                        $tower->alias = 'torre_'.$torre;
                        $tower->stage = 'Ready to move in';
                        $tower->module_imobles_enterprise_id = $enterprise_id;
//                        $tower->unitsOnTheFloor = isset($result_listing->unitsOnTheFloor)?$result_listing->unitsOnTheFloor:null;
                        $tower->created_at = date('Y-m-d H:i:s');
                        $tower->save();

                    }
                }
            }            
        }
        
        // Registro a pesquisa na API NEARBY do Google
        $google_nearby = ORM::for_table('module_imobles_google_nearby')->create();
        $google_nearby->address_encoded = $geo_address_encoded;
        $google_nearby->latitude = $geocode_lat;
        $google_nearby->longitude = $geocode_lng;
        $google_nearby->google_json = json_encode($arr_results);
        $google_nearby->save();
        
        return $arr_return;
    }
 
    /*
     * Geração de um número randomico
     */
    function getRandom(){
//        return strtotime(date('Y-m-d H:i:s')).rand(1111,9999).rand(11,99).rand(111,999);
        $x = _raid().time();
        return $x;
    }
    
    
    /*
     * searchEnterpriseNames
     * Função para verificar se o nome de um empreendimento está na descrição textual do anúncio
     */
    public function searchEnterpriseNames($name, $str_compare, $address_bairro)
    {
        var_dump($name);
        $name = $this->cleanString(trim($name));
        $name = mb_strtolower($name.' ');
        $name = preg_replace('/(residencial|edificio|condominio|'
                        . 'res\.+|ed\.+|c\.+|cd\.+|cond\.+|con\.+|co\.+|cod\.+|condo\.+|resid\.+|'
                . 'Condominium|Residential|Building|Residence|Condominio do|Condominio de|Condominio da)\s+/i', '', $name);
        $name = trim($name);
        $name = str_replace('/', ' ', $name);

        // Verifico se o nome do empreendimento é similar ao bairro
        $arr_name_test = explode(' ', $name);
        $arr_exclude_aux = ORM::for_table('module_imobles_crawler_forbidden_terms')->select('term')->find_many();
        foreach ($arr_exclude_aux as $term)
        {
            $term_aux = $this->cleanString(mb_strtolower(trim($term->term)));
            $arr_exclude[] = trim($term_aux);
        }
        $arr_exclude[] = $this->cleanString(mb_strtolower($address_bairro));
        if(in_array($name, $arr_exclude) || strlen($name) < 5 || count($arr_name_test) < 2)
        {
            $pattern = '/((residencial|residence|edificio|condominio|res\.+|ed\.+|c\.+|'
                . 'edf\.+|\.+edi\.+|cd\.+|cond\.+|con\.+|\.+co\.+|cod\.+|\.+condo\.+){1}\s+'
                . '('.$name.'){1}|('.$name.'){1}\s+(residencial|residence|edificio|condominio|res\.+|ed\.+|'
                . 'cd\.+|cond\.+)\s{1})/i';
        }
        else
        {
            $pattern =  "/".$name."/i";
        }
        $str_compare = $this->cleanString(mb_strtolower(strip_tags($str_compare)));
        
        var_dump($pattern);
        var_dump($str_compare);
        if(empty($pattern) || empty($str_compare))
        {
            return false;
        }

        $matches = array();
        try
        {
            preg_match_all($pattern, $str_compare, $matches, PREG_OFFSET_CAPTURE);
        } 
        catch (Exception $ex) 
        {
            return false;
        }

        if(count($matches) && !empty($matches[0]))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    function persistPricing($price, $yearlyIptu, $monthlyCondoFee, $listing_id, $unit_type_id, $rental = null)
    {
        $insert_price = false;
        $pricing_aux = ORM::for_table('module_imobles_listings_prices')->where('listing_id', $listing_id)->order_by_desc('id')->find_one();
        if(isset($pricing_aux->id))
        {
            if($pricing_aux->price != $price || $pricing_aux->yearly_iptu != $yearlyIptu || $pricing_aux->condo_fee != $monthlyCondoFee)
            {
                $insert_price = true;
            }
        }
        else
        {
            $insert_price = true;
        }
        
        
        if($insert_price === true)
        {
            $pricing_aux = ORM::for_table('module_imobles_listings_prices')->create();
            $pricing_aux->listing_id = $listing_id;
            $pricing_aux->unit_type_id = $unit_type_id;
            $pricing_aux->rental = $rental;
            $pricing_aux->price = $price;
            $pricing_aux->yearly_iptu = $yearlyIptu;
            $pricing_aux->condo_fee = $monthlyCondoFee;
            $save = $pricing_aux->save();
        }

        $unitTypeUpdate = new UnitTypeUpdate();
        // $unitTypeUpdate->SetSearchablesUnitTypes([$unit_type_id]);
        
        return true;
    }
    
    
    public function resizeImg($file, $width = 800, $height = 800)
    {
        // redimensiono a imagem
        $larguraMaxima  = $width;
        $alturaMaxima   = $height;
        $arquivo        = $file;
        $t              = explode(".", $arquivo);
        $tipoImagem     = $t[count($t)-1];

        try
        {
            if($tipoImagem == "gif")
            {
                    $imagemOriginal = imagecreatefromgif($arquivo);
            } 
            else if($tipoImagem == "jpg" || $tipoImagem == "jpeg" || $tipoImagem == "JPG" || $tipoImagem == "JPEG")
            {
                    $imagemOriginal = imagecreatefromjpeg($arquivo);
            } 
            else if($tipoImagem == "png" || $tipoImagem == "PNG")
            {
                    $imagemOriginal = imagecreatefrompng($arquivo);
            } 
            else 
            {
                echo "Tipo de Arquivo Invalido";
                return false;
            }
        }
        catch (Exception $ex) 
        {
            echo "ERROR | CREAT IMAGE FROM EXT ##### ".$ex->getMessage()." | ".$file." | "."\n";
            return false;
        }
        
        
        list($larguraOriginal, $alturaOriginal) = getimagesize($arquivo);
        if($larguraOriginal > $larguraMaxima || $alturaOriginal > $alturaMaxima)
        {

            if ($larguraOriginal == $alturaOriginal)
            {
                $largura = $larguraMaxima;
                $altura = $alturaMaxima;
            } 
            else if ($larguraOriginal > $alturaOriginal)
            {
                $proporcao = 100 * $larguraMaxima / $larguraOriginal;
                $largura = $larguraMaxima;
                $altura = $alturaOriginal * $proporcao / 100;
            } 
            else if ($larguraOriginal < $alturaOriginal)
            {
                $proporcao = 100 * $alturaMaxima / $alturaOriginal;
                $altura = $alturaMaxima;
                $largura = $larguraOriginal * $proporcao / 100;
            }
            
            $imagemRedimensionada = imagecreatetruecolor($largura, $altura);		
            imagecopyresampled($imagemRedimensionada, $imagemOriginal, 0, 0, 0, 0, $largura, $altura, $larguraOriginal, $alturaOriginal);
            imagedestroy($imagemOriginal);
            
            if($tipoImagem == "gif" || $tipoImagem == "GIF")
            {
                imagegif($imagemRedimensionada,$arquivo);
            } 
            else if($tipoImagem == "jpg" || $tipoImagem == "jpeg" || $tipoImagem == "JPG" || $tipoImagem == "JPEG")
            {
                imagejpeg($imagemRedimensionada,$arquivo,80);
            } 
            else if($tipoImagem == "png")
            {
                imagepng($imagemRedimensionada,$arquivo,9);
            }
            imagedestroy($imagemRedimensionada);		
            return true;
        }
        else
        {
            imagedestroy($imagemOriginal);
            return true;
        }
        return false;
    }
    
    
    /*
     * Insert Enterprise Images
     */
    public function insertEnterpriseImg($url, $enterprise_id, $type, $tags, $thumb = false, $description = null, $resize = true, $unit_type_id = null, $unit_id = null, $listing_id = null, $crawlerTypeID = null, $crawlerImageID = null)
    {
        $image = file_get_contents($url);
        if($image !== false)
        {
            try
            {
                $enterprise_dir = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise_id . '/images';
                if (!is_dir($enterprise_dir)) 
                {
                    mkdir($enterprise_dir, 0755, true);
                }
                
                $ext = substr($url, strlen($url)-3);
                if($ext != 'png')
                {
                    $ext = 'jpg';
                }

                // Salvo a imagem
                $name_aux = "_".substr(md5(rand(1111,9999)),0,8).$this->getRandom().rand(1111,1000).rand(99,9999);
                $name = $name_aux.".".$ext;
                $file_img = $enterprise_dir.'/'. $name;
                $upload_file_aux = file_put_contents($file_img, $image);

                if ($upload_file_aux !== false)
                {
                    // Redimensiono a imagem
                    $resize_img = $this->resizeImg($file_img, 1920, 1080);
                    
                    if($resize == true)
                    {
                        // Crio a miniatura da imagem
                        $arr_img_size["xxl"] = array("w" => 1152,"h" => 768);
                        $arr_img_size["xlg"] = array("w" => 840,"h" => 560);
                        $arr_img_size["lrg"] = array("w" => 600,"h" => 400);
                        $arr_img_size["med"] = array("w" => 450,"h" => 300);
                        $arr_img_size["sml"] = array("w" => 300,"h" => 200);
                        $arr_img_size["xsm"] = array("w" => 120,"h" => 80);

                        if($thumb === true)
                        {
                            $arr_img_size["thumb"] = array("w" => 120,"h" => 80);
                        }

                        foreach ($arr_img_size as $k => $v)
                        {
                            if(!is_dir($enterprise_dir.'/'.$k)) 
                            {
                                    mkdir($enterprise_dir.'/'.$k, 0755, true);
                            }
                            $file_img_cp = $enterprise_dir.'/'.$k.'/'.basename($file_img);
                            copy($file_img, $file_img_cp);
                            $resize_img = $this->resizeImg($file_img_cp, $v["w"], $v["h"]);
                        }

                        // Criou um thumb (104x80)
                        if($thumb === true)
                        {
                            $this->cropImg($enterprise_dir.'/thumb/'.basename($file_img), 104, 80);
                        }
                    }
                    
                    // Registro a imagem da planta para o empreendimento
                    if(!empty($tags)){
                        $tags = json_encode($tags);
                    }
                    else
                    {
                        $tags = null;
                    }
                    $d = ORM::for_table('module_imobles_enterprise_imgs')->create();
                    $d->src = $name;
                    $d->name = $url;
                    $d->module_imobles_enterprise_id = $enterprise_id;
                    $d->type = $type;
                    $d->created_at = date('Y-m-d H:i:s');
                    $d->created_by = 0;
                    $d->tags = $tags;
                    $d->description = $description;
                    $d->unit_type_id = $unit_type_id;
                    $d->unit_id = $unit_id;
                    $d->listing_id = $listing_id;
                    $d->resized = $resize == true?1:null;
                    $d->crawler_type_id = $crawlerTypeID;
                    $d->crawler_image_id = $crawlerImageID;

                    // Crio a versão webp da imagem
                    $create_webp = false;
                    if($ext == 'png')
                    {
                        $create_webp=imagecreatefrompng($file_img);
                    }
                    elseif($ext == 'jpg')
                    {
                        $create_webp=imagecreatefromjpeg($file_img);
                    }
                    
                    if($create_webp !== false)
                    {
                        $w=imagesx($create_webp);
                        $h=imagesy($create_webp);
                        $webp=imagecreatetruecolor($w,$h);
                        imagecopy($webp,$create_webp,0,0,0,0,$w,$h);
                        imagewebp($webp, $enterprise_dir."/".$name_aux.".webp", 80);
                        imagedestroy($create_webp);
                        imagedestroy($webp);
                        
                        $d->webp = 1;
                    }
                    $d->save();
                }
                else
                {
                    echo "ERROR ##### UPLOAD NÃO REALIZADO | ".$file_img." | "."\n";
                    return false;
                }
            } 
            catch (Exception $ex) 
            {
                echo "ERROR ##### ".$ex->getMessage().$url." | "."\n";
                return false;
            }
        }
        else
        {
            return false;
        }
        return true;
    }
    
    
    public function cropImg($arquivo, $width = 500, $height = 500)
    {
        // redimensiono a imagem
        $t              = explode(".", $arquivo);
        $tipoImagem     = strtolower($t[count($t)-1]);
        if($tipoImagem == "gif")
        {
                $imagemOriginal = imagecreatefromgif($arquivo);
        } 
        else if($tipoImagem == "jpg" || $tipoImagem == "jpeg" || $tipoImagem == "JPG" || $tipoImagem == "JPEG")
        {
                $imagemOriginal = imagecreatefromjpeg($arquivo);
        } 
        else if($tipoImagem == "png" || $tipoImagem == "PNG")
        {
                $imagemOriginal = imagecreatefrompng($arquivo);
        } 
        else if($tipoImagem == "webp" || $tipoImagem == "WEBP")
        {
                $imagemOriginal = imagecreatefromwebp($arquivo);
        }
        else 
        {
            echo "Tipo de Arquivo Invalido";
            return false;
        }
        
        $im2 = imagecrop($imagemOriginal, ['x' => 0, 'y' => 0, 'width' => $width, 'height' => $height]);
        if ($im2 !== FALSE) 
            {
            if($tipoImagem == "gif" || $tipoImagem == "GIF")
            {
                imagecreatefromgif($im2, $arquivo);
            } 
            else if($tipoImagem == "jpg" || $tipoImagem == "jpeg" || $tipoImagem == "JPG" || $tipoImagem == "JPEG")
            {
                imagejpeg($im2, $arquivo);
            } 
            else if($tipoImagem == "png")
            {
                imagepng($im2, $arquivo);
            }
            else if($tipoImagem == "webp")
            {
                imagewebp($im2, $arquivo);
            }
            imagedestroy($im2);
        }
        imagedestroy($imagemOriginal);
        return true;
    }

    public function resizeImgFileSizeByTag($fileName, $tags, $startQuality = null){
        $maxFileSize = 0;
        $quality = 100;
        if ( $startQuality !== null ){
            if( $startQuality > 10 && $startQuality < 100 ){
                $quality = $startQuality;
            }
        }
        // LOGO, DEVELOPMENT_GALLERY_MAIN, DEVELOPMENT_SIMILAR_CARD, DEVELOPMENT_GALLERY_IMGS,
        // HOTSITE_DEVELOPMENT_FEATURED_MOBILE, HOTSITE_CONSTRUCTION_COMPANY,
        // HOTSITE_CONSTRUCION_FEATURED_MOBILE, HOTSITE_DEVELOPMENT_SLIDER_MOBILE,
        // DEVELOPMENT_GALLERY_APARTMENT        
        $tags50kb  = [2, 7,  8, 10, 16, 23, 25, 28, 31];

        // UNIT_TYPE_PLAN, HOTSITE_DEVELOPMENT_FEATURED,
        // HOTSITE_CONSTRUCION_FEATURED, HOTSITE_DEVELOPMENT_SLIDER
        $tags100kb = [4, 15, 24, 27];

        if ( !empty(array_intersect($tags50kb, $tags)) ) {
            $maxFileSize = 50 * 1000;
        } else if ( !empty(array_intersect($tags100kb, $tags)) ) {
            $maxFileSize = 100 * 1000;
        }

        if ($maxFileSize > 0){
            $fileSize = filesize($fileName);
            if ($fileSize > $maxFileSize){
                $file_aux = $fileName . '_aux';
                $image = imagecreatefromjpeg($fileName);
                while ($fileSize > $maxFileSize && $quality > 5){
                    $quality--;
                    imagejpeg($image, $file_aux, $quality);
                    $fileSize = filesize($file_aux);
                    unlink($fileName); 
                    rename($file_aux, $fileName);
                }
            }
        }
    }
    
    
    /*
     * Insert Enterprise Images
     */
    public function insertUploadedImg($file_name, $enterprise_id, $type, $tags = null, $thumb = false, $description = null, $resize = true, $unit_type_id = null, $unit_id = null, $listing_id = null, $img_id = null, $company_construction_id = null, $alt_text = null, $replaceImage = false)
    {
        // Verifico se o diretório de imagens do empreendimento já existe
        if($company_construction_id)
        {
            $dir_img = 'application/plugins/module_imobles/uploads/companyconstruction/' . $company_construction_id . '/images';
        } else {
            if($type=='neighborhood'){
                $dir_img = 'application/plugins/module_imobles/uploads/neighborhood/' . $enterprise_id . '/images';
            }else{
                $dir_img = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise_id . '/images';
            }
        }
        if (!is_dir($dir_img)) 
        {
            mkdir($dir_img, 0755, true);
        }
        
        $url = $dir_img."/".$file_name;
        if(is_file($url))
        {
            try
            {
                // Carrego a imagem
                $file_arr = explode(".", $file_name);
                $file_name = $file_arr[0];
                $file_img = $url;
                $original_size = filesize($file_img);
                $overwrite = false;
                $info = getimagesize($file_img);
                if ($info['mime'] == 'image/jpeg')
                {
                    $image = imagecreatefromjpeg($file_img);
                }    
                elseif($info['mime'] == 'image/gif') 
                {
                    $image = imagecreatefromgif($file_img);
                    $overwrite = true;
                }
                elseif ($info['mime'] == 'image/png') 
                {
                    $image = imagecreatefrompng($file_img);
                    $overwrite = true;
                }
                else
                {
                    return false;
                }
                
                
                // Quality
                // TODO: verificar
                // Defino a qualidade de compressão
                $quality = 80;
                if(empty($tags) || in_array("4", $tags) || in_array("6", $tags))
                {
                    $quality = 90;
                }

                // Crio a nova imagem
                $file_aux = $dir_img."/".$file_name."_aux.jpg";
                imagejpeg($image, $file_aux, $quality);
                $this->resizeImg($file_aux, 1920, 1080);

                // Verifico se é pra sobrescrever a imagem
                $new_size = filesize($file_aux);
                if($original_size > $new_size || $overwrite === true)
                {
                    unlink($file_img);
                    $file_new = $dir_img."/".$file_name.".jpg";
                    rename($file_aux, $file_new);
                }
                else
                {
                    unlink($file_aux);
                }
                
                $this->resizeImgFileSizeByTag($dir_img."/".$file_name.".jpg", $tags, $quality);

                // Crio a versão webp da imagem
                imagedestroy($image);
                $image = imagecreatefromjpeg($dir_img."/".$file_name.".jpg");
                $w=imagesx($image);
                $h=imagesy($image);
                $webp=imagecreatetruecolor($w,$h);
                imagecopy($webp,$image,0,0,0,0,$w,$h);
                imagewebp($webp, $dir_img."/".$file_name.".webp", 80);
                imagedestroy($webp);
                imagedestroy($image);


                
                // Redimensiono a imagem
                $file_img = $dir_img."/".$file_name.".jpg";
                if($resize === true)
                {
                    // Crio a miniatura da imagem
                    $arr_img_size["xxl"] = array("w" => 1152,"h" => 768);
                    $arr_img_size["xlg"] = array("w" => 840,"h" => 560);
                    $arr_img_size["lrg"] = array("w" => 600,"h" => 400);
                    $arr_img_size["med"] = array("w" => 450,"h" => 300);
                    $arr_img_size["sml"] = array("w" => 300,"h" => 200);
                    $arr_img_size["xsm"] = array("w" => 120,"h" => 80);

                    if($thumb === true)
                    {
                        $arr_img_size["thumb"] = array("w" => 120,"h" => 80);
                    }

                    foreach ($arr_img_size as $k => $v)
                    {
                        if(!is_dir($dir_img.'/'.$k)) 
                        {
                                mkdir($dir_img.'/'.$k, 0755, true);
                        }
                        $file_img_cp = $dir_img.'/'.$k.'/'.basename($file_img);
                        copy($file_img, $file_img_cp);
                        $resize_img = $this->resizeImg($file_img_cp, $v["w"], $v["h"]);
                        
                        // Crio a versão webp da miniatura
                        $webp_aux = imagecreatefromjpeg($file_img_cp);
                        $w=imagesx($webp_aux);
                        $h=imagesy($webp_aux);
                        $webp=imagecreatetruecolor($w,$h);
                        imagecopy($webp,$webp_aux,0,0,0,0,$w,$h);
                        imagewebp($webp, $dir_img."/".$k."/".$file_name.".webp", 80);
                        imagedestroy($webp);
                        imagedestroy($webp_aux);
                    }

                    // Criou um thumb (104x80)
                    if($thumb === true)
                    {
                        $this->cropImg($dir_img.'/thumb/'.$file_name.".jpg", 104, 80);
                        $this->cropImg($dir_img.'/thumb/'.$file_name.".webp", 104, 80);
                    }
                }
                
                // Registro a imagem para o empreendimento
                if($replaceImage){
                    $d = ORM::for_table('module_imobles_enterprise_imgs')->find_one($img_id);
                    $d->updated_at = date('Y-m-d H:i:s');
                    $d->src = $file_name.".jpg";
                    $d->name = $file_name.".jpg";
                    $d->resized = $resize == true?1:null;
                    $d->webp = 1;
                    $d->save();
                } else if($img_id > 0)
                {
                    $d = ORM::for_table('module_imobles_enterprise_imgs')->find_one($img_id);
                    $d->type = $type;
                    $d->updated_at = date('Y-m-d H:i:s');
                    
                    if($tags)
                    {
                        $d->tags = json_encode($tags);
                    }
                    
                    if($description)
                    {
                        $d->description = $description;
                    }
                    
                    
                    if($unit_type_id)
                    {
                        $d->unit_type_id = $unit_type_id;
                    }
                    
                    
                    if($unit_id)
                    {
                        $d->unit_id = $unit_id;
                    }
                    
                    
                    if($listing_id)
                    {
                        $d->listing_id = $listing_id;
                    }
                    
                    if($resize === true)
                    {
                        $d->resized = 1;
                    }

                    if($company_construction_id)
                    {
                        $d->construction_company_id = $company_construction_id;
                    }
                    else
                    {
                        
                          if($type=='neighborhood'){
                                $d->neighborhood_id = $enterprise_id;
                          }else{
                                $d->module_imobles_enterprise_id = $enterprise_id;
                          }
                    }
                    
                    if($alt_text)
                    {
                        $d->alt_text = $alt_text;
                    }

                    $d->webp = 1;
                    $d->save();
                }
                else
                {
                    $d = ORM::for_table('module_imobles_enterprise_imgs')->create();
                    $d->src = $file_name.".jpg";
                    $d->name = $file_name.".jpg";

                    if($company_construction_id)
                    {
                        $d->construction_company_id = $company_construction_id;
                    }
                    else
                    {
                        if($type=='neighborhood'){
                            $d->neighborhood_id = $enterprise_id;
                        }else{
                            $d->module_imobles_enterprise_id = $enterprise_id;
                        }
                        
                    }

                    
                    $d->type = $type;
                    $d->created_at = date('Y-m-d H:i:s');
                    $d->created_by = 0;
                    $d->tags = json_encode($tags);
                    $d->description = $description;
                    $d->unit_type_id = $unit_type_id;
                    $d->unit_id = $unit_id;
                    $d->listing_id = $listing_id;
                    $d->resized = $resize == true?1:null;
                    $d->webp = 1;
                    $d->alt_text = $alt_text;
                    $d->save();
                }
            } 
            catch (Exception $ex) 
            {
                echo "ERROR | CREAT IMAGE FROM EXT ##### ".$ex->getMessage()." | ".$url." | "."\n";
                return false;
            }
        }
        else
        {
            return false;
        }
        return true;
    }
    
    
    /*
     * createMiniImages
     * Função para criar miniaturas das imagens
     */
    public function createMiniImages($file_path, $arr_img_size)
    {
        if(is_file($file_path))
        {
            try
            {
                // Redimensiono a imagem
                $file_info = pathinfo($file_path);
                $file_name = $file_info["filename"];
                $dir_img = $file_info["dirname"];
                $ext = $file_info["extension"];
                $info = getimagesize($file_path);
                if ($info['mime'] != 'image/jpeg')
                {
                    return false;
                }   
                
                foreach ($arr_img_size as $k => $v)
                {
                    if(!is_dir($dir_img.'/'.$k)) 
                    {
                            mkdir($dir_img.'/'.$k, 0755, true);
                    }
                    $file_img_cp = $dir_img.'/'.$k.'/'.$file_name.".jpg";
                    copy($file_path, $file_img_cp);
                    $resize_img = $this->resizeImg($file_img_cp, $v["w"], $v["h"]);

                    // Crio a versão webp da miniatura
                    $webp_aux = imagecreatefromjpeg($file_img_cp);
                    $w=imagesx($webp_aux);
                    $h=imagesy($webp_aux);
                    $webp=imagecreatetruecolor($w,$h);
                    imagecopy($webp,$webp_aux,0,0,0,0,$w,$h);
                    imagewebp($webp, $dir_img."/".$k."/".$file_name.".webp", 80);
                    imagedestroy($webp);
                    imagedestroy($webp_aux);
                    
                    // Criou um thumb (104x80)
                    if($k == "thumb")
                    {
                        $this->cropImg($dir_img.'/thumb/'.$file_name.".jpg", 104, 80);
                        $this->cropImg($dir_img.'/thumb/'.$file_name.".webp", 104, 80);
                    }
                }
                return true;
            } 
            catch (Exception $ex) 
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    
    /*
     * Função para sanitizar o Logradouro do anúncio e realizar a comparação com Google Place
     */
    public function sanitizaUrl($string)
    {
        $sanit = $this->cleanString(mb_strtolower(trim($string)));
        $sanit = preg_replace('/\-/', ' ', $sanit);
        $sanit = preg_replace('/[^a-zA-Z0-9\']/', ' ', $sanit);
        $sanit = preg_replace('/\s+/', ' ', $sanit);
        $sanit = preg_replace('/[^a-zA-Z0-9\']/', '-', $sanit);
        return $sanit;
    }
        /*
     * Função para sanitizar o Logradouro do anúncio e realizar a comparação com Google Place
     */
    public function sanitiza($string)
    {
        $sanit = $this->cleanString(mb_strtolower(trim($string)));
        $sanit = preg_replace('/\-/', ' ', $sanit);
        $sanit = preg_replace('/[^a-zA-Z0-9\']/', ' ', $sanit);
        $sanit = preg_replace('/\s+/', ' ', $sanit);
        $sanit = preg_replace('/[^a-zA-Z0-9\']/', '_', $sanit);
        return $sanit;
    }

    public function purgeCache($urls) {
        $api_token = 'Wf2DJpUytku5nL41K-0JRPXXXxAlKKsVnxld2nhr';
        $zone_id = 'e1ac5737905680ea02c73605566857fe'; // myside.com.br
        $purge_url = 'https://api.cloudflare.com/client/v4/zones/'.$zone_id.'/purge_cache';
        $headers = [
            'Authorization: Bearer '.$api_token,
            'Content-Type: application/json',
        ];
        $request = curl_init($purge_url);
        $fields = '{"files":[';
        $url_error = array();
        foreach($urls as $url) {
            if (!preg_match("/(.*)(myside.com.br).*/", $url)) {
                $url_error[] = 'Domínio da URL inválido | '.$url;
                continue;
            }
            $fields = $fields . '"'.$url.'",';
        }

        if(count($url_error) > 0){
            return $url_error;
        }
        $fields = substr($fields, 0, -1);
        $fields = $fields . ']}';
        curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($request, CURLOPT_POST, true);
        curl_setopt($request, CURLOPT_POSTFIELDS, $fields);
        curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
//        curl_exec($request);
        $json_response = curl_exec($request);
        $result = json_decode($json_response);

        if(isset($result->success) && $result->success === true)
        {
            return true;
        }
        else
        {
            return $result->errors;
        }
    }
    
    
    /*
     * Paulo Moreira
     */
    
    public function bairrosGoiania()
    {
        $bairros = 'Setor Central;Setor Norte Ferroviário;Setor Norte Ferroviário II;Setor Aeroporto;'.
            'Setor Sul;Setor Oeste;Setor Marista;Setor Bueno;Vila Americano do Brasil;Vila Teófilo Neto;'.
            'Vila Santa Efigênia;Setor Sol Nascente;Vila Aguiar;Jardim América;Nova Suiça;Setor Sudoeste;'.
            'Vila Alpes;Residencial Manhattan;Vila Bela;Setor União;Jardim Ana Lúcia;Vila Alvorada;Vila Lucy;'.
            'Vila Anchieta;Vila Mauá;Vila Adélia;Vila Adélia I e III;Jardim Europa;Jardim Planalto;Anhanguera;'.
            'Vila Rezende;Parque Anhanguera;Parque Anhanguera II;Jardim Atlântico;Vila Rosa;Setor Faiçalville;'.
            'Jardim Florença;Jardim Presidente;Residencial Flamingo;Setor Garavelo;Setor Grajaú;Setor Cristina;'.
            'Fazenda Santa Rita - Conjunto Residencial Alto Oriente;Setor Andréia;Jardim Caravelas;Setor Maria Celeste;'.
            'Conjunto Habitacional Madre Germana II;Residencial Barcelona;Condomínio Amin Camargo;Setor dos Dourados;'.
            'Chácaras Dona Gê;Condomínio Marlene;Fazenda Santa Rita;Condomínio das Esmeraldas;Jardim Itaipu;'.
            'Conjunto Habitacional Baliza;Setor Orientville;Jardim Ipanema;Residencial Real Conquista;Residencial Itaipu;'.
            'Residencial Itaipu I;Residencial Ana Clara;Loteamento Quinta do Rio Dourados;Residencial Santa Fé;'.
            'Residencial Campos Dourados;Jardins Lisboa;Residencial Linda Vista;Residencial Portal do Oriente;'.
            'Condomínio Privê das Oliveiras;Fazenda Dourados;Residencial Privê Ilhas do Caribe;'.
            'Fazenda Santa Rita - Residencial Invent Total Club;Residencial Porto Dourado;Residencial Acrópole II;'.
            'Jardim Vila Boa;Conjunto Cachoeira Dourada;Setor Novo Horizonte;Residencial Granville;Village Veneza;'.
            'Residencial Porto Seguro;Residencial Aquários II;Residencial Eldorado;Residencial Center Ville;'.
            'Jardins Madri;Parque das Paineiras (1,2,3 e 4 Etapa);Residencial Sevilha;Jardins Madri Complemento;'.
            'Setor Três Marias;Setor Três Marias I;Residencial Monte Carlo;Setor Rio Formoso;Jardim Sônia Maria;'.
            'Setor Tancredo Neves;Setor Ulisses Guimarães;Parque Santa Rita;Residencial Aquários;Setor Santa Rita II;'.
            'Condomínio Santa Rita 6ª Etapa;Setor Santa Rita VIII;Setor Santa Rita VII;Bairro Santa Rita;Setor Santa Rita;'.
            'Vila Santa Rita - 5ª Etapa;Condomínio Santa Rita - 9ª Etapa;Condomínio Santa Rita - 7ª etapa;'.
            'Residencial Canadá;Residencial Brasil Central;Residencial Vereda dos Buritis;Residencial Forteville;'.
            'Residencial Rio Verde;Residencial Santa Rita - 4ª Etapa;Residencial Forteville Extensão;Residencial Eli Forte;'.
            'Residencial Eli Forte Extensão;Residencial Talismã;Residencial Talismã I;Residencial Flórida;'.
            'Fazenda Santa Rita - Glebas B e B1;Jardim Eli Fortes Complemento;Moinho dos Ventos;Chácaras Santa Rita;'.
            'Residencial Recanto das Emas;Residencial Fidelis;Vila Luciana;Loteamento Celina Park;Parque Oeste Industrial;'.
            'Residencial Parque Oeste;Parque Oeste Industrial Extensão;Residencial Eldorado Expansão;Residencial Dom Rafael;'.
            'Villar Baviera;Condomínio dos Dourados;Condomínio Ipanema;Jardim Botânico;Condomínio Rio Branco;'.
            'Residencial Della Penna;Fazenda Santa Rita - Jardim Botânico;Condomínio Eldorado;Vila Rizzo;Cidade Jardim;'.
            'Vila São Paulo;Residencial Della Penna Extensão;Jardim Corte Real;Residencial Real;Jardim Marques de Abreu;'.
            'Jardim Aritana;Chácaras Buritis;Residencial Nunes de Morais 1ª Etapa;Residencial Nunes de Morais 2ª Etapa;'.
            'Residencial Nunes de Morais 3ª Etapa;Residencial Ponta Negra;Jardim Eli Forte;Chácaras Anhanguera;'.
            'Recreio do Funcionário Público;Residencial Solar Bougainville;Loteamento Alphaville Residencial;'.
            'Chácaras Salinos;Jardim Alphaville;Residencial Buena Vista I;Residencial Buena Vista II;Residencial Buena Vista III;'.
            'Residencial Buena Vista IV;Jardim Gardênia;Chacaras Village Santa Rita;Village Santa Rita;Setor Solar Santa Rita;'.
            'Residencial Portal Santa Rita;Residencial Village Santa Rita I;Residencial Village Santa Rita II;'.
            'Residencial Village Santa Rita III;Residencial Kátia;Residencial Village Santa Rita IV;Residencial Santa Fé I;'.
            'Fazenda Salinos;Setor Castelo Branco;Conjunto Romildo Ferreira do Amaral;Vila Nova Canaã;'.
            'Conjunto Guadalajara;Vila Canaã;Vila Santa Rita;Vila Mooca;Industrial Mooca;Nossa Senhora de Fátima;'.
            'Vila Santa Rita Acréscimo;Vila Mooca Complemento;Conjunto Morada Nova;Vila Aurora Oeste;Vila Santo Afonso;'.
            'Conjunto Residencial Rodoviário;Rodoviário;Granja Santos Dumont;Esplanada do Anicuns;Aeroviário;'.
            'Setor São José;Setor Jardim Ana Flávia;Vila São José Extensão;Vila São José Complemento;Vila João Vaz;'.
            'Capuava Residencial Privê;Fazenda Caveiras;Condomínio Alto da Boa Vista;Capuava;Ipiranga;Vila Regina;'.
            'São Francisco;Jardim Leblon;Fazenda Santa Rita - São Francisco;Jardim Leblon II;Residencial Jardim Leblon;'.
            'Residencial Cidade Verde;Jardim Pampulha;Residencial Parque Mendanha;Jardim Petrópolis;Residencial Petrópolis;'.
            'Chácaras Maringá;Condomínio do Lago;Jardim Clarissa;Village Maringá;Parque Industrial Paulista;'.
            'Setor Santos Dumont;Setor Cândida de Morais;Residencial 14 Bis;Jardim Bonanza;Setor Barra da Tijuca;'.
            'Jardim Novo Petrópolis;Residencial 14 Bis Extensão;Jardim Nova Esperança;Setor Marabá;Setor Noroeste;'.
            'Setor Marabá Extensão;Vila Mutirão II;Jardim Liberdade;Vila Mutirão I;Setor Novo Planalto;Jardim Curitiba;'.
            'Residencial Green Park;Residencial Mansões Paraíso;Residencial Fonte das Águas;Parque Maracanã;'.
            'Sítios de Recreio dos Bandeirantes;Residencial Beatriz Nascimento;Carolina Parque Complemento;'.
            'Conjunto Residencial Costa Verde;Carolina Parque;Parque João Braz - Cidade Industrial;'.
            'Carolina Parque Extensão;Parque Industrial João Bras 2;Loteamento Tropical Verde;Lorena Parque;'.
            'Residencial Luana Park;Residencial Luana Park Continuação;Fazenda São José - Residencial Celeste;'.
            'Setor Delta Village;Araguaia Park;Solange Parque I;Solange Park II;Parque Paraíso;Solange Park III;'.
            'Residencial Goiânia Viva;Fazenda Santa Rita - Goiânia Viva;Chácaras São José;Condomínio Jardim das Oliveiras;'.
            'Condomínio Anhanguera;Condomínio União;Jardim das Rosas;Residencial Goyaz Park;Goiá;Goiá 2;Jardim Mirabel;'.
            'Setor Maysa Extensão;Residencial Recanto das Garças;Parque Buriti;Goiá IV;Condomínio Santa Rita;'.
            'Goiá Setor Veloso;Goiá 2 Complemento;Solange Parque Complemento;Solange Parque Extensão;Residencial Anicuns;'.
            'Condomínio Residencial Santa Maria I;Condomínio Residencial Santa Rita;Condomínio Residencial Parque Oeste;'.
            'Residencial São Marcos;Setor Campinas;Vila Irany;Vila Santana;Setor Coimbra;Vila Boa Sorte;'.
            'Setor dos Funcionários;Setor Centro Oeste;Vila Xavier;Vila Abajá;Vila São Francisco;Vila Isaura;Vila Paraíso;'.
            'Vila Jacaré;Vila Vera Cruz;Vila Perdiz;Vila Viandeli;Vila Fernandes;Vila Santa Helena;Vila Ofugi;'.
            'Residencial Senador Albino Boaventura;Setor Marechal Rondon;Setor Criméia Oeste;Vila São Luiz;'.
            'Conjunto Residencial Yara;Panorama Parque;Setor Urias Magalhães;Vila Nossa Senhora Aparecida;'.
            'Setor Urias Magalhães II;Residencial Bethel;Granja Cruzeiro do Sul;Jardim Diamantina;Setor Sevene;'.
            'Residencial Hugo de Moraes;Residencial Guarema;Fazenda Catingueiro;Residencial Morumbi;Setor Gentil Meireles;'.
            'Setor Perim;Vila Clemente;Setor Progresso;Residencial Itamaracá;Setor Perim Continuação;Residencial Perim;'.
            'Vila Maria Dilce;Chácaras Maria Dilce;Zona Industrial Pedro Abrão;Jardim Santa Cecília;Setor Empresarial;'.
            'Residencial Recreio Panorama;Recreio Panorama;Residencial Recreio Panorama Extensão;Sítio de Recreio Panorama;'.
            'Jardim Gramado;Vila Cristina;Vila Cristina Continuação;Vila Cristina Extensão;Jardim Balneário Meia Ponte;'.
            'Granjas Brasil;Residencial Balneário;Residencial Licardino Ney;Parque Balneário;Chácaras Rio Branco;'.
            'Parque das Nações;Loteamento Mansões Goianas;Fazenda Criméia Caveiras;Jardim Ipê;Jardim Fonte Nova;'.
            'Jardim Fonte Nova I;Setor Alto do Vale;Residencial Barravento;Recanto Barravento;Jardim Belvedere;'.
            'Residencial Jardim Belvedere Expansão;Residencial José Viandeli;Residencial Humaitá;Residencial Mirante;'.
            'Residencial Maria Lourença;Parque das Flores;Residencial das Acácias;Residencial Itália;'.
            'Setor Leste Universitário;Vila Morais;Setor Morais;Chácaras Retiro;Fazenda Retiro;Parque Industrial de Goiânia;'.
            'Feliz;Setor Rasmussem;Setor Leste Vila Nova;Vila Colemar Natal e Silva;Vila Osvaldo Rosa;Elísio Campos;'.
            'Vila Santa Isabel;Vila Viana;Setor Negrão de Lima;Setor Nova Vila;Granja Agrícola Jacirema;Vila Jaraguá;'.
            'Vila Monticelli;Loteamento Mansões Pereira;Vila Fróes;Setor Criméia Leste;Vila Megale;Goiânia 2;'.
            'Santa Genoveva;Garavelo Residencial Norte;Aeroporto Internacional Santa Genoveva;Setor Jaó;'.
            'Jardim Guanabara;Vila dos Subtenentes e Sargentos;Vila dos Oficiais;Chácaras Nossa Senhora da Piedade;'.
            'Residencial Aldeia do Vale;Jardim Guanabara II;Sítio de Recreio Mansões Bernardo Sayão;Sítio de Recreio Ipê;'.
            'Fazenda Petrópolis - Residencial Monte Verde;Residencial Ouro Preto;Fazenda Colina;Santa Genoveva 2;'.
            'Fazenda Guanabara - Condomínio Parque Ipê;Residencial Guanabara;Jardim Guanabara III;Jardim Guanabara IV;'.
            'Vila Santa Cruz;Conjunto Parque dos Eucaliptos;Setor Asa Branca;Residencial Felicidade;'.
            'Loteamento Estâncias Vista Alegre;Residencial João Paulo II;Residencial Vale dos Sonhos I;'.
            'Residencial Vale dos Sonhos II;Residencial Vale da Serra;Residencial Portal da Mata;Residencial Bela Goiânia;'.
            'Residencial Elizene Santana;Vila Jardim São Judas Tadeu;Setor Maria Rosa;Vila Jardim Pompéia;'.
            'Chácaras Bom Retiro;Residencial Campus;Residencial Morada do Bosque;Loteamento Morada dos Sonhos;'.
            'Vila Itatiaia;Campus Samambaia - UFG;Chácaras Califórnia;Village Casa Grande;Residencial Nossa Morada;'.
            'Jardim Bom Jesus;Residencial São Geraldo;Fazenda São Domingos;Condomínio Cidade Universitária;'.
            'Sítios de Recreio Mansões do Campus;Chácaras de Recreio Samambaia;Condomínio Shangry-Lá;'.
            'Sítios de Recreio São Geraldo;Condomínio Parque dos Cisnes;Residencial Antônio Barbosa;'.
            'Residencial Alice Barbosa I;Residencial Alice Barbosa Extensão;Privê Residencial Elza Fronza;'.
            'Sítio de Recreio Pindorama;Privê Residencial Itanhangá;Residencial Morada do Ipê;Village Atalaia;'.
            'Residencial Atalaia;Residencial dos Ipês;Residencial dos Ipês Extensão;Sítios de Recreio Caraíbas;'.
            'Residencial Orlando Morais;Residencial Antônio Carlos Pires;Sítio de Recreio Paraíso Tropical;'.
            'Residencial Shangri-lá I;Residencial Shangri-lá II;Residencial Paraíso;Distrito Vila Rica;'.
            'Fazenda Botafogo;Jardim Novo Mundo;Vila Martins;Jardim Califórnia Parque Industrial;Chácaras Santa Bárbara;'.
            'Vila Bandeirantes;Chácaras Botafogo;Vila Romana;Jardim Novo Mundo II;Jardim Novo Mundo Extensão;'.
            'Vila Maria Luiza;Água Branca;Conjunto Riviera;Jardim Brasil;Residencial Sonho Verde;Jardim Califórnia;'.
            'Residencial Olinda;Residencial Vale do Araguaia;Colônia Santa Marta;Vila Martins Extensão;'.
            'Residencial Village Campos Verdes;Conjunto Residencial Aruanã I;Conjunto Residencial Aruanã II;'.
            'Conjunto Residencial Aruanã III;Parque Santa Maria;Residencial Aruanã;Loteamento Aruanã Park;'.
            'Conjunto Caiçara;Conjunto Palmares;Jardim Dom Fernando II;Jardim Dom Fernando I;Loteamento Grande Retiro;'.
            'Residencial Mar Del Plata;Jardim Conquista;Loteamento Tupinambá dos Reis;Jardim Maria Helena;Vila Pedroso;'.
            'Vila Concórdia;Jardim das Aroeiras;Chácaras São Silvestre;Vila Pedroso - Expansão;Residencial Lucy Pinheiro;'.
            'Parque das Amendoeiras I;Santo Hilário;Parque das Amendoeiras;Fazenda Planície Petrópolis;Vila Matilde;'.
            'Residencial São Leopoldo;Residencial São Leopoldo Complemento;Santo Hilário II;Residencial Sonho Dourado;'.
            'Residencial Havaí;Santo Hilário Expansão;Residencial Havaí Extensão;Fazenda Ladeira;Fazenda Retiro - Golden Shopping;'.
            'Residencial Costa Paranhos;Chácaras Ipanema;Jardim Lageado;Setor Recanto das Minas Gerais;Residencial Belo Horizonte;'.
            'Jardim Abaporu;Residencial Senador Paranhos;Residencial Belo Horizonte Complemento;Residencial Rio Jordão;'.
            'Residencial Paulo Estrela;Fazenda Santa Maria;Conjunto Residencial Irisville;'.
            'Conjunto Residencial Irisville - 2ª Etapa;Residencial Português;Jardim Goiás;Jardim Goiás - Área I;'.
            'Vila Alto da Glória;Vila São João;Vila Maria José;Setor Pedro Ludovico;Chácaras Alto da Glória;'.
            'Alto da Glória;Conjunto Vila Isabel;Loteamento Areião I;Setor Areião II;Setor Bela Vista;Jardim das Esmeraldas;'.
            'Serrinha;Parque Amazônia;Vila Divino Pai Eterno;Jardim Luz;Setor dos Afonsos;Vila São Tomaz;Vila Redenção;'.
            'Jardim da Luz;Conjunto Anhanguera;Jardim Santo Antônio;Parque das Laranjeiras;Chácara São José - PUC Campus II;'.
            'Parque Acalanto;Parque Santa Cruz;Parque Flamboyant;Jardim Bela Vista;Vila Legionárias;Jardim Vitória;'.
            'Fazenda Gameleira;Condomínio Privê dos Girassóis;Parque das Laranjeiras Acréscimo;Conjunto Fabiana;'.
            'Chácara do Governador;Alphaville Flamboyant Residencial Araguaia;Park Lozandes;Residencial Alphaville Flamboyant;'.
            'Loteamento Portal do Sol I;Loteamento Portal do Sol II;Residencial Cléa Borges;Residencial Goiânia Golfe Clube;'.
            'Jardim Mariliza;Jardins Atenas;Jardins Paris;Jardins Milão;Jardins Valência;Jardins Verona;Jardins Munique;'.
            'Residencial Recanto dos Buritis;Parque Atheneu;Residencial Ville de France;Residencial Brisas do Cerrado;'.
            'Residencial Arco Verde;Residencial Vale das Brisas;Fazenda Vau das Pombas;Área Rural de Goiânia';
        return $bairros;
    }


    public function inGaiaUrls(){

        return [
            "https://www.pointerimoveis.net.br/api/listings?pagina=" => "62981494505",
            "https://www.checkupimoveis.com/api/listings?pagina=" => "62993058668",
            "https://www.alfacenter.com.br/api/listings?pagina=" => "6232366111",
            "https://www.xangai.com.br/api/listings?pagina=" => "62999530110",
            "http://www.terravip.com.br/api/listings?pagina=" => "62985937102",
            "https://www.atresimobiliaria.com.br/api/listings?pagina=" => "62991925505",
            "https://www.brasileraimoveis.com.br/api/listings?pagina=" => "62992415901",
            "https://www.imobiliary.com.br/api/listings?pagina=" => "6294063342",
            "http://www.verkaufimoveis.com.br/api/listings?pagina=" => "62999794381",
            "https://www.nivelimoveis.com.br/api/listings?pagina=" => "62999335037",
            "https://www.jcurado.com/api/listings?pagina=" => "6230913999",
            "https://www.semfronteirasimobiliaria.com.br/api/listings?pagina=" => "6230959025",
            "https://www.barcellosimoveis.com.br/api/listings?pagina=" => "62996191547",
            "https://www.jfrazao.com.br/api/listings?pagina=" => "62998256400",
            "https://www.awmrevenda.com.br/api/listings?pagina=" => "6298394449",
            "https://www.goianiainvest.com.br/api/listings?pagina=" => "62999219492",
            "https://www.homegynimoveis.com.br/api/listings?pagina=" => "62982941400",
            "https://www.ampbrasil.com.br/api/listings?pagina=" => "62992993306",
            "https://www.cir.imb.br/api/listings?pagina=" => "6230703103",
            "https://www.classsolucoesimobiliarias.com.br/api/listings?pagina=" => "62991935132",
            "https://www.fraderamos.com.br/api/listings?pagina=" => "6232986222",
            "https://www.imobilyimobiliaria.com.br/api/listings?pagina=" => "62999550057",
            "https://www.castelimobiliaria.com.br/api/listings?pagina=" => "6232810111",
            "https://www.newlifeimobiliaria.com.br/api/listings?pagina=" => "62985627383",
            "https://www.oron.com.br/api/listings?pagina=" => "6231421012",
            "https://www.b2cimoveis.com.br/api/listings?pagina=" => "62981479361",
            "https://www.orlaexperiencia.com.br/api/listings?pagina=" => "6236454080",
            "https://www.peritoemimoveis.com.br/api/listings?pagina=" => "62992275464",
            "https://www.suriasimoveis.com.br/api/listings?pagina=" => "62993954739",
            "https://www.amjgestaoimobiliaria.com.br/api/listings?pagina=" => "62999280710",
            "https://www.obterimoveis.com.br/api/listings?pagina=" => "6298339791",
            "https://www.alphaimoveisgo.com.br/api/listings?pagina=" => "62981617571",
            "https://www.inmobilia.com.br/api/listings?pagina=" => "62991297902",
            "https://www.luxogyn.com.br/api/listings?pagina=" => "62999228073",
            "https://www.grupoempimobiliarios.com.br/api/listings?pagina=" => "62996158386"
        ];

    }
    
    
    /*
     * Paulo Moreira
     */
    public function importCsv()
    {

        $csv = new parseCSV();

        $csv->auto('application/storage/temp/data.csv');

        $imported_data = $csv->data;

        $matches = [];

        $match_ids = [];

        $count = 0;


        foreach($imported_data as $data){

            $neighborhood = $this->sanitizaLogradouro($data['endereco_bairro']);

            $all_enterprises = ORM::for_table('module_imobles_enterprise')->select_many('id', 'name', 'alternative_names', 'release_date')->find_many();

            foreach($all_enterprises as $enterprise){

                $name_matched = $this->searchEnterpriseNames($data['empresas.razao_social'], $enterprise->name, "");

                if($name_matched){

                    $count++;

                    //var_dump($enterprise->name);

                    //var_dump($data['empresas.razao_social']);

                    array_push($match_ids, $enterprise->id);

                    $duplicate = false;

                    foreach($matches as $key => $value){

                        if($key == $data['empresas.cnpj_1']){

                            array_push($matches[$data['empresas.cnpj_1']], $enterprise->name);


                            $duplicate = true;

                        }

                    }

                    if($duplicate){

                        continue;

                    }

                    $matches[$data['empresas.cnpj_1']] = array($enterprise->name);

                }

            }

        }

        $not_matched = ORM::for_table('module_imobles_enterprise')->select_many('id', 'name', 'address_neightborhood')->where_not_in('id', $match_ids)->find_many();

        foreach($not_matched as $not){

            var_dump($not->name);

            var_dump($not->address_neightborhood);

        }

        var_dump($matches);

        var_dump($count);

    }


    //get via api
//    public function fetchAPI($nbhd)
//    {
//
//        $url = 'https://imobles.lrsys.com.br/?ng=api&key=gg7m8b7ruqaptg4a0jc9f4604qrsm1et7b66c3nx&method=plugin&plugin=module_imobles&pl_method=searchDevelopments';
//
//        $json = '{"locations":[{"address_log": "","address_number": "","address_zip": "","address_neighborhood":'.$nbhd.',"address_state": "GO","address_city": "Goiânia" }],"resale":true,"size":1000}';
//
//        $ch = curl_init($url);
//
//        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//
//        curl_setopt($ch, CURLOPT_POST, 1);
//
//        curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
//
//        $ch = curl_exec($json_vivareal);
//
//    }
}

Anon7 - 2022
AnonSec Team