shell bypass 403
<?php
App::uses('AdminController', 'Controller');
App::import('Vendor', 'Inmovilla/apiinmovilla');
class AdminImportacionController extends AdminController {
public function beforeFilter() {
parent::beforeFilter();
array_push($this->uses, 'Provincia', 'Localidad', 'Zona', 'InmuebleTipo', 'InmuebleGestion', 'InmuebleEstado', 'Mapeo', 'Vivienda', 'ViviendaGaleria', 'Fuente');
$this->set('fuentes', $this->Fuente->find('list', array('fields' => array('id', 'nombre'), 'order' => 'nombre ASC')));
$this->set('estados', $this->InmuebleEstado->find('list', array('fields' => array('id', 'nombre'), 'order' => 'nombre ASC')));
$this->set('tipologias', $this->InmuebleTipo->find('list', array('fields' => array('id', 'nombre'), 'order' => 'nombre ASC')));
$provincies = $this->Provincia->find('list', array('fields' => array('id', 'nombre'), 'order' => array('nombre ASC')));
$this->set('provincies', $provincies);
/* PEDIMOS LAS LOCALIDADES AGRUPADAS POR PROVINCIA (array asociativo provincia => array(id,nombre) PARA GENERAR optiongroups en dropdownlist */
$localidades = $this->Localidad->find('all', array('fields' => array('Localidad.id', 'Localidad.provincia_id', 'Localidad.nombre'), 'order' => array('Localidad.nombre ASC', 'Localidad.provincia_id ASC')));
$zon = $this->Zona->find('all', array('fields' => array('Zona.id', 'Zona.localidad_id', 'Zona.nombre'), 'conditions' => array('localidad_id >' => 0), 'order' => array('Zona.nombre ASC', 'Zona.localidad_id ASC')));
$poblaciones = array();
$zonas = array();
if ($localidades) {
foreach ($localidades as $poblacion) {
$poblaciones[$poblacion['Localidad']['id']] = "{$poblacion['Localidad']['nombre']} ({$provincies[$poblacion['Localidad']['provincia_id']]})";
}
}
if ($zon) {
foreach ($zon as $zona) {
$zonas[$zona['Zona']['id']] = "{$zona['Zona']['nombre']}, {$poblaciones[$zona['Zona']['localidad_id']]}";
}
}
$this->set('poblaciones', $poblaciones);
$this->set('zonas', $zonas);
}
public function home() {
$console = false;
if ($this->request->is('get') && isset($this->request->query['action'])) {
$source = (isset($this->request->query['source']) ? $this->request->query['source'] : 'inmovilla');
switch ($this->request->query['action']) {
case 'estados':
$this->estados($source);
$console = true;
break;
case 'tipos':
$this->tipos($source);
$console = true;
break;
case 'provincias':
$this->provincias($source);
$console = true;
break;
case 'poblaciones':
$this->localidades($source);
$console = true;
break;
case 'zonas':
$this->zonas();
$console = true;
break;
case 'inmuebles':
$this->inmuebles($source);
$console = true;
break;
}
}
$filtro = array(
'dato' => false,
'tabla' => Configure::read('Mapeo.tablas'),
'fuente_id' => false
);
$this->set('filtro', $filtro);
// $this->getListado('Mapeo', 20, array('Mapeo.id' => 'DESC'));
$this->getListado('Mapeo', 20, array('Mapeo.tabla_id' => 'DESC'), $this->getConditionsFiltro($filtro, array(), 'Mapeo'));
$this->set('console', $console);
$this->renderView();
}
public function edit() {
$this->Mapeo->id = $this->params->id;
if (!$this->Mapeo->exists()) {
throw new NotFoundException('Mapeo no encontrado');
}
$mapeo = $this->Mapeo->read(null, $this->Mapeo->id);
if ($this->request->is('put') || $this->request->is('post')) {
$this->Mapeo->create();
$this->Mapeo->id = $this->params->id;
if ($this->Mapeo->saveField('tabla_id', $this->request->data['Mapeo']['tabla_id'])) {
$this->Session->setFlash('Mapeo actualizado con éxito.' . $this->btnClose, 'default', array('class' => 'alert alert-success'));
$this->redirect(array('controller' => 'admin_importacion', 'action' => 'edit', 'id' => $this->Mapeo->id, 'tab' => $this->params->tab));
} else {
$this->errores = $this->Mapeo->validationErrors;
}
} else {
$this->request->data = $mapeo;
}
$this->set('mapeo', $mapeo);
$this->renderView();
}
private function tipos($source = 'inmovilla') {
global $tipos;
// array_push($this->uses,'InmuebleTipo','Mapeo');
$totalRegistrosFuente = 0;
if ($source == 'inmovilla') {
Procesos('tipos', 1, "", "", "tipo asc");
PedirDatos(972, "fern2sHy72", 1);
} else {
$xml = new XMLReader();
$xml->open(WWW_ROOT . 'files/afilia/inmuebles_asociacion.xml');
$rootElement = 'inmuebles';
$element = 'inmueble';
$tipos_inmueble = array();
while ($xml->read()) {
if ($xml->localName == $element && $xml->nodeType == XMLReader::ELEMENT) {
$inmueble = simplexml_load_string($xml->readOuterXml(), 'SimpleXMLElement', LIBXML_NOCDATA);
if (!in_array((string) $inmueble->tipo, $tipos_inmueble) && trim((string) $inmueble->tipo) != '') {
$temp[] = array('tipo' => (string) $inmueble->tipo);
$tipos_inmueble[] = (string) $inmueble->tipo;
}
}
}
$tipos = array_merge(array(array('elementos' => count($tipos_inmueble))), $temp);
}
$totalRegistrosFuente = $tipos[0]["elementos"];
if ($totalRegistrosFuente) { // Si hay datos de la fuente
//Conseguimos los elementos en mapeo actuales para la fuente de datos
$tiposEnMapeo = $this->Mapeo->find('list', array('fields' => array('id', 'dato'), 'conditions' => array('tabla' => 'inmuebles_tipos', 'origen_datos' => $source)));
//Pasamos a mayúsculas por posible diferencia de ortografia en los datos
if ($tiposEnMapeo) {
foreach ($tiposEnMapeo as $id => $tipoEnMapeo) {
$tiposEnMapeo[$id] = mb_strtoupper($tipoEnMapeo, 'UTF-8');
}
}
$datosNuevoMapeo = array();
$procesados = 0;
$mapeados = 0;
//Comprobamos los elementos de la fuente de datos y eliminamos los que no sean necesarios
for ($i = 1; $i <= $totalRegistrosFuente; $i++) {
$key = array_search(mb_strtoupper(trim($tipos[$i]['tipo']), 'UTF-8'), $tiposEnMapeo);
if ($key === FALSE) { //Si es un dato nuevo lo guardamos
$this->Mapeo->create();
$this->Mapeo->save(array('tabla' => 'inmuebles_tipos', 'origen_datos' => $source, 'dato' => trim($tipos[$i]['tipo']), 'extra' => serialize($tipos[$i])));
$datosNuevoMapeo[$this->Mapeo->id] = trim($tipos[$i]['tipo']);
$procesados++;
} else {
unset($tipos[$i]);
}
}
}
if (!empty($datosNuevoMapeo)) {
//Tomamos los valores definidos en base de datos
$types = $this->InmuebleTipo->find('list', array('fields' => array('id', 'nombre'), 'conditions' => array('tipo_id >' => 0)));
if ($types) {
foreach ($types as $id => $type) {
$types[$id] = mb_strtoupper($type, 'UTF-8');
}
}
//Comprobamos si puede hacerse un mapeo automático
foreach ($datosNuevoMapeo as $id => $tipo) {
$key = array_search(mb_strtoupper($tipo, 'UTF-8'), $types);
if ($key !== FALSE) {
$this->Mapeo->create();
$this->Mapeo->id = $id;
$this->Mapeo->saveField('tabla_id', $key);
$mapeados++;
} else {
unset($datosNuevoMapeo[$id]);
}
}
}
$this->set('totalRegistros', $totalRegistrosFuente);
$this->set('datosNuevoMapeo', $datosNuevoMapeo);
$this->set('procesados', $procesados);
$this->set('mapeados', $mapeados);
$this->set('source', $source);
}
private function estados($source = 'inmovilla') {
global $tipos_conservacion;
// array_push($this->uses,'InmuebleTipo','Mapeo');
$totalRegistrosFuente = 0;
if ($source == 'inmovilla') {
Procesos('tipos_conservacion', 1, 100, "", "");
PedirDatos(972, "fern2sHy72", 1);
} else {
$xml = new XMLReader();
$xml->open(WWW_ROOT . 'files/afilia/inmuebles_asociacion.xml');
$rootElement = 'inmuebles';
$element = 'inmueble';
$estados_inmueble = array();
while ($xml->read()) {
if ($xml->localName == $element && $xml->nodeType == XMLReader::ELEMENT) {
$inmueble = simplexml_load_string($xml->readOuterXml(), 'SimpleXMLElement', LIBXML_NOCDATA);
if (!in_array((string) $inmueble->estado_vivienda, $estados_inmueble) && trim((string) $inmueble->estado_vivienda) != '') {
$temp[] = array('conserv' => (string) $inmueble->estado_vivienda);
$estados_inmueble[] = (string) $inmueble->estado_vivienda;
}
}
}
$tipos_conservacion = array_merge(array(array('total' => count($estados_inmueble))), $temp);
}
$totalRegistrosFuente = $tipos_conservacion[0]["total"];
if ($totalRegistrosFuente) { // Si hay datos de la fuente
//Conseguimos los elementos en mapeo actuales para la fuente de datos
$estadosEnMapeo = $this->Mapeo->find('list', array('fields' => array('id', 'dato'), 'conditions' => array('tabla' => 'inmuebles_estados', 'origen_datos' => $source)));
//Pasamos a mayúsculas por posible diferencia de ortografia en los datos
if ($estadosEnMapeo) {
foreach ($estadosEnMapeo as $id => $estadoEnMapeo) {
$estadosEnMapeo[$id] = mb_strtoupper($estadoEnMapeo, 'UTF-8');
}
}
$datosNuevoMapeo = array();
$procesados = 0;
$mapeados = 0;
//Comprobamos los elementos de la fuente de datos y eliminamos los que no sean necesarios
for ($i = 1; $i <= $totalRegistrosFuente; $i++) {
$key = array_search(mb_strtoupper(trim($tipos_conservacion[$i]['conserv']), 'UTF-8'), $estadosEnMapeo);
if ($key === FALSE) { //Si es un dato nuevo lo guardamos
$this->Mapeo->create();
$this->Mapeo->save(array('tabla' => 'inmuebles_estados', 'origen_datos' => $source, 'dato' => trim($tipos_conservacion[$i]['conserv']), 'extra' => serialize($tipos_conservacion[$i])));
$datosNuevoMapeo[$this->Mapeo->id] = trim($tipos_conservacion[$i]['conserv']);
$procesados++;
} else {
unset($tipos_conservacion[$i]);
}
}
}
if (!empty($datosNuevoMapeo)) {
//Tomamos los valores definidos en base de datos
$estados = $this->InmuebleEstado->find('list', array('fields' => array('id', 'nombre')));
if ($estados) {
foreach ($estados as $id => $estado) {
$estados[$id] = mb_strtoupper($estado, 'UTF-8');
}
}
//Comprobamos si puede hacerse un mapeo automático
foreach ($datosNuevoMapeo as $id => $estado) {
$key = array_search(mb_strtoupper($estado, 'UTF-8'), $estados);
if ($key !== FALSE) {
$this->Mapeo->create();
$this->Mapeo->id = $id;
$this->Mapeo->saveField('tabla_id', $key);
$mapeados++;
} else {
unset($datosNuevoMapeo[$id]);
}
}
}
$this->set('totalRegistros', $totalRegistrosFuente);
$this->set('datosNuevoMapeo', $datosNuevoMapeo);
$this->set('procesados', $procesados);
$this->set('mapeados', $mapeados);
$this->set('source', $source);
}
private function provincias($source = 'inmovilla') {
global $provincias;
global $ciudades;
$totalRegistrosFuente = 0;
if ($source == 'inmovilla') {
//Da problemas la peticion y sólo devuelve 100
Procesos('provincias', 1, "", "", "provincia asc");
PedirDatos(972, "fern2sHy72", 1);
// $totalRegistrosFuente = $provincias[0]["elementos"];
$totalRegistrosFuente = $provincias[0]["elementos"];
$prov = array();
for ($i = 1; $i <= $totalRegistrosFuente; $i++) {
if (!isset($prov[$provincias[$i]['codprov']])) {
$prov[$provincias[$i]['codprov']] = $provincias[$i];
}
}
//Utilizamos de manera indirecta la peticion de ciudades para conseguir el resto de provincias
Procesos('ciudades', 1, "", "", "provincia asc");
PedirDatos(972, "fern2sHy72", 1);
$totalRegistrosFuente = $ciudades[0]["total"];
for ($i = 1; $i <= $totalRegistrosFuente; $i++) {
if (!isset($prov[$ciudades[$i]['codprov']])) {
$prov[$ciudades[$i]['codprov']] = array('codprov' => $ciudades[$i]['codprov'], 'provincia' => $ciudades[$i]['provincia']);
}
}
$provincias = array();
$provincias = array_merge(array(array('elementos' => count($prov), 'total' => count($prov))), $prov);
} else {
$xml = new XMLReader();
$xml->open(WWW_ROOT . 'files/afilia/inmuebles_asociacion.xml');
$rootElement = 'inmuebles';
$element = 'inmueble';
$prov = array();
/* Recorremos el xml en busca de todas las zonas */
$rootElement = 'inmuebles';
$element = 'inmueble';
while ($xml->read()) {
if ($xml->localName == $element && $xml->nodeType == XMLReader::ELEMENT) {
$inmueble = simplexml_load_string($xml->readOuterXml(), 'SimpleXMLElement', LIBXML_NOCDATA);
if (!in_array((string) $inmueble->provincia, $prov) && trim((string) $inmueble->provincia) != '') {
$prov[] = (string) $inmueble->provincia;
$temp[] = array('provincia' => (string) $inmueble->provincia, 'pais' => (string) $inmueble->pais);
}
}
}
$provincias = array_merge(array(array('elementos' => count($prov))), $temp);
}
// debug($provincias);die;
$totalRegistrosFuente = $provincias[0]["elementos"];
if ($totalRegistrosFuente) { // Si hay datos de la fuente
//Conseguimos los elementos en mapeo actuales para la fuente de datos
$provinciasEnMapeo = $this->Mapeo->find('list', array('fields' => array('id', 'dato'), 'conditions' => array('tabla' => 'provincias', 'origen_datos' => $source)));
//Pasamos a mayúsculas por posible diferencia de ortografia en los datos
if ($provinciasEnMapeo) {
foreach ($provinciasEnMapeo as $id => $provinciaEnMapeo) {
$provinciasEnMapeo[$id] = mb_strtoupper($provinciaEnMapeo, 'UTF-8');
}
}
$datosNuevoMapeo = array();
$procesados = 0;
$mapeados = 0;
//Comprobamos los elementos de la fuente de datos y eliminamos los que no sean necesarios
for ($i = 1; $i <= $totalRegistrosFuente; $i++) {
$key = array_search(mb_strtoupper(trim($provincias[$i]['provincia']), 'UTF-8'), $provinciasEnMapeo);
if ($key === FALSE) { //Si es un dato nuevo lo guardamos
$this->Mapeo->create();
$this->Mapeo->save(array('tabla' => 'provincias', 'origen_datos' => $source, 'dato' => trim($provincias[$i]['provincia']), 'extra' => serialize($provincias[$i])));
$datosNuevoMapeo[$this->Mapeo->id] = trim($provincias[$i]['provincia']);
$procesados++;
} else {
unset($provincias[$i]);
}
}
}
if (!empty($datosNuevoMapeo)) {
//Tomamos los valores definidos en base de datos
$states = $this->Provincia->find('list', array('fields' => array('id', 'nombre')));
if ($states) {
foreach ($states as $id => $state) {
$states[$id] = mb_strtoupper($state, 'UTF-8');
}
}
//Comprobamos si puede hacerse un mapeo automático
foreach ($datosNuevoMapeo as $id => $provincia) {
$key = array_search(mb_strtoupper($provincia, 'UTF-8'), $states);
if ($key !== FALSE) {
$this->Mapeo->create();
$this->Mapeo->id = $id;
$this->Mapeo->saveField('tabla_id', $key);
$mapeados++;
} else {
unset($datosNuevoMapeo[$id]);
}
}
}
$this->set('totalRegistros', $totalRegistrosFuente);
$this->set('datosNuevoMapeo', $datosNuevoMapeo);
$this->set('procesados', $procesados);
$this->set('mapeados', $mapeados);
$this->set('source', $source);
}
private function localidades($source = 'inmovilla') {
global $ciudades;
$totalRegistrosFuente = 0;
if ($source == 'inmovilla') {
Procesos('ciudades', 1, "", "", "city asc, provincia asc");
PedirDatos(972, "fern2sHy72", 1);
} else {
$xml = new XMLReader();
$xml->open(WWW_ROOT . 'files/afilia/inmuebles_asociacion.xml');
$rootElement = 'inmuebles';
$element = 'inmueble';
$pob = array();
$provPob = array();
/* Recorremos el xml en busca de todas las zonas */
$rootElement = 'inmuebles';
$element = 'inmueble';
while ($xml->read()) {
if ($xml->localName == $element && $xml->nodeType == XMLReader::ELEMENT) {
$inmueble = simplexml_load_string($xml->readOuterXml(), 'SimpleXMLElement', LIBXML_NOCDATA);
if (!isset($provPob[(string) $inmueble->provincia])) {
$provPob[(string) $inmueble->provincia] = array();
}
if (!in_array((string) $inmueble->poblacion, $provPob[(string) $inmueble->provincia]) && trim((string) $inmueble->poblacion) != '') {
$pob[] = (string) $inmueble->poblacion;
$provPob[(string) $inmueble->provincia][] = (string) $inmueble->poblacion;
$temp[] = array('provincia' => (string) $inmueble->provincia, 'city' => (string) $inmueble->poblacion);
}
}
}
$ciudades = array_merge(array(array('elementos' => count($pob))), $temp);
}
$totalRegistrosFuente = $ciudades[0]["elementos"];
// $this->set('ciudades',$ciudades);
// debug($ciudades);die;
// array_push($this->uses,'Localidad','Provincia','Mapeo');
if ($totalRegistrosFuente) { // Si hay datos de la fuente
//Conseguimos los elementos en mapeo actuales para la fuente de datos
$ciudadesEnMapeo = $this->Mapeo->find('list', array('fields' => array('id', 'dato'), 'conditions' => array('tabla' => 'localidades', 'origen_datos' => $source)));
//Pasamos a mayúsculas por posible diferencia de ortografia en los datos
if ($ciudadesEnMapeo) {
foreach ($ciudadesEnMapeo as $id => $ciudadEnMapeo) {
$ciudadesEnMapeo[$id] = mb_strtoupper($ciudadEnMapeo, 'UTF-8');
}
}
//Conseguimos los elementos en mapeo actuales para la fuente de datos
$provinciasEnMapeo = $this->Mapeo->find('list', array('fields' => array('dato', 'tabla_id'), 'conditions' => array('tabla' => 'provincias', 'origen_datos' => $source)));
$datosNuevoMapeo = array();
$procesados = 0;
$mapeados = 0;
//Comprobamos los elementos de la fuente de datos y eliminamos los que no sean necesarios
for ($i = 1; $i <= $totalRegistrosFuente; $i++) {
$key = array_search(mb_strtoupper(trim($ciudades[$i]['city']) . ":" . trim($ciudades[$i]['provincia']), 'UTF-8'), $ciudadesEnMapeo);
if ($key === FALSE) { //Si es un dato nuevo lo guardamos (En el caso de poblaciones guardamos tambien la provincia. Ej: [poblacion]:[provincia])
$this->Mapeo->create();
$this->Mapeo->save(array('tabla' => 'localidades', 'origen_datos' => $source, 'dato' => trim($ciudades[$i]['city']) . ":" . trim($ciudades[$i]['provincia']), 'extra' => serialize($ciudades[$i])));
$datosNuevoMapeo[$this->Mapeo->id] = trim($ciudades[$i]['city']) . ":" . trim($ciudades[$i]['provincia']);
$procesados++;
} else {
unset($ciudades[$i]);
}
}
}
if (!empty($datosNuevoMapeo)) {
//Tomamos los valores definidos en base de datos de poblaciones por provincia
$cities = $this->Localidad->find('all', array('fields' => array('id', 'provincia_id', 'nombre'), 'order' => array('provincia_id ASC', 'nombre ASC')));
$provinciasPoblaciones = array();
if ($cities) {
foreach ($cities as $city) {
$provinciasPoblaciones[$city['Localidad']['provincia_id']][$city['Localidad']['id']] = mb_strtoupper($city['Localidad']['nombre'], 'UTF-8');
}
}
// debug($datosNuevoMapeo);die;
//Comprobamos si puede hacerse un mapeo automático
foreach ($datosNuevoMapeo as $id => $localidad) {
$temp = explode(":", $localidad);
$city = $temp[0];
$state = $temp[1];
$key = FALSE;
if (array_key_exists($state, $provinciasEnMapeo) && $provinciasEnMapeo[$state] > 0 && is_array($provinciasPoblaciones[$provinciasEnMapeo[$state]])) {
$key = array_search(mb_strtoupper($city, 'UTF-8'), $provinciasPoblaciones[$provinciasEnMapeo[$state]]);
}
if ($key !== FALSE) {
$this->Mapeo->create();
$this->Mapeo->id = $id;
$this->Mapeo->saveField('tabla_id', $key);
$datosNuevoMapeo[$id] = "$city ($state)";
$mapeados++;
} else {
unset($datosNuevoMapeo[$id]);
}
}
}
$this->set('totalRegistros', $totalRegistrosFuente);
$this->set('datosNuevoMapeo', $datosNuevoMapeo);
$this->set('procesados', $procesados);
$this->set('mapeados', $mapeados);
$this->set('source', $source);
}
private function zonas($source = 'inmovilla') {
global $zonas;
global $ciudades;
$totalRegistrosFuente = 0;
$total = 0;
// //Volcado de ciudades mapeadas
// //Conseguimos los elementos en mapeo actuales para la fuente de datos
// $ciudadesEnMapeo = $this->Mapeo->find('list',array('fields'=>array('tabla_id','extra'),'conditions'=>array('tabla'=>'localidades','origen_datos'=>$source,'tabla_id >'=>0)));
// $last = FALSE;
// $zones = array();
// foreach($ciudadesEnMapeo as $id=>$localidad){
// $temp = unserialize($localidad);
// $codCiu = $temp['cod_ciu'];
// Procesos ('zonas',1,"","key_loca=$codCiu","zone asc");
// PedirDatos(972,"fern2sHy72",1);
// $totalRegistrosFuente = 0;
// if($zonas[0]["elementos"] > 0 && $zonas[1]["cod_zona"] != $last[1]["cod_zona"]){
// $totalRegistrosFuente = $zonas[0]["elementos"];
// for($i=1;$i<=$totalRegistrosFuente;$i++){
// $zones[$id][$zonas[$i]["cod_zona"]] = $zonas[$i];
// $total++;
// $this->Zona->create();
// $this->Zona->save(array('localidad_id'=>$id,'nombre'=>$zonas[$i]["zone"],'seo'=>mb_strtolower(Inflector::slug($zonas[$i]["zone"],"-") ) ) );
// }
// $last = $zonas;
// }
// }
// //Volcado de todas las ciudades
// Procesos ('ciudades',1,9999,"","provincia ASC, city ASC");
// PedirDatos(972,"fern2sHy72",1);
// $cities = array();
// $zones = array();
// $last = FALSE;
// if($ciudades[0]["total"] > 0){
// $cities = $ciudades;
// $totalRegistrosFuente = $cities[0]["elementos"];
// $totalRegistrosFuente2 = 0;
// for($i=1;$i<=$totalRegistrosFuente;$i++){
// $codCiu = $ciudades[$i]['cod_ciu'];
// Procesos ('zonas',1,"","key_loca=$codCiu","zone asc");
// PedirDatos(972,"fern2sHy72",1);
// echo "<br><br>Ciudad: $codCiu --> {$ciudades[$i]['city']}";
// if($zonas[0]["total"] > 0 && $zonas[1]["cod_zona"] != $last[1]["cod_zona"]){
// $totalRegistrosFuente2 = $zonas[0]["total"];
// for($j=1;$j<=$totalRegistrosFuente2;$j++){
// echo "<br>Zona: {$zonas[$j]["cod_zona"]} --> {$zonas[$j]["zone"]}";
// $this->Zona->create();
// $this->Zona->save(array('nombre'=>$zonas[$j]["zone"],'seo'=>mb_strtolower(Inflector::slug($zonas[$j]["zone"],"-") ),'cod_ciu'=> $codCiu) );
// $zones[$codCiu][$zonas[$j]["cod_zona"]] = $zonas[$j];
// $total++;
// }
// $last = $zonas;
// echo "<br>";
// }
// }
// }
// // Actualizacion de datos
// //Conseguimos los elementos en mapeo actuales para la fuente de datos
// $ciudadesEnMapeo = $this->Mapeo->find('list',array('fields'=>array('tabla_id','extra'),'conditions'=>array('tabla'=>'localidades','origen_datos'=>$source,'tabla_id >'=>0)));
// foreach($ciudadesEnMapeo as $id=>$localidad){
// $temp = unserialize($localidad);
// $codCiu = $temp['cod_ciu'];
// // $this->Zona->create();
// $this->Zona->updateAll(array('localidad_id'=>$id),array('cod_ciu'=> $codCiu) );
// }
// debug($total);
// debug($zones);
// $mapeo = $this->Mapeo->find('list',array('fields'=>array('id','extra'),'conditions'=>array('tabla'=>'localidades','origen_datos'=>'inmovilla')));
// foreach($mapeo as $id=>$extra){
// $temp = unserialize($extra);
// $this->Mapeo->updateAll(array('dato_id'=>$temp['cod_ciu'],'dato_padre_id'=>$temp['codprov']),array('id'=> $id) );
// }
die;
}
private function inmuebles($source = 'inmovilla') {
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 0);
global $paginacion;
global $fotos;
global $ficha;
global $videos;
global $descripciones;
$origen_datos = false;
$debug = '';
$inicio = time();
$registros = 50;
if (preg_match('/^inmovilla/', $source)) {
$origen_datos = 'inmovilla';
//TODO Esto habrá que generalizarlo para la inmobiliaria si la fuente de datos es API inmovilla
define("NUM_AGENCIA", 972); //numagencia
define("API_KEY", "fern2sHy72");
} elseif ($source == 'afilia') {
$origen_datos = $source;
//TODO Esto habrá que generalizarlo para la inmobiliaria si la fuente de datos es API inmovilla
define("NUM_AGENCIA", "inmojet.com"); //nombre_agencia
}
if (!$origen_datos) {
$debug .= 'El origen de datos seleccionado no es válido.';
} else {
$provincias = $this->Mapeo->find('list', array('fields' => array('dato', 'tabla_id'), 'conditions' => array('origen_datos' => $origen_datos, 'tabla' => 'provincias', 'tabla_id >' => 0)));
$localidades = $this->Mapeo->find('list', array('fields' => array('dato_id', 'tabla_id'), 'conditions' => array('origen_datos' => $origen_datos, 'tabla' => 'localidades', 'tabla_id >' => 0)));
$localidades2 = $this->Mapeo->find('list', array('fields' => array('dato', 'dato_id'), 'conditions' => array('origen_datos' => $origen_datos, 'tabla' => 'localidades', 'tabla_id >' => 0)));
$zonas = $this->Zona->find('list', array('fields' => array('nombre', 'id', 'cod_ciu'), 'conditions' => array('localidad_id >' => 0)));
$gestiones = $this->InmuebleGestion->find('list', array('fields' => array('nombre', 'id')));
$tipos = $this->Mapeo->find('list', array('fields' => array('dato', 'tabla_id'), 'conditions' => array('origen_datos' => $origen_datos, 'tabla' => 'inmuebles_tipos', 'tabla_id >' => 0)));
$eficiencias = Configure::read('Inmueble.eficiencias');
$inmuebles = $this->Vivienda->find('list', array('fields' => array('id', 'origen_inmueble_id'), 'conditions' => array('web_id' => 1, 'origen_datos' => $origen_datos)));
if ($source == 'inmovilla') {
$registros = 50;
//Petición API (inicial para conocer el número de elementos totales de la cartera)
Procesos('paginacion', 1, $registros, "", "cod_ofer DESC");
PedirDatos(NUM_AGENCIA, API_KEY, 1);
} elseif ($source == 'inmovilla_xml') {
// Feed XML
$xml = new XMLReader();
$xml->open(WWW_ROOT . 'files/inmovilla/inmojet.xml');
/* Recorremos el xml en busca de todas las zonas */
$rootElement = 'propiedades';
$element = 'propiedad';
$ii = 1;
$paginacion = array();
$paginacion[0]["total"] = 0;
while ($xml->read()) {
if ($xml->localName == $element && $xml->nodeType == XMLReader::ELEMENT) {
$inmueble = simplexml_load_string($xml->readOuterXml(), 'SimpleXMLElement', LIBXML_NOCDATA);
$referencia = array_shift(explode("/", (string) $inmueble->referencia));
$gestion = ((int) $inmueble->precioventa ? ((int) $inmueble->precioalquiler ? 3 : 1) : ((int) $inmueble->precioalquiler ? 2 : null)); //Deducimos la gestión
$paginacion[$ii] = array(
'cod_ofer' => (string) $inmueble->unico,
'numagencia' => (string) $inmueble->numagencia,
'ref' => $referencia,
'keyacci' => $gestion,
'nbtipo' => (string) $inmueble->tipo,
'provincia' => (string) $inmueble->provincia,
'key_loca' => (isset($localidades2[(string) $inmueble->ciudad . ":" . (string) $inmueble->provincia]) ? $localidades2[(string) $inmueble->ciudad . ":" . (string) $inmueble->provincia] : null),
'zona' => (string) $inmueble->zona,
'latitud' => (string) $inmueble->latitud,
'altitud' => (string) $inmueble->longitud,
'precioinmo' => ((int) $inmueble->precioventa > 0 ? (string) $inmueble->precioventa : null),
'precioalq' => ((int) $inmueble->precioalquiler > 0 ? (string) $inmueble->precioalquiler : null),
'outlet' => null,
'descrip' => (string) $inmueble->descripcion,
'energialetra' => (string) $inmueble->calificacion_energetica,
'habitaciones' => (string) $inmueble->habitaciones,
'banyos' => (string) $inmueble->banos,
'aseos' => (string) $inmueble->aseos,
'm_parcela' => (string) $inmueble->parcela,
'm_cons' => (string) $inmueble->superificie,
'm_uties' => null,
'ascensor' => ((string) $inmueble->ascensor == 'X' ? 1 : 0),
'aire_con' => ((string) $inmueble->aire_con == 'X' ? 1 : 0),
'calefaccion' => ((string) $inmueble->calefaccion == 'X' ? 1 : 0),
'garaje' => ((string) $inmueble->garaje == 'X' ? 1 : 0),
'parking' => ((string) $inmueble->parking == 'X' ? 1 : 0),
'jardin' => ((string) $inmueble->jardin == 'X' ? 1 : 0),
'piscina_com' => ((string) $inmueble->piscina == 'X' ? 1 : 0),
'terraza' => ((string) $inmueble->terraza == 'X' ? 1 : 0),
'trastero' => ((string) $inmueble->trastero == 'X' ? 1 : 0),
);
//Procesamos imagenes
$jj = 1;
$hayImagenes = TRUE;
$fotos = array();
while ($hayImagenes) {
$campo = "foto$jj";
if ((string) $inmueble->$campo != '') {
$fotos[] = (string) $inmueble->$campo;
$jj++;
} else {
$hayImagenes = FALSE;
}
}
$paginacion[$ii]['fotos'] = $fotos;
//
//Procesamos video
$jj = 1;
$hayVideos = TRUE;
$videos = array();
if ((string) $inmueble->video != '') {
$videos[] = (string) $inmueble->video;
}
$paginacion[$ii]['videos'] = $videos;
//
$ii++;
}
}
$paginacion[0]["total"] = count($paginacion) - 1;
$paginacion[0]["elementos"] = $paginacion[0]["total"];
$registros = $paginacion[0]["total"];
} // end if(source==inmovilla_xml)
elseif ($source == 'afilia') {
// Feed XML
$xml = new XMLReader();
$xml->open(WWW_ROOT . 'files/afilia/inmuebles_asociacion.xml');
/* Recorremos el xml en busca de todas las zonas */
$rootElement = 'inmuebles';
$element = 'inmueble';
$ii = 1;
$paginacion = array();
$paginacion[0]["total"] = 0;
$gestionesAfilia = Configure::read('Mapeo.gestionesAfilia');
while ($xml->read()) {
if ($xml->localName == $element && $xml->nodeType == XMLReader::ELEMENT) {
$inmueble = simplexml_load_string($xml->readOuterXml(), 'SimpleXMLElement', LIBXML_NOCDATA);
$gestion = false;
$precio_venta = null;
$precio_alquiler = null;
foreach ($inmueble->gestiones as $inmuebleGestion) {
$tipogestion = (string) $inmuebleGestion->gestion->tipo;
if ($tipogestion == 'Compra-venta' || $tipogestion == 'Venta') {
$precio_venta = str_replace(array('.', ','), array('', '.'), $inmuebleGestion->gestion->precio);
}
if ($tipogestion == 'Alquilar' || $tipogestion == 'Alquiler op. compra') {
$precio_alquiler = str_replace(array('.', ','), array('', '.'), $inmuebleGestion->gestion->precio);
}
if ($gestion) {
$gestion = 4;
} else {
$gestion = $gestionesAfilia[$tipogestion];
}
}
$paginacion[$ii] = array(
'cod_ofer' => (string) $inmueble->referencia_unica,
'ref' => (string) $inmueble->referencia_anunciante,
'numagencia' => (string) $inmueble->nombre_agencia,
'keyacci' => $gestion,
'nbtipo' => (string) $inmueble->tipo,
'provincia' => (string) $inmueble->provincia,
'key_loca' => (isset($localidades2[(string) $inmueble->poblacion . ":" . (string) $inmueble->provincia]) ? $localidades2[(string) $inmueble->poblacion . ":" . (string) $inmueble->provincia] : null),
'zona' => (string) $inmueble->zona,
'latitud' => (string) $inmueble->latitud,
'altitud' => (string) $inmueble->longitud,
'precioinmo' => $precio_venta,
'precioalq' => $precio_alquiler,
'outlet' => null,
'descrip' => (string) $inmueble->descripcion,
'energialetra' => (string) $inmueble->eficiencia_energetica_tipo,
'habitaciones' => (string) $inmueble->n_habitaciones,
'banyos' => (string) $inmueble->n_banos,
'aseos' => (string) $inmueble->n_aseos,
'm_parcela' => (string) $inmueble->m2_terreno,
'm_cons' => (string) $inmueble->m2_construidos,
'm_uties' => (string) $inmueble->m2_utiles,
'ascensor' => (string) $inmueble->ascensor_01,
'aire_con' => (string) $inmueble->a_acondicionado_01,
'calefaccion' => (string) $inmueble->calefaccion_01,
'aire_con' => (string) $inmueble->calefaccion_01,
'garaje' => (string) $inmueble->garaje_01,
'parking' => (string) $inmueble->parking,
'jardin' => (string) $inmueble->jardin_01,
'piscina_com' => (string) $inmueble->piscina_01,
'terraza' => (string) $inmueble->terraza_01,
'trastero' => (string) $inmueble->trastero_01,
);
//Procesamos imagenes
$jj = 1;
$hayImagenes = TRUE;
$fotos = array();
if (!empty($inmueble->fotos)) {
foreach ($inmueble->fotos as $gallery) {
foreach ($gallery->url_foto as $foto) {
$fotos[] = (string) $foto;
}
}
}
$paginacion[$ii]['fotos'] = $fotos;
//
//Procesamos videos
$jj = 1;
$hayVideos = TRUE;
$videos = array();
if (!empty($inmueble->videos)) {
foreach ($inmueble->videos as $gallery) {
foreach ($gallery->url_video as $video) {
$urlVideo = (string) $video;
if (preg_match('/youtube.com\/v\/([^&]+)&?/', $urlVideo, $matches)) {
$videos[] = array_pop($matches);
}
}
}
}
$paginacion[$ii]['videos'] = $videos;
//
$ii++;
}
}
$paginacion[0]["total"] = count($paginacion) - 1;
$paginacion[0]["elementos"] = $paginacion[0]["total"];
$registros = $paginacion[0]["total"];
}
// debug($paginacion);die;
if ($paginacion[0]["total"]) {
/* Variables de control */
$total = 0;
$errores = 0;
$last = FALSE;
$desde = 1;
//Condicion para recorrer todo el feed o realizar todas las peticiones necesarias para obtener todo el feed por API
if ($source == 'inmovilla') {
$paginas = ceil($paginacion[0]["total"] / $registros);
// $paginas = 20; //TODO sólo para test
} else { //En otro caso es sólo un pagina
$paginas = 1;
}
for ($pagina = 1; $pagina <= $paginas; $pagina++) {
if ($source == 'inmovilla') { //vamos realizando las peticiones necesarias a la API
$desde = ($pagina - 1) * $registros + 1;
if ($desde > 1) {
//Petición API
Procesos('paginacion', $desde, $registros, "", "cod_ofer DESC");
PedirDatos(NUM_AGENCIA, API_KEY, 1);
if ($paginacion[0]["total"] == 0 || $paginacion[0]["elementos"] == 0) {
break;
}
}
}
for ($i = 1; $i <= $registros; $i++) {
$codOfer = $paginacion[$i]["cod_ofer"];
$update = FALSE;
$id = FALSE;
if ($inmuebles) {
$id = array_search($codOfer, $inmuebles);
}
if ($id !== FALSE) {
$update = TRUE;
}
if ($source == 'inmovilla') {
Procesos('ficha', 1, 1, "cod_ofer=$codOfer", "");
PedirDatos(NUM_AGENCIA, API_KEY, 1);
} else {
/* Por feed XML fijamos $fotos y $descripciones */
$ficha[0]["total"] = 1;
$ficha[1] = $paginacion[$i];
$fotos[$codOfer] = $paginacion[$i]['fotos'];
$descripciones[$codOfer][1]['descrip'] = $paginacion[$i]['descrip'];
/* */
}
if ($ficha[0]["total"] > 0 && $last[1]["cod_ofer"] != $ficha[1]["cod_ofer"]) {
@$data = array(
'web_id' => 1, //temporal
'referencia' => $ficha[1]["ref"],
'inmueble_gestion_id' => $ficha[1]["keyacci"],
'inmueble_tipo_id' => $tipos[$ficha[1]["nbtipo"]],
'provincia_id' => $provincias[$ficha[1]["provincia"]],
'localidad_id' => $localidades[$ficha[1]["key_loca"]],
// 'zona_id'=>$zonas[$localidades[$ficha[1]["key_loca"]]][$ficha[1]["zona"]],
'zona_id' => $zonas[$ficha[1]["key_loca"]][$ficha[1]["zona"]],
'geolocalizacion' => "{$ficha[1]["latitud"]},{$ficha[1]["altitud"]}",
'precio' => $ficha[1]["precioinmo"],
'precio_alquiler' => $ficha[1]["precioalq"],
'precio_anterior' => $ficha[1]["outlet"],
'texto' => $descripciones[$ficha[1]["cod_ofer"]][1]['descrip'],
'eficiencia_energetica' => ($ficha[1]["energialetra"] == 'tramites' ? 'En trámites' : ($ficha[1]["energialetra"] == '' ? 'Exento' : $ficha[1]["energialetra"]) ),
'num_habitaciones' => ( $ficha[1]['habitaciones'] + $ficha[1]['habdobles'] ? $ficha[1]['habitaciones'] + $ficha[1]['habdobles'] : 0 ),
'num_banos' => ($ficha[1]['banyos'] ? $ficha[1]['banyos'] : 0),
'num_aseos' => ($ficha[1]['aseos'] ? $ficha[1]['aseos'] : 0),
'superficie_parcela' => $ficha[1]['m_parcela'],
'superficie_construida' => $ficha[1]['m_cons'],
'superficie_util' => $ficha[1]['m_uties'],
'ascensor' => ($ficha[1]['ascensor'] ? $ficha[1]['ascensor'] : 0),
'calefaccion' => ($ficha[1]['calefaccion'] ? $ficha[1]['calefaccion'] : 0),
'aire_acondicionado' => ($ficha[1]['aire_con'] ? $ficha[1]['aire_con'] : 0),
'garaje' => ($ficha[1]['garaje'] ? 1 : 0),
'parking' => ($ficha[1]['parking'] ? 1 : 0),
'jardin' => ($ficha[1]['jardin'] ? 1 : 0),
'piscina' => ( ($ficha[1]['piscina_com'] || $ficha[1]['piscina_prop']) ? 1 : 0),
'terraza' => ($ficha[1]['terraza'] ? 1 : 0),
'trastero' => ($ficha[1]['trastero'] ? 1 : 0),
'origen_datos' => 'inmovilla',
'origen_inmueble_id' => $ficha[1]['cod_ofer'],
'publicado' => 1,
'portal' => ($ficha[1]['numagencia'] == NUM_AGENCIA ? 1 : 0)
);
$this->Vivienda->create();
if ($update) {
$this->Vivienda->id = $id;
}
if ($this->Vivienda->save($data, array('fieldList' => array_keys($data)))) {
$total++;
// Galeria de imagenes
$imagenes = FALSE;
$newGallery = FALSE;
if (!empty($fotos[$ficha[1]['cod_ofer']])) {
foreach ($fotos[$ficha[1]['cod_ofer']] as $foto) {
$imagenes[] = $foto;
}
}
if ($imagenes) {
$gallery = $this->ViviendaGaleria->find('list', array('fields' => array('id', 'imagen_original_name'), 'conditions' => array('vivienda_id' => $this->Vivienda->id, 'video_source' => null)));
foreach ($imagenes as $indiceImagen => $imagen) {
$this->ViviendaGaleria->create();
$imageID = FALSE;
if ($gallery) {
$imageID = array_search($imagen, $gallery);
}
if ($imageID !== FALSE) {
$this->ViviendaGaleria->id = $imageID;
$newGallery[] = $this->ViviendaGaleria->id; //Guardamos los registros de la galeria, para borrar al final lo que sobre
$dataImage = array('orden' => $indiceImagen + 1);
$this->ViviendaGaleria->saveField('orden', $indiceImagen + 1);
} else {
// Adecuamos el nombre de la imagen y la extension ( y datos a guardar)
$path = "/blobs/vivienda/{$this->Vivienda->id}/galeria/";
$file = array_pop(explode("/", $imagen));
$file_name = array_shift(explode(".", $file));
$file_extension = strtolower(array_pop(explode(".", $file)));
$file_extension = str_replace('jpeg', 'jpg', $file_extension);
$file = $path . $file_name . "." . $file_extension;
$dataImage = array('vivienda_id' => $this->Vivienda->id, 'imagen' => $file, 'imagen_original_name' => $imagen, 'orden' => $indiceImagen + 1,);
//Obtenemos el mime
$size = getimagesize($imagen);
if ($size) {
$dataImage['imagen_mime'] = $size['mime'];
}
//Guardamos imagen
if ($this->ViviendaGaleria->save($dataImage)) {
$newGallery[] = $this->ViviendaGaleria->id; //Guardamos los registros de la galeria, para borrar al final lo que sobre
if ($imageID === FALSE) { //Si es nueva
$this->ViviendaGaleria->set('imagen', $path . $this->ViviendaGaleria->id . "." . $file_extension);
$this->ViviendaGaleria->set('imagen_name', $this->ViviendaGaleria->id . "." . $file_extension);
//Actualizamos nombre de la imagen con el ID y guardamos el archivo en local
if ($this->ViviendaGaleria->save()) {
// Actualizamos el campo 'imagen_dn' del anuncio
if ($indiceImagen == 0) {
$this->Vivienda->saveField('imagen_dn', $path . $this->ViviendaGaleria->id . "." . $file_extension, array('validate' => FALSE, 'callbacks' => FALSE));
$this->Vivienda->saveField('imagen_original_dn', Configure::read('App.imagen_original'), array('validate' => FALSE, 'callbacks' => FALSE));
}
if (!is_dir(WWW_ROOT . $path)) {
mkdir(WWW_ROOT . $path, 0777, true);
}
file_put_contents(WWW_ROOT . $path . $this->ViviendaGaleria->id . "." . $file_extension, file_get_contents($imagen));
}
}
} else {
$debug .= var_export($this->ViviendaGaleria->validationErrors, true);
}
} //End else
} //end foreach
} //End if($imagenes)
//Borramos los archivos que sobren
if (!empty($newGallery)) {
$this->ViviendaGaleria->deleteAll(array('ViviendaGaleria.id NOT' => $newGallery, 'vivienda_id' => $this->Vivienda->id, 'video_source' => null), false, true);
} else {
$this->ViviendaGaleria->deleteAll(array('vivienda_id' => $this->Vivienda->id, 'video_source' => null), false, true);
}
//Galeria videos
$videosVivienda = FALSE;
$newVideoGallery = FALSE;
if (!empty($videos[$ficha[1]['cod_ofer']])) {
foreach ($videos[$ficha[1]['cod_ofer']] as $video) {
$videosVivienda[] = $video;
}
}
if ($videosVivienda) {
$videoGallery = $this->ViviendaGaleria->find('list', array('fields' => array('id', 'video_code'), 'conditions' => array('vivienda_id' => $this->Vivienda->id, 'video_source NOT' => null)));
foreach ($videosVivienda as $indiceVideo => $video) {
$this->ViviendaGaleria->create();
$videoID = FALSE;
if ($gallery) {
$videoID = array_search($video, $videoGallery);
}
// Adecuamos el nombre de la imagen y la extension ( y datos a guardar)
$dataImage = array('vivienda_id' => $this->Vivienda->id, 'video_code' => $videoCode, 'video_source' => 'youtube', 'orden' => $indiceVideo + 1,);
//Guardamos imagen
if ($this->ViviendaGaleria->save($dataImage)) {
$newVideoGallery[] = $this->ViviendaGaleria->id; //Guardamos los registros de la galeria videos, para borrar al final lo que sobre
} else {
$debug .= var_export($this->ViviendaGaleria->validationErrors, true);
}
} //end foreach
} //End if($imagenes)
//Borramos los videos que sobren
if (!empty($newVideoGallery)) {
$this->ViviendaGaleria->deleteAll(array('ViviendaGaleria.id NOT' => $newGallery, 'vivienda_id' => $this->Vivienda->id, 'video_source NOT' => null), false, true);
} else {
$this->ViviendaGaleria->deleteAll(array('vivienda_id' => $this->Vivienda->id, 'video_source NOT' => null), false, true);
}
} else {
$debug .= var_export($ficha[1], true);
$debug .= var_export($this->Vivienda->validationErrors, true);
$errores++;
}
$last = $ficha;
} //End if procesado datos ficha inmueble
} //End for recorre una pagina de resultados del feed
} // End for recoger todas las paginas del feed
$debug .= "Total inmuebles : " . ($total + $errores);
$debug .= "<br>Importados : $total";
$debug .= "<br>Errores : $errores<br>";
}
}
//Por ultimo el tiempo al culminar
$final = time();
//La resta del final - inicio nos dará el tiempo de ejecución
$total = $final - $inicio;
$debug .='<br>Resultado ejecutado en ' . gmdate('H:i:s', $total) . '<br>';
// die;
$this->set('debug', $debug);
}
}