<?php
/**
  Clase Articulo
  @version 1.1
  Versión 1.1 ==> 15/Noviemb/2016 =>	Añadida función estática para buscar un producto por ean o código indistíntamente
  La clase artículo utilizará esta misma función para localizar el producto en el parámetro $ean
  Versión 2.0 ==> Vamos a optimizar las cargas de producto y las select que se utilizan aquí.
	Se cargará siempre el producto sin sus datos adicionales (escaparates asociados, temas, adjuntos, etc. Según el caso el diseñoador decidirá qué cargar.
	se hará una única carga por EAN y código y se cogerá el primero de los dos elementos_relacionados
 */
 
class SuperArticulo extends Apartado {
	public static $campos_tabla = array();
	public static $alias = '';
	public static $nombreTabla = '';
	public static $camposSelect = '';
	public static $whereSelect = '';
	public static $publicFieldList = array();


    public $codigo = 0;
    public $tipo = 0;
    public $nombre = 0;
    public $subtitulo = 0;
    public $stock = 0;
    public $pvp = 0;
    public $iva = 0;
    public $base = 0;
    public $ean = 0;
    public $referencia = 0;
    public $isbn = 0;
    public $autor = 0;
    public $fecha_alta = 0;
    public $num_paginas = 0;
    public $peso = 0;
    public $alto = 0;
    public $ancho = 0;
    public $ilustrador = 0;
    public $observaciones = 0;
    public $fecha_ult_modif = 0;
    public $editorial = '';
    public $cod_editorial = 0;
    public $cod_distribuidor = 0;
    public $coleccion = 0;
    public $no_web = 0;
    public $familia = 0;
    public $familia_nombre = '';
    public $foto = 0;
    public $tema = '';
	public $tematica_restrictiva = '';		//Pedro 09/Septiembre/2019 ==> Temática más restrictiva para este artículo. La usamos para obtener los artículos asociados
    public $pvpoferta = 0;
    public $base_pvpoferta = 0;
    public $dto_maximo = 0;
    public $texto = 0;
    public $pvp_tar1 = 0;
    public $pvp_tar2 = 0;
    public $pvp_tar3 = 0;
    public $pvp_tar4 = 0;
	public $pvp_tar = Array();
    public $dto_tar1 = 0;
    public $dto_tar2 = 0;
    public $dto_tar3 = 0;
    public $dto_tar4 = 0;
	public $dto_tar = Array();
    public $fecha_envio = 0;
    public $pendiente_envio = 0;
    public $fecha_creacion_web = 0;
    public $encuadernacion = 0;
    public $edicion = 0;
    public $ano_edicion = 0;
    public $suma_votos = 0;
    public $total_votos = 0;
    public $estado = 0;
    public $stock_disponible = 0;
    public $desde_edad = 0;
    public $hasta_edad = 0;
    public $promociones = 0;
	public $nombrePromociones = '';
	public $descuentoPromociones = 0;
    public $nivel_lectura = 0;
    public $curso = 0;
    public $ubicacion1 = 0;
    public $ubicacion2 = 0;
    public $unidades_caja = 1;
    public $tipo_precio = 'F';
    public $nombreColeccion = '';
    public $numeroColeccion = 0;
    public $talla = '';
    public $color = 'gris';
    public $articulo_padre = 0;
    public $fecha_ultima_compra = '0000-00-00';
    public $pendiente_envio_suscripcion = 0;
    public $fecha_envio_suscripcion = 0;
    public $temas = array();
    public $lista_escaparates = array();
    //Le añado el descuento para el usuario y el precio para el usuario
    public $descuento_cliente = 0;
    public $pvp_final = 0;
    public $base_final = 0;
	public $pvp_final_sin_dto = 0;	//El precio al que hay que vender el producto SIN el descuento aplicado
	public $base_final_sin_dto = 0;	//La base al que hay que vender el producto SIN el descuento aplicado
	public $adjuntos = array();
	//180807 ==> Cargamos ofertas de artículo:
	public $ofertasRegalo = array();
	//26/Octubre/2018 ==> Añadimos el stock mínimo
	public $stock_minimo = 0;
	//recogemos en estas variables aspectos del constructor para usarlos internamente en la clase
		//Los hago públicos para que estén disponibles en los overrides
	public $cliente = NULL;
	public $cantidad = 1;
	public $linea_lote = NULL;	//Si pertenece a un lote, este es ol objeto del mismo
	public $solo_datos = true;
		//14/03/19 Tati=> Añado los datos seo 
	public $nombre_seo = '';
	public $title_seo = '';
	public $descripcion_seo = '';
	public $keywords_seo = '';
		
	//Vamos a sobreescribir en esta clase los alias y campos porque necesitamos más:
	
	public static function getCampos($soloPrincipal = NULL){
		static::$nombreTabla = strtolower(get_called_class());
		static::getTablaRelacionada();
		//static::$campos_tabla = BaseDatos::$dictionary->{static::$nombreTabla . 'Campos'}; //==> Comento esta línea porque creo que no sirve pa na
		//Una vez que tenemos el nombre de la tabla, vamos a obtener los campos de la misma y los nombres para la selec
		$campos = '';
		if (static::$nombreTabla != ''){
			$campos = ' ';
			if ($soloPrincipal || $soloPrincipal === NULL){
				//$campos .= BaseDatos::dameCamposAlias(BaseDatos::$dictionary->{static::$nombreTabla . 'Campos'}, static::getAlias());
				$campos .= BaseDatos::dameCamposAlias(static::$nombreTabla);
			}
			if ($soloPrincipal === false || $soloPrincipal === NULL){
				/*$campos .= ( (trim($campos) != ' ') ? ', ' : '' ) . 
				BaseDatos::dameCamposAlias(BaseDatos::$dictionary->{TraduccionArticulo::getNombreTabla() . 'Campos'}, TraduccionArticulo::getAlias()) . ', ' .
				BaseDatos::dameCamposAlias(BaseDatos::$dictionary->{SeoArticulo::getNombreTabla() . 'Campos'}, SeoArticulo::getAlias()) . ', ' .
				BaseDatos::dameCamposAlias(BaseDatos::$dictionary->{Familia::getNombreTabla() . 'Campos'}, Familia::getAlias());*/
				$campos .= ( (trim($campos) != ' ') ? ', ' : '' ) . 
				BaseDatos::dameCamposAlias(TraduccionArticulo::getNombreTabla()) . ', ' .
				BaseDatos::dameCamposAlias(SeoArticulo::getNombreTabla()) . ', ' .
				BaseDatos::dameCamposAlias(Familia::getNombreTabla()) . ', ' .
				BaseDatos::dameCamposAlias('promociones');
			}
			if ($soloPrincipal == NULL){
				static::$camposSelect = $campos;
			}
		}
		return($campos);
	}
	
