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/controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

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

include_once "Controller.php";
include_once __DIR__ . "/../models/EnterprisesModel.php";
include_once __DIR__ . "/../models/Enterprise_standardModel.php";
include_once __DIR__ . "/../models/Company_constructionModel.php";
include_once __DIR__ . "/../controllers/EnterprisesController.php";
include_once __DIR__ . "/../helpers/CrawlerHelper.php";
include_once __DIR__ . "/../helpers/JsonTranslator.php";

// Models para Amenities
include_once __DIR__ . "/../models/Typeunits_amenitiesModel.php";
include_once __DIR__ . "/../models/Units_amenitiesModel.php";
include_once __DIR__ . "/../models/Enterprise_amenitiesModel.php";

include_once __DIR__ . "/../models/TypeunityModel.php";
include_once __DIR__ . "/../models/Typeunits_amenitiesModel.php";
include_once __DIR__ . "/../models/UnityModel.php";


include_once __DIR__ . "/../assets/libs/Helper.php";
include_once __DIR__ . "/../assets/libs/utmConverter.php";

class CrawlerController extends Controller {

    protected $modelEnterprises;
    protected $modelUnitType;
    protected $modelUnit;
    protected $crawlerHelper;
    protected $jsonTranslator;
    

    public function __construct($ui, $_L, $config, $_pd = null) 
    {
        @ini_set('memory_limit', '4095M');
        @ini_set('max_execution_time', 0);
        @set_time_limit(0);
        
        parent::__construct($ui, $_L, $config, $_pd);
//
//        $this->ui->assign('_title', $this->_L['module imobles enterprise'] . ' - ' . $this->config['CompanyName']);
//        $this->ui->assign('_st', $_L['module imobles']);
        
        

        $this->modelEnterprises = new EnterprisesModel();
        $this->modelUnitType = new TypeunityModel();
        $this->modelUnit = new UnityModel();
        $this->crawlerHelper = new CrawlerHelper();
        $this->jsonTranslator = new JsonTranslator();
    }
    
    
    
    
    /**
     * 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');
        $novoTexto = str_replace($aFind, $aSubs, $texto);
        $novoTexto = preg_replace("/[^a-zA-Z0-9 @,-.;:\/]/", "", $novoTexto);
        return $novoTexto;
    }
    
    
    
    /**
     * vivaReal
     * Função que faz a busca dos anúncios na API do Viva Real
     *
     * @param  
     * @return JSON 
     */
    public function vivareal($bairro = null) {    
        $crawlerType = ORM::for_table('module_imobles_crawler_types')
                    ->where('type', 'vivareal')
                    ->find_one();
        if (!$crawlerType){
            echo "\n!!!!!!!!!!!!!!!!! CRAWLER TYPE NÃO LOCALIZADO !!!!!!!!!!!!!!!!!";
            echo "\n!!!!!!!!!!!!!!!! crawler vivareal interrompido !!!!!!!!!!!!!!!!\n";
            die;
        }

//        header('Content-Type: application/json');
        $time_start = microtime(true);
        $offset = isset($this->routes[3])?intval($this->routes[3]):0;
        $offset = 0;
        $continue = true;
        $size = 150;
        $from = 0 + $offset;
        $count = 0;
        $page = null;
        $count_bairros = 0;
        $count_error = 0;
        $arr_listings_id = array();
        if($bairro)
        {
            $bairros_goiania = trim($bairro);
            $check_log = false;
        }
        else
        {
            $check_log = true;
            $bairros_goiania = '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';
            
//            $bairros_goiania = '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';
        }
        $arr_bairros_goiania = array_unique(explode(';', $bairros_goiania));
//        asort($arr_bairros_goiania);
//        var_dump($arr_bairros_goiania);exit;
        
//        echo "Tota de Bairros: ".count($arr_bairros_goiania)."\n\n";
        foreach ($arr_bairros_goiania as $bairro)
        {   
            // TODO: chumbado para GOIÂNIA
            // TODO: registrar no banco o bairro já mapeado pelo ARCGIS
            // Pego os dados de todos os IPTUs pela ArcGys de Goiânia
//            $this->arcgisGyn($bairro);
            
            
            // Verifico se já tem alguma CRONTAB rodando para o mesmo bairro
            $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')
                            ->select('status')
                            ->select('created_at')
                            ->where('bairro', $bairro)
                            ->order_by_desc('id')
                            ->find_one();
            
            if($crawler_log)
            {
                $diff_time = strtotime(date('Y-m-d H:i:s')) - strtotime($crawler_log->created_at);
            }
//            echo $diff_time."\n";
            
            if(isset($crawler_log->status) && $crawler_log->status == 'continue' && $check_log == true && $diff_time < 60*60*4)
            {
                echo "################## Bairro EM ANDAMENTO EM OUTRA CRON: ".$bairro."\n\n";
                continue;
                
            }
            elseif(isset($crawler_log->status) && $crawler_log->status == 'finished' && $check_log == true && $diff_time < 60*60*24)
            {
                echo "################## Bairro Finalizado a menos de 24 HORAS: ".$bairro."\n\n";
                continue;
            }
            else
            {
                // Registro no Log do Crawler
                $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                $crawler_log->created_at = date('Y-m-d H:i:s');
                $crawler_log->bairro = $bairro;
                $crawler_log->from = $from;
                $crawler_log->status = 'continue';
                $crawler_log->save();
            }
            echo "################## Bairro Atual: ".$bairro."\n\n";
            
            // Inicio as variáveis
            $count_page = 0;
//            $bairro_alias = $this->cleanString($bairro);
//            $bairro_alias = str_replace(' ', '+', $bairro_alias);
            $bairro_alias = urlencode($bairro);
            $continue = true;
            $count_bairros++;
            while ($continue === true)
            {
                try
                {
                    // Facho a chamada para a API do Viva Real
                    $url = 'https://glue-api.vivareal.com/v2/listings?'
                            . 'addressCity=Goi%C3%A2nia'
                            . '&addressState=Goi%C3%A1s'
                            . '&addressCountry=Brasil'
                            . '&categoryPage=RESULT'
                            . '&unitTypes=APARTMENT%2CAPARTMENT%2CRESIDENTIAL_BUILDING'
                            . '&size='.$size
                            . '&from='.$from
                            . '&usageTypes=RESIDENTIAL'
                            . '&addressNeighborhood='.$bairro_alias
//                            . '&businessType=SALE'
                            . '&sort=updatedAt%20DESC';
//                    echo $url;exit;
                    $json_vivareal = curl_init($url);
                    curl_setopt($json_vivareal, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($json_vivareal, CURLOPT_HTTPHEADER, array(
                    'x-domain: www.vivareal.com.br'
                    ));
                    $json_response = curl_exec($json_vivareal);
                } 
                catch (Exception $ex) 
                {
                    echo "ERROR NA API ZAP \n";
                    echo $ex->getMessage();
                    sleep(60*30);
                    continue;
                }
                $result = json_decode($json_response);
//                var_dump($result->search->result->listings);exit;
                if(!isset($result->search->result->listings))
                {
//                    return($result);
                    echo "%%%%%%%%%%%%%%%%%    ERRO   %%%%%%%%%%%%%%\n".$count;
                    // Registro no Log do Crawler
                    $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    $crawler_log->created_at = date('Y-m-d H:i:s');
                    $crawler_log->bairro = $bairro;
                    $crawler_log->from = $from;
                    $crawler_log->status = 'error';
                    $crawler_log->count_linstings = $count;
                    $crawler_log->return = $json_response;
                    $crawler_log->save();
                    
                    // TODO: verificar como não gerar Timeout na API do Viva Real
                    var_dump($json_response);
                    echo "\n########### URL DA PESQUISA: ".$url;
//                    exit;
                    
                    if(!empty($json_response))
                    {
                        $count_error++;
                        sleep(3600 * $count_error);
                    }
                    else
                    {
                        sleep(60);
                    }
                    
                }
                else
                {
                    // Pego os anunciantes SUPER PREMIUM
                    $listings_super_premium = isset($result->superPremium->search->result->listings)?$result->superPremium->search->result->listings:array();
                    $listings_standard = $result->search->result->listings;
                    $total_listings = array_merge($listings_standard, $listings_super_premium);
                    
                    // Verifico a quantidade de anúncios para encerrar a paginação
                    $count_listings = count($total_listings);
                    if($count_listings < $size)
                    {
                        $continue = false;
                        $from = 0;
                    }
                    else
                    {
                        $from = $from + $size;
                    }
                    
                    // Verifico a paginação da pesquisa
                    $count_page ++;
                    echo "\n\nBAIRRO: ".$bairro." *****  PAGINA: ".$count_page."  ***** TOTAL DE ANÚNCIOS: ".$count_listings."\n\n";
                    
                    // Faço o tratamento de cada anúncio
                    foreach($total_listings as $listings)
                    {
                        if(trim($listings->account->id) == "c8badc56-d46d-4abc-3682-c705662f1ec4"){
                            // Ignorar anúncios da Imobles
                            continue;
                        }
                        $success = false;
                        $insert_listing = $this->crawlerHelper->handleListing($listings, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, null, null, null, $crawlerType);
                        if(isset($insert_listing["update"])){
                            $insert_listing = $this->crawlerHelper->handleListing($listings, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, $insert_listing["listing_id"], null, null, $crawlerType);
                            if(isset($insert_listing["listing_id"]) && $insert_listing["listing_id"] > 0 ) {
                                $insert_listing = $insert_listing["listing_id"];
                                $success = true;
                            }
                        } else if($insert_listing) {
                            $success = true;
                        }
                        
                        if ($success === true) {
                            echo $listings->listing->id."\n\n";
                            $arr_listings_id[] = $insert_listing;
                            $count++;
                        } else {
                            echo "########## FIM ERRO ###########";
                            // Registro no Log do Crawler
                            $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                            $crawler_log->created_at = date('Y-m-d H:i:s');
                            $crawler_log->bairro = $bairro;
                            $crawler_log->from = $from;
                            $crawler_log->status = 'error';
                            $crawler_log->count_linstings = $count;
        //                    $crawler_log->return = $result;
                            $crawler_log->save();
                            exit;
                        }
                        
                    }
                    
                    // Registro no Log do Crawler
                    $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    $crawler_log->created_at = date('Y-m-d H:i:s');
                    $crawler_log->bairro = $bairro;
                    $crawler_log->from = $from;
                    $crawler_log->status = $continue?'continue':'finished';
                    $crawler_log->count_linstings = $count;
//                    $crawler_log->return = $result;
                    $crawler_log->save();
                }
            }
            sleep(20);
            echo "\n************************* FIM DO BAIRRO: ".$bairro."\n";
        }
        echo "\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |  ".$count." | FIM | $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n";     
        
        // Finalizo o Timer e printo o tempo de execução
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        $output = sprintf('%02d:%02d:%02d', ($execution_time/ 3600),($execution_time/ 60 % 60), $execution_time% 60);
        echo "\n".$output."\n\n";
        
        // Verifico os anúncios deletados
        $this->checkListingStatus(1, $arr_listings_id);
    }
    
    public function uol($bairro = null) {
        $crawlerType = ORM::for_table('module_imobles_crawler_types')
                    ->where('type', 'uol')
                    ->find_one();
        if (!$crawlerType){
            echo "\n!!!!!!!!!!!!!!!!! CRAWLER TYPE NÃO LOCALIZADO !!!!!!!!!!!!!!!!!";
            echo "\n!!!!!!!!!!!!!!!! crawler vivareal interrompido !!!!!!!!!!!!!!!!\n";
            die;
        }

        $time_start = microtime(true);
        $offset = isset($this->routes[3])?intval($this->routes[3]):0;
        $offset = 0;
        $continue = true;
        $size = 0;
        $from = 0 + $offset;
        $count = 0;
        $page = null;
        $count_bairros = 0;
        $count_error = 0;
        $arr_listings_id = array();
        if($bairro)
        {
            $bairros_goiania = trim($bairro);
            $check_log = false;
        }
        else
        {
            $check_log = true;
            $bairros_goiania = $this->crawlerHelper->bairrosGoiania();

        }
        $arr_bairros_goiania = array_unique(explode(';', $bairros_goiania));

        foreach ($arr_bairros_goiania as $bairro)
        {   
            // TODO: chumbado para GOIÂNIA
            // TODO: registrar no banco o bairro já mapeado pelo ARCGIS
            // Pego os dados de todos os IPTUs pela ArcGys de Goiânia

            // Verifico se já tem alguma CRONTAB rodando para o mesmo bairro
            $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')
                            ->select('status')
                            ->select('created_at')
                            ->where('bairro', $bairro)
                            ->order_by_desc('id')
                            ->find_one();

            if($crawler_log)
            {
                $diff_time = strtotime(date('Y-m-d H:i:s')) - strtotime($crawler_log->created_at);
            }

            if(isset($crawler_log->status) && $crawler_log->status == 'continue' && $check_log == true && $diff_time < 60*60*4)
            {
                continue;

            }
            elseif(isset($crawler_log->status) && $crawler_log->status == 'finished' && $check_log == true && $diff_time < 60*60*24)
            {
                continue;
            }
            else
            {
                // Registro no Log do Crawler
                //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                //$crawler_log->created_at = date('Y-m-d H:i:s');
                //$crawler_log->bairro = $bairro;
                //$crawler_log->from = $from;
                //$crawler_log->status = 'continue';
                //$crawler_log->save();
            }

            // Inicio as variáveis
            $current_page = 0;

            $bairro_alias = urlencode($bairro);
            $continue = true;
            $count_bairros++;
            while ($continue)
            {
                $current_page++;
                try
                {
                    // Faco a chamada para a API do 123i
                    $url = 'https://api.123i.com.br/v1/offer?'.
                    'json={"q":{"incorp":"","is_commercial":"","is_mcmv":"","hood":["'.
                    $bairro .
                    '"],"city":"goiania","uf":"go","status":"1","goal":"venda","shipping_status":"",'.
                    '"metropolitan_area":"","zone":"","secondary_nm_hood":"","unit_type":"apartamento",'.
                    '"sub_unit_type":"","slide":{"area_util":{"from":"","to":""},"dormitorios":{"from":""},'.
                    '"vagas":{"from":""},"sale_value":{"from":"","to":""},"rent_value":{"from":"","to":""},'.
                    '"temporary_renting_value":{"from":"","to":""}}},"order":{"default":"asc"},"page":'.
                    $current_page .
                    ',"fields":["offer"]}';
                    $apiRequest = curl_init($url);
                    curl_setopt($apiRequest, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($apiRequest, CURLOPT_HTTPHEADER, array(
                        'x-domain: www.123i.uol.com.br'
                    ));
                    $json_response = curl_exec($apiRequest);
                } 
                catch (Exception $ex) 
                {
                    echo "ERROR NA API 123i \n";
                    echo $ex->getMessage();
                    sleep(60*30);
                    continue;
                }
                $result = json_decode($json_response);
                $next = $result->records->nextPage;
                if(!isset($next)){
                    $continue = false;
                }
                if(!isset($result->records->data))
                {
                    //echo "%%%%%%%%%%%%%%%%%    ERRO   %%%%%%%%%%%%%%\n".$count;
                    //// Registro no Log do Crawler
                    //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    //$crawler_log->created_at = date('Y-m-d H:i:s');
                    //$crawler_log->bairro = $bairro;
                    //$crawler_log->from = $from;
                    //$crawler_log->status = 'error';
                    //$crawler_log->count_linstings = $count;
                    //$crawler_log->return = $json_response;
                    //$crawler_log->save();
                    // TODO: verificar como não gerar Timeout na API do 123i
                    //echo "\n########### URL DA PESQUISA: ".$url;

                    if(!empty($json_response))
                    {
                        $count_error++;
                        sleep(3600 * $count_error);
                    }
                    else
                    {
                        sleep(60);
                    }

                }
                else
                {
                    $total_listings = $result->records->data;

                    // Verifico a quantidade de anúncios para encerrar a paginação
                    $count_listings = count($total_listings);
                    if($count_listings < $size)
                    {
                        $continue = false;
                        $from = 0;
                    }
                    else
                    {
                        $from = $from + $size;
                    }

                    // Verifico a paginação da pesquisa
                    echo "\n\nBAIRRO: ".$bairro." *****  PAGINA: ".$current_page."  ***** ".($count_listings * $current_page)." ANÚNCIOS DE ". $result->records->totalRecords."\n\n";

                    // Faço o tratamento de cada anúncio
                    foreach($total_listings as $listings)
                    {
                        $listings = $this->jsonTranslator->from123i($listings);
                        $insert_listing = $this->crawlerHelper->handleListing($listings, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, null, null, null, $crawlerType);

                        if($insert_listing)
                        {
                            $arr_listings_id[] = $insert_listing;
                            $count++;
                        }
                        else
                        {
                            echo "########## ERRO API 123I ###########";
                            // Registro no Log do Crawler
                            //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                            //$crawler_log->created_at = date('Y-m-d H:i:s');
                            //$crawler_log->bairro = $bairro;
                            //$crawler_log->from = $from;
                            //$crawler_log->status = 'error';
                            //$crawler_log->count_linstings = $count;
                            //$crawler_log->save();
                            exit;
                        }

                    }

                    // Registro no Log do Crawler
                    //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    //$crawler_log->created_at = date('Y-m-d H:i:s');
                    //$crawler_log->bairro = $bairro;
                    //$crawler_log->from = $from;
                    //$crawler_log->status = $continue?'continue':'finished';
                    //$crawler_log->count_linstings = $count;
                    //$crawler_log->save();
                }
            }
            // sleep(20);
            echo "\n************************* FIM DO BAIRRO: ".$bairro."\n";
        }
        echo "\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |  ".$count." | FIM | $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n";     

        // Finalizo o Timer e printo o tempo de execução
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        $output = sprintf('%02d:%02d:%02d', ($execution_time/ 3600),($execution_time/ 60 % 60), $execution_time% 60);
        echo "\n".$output."\n\n";

        // Verifico os anúncios deletados
        $this->checkListingStatus(1, $arr_listings_id);
    }

    public function urbs($bairro = null) {
        $crawlerType = ORM::for_table('module_imobles_crawler_types')
                    ->where('type', 'urbs')
                    ->find_one();
        if (!$crawlerType){
            echo "\n!!!!!!!!!!!!!!!!! CRAWLER TYPE NÃO LOCALIZADO !!!!!!!!!!!!!!!!!";
            echo "\n!!!!!!!!!!!!!!!!! crawler inGaia interrompido !!!!!!!!!!!!!!!!!\n";
            die;
        }

        $time_start = microtime(true);
        $offset = isset($this->routes[3])?intval($this->routes[3]):0;
        $offset = 0;
        $continue = true;
        $size = 150;
        $from = 0 + $offset;
        $count = 0;
        $page = null;
        $count_bairros = 0;
        $count_error = 0;
        $arr_listings_id = array();
        if($bairro)
        {
            $bairros_goiania = trim($bairro);
            $check_log = false;
        }
        else
        {
            $check_log = false;
            $bairros_goiania = $this->crawlerHelper->bairrosGoiania();

        }
        $arr_bairros_goiania = array_unique(explode(';', $bairros_goiania));

        foreach ($arr_bairros_goiania as $bairro)
        {   
            // TODO: chumbado para GOIÂNIA
            // TODO: registrar no banco o bairro já mapeado pelo ARCGIS
            // Pego os dados de todos os IPTUs pela ArcGys de Goiânia

            // Verifico se já tem alguma CRONTAB rodando para o mesmo bairro
            $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')
                            ->select('status')
                            ->select('created_at')
                            ->where('bairro', $bairro)
                            ->order_by_desc('id')
                            ->find_one();

            if($crawler_log)
            {
                $diff_time = strtotime(date('Y-m-d H:i:s')) - strtotime($crawler_log->created_at);
            }

            if(isset($crawler_log->status) && $crawler_log->status == 'continue' && $check_log == true && $diff_time < 60*60*4)
            {
                continue;

            }
            elseif(isset($crawler_log->status) && $crawler_log->status == 'finished' && $check_log == true && $diff_time < 60*60*24)
            {
                continue;
            }
            else
            {
                // Registro no Log do Crawler
                //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                //$crawler_log->created_at = date('Y-m-d H:i:s');
                //$crawler_log->bairro = $bairro;
                //$crawler_log->from = $from;
                //$crawler_log->status = 'continue';
                //$crawler_log->save();
            }

            // Inicio as variáveis
            $current_page = 0;

            $bairro_alias = urlencode($bairro);

            $filters = '['
                        . '["disponivel_venda:Sim","disponivel_locacao:Sim"],'
                        . '["tipo_uso:Residencial"],'
                        . '["tipo_imovel:Apartamento"]'
                     . ']';
            $filters = urlencode($filters);

            $continue = true;
            $count_bairros++;
            while ($continue)
            {
                try
                {
                    // Faco a chamada para a API do Algolia / URBS
                    $url = 'https://yuz7fm1tsw-dsn.algolia.net/1/indexes/*/queries?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%203.24.3&x-algolia-application-id=YUZ7FM1TSW&x-algolia-api-key=220a3c3655e92ee6748946551381d4d2';
                    // $request_payload = '{"requests":[{"indexName":"URBS_producao","params":"query='
                    // .$bairro_alias
                    // . '&filters=&facetFilters=%5B%5B%22disponivel_locacao%3ASim%22%2C%22disponivel_venda%3ASim%22%2C%22tipo%3Aempreendimento%22%5D%2C%5B%22tipo_uso%3AResidencial%22%2C%22tipo_uso%3AComercial%22%5D%2C%5B%22tipo_imovel%3AApartamento%22%5D%5D&restrictSearchableAttributes=%5B%22condominio%22%2C%22logradouro%22%2C%22bairro%22%2C%22zona%22%2C%22cidade%22%2C%22codigo%22%5D&facets=%5B%22disponivel_locacao%22%2C%22disponivel_venda%22%2C%22tipo_uso%22%2C%22tipo_imovel%22%2C%22valor_locacao%22%2C%22valor_venda%22%2C%22preco%22%2C%22area_privativa%22%2C%22vagas%22%2C%22suites%22%2C%22dormitorios%22%2C%22area_maxima%22%2C%22area_minima%22%2C%22vagas_maximo%22%2C%22vagas_minimo%22%2C%22suites_maximo%22%2C%22suites_minimo%22%2C%22dormitorios_maximo%22%2C%22dormitorios_minimo%22%5D&hitsPerPage=15&page=0"},{"indexName":"URBS_producao","params":"query=setor%20bueno%20goiania&filters=&facetFilters=%5B%5B%22disponivel_locacao%3ASim%22%2C%22disponivel_venda%3ASim%22%2C%22tipo%3Aempreendimento%22%5D%2C%5B%22tipo_uso%3AResidencial%22%2C%22tipo_uso%3AComercial%22%5D%2C%5B%22tipo_imovel%3AApartamento%22%5D%5D&restrictSearchableAttributes=%5B%22condominio%22%2C%22logradouro%22%2C%22bairro%22%2C%22zona%22%2C%22cidade%22%2C%22codigo%22%5D&facets=%5B%22disponivel_locacao%22%2C%22disponivel_venda%22%2C%22tipo_uso%22%2C%22tipo_imovel%22%2C%22valor_locacao%22%2C%22valor_venda%22%2C%22preco%22%2C%22area_privativa%22%2C%22vagas%22%2C%22suites%22%2C%22dormitorios%22%2C%22area_maxima%22%2C%22area_minima%22%2C%22vagas_maximo%22%2C%22vagas_minimo%22%2C%22suites_maximo%22%2C%22suites_minimo%22%2C%22dormitorios_maximo%22%2C%22dormitorios_minimo%22%5D&hitsPerPage=250&page='
                    // .$current_page
                    // .'"}]}';

                    $request_payload = '{"requests":[{'
                         . '"indexName":"URBS_producao",'
                         . '"params":"query=' . $bairro_alias
                         . '&facetFilters=' . $filters
                         . '&hitsPerPage='.$size
                         . '&page=' . $current_page . '"'
                         . '}]}';


                    $apiRequest = curl_init($url);
                    curl_setopt($apiRequest, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($apiRequest, CURLOPT_POST, 1);
                    curl_setopt($apiRequest, CURLOPT_POSTFIELDS, $request_payload);
                    $json_response = curl_exec($apiRequest);
                } 
                catch (Exception $ex) 
                {
                    echo "ERROR NA API URBS \n";
                    echo $ex->getMessage();
                    sleep(60*30);
                    continue;
                }
                $current_page++;
                $result = json_decode($json_response);
                if(!isset($result->results[0]->hits))
                {
                    //echo "%%%%%%%%%%%%%%%%%    ERRO   %%%%%%%%%%%%%%\n".$count;
                    //// Registro no Log do Crawler
                    //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    //$crawler_log->created_at = date('Y-m-d H:i:s');
                    //$crawler_log->bairro = $bairro;
                    //$crawler_log->from = $from;
                    //$crawler_log->status = 'error';
                    //$crawler_log->count_linstings = $count;
                    //$crawler_log->return = $json_response;
                    //$crawler_log->save();
                    // TODO: verificar como não gerar Timeout na API do 123i
                    //echo "\n########### URL DA PESQUISA: ".$url;

                    if(!empty($json_response))
                    {
                        $count_error++;
                        sleep(3600 * $count_error);
                    }
                    else
                    {
                        sleep(60);
                    }

                }
                else
                {
                    $total_listings = $result->results[0]->hits;

                    // Verifico a quantidade de anúncios para encerrar a paginação
                    $count_listings = count($total_listings);
                    if($count_listings < $size)
                    {
                        $continue = false;
                        $from = 0;
                    }
                    else
                    {
                        $from = $from + $size;
                    }

                    // Verifico a paginação da pesquisa
                    echo "\n\nBAIRRO: ".$bairro." *****  PAGINA: ".$current_page."  ***** ".($count_listings * $current_page)." ANÚNCIOS";

                    // Faço o tratamento de cada anúncio
                    foreach($total_listings as $listings)
                    {
                        // JSON URBS retorna VENDA e LOCAÇÃO no mesmo anúncio.
                        if($listings->disponivel_venda == "Sim"){
                            $businessType = "SALE";
                            echo "\n-------------------SALE-----------------------\n";
                            $listing = $this->jsonTranslator->fromUrbs($listings, $businessType);
                            $insert_listing = $this->crawlerHelper->handleListing($listing, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, null, null, null, $crawlerType);

                            if($insert_listing)
                            {
                                $arr_listings_id[] = $insert_listing;
                                $count++;
                            }
                            else
                            {
                                echo "########## ERRO API URBS ###########";
                                exit;
                            }
                        } elseif($listings->disponivel_locacao == "Sim") {
                            echo "\n------------------RENTAL----------------------\n";
                            $businessType = "RENTAL";
                            $listing = $this->jsonTranslator->fromUrbs($listings, $businessType);
                            $insert_listing = $this->crawlerHelper->handleListing($listing, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, null, null, null, $crawlerType);

                            if($insert_listing)
                            {
                                $arr_listings_id[] = $insert_listing;
                                $count++;
                            }
                            else
                            {
                                echo "########## ERRO API URBS ###########";
                                exit;
                            }
                        }

                    }

                }
            }
            sleep(20);
            echo "\n************************* FIM DO BAIRRO: ".$bairro."\n";
        }
        echo "\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |  ".$count." | FIM | $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n";     

        // Finalizo o Timer e printo o tempo de execução
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        $output = sprintf('%02d:%02d:%02d', ($execution_time/ 3600),($execution_time/ 60 % 60), $execution_time% 60);
        echo "\n".$output."\n\n";

        // Verifico os anúncios deletados
//        $this->checkListingStatus(1, $arr_listings_id);
    }

    public function inGaia() {
        $crawlerType = ORM::for_table('module_imobles_crawler_types')
                    ->where('type', 'ingaia')
                    ->find_one();
        if (!$crawlerType){
            echo "\n!!!!!!!!!!!!!!!!! CRAWLER TYPE NÃO LOCALIZADO !!!!!!!!!!!!!!!!!";
            echo "\n!!!!!!!!!!!!!!!!! crawler inGaia interrompido !!!!!!!!!!!!!!!!!\n";
            die;
        }

        $time_start = microtime(true);
        $offset = isset($this->routes[3])?intval($this->routes[3]):0;
        $offset = 0;
        $continue = true;
        $size = 0;
        $count = 0;
        $page = null;
        $count_error = 0;
        $arr_listings_id = array();
        $errosURLs = "";

        //ingaia urls array
        foreach ($this->crawlerHelper->inGaiaUrls() as $url => $phone) {   
            // Inicio as variáveis
            $current_page = 0;
            $continue = true;
            $countListingsSite = 0;
            $count_error = 0;
            while ($continue)
            {
                $current_page++;

                // // PARA TESTE - vai carregar no máximo 1 páginas (12 anúncios) por URL
                // if ($current_page > 1 && $count_error == 0){
                //     break;
                // }

                // // PARA TESTE - Limito a no máximo 100 anúncios cadastrados
                // if ($count > 100){
                //     echo "-------------- LIMITE PARA TESTE ATINGIDO --------------";
                //     exit;
                // }

                try
                {
                    $urlPag = $url . $current_page;
                    $apiRequest = curl_init($urlPag);
                    curl_setopt($apiRequest, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($apiRequest, CURLOPT_ENCODING, '');
                    curl_setopt($apiRequest, CURLOPT_MAXREDIRS, 10);
                    curl_setopt($apiRequest, CURLOPT_TIMEOUT, 0);
                    curl_setopt($apiRequest, CURLOPT_FOLLOWLOCATION, true);
                    curl_setopt($apiRequest, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
                    curl_setopt($apiRequest, CURLOPT_CUSTOMREQUEST, 'GET');
                    $json_response = curl_exec($apiRequest);
                } 
                catch (Exception $ex) 
                {
                    $count_error++;
                    $current_page--;
                    echo "\n\n!!!!!!!!!!!!!! ERRO - URL " . $urlPag ." - TENTATIVA: " . $count_error . "!!!!!!!!!!!!!!\n";
                    echo "ERROR NA API INGAIA: \n";
                    echo $ex->getMessage();
                    sleep(60*30);
                    if ($count_error > 5){
                        $errosURLs .= $url . "\n";
                        break;
                    }
                    continue;
                }
                
                $result = json_decode($json_response);
                if(!isset($result->data))
                {
                    $count_error++;
                    $current_page--;
                    echo "\n\n!!!!!!!!!!!!!! ERRO - URL " . $urlPag ." - TENTATIVA: " . $count_error . "!!!!!!!!!!!!!!\n";
                    echo "\n Erro Retornado: \n";
                    var_dump($json_response);
                    echo "\n-------------------------------------------------\n";
                    if ($count_error > 5){
                        $errosURLs .= $url . "\n";
                        break;
                    }
                    sleep(1 * $count_error);
                    // sleep(10 * $count_error);
                }
                else
                {
                    $total_listings = $result->data;

                    // Verifico a quantidade de anúncios para encerrar a paginação
                    $count_listings = count($total_listings);
                    if($count_listings <= 0) {
                        $continue = false;
                    }

                    $countListingsSite = $countListingsSite + $count_listings;
                    // Verifico a paginação da pesquisa
                    echo "\n\nSITE: ". $urlPag . " *****  PAGINA: " . $current_page . "  ***** " . ($countListingsSite) . " ANÚNCIOS";

                    // Faço o tratamento de cada anúncio
                    $idsListings = "";
                    foreach($total_listings as $listings)
                    {
                        if(!$listings->sale_price[0]){ //if listing doesn't even have a price tag
                            continue; // don't bother handling it
                        }
                        $listings = $this->jsonTranslator->fromInGaia($listings, $phone, $url);
                        $insert_listing = $this->crawlerHelper->handleListing($listings, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, null, null, null, $crawlerType);

                        if($insert_listing)
                        {
                            $arr_listings_id[] = $insert_listing;
                            $count++;
                        }
                        else
                        {
                            echo "\n########## ERRO API INGAIA ###########";
                            exit;
                        }
                    }
                }
            }
            echo "\n************************* FIM DO SITE: ". $urlPag ."\n";
            sleep(20);
        }
        echo "\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |  ".$count." | FIM | $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n";     
        if ($errosURLs <> ""){
            echo "\n\n !!!!!!!!!! AS URLs A SEGUIR APRESENTARAM ERROS: \n" . $errosURLs;
        }

        // Finalizo o Timer e printo o tempo de execução
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        $output = sprintf('%02d:%02d:%02d', ($execution_time/ 3600),($execution_time/ 60 % 60), $execution_time% 60);
        echo "\n".$output."\n\n";

        // Verifico os anúncios deletados
        $this->checkListingStatus(1, $arr_listings_id);
    }

    public function proprietarioDireto($bairro = null){
        $crawlerType = ORM::for_table('module_imobles_crawler_types')
                    ->where('type', 'proprietariodireto')
                    ->find_one();
        if (!$crawlerType){
            echo "\n!!!!!!!!!!!!!!!!! CRAWLER TYPE NÃO LOCALIZADO !!!!!!!!!!!!!!!!!";
            echo "\n!!!!!!!!!!! crawler proprietarioDireto interrompido !!!!!!!!!!!\n";
            die;
        }

        $time_start = microtime(true);
        $offset = isset($this->routes[3])?intval($this->routes[3]):0;
        $offset = 0;
        $continue = true;
        $size = 0;
        $from = 0 + $offset;
        $count = 0;
        $page = null;
        $count_bairros = 0;
        $count_error = 0;
        $arr_listings_id = array();
        if($bairro)
        {
            $bairros_goiania = trim($bairro);
            $check_log = false;
        }
        else
        {
            $check_log = true;
            $bairros_goiania = $this->crawlerHelper->bairrosGoiania();

        }
        $arr_bairros_goiania = array_unique(explode(';', $bairros_goiania));

        foreach ($arr_bairros_goiania as $bairro)
        {
            // TODO: chumbado para GOIÂNIA
            // TODO: registrar no banco o bairro já mapeado pelo ARCGIS
            // Pego os dados de todos os IPTUs pela ArcGys de Goiânia

            // Verifico se já tem alguma CRONTAB rodando para o mesmo bairro
            $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')
                            ->select('status')
                            ->select('created_at')
                            ->where('bairro', $bairro)
                            ->order_by_desc('id')
                            ->find_one();

            if($crawler_log)
            {
                $diff_time = strtotime(date('Y-m-d H:i:s')) - strtotime($crawler_log->created_at);
            }

            if(isset($crawler_log->status) && $crawler_log->status == 'continue' && $check_log == true && $diff_time < 60*60*4)
            {
                continue;

            }
            elseif(isset($crawler_log->status) && $crawler_log->status == 'finished' && $check_log == true && $diff_time < 60*60*24)
            {
                continue;
            }
            else
            {
                // Registro no Log do Crawler
                //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                //$crawler_log->created_at = date('Y-m-d H:i:s');
                //$crawler_log->bairro = $bairro;
                //$crawler_log->from = $from;
                //$crawler_log->status = 'continue';
                //$crawler_log->save();
            }

            // Inicio as variáveis
            $current_page = 0;

            $bairro_alias = urlencode($bairro);
            $bairro_alias = strtolower($bairro_alias);
            $bairro_alias = str_replace("+","-", $bairro_alias);
            $continue = true;
            $count_bairros++;
            while ($continue)
            {
                $current_page++;
                try
                {
                    // Faco a chamada para a API do proprietario direto
                    $url = 'https://api.proprietariodireto.com.br/properties?wish=venda&slug[]=apartamento,go,goiania,'
                    .$bairro_alias
                    .',direto-com-proprietario&url=/venda/apartamento/go/goiania/'
                    .$bairro_alias
                    .'/direto-com-proprietario/&types[]=Apartamento&neighborhood='
                    .$bairro_alias
                    .'&city=Goiânia&state=GO&sort=newer&zoom=15&page='
                    .$current_page;
                    $apiRequest = curl_init($url);
                    curl_setopt($apiRequest, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($apiRequest, CURLOPT_HTTPHEADER, array(
                        'x-domain: www.proprietariodireto.com.br'
                    ));
                    $json_response = curl_exec($apiRequest);
                }
                catch (Exception $ex)
                {
                    echo "ERRO NA API PROPRIETARIO DIRETO \n";
                    echo $ex->getMessage();
                    sleep(60*30);
                    continue;
                }
                $result = json_decode($json_response);

                if($result->success == false){
                    echo "\nERRO buscando bairro: " . $bairro;
                    $continue = false;
                    continue;
                }

                if(count($result->data->data) === 0){
                    $continue = false;
                    continue; //skip nbhd if response is empty
                }
                $last_page = $result->data->last_page;
                if($last_page == $current_page){
                    $continue = false;
                }
                if(!isset($result->data->data))
                {
                    //echo "%%%%%%%%%%%%%%%%%    ERRO   %%%%%%%%%%%%%%\n".$count;
                    //// Registro no Log do Crawler
                    //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    //$crawler_log->created_at = date('Y-m-d H:i:s');
                    //$crawler_log->bairro = $bairro;
                    //$crawler_log->from = $from;
                    //$crawler_log->status = 'error';
                    //$crawler_log->count_linstings = $count;
                    //$crawler_log->return = $json_response;
                    //$crawler_log->save();
                    //echo "\n########### URL DA PESQUISA: ".$url;

                    if(!empty($json_response))
                    {
                        $count_error++;
                        sleep(3600 * $count_error);
                    }
                    else
                    {
                        sleep(60);
                    }

                }
                else
                {
                    $total_listings = $result->data->data;

                    // Verifico a quantidade de anúncios para encerrar a paginação
                    $count_listings = count($total_listings);
                    if($count_listings < $size)
                    {
                        $continue = false;
                        $from = 0;
                    }
                    else
                    {
                        $from = $from + $size;
                    }

                    // Verifico a paginação da pesquisa
                    echo "\n\nBAIRRO: ".$bairro." *****  PAGINA: ".$current_page."  ***** ".($count_listings * $current_page)." ANÚNCIOS";

                    // Faço o tratamento de cada anúncio
                    foreach($total_listings as $listings)
                    {
                        $listings = $this->jsonTranslator->fromProprietarioDireto($listings);
                        $insert_listing = $this->crawlerHelper->handleListing($listings, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, null, null, null, $crawlerType);

                        if($insert_listing)
                        {
                            $arr_listings_id[] = $insert_listing;
                            $count++;
                        }
                        else
                        {
                            echo "########## ERRO API 123I ###########";
                            // Registro no Log do Crawler
                            //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                            //$crawler_log->created_at = date('Y-m-d H:i:s');
                            //$crawler_log->bairro = $bairro;
                            //$crawler_log->from = $from;
                            //$crawler_log->status = 'error';
                            //$crawler_log->count_linstings = $count;
                            //$crawler_log->save();
                            exit;
                        }

                    }

                    // Registro no Log do Crawler
                    //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    //$crawler_log->created_at = date('Y-m-d H:i:s');
                    //$crawler_log->bairro = $bairro;
                    //$crawler_log->from = $from;
                    //$crawler_log->status = $continue?'continue':'finished';
                    //$crawler_log->count_linstings = $count;
                    //$crawler_log->save();
                }
            }
            sleep(20);
            echo "\n************************* FIM DO BAIRRO: ".$bairro."\n";
        }
        echo "\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |  ".$count." | FIM | $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n";

        // Finalizo o Timer e printo o tempo de execução
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        $output = sprintf('%02d:%02d:%02d', ($execution_time/ 3600),($execution_time/ 60 % 60), $execution_time% 60);
        echo "\n".$output."\n\n";

        // Verifico os anúncios deletados
        $this->checkListingStatus(1, $arr_listings_id);
    }

    public function quintoAndar(){

        $time_start = microtime(true);
        $offset = isset($this->routes[3])?intval($this->routes[3]):0;
        $continue = true;
        $count_error = 0;
        $arr_listings_id = array();

        $arr_bairros_goiania = ['placeholder'];
        foreach ($arr_bairros_goiania as $bairro)
        {
            // TODO: chumbado para GOIÂNIA
            // TODO: registrar no banco o bairro já mapeado pelo ARCGIS
            // Pego os dados de todos os IPTUs pela ArcGys de Goiânia

            // Verifico se já tem alguma CRONTAB rodando para o mesmo bairro
            $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')
                            ->select('status')
                            ->select('created_at')
                            ->where('bairro', $bairro)
                            ->order_by_desc('id')
                            ->find_one();

            if($crawler_log)
            {
                $diff_time = strtotime(date('Y-m-d H:i:s')) - strtotime($crawler_log->created_at);
            }

            if(isset($crawler_log->status) && $crawler_log->status == 'continue' && $check_log == true && $diff_time < 60*60*4)
            {
                continue;

            }
            elseif(isset($crawler_log->status) && $crawler_log->status == 'finished' && $check_log == true && $diff_time < 60*60*24)
            {
                continue;
            }
            else
            {
                // Registro no Log do Crawler
                //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                //$crawler_log->created_at = date('Y-m-d H:i:s');
                //$crawler_log->bairro = $bairro;
                //$crawler_log->from = $from;
                //$crawler_log->status = 'continue';
                //$crawler_log->save();
            }

            // Inicio as variáveis
            $from = 0;
            $offset = 150;

            $continue = true;
            while ($continue)
            {
                try
                {
                    // Faco a chamada para a API do proprietario direto
                    $url = 'https://www.quintoandar.com.br/api/yellow-pages/v2/search';

                    $request_payload = '{ "filters": { "availability": "any", "map": { "bounds_east": -49.217903598170096, "bounds_north": -16.641975235794025, "bounds_south": -16.731806764205977, "bounds_west": -49.311684401829936, "center_lat": -16.686891, "center_lng": -49.264794 }, "occupancy": "any", "offset": '
                    .$from
                    .', "page_size": '
                    .$offset
                    .', "search_dropdown_value": "Goiânia, GO, Brasil", "sorting": { "criteria": "relevance_rent", "order": "desc" } }, "return": [ ]}';
                    $apiRequest = curl_init($url);
                    curl_setopt($apiRequest, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($apiRequest, CURLOPT_POST, 1);
                    curl_setopt($apiRequest, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($apiRequest, CURLOPT_POSTFIELDS, $request_payload);
                    curl_setopt($apiRequest, CURLOPT_HTTPHEADER, array(
                        'x-domain: www.quintoandar.com.br'
                    ));
                    $json_response = curl_exec($apiRequest);
                }
                catch (Exception $ex)
                {
                    echo "ERRO NA API QUINTO ANDAR \n";
                    echo $ex->getMessage();
                    sleep(60*30);
                    continue;
                }
                $result = json_decode($json_response);
                $hits = $result->hits->hits;

                if(count($hits) === 0){
                    $continue = false;
                    continue; //skip nbhd if response is empty
                }
                if(!isset($hits))
                {
                    //echo "%%%%%%%%%%%%%%%%%    ERRO   %%%%%%%%%%%%%%\n".$count;
                    //// Registro no Log do Crawler
                    //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    //$crawler_log->created_at = date('Y-m-d H:i:s');
                    //$crawler_log->bairro = $bairro;
                    //$crawler_log->from = $from;
                    //$crawler_log->status = 'error';
                    //$crawler_log->count_linstings = $count;
                    //$crawler_log->return = $json_response;
                    //$crawler_log->save();
                    //echo "\n########### URL DA PESQUISA: ".$url;

                    if(!empty($json_response))
                    {
                        $count_error++;
                        sleep(3600 * $count_error);
                    }
                    else
                    {
                        sleep(60);
                    }

                }
                else
                {
                    $total_listings = $hits;

                    // Verifico a paginação da pesquisa
                    echo "\n\n DE ".$from ." ATÉ ".$offset." ANÚNCIOS";

                    $from += 150;
                    $offset += 150;
                    // Faço o tratamento de cada anúncio
                    foreach($total_listings as $listings)
                    {
                        $listings = $this->jsonTranslator->fromQuintoAndar($listings);
                        $insert_listing = $this->crawlerHelper->handleListing($listings, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit);

                        if($insert_listing)
                        {
                            $arr_listings_id[] = $insert_listing;
                            $count++;
                        }
                        else
                        {
                            echo "########## ERRO API QUINTO ANDAR ###########";
                            // Registro no Log do Crawler
                            //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                            //$crawler_log->created_at = date('Y-m-d H:i:s');
                            //$crawler_log->bairro = $bairro;
                            //$crawler_log->from = $from;
                            //$crawler_log->status = 'error';
                            //$crawler_log->count_linstings = $count;
                            //$crawler_log->save();
                            exit;
                        }

                    }

                    // Registro no Log do Crawler
                    //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    //$crawler_log->created_at = date('Y-m-d H:i:s');
                    //$crawler_log->bairro = $bairro;
                    //$crawler_log->from = $from;
                    //$crawler_log->status = $continue?'continue':'finished';
                    //$crawler_log->count_linstings = $count;
                    //$crawler_log->save();
                }
            }
            sleep(20);
            echo "\n************************* FIM DO BAIRRO: ".$bairro."\n";
        }
        echo "\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |  ".$count." | FIM | $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n";

        // Finalizo o Timer e printo o tempo de execução
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        $output = sprintf('%02d:%02d:%02d', ($execution_time/ 3600),($execution_time/ 60 % 60), $execution_time% 60);
        echo "\n".$output."\n\n";

        // Verifico os anúncios deletados
        $this->checkListingStatus(1, $arr_listings_id);
    }

    private function loopimLogin(){
        $email = 'mateus.mota@imobles.com';
        $password = 'hu2lPCaRiy';
        $postFields = 'email=' . urlencode($email) . '&password=' . urlencode($password);
        $curl = curl_init();
        curl_setopt_array($curl, array(
          CURLOPT_URL => 'https://api.isket.com.br/login',
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_HEADER => true,
          CURLOPT_ENCODING => '',
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 0,
          CURLOPT_FOLLOWLOCATION => true,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => 'POST',
          CURLOPT_POSTFIELDS => $postFields,
          CURLOPT_HTTPHEADER => array(
            'origin: https://app.isket.com.br',
            'sec-ch-ua: "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"',
            'Accept: */*',
            'Content-Type: application/x-www-form-urlencoded',
            'sec-ch-ua-mobile: ?0',
            'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
            'sec-ch-ua-platform: "Linux"',
          ),
          CURLOPT_FOLLOWLOCATION => true,
        ));
        $response = curl_exec($curl);
        curl_close($curl);
        if (strpos($response, 'Você está logado') > 0 ) {
            $sid = substr($response, strpos($response, "connect.sid=") + 12);
            $sid = substr($sid, 0, strpos($sid, ';'));
        } else {
            $sid = '';
        }
        return $sid;
    }

    public function loopim() {
        $crawlerType = ORM::for_table('module_imobles_crawler_types')
            ->where('type', 'loopim')
            ->find_one();
        if (!$crawlerType){
            echo "\n!!!!!!!!!!!!!!!!! CRAWLER TYPE NÃO LOCALIZADO !!!!!!!!!!!!!!!!!";
            echo "\n!!!!!!!!!!!!!!!!! crawler loopim interrompido !!!!!!!!!!!!!!!!!\n";
            die;
        }

        $time_start = microtime(true);
        $continue = true;
        $count = 0;
        $count_error = 0;
        $arr_listings_id = array();
        $errosURLs = "";

        // Inicio as variáveis
        $current_page = 0;
        $continue = true;
        $count_error = 0;
        $page_size = 10000;

        $sessionID = $this->loopimLogin();
        if ($sessionID == '') {
            echo "\n!!!!!!!!!!!!!!!!! ERRO AO LOGAR NO LOOPIM !!!!!!!!!!!!!!!!!\n";
            exit;
        }
        $order = '';
        while ($continue)
        {
            if ($order == ''){
                $order = 'asc';
            } else if ($order == 'asc'){
                $order = 'desc';
                $continue = false;
            }

            try
            {
                $from = 0;
                $request_payload = '{"size":' . $page_size . ',"from":' . $from 
                    . ',"sort":[{"scraping.padrao.raw":{"order":"' . $order . '"}},{"anunciante.nome.raw":{"order":"asc"}},'
                    . '{"lista_fotos":{"order":"desc"}}],"aggs":{"valor_medio":{"percentiles":{"field":"valor","percents":[50],'
                    . '"tdigest":{"compression":2000}}},"apolar":{"filter":{"term":{"scraping.spider_name.raw":"apolar"}}},'
                    . '"area_util_media":{"percentiles":{"field":"area_util","percents":[50],"tdigest":{"compression":2000}}},'
                    . '"area_total_media":{"percentiles":{"field":"area_total","percents":[50],"tdigest":{"compression":2000}}},'
                    . '"imoveis_count":{"value_count":{"field":"_id"}},"sum_valor":{"sum":{"field":"valor"}},'
                    . '"ids":{"terms":{"field":"bairro.id","size":1000,"order":{"_key":"asc"}},'
                    . '"aggs":{"valor_medio":{"percentiles":{"field":"valor","percents":[50],"tdigest":{"compression":2000}}},'
                    . '"area_util_media":{"percentiles":{"field":"area_util","percents":[50],"tdigest":{"compression":2000}}},'
                    . '"area_total_media":{"percentiles":{"field":"area_total","percents":[50],"tdigest":{"compression":2000}}},'
                    . '"imoveis_count":{"value_count":{"field":"_id"}}}},"coordinates":{"geohash_grid":{"field":"geohash","precision":4},'
                    . '"aggs":{"sales_bucket_filter":{"bucket_selector":{"buckets_path":{"bucketCount":"bbox._count"},'
                    . '"script":"params.bucketCount > 0"}},"centroid":{"geo_centroid":{"field":"geohash"}},'
                    . '"top_hit":{"top_hits":{"sort":[],"_source":{"includes":["tipo_imovel","geometry","id","area_construida",'
                    . '"area_terreno","area_total","area_util","bairro","banheiro","cidade","cidade_uf","codigo","condominio",'
                    . '"descricao","endereco","garagem","geohash","anunciante","isparticular","lista_fotos","nome_corretor",'
                    . '"numero_corretor","opcionais","zoneamento","quarto","tipo_negocio","uf","url","valor"]},"size":1}},'
                    . '"bbox":{"filter":{"geo_shape":{"geometry":{"shape":{"type":"envelope","coordinates":'
                    . '[[-49.33684712276379,-16.3675801272158],[-49.05944233760754,-16.875518705107428]]},"relation":"within"}}}}}}},'
                    . '"post_filter":{"geo_shape":{"geometry":{"shape":{"type":"envelope","coordinates":'
                    . '[[-49.33684712276379,-16.3675801272158],[-49.05944233760754,-16.875518705107428]]},"relation":"within"}}},'
                    . '"query":{"bool":{"must":[{"bool":{"should":[]}},{"match":{"tipo_negocio":"Venda"}},'
                    . '{"match":{"cidade_uf":"goiania_go"}},{"match":{"status":1}},{"exists":{"field":"valor"}},'
                    . '{"match":{"isBlocked":false}},{"bool":{"must_not":[{"exists":{"field":"fingerprint.duplicated"}}]}},'
                    . '{"bool":{"should":[{"bool":{"must_not":[{"exists":{"field":"fingerprint.duplicated"}}],'
                    . '"must":[{"match":{"isBlocked":false}}]}},{"match":{"scraping.spider_name":"apolar"}}]}},'
                    . '{"match":{"tipo_negocio":"Venda"}},{"bool":{"minimum_should_match":1,"should":[{"match":{"tipo_imovel":"Garden"}},'
                    . '{"match":{"tipo_imovel":"Apartamento"}},{"match":{"tipo_imovel":"Loft"}},{"match":{"tipo_imovel":"Kitnet"}},'
                    . '{"match":{"tipo_imovel":"Flat"}},{"match":{"tipo_imovel":"Cobertura"}},{"match":{"tipo_imovel":"Studio"}},'
                    . '{"match":{"tipo_imovel":"Duplex"}},{"match":{"tipo_imovel":"Triplex"}}]}}]}}}';
                
                
                $header = array(
                    'origin: https://app.isket.com.br',
                    'sec-ch-ua: "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"',
                    'Accept: */*',
                    'Content-Type: application/json',
                    'sec-ch-ua-mobile: ?0',
                    'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
                    'sec-ch-ua-platform: "Linux"',
                    'Cookie: connect.sid=' . $sessionID
                );

                $curl = curl_init();

                curl_setopt_array($curl, array(
                    CURLOPT_URL => 'https://api.isket.com.br/find/realties/_search',
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_HEADER => false,
                    CURLOPT_ENCODING => '',
                    CURLOPT_MAXREDIRS => 10,
                    CURLOPT_TIMEOUT => 0,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                    CURLOPT_HTTPHEADER => $header,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_CUSTOMREQUEST => 'POST',
                    CURLOPT_POST => 1,
                    CURLOPT_POSTFIELDS => $request_payload,
                ));
                
                $response = curl_exec($curl);
                curl_close($curl);
            } 
            catch (Exception $ex) 
            {
                $count_error++;
                $current_page--;
                echo "\n\n!!!!!!!!!!!!!! ERRO LOOPIM - TENTATIVA: " . $count_error . "!!!!!!!!!!!!!!\n";
                echo "ERROR NA API LOOPIM: \n";
                echo $ex->getMessage();
                sleep(60*30);
                if ($count_error > 5){
                    echo "ERRO API LOOPIM\n";
                    break;
                }
                continue;
            }
            
            $result = json_decode($response);
            
            if(!isset($result->hits))
            {
                $count_error++;
                $current_page--;
                echo "\n Erro Retornado: \n";
                var_dump($result);
                echo "\n-------------------------------------------------\n";
                if ($count_error > 5){
                    echo "ERRO API LOOPIM\n";
                    break;
                }
                sleep(10 * $count_error);
                // sleep(10 * $count_error);
            }
            else
            {
                $total_listings = $result->hits->hits;
                $idsListings = "";
                echo "\n\nPágina: " . $current_page . " - Total: " . count($total_listings);
                foreach($total_listings as $listings)
                {
//                     var_dump($listings);
//                     die;
                    if(!$listings->_source->valor){ //if listing doesn't even have a price tag
                        echo "\nSemValor";
                        continue; // don't bother handling it
                    }

                    $listings = $this->jsonTranslator->fromLoopim($listings);
                    var_dump($listings);
                     die;
                    $insert_listing = $this->crawlerHelper->handleListing($listings, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, null, null, null, $crawlerType);

                    if($insert_listing)
                    {
                        $arr_listings_id[] = $insert_listing;
                        $count++;
                    }
                    else
                    {
                        echo "\n########## ERRO API LOOPIN ###########";
                        exit;
                    }
                }
            }
        }
        echo "\n************************* FIM LOOPIM *************************\n";
        sleep(20);
        
        if ($errosURLs <> ""){
            echo "\n\n !!!!!!!!!! AS URLs A SEGUIR APRESENTARAM ERROS: \n" . $errosURLs;
        }

        // Finalizo o Timer e printo o tempo de execução
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        $output = sprintf('%02d:%02d:%02d', ($execution_time/ 3600),($execution_time/ 60 % 60), $execution_time% 60);
        echo "\n".$output."\n\n";

        // Verifico os anúncios deletados
        $this->checkListingStatus(1, $arr_listings_id);
    }

    private function mercadoLivreGetImages($idAnuncio){
        try{            
            $url = 'https://api.mercadolibre.com/items?ids='.$idAnuncio;        
            $apiRequest = curl_init($url);
            curl_setopt($apiRequest, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($apiRequest, CURLOPT_HTTPHEADER, array(
                'Authorization: Bearer rOTAGovjFS4tR9ydEWfiORytOjFJcXnJ'
            ));
            $json_response = curl_exec($apiRequest);
            $result = json_decode($json_response);
            $images = $result[0]->body->pictures;

        } catch (Exception $e){
            $images = '';
            var_dump($e);
        }        
        return $images;
    }

    public function mercadoLivre(){
        $crawlerType = ORM::for_table('module_imobles_crawler_types')
                    ->where('type', 'mercadolivre')
                    ->find_one();
        if (!$crawlerType){
            echo "\n!!!!!!!!!!!!!!!!! CRAWLER TYPE NÃO LOCALIZADO !!!!!!!!!!!!!!!!!";
            echo "\n!!!!!!!!!!!!!! crawler mercadoLivre interrompido !!!!!!!!!!!!!!\n";
            die;
        }
        $time_start = microtime(true);
        $offset = isset($this->routes[3])?intval($this->routes[3]):0;
        $continue = true;
        $count_error = 0;
        $arr_listings_id = array();

        $arr_bairros_goiania = ['placeholder'];
        foreach ($arr_bairros_goiania as $bairro)
        {
            // TODO: chumbado para GOIÂNIA
            // TODO: registrar no banco o bairro já mapeado pelo ARCGIS
            // Pego os dados de todos os IPTUs pela ArcGys de Goiânia

            // Verifico se já tem alguma CRONTAB rodando para o mesmo bairro
            $crawler_log = ORM::for_table('module_imobles_crawler_vivareal')
                            ->select('status')
                            ->select('created_at')
                            ->where('bairro', $bairro)
                            ->order_by_desc('id')
                            ->find_one();

            if($crawler_log)
            {
                $diff_time = strtotime(date('Y-m-d H:i:s')) - strtotime($crawler_log->created_at);
            }

            if(isset($crawler_log->status) && $crawler_log->status == 'continue' && $check_log == true && $diff_time < 60*60*4)
            {
                continue;

            }
            elseif(isset($crawler_log->status) && $crawler_log->status == 'finished' && $check_log == true && $diff_time < 60*60*24)
            {
                continue;
            }
            else
            {
                // Registro no Log do Crawler
                //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                //$crawler_log->created_at = date('Y-m-d H:i:s');
                //$crawler_log->bairro = $bairro;
                //$crawler_log->from = $from;
                //$crawler_log->status = 'continue';
                //$crawler_log->save();
            }

            // Inicio as variáveis
            $from = 0;

            $continue = true;
            while ($continue)
            {
                try
                {
                    // Faco a chamada para a API do Mercado Livre
                    // Categoria MLB1480 -> Imóveis -> Apartamentos -> Venda
                    $url = 'https://api.mercadolibre.com/sites/MLB/search?limit=50&category=MLB1480&city=TUxCQ0dPSTVkMTYw&offset='
                    .$from;
                    $apiRequest = curl_init($url);
                    curl_setopt($apiRequest, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($apiRequest, CURLOPT_HTTPHEADER, array(
                        'Authorization: Bearer rOTAGovjFS4tR9ydEWfiORytOjFJcXnJ'
                    ));
                    $json_response = curl_exec($apiRequest);
                }
                catch (Exception $ex)
                {
                    echo "ERRO NA API MERCADO LIVRE \n";
                    echo $ex->getMessage();
                    sleep(60*30);
                    continue;
                }
                $result = json_decode($json_response);
                $hits = $result->results;

                if(count($hits) === 0){
                    $continue = false;
                    continue; //skip nbhd if response is empty
                }
                if(!isset($hits))
                {
                    //echo "%%%%%%%%%%%%%%%%%    ERRO   %%%%%%%%%%%%%%\n".$count;
                    //// Registro no Log do Crawler
                    //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    //$crawler_log->created_at = date('Y-m-d H:i:s');
                    //$crawler_log->bairro = $bairro;
                    //$crawler_log->from = $from;
                    //$crawler_log->status = 'error';
                    //$crawler_log->count_linstings = $count;
                    //$crawler_log->return = $json_response;
                    //$crawler_log->save();
                    //echo "\n########### URL DA PESQUISA: ".$url;

                    if(!empty($json_response))
                    {
                        $count_error++;
                        sleep(3600 * $count_error);
                    }
                    else
                    {
                        sleep(60);
                    }

                }
                else
                {
                    $total_listings = $hits;

                    $from += 50;
                    // Faço o tratamento de cada anúncio
                    foreach($total_listings as $listings)
                    {
                        $jsonImages = null;
                        $listing_aux = ORM::for_table('module_imobles_listings')
                            ->where('crawler_listing_id', $listings->id)
                            ->where('crawler_type_id', $crawlerType->id)
                            ->find_one();
                        if(!$listing_aux){
                            // Se for anúncio novo busca as imagens
                            $jsonImages = $this->mercadoLivreGetImages($listings->id);
                        }
                        
                        $listings = $this->jsonTranslator->fromMeli($listings, $jsonImages);
                        $insert_listing = $this->crawlerHelper->handleListing($listings, $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, null, null, null, $crawlerType);

                        if($insert_listing)
                        {
                            $arr_listings_id[] = $insert_listing;
                            $count++;
                        }
                        else
                        {
                            echo "########## ERRO API MERCADO LIVRE ###########";
                            // Registro no Log do Crawler
                            //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                            //$crawler_log->created_at = date('Y-m-d H:i:s');
                            //$crawler_log->bairro = $bairro;
                            //$crawler_log->from = $from;
                            //$crawler_log->status = 'error';
                            //$crawler_log->count_linstings = $count;
                            //$crawler_log->save();
                            exit;
                        }

                    }

                    // Registro no Log do Crawler
                    //$crawler_log = ORM::for_table('module_imobles_crawler_vivareal')->create();
                    //$crawler_log->created_at = date('Y-m-d H:i:s');
                    //$crawler_log->bairro = $bairro;
                    //$crawler_log->from = $from;
                    //$crawler_log->status = $continue?'continue':'finished';
                    //$crawler_log->count_linstings = $count;
                    //$crawler_log->save();
                }
            }
            sleep(20);
            echo "\n************************* FIM DO BAIRRO: ".$bairro."\n";
        }
        echo "\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |  ".$count." | FIM | $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n";

        // Finalizo o Timer e printo o tempo de execução
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        $output = sprintf('%02d:%02d:%02d', ($execution_time/ 3600),($execution_time/ 60 % 60), $execution_time% 60);
        echo "\n".$output."\n\n";

        // Verifico os anúncios deletados
        $this->checkListingStatus(1, $arr_listings_id);
    }
    
    public function insertPlaces($place_details) 
    {    
        $count++;

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

        /*
         *  Verifico se o empreendimento já foi cadastrado
         */
        $enterprise_id = null;
        $enterprise_aux = ORM::for_table('module_imobles_enterprise')
            ->where('google_place_id', $place_details->place_id)
            ->find_one();
        if(isset($enterprise_aux->id) && $enterprise_aux->id > 0)
        {
            $enterprise_id = $enterprise_aux->id;

            echo '##################### EMPREENDIMENTO JÁ CADASTRADO ###################\n\n';
            return false;
        }

        // Trato os dados do endereço
        $address_number = null;
        $arr_address = $place_details->address_components;
        foreach($arr_address as $address)
        {
            if(in_array('street_number', $address->types))
            {
                $address_number = $address->long_name;
                if(intval($address_number) <> $address_number)
                {
                    $address_number = null;
                }
            }

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

            if(in_array('administrative_area_level_1', $address->types))
            {
                $address_state = $address->long_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, desconsideramos.
        if($address_number == null)
        {
            return false;
        }

        // Pesquiso pelo endereço
        $enterprise_aux = ORM::for_table('module_imobles_enterprise')
            ->where('address_zip', $address_zipcode)
            ->where('address_log', $address_log)
            ->where('address_number', $address_number)
            ->find_one();

        if(isset($enterprise_aux->id) && $enterprise_aux->id > 0)
        {   
            // Atualizo os dados com o Google
            $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 = json_encode($place_details->plus_code);
            $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->link_google = $place_details->url;
            $enterprise_aux->google_json = json_encode($place_details);
            $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['videoTourLink'] = $result_listing->videoTourLink;
//                        $arr_enterprise['unitTypes'] = $result_listing->unitTypes[0];
            $arr_enterprise['comparator_status'] = "Backlog";
//                        $arr_enterprise['videoTourLink'] = $result_listing->videoTourLink;
//                        $arr_enterprise['crawler_type'] = 'google_maps';
//                        $arr_enterprise['crawler_listing_id'] = $result_listing->id;
//                        $arr_enterprise['crawler_listing_link'] = $result_link->href;
//                        $arr_enterprise['crawler_portal'] = $result_listing->portal;


            // Endereço
            $arr_enterprise['address_log'] = $address_log;
            $arr_enterprise['address_log_sanitized'] = $this->crawlerHelper->sanitizaLogradouro($address_log);
            $arr_enterprise['address_number'] = $address_number;
            $arr_enterprise['address_neightborhood'] = $address_neighborhood;
            $arr_enterprise['address_zip'] = $address_zipcode;
//                        $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;
            $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);

            // Pego o ID do Estado
            if(isset($result_listing->address->state) && !empty($result_listing->address->state)) 
            {
                  $c = ORM::for_table("state")->where("state_name", trim($result_listing->address->state))->find_one();
                if($c) {
                    $arr_enterprise['address_state_id'] = $c->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))->find_one();
                if ($c) {
                    $arr_enterprise['address_city_id'] = $c->id;
                }
            }



            $arr_enterprise['obs'] = null;

            // Salvo o empreendimento
            $save = $this->modelEnterprises->createEnterprises($arr_enterprise);
            if(is_numeric($save->id))
            {
                echo '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->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();

        }  
    }
    
    
    /**
     * Send Message
     * Função que faz o cadastro do novo Lead e o envio da primeira mensagem por whats
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapHubspot($data) 
    {
        
        foreach ($data as $event)
        {
            // Pego os dados do Cliente no HubSpot
            $url = "https://api.hubapi.com/crm/v3/objects/contacts/"
                    . $event->objectId
                    . "?properties=phone,email,firstname,lastname";
            $ch = curl_init();
            curl_setopt_array($ch, array(
                CURLOPT_URL => $url,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_HTTPHEADER => array(
                    "accept: application/json",
                    "authorization: Bearer pat-na1-9cf5e994-25a2-4d6e-90f8-3a175c4b3056"
                ),
            ));
            $json_response = curl_exec($ch);
            $result = json_decode($json_response);
            
            if(isset($result->properties->phone))
            {
                // Faço o cadastro do Lead no Mande um Zap
                $data_contact = array(
                    'internalName' => $result->properties->firstname." ".$result->properties->lastname,
                    'number' => preg_replace('/\D/', '', $result->properties->phone),
                    'unsubscribed' => false,
                    'note' => 'TESTE NOTA',
                    'customFields' => [],
                    'serviceId' => '6221e13e-ca1f-434d-8656-7cc0bb49425d',
                    'personId' => null,
                    'defaultDepartmentId' => 'bcc09536-028e-44dc-b40e-cdd6249d69fb',
                    'defaultUserId' => '53b3cec9-6603-4162-b73b-fac0438c9c9b',
                    'tagIds' => ["1580656b-73ff-4bba-9c8d-2d1fa592c8ca","4f9f72c8-4d18-4548-8543-2ca3c9643060"],
                    'idFromService' => '',
                    'mergeRelations' => true
                );
                $phone = preg_replace('/\D/', '', $result->properties->phone);
                $lastname = trim(strtolower($result->properties->lastname));

                $postdata = json_encode($data_contact);
                $url = 'https://imobles.digisac.co/api/v1/contacts';
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
                curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
                'Content-Type: application/json'
                ));
                $json_response = curl_exec($ch);
                $contact = json_decode($json_response);


                // Abro um chamado para o Lead no Mande um Zap
                $url = "https://imobles.digisac.co/api/v1/contacts/".$contact->id."/ticket/transfer";
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
                'Content-Type: application/json'
                ));
                $json_response = curl_exec($ch);
                $result = json_decode($json_response);

                if($lastname == 'testezap')
                {
                    // Envio a primeira mensagem para o Cliente pelo Mande um Zap
                    $url = "https://imobles.digisac.co/api/v1/messages";
                    $data_msg = array(
                        'text' => 'TESTE MENSAGEM AUTOMÁTICA',
                        'type' => 'chat',
                        'contactId' => $contact->id,
                        'subject' => 'teste',
                    );
                    $postdata = json_encode($data_msg);
                    $ch = curl_init($url);
                    curl_setopt($ch, CURLOPT_POST, 1);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                    'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
                    'Content-Type: application/json'
                    ));
                    $json_response = curl_exec($ch);
                    $result = json_decode($json_response);
                }
            }
        }
        
    }
    
    
    
    /**
     * compareEnterpriseImages
     * Compara os empreendimentos já cadastrados entre si
     *
     * @param  
     * @return boolean 
     */
    public function compareEnterpriseImages() 
    {    
//        header('Content-Type: application/json');
        $start_timer = microtime(true);
        
        // pego todos os empreendimentos
        $arr_enterprise_deleted = array();
        $enterprise_check = ORM::for_table('module_imobles_enterprise')
//                    ->select_many('id', 'name',  'address_city_id', 'address_state_id', 'address_neightborhood', 'address_log_sanitized', 'google_place_id', 'verified')
//                    ->where('address_neightborhood', 'Setor Bueno')
//                    ->where_null('crawler_listing_id')
                    ->where_null('google_place_id')
//                    ->where_null('verified')
                    ->where('verified', 0)
//                    ->where('address_log', 'Avenida T 3')
                    ->find_many();
//            var_dump(count($enterprise_check));exit;
        foreach ($enterprise_check as $obj)
        {
//            var_dump($obj->google_place_id);
//            continue;
            // Verifico se o empreendimento já foi vinculado a outro
            if(in_array($obj->id, $arr_enterprise_deleted))
            {
                continue;
            }
            $arr_imgs_compare = array();
            
            // Pego todos os anúncios vinculados ao empreendimento
            $arr_listings_enterprise = ORM::for_table('module_imobles_listings')
                                        ->where('entreprise_id', $obj->id)
                                        ->find_many();
            
            // Pego todos os tipos de unidades do empreendimento
            $arr_unit_types_obj = ORM::for_table('module_imobles_enterprise_units_type')
                                        ->where('module_imobles_enterprise_id', $obj->id)
                                        ->find_many();
            
            // Pego todos os empreendimentos na mesma rua ou bairro
            $enterprises = ORM::for_table('module_imobles_enterprise')
                    ->select_many('id', 'name', 'google_place_id', 'verified')
                    ->where('address_city_id', $obj->address_city_id)
                    ->where_not_in('id', [$obj->id])
                    ->where('address_state_id', $obj->address_state_id);

            if($obj->address_neightborhood)
            {
                $enterprises->where('address_neightborhood', $obj->address_neightborhood);
            }
            else
            {
                continue;
            }

            if($obj->address_log_sanitized)
            {
                $enterprises->where('address_log_sanitized', $obj->address_log_sanitized);
            }
            $enterprises_aux = $enterprises->find_many();
            if(count($enterprises_aux))
            {
                foreach ($enterprises_aux as $enterprise)
                {
                    if(!$enterprise->google_place_id && $enterprise->verified == 0)
                    {
                        continue;
                    }
                    $match = false;
                    $merge_type = null;
                    // Comparo as Plantas dos Empreendimentos
                    $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_enterprise)
                    {
                        $area = $unit_types_enterprise->area;
                        $num_rooms = $unit_types_enterprise->num_rooms;
                        $number_suite = $unit_types_enterprise->number_suite;
                        $number_bathroom = $unit_types_enterprise->number_bathroom;
                        $number_garage = $unit_types_enterprise->number_garage;
                        foreach($arr_unit_types_obj as $unit_types_obj)
                        {
                            if($area == $unit_types_obj->area)
                            {
                                if($num_rooms == $unit_types_obj->num_rooms)
                                {
                                    if($number_suite == $unit_types_obj->number_suite)
                                    {
                                        if($number_bathroom == $unit_types_obj->number_bathroom)
                                        {
                                            if($number_garage == $unit_types_obj->number_garage)
                                            {
                                                $match = true;
                                                echo "MATCH TYPE: PLANTA: ".$obj->name." | ".$enterprise->name."\n";
                                                $merge_type = "unit_type";
                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if($match == true)
                        {
                            break;
                        }
                    }
                    
                    // Pego todos os anúncios vinculados ao empreendimento
                    $listings = ORM::for_table('module_imobles_listings')
                                    ->where('entreprise_id', $enterprise->id)
                                    ->find_many();
                    $count_listings_enterprise = count($listings);
                    if($count_listings_enterprise && $match == false)
                    {
                        foreach ($listings as $listing)
                        {
                            
                            // Monto a string de camparação com empreendimentos já cadastrados
                            $listing_json = json_decode($listing->crawler_json);
                            $description = $listing_json->listing->description;
                            $title = $listing_json->listing->title;
                            $complement = $listing_json->listing->address->complement;
                            $codigo_ext = $listing_json->listing->externalId;
                            $bairro = $listing_json->listing->address->neighborhood;
                            $str_compare = $description.' @@@ '.$title.' @@@ '.$complement.' @@@ '.$codigo_ext;
                            $str_compare = $this->cleanString(mb_strtolower(trim($str_compare)));
                            echo "EMPREENDIMENTO: ".$obj->name." | EMPREENDIMENTO COMP: ".$enterprise->name."\nLISTING: ".$str_compare."\n";
                            
                            
                            // Verifico se o nome do empreendimento bate com o json do anúncio
                            if($obj->verified || $obj->google_place_id)
                            {
                                $name = $this->cleanString($obj->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\.?|condo\.?)\s+/i', '', $name);
                                $name = trim($name);

                                // Verifico se o nome do empreendimento é similar ao bairro
                                $arr_bairro = explode(' ', $this->cleanString($bairro));
                                $arr_exclude = ['vaca brava'];
                                $arr_exclude = array_merge($arr_exclude, $arr_bairro);
                                $pattern = "/".  implode('|', $arr_exclude)."/i";
                                if(preg_match($pattern, $name))
                                {
                                    $pattern = '/((residencial|residence|edificio|condominio|res\.?|ed\.?|c\.?|'
                                        . 'edf\.?|edi\.?|cd\.?|cond\.?|con\.?|co\.?|cod\.?|condo\.?){1}'
                                        . '(?:\sd[aeoi])?[s]?'
                                        . '\s+'
                                        . '('.$name.'){1}|('.$name.'){1}\s+(residencial|residence|edificio|condominio|res\.?|ed\.?|'
                                        . 'edf\.?|edi\.?|cd\.?|cond\.?|con\.?|condo\.?)\s{1})/i';
                                }
                                else
                                {
//                                    $pattern = '/((residencial|residence|edificio|condominio|res\.?|ed\.?|c\.?|'
//                                        . 'edf\.?|edi\.?|cd\.?|cond\.?|con\.?|co\.?|cod\.?|condo\.?)?'
//                                        . '(?:\sd[aeoi])?[s]?'
//                                        . '\s+'
//                                        . '('.$name.'){1}|('.$name.'){1}\s+(residencial|residence|edificio|condominio|res\.?|ed\.?|'
//                                        . 'edf\.?|edi\.?|cd\.?|cond\.?|con\.?|condo\.?)\s{1})/i';
                                    $pattern =  "/".$name."/i";
                                }
                                
                                preg_match_all($pattern, $str_compare, $matches, PREG_OFFSET_CAPTURE);
                                if(count($matches) && !empty($matches[0]))
                                {
                                    $match = true;
                                    echo "MATCH TYPE: NOME DO EMPREENDIMENTO: ".$obj->name."\n";
                                    $merge_type = "enterprise_name";
                                    break;
                                }
                            }
                                        
                                        
                            // Comparo a descrição dos anúncios para ver se é clonado
                            foreach ($arr_listings_enterprise as $listing_enterprise)
                            {
                                similar_text(mb_strtolower($description), mb_strtolower($listing_enterprise->description), $sim_description);
                                if(strlen($description) > 600 && $sim_description >= 98)
                                {
                                    $match = true;
                                    echo "MATCH TYPE: DESCRIÇÃO: ".$obj->name."\n";
                                    $merge_type = "desc";
                                    break;
                                }
                                else
                                {
                                    // Verifico se o Nome do Empreendimento bate com os dados do anúncio
                                    if($enterprise->verified || $enterprise->google_place_id)
                                    {
                                        $name = $this->cleanString($enterprise->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\.?|condo\.?)\s+/i', '', $name);
                                        $name = trim($name);

                                        // Monto a string de camparação com empreendimentos já cadastrados
                                        $listing_enterprise_json = json_decode($listing_enterprise->crawler_json);
                                        $description = $listing_enterprise_json->listing->description;
                                        $title = $listing_enterprise_json->listing->title;
                                        $complement = $listing_enterprise_json->listing->address->complement;
                                        $codigo_ext = $listing_enterprise_json->listing->externalId;
                                        $str_compare = $description.' @@@ '.$title.' @@@ '.$complement.' @@@ '.$codigo_ext;
                                        $str_compare = $this->cleanString(mb_strtolower($str_compare));
                                        $bairro = $listing_enterprise_json->listing->address->neighborhood;

                                        // Verifico se o nome do empreendimento é similar ao bairro
                                        $arr_bairro = explode(' ', $this->cleanString($bairro));
                                        $arr_exclude = [];
                                        $arr_exclude = array_merge($arr_exclude, $arr_bairro);
                                        $pattern = "/".  implode('|', $arr_exclude)."/i";
                                        if(preg_match($pattern, $name))
                                        {
                                            $pattern = '/((residencial|residence|edificio|condominio|res\.?|ed\.?|c\.?|'
                                                . 'edf\.?|edi\.?|cd\.?|cond\.?|con\.?|co\.?|cod\.?|condo\.?){1}'
                                                . '(?:\sd[aeoi])?[s]?'
                                                . '\s+'
                                                . '('.$name.'){1}|('.$name.'){1}\s+(residencial|residence|edificio|condominio|res\.?|ed\.?|'
                                                . 'edf\.?|edi\.?|cd\.?|cond\.?|con\.?|condo\.?)\s{1})/i';
                                        }
                                        else
                                        {
//                                            $pattern = '/((residencial|residence|edificio|condominio|res\.?|ed\.?|c\.?|'
//                                                . 'edf\.?|edi\.?|cd\.?|cond\.?|con\.?|co\.?|cod\.?|condo\.?)?'
//                                                . '(?:\sd[aeoi])?[s]?'
//                                                . '\s+'
//                                                . '('.$name.'){1}|('.$name.'){1}\s+(residencial|residence|edificio|condominio|res\.?|ed\.?|'
//                                                . 'edf\.?|edi\.?|cd\.?|cond\.?|con\.?|condo\.?)\s{1})/i';
                                            $pattern =  "/".$name."/i";
                                        }
                                        preg_match_all($pattern, $str_compare, $matches, PREG_OFFSET_CAPTURE);
                                        if(count($matches) && !empty($matches[0]))
                                        {
                                            echo "MATCH TYPE: NOME DO EMPREENDIMENTO: ".$enterprise->name."\n";
                                            $match = true;
                                            $merge_type = "enterprise_name";
                                            break;
                                        }
                                    }
                                    
                                    // Pego todas as imagens desse anúncio do Objeto
                                    if(!isset($arr_imgs_compare[$listing_enterprise->id]))
                                    {
                                        $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                                                ->select_many('src', 'id', 'duplicated')
                                                ->where('listing_id', $listing_enterprise->id)
                                                ->where('duplicated', 0)
                                                ->find_many();
                                        if(!empty($arr_imgs_aux))
                                        {
                                            foreach ($arr_imgs_aux as $medias)
                                            {
                                                $url = 'application/plugins/module_imobles/uploads/enterprise/' . $obj->id . "/images/".$medias->src;
                                                try
                                                {
                                                    $image = new imagick($url);
                                                    $arr_imgs_compare[$listing_enterprise->id][] = array('image' => $image,
                                                                                'id'   => $medias->id,
                                                                                'url'   => $url,
                                                                                'duplicated' => $medias->duplicated);
                                                } 
                                                catch (Exception $ex) 
                                                {
                                                    echo $ex->getMessage()." | @@@@@@@@@@@@\n";
                                                }
                                            }
                                        }
                                    }

                                    // Comparo as imagens dos dois empreendimentos
                                    $count_imgs = 0;
                                    $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) && !empty($arr_imgs_compare))
                                    {
                                        $total_imgs = count($arr_imgs_aux);
                                        $arr_imgs_duplicated = array();
                                        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[$listing_enterprise->id] as $key => $img_compare)
                                                {
                                                    $result = $image->compareImages($img_compare['image'], Imagick::METRIC_MEANSQUAREERROR);
                                                    if($result[1] <= 0.005)
                                                    {
                                                        $count_imgs++;
                                                        $arr_imgs_duplicated[] = $medias->id;
                                                        echo "RESULT: ".$result[1]." | MATCH | ".$url."\n";
                                                        
                                                        if($count_imgs >= 2)
                                                        {
                                                            $match = true;
                                                            $merge_type = "img";
                                                            break;
                                                        }
                                                    }
                                                    else
                                                    {
//                                                        echo "RESULT: ".$result[1]." | IMAGEM NÃO CORRESPONDENTE | ".$url."\n";
                                                    }
                                                }
                                                echo "############################### TOTAL DE IMAGENS DUPLICADAS: ".$count_imgs."\n";
                                                
                                                // Marco as imagens duplicadas
                                                foreach ($arr_imgs_duplicated as $img_duplicated)
                                                {
                                                    $img_aux = ORM::for_table('module_imobles_enterprise_imgs')->find_one($img_duplicated);
                                                    $img_aux->duplicated = 1;
                                                    $img_aux->save();
                                                }
                                                if($match == true)
                                                {
                                                    break;
                                                }
                                            } 
                                            catch (Exception $ex) 
                                            {
                                                echo $ex->getMessage()." | #############\n";
                                            }
                                        }
                                        if($match == true)
                                        {
                                            break;
                                        }
                                    }
                                }
                            }
                            
                            if($match == true)
                            {
                                break;
                            }
                        }
                    }
                        
                    if($match == true)
                    {
                        $return = $this->mergeEnterprises($obj->id, $enterprise->id, $merge_type);
                        if($return == true)
                        {
                            echo "Merge Realizado com sucesso: ".$obj->id." | ".$enterprise->id."\n";
                            $arr_enterprise_deleted[] = $enterprise->id;
                        }
                    }
                }
            }
        }
    }
    
    
    /**
     * Merge Enterprises
     * Função que faz o merge de empreendimentos  
     */
    public function mergeEnterprises($ent1, $ent2, $merge_type) 
    { 
        $enterprise = ORM::for_table('module_imobles_enterprise')->find_one($ent1);
        $enterprise_old = ORM::for_table('module_imobles_enterprise')->find_one($ent2);
        
        $arr_trash = array();
        
        if(isset($enterprise->id) && $enterprise->id == $ent1 && isset($enterprise_old->id) && $enterprise_old->id == $ent2)
        {
            $obs_aux = $enterprise->obs;
            
            // Verifico se tem Google Place
            if(!$enterprise->google_place_id && $enterprise_old->google_place_id)
            {
                $enterprise->google_place_id = $enterprise_old->google_place_id;
                $enterprise->latitude = $enterprise_old->latitude;
                $enterprise->longitude = $enterprise_old->longitude;
                $enterprise->google_geometry = $enterprise_old->google_geometry;
                $enterprise->google_phone = $enterprise_old->google_phone;
                $enterprise->google_plus_code = $enterprise_old->google_plus_code;
                $enterprise->google_rating = $enterprise_old->google_rating;
                $enterprise->google_reference = $enterprise_old->google_reference;
                $enterprise->google_reviews = $enterprise_old->google_reviews;
                $enterprise->google_user_ratings_total = $enterprise_old->google_user_ratings_total;
                $enterprise->name = $enterprise_old->name;
                $enterprise->link_google = $enterprise_old->link_google;
                
                // Verifico se tem número
                if(!$enterprise->address_number && $enterprise_old->address_number)
                {
                    $enterprise->address_number = $enterprise_old->address_number;
                }
            }
            
            // Verifico se tem Complemento do Endereço
            if(!$enterprise->address_complement && $enterprise_old->address_complement)
            {
                $enterprise->address_complement = $enterprise_old->address_complement;
            }
            
            if($enterprise_old->address_complement)
            {
                $obs_aux .= "<br/>Complemento Empreendimento Merge:".$enterprise_old->address_complement;
            }
            
            
            // Verifico se tem videoTourLink
            if(!$enterprise->videoTourLink && $enterprise_old->videoTourLink)
            {
                $enterprise->videoTourLink = $enterprise_old->videoTourLink;
            }
            
            if($enterprise_old->videoTourLink)
            {
                $obs_aux .= "<br/>Video Tour - Empreendimento Merge:".$enterprise_old->address_complement;
            }
            
            
            // Verifico se tem release_status
            if(!$enterprise->release_status && $enterprise_old->release_status)
            {
                $enterprise->release_status = $enterprise_old->release_status;
            }
            
            // Verifico se tem link_google
            if(!$enterprise->link_google && $enterprise_old->link_google)
            {
                $enterprise->link_google = $enterprise_old->link_google;
            }
            
            // Salvo os dados do empreendimento
            $arr_trash["enterprise_merge"] = $enterprise;
            $enterprise->save();
            
            // Pego a Torre do empreendimento OLD
            $tower_old = ORM::for_table('module_imobles_enterprise_towers')
                    ->where('module_imobles_enterprise_id', $enterprise_old->id)
                    ->find_one();
            $arr_trash["tower"] = $tower_old;
            $unit_tower_id_old = $tower_old->id;
            
            $tower = ORM::for_table('module_imobles_enterprise_towers')
                    ->where('module_imobles_enterprise_id', $enterprise->id)
                    ->find_one();
            $unit_tower_id = $tower->id;
            
            // Pego as UNIDADES da TORRE que será excluída
            $arr_units_tower_old = ORM::for_table('module_imobles_enterprise_units')
                                    ->where('module_imobles_enterprise_towers_id', $unit_tower_id_old)
                                    ->find_many();
            $arr_trash["unit_types"] = $arr_units_tower_old;
            foreach ($arr_units_tower_old as $unit_old)
            {
                $unit_old->module_imobles_enterprise_towers_id = $unit_tower_id;
                $unit_old->save();
            }
            $tower_old->deleted_at = date('Y-m-d H:i:s');
            $tower_old->save();
            
            
            // Pego as ANUNCIOS do Empreendimento OLD
            $arr_listings_old = ORM::for_table('module_imobles_listings')
                                    ->where('entreprise_id', $enterprise_old->id)
                                    ->find_many();
            $arr_trash["listings"] = $arr_listings_old;
            foreach ($arr_listings_old as $listing_old)
            {
                $listing_old->entreprise_id = $enterprise->id;
                $listing_old->save();
            }
            
            // Pego as IMAGENS do Empreendimento OLD
            $arr_imgs_old = ORM::for_table('module_imobles_enterprise_imgs')
                                    ->where('module_imobles_enterprise_id', $enterprise_old->id)
                                    ->find_many();
            $arr_trash["images"] = $arr_imgs_old;
            foreach ($arr_imgs_old as $imgs_old)
            {
                $imgs_old->module_imobles_enterprise_id = $enterprise->id;
                $imgs_old->save();
            }
            
            $src_dir    = 'application/plugins/module_imobles/uploads/enterprise/' .$enterprise_old->id.'/images/';                                
            if(file_exists($src_dir))
            {
                $dir = new DirectoryIterator($src_dir);
                foreach ($dir as $item) 
                {                            
                    if ($item->isFile()) 
                    {
                        $file_name = $item->getFilename();
                        rename('application/plugins/module_imobles/uploads/enterprise/' .$enterprise_old->id.'/images/'.$file_name, 
                        'application/plugins/module_imobles/uploads/enterprise/'.$enterprise->id.'/images/'.$file_name);
                    }
                }
                rmdir('application/plugins/module_imobles/uploads/enterprise/' .$enterprise_old->id.'/images/');
                rmdir('application/plugins/module_imobles/uploads/enterprise/' .$enterprise_old->id);
            }
            
            
            // Pego os DOCs do Empreendimento OLD
            $arr_docs_old = ORM::for_table('module_imobles_docs')
                                    ->where('module_imobles_enterprise_id', $enterprise_old->id)
                                    ->find_many();
            $arr_trash["docs"] = $arr_docs_old;
            foreach ($arr_docs_old as $docs_old)
            {
                $docs_old->module_imobles_enterprise_id = $enterprise->id;
                $docs_old->save();
            }
            
            // Pego as Unidades Tipo desse empreendimento
            $arr_unit_type = ORM::for_table('module_imobles_enterprise_units_type')
                                        ->where('module_imobles_enterprise_id', $enterprise->id)
                                        ->find_many();
            
            $arr_unit_type_old = ORM::for_table('module_imobles_enterprise_units_type')
                                        ->where('module_imobles_enterprise_id', $enterprise_old->id)
                                        ->find_many();
            
            $arr_trash["units"] = $arr_unit_type_old;
            foreach ($arr_unit_type_old as $unit_type_old)
            {
                $delete_unit = false;
                foreach ($arr_unit_type as $unit_type)
                {
                    if($unit_type->number_rooms == $unit_type_old->number_rooms
                       && $unit_type->number_suite == $unit_type_old->number_suite
                       && $unit_type->number_garage == $unit_type_old->number_garage
                       && $unit_type->number_bathroom == $unit_type_old->number_bathroom
                       )
                    {
                        $delete_unit = true;
                        
                        // Pego as UNIDADES desse TIPO
                        $arr_units_old = ORM::for_table('module_imobles_enterprise_units')
                                                ->where('module_imobles_enterprise_units_type_id', $unit_type_old->id)
                                                ->find_many();
                        foreach ($arr_units_old as $unit_old)
                        {
                            $unit_old->module_imobles_enterprise_units_type_id = $unit_type->id;
                            $unit_old->save();
                            
                            // Pego as ANUNCIOS da UNIDADE
                            $arr_listings_old = ORM::for_table('module_imobles_listings')
                                                    ->where('unit_id', $unit_old->id)
                                                    ->find_many();
                            foreach ($arr_listings_old as $listing_old)
                            {
                                $listing_old->unit_type_id = $unit_type->id;
                                $listing_old->entreprise_id = $enterprise->id;
                                $listing_old->save();
                            }
                        }
                        
                        // Pego as IMAGENS do Tipo de Unidade OLD
                        $arr_imgs_old = ORM::for_table('module_imobles_enterprise_imgs')
                                                ->where('unit_type_id', $unit_type_old->id)
                                                ->find_many();
                        foreach ($arr_imgs_old as $imgs_old)
                        {
                            $imgs_old->unit_type_id = $unit_type->id;
                            $imgs_old->save();
                        }
                        
                        // Pego os DOCs do Tipo de Unidade OLD
                        $arr_docs_old = ORM::for_table('module_imobles_docs')
                                                ->where('module_imobles_enterprise_units_type_id', $unit_type_old->id)
                                                ->find_many();
                        foreach ($arr_docs_old as $docs_old)
                        {
                            $docs_old->module_imobles_enterprise_units_type_id = $unit_type->id;
                            $docs_old->save();
                        }
                    }
                }
                
                if($delete_unit == true)
                {
                    // Deleto o tipo de unit e migro todos os relacionamentos
                    $unit_type_old->delete_at = date('Y-m-d H:i:s');
                    $unit_type_old->save();
                }
                else
                {
                    $unit_type_old->module_imobles_enterprise_id = $enterprise->id;
                    $unit_type_old->save();
                }
            }
            
            // Deleto o empreendimento OLD
            $enterprise_old->delete_at = date('Y-m-d H:i:s');
            $enterprise_old->merge_json = json_encode($arr_trash);
            $enterprise_old->merge_type = $merge_type;
            $enterprise_old->save();
            
            return true;
            // TODO: TRATAR AS AMENITIES
        }
        else
        {
            return false;
        }
    }
    
     /**
     * Merge Enterprises
     * Função que faz o merge de empreendimentos  
     */
    public function enterpriseVideoYoutube($query) 
    { 
        $url = "https://www.googleapis.com/youtube/v3/search?"
                . "key=AIzaSyDV8EiKB-3-jeqoB9qGR7oeQb-y9kLHoCU"
                . "&type=video"
                . "&part=snippet"
                . "&q=".$query;
        $json_google = curl_init($url);
        curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
        $json_response = curl_exec($json_google);
        $result = json_decode($json_response);
        
        
    }
    
    
    /**
     * ArcGis Goiânia
     * Faz a busca dos empreendimentos pela API do ARCGIS
     *
     * @param  
     * @return JSON 
     */
    public function arcgisGyn($bairro = null) 
    {     
        $count_page = 0;
        $bairro_alias = $this->cleanString($bairro);
        $bairro_alias = str_replace(' ', '+', $bairro_alias);
        $count_bairros = 1;
//        echo "Bairro Atual: ".$bairro."\n";
//        $arr_cod_bairro = array('Setor Marista' => 14,
//                                'Setor Bueno'   => 16,
//                                'Jardim América' => 17,
//                                'Setor Bela Vista' => 18,
//                                'Setor Pedro Ludovico' => 15,
//                                'Setor Sul' => 4,
//                                'Parque Amazônia' => 63,
//                                'Setor Oeste' => 3,
//                                'Setor Negrão de Lima' => 228,
//                                'Alto da Glória' => 69,
//                                'Jardim Goiás' => 72,
//                                'Nova Suiça' => 19);
//        $bairro_cod = $arr_cod_bairro[$bairro];
        $size = 1000;
        $from = 0;
        $continue = true;
        $count_cis = 0;
        $arr_cis = array();
        $arr_bairro = array();
        $count_google_place = 0;
        while ($continue === true)
        {
            try
            {
                // Pego os Empreendimentos pelo ARCGis
                $url = "https://portalmapa.goiania.go.gov.br/servicogyn/rest/services/MapaServer/Feature_Base/FeatureServer/3/query?"
                . "f=json&"
                . "where=cdedificio>0&"
                . "returnGeometry=false&"
                . "outFields=*&"
                . "orderByFields=ci%20ASC&"
                . "resultOffset=".$from."&"
                . "resultRecordCount=".$size;

                $json_google = curl_init($url);
                curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
                $json_response = curl_exec($json_google);
            } 
            catch (Exception $ex) 
            {
                echo $ex->getMessage();
            }

            $result = json_decode($json_response);
            if(!isset($result->features))
            {
                var_dump($result);
                echo "%%%%%%%%%%%%%%%%%    ERRO   %%%%%%%%%%%%%%\n".$count;
                sleep(5);
                continue;
            }
            else
            {
                // Verifico a quantidade de anúncios para encerrar a paginação
                $count_listings = count($result->features);
                if($count_listings < $size)
                {
                    $continue = false;
                    $from = 0;
                }
                else
                {
                    $from = $from + $size;
                }

                // Verifico a paginação da pesquisa
                $count_page ++;
                echo "\n  PAGINA: ".$count_page."  *****\n";

                foreach($result->features as $unit)
                {
                    $address_number = null;
                    $unit = $unit->attributes;
                    // Desconsidero se não tiver Nome do Edifício 
                    if(trim($unit->nmedificio) == "")
                    {
                        
                        echo "############### SEM NOME DE EMPREENDIMENTO\n";
                        continue;
                    }

                    if(in_array($unit->ci, $arr_cis))
                    {
                        continue;
                    }
                    else
                    {
                        $count_cis++;
                        $arr_cis[] = $unit->ci;
                        echo "Total CIs: ".$count_cis."\n";
                    }
                    
                    
                    // Inicio as variáveis de controle
                    $isNewEnterprise = true;

                    $enterprise_aux = ORM::for_table('module_imobles_enterprise')
                                        ->select('id')
                                        ->where('crawler_enterprise_id', $unit->ci)
                                        ->find_one();
                    $enterprise_id = isset($enterprise_aux->id)?$enterprise_aux->id:null;
                    if(!$enterprise_id)
                    {
                        // Verifco se já tem algum empreendimento cadastrado no endereço
                        try
                        {
                            // Pego o número do empreendimento
                            $url = "https://portalmapa.goiania.go.gov.br/servicogyn/rest/services/MapaServer/Feature_Base/FeatureServer/5/query?"
                                    . "f=json&"
                                    . "where=id=".$unit->id."&"
                                    . "outFields=*";

                            $return = curl_init($url);
                            curl_setopt($return, CURLOPT_RETURNTRANSFER, true);
                            $json_response = curl_exec($return);
                        } 
                        catch (Exception $ex) 
                        {
                            echo $ex->getMessage();
                            exit;
                        }
                        $result = json_decode($json_response);
//                        var_dump($result->features);
                        if(count($result->features))
                        {
                            foreach ($result->features as $num_predial)
                            {
                                if($num_predial->attributes->cd_log == $unit->cdlogradou && $num_predial->attributes->id == $unit->id)
                                {
                                    $address_number = $num_predial->attributes->nm_npo;
                                }
                            }
                        }

                        if($address_number == null)
                        {
                            echo "############### NÚMERO NÃO ENCONTRADO \n";
                            continue;
                        }

                        // Pego os dados do endereço
                        $arr_enterprise = array();
                        $arr_enterprise['name'] = trim($unit->nmedificio);
                        $arr_log = explode(' ', trim($unit->nmlogradou));
                        switch (trim($unit->tplogradou))
                        {
                            case 'R':
                                $log_type = 'Rua';
                                break;
                            case 'AV':
                                $log_type = 'Avenida';
                                break;
                            case 'PC':
                                $log_type = 'Praça';
                                break;
                            case 'AL':
                                $log_type = 'Alameda';
                                break;
                            default :
                                $log_type = null;
                                break;
                        }

                        if($log_type == null)
                        {

                            echo "####### TIPO DE LOGRADOURO NÃO ENCONTRADO:  ".trim($unit->tplogradou)." | ".trim($unit->nmlogradou)."\n";
                            continue;
                        }

                        unset($arr_log[0]);
                        $logradouro         = implode(" ", $arr_log);
                        $address_logradouro = $log_type." ".$logradouro;
                        $address_number     = $address_number;
                        
                        
                        // Pego o Bairro do empreendimento
                        if(!isset($arr_bairro[$unit->cdbairro]))
                        {
                            $arr_bairro[$unit->cdbairro] = array('nmbairro' => trim($unit->nmbairro),
                                                                 'alias'    => null);
                        }

                        // Verifico se o Bairro está cadastrado
                        $address_bairro = null;
                        $bairro_aux = ORM::for_table('module_imobles_enterprise')
                                            ->select('address_neightborhood')
                                            ->where('crawler_neighborhood_id', $unit->cdbairro)
                                            ->find_one();    
                        if(!$bairro_aux)
                        {

                            $address_encoded = $address_logradouro.", ".$address_number.", Goiânia-GO";
                            $address_encoded_url = urlencode($address_encoded);
                            $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_geocode = json_decode($json_response);
                            if(isset($result_geocode->results) && count($result_geocode->results))
                            {
                                $geocode = $result_geocode->results[0];
                                $arr_address = $geocode->address_components;
                                foreach($arr_address as $address)
                                {
                                    if(in_array('sublocality_level_1', $address->types))
                                    {
                                        $address_bairro = $address->long_name;
                                    }
                                }
                            }

                            $count_google_place ++;
                            echo "\n  GOOGLE PLACE CALL - BAIRRO NULO: ".$address_bairro. " | ".$count_google_place."  *****\n";
                        }
                        else
                        {
                            $address_bairro = trim($bairro_aux->address_neightborhood);
                        }
                        
                        if($address_bairro == null)
                        {
                            echo "#### BAIRRO NÃO ENCONTRATO \n";
                            continue;
                        }

                        // Verifico se já tem algum empreendimento cadastrado no mesmo endereço
                        $enterprise_aux = ORM::for_table('module_imobles_enterprise')
                                ->select_many('id', 'name', 'crawler_enterprise_id')
                                ->where('address_log_sanitized', $this->crawlerHelper->sanitizaLogradouro($address_logradouro))
                                ->where('address_number', $address_number)
                                ->where('address_neightborhood', $address_bairro)
                                ->find_one();

                        if(isset($enterprise_aux->id))
                        {
                            $enterprise_aux->verified = 1;
                            $enterprise_aux->crawler_enterprise_id = $unit->ci;
                            $enterprise_aux->crawler_neighborhood_id = $unit->cdbairro;
                            $enterprise_aux->save();

                            echo "##### MATCH - ENDEREÇO JÁ CADASTRADO: ".$enterprise_aux->name." | ".$enterprise_aux->crawler_enterprise_id."\n";
                            continue;
                        }


                        // Sanitizo o nome do empreendimento
                        $place_update = false;
                        $name_crawler = $this->cleanString(trim($unit->nmedificio));
                        $name_crawler = mb_strtolower($name_crawler.' ');
                        $name_crawler = preg_replace('/(residencial|edificio|condominio|res\.?|ed\.?|'
                                        . 'c\.?|cd\.?|cond\.?|con\.?|co\.?|cod\.?|condo\.?'
                                . '|resid\.?|Condominium\.?|Residential\.?|Building\.?|Residence\.?|Condominio do\.?|condo\.?)\s+/i', '', $name_crawler);

                        // Verifico se o nome bate com algum empreendimento cadastrado
                        $enterprise_aux = ORM::for_table('module_imobles_enterprise')
                                ->select_many('id', 'name', 'crawler_enterprise_id', 'alternative_names')
                                ->where('address_log_sanitized', $this->crawlerHelper->sanitizaLogradouro($address_logradouro))
                                ->where('address_neightborhood', $address_bairro)
                                ->find_many();
                        
                        foreach ($enterprise_aux as $enterprise_check)
                        {
                            // Monto o array de nomes do Empreendimento
                            $arr_names = array();
                            if($enterprise_check->alternative_names)
                            {
                                $arr_names = explode(';', $enterprise_check->alternative_names);
                            }
                            $arr_names[] = $enterprise_check->name;
                            foreach ($arr_names as $name_aux)
                            {
                                $place_name = $name_aux;
                                $place_name = $this->cleanString(trim($place_name));
                                $place_name = mb_strtolower($place_name);
                                $pattern    = "/".$name_crawler."/i";
                                if(preg_match($pattern, $place_name))
                                {
                                    $enterprise_check->verified = 1;
                                    $enterprise_check->address_log = $address_logradouro;
                                    $enterprise_check->address_log_sanitized = $this->crawlerHelper->sanitizaLogradouro($address_logradouro);
                                    $enterprise_check->address_number = $address_number;
                                    $enterprise_check->address_neightborhood = $address_bairro;
                                    $enterprise_check->crawler_enterprise_id = $unit->ci;
                                    $enterprise_check->crawler_neighborhood_id = $unit->cdbairro;
                                    $enterprise_check->save();
                                    echo "##### MATCH PELO NOME DE UM EMPREENDIMENTO JÁ CADASTRADO: ".$enterprise_check->name." | ".$enterprise_check->crawler_enterprise_id."\n";
                                    $place_update = true;
                                    continue;
                                }
                                else
                                {
                                    similar_text($place_name, $name_crawler, $sim);
                                    if($sim > 80)
                                    {
                                        $enterprise_check->verified = 1;
                                        $enterprise_check->address_log = $address_logradouro;
                                        $enterprise_check->address_log_sanitized = $this->crawlerHelper->sanitizaLogradouro($address_logradouro);
                                        $enterprise_check->address_number = $address_number;
                                        $enterprise_check->address_neightborhood = $address_bairro;
                                        $enterprise_check->crawler_enterprise_id = $unit->ci;
                                        $enterprise_check->crawler_neighborhood_id = $unit->cdbairro;
                                        $enterprise_check->save();
                                        echo "##### MATCH PELO NOME DE UM EMPREENDIMENTO JÁ CADASTRADO: ".$enterprise_check->name." | ".$enterprise_check->crawler_enterprise_id."\n";
                                        $place_update = true;
                                        continue;
                                    }
                                }
                            }
                        }

                        if($place_update === true)
                        {
                            continue;
                        }

                        // Busco o empreendimento no Google Maps para validar o Logradouro
                        // TODO: cidade e estado estão chumbados
                        try
                        {
                            $query_txt = $name_crawler.", ".$address_logradouro.", ".$address_bairro.", Goiânia-GO";
//                            $query_txt = $this->cleanString($query_txt);
                            $query_txt = urlencode($query_txt);
                            $url = "https://maps.googleapis.com/maps/api/place/textsearch/json?"
                                    . "query=Residencial|Edificio|Condominio|"
                                    . $query_txt 
                                    . "&type=establishment"
                                    . "&key=AIzaSyDV8EiKB-3-jeqoB9qGR7oeQb-y9kLHoCU";
                            $return = curl_init($url);
                            curl_setopt($return, CURLOPT_RETURNTRANSFER, true);
                            $json_response = curl_exec($return);
                            $count_google_place ++;
                            echo "\n  GOOGLE PLACE CALL: ".$count_google_place."  *****\n";
                        } 
                        catch (Exception $ex) 
                        {
                            echo "\n############## ERRO GOOGLE MAPS: ".$ex->getMessage();
                            exit();
                        }

                        $result = json_decode($json_response);
                        if(isset($result->results))
                        {
                            $place_merge = false;
                            foreach ($result->results as $place_details_aux)
                            {
                                $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 ($place_details_aux->types as $type)
                                {
                                    if(in_array($type, $arr_teste))
                                    {
                                        $exclude_type = true;
                                        continue;
                                    }
                                }
                                if($exclude_type === true)
                                {
                                    continue;
                                }
                                
                                $match_name = false;
                                $place_name = $place_details_aux->name;
    //                                    echo "##### GOOGLE PLACE: ".$place_name." | ".$name_crawler."\n";

                                if(empty($place_name))
                                {
                                    continue;
                                }
                                // Verifico se o nome do empreendimento bate com o Place do Google
                                $place_name = $this->cleanString(trim($place_name));
                                $place_name = mb_strtolower($place_name);
                                $pattern    = "/".$name_crawler."/i";
                                if(preg_match($pattern, $place_name))
                                {
                                    $match_name = true;
                                }
                                else
                                {
                                    similar_text($place_name, $name_crawler, $sim);
                                    if($sim > 80)
                                    {
                                        $match_name = true;
                                    }
                                }
                                
                                
                                // Verifico se esse PLACE já foi cadastrado
                                $place_aux = ORM::for_table('module_imobles_enterprise')
                                                ->select_many('id', 'verified')
                                                ->where('google_place_id', $place_details_aux->place_id)
                                                ->find_one();
                                if(!isset($place_aux->id))
                                {
                                    // Comparo a descrição
                                    if($match_name === true && $place_merge === false)
                                    {
                                        // Pego os detalhes do Local na API do Google Places
                                        $url = 'https://maps.googleapis.com/maps/api/place/details/json?'
                                                . 'key=AIzaSyDV8EiKB-3-jeqoB9qGR7oeQb-y9kLHoCU'
                                                . '&place_id='.$place_details_aux->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);
                                        $place_details = $result_details->result;
                                        
                                        $count_google_place ++;
                                        echo "\n  GOOGLE PLACE CALL: ".$count_google_place."  *****\n";
                                        

                                        // Trato os dados do endereço
                                        $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;

                                        echo "##### MATCH GOOGLE PLACE - NOVO EMPREENDIMENTO: ".$place_name." | ".trim($unit->nmedificio)."\n";
                                        $place_merge = true;
                                    }
                                    else
                                    {
                                        $this->insertGooglePlace($place_details_aux, $unit->cdbairro, false);
                                        
                                        $count_google_place ++;
                                        echo "\n  GOOGLE PLACE CALL: ".$count_google_place."  *****\n";
                                    }
                                }
                                else
                                {
                                    if($match_name === true && $place_merge === false && $place_update === false)
                                    {
                                        if($place_aux->verified == 1)
                                        {
                                            ///
                                        }
                                        else
                                        {
                                            // Endereço
                                            $place_aux->verified = 1;
                                            $place_aux->address_log = $address_logradouro;
                                            $place_aux->address_log_sanitized = $this->crawlerHelper->sanitizaLogradouro($address_logradouro);
                                            $place_aux->address_number = $address_number;
                                            $place_aux->address_neightborhood = $address_bairro;
                                            $place_aux->crawler_enterprise_id = $unit->ci;
                                            $place_aux->crawler_neighborhood_id = $unit->cdbairro;
                                            $place_aux->save();
                                            $place_update = true;
                                            $place_merge = true;
                                            echo "##### MATCH GOOGLE PLACE - EMPREENDIMENTO JÁ CADASTRADO: ".$place_name." | ".trim($unit->nmedificio)."\n";
                                        }
                                    }
                                }
                            }

                            // Verifico se foi feito UPDATE em algum empreendimento já cadastrado
                            if($place_update === true)
                            {
                                continue;
                            }
                        }


                        /*
                         * Realizo o cadastro do empreendimento
                         */

                                    
                        // Endereço
                        $arr_enterprise['address_log'] = $address_logradouro;
                        $arr_enterprise['address_log_sanitized'] = $this->crawlerHelper->sanitizaLogradouro($address_logradouro);
                        $arr_enterprise['address_number'] = $address_number;
                        $arr_enterprise['address_neightborhood'] = $address_bairro;

                        // Populo o array do empreendimento
                        $arr_enterprise['alias'] = $arr_enterprise['name'];
                        $arr_enterprise['enable'] = 1;
                        $arr_enterprise['verified'] = 1;
                        $arr_enterprise['crawler_type'] = 'arcgis_gyn';
                        $arr_enterprise['crawler_enterprise_id'] = $unit->ci;
                        $arr_enterprise['crawler_neighborhood_id'] = $unit->cdbairro;
                        $arr_enterprise['created_by'] = 0;


                        // Pego o ID do Estado e Cidade
                        // TODO: tratar para outras cidades
                        $arr_enterprise['address_state_id'] = 9;
                        $arr_enterprise['address_city_id']  = 5418;
    //                            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;
    //                                    }
    //                                }
    //                            }

                        // Verifico a data da entrega
                        if($unit->dtinclusao)
                        {
                            $ano = substr($unit->dtinclusao, 0, 4);
                            $mes = substr($unit->dtinclusao, 4, 2);
                            $dia = substr($unit->dtinclusao, 6, 2);
                            $arr_enterprise['release_date'] = $ano."-".$mes."-".$dia;
                        }
                        $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']) || empty($arr_enterprise['longitude']) || empty($arr_enterprise['latitude']))
                        {
                            $converter = new gPoint();
                            $converter->setDatum('South American 1969');
                            $converter->setUTM($unit->x_coord, $unit->y_coord,22);
                            $converter->convertTMtoLL();
                            $arr_enterprise['latitude'] = $converter->Lat();
                            $arr_enterprise['longitude'] = $converter->Long();
                        }
                        
                        if(!isset($arr_enterprise['link_google']) || empty($arr_enterprise['link_google']))
                        {
                            $arr_enterprise['link_google'] = 'http://maps.google.com/maps?q='.$arr_enterprise['latitude'].','.$arr_enterprise['longitude'];
                        }

                        $arr_enterprise['obs'] = null;

                        // Salvo o empreendimento
                        $arr_enterprise['crawler_json'] = json_encode($unit);
                        $save = $this->modelEnterprises->createEnterprises($arr_enterprise);
                        if(is_numeric($save->id))
                        {
                            echo "@@@@@@@@@@@@@@@@@@@@@ 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
                        $unit_tower_id = null;
                        $towers = 1;
                        for ($i = 0; $i < $towers; $i++) 
                        {
                            $torre = $i + 1;
                            $tower = ORM::for_table('module_imobles_enterprise_towers')->create();
                            $tower->title = 'Torre '.$torre;
    //                                $tower->floors = $unit->nrpaviment;
                            $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
                    {
                        echo "##### EMPREENDIMENTO JÁ CADASTRADO: ".trim($unit->nmedificio)." | ".$unit->ci."\n";
                    }

                    // Cadastro o Tipo de Unidade


                    // Cadastro a Unidade
                }
            }
        }
    }
    
    
    /*
    * 
    * FUNÇÃO PARA CADASTRAR EMPREENDIMENTOS DO GOOGLE PLACE
    * 
    */
    function insertGooglePlace($place, $crawler_neighborhood_id = null, $placeDetails = false)
    {
        // Verifico se é para pegar os Detalhes do empreendimento. 
        // Obs: isso implica em custo adicional na API do Google
        if($placeDetails === true)
        {
            $url = 'https://maps.googleapis.com/maps/api/place/details/json?'
                    . 'key=AIzaSyDV8EiKB-3-jeqoB9qGR7oeQb-y9kLHoCU'
                    . '&place_id='.$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))
            {
                return false;
            }
            $place_details = $result_details->result;
        }
        else 
        {
            $place_details = $place;
        }
        
        // Trato os dados do endereço
        $address_number_place = null;
        $address_log_place = null;
        $address_zipcode_place = null;
        $address_neighborhood_place = null;
        $arr_address_place = isset($place_details->address_components)?$place_details->address_components:array();
        foreach($arr_address_place as $address)
        {
            if(in_array('street_number', $address->types))
            {
                $address_number_place = intval($address->long_name);
                if($address_number_place != $address->long_name)
                {
                    $address_number_place = null;
                }
            }

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

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

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

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

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

        // Se não tem endereço completo com o número, tratamos o endereço formatado
        if($address_number_place == null)
        {
            // Verifico se tem o Número no campo formatted_address
            $formatted_address_place = $place_details->formatted_address;
            
            // TODO: ESTÁ CHUMBADO EM GOIANIA
            $arr_log_place = explode(', Goiânia - GO,', $formatted_address_place);
            $cep_aux = explode(',', $arr_log_place[1]);
            $address_zipcode_place = preg_replace('/\D/', '', trim($cep_aux[0]));
            
            
            // Pesquiso pelo CEP na API dos Correios (VIA CEP)
            $url = 'https://viacep.com.br/ws/'.$address_zipcode_place.'/json/';
            $json_google = curl_init($url);
            curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
            $json_response = curl_exec($json_google);
            $result = json_decode($json_response);


            // Pego a Rua do Anúncio
            if(isset($result->logradouro) && $result->logradouro != '')
            {
                $address_log_place = $result->logradouro;
            }

            // Pego o Bairro do Anúncio
            if(isset($result->bairro) && $result->bairro != '')
            {
                $address_neighborhood_place = $result->bairro;
            }
                        
             
            // Pego o número
            $arr_log_place = explode(' - ', $arr_log_place[0]);
            foreach ($arr_log_place as $log_place_aux)
            {
                $pattern = '/(R\.|Av\.|Rua)/';
                preg_match_all($pattern, trim($log_place_aux), $matches, PREG_OFFSET_CAPTURE);
                if(count($matches) && !empty($matches[0]) && $address_number_place == null)
                {
                    $arr_log = explode(',', trim($log_place_aux));
                    if(isset($arr_log[1]))
                    {
                        $address_number_place = intval(trim($arr_log[1]));
                    }
                }
            }
        }
        
        if(empty($address_neighborhood_place) || empty($address_log_place) || empty($address_city_place) || empty($address_state_place))
        {
            return false;
        }

        // Pesquiso pelo endereço
        $enterprise_aux_place = ORM::for_table('module_imobles_enterprise')
                ->select_many('id','google_place_id','name')
                ->where('address_log_sanitized', $this->crawlerHelper->sanitizaLogradouro($address_log_place))
                ->where('address_number', $address_number_place)
                ->where('address_neightborhood', $address_neighborhood_place)
                ->find_one();

        if(isset($enterprise_aux_place->id) && $enterprise_aux_place->id > 0)
        {   
            if(empty($enterprise_aux_place->google_place_id))
            {
                // Atualizo os dados com o Google
                $enterprise_aux_place->name = $place_details->name;
                $enterprise_aux_place->latitude = $place_details->geometry->location->lat;
                $enterprise_aux_place->longitude = $place_details->geometry->location->lng;
                $enterprise_aux_place->google_geometry = json_encode($place_details->geometry);
                $enterprise_aux_place->google_phone = isset($place_details->formatted_phone_number)?$place_details->formatted_phone_number:null;
                $enterprise_aux_place->google_place_id = $place_details->place_id;
                $enterprise_aux_place->google_plus_code = isset($place_details->plus_code)?json_encode($place_details->plus_code):null;
                $enterprise_aux_place->google_rating = isset($place_details->rating)?$place_details->rating:null;
                $enterprise_aux_place->google_reference = $place_details->reference;
                $enterprise_aux_place->google_reviews = isset($place_details->reviews)?json_encode($place_details->reviews):null;
                $enterprise_aux_place->google_user_ratings_total = isset($place_details->user_ratings_total)?$place_details->user_ratings_total:null;
                $enterprise_aux_place->google_json = json_encode($place_details);
                $enterprise_aux_place->link_google = $place_details->url;
                $enterprise_aux_place->updated_at = date('Y-m-d H:i:s');
                $enterprise_aux_place->crawler_neighborhood_id = $crawler_neighborhood_id;
                $enterprise_aux_place->save();

                echo "GOOGLE - Empreendimento VINCULADO.".$place_details->name." | ".$enterprise_aux_place->name."\n";
            }
        }
        else
        {
            // Populo o array do empreendimento
            $arr_enterprise_place = array();
            $arr_enterprise_place['name'] = $place_details->name;
            $arr_enterprise_place['alias'] = $arr_enterprise_place['name'];
            $arr_enterprise_place['enable'] = 0;
            $arr_enterprise_place['comparator_status'] = "Backlog";                        
            $arr_enterprise_place['created_by'] = 0;


            // Endereço
            $arr_enterprise_place['address_log'] = $address_log_place;
            $arr_enterprise_place['address_log_sanitized'] = $this->crawlerHelper->sanitizaLogradouro($address_log_place);
            $arr_enterprise_place['address_number'] = $address_number_place;
            $arr_enterprise_place['address_neightborhood'] = $address_neighborhood_place;
            $arr_enterprise_place['address_zip'] = $address_zipcode_place;
            $arr_enterprise_place['crawler_neighborhood_id'] = $crawler_neighborhood_id;

            $arr_enterprise_place['latitude'] = $place_details->geometry->location->lat;
            $arr_enterprise_place['longitude'] = $place_details->geometry->location->lng;
            $arr_enterprise_place['link_google'] = $place_details->url;
            $arr_enterprise_place['google_geometry'] = json_encode($place_details->geometry);
            $arr_enterprise_place['google_phone'] = isset($place_details->formatted_phone_number)?$place_details->formatted_phone_number:null;
            $arr_enterprise_place['google_place_id'] = $place_details->place_id;
            $arr_enterprise_place['google_plus_code'] = isset($place_details->plus_code)?json_encode($place_details->plus_code):null;
            $arr_enterprise_place['google_rating'] = isset($place_details->rating)?$place_details->rating:null;
            $arr_enterprise_place['google_reference'] = $place_details->reference;
            $arr_enterprise_place['google_reviews'] = isset($place_details->reviews)?json_encode($place_details->reviews):null;
            $arr_enterprise_place['google_user_ratings_total'] = isset($place_details->user_ratings_total)?$place_details->user_ratings_total:null;
            $arr_enterprise_place['google_json'] = json_encode($place_details);

            // Pego o ID do Estado
            if($address_state_place) 
            {
                $c = ORM::for_table("state")->where("state_name", $address_state_place)->find_one();
                if($c) 
                {
                    $arr_enterprise_place['address_state_id'] = $c->id;

                    // Pego o ID da Cidade
                    if($address_city_place)
                    {
                        $c = ORM::for_table("city")
                                ->where("city_name", $address_city_place)
                                ->where("id_state", $c->id)
                                ->find_one();
                        if ($c) {
                            $arr_enterprise_place['address_city_id'] = $c->id;
                        }
                    }
                }
                else
                {
                    return false;
                }
            }
            $arr_enterprise_place['obs'] = null;

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


            // Cadastro as Torres
            $torre_place = 1;
            $tower_place = ORM::for_table('module_imobles_enterprise_towers')->create();
            $tower_place->title = 'Torre '.$torre_place;
//                        $tower->floors = isset($result_listing->floors[0])?$result_listing->floors[0]:null;
            $tower_place->alias = 'torre_'.$torre_place;
            $tower_place->stage = 'Ready to move in';
            $tower_place->module_imobles_enterprise_id = $enterprise_id_place;
//                        $tower->unitsOnTheFloor = isset($result_listing->unitsOnTheFloor)?$result_listing->unitsOnTheFloor:null;
            $tower_place->created_at = date('Y-m-d H:i:s');
            $tower_place->save();
        }
    }
    
    
    /**
     * Send Message
     * Função que faz o cadastro do novo Lead e o envio da primeira mensagem por whats
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapAdvertiser($data) 
    {
        
        foreach ($data as $event)
        {
            // Pego os dados do Cliente no HubSpot
            $url = "https://api.hubapi.com/crm/v3/objects/contacts/"
                    . $event->objectId
                    . "?properties=phone,email,firstname,lastname";
            $ch = curl_init();
            curl_setopt_array($ch, array(
                CURLOPT_URL => $url,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_HTTPHEADER => array(
                    "accept: application/json",
                    "authorization: Bearer pat-na1-9cf5e994-25a2-4d6e-90f8-3a175c4b3056"
                ),
            ));
            $json_response = curl_exec($ch);
            $result = json_decode($json_response);
            
            if(isset($result->properties->phone))
            {
                // Faço o cadastro do Lead no Mande um Zap
                $data_contact = array(
                    'internalName' => $result->properties->firstname." ".$result->properties->lastname,
                    'number' => preg_replace('/\D/', '', $result->properties->phone),
                    'unsubscribed' => false,
                    'note' => 'TESTE NOTA',
                    'customFields' => [],
                    'serviceId' => '6221e13e-ca1f-434d-8656-7cc0bb49425d',
                    'personId' => null,
                    'defaultDepartmentId' => 'bcc09536-028e-44dc-b40e-cdd6249d69fb',
                    'defaultUserId' => '53b3cec9-6603-4162-b73b-fac0438c9c9b',
                    'tagIds' => ["1580656b-73ff-4bba-9c8d-2d1fa592c8ca","4f9f72c8-4d18-4548-8543-2ca3c9643060"],
                    'idFromService' => '',
                    'mergeRelations' => true
                );
                $phone = preg_replace('/\D/', '', $result->properties->phone);
                $lastname = trim(strtolower($result->properties->lastname));

                $postdata = json_encode($data_contact);
                $url = 'https://imobles.digisac.co/api/v1/contacts';
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
                curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
                'Content-Type: application/json'
                ));
                $json_response = curl_exec($ch);
                $contact = json_decode($json_response);


                // Abro um chamado para o Lead no Mande um Zap
                $url = "https://imobles.digisac.co/api/v1/contacts/".$contact->id."/ticket/transfer";
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
                'Content-Type: application/json'
                ));
                $json_response = curl_exec($ch);
                $result = json_decode($json_response);

                if($lastname == 'testezap')
                {
                    // Envio a primeira mensagem para o Cliente pelo Mande um Zap
                    $url = "https://imobles.digisac.co/api/v1/messages";
                    $data_msg = array(
                        'text' => 'TESTE MENSAGEM AUTOMÁTICA',
                        'type' => 'chat',
                        'contactId' => $contact->id,
                        'subject' => 'teste',
                    );
                    $postdata = json_encode($data_msg);
                    $ch = curl_init($url);
                    curl_setopt($ch, CURLOPT_POST, 1);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                    'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
                    'Content-Type: application/json'
                    ));
                    $json_response = curl_exec($ch);
                    $result = json_decode($json_response);
                }
            }
        }        
    }
    
    
    /**
     * Send Message
     * Função que faz o cadastro do novo Lead e o envio da primeira mensagem por whats
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapCreatContact($phone, $name, $serviceId = null) 
    {          
        // Verifico se o número já está cadastrado no MandeUmZap
        $phone = preg_replace('/\D/', '', $phone);
        // Cadastrar o contato
        $name = trim(mb_strtoupper($name));
        $data_contact = array(
            'internalName' => $name,
            'number' => $phone,
            'unsubscribed' => false,
            'note' => 'CADASTRO AUTOMÁTICA REALIZADO VIA API BACKOFFICE IMOBLES',
            'customFields' => [],
            'serviceId' => $serviceId,
            'tagIds' => ["4bb74b1f-2a02-4926-9791-3f553a895ed0"],
            'defaultDepartmentId' => 'bcc09536-028e-44dc-b40e-cdd6249d69fb',
            'mergeRelations' => true
        );

        $postdata = json_encode($data_contact);
        // var_dump($postdata);
        $url = 'https://imobles.digisac.co/api/v1/contacts';
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
        'Content-Type: application/json'
        ));
        $json_response = curl_exec($ch);
        $contact = json_decode($json_response);
        // var_dump($json_response);
        $return = array("msg" => "Cliente cadastrado com sucesso.",
                        "contact" => $contact,
                        "success" => true,
                        "serviceId" => $serviceId);
        return $return;
    }


    /**
     * Ticket Messages
     * Função que retorna as mensagens de um determinado ticket
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapTicketMessages($ticket_id) 
    {          
        $url = 'https://imobles.digisac.co//api/v1/messages?order%5B0%5D%5B0%5D=timestamp&order%5B0%5D%5B1%5D=ASC&where%5BticketId%5D='.$ticket_id;
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
        'Content-Type: application/json'
        ));
        $json_response = curl_exec($ch);
        $response = json_decode($json_response);
        return $response;
    }


    /**
     * Service Details
     * Função que retorna os detalhes de uma conexão (service)
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapServiceDetails($service_id) 
    {          
        $url = 'https://imobles.digisac.co/api/v1/services?where%5Bid%5D='.$service_id;
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
        'Content-Type: application/json'
        ));
        $json_response = curl_exec($ch);
        $response = json_decode($json_response);
        return $response;
    }
    
    
    /**
     * Send Message
     * Função que faz o cadastro do novo Lead e o envio da primeira mensagem por whats
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapSendMessage($phone, $name, $msg, $file = null, $serviceId = null) 
    {
        // Pego o ServiceId
        if($serviceId === null)
        {
            $serviceId = $this->mandeUmZapGetServiceId();
        }
       
        // Verifico se o contato já está cadastrado
        $contact_id = $this->mandeUmZapGetContact($phone);
        if(empty($contact_id))
        {
            $contact = $this->mandeUmZapCreatContact($phone, $name, $serviceId);
            if($contact['success'] == false)
            {
                $return = array("msg" => "Erro na conexão com o MandeUmZap. Informa ao Webmaster.",
                                "success" => false);
                echo json_encode($return);
                exit;
            }
            $contact_id = $contact['contact']->id;
        }
        
        // Pego o ID do usuário no Mande um Zap de acordo com o usuário logado no ERP
        $accountId = $this->mandeUmZapGetAccountId();
        
        // Envio a mensagem
        $url = "https://imobles.digisac.co/api/v1/messages";
        $data_msg = array(
            'text' => $msg,
            'type' => 'chat',
            'contactId' => $contact_id,
            'serviceId' => $serviceId,
            'userId' => $accountId,
            'number' => $phone
        );
        
        $postdata = json_encode($data_msg);
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
        'Content-Type: application/json'
        ));
        $json_response = curl_exec($ch);
        $result = json_decode($json_response);
        if(isset($result->id))
        {
            // Transfiro o chamado para o usuário correto
            $transfer = $this->mandeUmZapTicketAction($result->contactId, "close", $accountId);
            $return = array("msg" => "Mensagem enviada com sucesso",
                            "json_return" => $result,
                            "success" => true);
            return $return;
        }
        else
        {
            return false;
        }
    }
    
    
    /**
     * Send Message
     * Função que faz o cadastro do novo Lead e o envio da primeira mensagem por whats
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapListings() 
    {
        $arr_ids = $_POST['id'];
        $arr_phones = $_POST['whatsapp'];
        $arr_names = $_POST['name'];
        $arr_listings = $_POST['crawler_listing_id'];
        
        
        $user = User::_info();
        
        $user_name = explode(' ', $user->fullname);
        $user_name = $user_name[0];
        
        
        for ($i = 0; $i < count($arr_ids); $i++)
        {
            $listing = ORM::for_table('module_imobles_listings')->find_one($arr_ids[$i]);            
            
            if(!$listing->crawler_whatsappNumber)
            {
                continue;
            }
            
            switch ($listing->crawler_portal)
            {
                case 'GRUPOZAP':
                    $portal = "zapimoveis.com.br";
                    break;
                case 'VIVAREAL':
                    $portal = "vivareal.com.br";
                    break;
                default:
                    $portal = "zapimoveis.com.br";
                    break;
            }
            
            if(!empty($_POST['msg']))
            {
                $msg = $_POST['msg'];
                
                $msg = str_replace("{{USER_NAME}}", $user_name, $msg);
                $msg = str_replace("{{LISTING_LINK}}", $portal.$listing->crawler_listing_link, $msg);
            }
            else
            {
                $msg = "Olá, tudo bem? Me chamo ".$user_name.", sou Consultor de Vendas na myside.com.br\n\n"
                    . "Tenho um cliente interessado na unidade do seu anúncio:\n"
                    . $portal.$listing->crawler_listing_link."\n\n"
                    . "Essa unidade está disponível? Você tem interesse em uma parceria para essa venda? Grato pelo retorno! Abraço!";
            }
            
            $return = $this->mandeUmZapSendMessage('55'.$listing->crawler_whatsappNumber, $arr_names[$i], $msg);
        }
        
        if($return['success'] == true)
        {
            $return = array("msg" => "Mensagem enviada com sucesso",
                            "status" => 'ok');
            echo json_encode($return);
        }
        else
        {
            $return = array("msg" => $return['msg'],
                            "status" => 'error');
            echo json_encode($return);
        }
    }
    
  
    public function CheckListingsUnityType(){
        $arr_listing_ids = $_POST['id'];
        
        $listings = ORM::for_table("module_imobles_listings")
                ->where_in('id',$arr_listing_ids)
                ->find_many();
          
        foreach ($listings as $l)
        {
            $totaList = ORM::for_table("module_imobles_listings")
                    ->select_expr('count(id) as total')
                ->where('unit_id',$l->unit_id)
                ->find_many();
            
            $unit = ORM::for_table("module_imobles_enterprise_units")
                            ->find_one($l->unit_id);
                
            $unit->module_imobles_enterprise_units_type_id=$_POST['unit_type_id'];
            $l->unit_type_id=$_POST['unit_type_id'];
            
            if($totaList[0]->total>1){
       
                $enterprise_unitys=ORM::for_table('module_imobles_enterprise_units')->create();
                $enterprise_unitys->module_imobles_enterprise_units_type_id =  $unit->module_imobles_enterprise_units_type_id;
                $enterprise_unitys->floor =$unit->floor;
                $enterprise_unitys->number_unity = $unit->number_unity;
                $enterprise_unitys->desc =$unit->desc;
                $enterprise_unitys->module_imobles_enterprise_towers_id = $unit->module_imobles_enterprise_towers_id;
                $enterprise_unitys->amount = $unit->amount;
                $enterprise_unitys->alias =$unit->alias;
                $enterprise_unitys->crawler_type_id =$unit->crawler_type_id;
                $user = User::_info();
                $enterprise_unitys->created_at = $unit->created_at;
                $enterprise_unitys->created_by = $unit->created_by;
                $enterprise_unitys->updated_at = date('Y-m-d H:i:s');
                $enterprise_unitys->updated_by = $user->id;
                $enterprise_unitys->save();
        
                $ame=ORM::for_table('module_imobles_enterprise_units_amenities')
                ->where('module_imobles_enterprise_units_id', $unit->id)
                ->find_many();
                  
                if(count($ame)>0){
                    foreach ($ame as $t){
                        $a = ORM::for_table("module_imobles_enterprise_units_amenities")->create();
                        $a->module_imobles_enterprise_units_id = $enterprise_unitys->id;
                        $a->module_imobles_units_amenities_id = $t->module_imobles_units_amenities_id;
                        $a->save();
                    }
                }
                
                $l->unit_id=$unit->id;
            }else{
                $unit->save();
            }
            $l->save();            
            
        }
        echo  json_encode(array('status'=>'OK','msg'=>$this->_L['module imobles review finshed successfull']));
    }
    
    /*
     *  Função que recebe um array de IDs de empreendimentos ou IDs de anúncios
     *  e faz uma nova análise de cada anúncio para tentar identificar qual o 
     *  empreendimento correto dele
     */
    public function CheckListings()
    {
        $arr_listing_ids = array();
        $type = "listing";
        if(isset($_POST['type']))
        {
            $type = $_POST['type'];
        }
        
        if($type == "enterprise")
        {
            $arr_enterprise_ids = $_POST['id'];
            foreach ($arr_enterprise_ids as $enterprise_id)
            {
                $listings = ORM::for_table("module_imobles_listings")
                            ->select("id")
                            ->where("entreprise_id", $enterprise_id)
                            ->where_not_null("advertiser_id")
                            ->find_many();
                if($listings)
                {
                    foreach ($listings as $listing)
                    {
                        $arr_listing_ids[] = $listing->id;
                    }
                }
            }
        } elseif($type == "type_unit") {
            $whereInactive = "";
            if (!isset($_POST['listing_inative']) || $_POST['listing_inative'] == '0' ){
                $whereInactive = " AND (unavailable IS NULL OR unavailable = 0) AND (crawler_status IS NULL OR crawler_status = 'ACTIVE') and delete_at IS NULL";
            }

            $arr_type_unit_ids = $_POST['id'];
            $ids = implode(',', $arr_type_unit_ids);

            $sql = "SELECT id"
                . " FROM module_imobles_listings"
                . " WHERE unit_type_id IN (" . $ids . ")"
                . " AND (crawler_type_id <> 4 OR crawler_type_id  IS NULL)"
                . $whereInactive
                . " AND crawler_price >=0 AND crawler_businessType='SALE'"
                . " AND advertiser_id IS NOT NULL";

            $listings = ORM::for_table("module_imobles_listings")
                        ->raw_query($sql)
                        ->find_many();
            if($listings) {
                foreach ($listings as $listing) {
                    $arr_listing_ids[] = $listing->id;
                }
            }

        } else {
            $arr_listing_ids = $_POST['id'];
//            $arr_listing_ids = [5327];
        }
        
        
        // Faço a revisão dos anúncios
        $msg = null;
        foreach ($arr_listing_ids as $listing_id)
        {
            $listings = ORM::for_table("module_imobles_listings")->find_one($listing_id);
            switch ($listings->crawler_portal)
            {
                case 'GRUPOZAP':
                    $portal = "zapimoveis.com.br";
                    $listing_link = "https://".$portal."/imovel/".$listings->crawler_listing_id;
                    break;
                case 'VIVAREAL':
                    $portal = "vivareal.com.br";
                    $listing_link = "https://".$portal."/imovel/".$listings->crawler_listing_id;
                    break;
                default:
                    $portal = "zapimoveis.com.br";
                    $listing_link = "https://".$portal."/imovel/".$listings->crawler_listing_id;
                    break;
            }
            
            $enterprise_target_id = null;
            if(isset($_POST['enterprise_id']) && !empty($_POST['enterprise_id']))
            {
                $enterprise_target_id = $_POST['enterprise_id'];
            }
            
            
            // Pego os dados do empreendimento atual
            $enterprise = ORM::for_table("module_imobles_enterprise")->find_one($listings->entreprise_id);
            
            // Faço a verificação do Anúncio
            $check_listing = $this->crawlerHelper->handleListing(json_decode($listings->crawler_json), $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, $listing_id, $enterprise->id, $enterprise_target_id);
            
            if($check_listing['enterprise_new'] == false)
            {
                $msg .= "NO MATCH | ORIGEM: <a href='".U."module_imobles/enterprises/edit/".$enterprise->id."' target='_blank'>".$enterprise->name."</a> <<>> <a href='".$listing_link."' target='_blank'>LISTING LINK</a> <<>> <a href='".U."module_imobles/listings/json/".$listings->id."' target='_blank'>JSON LINK</a><br/>";
            }
            elseif($check_listing['enterprise_new']->id == $enterprise->id)
            {
                $msg .= "SAME PLACE <<>> TYPE: ".$check_listing['match_type']." <<>> ORIGEM: <a href='".U."module_imobles/enterprises/edit/".$enterprise->id."' target='_blank'>".$enterprise->name."</a> <<>> <a href='".$listing_link."' target='_blank'>LISTING LINK</a> <<>> <a href='".U."module_imobles/listings/json/".$listings->id."' target='_blank'>JSON LINK</a><br/>";
            }
            else
            {
                $msg .= "ORIGEM: <a href='".U."module_imobles/enterprises/view/".$enterprise->id."' target='_blank'>".$enterprise->name."</a> <<>> DESTINO: <a href='".U."module_imobles/enterprises/view/".$check_listing['enterprise_new']->id."' target='_blank'>".$check_listing['enterprise_new']->name."</a> <<>> TYPE: ".$check_listing['match_type']." <<>> <a href='".$listing_link."' target='_blank'>LISTING LINK</a> <<>> <a href='".U."module_imobles/listings/json/".$listings->id."' target='_blank'>JSON LINK</a><br/>";
            }
        }
        
        // Salvo a mensagem no log para ser mostrada após o reload no JS.
        _msglog('s', '<br/>'.$msg);
        
        $return = array("msg" => $msg,
                        "success" => true);
        echo json_encode($return);
        exit;
    }
    
    
    /**
     * mandeUmZapCampaing
     * Função que faz o envio do Guia Imobles para a base de leads
     * ########## USO LOCAL - NÃO ALTERAR NEM EXECUTAR #########
     * @param  
     * @return JSON 
     */
    public function mandeUmZapCampaing($dia) 
    {   
        @ini_set('memory_limit', '40095M');
        @ini_set('max_execution_time', 0);
        @set_time_limit(0);
        
        // pego o CSV da Campanha
        $doc = ORM::for_table('sys_documents')->where('title', 'campanha_guia_imobles')->order_by_desc('id')->find_one();
        if($doc){

            $file = 'application/storage/docs/'.$doc->file_path;
        }
        else
        {
            echo "NENHUMA CAMPANHA ENCONTRADA";
            exit;
        }
        $csv = new parseCSV();
        $csv->auto($file);
        $contacts = $csv->data;
        $count = 0;
        $countTotal = 0;
        foreach ($contacts as $contact) 
        {
            $countTotal++;
            echo $countTotal."\n";
            $number = trim($contact["Telefone"]);
            
//            if(in_array($number, [5562992869911,5562984663714,5562984890517,5562999352120,5561981717659]))
//            {
//                continue;
//            }
//             $number = "5548984071889";
            $name  = trim($contact["Nome"]);
            if($contact["DIA"] == $dia)
            {
                $msg = null;
                $origem  = trim($contact["Origem"]);
                switch ($origem)
                {
                    case "Anatana Mileide":
                        $vendor = "a Ana";
                        $user = "Anatana";
                        break;
                    case "Lucas Bagatim":
                        $vendor = "o Lucas";
                        $user = "Lucas";
                        break;
                    case "Lyandra":
                        $vendor = "a Lyandra";
                        $user = "Lyandra";
                        break;
                    default :
                        $vendor = "a Imobles";
                        $user = "Relacionamento";
                        break;
                }
                
                
                $vendor = "a Imobles";
                $user = "Relacionamento";
                
                // Mensagem Indice imobles
                $msg = "Olá, ".$name."! Aqui é a Ana, do time de relacionamento da imobles.\n\n";
                
                $return = $this->mandeUmZapDirect($msg, $number, $name, $user, false);
                if($return === false)
                {
                    echo "Erro no envio: ".$number." | ".$count." | ".$name."\n";
                }
                $count++;
                echo $count.": Mensagem envidas\n";  
//                exit;
                sleep(10);
            }            
        }
        echo "mensagens enviadas para ".$count." contatos.\n<br/>### FIM ###";
    }
    
    
    /**
     * mandeUmZapDirect
     * Função que faz o envio de uma mensagem via Mande um Zap a partir de um Número de telefone
     * @param  
     * @return JSON 
     */
    public function mandeUmZapDirect($msg, $number, $name = null, $user = null, $close = true)
    {
        $serviceId = $this->mandeUmZapGetServiceId($user);
        $accountId = $this->mandeUmZapGetAccountId($user);
        $contactId = $this->mandeUmZapGetContact($number);
        
        if(empty($contactId))
        {
            $contact = $this->mandeUmZapCreatContact($number, $name, $serviceId);
            if(!isset($contact['contact']->id))
            {
                return false;
            }
            $contactId = $contact['contact']->id;
        }
        
        $url = "https://imobles.digisac.co/api/v1/messages";
        $data_msg = array(
            'text' => $msg,
            'type' => 'chat',
            'contactId' => $contactId,
            'serviceId' => $serviceId,
            'userId' => $accountId,
            'number' => $number
        );
        
        $postdata = json_encode($data_msg);
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
        'Content-Type: application/json'
        ));
        $json_response = curl_exec($ch);
        $result = json_decode($json_response);
        if(isset($result->error))
        {
            var_dump($result);
            echo $result->error."\n";
            return false;
                    
        }
        
        // Transfiro o ticket para o usuário correto
        if($close === true)
        {
            $transfer = $this->mandeUmZapTicketAction($result->contactId, "close", $accountId);
        
            if(isset($transfer->error))
            {
                echo $transfer->error."\n";
                return false;

            }
        }
        
        return true;
    }
    
    
    /**
     * mandeUmZapTicketAction
     * Função que transfere um chamado aberto para outro usuário
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapTicketAction($contactId, $action, $accountId = null, $comments = "Chamado transferido via API da Plataforma de Backoffice Imobles.") 
    {
        // Pego o ID (ServiceID) do usuário que vai se comunicar com o contato
        if($accountId == null)
        {
            $accountId = $this->mandeUmZapGetAccountId();
        }
        
        
        $postdata = '{
                        "departmentId": "bcc09536-028e-44dc-b40e-cdd6249d69fb",
                        "userId":   "'.$accountId.'",
                        "comments": "'.$comments.'",
                        "byUserId": "53b3cec9-6603-4162-b73b-fac0438c9c9b"
                    }';
        $url = 'https://imobles.digisac.co/api/v1/contacts/'.$contactId.'/ticket/'.$action;
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
        'Content-Type: application/json'
        ));
        $json_response = curl_exec($ch);
        $result = json_decode($json_response);
        if($result == 'OK')
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    
    /**
     * mandeUmZapGetServiceId
     * Verifica o ServiceId do usuário no Digsac
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapGetServiceId($name = null) 
    {
        if($name == null)
        {
            $user = User::_info();
            if($user->id > 0)
            {
                $userName = explode(' ', $user->fullname);
                $name = $userName[0];
            }
        }
        
        // Pego o ServiceId (Usuario Vinculado ao contato)
        $name = urlencode($name);
        $url = "https://imobles.digisac.co/api/v1/services?"
                    . "query=%7B%22"
                    . "where%22%3A%7B%22"
                    . "name%22%3A%7B%22%24"
                    . "iLike%22%3A%22%25"
                    .$name.
                    "%25%22%7D%2C%22"
                    . "isArchived%22%3Afalse%7D%7D";
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
        'Content-Type: application/json'
        ));
        $json_response = curl_exec($ch);
        $result_service = json_decode($json_response);

        if(!isset($result_service->total))
        {
            // Erro na API - Retornar mensagem de erro
            $return = array("msg" => "Erro na conxeção com o Mande um Zap | Função: mandeUmZapGetServiceId | Informar Webmaster.",
                            "success" => false);
            return $return;
        }
        elseif($result_service->total == 1)
        {
            $serviceId = $result_service->data[0]->id;
        }
        else
        {
            // Pego o Whats Padrão de Goiânia
            $serviceId = 'dad1aad8-e83e-474b-8460-581062f85096';
        }
        
        return $serviceId;
    }
    
    
    /**
     * Send Message
     * Função que faz o cadastro do novo Lead e o envio da primeira mensagem por whats
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapGetAccountId($name = null) 
    {
        if($name == null)
        {
            $user = User::_info();
            if($user->id > 0)
            {
                $userName = explode(' ', $user->fullname);
                $name = $userName[0];
            }
        }
        else
        {
            $userName = explode(' ', $name);
            $name = $userName[0];
        }
        
        // Pego o ServiceId (Usuario Vinculado ao contato)
        $url = "https://imobles.digisac.co/api/v1/users?where%5Bname%5D%5B%24iLike%5D=%25"
                . $name
                . "%25";
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
        'Content-Type: application/json'
        ));
        $json_response = curl_exec($ch);
        $result_service = json_decode($json_response);

        if(!isset($result_service->total))
        {
            // Erro na API - Retornar mensagem de erro
            $return = array("msg" => "Erro na conxeção com o Mande um Zap | Função: mandeUmZapGetAccountId | Informar Webmaster.",
                            "success" => false);
            return $return;
        }
        elseif($result_service->total == 1)
        {
            $accountId = $result_service->data[0]->id;
        }
        else
        {
            // Pego o Whats Padrão de Goiânia
            $accountId = null;
        }
        return $accountId;
    }
    
    
    
    /**
     * mandeUmZapGetContact
     * Função que faz a consulta de um contato no Mande um Zap
     *
     * @param  
     * @return JSON 
     */
    public function mandeUmZapGetContact($phone) 
    {
        if($phone == null)
        {
            return false;
        }
        

        // Pego o ServiceId (Usuario Vinculado ao contato)
        $url = "https://imobles.digisac.co/api/v1/contacts?where%5Bvisible%5D=true&where%5Bdata.number%5D%5B%24iLike%5D=%25"
                . $phone
                . "%25";
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer 8cd3c1c07c14c260b98a4f1ee681e024b3945ab1',
        'Content-Type: application/json'
        ));
        $json_response = curl_exec($ch);
        $result = json_decode($json_response);

        if(!isset($result->total))
        {
            // Erro na API - Retornar mensagem de erro
            echo "Erro na chamada da API para consulta de contato.\n\n";
            return null;
        }
        elseif($result->total >= 1)
        {
            $contactId = $result->data[0]->id;
        }
        else
        {
            // Pego o Whats Padrão de Goiânia
            $contactId = null;
        }
        return $contactId;
    }
    
    
    /**
     * reviewEnterpriseAddress
     * Função para corrigir empreendimentos sem endereço (Estado, Cidade, Bairro)
     * @param  
     * @return JSON 
     */
    public function reviewEnterpriseAddress() 
    {  
        // Pego todos os empreendimentos que não tenham Estado, Cidade ou Bairro
        $enterprises = ORM::for_table("module_imobles_enterprise")
                        ->raw_query("SELECT * FROM module_imobles_enterprise WHERE delete_at IS NULL AND (address_city_id IS NULL OR address_state_id IS NULL OR address_neightborhood IS NULL)")
                        ->find_many();
//        var_dump(count($enterprises));exit;
        $count = 0;
        $count_ok = 0;
        $count_error = 0;
        foreach ($enterprises as $enterprise)
        {
//            echo "######\n";
//            echo $enterprise->id."\n";
//            echo $enterprise->created_at."\n";
//            echo $enterprise->name."\n";
//            echo $enterprise->google_place_id."\n";
//            continue;
            $count++;
            $address_number = null;
            $address_log = null;
            $address_zipcode = null;
            $address_state = null;
            $address_neighborhood = null;
            $address_city = null;
            if(!empty($enterprise->google_json))
            {
                $place_details = json_decode($enterprise->google_json);
                $arr_address = isset($place_details->address_components)?$place_details->address_components:null;
                if($arr_address)
                {
                    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;
                        }
                    }
                }
                
                
                // Verifico se pegou o Estado, Cidade e Bairro
                $latitude = $place_details->geometry->location->lat;
                $longitude = $place_details->geometry->location->lng;
                if(empty($address_state) || empty($address_city) || empty($address_neighborhood))
                {
                    $url = 'https://maps.googleapis.com/maps/api/geocode/json?latlng='
                            . $latitude.','
                            . $longitude.''
                            . '&key=AIzaSyDV8EiKB-3-jeqoB9qGR7oeQb-y9kLHoCU';
                    $json_google = curl_init($url);
                    curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
                    $json_response = curl_exec($json_google);
                    $result_geocode = json_decode($json_response);
                    if(isset($result_geocode->results) && count($result_geocode->results))
                    {
                        $geocode = $result_geocode->results[0];
                        $arr_address = $geocode->address_components;
                        foreach($arr_address as $address)
                        {
                            if(in_array('street_number', $address->types) && empty($address_number))
                            {
                                $address_number = intval($address->long_name);
                                if($address_number != $address->long_name)
                                {
                                    $address_number = null;
                                }
                            }

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

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

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

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

                            if(in_array('route', $address->types) && empty($address_log))
                            {
                                $address_log = $address->long_name;
                            }
                        }
                    }
                }
                
                
                // Se faltou algum elemento do endereço, busco pelo CEP
                if(empty($address_state) || empty($address_city) || empty($address_neighborhood))
                {
                    if(empty($address_zipcode))
                    {
                        // Verifico se tem o Número no campo formatted_address
                        $formatted_address_place = $place_details->formatted_address;
                        $arr_log_place = explode(', Brazil', $formatted_address_place);
                        $cep_aux = explode(' ', $arr_log_place[0]);
                        $cep_index = count($cep_aux) - 1;
                        $cep_aux = $cep_aux[$cep_index];
                        $address_zipcode = preg_replace('/\D/', '', $cep_aux);
                    }
                    
                    // Pesquiso pelo CEP na API dos Correios (VIA CEP)
                    $url = 'https://viacep.com.br/ws/'.$address_zipcode.'/json/';
                    $json_google = curl_init($url);
                    curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
                    $json_response = curl_exec($json_google);
                    $result = json_decode($json_response);


                    // Pego a Rua do Anúncio
                    if(isset($result->logradouro) && $result->logradouro != '' && empty($address_log))
                    {
                        $address_log = $result->logradouro;
                    }

                    // Pego o Bairro do Anúncio
                    if(isset($result->bairro) && $result->bairro != '' && empty($address_neighborhood))
                    {
                        $address_neighborhood = $result->bairro;
                    }

                    // Pego o Bairro do Anúncio
                    if(isset($result->localidade) && $result->localidade != '' && empty($address_city))
                    {
                        $address_city = $result->localidade;
                    }

                    // Pego o Bairro do Anúncio
                    if(isset($result->uf) && $result->uf != '' && empty($address_state))
                    {
                        $address_state = $result->uf;
                    }
                }
                
                $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
                                        );
                
                // Pego o ID do Estado e Cidade
                $address_state_id = null;
                $address_city_id = null;
                if($address_state) 
                {
                    $c = ORM::for_table("state")->where("uf_state", $address_state)->find_one();
                    if($c) 
                    {
                        $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) 
                            {
                                $address_city_id = $c->id;
                            }
                        }
                    }
                }
                
                if(empty($address_city_id) || empty($address_state_id))
                {
                    $count_error++;
                    echo "### ERRO | Estado ou Cidade não encontrado | ".$count_error."\n";
                    var_dump($arr_address_gp);
                    echo "######\n";
                    echo $enterprise->id."\n";
                    echo $enterprise->created_at."\n";
                    echo $enterprise->name."\n";
                    echo $enterprise->google_place_id."\n";
                    echo $enterprise->link_google."\n";
                    echo $enterprise->name."\n";
                    echo $enterprise->verified."\n";
                    continue;
                }
                
                // Atualizo os dados com o Google
                $enterprise->updated_at = date('Y-m-d H:i:s');
                $enterprise->address_log = $address_log;
                $enterprise->address_log_sanitized = $this->crawlerHelper->sanitizaLogradouro($address_log);
                $enterprise->address_number = $address_number;
                $enterprise->address_neightborhood = $address_neighborhood;
                $enterprise->address_zip = $address_zipcode;
                $enterprise->address_state_id = $address_state_id;
                $enterprise->address_city_id = $address_city_id;
                $enterprise->save();
                
                $count_ok++;
                echo "### SUCCESS | Endereço atualizado com sucesso | ".$count_ok."\n";
            }
            else
            {
                echo "######\n";
                echo $enterprise->id."\n";
                echo $enterprise->created_at."\n";
                echo $enterprise->name."\n";
                echo $enterprise->google_place_id."\n";
                echo $enterprise->name."\n";
                echo $enterprise->verified."\n";
            }
        }
        
        echo "FIM | TOTAL DE EMPREENDIMENTOS ANALIZADOS: ".$count."\n";
        
    }
    
    
    /*
     * sanitizeNeighborhood
     * Função para sanitizar os bairros dos empreendimentos
     * 
     */
    public function sanitizeNeighborhood()
    {
        
        
        $count = 0;
        $enterprises = ORM::for_table("module_imobles_enterprise")->find_many();
        foreach ($enterprises as $enterprise)
        {
            if($this->crawlerHelper->sanitizaLogradouro($enterprise->address_neightborhood) == $enterprise->address_neighborhood_sanitized && 
                    $enterprise->address_log_sanitized == $this->crawlerHelper->sanitizaLogradouro($enterprise->address_log))
            {
                continue;
            }
            $enterprise->address_neighborhood_sanitized = $this->crawlerHelper->sanitizaLogradouro($enterprise->address_neightborhood);
            $enterprise->address_log_sanitized = $this->crawlerHelper->sanitizaLogradouro($enterprise->address_log);
            $enterprise->save();
            $count++;
            echo $count." | Bairro sanitizado | ".$enterprise->name."\n";
        }
    }
    
    
        /*
     * reviewListings
     * Função para revisar todos os anúncios de empreendimentos Dummys
     * 
     */
    public function reviewListings()
    {
        $arr_listings = ORM::for_table("module_imobles_enterprise")
                        ->raw_query("SELECT l.id
                                    FROM module_imobles_listings as l
                                    JOIN module_imobles_enterprise as e ON l.entreprise_id = e.id
                                    WHERE 
                                    l.crawler_json IS NOT NULL
                                    AND e.crawler_enterprise_id IS  NULL 
                                    AND e.google_place_id IS NULL 
                                    AND (e.verified = 0 OR e.verified IS NULL);")
                        ->find_many();
//        var_dump(count($arr_listings));exit;
        $count = 0;
        $count_nomatch = 0;
        $count_new = 0;
        $count_same = 0;
        foreach ($arr_listings as $listing_aux)
        {
            $count ++;
            $listings = ORM::for_table("module_imobles_listings")->find_one($listing_aux->id);
            $listing_id = $listing_aux->id;

            // Pego os dados do empreendimento atual
            $enterprise = ORM::for_table("module_imobles_enterprise")
                            ->select('id')
                            ->select('name')
                            ->find_one($listings->entreprise_id);
            $listing_link = $listings->crawler_listing_link;
            
            // Faço a verificação do Anúncio
            $check_listing = $this->crawlerHelper->handleListing(json_decode($listings->crawler_json), $this->modelEnterprises, $this->modelUnitType, $this->modelUnit, $listing_id, $enterprise->id);

            if($check_listing['enterprise_new'] == false)
            {
                $count_nomatch++;
                $msg = $count." | LISTING_ID: ".$listings->id. " <<>> NO MATCH (".$count_nomatch.") <<>> ORIGEM: ".$enterprise->name." <<>> ".$listing_link;
            }
            elseif($check_listing['enterprise_new']->id == $enterprise->id)
            {
                $count_same++;
                $msg = $count." | LISTING_ID: ".$listings->id. " <<>> SAME PLACE (".$count_same.") <<>> ORIGEM: ".$enterprise->name." <<>> ".$listing_link;
            }
            else
            {
                $count_new++;
                $msg = $count." | LISTING_ID: ".$listings->id. " <<>> SUCCESS  (".$count_new.") <<>> ORIGEM: ".$enterprise->name." <<>> ".$listing_link." <<>> DESTINO: ".$check_listing['enterprise_new']->name;
            }
            
            echo $msg."\n";
        }
        
        echo "############# FIM ############";
        
    }
    
    
    /*
    * reviewListings
    * Função para revisar todos os anúncios de empreendimentos Dummys
    * 
    */
    public function checkListingStatus($update = false, $arr_ids = null)
    {
        // Inicio o timer do script
        $time_start = microtime(true); 
        
        // Pego todos os anúncios do ZapImóveis
        if($arr_ids == null)
        {
            $arr_listings = ORM::for_table("module_imobles_listings")
            ->select('id')
            ->select('crawler_listing_id')
            ->select('crawler_listing_link')
            ->select('unit_type_id')
            ->where_not_null('crawler_json')
            ->where_null('delete_at')
            ->find_many();
        }
        else
        {
            $arr_listings = ORM::for_table("module_imobles_listings")
            ->select('id')
            ->select('crawler_listing_id')
            ->select('crawler_listing_link')
            ->select('unit_type_id')
            ->where_not_null('crawler_json')
            ->where_null('delete_at')
            ->where_not_in('id', $arr_ids)
            ->find_many();
        }
        
        echo "Total de Anuncios para verificar Status: ".count($arr_listings)."\n";
        $count = 0;
        $count_update = 0;
        $count_deleted = 0;
        $count_error = 0;
        foreach ($arr_listings as $listing)
        {
//            var_dump($listing->crawler_listing_id);continue;
//            var_dump($listing->crawler_listing_link);exit;

            $count++;
            
            if($update == 1)
            {
                // Facho a chamada para a API do Viva Real
                $url = 'https://glue-api.vivareal.com/v2/listings?'
                        . '&categoryPage=RESULT'
                        . '&size=10'
                        . '&from=0'
                        . '&externalId='.$listing->crawler_listing_id;
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'x-domain: www.vivareal.com.br'
                ));
                $json_response = curl_exec($ch);
                $result = json_decode($json_response);
                if(isset($result->search->totalCount))
                {
                    $count_error = 0;
                    if($result->search->totalCount == 0)
                    {
                        $listing->delete_at = date('Y-m-d H:i:s');
                        $listing->crawler_status = 'INACTIVE';
                        $listing->unavailable = 1;
                        $listing->save();

                        $count_deleted++;
                        echo "#### ANÚNCIO DELETADO COM SUCESSO | ".$count_deleted." | ".$count." \n";
                    }
                    else
                    {
                        $crawler_json = $result->search->result->listings[0];
                        $result_listing = $crawler_json->listing;
//                        var_dump($result_listing->id);
                        $listing->crawler_status = $result_listing->status;
                        $listing->crawler_json = json_encode($crawler_json);
                        $listing->updated_at = date('Y-m-d H:i:s');
                        $listing->description = $result_listing->description;
                        $listing->title = $result_listing->title;

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

                        $listing->crawler_whatsappNumber = $result_listing->whatsappNumber;
                        $listing->unavailable = null;
                        $listing->save();
                        
                        //persist pricing obj
                        $price = $listing->crawler_price;
                        $yearlyIptu = @$result_listing->pricingInfos[0]->yearlyIptu;
                        $monthlyCondoFee = @$result_listing->pricingInfos[0]->monthlyCondoFee;
                        $listing_id = $listing->id;
                        $unit_type_id = $listing->unit_type_id;
                        $rental = $listing->crawler_businessType == "RENTAL" ? 1 : null;
                        $this->crawlerHelper->persistPricing($price, $yearlyIptu, $monthlyCondoFee, $listing_id, $unit_type_id, $rental);

                        $count_update++;
                        echo "#### ANÚNCIO ATUALIZADO COM SUCESSO | ".$count_update." | ".$count." \n";
                    }
                }
                else
                {
                    $info = curl_getinfo($ch);
                    if($info['http_code'] == 429)
                    {
                        echo "### ERROR: CODE: 429\n";
                        $count_error++;
                        sleep(60 *$count_error);
                    }
                    else
                    {
                        sleep(10);
                    }
                }
            }
            else
            {
                $url = 'https://www.zapimoveis.com.br/imovel/'.$listing->crawler_listing_id."/";
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//                curl_setopt($ch, CURLOPT_HEADER, 1);
//                curl_setopt($ch, CURLOPT_FAILONERROR, 1);
                $json_response = curl_exec($ch);
                
                // Verifico se a página do anúncio existe
                $info = curl_getinfo($ch);
                if($info['http_code'] == 429)
                {
                    $count_error++;
                    sleep(60 *$count_error);
                }
                
                if($info['http_code'] == 404)
                {
                    $listing->delete_at = date('Y-m-d H:i:s');
                    $listing->crawler_status = 'INACTIVE';
                    $listing->unavailable = 1;
                    $listing->save();
                    
                    $count_deleted++;
//                    echo "#### ANÚNCIO DELETADO COM SUCESSO | ".$count_deleted." | ".$count." \n";
                }
            }
            sleep(5);
        }
        
        
        // PRINTO O RESULTADO
        echo "#### TOTAL DE ANÚNCIOS VERIFICADOS | ".$count." \n";
        echo "#### TOTAL DE ANÚNCIOS DELETADOS | ".$count_deleted." \n";
        echo "#### TOTAL DE ANÚNCIOS ATUALIZADOS | ".$count_update." \n";
        
        
        // Finalizo o Timer e printo o tempo de execução
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        $output = sprintf('%02d:%02d:%02d', ($execution_time/ 3600),($execution_time/ 60 % 60), $execution_time% 60);
        echo "\n".$output;
    }
    
    
    
    /**
     * reviewEnterpriseListings
     * Função para incluir uma flag para os empreendimentos que tem anúncio
     * @return true 
     */
    public function reviewEnterpriseListings() 
    {  
        // Pego todos os empreendimentos que não tenham Estado, Cidade ou Bairro
        $enterprises = ORM::for_table("module_imobles_enterprise")
                        ->raw_query("SELECT * FROM module_imobles_enterprise "
                                    . "WHERE delete_at IS NULL AND has_listing IS NULL AND "
                                    . "(crawler_enterprise_id IS NOT NULL OR google_place_id IS NOT NULL OR verified IS NOT NULL)")
                        ->find_many();
//        var_dump(count($enterprises));exit;
        $count = 0;
        $count_total = 0;
        foreach ($enterprises as $enterprise)
        {
            $count_total++;
            $listings_aux = ORM::for_table("module_imobles_listings")
                            ->select("id")
                            ->where("entreprise_id", $enterprise->id)->find_one();
            if(isset($listings_aux->id))
            {
                $count++;
                $enterprise->has_listing = 1;
                $enterprise->save();
                echo $count." | ".$enterprise->id."\n";
            }
            echo $count_total."\n";
        }
    }
    
    
    /*
     * reviewEnterpriseImgs
     * Função para revisar as imagens dos empreendimentos
     * 
     */
    public function reviewEnterpriseImgs()
    {       
        $arr_listings = ORM::for_table("module_imobles_listings")
                        ->select('id')
                        ->select('crawler_listing_id')
                        ->select('crawler_listing_link')
                        ->select('unit_type_id')
                        ->select('entreprise_id')
                        ->where_not_null('crawler_json')
//                        ->where_gt('id', 14146)
                        ->find_many();
        $count = 0;
        $count_moved = 0;
        $count_duplicated = 0;
        $count_not_found = 0;
        $count_inserted = 0;
        $arr_enterprise_imgs = array();
        foreach ($arr_listings as $listing) 
        {
            // Verifico se já temos o diretorio de imagens do empreendimento
            $enterprise_id = $listing->entreprise_id;
            $listing_id = $listing->id;
            $enterprise_dir = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise_id . '/images';
            if (!is_dir($enterprise_dir)) 
            {
                mkdir($enterprise_dir, 0755, true);
            }

            // Pego todas as imagens do empreendimento
            if(!isset($arr_enterprise_imgs[$enterprise_id]))
            {
                $dir2 = new DirectoryIterator($enterprise_dir);  
                foreach ($dir2 as $item2) 
                {            
                    if ($item2->isFile() && !$item2->isDot()) 
                    {
                        $src = $item2->getFilename();
                        $arr_enterprise_imgs[$enterprise_id][] = $src;
                    }
                }
            }

            // Pego todas as imagens do anúncio
            $imgs = ORM::for_table('module_imobles_enterprise_imgs')
                                ->where('type','listing')
                                ->where('listing_id',$listing->id)
                                ->find_many();
            $arr_imgs_insert = array();
            $insert_imgs = false;
            foreach ($imgs as $img)
            {
                $count++;
                if(!in_array($img->src, $arr_enterprise_imgs[$enterprise_id]))
                {
                    $count_not_found++;
                    $insert_imgs = true;
                    
                    // Atualizo a imagem no BD
                    $img->module_imobles_enterprise_id = $enterprise_id;
                    $img->type = 'listing';
                    $img->delete_at = date('Y-m-d H:i:s');
                    $img->save();
                    echo "IMAGEM NÃO ENCONTRADA | ".$count_not_found."\n";
                }
                else
                {
                    echo "OK | ".$count."\n";
                }
            }

            if($insert_imgs === true)
            {
                $json_aux       = ORM::for_table("module_imobles_listings")->select("crawler_json")->find_one($listing->id);
                $json_listing   = json_decode($json_aux->crawler_json);
                $result_medias  = $json_listing->medias;
                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
                            {
                                $ext = substr($url, strlen($url)-3);
                                if($ext != 'png')
                                {
                                    $ext = 'jpg';
                                }

                                $name_aux = $listing_id."_".substr(md5(rand(1111,9999)),0,8).$this->crawlerHelper->getRandom().rand(1111,1000).rand(99,9999);
                                $name = $name_aux.".".$ext;
                                file_put_contents ($enterprise_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($enterprise_dir."/".$name);
//                                    $w=imagesx($jpg);
//                                    $h=imagesy($jpg);
//                                    $webp=imagecreatetruecolor($w,$h);
//                                    imagecopy($webp,$jpg,0,0,0,0,$w,$h);
//                                    imagewebp($webp, $enterprise_dir.'/'.$name_aux.".webp", 80);
//                                    imagedestroy($jpg);
//                                    imagedestroy($webp);
//                                }
                                $count_inserted++;
                                echo "IMAGEM CADASTRADA COM SUCESSO | ".$enterprise_dir."/".$name."\n";
                            } 
                            catch (Exception $ex) 
                            {
                                echo "ERROR ##### ".$ex->getMessage()." | ".$listing_id." | ".$url." | "."\n";
                            }
                        }
                    }
                }
            }
        }
        echo "TOTAL DE IMAGENS TRATADAS: ".$count."\n";
        echo "TOTAL DE IMAGENS MOVIDAS: ".$count_moved."\n";
        echo "TOTAL DE IMAGENS CADASTRADAS: ".$count_inserted."\n";
        echo "TOTAL DE IMAGENS DUPLICADAS: ".$count_duplicated."\n";
        echo "TOTAL DE IMAGENS NÃO ENCONTRADAS: ".$count_not_found."\n";
    }
    
    
    
