shell bypass 403
<?
App::uses('Cliente', 'Model');
App::uses('InmuebleEstado', 'Model');
App::uses('InmuebleGestion', 'Model');
App::uses('InmuebleTipo', 'Model');
App::uses('Provincia', 'Model');
App::uses('Localidad', 'Model');
App::uses('Zona', 'Model');
App::uses('InmuebleGaleria', 'Model');
class Inmueble extends AppModel {
public $hasMany = array('InmuebleGaleria' => array('dependent' => false, 'order' => 'orden', 'foreignKey' => 'id_inmueble'));
public $belongsTo = array(
'Provincia' => array(
'className' => 'Provincia',
'foreignKey' => 'id_provincia',
'fields' => array('Provincia.*')
)
);
public $virtualFields = array(
'num_imagenes' => 'SELECT COUNT(*) FROM inmuebles_galeria WHERE id_inmueble = Inmueble.id',
'listado_destacados_ref_title' => 'CONCAT(referencia, " - ", titulo_corto)'
);
public $validate = array(
'cliente_id' => array(
'exist' => array(
'allowEmpty' => true,
'rule' => 'checkExist',
'message' => 'Debes seleccionar un cliente existente'
)
),
'inmueble_estado_id' => array(
'exist' => array(
'allowEmpty' => true,
'rule' => 'checkExist',
'message' => 'Debes seleccionar un estado existente'
)
),
'id_gestion' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => 'Tipo de gestión requerida'
),
'exist' => array(
'rule' => 'checkExist',
'message' => 'Debes seleccionar un tipo de gestión existente'
),
'precio' => array(
'rule' => 'checkPrecioAlquiler',
'message' => 'El precio de alquiler es obligatorio para inmuebles de alquiler'
)
),
'inmueble_tipo_id' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => 'Tipo de inmueble requerido'
),
'exist' => array(
'rule' => 'checkExist',
'message' => 'Debes seleccionar un tipo de inmueble existente'
)
),
'provincia_id' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => 'Provincia requerida'
),
'exist' => array(
'rule' => 'checkExist',
'message' => 'Debes seleccionar una provincia existente'
)
),
'localidad_id' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => 'Localidad requerida'
),
'exist' => array(
'rule' => 'checkExist',
'message' => 'Debes seleccionar una localidad existente'
)
),
'zona_id' => array(
'required' => array(
'allowEmpty' => true,
'rule' => 'checkExist',
'message' => 'Debes seleccionar una zona existente'
)
),
'precio' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El precio ha de ser un valor numérico'
),
'zero' => array(
'rule' => 'checkZero',
'message' => 'El precio ha de ser mayor que 0'
)
),
'precio_anterior' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El precio anterior ha de ser un valor numérico'
),
'zero' => array(
'rule' => 'checkZero',
'message' => 'El precio anterior ha de ser mayor que 0'
),
'precio' => array(
'rule' => 'checkMenorPrecio',
'message' => 'El precio anterior ha de ser mayor que el precio'
)
),
'precio_alquiler' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El precio de alquiler ha de ser un valor numérico'
),
'zero' => array(
'rule' => 'checkZero',
'message' => 'El precio de alquiler ha de ser mayor que 0'
)
),
'alquiler' => array(
'required' => array(
'allowEmpty' => true,
'rule' => 'checkExist',
'message' => 'Debes seleccionar un periodo de alquiler existente'
)
),
'eficiencia_energetica' => array(
'required' => array(
'allowEmpty' => true,
'rule' => 'checkExist',
'message' => 'Debes seleccionar una eficiencia energética existente'
)
),
'flag' => array(
'exist' => array(
'allowEmpty' => true,
'rule' => 'checkExist',
'message' => 'Debes seleccionar una flag existente'
)
),
'num_habitaciones' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El número de habitaciones ha de ser un valor numérico'
)
),
'num_banos' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El número de baños ha de ser un valor numérico'
)
),
'num_aseos' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El número de aseos ha de ser un valor numérico'
)
),
'superficie_parcela' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'La superficie de la parcela ha de ser un valor numérico'
)
),
'superficie_construida' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'La superficie construida ha de ser un valor numérico'
)
),
'superficie_util' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'La superficie útil ha de ser un valor numérico'
)
),
);
public $estado;
public $gestion;
public $tipo;
public $provincia;
public $localidad;
public $zona;
public function checkExist($check) {
$elemento = null;
$campo = key($check);
switch ($campo) {
case 'cliente_id':
$elementos = new Cliente();
$elemento = $elementos->findById($this->data[$this->name][$campo]);
break;
case 'inmueble_estado_id':
$elementos = new InmuebleEstado();
$elemento = $elementos->findById($this->data[$this->name][$campo]);
if (!empty($elemento)) {
$this->estado = $elemento;
}
break;
case 'id_gestion':
$elementos = new InmuebleGestion();
$elemento = $elementos->findById($this->data[$this->name][$campo]);
if (!empty($elemento)) {
$this->gestion = $elemento;
}
break;
case 'inmueble_tipo_id':
$elementos = new InmuebleTipo();
$elemento = $elementos->find('first', array('conditions' => array('InmuebleTipo.id' => $this->data[$this->name][$campo], 'NOT' => array('InmuebleTipo.tipo_id' => 0))));
if (!empty($elemento)) {
$this->tipo = $elemento;
}
break;
case 'provincia_id':
$elementos = new Provincia();
$elemento = $elementos->findById($this->data[$this->name][$campo]);
if (!empty($elemento)) {
$this->provincia = $elemento;
}
break;
case 'localidad_id':
$elementos = new Localidad();
if (!empty($this->data[$this->name]['provincia_id'])) { //provincia marcada
$elemento = $elementos->findByIdAndProvinciaId($this->data[$this->name][$campo], $this->data[$this->name]['provincia_id']);
} else {
$elemento = $elementos->findById($this->data[$this->name][$campo]);
}
if (!empty($elemento)) {
$this->localidad = $elemento;
}
break;
case 'zona_id':
$elementos = new Zona();
if (!empty($this->data[$this->name]['localidad_id'])) { //localidad marcada
$elemento = $elementos->findByIdAndLocalidadId($this->data[$this->name][$campo], $this->data[$this->name]['localidad_id']);
} else {
$elemento = $elementos->findById($this->data[$this->name][$campo]);
}
if (!empty($elemento)) {
$this->zona = $elemento;
}
break;
case 'alquiler':
$elementos = Configure::read('Inmueble.alquileres');
if (array_key_exists($this->data[$this->name][$campo], $elementos)) {
$elemento = $elementos[$this->data[$this->name][$campo]];
}
break;
case 'eficiencia_energetica':
$elementos = Configure::read('Inmueble.eficiencias');
if (in_array($this->data[$this->name][$campo], $elementos)) {
$elemento = $elementos[$this->data[$this->name][$campo]];
}
break;
case 'flag':
$elementos = Configure::read('Inmueble.flags');
if (array_key_exists($this->data[$this->name][$campo], $elementos)) {
$elemento = $elementos[$this->data[$this->name][$campo]];
}
break;
}
if (empty($elemento)) {
return false; //error
}
return true; //ok
}
public function checkZero($check) {
$elemento = null;
$campo = key($check);
if ((int) $this->data[$this->name][$campo] == 0) {
return false; //error
}
return true; //ok
}
public function checkMenorPrecio($check) {
$elemento = null;
$campo = key($check);
if (!empty($this->data[$this->name][$campo]) && (int) $this->data[$this->name][$campo] <= (int) $this->data[$this->name]['precio']) {
return false; //error
}
return true; //ok
}
public function checkPrecioAlquiler($check) {
if (!empty($this->data[$this->name]['id_gestion']) && in_array((int) $this->data[$this->name]['id_gestion'], Configure::read('Inmueble.gestionesAlquiler')) && empty($this->data[$this->name]['precio_alquiler'])) {
return false;
}
return true; //ok
}
public function beforeSave($options = array()) {
parent::beforeSave($options);
//Geolocalización (se permite la introducir el valor de ambas maneras)
if (!empty($this->data[$this->name]['geolocalizacion'])) {
$g = explode(',', $this->data[$this->name]['geolocalizacion']);
$this->data[$this->name]['latitud'] = $g[0];
$this->data[$this->name]['longitud'] = $g[0];
} elseif (!empty($this->data[$this->name]['latitud']) && !empty($this->data[$this->name]['longitud'])) {
$this->data[$this->name]['geolocalizacion'] = $this->data[$this->name]['latitud'] . ',' . $this->data[$this->name]['longitud'];
}
//Quitamos información de alquiler en caso de que no sea un inmueble de alquiler
if (!empty($this->data[$this->name]['id_gestion']) && !in_array((int) $this->data[$this->name]['id_gestion'], Configure::read('Inmueble.gestionesAlquiler')) && empty($this->data[$this->name]['precio_alquiler'])) {
$this->data[$this->name]['alquiler'] = null;
}
}
public function afterSave($created, $options = array()) {
parent::afterSave($created, $options);
$entidad = $this->findById($this->id);
if (!empty($entidad)) {
$this->getVars($entidad); //obtenemos los valores de otras entidades para no repetir las consultas constantemente
$db = $this->getDataSource();
$this->updateAll(array(
//'titulo' => $db->value($this->getTitulo($entidad), 'string'),
'titulo_corto' => $db->value($this->getTituloCorto($entidad), 'string'),
'busqueda' => $db->value($this->getBusqueda($entidad), 'string'),
'seo' => $db->value($this->getInmuebleSeo($entidad), 'string'),
), array($this->name . '.id' => $this->id));
}
}
private function getVars($entidad) {
//Estado
if (empty($this->estado) && !empty($entidad[$this->name]['inmueble_estado_id'])) {
$elementos = new InmuebleEstado();
$elemento = $elementos->findById($entidad[$this->name]['inmueble_estado_id']);
if (!empty($elemento)) {
$this->estado = $elemento;
}
}
//Tipo de gestión
if (empty($this->gestion) && !empty($entidad[$this->name]['id_gestion'])) {
$elementos = new InmuebleGestion();
$elemento = $elementos->findById($entidad[$this->name]['id_gestion']);
if (!empty($elemento)) {
$this->gestion = $elemento;
}
}
//Tipo de inmueble
if (empty($this->tipo) && !empty($entidad[$this->name]['inmueble_tipo_id'])) {
$elementos = new InmuebleTipo();
$elemento = $elementos->findById($entidad[$this->name]['inmueble_tipo_id']);
if (!empty($elemento)) {
$this->tipo = $elemento;
}
}
//Provincia
if (empty($this->provincia) && !empty($entidad[$this->name]['provincia_id'])) {
$elementos = new Provincia();
$elemento = $elementos->findById($entidad[$this->name]['provincia_id']);
if (!empty($elemento)) {
$this->provincia = $elemento;
}
}
//Localidad
if (empty($this->localidad) && !empty($entidad[$this->name]['localidad_id'])) {
$elementos = new Localidad();
$elemento = $elementos->findById($entidad[$this->name]['localidad_id']);
if (!empty($elemento)) {
$this->localidad = $elemento;
}
}
//Zona
if (empty($this->zona) && !empty($entidad[$this->name]['zona_id'])) {
$elementos = new Zona();
$elemento = $elementos->findById($entidad[$this->name]['zona_id']);
if (!empty($elemento)) {
$this->zona = $elemento;
}
}
}
private function getTitulo($entidad) {
$out = '';
//Tipo de inmueble
if (!empty($this->tipo)) {
$out .= Inflector::singularize($this->tipo['InmuebleTipo']['nombre']);
}
//Tipo de gestión
if (!empty($this->gestion)) {
$out .= ' en ' . strtolower($this->gestion['InmuebleGestion']['nombre']);
}
//Localidad
if (!empty($this->localidad)) {
$out .= " en {$this->localidad['Localidad']['nombre']}";
}
//Información extra (habitaciones, baños, superficie construida)
$extra = array();
if (!empty($entidad[$this->name]['num_habitaciones'])) {
$extra[] = "{$entidad[$this->name]['num_habitaciones']} habitaciones";
}
if (!empty($entidad[$this->name]['num_banos'])) {
$extra[] = "{$entidad[$this->name]['num_banos']} baños";
}
if (!empty($entidad[$this->name]['superficie_construida'])) {
$extra[] = "{$entidad[$this->name]['superficie_construida']} m<sup>2</sup>";
}
if (!empty($extra)) {
if (count($extra) == 1) {
$out .= ' con ' . implode(', ', $extra);
} else {
$extraLast = array_pop($extra);
$out .= ' con ' . implode(', ', $extra) . " y $extraLast";
}
}
//Precio
if (!empty($this->gestion['InmuebleGestion']) && in_array((int) $this->gestion['InmuebleGestion']['id'], Configure::read('Inmueble.gestionesAlquiler')) && !empty($entidad[$this->name]['precio_alquiler'])) {
if (empty($entidad[$this->name]['alquiler'])) {
$entidad[$this->name]['alquiler'] = 'MES';
}
$alquiler = Configure::read('Inmueble.alquileres');
$out .= ' por ' . number_format($entidad[$this->name]['precio_alquiler'], 0, ',', '.') . ' €/' . $alquiler[$entidad[$this->name]['alquiler']];
} elseif (!empty($entidad[$this->name]['precio'])) {
$out .= ' por ' . number_format($entidad[$this->name]['precio'], 0, ',', '.') . ' €';
}
return $out;
}
private function getTituloCorto($entidad) {
$out = '';
//Tipo de inmueble
if (!empty($this->tipo)) {
$out .= Inflector::singularize($this->tipo['InmuebleTipo']['nombre']);
//Localidad
if (!empty($this->localidad)) {
$out .= " en {$this->localidad['Localidad']['nombre']}";
}
}
return $out;
}
private function getInmuebleSeo($entidad) {
$out = '';
//Tipo de inmueble
if (!empty($this->tipo)) {
$out .= Inflector::singularize($this->tipo['InmuebleTipo']['nombre']);
//Tipo de gestión
if (!empty($this->gestion)) {
$out .= '-en-' . $this->gestion['InmuebleGestion']['nombre'];
}
}
//Localidad
if (!empty($this->localidad)) {
$out .= '-en-' . $this->localidad['Localidad']['nombre'];
}
//Zona
if (!empty($this->zona)) {
$out .= '-zona-' . $this->zona['Zona']['nombre'];
}
//Habitaciones
if (!empty($entidad[$this->name]['num_habitaciones'])) {
$out .= "-{$entidad[$this->name]['num_habitaciones']}-habitaciones";
}
//Referencia
if (!empty($entidad[$this->name]['referencia'])) {
$out .= "-{$entidad[$this->name]['referencia']}";
}
return strtolower(Inflector::slug($out, '-'));
}
public function beforeFind($query = array()) {
//Comprobamos si existe el array de condiciones...
if (!is_array($query['conditions'])) {
$query['conditions'] = array();
}
if (!array_key_exists($this->name . '.borrado', $query['conditions']) && !array_key_exists('borrado', $query['conditions'])) {
$query['conditions'][$this->name . '.borrado'] = false;
}
return $query;
}
}