	public static function getNombreTabla($soloPrincipal = NULL){
		$idioma = WSLocale::$idioma;
		//Incluimos los globals para coger el valor del idioma:
		//include('comunes/globals.php');
		static::$nombreTabla = strtolower(get_called_class());
		static::getTablaRelacionada();
		//Ahora vamos a componer el nombre de la tabla teniendo en cuenta si es sólo principal, si no o si es todo (NULL)
		$consulta = ' ';
		$aliasPropio = static::getAlias();
		//$aliasPropioCodigo = ' `' .  $aliasPropio . '`.`codigo` ';
		if ($soloPrincipal || $soloPrincipal === NULL){
			$consulta .= '`' . static::$nombreTabla . '` as `' .  $aliasPropio . '` ';
		}
		if ($soloPrincipal === false || $soloPrincipal === NULL){	//Si "Sólo principal" es false, consulta sólo me da los leftjoin :D
			//Vamos a hacer los left join necesarios:
			//Ejemplo completo de la llamada:
			//static::getJoin(tabla, Array campos origen (literales empiezan por $), Tabla destino, Array campos origen (literales empiezan por $), array de condiciones, array de operadores, 'left/right join');
			$consulta .= static::getJoin('Articulo', array('codigo', '$' . $idioma), 'TraduccionArticulo', array('articulo', 'idioma'));
			$consulta .= static::getJoin('Articulo', array('codigo', '$' . $idioma), 'SeoArticulo', array('articulo', 'idioma'));
			$consulta .= static::getJoin('Articulo', 'familia', 'Familia', 'codigo');
			$consulta .= static::getJoin('Articulo', 'promociones', 'promociones', 'codigo');
			/*'LEFT JOIN ' . TraduccionArticulo::getNombreTabla() . ' `' . TraduccionArticulo::getAlias() . '` on (' . $aliasPropioCodigo . ' = `' .  TraduccionArticulo::getAlias() . '`.`articulo` AND `' .  TraduccionArticulo::getAlias() . '`.`idioma` = "' . $idioma . '")
			LEFT JOIN ' . SeoArticulo::getNombreTabla() . ' `' . SeoArticulo::getAlias() . '` on(`' . SeoArticulo::getAlias() . '`.`articulo` = ' . $aliasPropioCodigo . ' AND `' . SeoArticulo::getAlias() . '`.`idioma` = "' . $idioma . '" ) 
			LEFT JOIN ' . Familia::getNombreTabla() . ' `' . Familia::getAlias() . '` on (`' . $aliasPropio . '`.`familia` = `' . Familia::getAlias() . '`.`codigo` ) ';*/
		}
		$consulta .= ' ';
		//Sólo asignamos el nombre de la tabla si no nos piden más parámetros
		if ($soloPrincipal == NULL){
			static::$nombreTabla = $consulta;
		}
		//echo($consulta);
		return($consulta);
	}
	
	public static function getWhereTabla(){
		$argumentos = func_get_args();
		$ean_articulo = isset($argumentos[0]) ? $argumentos[0] : NULL;
		$no_web = isset($argumentos[1]) ? $argumentos[1] : 0;
		$limitar = isset($argumentos[2]) ? $argumentos[2] : true;
		
		//include('comunes/globals.php');
		static::$whereSelect = '';
		if ($ean_articulo != NULL) {
			static::$whereSelect .= ' `' . static::getAlias() . '`.`codigo` = "' . $ean_articulo . '" OR `' .  static::getAlias() . '`.`ean` = "' . $ean_articulo . '"';
		}
		if ($no_web) {
			static::$whereSelect .= (static::$whereSelect != '') ? ' AND ' : '';
			static::$whereSelect .= ' `' .  static::getAlias() . '`.`no_web` = 0';
		}
		if (Shop::$configuracion->ocultar_stock_0) {
			static::$whereSelect .= (static::$whereSelect != '') ? ' AND ' : '';
			static::$whereSelect .= ' `' .  static::getAlias() . '`.`stock` > 0';
		}
		if ($limitar){
			static::$whereSelect .= ' LIMIT 1 ';
		}
		return(static::$whereSelect);
	}
	
    function __construct($ean_articulo = NULL, $cliente = NULL, $cantidad = 1, $linea_lote = 0, $no_web = true, $solo_datos = true) {
        include('comunes/globals.php');
        //Si el cliente que nos han pasado es nulo, cogemos el de la sesión
        if ($this->cliente == NULL) {
			$usuario = Usuario::logueado();
			if ($usuario != NULL){
				//$this->cliente = Sesion::get('cod_cliente_web');
				$this->cliente = $usuario->codigo;
			}
        }
        $idioma = WSLocale::$idioma;
        $cod_articulo = NULL;
		$filaArticulo = NULL;
		$this->cantidad = $cantidad;
		$this->linea_lote = (is_object($linea_lote)) ? $linea_lote : NULL;	//Por retrocompatibilidad dejo esto así para que si me mandan un número no haga nada
		//Vamos a convertir este constructor en un V2:
		if (is_a($ean_articulo, 'OpcionesWidget')) {
			$opciones = $ean_articulo;
			$ean_articulo = ($opciones->configuracion->ean_articulo != NULL) ? $opciones->configuracion->ean_articulo : 0;
			$this->cliente = ($opciones->configuracion->cliente != NULL) ? $opciones->configuracion->cliente : $this->cliente;
			$this->cantidad = ($opciones->configuracion->cantidad != NULL) ? $opciones->configuracion->cantidad : $cantidad;
			$this->linea_lote = ($opciones->configuracion->linea_lote != NULL) ? $opciones->configuracion->linea_lote : $linea_lote;
			$no_web = ($opciones->configuracion->no_web != NULL) ? $opciones->configuracion->no_web : $no_web;
			$this->solo_datos = ($opciones->configuracion->solo_datos != NULL) ? $opciones->configuracion->solo_datos : $this->solo_datos;
			$filaArticulo = ($opciones->configuracion->filaArticulo != NULL) ? $opciones->configuracion->filaArticulo : $filaArticulo;
		}
		
        //Si el ean recibido es un array, entonces hemos recibido ean y c??o
        if (is_array($ean_articulo)) {
            if (count($ean_articulo) > 1) {
                $ean_articulo = $ean_articulo[1];
            }
            $ean_articulo = $ean_articulo[0];
        }
		
		//Ojo a la posibilidad de haber recibido una "fila" de artículo:
		$fila = NULL;
		
		if ($filaArticulo == NULL){
			if (intval($ean_articulo) > 0) {
				//Preparamos el FROM con las uniones correspondientes
				$sentencia_sql = 'SELECT ' . Articulo::getCampos() . ' 
									FROM ' . Articulo::getNombreTabla() . '
									WHERE ' .Articulo::getWhereTabla($ean_articulo, $no_web);
				
				//echo("$sentencia_sql <br />\n");

				$bd = new BaseDatos();
				if ($bd->isConectado()){
					$bd->setConsultaSQL($sentencia_sql);
					$fila = $bd->getFila();
				}
			}
		}else{
			$fila = $filaArticulo;
		}

		$this->extractData($fila);

		//echo("<pre>");
		//var_dump($this);
		//echo("</pre>");
	}