    /*
     * wpGalleryImport
     * Função para importar a geleria de fotos dos empreendimentos no WordPress
     * 
     */
    public function wpGalleryImport($enterprise_id = null)
    {       
        $count = 0;
        $count_ent_gallery = 0;
        $count_inserted = 0;
        $arr_no_img = array();
        $count_ent_hot = 0;
        
        if($enterprise_id)
        {
            $enterprises = ORM::for_table("module_imobles_enterprise")
                ->where('id', $enterprise_id)
                ->find_many();
        }
        else
        {
            $enterprises = ORM::for_table("module_imobles_enterprise")
                ->where('imobles_client', 1)
                ->where_null("delete_at")
                ->where_not_null("wordpress_id")
                ->find_many();
        }
        
        foreach ($enterprises as $enterprise)
        {
            if($enterprise->wordpress_id <= 0)
            {
                continue;
            }
            $count++;
            $enterprise_id = $enterprise->id;
            
            // Pegos os dados do empreendimento
            $url = "https://imobles.com/wp-json/wp/v2/realty/".$enterprise->wordpress_id;
            $json_google = curl_init($url);
            curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
            $json_response = curl_exec($json_google);
            $result = json_decode($json_response);
            
            if(!$result)
            {
                echo "SITE NÃO ENCONTRADO | ".$enterprise_id." | ".$url."\n";
//                sleep(10);
                var_dump($json_response);
                exit;
            }
            $gallery_ok = true;
            
            if(!isset($result->link))
            {
                echo "LINK NÃO ENCONTRADO | ".$enterprise_id." | ".$url."\n";
                continue;
            }
            $link_empreendimento = $result->link;
            
            
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $link_empreendimento);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            $res = curl_exec($ch);
            curl_close($ch);

            // DOM
            $dom = new DomDocument();
            @ $dom->loadHTML($res);

            // Pego todos os links da página
            $links = $dom->getElementsByTagName('a');
            $count_imgs = 0;
            foreach($links as $link) 
            {
                if($link->textContent === "   ")
                {
                    $url = $link->getAttribute('href');
                    $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                                    ->where('name', $url)
                                    ->where('module_imobles_enterprise_id', $enterprise_id)
                                    ->find_one();
                    if(!isset($arr_imgs_aux->id))
                    {   
                        $insert_img = $this->crawlerHelper->insertEnterpriseImg($url, $enterprise_id, 'backend', ["10"], true);
                        echo "OK | IMAGEM INSERIDA | HOTSITE |  ".$enterprise_id." | ".$url."\n";
                    }
                    else
                    {
                        echo "IMAGEM DUPLICADA HOTSITE | ".$enterprise_id." | ".$url."\n";
                    }
                    $count_imgs++;
                }
            }
//            echo $enterprise_id." | ".$count_ent_hot." | HOTSITE tratado\n";
            
            
            if($count_imgs == 0)
            {
                if(!empty($result->wealty_rlty_gallery))
                {
                    $count_ent_gallery++;
                    foreach ($result->wealty_rlty_gallery as $gallery)
                    {
                        $url_gallery = "https://imobles.com/wp-json/wp/v2/media/".$gallery;
                        $json_gallery = curl_init($url_gallery);
                        curl_setopt($json_gallery, CURLOPT_RETURNTRANSFER, true);
                        $json_response = curl_exec($json_gallery);
                        $result = json_decode($json_response);

                        if(isset($result->guid->rendered))
                        {
                            $url = $result->guid->rendered;
                            $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                                            ->where('name', $url)
                                            ->where('module_imobles_enterprise_id', $enterprise_id)
                                            ->find_one();
                            if(!isset($arr_imgs_aux->id))
                            {   
                                $insert_img = $this->crawlerHelper->insertEnterpriseImg($url, $enterprise_id, 'backend', false, true);
                                echo "OK | IMAGEM INSERIDA | FICHA | ".$enterprise_id." | ".$url."\n";
                            }
                            else
                            {
                                echo "IMAGEM DUPLICADA | ".$enterprise_id." | ".$url."\n";
                            }
                        }
                        else 
                        {
                            $gallery_ok = false;
                            echo "IMAGEEM  NÃO ENCONTRADA NA GALERIA | ".$url_gallery."\n";
                        }
                    }
                }
            }
            else
            {
                $count_ent_hot++;
            }
        }
        echo $count." | Empreendimentos tratados\n";
        echo $count_ent_gallery." | Empreendimentos Com galeria tratados\n";
        echo $count_ent_hot." | Empreendimentos Com Hotsite tratados\n";
    }
    
    
    /*
     * importImgDrive
     * Função para sanitizar os bairros dos empreendimentos
     * 
     */
    public function importImgDrive()
    {       
        
        // Verifico se já temos o diretorio de imagens do empreendimento
        $imgs_dir = 'application/plugins/module_imobles/Imagens_BKP';

        $dir = new DirectoryIterator($imgs_dir);  
        foreach ($dir as $item) 
        {   
            if ($item->isDir() && !$item->isDot()) 
            {
                $enterprise_name = trim($item->getFilename());
                $enterprise = ORM::for_table("module_imobles_enterprise")
                        ->select_many("id","name")
                        ->where("name", $enterprise_name)
                        ->where("imobles_client", 1)
                        ->where_null("delete_at")->find_one();
                if(!isset($enterprise->id))
                {
                    echo "EMPREENDIMENTO NÃO ENCONTRADO: ".$enterprise_name."\n";
                    continue;
                }
                
                $arr_emp = ["Brilhante", "Carvalhais de Manre", "Maestro Residenza", "Reserva do Parque", 
                            "Terrazzo Vila Rosa", "The Sun Luxury Style", "Vereda Areião", "Vox Home"];
                if(!in_array($enterprise->name, $arr_emp))
                {
//                    continue;
                }

                echo $enterprise->name." | ".$enterprise->id."\n";

                $dir2 = new DirectoryIterator($item->getPathname());  
                foreach ($dir2 as $item2) 
                {
                    if ($item2->isDir() && !$item2->isDot()) 
                    {
                        $resize = false;
                        $tag = trim($item2->getFilename());
                        if($tag === "DEVELOPMENT_GALLERY_IMGS")
                        {
                            continue;
                        } 
                        elseif($tag == "DEVELOPMENT_FEATURED")
                        {
                            $resize = true;
                        }

                        // Verifico se já tem alguma imagem com essa TAG cadastrada para o empreendimento
                        $tag_aux = ORM::for_table("module_imobles_enterprise_img_backend_tags")->where("name", $tag)->find_one();
                        if(!isset($tag_aux->id))
                        {
                            echo "TAG NÃO ENCONTRADA: ".$tag."\n";
                            continue;
                        }
                        $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                                ->where('tags', '["'.$tag_aux->id.'"]')
                                ->where('module_imobles_enterprise_id', $enterprise->id)
                                ->find_many();

                        if(count($arr_imgs_aux))
                        {
                            foreach ($arr_imgs_aux as $img)
                            {
                                $dir_img = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise->id . '/images';
                                if(is_file($dir_img."/".$img->src))
                                {
                                    unlink($dir_img."/".$img->src);
                                    
                                    $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);
                                    $arr_img_size["thumb"] = array("w" => 120,"h" => 80);
                                    foreach ($arr_img_size as $k => $v)
                                    {
                                        if(is_file($dir_img."/".$k."/".$img->src))
                                        {
                                                unlink($dir_img."/".$k."/".$img->src);
                                        }
                                    }
                                }
                                $img->delete();
                                echo "IMAGEM DELETADA | ".$enterprise->name." | ".$enterprise->id." | ".$dir_img."/".$img->src."\n";
                            }
                        }


                        $dir3 = new DirectoryIterator($item2->getPathname());  
                        foreach ($dir3 as $item3) 
                        {
                            if ($item3->isFile() && !$item3->isDot()) 
                            {
                                $ext = $item3->getExtension();
                                if($ext === "ini")
                                {
                                    continue;
                                }
                                $name   = $item3->getFilename();
                                $path   = $item3->getPath();
                                $title  = explode(".", $name);
                                $title  = $title[0];
                                $title  = trim(preg_replace("/\(([^)]+)\)/", "", $title));
                                
                                // Insiro a imagem para o empreendimento
                                $img_path = $path."/".$name;
                                $insert_img = $this->crawlerHelper->insertEnterpriseImg($img_path, $enterprise->id, 'backend', [$tag_aux->id], false, $title, $resize);
                                echo "IMAGEM INSERIDA | ".$enterprise->name." | ".$enterprise->id."\n";
                            }
                        }
                    }
                }
            }
            if ($item->isFile() && !$item->isDot()) 
            {
                $src = $item->getFilename();
                $arr_enterprise_imgs[$enterprise_id][] = $src;
            }
        }
    }
    
    
    /*
     * reviewThumbs
     * Função para revisar os thumbs das imagens dos empreendimentos
     * 
     */
    public function reviewThumbs()
    {       
        $enterprises = ORM::for_table("module_imobles_enterprise")
                ->where('imobles_client', 1)
                ->where_null("delete_at")
                ->where_not_null("wordpress_id")
                ->find_many();
        
        foreach ($enterprises as $enterprise)
        {
            if($enterprise->wordpress_id <= 0)
            {
                continue;
            }
            $enterprise_id = $enterprise->id;
            
            $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                    ->where('tags', '["10"]')
                    ->where('module_imobles_enterprise_id', $enterprise->id)
                    ->find_many();

            if(count($arr_imgs_aux))
            {
                foreach ($arr_imgs_aux as $img)
                {
                    $dir_img = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise->id . '/images';
                    if(is_file($dir_img."/".$img->src))
                    {
                        $file_img = $dir_img."/".$img->src;
                        $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);
                        $arr_img_size["thumb"] = array("w" => 120,"h" => 80);
                        foreach ($arr_img_size as $k => $v)
                        {
                            if(!is_file($dir_img."/".$k."/".$img->src))
                            {
                                if(!is_dir($dir_img.'/'.$k)) 
                                {
                                        mkdir($dir_img.'/'.$k, 0755, true);
                                }
                                $file_img_cp = $dir_img.'/'.$k.'/'.$img->src;
                                copy($file_img, $file_img_cp);
                                $resize_img = $this->crawlerHelper->resizeImg($file_img_cp, $v["w"], $v["h"]);
                                
                                echo "MINIATURA CRIADA | ".$enterprise->name." | ".$enterprise->id." | ".$k."\n";
                            }
                            else
                            {
//                                echo "MINIATURA JÁ EXISTENTE | ".$enterprise->name." | ".$enterprise->id." | ".$k."\n";
                            }
                        }
                    }
                    else
                    {
                        $img->delete();
                        echo "IMAGEM DELETADA | ".$enterprise->name." | ".$enterprise->id." | ".$dir_img."/".$img->src."\n";
                    }
                }
            }
        }
    }
    
    
    /*
     * wpGalleryImportPlant
     * Função para importar a geleria de fotos dos empreendimentos no WordPress
     * 
     */
    public function wpGalleryImportPlant($enterprise_id = null)
    {       
        $count = 0;
        $count_ent_gallery = 0;
        $count_inserted = 0;
        $arr_no_img = array();
        $count_ent_hot = 0;
        
        if($enterprise_id)
        {
            $enterprises = ORM::for_table("module_imobles_enterprise")
                ->where('id', $enterprise_id)
                ->find_many();
        }
        else
        {
            $enterprises = ORM::for_table("module_imobles_enterprise")
                ->where('imobles_client', 1)
                ->where_null("delete_at")
                ->where_not_null("wordpress_id")
                ->find_many();
        }
        
        foreach ($enterprises as $enterprise)
        {
            if($enterprise->wordpress_id <= 0)
            {
                continue;
            }
            $count++;
            $enterprise_id = $enterprise->id;
            
            // Pegos os dados do empreendimento
            $url = "https://imobles.com/wp-json/wp/v2/realty/".$enterprise->wordpress_id;
            $json_google = curl_init($url);
            curl_setopt($json_google, CURLOPT_RETURNTRANSFER, true);
            $json_response = curl_exec($json_google);
            $result = json_decode($json_response);
            if(!$result)
            {
                echo "SITE NÃO ENCONTRADO | ".$enterprise_id." | ".$url."\n";
//                sleep(10);
                var_dump($json_response);
                exit;
            }
            
            if(!isset($result->link))
            {
                echo "LINK NÃO ENCONTRADO | ".$enterprise_id." | ".$url."\n";
                continue;
            }
            $link_empreendimento = $result->link;
            
            $dir = 'application/plugins/module_imobles/uploads/enterprise/' . $enterprise_id . '/images/';
            if (!is_dir($dir)) {
                mkdir($dir, 0755, true);
            }
            
            // Verifico se tem planta no tema
            $arr_unit_type_plans = array();
            if(isset($result->wealty_rlty_floorplan) && !empty($result->wealty_rlty_floorplan))
            {
                $floorplans = $result->wealty_rlty_floorplan;
                foreach($floorplans as $floorplan)
                {
                    if(!empty($floorplan->floorplanarea) && !empty($floorplan->image) && !empty($floorplan->floorplanquartos))
                    {
                        $url_gallery = "https://imobles.com/wp-json/wp/v2/media/".$floorplan->image;
                        $json_gallery = curl_init($url_gallery);
                        curl_setopt($json_gallery, CURLOPT_RETURNTRANSFER, true);
                        $json_response = curl_exec($json_gallery);
                        $result = json_decode($json_response);

                        if(isset($result->guid->rendered))
                        {
                            $url = $result->guid->rendered;
                            $image_aux = file_get_contents($url);
                            if($image_aux)
                            {
                                // Pego o Unit Type
                                $area = preg_replace("/[^0-9]/", "",trim($floorplan->floorplanarea));
                                $rooms = preg_replace("/[^0-9]/", "",trim($floorplan->floorplanquartos));

                                $unit_type_aux = ORM::for_table('module_imobles_enterprise_units_type')
                                                ->where('number_rooms', intval($rooms))
                                                ->where_lte('area', intval($area) + 1)
                                                ->where_gte('area', intval($area) - 1)
                                                ->where('module_imobles_enterprise_id', $enterprise_id)
                                                ->where('crawler_type_id', 4)
                                                ->where_null("delete_at")
                                                ->find_one();
                                if(isset($unit_type_aux->id))
                                {
                                    $unit_type_id = $unit_type_aux->id;

                                    $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                                                    ->where('name', $url)
                                                    ->where('module_imobles_enterprise_id', $enterprise_id)
                                                    ->where('unit_type_id', $unit_type_id)
                                                    ->find_one();
                                    if(isset($arr_imgs_aux->id))
                                    {   
                                        unlink($dir . "/" . $arr_imgs_aux->src);
                                        $arr_imgs_aux->delete();
                                        echo "###################### IMAGEM DELETADA COM SUCESSO: ".$enterprise_id." | ".$url."\n";
                                    }

                                    // Deleto as plantas já cadastradas para o tipo de unidade
                                    $planta_aux = ORM::for_table('module_imobles_enterprise_imgs')
                                                    ->where('unit_type_id', $unit_type_aux->id)
                                                    ->where('tags', '["4"]')
                                                    ->find_many();
                                    if(count($planta_aux) > 0)
                                    {
                                        foreach ($planta_aux as $planta)
                                        {
                                            unlink($dir . "/" . $planta->src);
                                            $planta->delete();
                                            echo "###################### PLANTA DELETADA COM SUCESSO: ".$enterprise_id." | ".$planta->src."\n";
                                        }
                                    }

                                    // Insiro a imagem da planta
                                    $insert_img = $this->crawlerHelper->insertEnterpriseImg($url, $enterprise_id, 'backend', ["4"], false, null, true, $unit_type_id);
                                    echo "OK | IMAGEM INSERIDA | FICHA | ".$enterprise_id." | ".$url."\n";
                                    $arr_unit_type_plans[] = $unit_type_id;
                                }
                                else
                                {
                                    echo "ERROR | TIPO DE UNIDADE NÃO ENCONTRADA: EMPREENDIMENTO: ".$enterprise_id." | ÁREA: ".$area." | QUARTOS: ".$rooms." \n";
                                }
                            }
                            else
                            {
                                echo "IMAGEM  NÃO ENCONTRADA NA GALERIA | ".$url_gallery."\n";
                            }
                        }
                        else 
                        {
                            echo "IMAGEM  NÃO ENCONTRADA NA GALERIA | ".$url_gallery."\n";
                        }
                    }
                }
            }
            
            // pego todos os tipos de unidade do empreendimento
            $unit_type_aux = ORM::for_table('module_imobles_enterprise_units_type')
                            ->where('crawler_type_id', 4)
                            ->where_null("delete_at")
                            ->where('module_imobles_enterprise_id', $enterprise_id)
                            ->find_many();
            
            $find_hotsite = false;
            foreach ($unit_type_aux as $unit_type)
            {
                if(!in_array($unit_type->id, $arr_unit_type_plans))
                {
                    echo "ERROR | TIPO DE UNIDADE NÃO ENCONTRADA: EMPREENDIMENTO: ".$enterprise_id." | ÁREA: ".$unit_type->area." | QUARTOS: ".$unit_type->number_rooms." \n";
                    $find_hotsite = true;
                }
            }
            
            if($find_hotsite === true)
            {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $link_empreendimento);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                $res = curl_exec($ch);
                curl_close($ch);

                $dom = new DomDocument();
                @ $dom->loadHTML($res);
                $xpath = new DOMXpath($dom);
                $tables = $xpath->query('//ul [@class="vc_tta-tabs-list"]');
                if(isset($tables[0]->childNodes))
                {
                    $tabs = $tables[0]->childNodes;
                    foreach ($tabs as $tab)
                    {
                        $unit = mb_strtolower($tab->textContent);
                        
                        // Pego os quartos
                        $pattern = "/(quarto)/";
                        $arr_unit = preg_split($pattern, $unit);
                        $rooms = preg_replace("/[^0-9]/", "",trim($arr_unit[0]));
                        
                        // Pego a área
                        $pattern = "/\(([^)]+)\)/";
                        preg_match($pattern, $arr_unit[1], $area, PREG_OFFSET_CAPTURE);
                        $area_aux = explode("m", trim($area[1][0]));
                        
                        if(count($area_aux) == 2)
                        {
                            $area = $area_aux[0];
                        }
                        else
                        {
                            echo "ERROR | ÁREA NÃO ENCONTRADA NO HOTSITE: ".$link_empreendimento."\n";
                            continue;
                        }
                        
                        $unit_type_aux = ORM::for_table('module_imobles_enterprise_units_type')
                                        ->where('number_rooms', intval($rooms))
                                        ->where_lte('area', intval($area) + 1)
                                        ->where_gte('area', intval($area) - 1)
                                        ->where('module_imobles_enterprise_id', $enterprise_id)
                                        ->where('crawler_type_id', 4)
                                        ->where_null("delete_at")
                                        ->find_one();
                        if(isset($unit_type_aux->id))
                        {
                            $unit_type_id = $unit_type_aux->id;
                        
                            $id = substr($tab->firstChild->getAttribute("href"), 1);
                            $container = $dom->getElementById($id);
                            $arr = $container->getElementsByTagName("img");
                            foreach ($arr as $img)
                            {

                                    $url = $img->attributes[2]->textContent;
                                    $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                                                    ->where('name', $url)
                                                    ->where('module_imobles_enterprise_id', $enterprise_id)
                                                    ->where('unit_type_id', $unit_type_id)
                                                    ->find_one();
                                    if(isset($arr_imgs_aux->id))
                                    {   
                                        unlink($dir . "/" . $arr_imgs_aux->src);
                                        $arr_imgs_aux->delete();
                                        echo "###################### IMAGEM DELETADA COM SUCESSO: ".$enterprise_id." | ".$url."\n";
                                    }

                                    // Deleto as plantas já cadastradas para o tipo de unidade
                                    $planta_aux = ORM::for_table('module_imobles_enterprise_imgs')
                                                    ->where('unit_type_id', $unit_type_aux->id)
                                                    ->where('tags', '["4"]')
                                                    ->find_many();
                                    if(count($planta_aux) > 0)
                                    {
                                        foreach ($planta_aux as $planta)
                                        {
                                            unlink($dir . "/" . $planta->src);
                                            $planta->delete();
                                            echo "###################### PLANTA DELETADA COM SUCESSO: ".$enterprise_id." | ".$planta->src."\n";
                                        }
                                    }

                                    // Insiro a imagem da planta
                                    $insert_img = $this->crawlerHelper->insertEnterpriseImg($url, $enterprise_id, 'backend', ["4"], false, null, true, $unit_type_id);
                                    echo "OK | IMAGEM INSERIDA | HOTSITE | ".$enterprise_id." | ".$url."\n";
                            }
                        }
                        else
                        {
                            echo "ERROR | TIPO DE UNIDADE NÃO ENCONTRADA | HOTSITE: EMPREENDIMENTO: ".$enterprise_id." | ÁREA: ".$area." | QUARTOS: ".$rooms." \n";
                        }
                    }
                }
            }
            
        }
        echo $count." | Empreendimentos tratados\n";
        echo $count_ent_gallery." | Empreendimentos Com galeria tratados\n";
        echo $count_ent_hot." | Empreendimentos Com Hotsite tratados\n";
    }
    
    
    /*
     * reviewBackendImgs
     * Função para revisar todas as imagens dos empreendimentos
     * 
     */
    public function reviewBackendImgs()
    {
//        $file_img = 'application/plugins/module_imobles/uploads/enterprise/1111/images/_0599ed8c260106161833401210997286.jpg';
////        $image = file_get_contents($dir_img);
//        
////        $file_img = "https://imobles.lrsys.com.br/application/plugins/module_imobles/uploads/enterprise/21102/images/xxl/_e846fb8a081253162499503310586349.webp";
//        $original_size = filesize($file_img);
//        $info = getimagesize($file_img);
//        
//        var_dump($original_size);
//        var_dump($info);
//        exit;
        
        $enterprises = ORM::for_table("module_imobles_enterprise")
                ->where('site_enabled', 1)
//                ->where('id', 26145)
                ->where_null("delete_at")
                ->find_many();
        
        foreach ($enterprises as $enterprise)
        {
            $enterprise_id = $enterprise->id;
            
            $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                    ->where('type', 'backend')
                    ->where('module_imobles_enterprise_id', $enterprise->id)
                    ->find_many();

            if(count($arr_imgs_aux))
            {
                foreach ($arr_imgs_aux as $img)
                {
                    if(!$img->tags)
                    {
                        continue;
                    }
                    
                    
                    $tags = json_decode($img->tags);
                    
                    // verifico se tem miniatura
                    $resize = false;
                    foreach ($tags as $tag)
                    {
                        if(in_array(intval($tag), [1,3,10, 4, 6, 7, 8, 11, 15, 16, 23, 24, 25]))
                        {
                            $resize = true;
                        }
                    }

                    // verifico se tem thumb
                    $thumb = false;
                    foreach ($tags as $tag)
                    {
                        if(in_array(intval($tag), [10]))
                        {
                            $thumb = true;
                        }
                    }
                    
                    
                    // Defino a qualidade de compressão
                    $quality = 80;
                    if(in_array("4", json_decode($img->tags)) || in_array("6", json_decode($img->tags)))
                    {
                        $quality = 90;
                    }
                    
                    // Verifico se tem resize
                    $resize = false;
                    if(in_array(4, json_decode($img->tags)) || in_array(10, json_decode($img->tags)) || in_array(6, json_decode($img->tags)))
                    {
                        $resize = true;
                    }
                    
                    $img_src = $img->src;
                    $dir_img = 'application/plugins/module_imobles/uploads/enterprise/'.$enterprise->id.'/images';
                    if(is_file($dir_img."/".$img->src))
                    {
                        
                        $upload = $this->crawlerHelper->insertUploadedImg($img_src, $enterprise_id, "backend", null, $thumb, null, $resize, null, null, null, $img->id);
                        
                        if($upload === true)
                        {
                            echo "IMAGEM ATUALIZADA COM SUCESSO | ".$enterprise->name." | ".$enterprise->id." | ".$dir_img."/".$img->src."\n";
                        }
                        else
                        {
                            echo "####### ERRO ########## | ".$enterprise->name." | ".$enterprise->id." | ".$dir_img."/".$img->src."\n";
                            
                        }
                    }
                    else
                    {
//                        $img->delete();
                        echo "IMAGEM DELETADA | ".$enterprise->name." | ".$enterprise->id." | ".$dir_img."/".$img->src."\n";
//                        exit;
                        
                    }
                }
            }
        }
        echo "######### FIM ############";
    }
    
    
    /*
     * reviewBackendImgsPlant
     * Função para revisar todas as imagens das plantas dos empreendimentos que não tem minuaturas
     * 
     */
    public function reviewBackendImgsPlant()
    {
        
        $enterprises = ORM::for_table("module_imobles_enterprise")
                ->where('site_enabled', 1)
                ->where_null("delete_at")
                ->find_many();
        
        foreach ($enterprises as $enterprise)
        {
            $enterprise_id = $enterprise->id;
            
            $arr_imgs_aux = ORM::for_table('module_imobles_enterprise_imgs')
                    ->where('type', 'backend')
                    ->where_not_null("unit_type_id")
                    ->where_null("delete_at")
                    ->where('module_imobles_enterprise_id', $enterprise->id)
                    ->find_many();

            if(count($arr_imgs_aux))
            {
                foreach ($arr_imgs_aux as $img)
                {
                    // Defino a qualidade de compressão
                    $quality = 90;
                    if(!in_array(4, json_decode($img->tags)) || $img->resized == 1)
                    {
                        continue;
                    }
                    
                    // Verifico se tem resize
                    $resize = true;
                    
                    
                    $img_src = $img->src;
                    $dir_img = 'application/plugins/module_imobles/uploads/enterprise/'.$enterprise->id.'/images';
                    if(is_file($dir_img."/".$img->src))
                    {
                        $file_arr = explode(".", $img->src);
                        $file_name = $file_arr[0];
                        $file_img = $dir_img."/".$img->src;
                        $original_size = filesize($file_img);
                        $info = getimagesize($file_img);
                        $overwrite = false;
                        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;
                        }
                        
                        // Crio a nova imagem
                        $file_aux = $dir_img."/".$file_name."_aux.jpg";
                        imagejpeg($image, $file_aux, $quality);
                        $this->crawlerHelper->resizeImg($file_aux, 1200, 840);
                        
                        // 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);
                        }
                        
                        // Atualizo o src da imagem
                        $img->src = $file_name.".jpg";
                        $img->updated_at = date('Y-m-d H:i:s');
                        $img->save();
                        echo "IMAGEM ATUALIZADA COM SUCESSO | ".$img->src." \n";
                        
                        // 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);
                        $img->webp = 1;
                        $img->save();
                        
                        imagedestroy($webp);
                        imagedestroy($image);
                        
                        
                        // Verifico as miniaturas
                        $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);
                        foreach ($arr_img_size as $k => $v)
                        {
                            if(!is_file($dir_img."/".$k."/".$img_src))
                            {
                                if(!is_dir($dir_img.'/'.$k)) 
                                {
                                        mkdir($dir_img.'/'.$k, 0755, true);
                                }
                            }
                            else
                            {
//                                unlink($dir_img."/".$k."/".$img_src);
                                echo "MINIATURA JÁ EXISTENTE | ".$enterprise->name." | ".$enterprise->id." | ".$k."\n";
                                break;
                            }
                            
                            // Crio a minuatura nova
                            if($resize === true)
                            {
                                $file_img_cp = $dir_img.'/'.$k.'/'.$img->src;
                                copy($dir_img.'/'.$img->src, $file_img_cp);
                                $resize_img = $this->crawlerHelper->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);
                            }
                        }
                        
                        $img->resized = 1;
                        $img->save();
                        echo "MINIATURA CRIADA | ".$enterprise->name." | ".$enterprise->id." | ".$k."\n";
                        
                    }
                    else
                    {
//                        $img->delete();
                        echo "IMAGEM DELETADA | ".$enterprise->name." | ".$enterprise->id." | ".$dir_img."/".$img->src."\n";
//                        exit;
                        
                    }
                }
            }
        }
    }

    public function import_csv(){
        $this->crawlerHelper->importCsv();
    }


    /*
     * reviewEnterpriseUrl
     * Função para alterar o padrão das URLs dos empreendimentos
     * 
     */
    public function reviewEnterpriseUrls()
    {
        $enterprises = ORM::for_table("module_imobles_enterprise")
                ->where('site_enabled', 1)
                ->where_null("delete_at")
                // ->where_null("slug")
                ->find_many();
        foreach ($enterprises as $enterprise)
        {
            $sanitize_name = $this->crawlerHelper->sanitizaUrl($enterprise->name);
            $city = ORM::for_table('city')->find_one($enterprise->address_city_id);
            if ($city) 
            {
                $city_sanitized = $this->crawlerHelper->sanitizaUrl($city->city_name);
            }
            else
            {
                echo "Erro: Cidade não encontrada";exit;
            }

            $state = ORM::for_table("state")->find_one($enterprise->address_state_id);
            if ($state) 
            {
                $state_sanitized = $this->crawlerHelper->sanitizaUrl($state->uf_state);
            }
            else
            {
                echo "Erro: Estado não encontrado";exit;
            }

            $development_slug = "apartamento-venda-".$sanitize_name."-".$city_sanitized."-".$state_sanitized;
            $check_slug = ORM::for_table("module_imobles_enterprise")
                        ->where_not_in('id',[$enterprise->id])
                        ->where("slug", $enterprise->slug)
                        ->find_one();
            if(isset($check_slug->id) && $check_slug->id > 0)
            {
                echo "Slug Duplicada.".$enterprise->id." | ".$enterprise->slug."\n";
            }
            else
            {
                $site_url = "https://myside.com.br/".$development_slug;
                if($enterprise->site_url != $site_url)
                {
                    echo $site_url."\n";
                    echo $enterprise->site_url."\n\n";
                    $enterprise->slug = $development_slug;
                    $enterprise->site_url = $site_url;
                    $enterprise->save();
                }
            }
        }
    }

    /*
     * reviewCompanyConstructionUrls
     * Função para alterar o padrão das URLs das Construtoras
     * 
     */
    public function reviewCompanyConstructionUrls()
    {
        $enterprises = ORM::for_table("module_imobles_company_construction")
                ->where_null("delete_at")
                ->find_many();
        foreach ($enterprises as $enterprise)
        {
            $sanitize_name = $this->crawlerHelper->sanitizaUrl($enterprise->name);

            if(empty($enterprise->city_id))
            {
                $enterprise->city_id = 5418;
            }
            $city = ORM::for_table('city')->find_one($enterprise->city_id);
            if ($city) 
            {
                $city_sanitized = $this->crawlerHelper->sanitizaUrl($city->city_name);
            }
            else
            {
                echo "Erro: Cidade não encontrada";exit;
            }

            if(empty($enterprise->state_id))
            {
                $enterprise->state_id = 9;
            }
            $state = ORM::for_table("state")->find_one($enterprise->state_id);
            if ($state) 
            {
                $state_sanitized = $this->crawlerHelper->sanitizaUrl($state->uf_state);
            }
            else
            {
                echo "Erro: Estado não encontrado";exit;
            }

            $development_slug = "apartamentos-venda-construtora-".$sanitize_name."-".$city_sanitized."-".$state_sanitized;
            $enterprise->slug = $development_slug;
            $enterprise->site_url = "https://myside.com.br/".$development_slug;
            $check_slug = ORM::for_table("module_imobles_company_construction")->where("slug", $enterprise->slug)->find_one();
            if(isset($check_slug->id) && $check_slug->id > 0)
            {
                echo "Slug Duplicada.".$enterprise->id." | ".$enterprise->slug."\n";
            }
            else
            {
                $enterprise->save();
            }
        }
    }


    /**
     * reveiwDynamicUrls
     * Função para revisar as URLs dinâmicas geradas via Rocket para o Sitemap
     * @param  
     * @return Boolean 
     */
    public function reveiwDynamicUrls() 
    {   
        $dynamic_urls = ORM::for_table("module_imobles_dynamic_urls")
                ->where_null("deleted_at")
                ->find_many();
        $foo = -1;
        $data = array();
        foreach ($dynamic_urls as $dyn) 
        {
            if (preg_match("/construtora/i", $dyn->url)) 
            {
                $dyn->delete();
                echo $dyn->url." DELETADA\n";
            }
        }


        @ini_set('memory_limit', '40095M');
        @ini_set('max_execution_time', 0);
        @set_time_limit(0);
        
        // pego o CSV da Campanha
        $doc = ORM::for_table('sys_documents')->where('title', 'sitemap_urls')->order_by_desc('id')->find_one();
        if($doc){

            $file = 'application/storage/docs/'.$doc->file_path;
        }
        else
        {
            echo "NENHUMA CAMPANHA ENCONTRADA";
            exit;
        }
        $csv = new parseCSV();
        $csv->auto($file);
        $urls = $csv->data;
        $count = 0;
        $countTotal = 0;
        foreach ($urls as $url) 
        {
            $countTotal++;

            $dynamic_url = ORM::for_table("module_imobles_dynamic_urls")
                ->where("url", trim($url["DE"]))
                ->find_one();
            if($dynamic_url && $dynamic_url->id > 0)
            {
                echo $dynamic_url->url." | OLD | ";
                $dynamic_url->url = trim($url["PARA"]);
                $dynamic_url->updated_at = date('Y-m-d H:i:s');
                $dynamic_url->save();
                echo $dynamic_url->url." | NEW\n";
            }
            else
            {
                echo trim($url["DE"])." | NÃO ENCONTRADA\n";
            }
            // $number = trim($url["Telefone"]);


        }
    }
}

Anon7 - 2022
AnonSec Team