	public function extractData($fila){
		$idioma = WSLocale::$idioma;
		if ($fila != NULL){
			$aliasTabla = static::getAlias();
			$this->codigo = $this->getProp($fila, 'codigo');
			$this->tipo = $this->getProp($fila, 'tipo');
			$this->nombre = trim($this->getProp($fila, 'nombre'));
			$this->subtitulo = $this->getProp($fila, 'subtitulo');
			$this->stock = (int) $this->getProp($fila, 'stock');
			$this->pvp = (float) $this->getProp($fila, 'pvp');
			$this->iva = (int) $this->getProp($fila, 'iva');
			$this->base = $this->pvp / ( 1 + ( $this->iva / 100 ) );
			$this->ean = trim($this->getProp($fila, 'ean'));
			$this->referencia = trim($this->getProp($fila, 'referencia'));
			$this->isbn = trim($this->getProp($fila, 'isbn'));
			$this->autor = $this->getProp($fila, 'autor');
			$this->fecha_alta = $this->getProp($fila, 'fecha_alta');
			$this->num_paginas = (int) $this->getProp($fila, 'num_paginas');
			$this->peso = (int) $this->getProp($fila, 'peso');
			$this->alto = (int) $this->getProp($fila, 'alto');
			$this->ancho = (int) $this->getProp($fila, 'ancho');
			$this->ilustrador = $this->getProp($fila, 'ilustrador');
			$this->observaciones = $this->getProp($fila, 'observaciones');
			$this->fecha_ult_modif = $this->getProp($fila, 'fecha_ult_modif');
			$this->editorial = $this->getProp($fila, 'editorial');
			$this->cod_editorial = $this->getProp($fila, 'cod_editorial');
			$this->cod_distribuidor = $this->getProp($fila, 'cod_distribuidor');
			$this->coleccion = $this->getProp($fila, 'coleccion');
			$this->no_web = (int) $this->getProp($fila, 'no_web');
			$this->familia = $this->getProp($fila, 'familia');
			//$this->asigna_familia(); ==> TODO
			$this->familia_nombre = $this->getProp($fila, 'nombre', Familia::getAlias());
			$this->foto = (int) $this->getProp($fila, 'foto');
			$this->tema = $this->getProp($fila, 'tema');
			$this->pvpoferta = (float) $this->getProp($fila, 'pvpoferta');
			if ($this->pvpoferta == 0) {
				$this->pvpoferta = $this->pvp;
			}
			$this->dto_maximo = (int) $this->getProp($fila, 'dto_maximo');
			$this->texto = (int) $this->getProp($fila, 'texto');
			$this->pvp_tar1 = (float) $this->getProp($fila, 'pvp_tar1');
			$this->pvp_tar2 = (float) $this->getProp($fila, 'pvp_tar2');
			$this->pvp_tar3 = (float) $this->getProp($fila, 'pvp_tar3');
			$this->pvp_tar4 = (float) $this->getProp($fila, 'pvp_tar4');
			$this->pvp_tar = [$this->pvp_tar1, $this->pvp_tar2, $this->pvp_tar3, $this->pvp_tar4];
			$this->dto_tar1 = (int) $this->getProp($fila, 'dto_tar1');
			$this->dto_tar2 = (int) $this->getProp($fila, 'dto_tar2');
			$this->dto_tar3 = (int) $this->getProp($fila, 'dto_tar3');
			$this->dto_tar4 = (int) $this->getProp($fila, 'dto_tar4');
			$this->dto_tar = [$this->dto_tar1, $this->dto_tar2, $this->dto_tar3, $this->dto_tar4];
			$this->fecha_envio = $this->getProp($fila, 'fecha_envio');
			$this->pendiente_envio = $this->getProp($fila, 'pendiente_envio');
			$this->fecha_creacion_web = $this->getProp($fila, 'fecha_creacion_web');
			$this->encuadernacion = $this->getProp($fila, 'encuadernacion');
			$this->edicion = (int) $this->getProp($fila, 'edicion');
			$this->ano_edicion = (int) $this->getProp($fila, 'ano_edicion');
			$this->suma_votos = (int) $this->getProp($fila, 'suma_votos');
			$this->total_votos = (int) $this->getProp($fila, 'total_votos');
			$this->estado = (int) $this->getProp($fila, 'estado');
			$this->stock_disponible = (int) $this->getProp($fila, 'stock_disponible');
			$this->desde_edad = (int) $this->getProp($fila, 'desde_edad');
			$this->hasta_edad = (int) ($this->getProp($fila, 'hasta_edad') == 0) ? 99 : $this->getProp($fila, 'hasta_edad');
			//Aquí cargo la tabla promociones, teniendo en cuenta que lo que voy a hacer es traerme al producto el nombre de la misma y el dto:
			$this->promociones = (int) $this->getProp($fila, 'promociones');
			$this->nombrePromociones = (int) $this->getProp($fila, 'nombre', BaseDatos::dameAlias('promociones'));
			$this->descuentoPromociones = (int) $this->getProp($fila, 'descuento', BaseDatos::dameAlias('promociones'));
			//Ojo, es posible que la promoción esté fuera de fecha, es por ello que vamos a asegurarnos de que no sea así.
			$fecha_inicio_promocion = strtotime($this->getProp($fila, 'desde_fecha', BaseDatos::dameAlias('promociones')));
			$fecha_fin_promocion = strtotime($this->getProp($fila, 'hasta_fecha', BaseDatos::dameAlias('promociones')));
			$hoy = time();
			if ( ($hoy < $fecha_inicio_promocion) || ($hoy > $fecha_fin_promocion) ){
				$this->promociones = 0;
				$this->nombrePromociones = '';
				$this->descuentoPromociones = 0;
			}
			//Sigo leyendo datos del producto
			$this->nivel_lectura = (int) $this->getProp($fila, 'nivel_lectura');
			$this->curso = $this->getProp($fila, 'curso');
			$this->ubicacion1 = $this->getProp($fila, 'ubicacion1');
			$this->ubicacion2 = $this->getProp($fila, 'ubicacion2');
			$this->unidades_caja = $this->getProp($fila, 'unidades_caja');
			//Pequeña correción, puede que unidades caja sea 0
			$this->unidades_caja = ($this->unidades_caja == 0) ? 1 : $this->unidades_caja;
			//OJO, siempre que sean libros, las unidades x caja será 1 (se hace así desde que descubrimos que galo usa este campo para otra cosa en libros
			$this->unidades_caja = ($this->tipo == 'L') ? 1 : $this->unidades_caja;
			$this->tipo_precio = ($this->getProp($fila, 'tipo_precio') == '') ? $this->tipo_precio : $this->getProp($fila, 'tipo_precio');
			$this->nombreColeccion = $this->getProp($fila, 'nombre_coleccion');
			$this->numeroColeccion = $this->getProp($fila, 'numero_coleccion');
			$this->talla = $this->getProp($fila, 'talla');
			$this->color = $this->getProp($fila, 'color');
			$this->articulo_padre = $this->getProp($fila, 'articulo_padre');
			$this->fecha_ultima_compra = $this->getProp($fila, 'fecha_ultima_compra');
			$this->pendiente_envio_suscripcion = (int) $this->getProp($fila, 'pendiente_envio_suscripcion');
			$this->fecha_envio_suscripcion = $this->getProp($fila, 'fecha_envio_suscripcion');
			//Traducciones
			$this->observaciones = $this->getProp($fila, 'traduccion', TraduccionArticulo::getAlias());
			//datos SEO:
			$this->nombre_seo = ($this->getProp($fila, 'nombre', SeoArticulo::getAlias()) != '') ? $fila[SeoArticulo::getAlias() . '_' . 'nombre'] : $this->nombre;
			$this->title_seo = ($this->getProp($fila, 'title', SeoArticulo::getAlias()) != '') ? $fila[SeoArticulo::getAlias() . '_' . 'title'] : $this->nombre;
			$this->descripcion_seo = ($this->getProp($fila, 'descripcion', SeoArticulo::getAlias()) != '') ? $fila[SeoArticulo::getAlias() . '_' . 'descripcion'] : $this->observaciones;
			$this->keywords_seo = ($this->getProp($fila, 'keywords', SeoArticulo::getAlias()) != '') ? $fila[SeoArticulo::getAlias() . '_' . 'keywords'] : $this->nombre;

			//Añadido el 26/Octubre/2018
			$this->stock_minimo = $this->getProp($fila, 'stock_minimo');
			//Si el artículo no pertenece a ningún escaparate, vamos a crear el 'otros-productos'
			$this->url = Shop::$configuracion->url . traducir('otros-productos');

			//Sólo cargamos el resto de datos si así se nos ha especificado
			if (!$this->solo_datos) {
				//$this->asigna_temas();
				$this->rellena_escaparates();
				//Como tenemos todos los escaparates del producto, vamos a coger el primero para la URL (si es q hay alguno)
				if (count($this->lista_escaparates) > 0) {
					//Si pertenece a algúne scaparate, cogemos SIEMPRE el primero
					$this->url = $this->lista_escaparates[0]->url;
				}
			}else{
				//Esto es antiguo pero lo mantenemos por ahora
				//Vamos a cargar aquí mismo el último escaparate:
				$sentencia_sql = 'SELECT IFNULL(`b`.`nombre`, `c`.`nombre`) nombre_escaparate
								FROM `categorias_productos` a, (`traducesca` b LEFT JOIN `cesca_seo` c ON `b`.`escaparate` = `c`.`cescaparate` AND `b`.`idioma` = "' . $idioma . '" AND `c`.`idioma` = "' . $idioma . '") 
								WHERE `a`.`articulo` = ' . $this->codigo . '  
								AND `a`.`categoria` = `b`.`escaparate`
								ORDER BY `orden` DESC LIMIT 0,1';
				//echo("$sentencia_sql\n<br />");
				$bdUrl = new BaseDatos();
				$bdUrl->setConsultaSQL($sentencia_sql);
				if ($fila = $bdUrl->getFila()){
					$this->url = corregir_url(Shop::$configuracion->url . (str_replace(array('/', '\\'), '_', $fila['nombre_escaparate'])));
				}
			}

			//Por último, dejamos la URL con un formato bonito
			
			$this->url .= corregir_url('/' . (str_replace(array('/', '\\'), '_', $this->nombre_seo)) . '-p' . $this->ean);
			//Si el producto NO está en un lote, entonces cargamos su precio de forma natural
			$this->pvp_final = 0;
			//Necesitamos asegurarnos de que el lote que nos han pasado contiene el artículo
			if ($this->linea_lote != NULL) {
				if ( ($this->linea_lote->trabaja_cantidades) || ($this->linea_lote->trabaja_cantidades_pvp) ){
					$this->cantidad = $this->linea_lote->cantidad;	//El lote lleva una cantidad fija, es la que se meterá en la cesta
					if ($this->linea_lote->trabaja_cantidades_pvp){
						//TODO, aquí hay que trabajar el código de descuento aplicado
						$this->pvpoferta = $this->linea_lote->pvp;
						$this->pvp_final = $this->linea_lote->pvp;
						$this->pvp_final_sin_dto = $this->linea_lote->pvp;
					}
				}
			}

			//Si no tenemos PVP, vamos a ver el precio del artículo y su tarifa, etc...
			if ($this->pvp_final == 0) {
				//Lo primero es controlar que no haya un descuento global:
				if (Shop::$configuracion->descuentoGlobal > 0){
					$pvp_dto_arti = array(Shop::$configuracion->descuentoGlobal, $this->pvp);
				}else{
					//Vamos a calcular precio y descuento
					$pvp_dto_arti = $this->calcula_precio_articulo($this->cliente, $this->cantidad);
				}
				$this->descuento_cliente = ($this->descuentoPromociones > 0 ) ? $this->descuentoPromociones  : $pvp_dto_arti[0];	//Las promociones van SIEMPRE aplicadas, por tanti si las hay, se suman
				$pvp_dto_arti[0] = $this->descuento_cliente;	//Es posible que se haya aplicado alguna promocion, así que hay que actualizar el descuento
				if ($pvp_dto_arti[1] == 0) {
					$pvp_dto_arti[1] = $this->pvp;
				}
				$this->pvp_final_sin_dto = $pvp_dto_arti[1];
				$this->pvp_final = Price::setDiscount($this->pvp_final_sin_dto, $this->descuento_cliente);
			} else {
				
			}
			/*
			//Pedro 10/Julio/2019 ==> Esto tenemos que hacerlo más arriba
			//Si hemos recibido alg??ote, es el momento de ver si tenemos ese lote en los descuentos para ver cual es su descuento
			if ($this->lote > 0) {
				$indice_dto_lote = Lote::buscar_dto_lote($this->lote);
				$cod_dto_lote_actual = '';
				$porcen_dto_actual = 0;
				if ($indice_dto_lote > -1) {
					$array_descuentos_lotes = Sesion::get('array_descuentos_lotes');
					$cod_dto_lote_actual = explode('|', $array_descuentos_lotes[$indice_dto_lote]);
					$porcen_dto_actual = $cod_dto_lote_actual[1];
					$this->pvp_final_sin_dto = $this->pvp_final;
					$this->pvp_final = Price::setDiscount($this->pvp_final, $porcen_dto_actual);
				}
			}*/
			
			//Vamos a cargar los temas del producto:
			$this->temas = Tema::cargarDesdeArticulo($this->codigo);
			$this->tematica_restrictiva = $this->getTematicaRestrictiva();	//Pedro 09/Septiembre/2019 ==> Cargamos la temática más restrictiva para este artículo
		}
		//Lo ultimo es calcular la base del pvp final:
		$this->base_final = $this->pvp_final / ( 1 + ( $this->iva / 100 ) );
		$this->base_final_sin_dto = $this->pvp_final_sin_dto / ( 1 + ( $this->iva / 100 ) );
		$this->base_pvpoferta = $this->pvpoferta / ( 1 + ( $this->iva / 100 ) );
		$this->adjuntos = Ebook::cargarAdjuntos($this->ean);
	}
	
	function venderAdjuntos($cod_usuario){
		include('comunes/globals.php');
		$retorno = false;
		//Controlamos si hemos recibido un código o un objeto
		$usuario = NULL;
		if (is_a($cod_usuario, 'Usuario')){
			$usuario = $cod_usuario;
			$cod_usuario = $usuario->codigo;
		}else{
			$usuario = new Usuario($cod_usuario);
			$cod_usuario = $usuario->codigo;
		}
		//si tenemos un usuario bien creado vamos a utilizarlo:
		if ($cod_usuario > 0){
			$bd = new BaseDatos();

			//Vamos a limpiar las descargas que ya  existan para ese cliente y ean:
			$sentenciaBorrado = 'DELETE FROM `descargas_ebook` WHERE `ean` = ' . $this->ean . ' AND `usuario` = \'' . $cod_usuario . '\';';
			$bd->setConsultaSQL($sentenciaBorrado);
			
			//Necesitamos los adjuntos:
			$adjuntos = Ebook::getRutasAdjuntos($this->ean);
			$sentencia_sql = '';
			foreach($adjuntos as $clave => $valor){
				$sentencia_sql .= ( ($sentencia_sql != '')?',':'' ) . ' ( \'' . $this->ean . '\', \'' . $valor . '\', \'' . $cod_usuario . '\' ) ';
			}
			//echo("$sentencia_sql<br />\n");
			
			//Una vez q tenemos la select, vamos a hacer el insert
			if ($sentencia_sql != ''){
				$sentencia_sql = 'INSERT INTO descargas_ebook (`ean`, `ruta`, `usuario`) VALUES ' . $sentencia_sql;
			}
			//Para hacer pruebas, no actualizo el pedido
			$bd->setConsultaSQL($sentencia_sql);
			if ($bd->getNumeroFilas() > 0){
				$retorno = true;
			}
		}
		return($retorno);
	}
	
    function __destruct() {
        //Limpiamos los hijos que tenga asociados al artículo
        for ($i = 0; $i < count($this->temas); $i++) {
            unset($this->temas[$i]);
        }
        for ($i = 0; $i < count($this->lista_escaparates); $i++) {
            unset($this->lista_escaparates[$i]);
        }
    }
	
    /*public function asigna_temas() {
        include('comunes/globals.php');
        $sentencia_sql = "SELECT tema FROM temasarti WHERE articulo = " . $this->codigo;
		$bd = new BaseDatos();
		$bd->setConsultaSQL($sentencia_sql);
		while ($fila = $bd->getFila()){
			$this->temas[count($this->temas)] = new Temas($fila['tema']);
		}
    }*/

    public function rellena_escaparates() {
        include('comunes/globals.php');
		$idioma = WSLocale::$idioma;
        $sentencia_sql = 'SELECT `categoria` FROM `categorias_productos` WHERE `articulo` = ' . $this->codigo . ' ORDER BY `orden` DESC';
        //echo("$sentencia_sql\n<br />");
		$bd = new BaseDatos();
		$bd->setConsultaSQL($sentencia_sql);
		while ($fila = $bd->getFila()){
                    //comento esta linea porque antes la select era por codigo y ahora en la tabla nueva que hemos creado es categoria
			//$escaparateTMP = new Escaparate($fila['codigo'], 1);
			$escaparateTMP = new Escaparate($fila['categoria'], 1);
			if ($escaparateTMP->objeto_vacio == 0) {
				$this->lista_escaparates[count($this->lista_escaparates)] = $escaparateTMP;
			}
		}
    }

    public function dame_indice_escaparate_codigo($codigo_a_buscar) {
        $retorno = NULL;
        //Buscamos el índice en el array de códigos de escaparate
        $encontrado = false;
        for ($i = 0; ( ($i < count($this->lista_escaparates)) && (!($encontrado))); $i++) {
            if ($this->lista_escaparates[$i]->codigo == $codigo_a_buscar) {
                $retorno = $i;
                $encontrado = true;
            }
        }
        return($retorno);
    }

    public function productos_relacionados($cantidad = 0, $seleccion_x_escaparate = false) {
        include('comunes/globals.php');
        $retorno = 0;
        if ($cantidad == 0) {
            $cantidad = Shop::$configuracion->elementos_relacionados;
        }
        $codigos_a_quitar = "'" . $this->codigo . "'";
		/*
        if ($seleccion_x_escaparate) {
            //Cuando hay selección por escaparate, cargamos primero los asociados por escaparate y después por otros datos:
            $this->lista_articulos = $this->relacionados_x_escaparate($cantidad, $this->lista_articulos, $codigos_a_quitar);
            $codigos_a_quitar = $this->extraerCodigo(false, $this->codigo);
            $this->lista_articulos = $this->relacionados_x_datosArti($cantidad, $this->lista_articulos, $codigos_a_quitar);
        } else {
            $this->lista_articulos = $this->relacionados_x_datosArti($cantidad, $this->lista_articulos, $codigos_a_quitar);
            $codigos_a_quitar = $this->extraerCodigo(false, $this->codigo);
            $this->lista_articulos = $this->relacionados_x_escaparate($cantidad, $this->lista_articulos, $codigos_a_quitar);
        }
		*/
		$this->relacionados_x_temas($cantidad, $this->lista_articulos, $codigos_a_quitar);
		$this->relacionados_x_escaparate($cantidad, $this->lista_articulos, $codigos_a_quitar);
		$this->relacionados_x_datosArti($cantidad, $this->lista_articulos, $codigos_a_quitar);
        $retorno = count($this->lista_articulos);
		//var_dump($this->lista_articulos);
        return($retorno);
    }

	public function relacionados_x_temas($cantidad, $lista_actual = array(), $codigos_a_quitar = "") {
        include('comunes/globals.php');
		//Sentencia por optimizar
        if (count($lista_actual) < $cantidad) {
			//Vamos a coger los filtrados:
			$this->adaptarFiltrado('', true);	//==> Encargado de generar los filtrados de sesión o temporales del usuario
			$this->filtradoGlobal();			//==> Encargado de generar los filtrados globales de la web
            $cantidad = $cantidad - count($lista_actual);
			//Modificado por Pedro el 17/Junio/2019 ==> Si no hay cantidad no seguimos
			if ( ($cantidad > 0) && ($this->tematica_restrictiva != '') ){
				//Vamos a componernos una select en condiciones:
				$this->nombreTablas = static::getNombreTabla() . ' 
						LEFT JOIN `temasarti` ON 
							( `temasarti`.`articulo` = `' . $this->getAlias() . '`.`codigo` ) ';
				$this->camposTabla = ' DISTINCT ' . static::getCampos();	//Le dejo el distinct para que saque los que tienen distinto código
				//Componemos los where asegurándonos de que son los temas del artículo y sólo los artículos con la temática restrictiva
				$this->whereTabla =  '( `' . $this->getAlias() . '`.`tema` = \'' . $this->tematica_restrictiva . '\' 
								OR `temasarti`.`tema` = \'' . $this->tematica_restrictiva . '\' )  
								AND ' . '`' . static::getAlias() . '`.no_web = 0 ';

				//Creamos el orden:
				$this->crea_orden(' ORDER BY RAND() ', true);

				//Cargamos los productos
				$this->carga_articulos(0, $cantidad);
				/*echo("<!--\n");
				echo( 'SELECT ' . $this->camposTabla . ' 
				FROM ' . $this->nombreTablas . '
				WHERE ' . $this->whereTabla);
				echo("-->\n");*/
			}
        }
        return($this->lista_articulos);
    }

    public function relacionados_x_datosArti($cantidad, $lista_actual = array(), $codigos_a_quitar = "") {
        include('comunes/globals.php');
		//Sentencia por optimizar
        if (count($lista_actual) < $cantidad) {
			//Vamos a coger los filtrados:
			$this->adaptarFiltrado('', true);	//==> Encargado de generar los filtrados de sesión o temporales del usuario
			$this->filtradoGlobal();			//==> Encargado de generar los filtrados globales de la web
            $cantidad = $cantidad - count($lista_actual);
			//Modificado por Pedro el 17/Junio/2019 ==> Si no hay cantidad no seguimos
			if ($cantidad > 0){
				//Vamos a componernos una select en condiciones:
				$this->nombreTablas = static::getNombreTabla();
				$this->camposTabla = ' DISTINCT ' . static::getCampos();	//Le dejo el distinct para que saque los que tienen distinto código
				//Pedro 27/06/2019 ==> SI el artículo no tiene ni editorial ni distribuidor, no asociamos nada
				if (($this->editorial != '') || ($this->cod_distribuidor > 0) ){
					//Componemos los where con los campos de editorial y alias
					$this->whereTabla = ($this->editorial != '') ? ('`' . static::getAlias() . '`.editorial = \'' . $this->editorial . '\' ') : '';
					$this->whereTabla .= ( ( ($this->whereTabla != '') && ($this->cod_distribuidor > 0) ) ? ' OR ' : '')
						.( ($this->cod_distribuidor > 0) ? ('`' . static::getAlias() . '`.cod_distribuidor = \'' . $this->cod_distribuidor . '\' ') : '');
					//Añadimos el "no web"
					$this->whereTabla = ( ($this->whereTabla != '') ? (' ( ' . $this->whereTabla . ' ) AND ') : '' )
						. '`' . static::getAlias() . '`.no_web = 0 ';
					//Creamos el orden:
					$this->crea_orden(' ORDER BY RAND() ', true);

					//Cargamos los productos
					$this->carga_articulos(0, $cantidad);
				}
			}
        }
        return($this->lista_articulos);
    }

	public function relacionados_x_autor($cantidad, $lista_actual = array(), $codigos_a_quitar = "") {
        include('comunes/globals.php');
		//Sentencia por optimizar
        if (count($lista_actual) < $cantidad) {
			//Vamos a coger los filtrados:
			$this->adaptarFiltrado('', true);	//==> Encargado de generar los filtrados de sesión o temporales del usuario
			$this->filtradoGlobal();			//==> Encargado de generar los filtrados globales de la web
            $cantidad = $cantidad - count($lista_actual);
			//Modificado por Pedro el 17/Junio/2019 ==> Si no hay cantidad no seguimos
			if ($cantidad > 0){
				//Vamos a componernos una select en condiciones:
				$this->nombreTablas = static::getNombreTabla();
				$this->camposTabla = ' DISTINCT ' . static::getCampos();	//Le dejo el distinct para que saque los que tienen distinto código
				//Pedro 27/06/2019 ==> SI el artículo no tiene ni autor ni distribuidor, no asociamos nada
				if ($this->autor != ''){
					//Componemos los where con los campos de editorial y alias
					$this->whereTabla = ($this->autor != '') ? ('`' . static::getAlias() . '`.autor = \'' . $this->autor . '\' ') : '';
					//Añadimos el "no web"
					$this->whereTabla = ( ($this->whereTabla != '') ? (' ( ' . $this->whereTabla . ' ) AND ') : '' )
						. '`' . static::getAlias() . '`.no_web = 0 ';
					//Creamos el orden:
					$this->crea_orden(' ORDER BY RAND() ', true);

					//Cargamos los productos
					$this->carga_articulos(0, $cantidad);
				}
			}
        }
        return($this->lista_articulos);
    }

    public function relacionados_x_escaparate($cantidad, $lista_actual = array(), $codigos_a_quitar = '') {
        //En esta función vamos a cargar 10 veces más productos de los que indica "cantidad", después cortaremos la lista para sacar 3 de forma aleatoria
        include('comunes/globals.php');
        if (count($lista_actual) < $cantidad) {
			//Vamos a coger el filtrado global:
			$this->filtradoGlobal();
            $cantidad = $cantidad - count($lista_actual);
            if ($cantidad > 0) {				
                //Vamos a coger los filtrados:
				$this->adaptarFiltrado('', true);	//==> Encargado de generar los filtrados de sesión o temporales del usuario
				$this->filtradoGlobal();			//==> Encargado de generar los filtrados globales de la web
				$cantidad = $cantidad - count($lista_actual);
				//Vamos a componernos una select en condiciones:
				$this->nombreTablas = ' `categorias_productos` `a` LEFT JOIN `categorias_productos` `b`  '
											. ' ON ( `a`.`orden` < 10000 AND `b`.`orden` < 10000 AND `a`.`categoria` = `b`.`categoria`) '	//Hemos añadido el orden para que sean del mismo escaparate (Pedro 09/Septiembre/2019)
											. ' LEFT JOIN `' . static::getTablaRelacionada('articulo') . '` as `' . static::getAlias() . '` '
											. ' ON (`a`.`articulo` = `' . static::getAlias() . '`.`codigo` ) '
										. static::getNombreTabla(false);
				$this->camposTabla = ' DISTINCT `a`.`articulo`, ' . static::getCampos();
				//Añadimos el "no web"
				$this->whereTabla = '`b`.`articulo` = ' . $this->codigo . ' AND `' . static::getAlias() . '`.no_web = 0 ';
					//. ( ($this->filtrado_global != '') ? ' AND ' . $this->filtrado_global . ' ' : '');
				//Creamos el orden:
				$this->crea_orden(' ORDER BY RAND() ', true);
				//Cargamos los artículo
				$this->carga_articulos(0, $cantidad);
			}
        }
        return($lista_actual);
    }

    public function temas_con_traduccion() {
        return(array_filter($this->temas, 'Articulo::filtrar_temas_con_tracuccion'));
    }

    public static function filtrar_temas_con_tracuccion($objeto_tema) {
        if ($objeto_tema->traduccion != '') {
            return(true);
        } else {
            return(false);
        }
    }

    public static function dame_valor_campo($campo, $codigoArticulo) {
        include 'comunes/globals.php';
        $valor = null;
        $sentencia_sql = "SELECT $campo FROM articulo  WHERE codigo = $codigoArticulo";
        //echo("$sentencia_sql<br />\n");
        if ($resultado = mysqli_query($conexionBD, $sentencia_sql)) {
            if ($fila = mysqli_fetch_array($resultado)) {
                $valor = $fila[$campo];
            }
        }
        return $valor;
    }

    public function getJSON() {
        $prop = get_object_vars($this);
        $resp = '{ ';
        foreach ($prop as $key => $value) {
            if (gettype($value) == 'string') {
                $resp .= '"' . $key . '":' . json_encode(htmlspecialchars_decode($value)) . ',';
            } else {
                $resp .= '"' . $key . '":' . json_encode($value) . ',';
            }
        }
        $resp = substr($resp, 0, -1) . "}";
        return $resp;
    }

    /**
     *
     */
    public function hasHijos() {
        //modificada por Tomás: vamos a aligerar este proceso 
        include 'comunes/globals.php';

        //$sentencia_sql = "SELECT count(*) as count FROM articulo  WHERE articulo_padre =".$this->codigo;
        $sentencia_sql = "SELECT codigo as count FROM articulo  WHERE articulo_padre =" . $this->codigo;
        $result = mysqli_query($conexionBD, $sentencia_sql);
        return mysqli_num_rows($result);
        /* mysqli_row_count;
          //echo("$sentencia_sql<br />\n");
          if ($resultado = mysqli_query($conexionBD, $sentencia_sql)) {
          if ($fila = mysqli_fetch_array($resultado)) {
          $valor = $fila["count"];
          }
          }

          return $valor; */
    }

    public static function buscaArticulo($codigo) {
        include('comunes/globals.php');
        $retorno = 0;
        if ($conexionBD) {
			 //Si tenemos código no seguimos
			$sentencia_sql = "SELECT codigo FROM articulo WHERE ean = '$codigo'";
			if ($resultado = mysqli_query($conexionBD, $sentencia_sql)) {
				if ($fila = mysqli_fetch_array($resultado)) {
					$retorno = $fila['codigo'];
				}
			}
			if ($retorno == 0) {
				$sentencia_sql = "SELECT codigo FROM articulo WHERE codigo = $codigo";
				if ($resultado = mysqli_query($conexionBD, $sentencia_sql)) {
					if ($fila = mysqli_fetch_array($resultado)) {
						$retorno = $fila['codigo'];
					}
				}
			}
        }
        return($retorno);
    }

    public static function dameCampo($codigo, $nombreCampo) {
        include('comunes/globals.php');
        $retorno = 0;
        $codigo = $this::buscaArticulo($codigo);
        if ($conexionBD) {
            $sentencia_sql = "SELECT $nombreCampo FROM articulo WHERE codigo = $codigo";
            if ($resultado = mysqli_query($conexionBD, $sentencia_sql)) {
                if ($fila = mysqli_fetch_array($resultado)) {
                    $retorno = $fila[$nombreCampo];
                }
            }
        }
        return($retorno);
    }

	//180807 ==> pedro, cargar ofertas articulo
	public function cargarOfertas(){
		$this->ofertasRegalo = OfertasRegalo::cargarOfertas($this->codigo);
	}
	
	public static function editorialesTodas($filtro = ''){
		$retorno = array();
		$bd = new BaseDatos();
		if ($bd->isConectado()){
			$filtro = ($filtro != '') ? ' WHERE ' . $filtro : '';
			$sentencia = 'SELECT DISTINCT `editorial` FROM `articulo` ' . $filtro . ' GROUP BY `editorial` ORDER BY `editorial`;';
			$bd->setConsultaSQL($sentencia);
			while($fila = $bd->getFila()){
				if ($fila['editorial'] != ''){
					$retorno[] = $fila['editorial'];
				}
			}
		}
		return($retorno);
	}
	
	//Funciones de precios:
	private function calcula_precio_articulo($cliente = 0, $cantidad = 1) {
		include('comunes/globals.php');
		if ($cliente == NULL) {
			$cliente = 0;
		}
		$pvp_final = 0;
		$dto = 0;
		$pvp_arti = 0;
		$retorno = array(0, 0);

		$pvp_final = ($this->pvpoferta != $this->pvp) ? $this->pvpoferta : 0;	//16/Enero/2019 ==> El precio de oferta es, por defecto igual al PVP y claro, más abajo comprobamos que sea 0
		$pvp = $this->pvp;
		
		if (Shop::$configuracion->trabaja_descuentos){
			//Si no tenemos pvp_final, vamos a ver el descuento del cliente por código promocional
			if ($pvp_final == 0) {
				//Si es sindis, o sinlib, hay que hacer una cosa u otra
				switch (Shop::$configuracion->programa_arminet) {
					case 1:
						//Sindis
						$dto = dame_descuento_sindis($this->codigo, $cliente);
						//$dto = calcula_dto_cliente($cliente);
						break;
					case 2:
						//Herbolib
						break;
					default:
						//Por defecto sinlib
						$dto = calcula_dto_cliente($cliente);
						break;
				}
			}

			//Si no tenemos descuento ni precio, vamos a calcular el precio del artículo
			if (($dto == 0) && ($pvp_final == 0)) {
				switch (Shop::$configuracion->programa_arminet) {
					case 1:
						//Sindis
						$pvp_final = $this->dame_precio_articulo_sindis($this->codigo, $cantidad, $cliente);
						break;
					case 2:
						//Herbolib, por ahora igual que en sinlib
						$pvp_final = dame_precio_articulo($this->codigo, $cantidad, $cliente);
						break;
					default:
						//Por defecto sinlib
						$pvp_final = dame_precio_articulo($this->codigo, $cantidad, $cliente);
						break;
				}
			}
			//Si ni por esas tenemos precio, entonces vamos a ver si hubiese algún descuento especial para ese cliente
			if (($dto == 0) && ($pvp_final == $pvp )) {
				$dto = dame_descuento($this->codigo, $cliente);
			}
		}
		$retorno[0] = $dto;
		$retorno[1] = $pvp_final;
		return($retorno);
	}
	//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	// Devolvemos el precio de un artículo para un cliente
	//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	private function dame_precio_articulo($cantidad = 1, $cliente = 0, $prensa = 0) {
		include('comunes/globals.php');
		$hoy = date('Y-m-d');
		//El cliente que recibimos es el de la web. Necesitamos el de sinlib
		$cliente = dame_cod_programa($cliente);
		$pvp = 0;
		$precios_escalados = 0;
		$tarifas_multiples = 0;
		$resta_iva = 0;
		$tarifa = 0;
		//Si el artículo está de oferta, entonces no hay que cargar más datos
		if ($this->pvpoferta > 0) {
			$pvp = $this->pvpoferta;
		}
		if ($pvp == 0) {
			//Cargamos los datos que necesitamos de los clientes que afectan al precio del artículo
			$sentencia_sql = "SELECT tarifa, precios_escalados, resta_iva, tarifas_multiples FROM cliente WHERE codigo_sinlib = $cliente";
			//echo("Tarifas, precios escalados, resta iva, tarifas multiples:<br />$sentencia_sql<br />\n");
			//echo("Consulta: $sentencia_sql<br />\n");
			if ($resultado_cli = mysqli_query($conexionBD, $sentencia_sql)) {
				if ($fila_cli = mysqli_fetch_array($resultado_cli)) {
					$tarifa = $fila_cli['tarifa'];
					$precios_escalados = $fila_cli['precios_escalados'];
					$resta_iva = $fila_cli['resta_iva'];
					$tarifas_multiples = $fila_cli['tarifas_multiples'];
				}
			}
		}
		//Ahora con los datos que tenemos vamos a ir viendo que precio tiene el producto
		//__________________________________________________________________________________________________________________________________________
		//_____________________________________________________ ARTIOFERTAS ________________________________________________________________________
		//__________________________________________________________________________________________________________________________________________
		if ($pvp == 0) {
			$pvp = calcula_precio_oferta_arti($articulo);
		}
		//__________________________________________________________________________________________________________________________________________
		//_____________________________________________________ DTOS_CLI_ART _______________________________________________________________________
		//__________________________________________________________________________________________________________________________________________
		if ($pvp == 0) {
			$pvp = calcula_precio_cliente($articulo, $cliente);
		}
		//__________________________________________________________________________________________________________________________________________
		//_____________________________________________________ PRECIOS ESCALADOS __________________________________________________________________
		//__________________________________________________________________________________________________________________________________________
		if (($pvp == 0) && ( $precios_escalados == 1 )) {
			$pvp = dame_precio_escalado($articulo, $cantidad);
		}
		//__________________________________________________________________________________________________________________________________________
		//_______________________________________________________________ TARIFAS X FAMILIA ________________________________________________________
		//__________________________________________________________________________________________________________________________________________
		if (($pvp == 0) && ($this->tipo == "P")) {
			//Si no usa tarifas múltiples, cogemos la tarifa del artículo
			if (($tarifas_multiples == 0) || ($tarifas_multiples == 255)) {
				$pvp = $this->pvp_tari[$tarifa];
			} else {
				//Como usa tarifas múltiples, vamos a consultarlas
				$sentencia_sql = 'SELECT tariarti.pvp precio_tarifa FROM dtosclifam, tariarti
							WHERE dtosclifam.cliente = $cliente AND dtosclifam.familia = "' . $familia . '" AND dtosclifam.tarifa != 255
							AND dtosclifam.tarifa = tariarti.codigo AND tariarti.descuento = 0 AND tariarti.articulo = ' . $this->codigo;
				//echo("Tarifa x familia:<br />$sentencia_sql<br />\n");
				if ($resultado_arti = mysqli_query($conexionBD, $sentencia_sql)) {
					if ($fila_arti = mysqli_fetch_array($resultado_arti)) {
						$pvp = $fila_arti['precio_tarifa'];
					}
				}
			}
		}
		//__________________________________________________________________________________________________________________________________________
		//_______________________________________________________________ TARIFAS MULTIPLES ________________________________________________________
		//__________________________________________________________________________________________________________________________________________
		if (($pvp == 0) && ($tipo == 'P')) {
			$sentencia_sql = "SELECT pvp FROM tariarti WHERE articulo = $articulo AND tarifa = $tarifas_multiples AND $tarifas_multiples != 255 AND descuento = 0";
			//echo("Datos articulo:<br />$sentencia_sql<br />\n");
			if ($resultado_arti = mysqli_query($conexionBD, $sentencia_sql)) {
				if ($fila_arti = mysqli_fetch_array($resultado_arti)) {
					$pvp = $fila_arti['pvp'];
				}
			}
		}
		//si no hay precio, cogemos el del artículo
		if ($pvp == 0) {
			$pvp = $this->pvp;
		}
		//Ahora vamos a ver si hay que restar el iva
		if ($resta_iva) {
			$pvp = calcula_base($pvp, $iva);
		}
		return($pvp);
	}
	
	private function getTematicaRestrictiva(){
		//Vamos a cargar la temática más restrictiva para este artículo:
		$return = $this->tema;
		foreach($this->temas as $key => $tema){
			$return = (strlen($return) > strlen($tema->codigo)) ? $return : $tema->codigo;
		}
		return($return);
	}
	
}

?>
