<?php
class ServicioViaje extends AppObjeto {
	
	//Propiedades PK
	
	protected $contrato;
	protected $linea;
	protected $ida;
	
	
	
	// Propiedades
	protected $pasajeroCodigo;
	protected $pasajeroNombre;
	protected $pasajeroNombreSinPotencial;
	protected $nif;
	protected $telefono;
	protected $telefono2;
	protected $movil;
	protected $cliente;
	protected $origenFechaPrevista;
	protected $origenHoraPrevista;
	protected $origenDireccion;
	protected $origenGPS;
	protected $destinoDireccion;
	protected $destinoGPS;
	protected $personasCantidad;
	protected $personasPrecio;
	protected $personasImporte;
	protected $paquetesCantidad;
	protected $paquetesImporte;
	protected $pagado;
	protected $formaPago;
	protected $observaciones;
	protected $contacto;
	protected $nombreComercial;
	protected $origenHoraRecogido;
	protected $origenFechaRecogido;
	protected $destinoHoraDejado;
	protected $destinoFechaDejado;
	protected $origenOrden;
	protected $destinoOrden;
	
	



	/* para conectar con bd */
	protected static $_aliasTabla = 'ser_via';
	protected static $_nombreTabla = 'CONTRA_VIAJES';
	protected static $_campoPK = 'CONTRATO';
	
	
	// InitMetaDatos
	protected static function initMetaDatos(){
		//parent::initMetaDatos();
	
		// tablas relacionadas
		self::addTablaRelacion('pot', 'potenciales', 'numero', 'ser_via', 'contacto');
	
		// campos relacionados
		self::addPropiedadBD('ser_via', 'CONTACTO', 'pasajeroCodigo', self::META_INT);
		self::addPropiedadBD('pot', 'NOMBRE', 'pasajeroNombre', self::META_VARCHAR);
		self::addPropiedadBD('pot', 'NIF', 'nif', self::META_VARCHAR);
		self::addPropiedadBD('pot', 'TELEFONO', 'telefono', self::META_VARCHAR);
		self::addPropiedadBD('pot', 'TEL2', 'telefono2', self::META_VARCHAR);
		self::addPropiedadBD('pot', 'MOVIL', 'movil', self::META_VARCHAR);
		self::addPropiedadBD('pot', 'NOMCOMER', 'nombreComercial', self::META_VARCHAR);
		self::addPropiedadBD('pot', 'CLIENTE', 'cliente', self::META_VARCHAR);
		self::addPropiedadBD('ser_via', 'CONTACTO', 'contacto', self::META_VARCHAR);
		self::addPropiedadBD('ser_via', 'CONTRATO', 'contrato', self::META_VARCHAR);
		self::addPropiedadBD('ser_via', 'LINEA', 'linea', self::META_INT);
		self::addPropiedadBD('ser_via', 'IDA', 'ida', self::META_INT);
		self::addPropiedadBD('ser_via', 'FECHA_ESPA', 'origenFechaPrevista', self::META_DATE);
		self::addPropiedadBD('ser_via', 'HORA_ESPA', 'origenHoraPrevista', self::META_TIME);
		self::addPropiedadBD('ser_via', 'DIRESPA', 'origenDireccion', self::META_VARCHAR);
		self::addPropiedadBD('ser_via', 'GPSE', 'origenGPS', self::META_VARCHAR);
		self::addPropiedadBD('ser_via', 'ORD_ORIGEN_ESPA', 'origenOrden', self::META_INT);
		self::addPropiedadBD('ser_via', 'FECHA_REAL_ESPA', 'origenFechaRecogido', self::META_DATE);
		self::addPropiedadBD('ser_via', 'HORA_REAL_ESPA', 'origenHoraRecogido', self::META_TIME);
		self::addPropiedadBD('ser_via', 'DIRFRAN', 'destinoDireccion', self::META_VARCHAR);
		self::addPropiedadBD('ser_via', 'GPSF', 'destinoGPS', self::META_VARCHAR);
		self::addPropiedadBD('ser_via', 'ORD_DESTINO_ESPA', 'destinoOrden', self::META_INT);
		self::addPropiedadBD('ser_via', 'FECHA_DESTINO_ESPA', 'destinoFechaDejado', self::META_DATE);
		self::addPropiedadBD('ser_via', 'HORA_DESTINO_ESPA', 'destinoHoraDejado', self::META_TIME);
		self::addPropiedadBD('ser_via', 'PAX', 'personasCantidad', self::META_INT);
		self::addPropiedadBD('ser_via', 'PREC_PAX', 'personasPrecio', self::META_DECIMAL);
		self::addPropiedadBD('ser_via', 'IMPORTE', 'personasImporte', self::META_DECIMAL);
		self::addPropiedadBD('ser_via', 'PAQUETES', 'paquetesCantidad', self::META_INT);
		self::addPropiedadBD('ser_via', 'IMPORTE_PAQ', 'paquetesImporte', self::META_DECIMAL);
		self::addPropiedadBD('ser_via', 'PAGADO', 'pagado', self::META_INT);
		self::addPropiedadBD('ser_via', 'FPAGO', 'formaPago', self::META_INT);
		self::addPropiedadBD('ser_via', 'OBS', 'observaciones', self::META_VARCHAR);
		self::addPropiedadBD('ser_via', 'NOMCONTACTO', 'pasajeroNombreSinPotencial', self::META_VARCHAR);
	
	}
	
	// Métodos
	
	public function __construct($contrato = null, $linea = null, $ida = null){
		$clase = get_class($this);
		$clase::initMetaDatos();
		$this->contrato = $contrato;
		$this->ida = $ida;
		$this->linea = $linea;
	
	
	
		if ($contrato != null && $linea != null && $ida != null){
	
	
			$this->load ($contrato, $linea, $ida);
		}
	}
	
	
	public function load($contrado, $linea, $ida){
		$clase = get_called_class();
		$select = $clase::selectObjeto();
		$select->where('CONTRATO=?',$contrado);
		$select->where('LINEA=?',$linea);
		$select->where('IDA=?',$ida);
	
		$res = $clase::selectExecute($select);
		if (!$res->estaVacio()){
			$datos = $res->getDatos();
			$this->id = array($contrado, $linea, $ida);
			$this->asignaDatosObjeto($datos[0]);
		}
	}
	
	public function getCodigoParaTarea(){
		return '00'.substr($this->id, 2);
	}	
	
	public function getCodigoParaServicio(){
		return '00'.substr($this->contrato, 2);
	}	
	
	
	
	public function setOrigenGPS($gps){
		$this->origenGPS = $gps;
	}
	
	public function getOrigenGPS(){
		return $this->origenGPS;
	}
	
	public function setDestinoGPS($gps){
		$this->destinoGPS = $gps;
	}
	
	public function getDestinoGPS(){
		return $this->destinoGPS;
	}

	
	public function getContrato() {
		return $this->contrato;
	}
	public function setContrato($contrato) {
		$this->contrato = $contrato;
	}
	
	public function getDestinoOrden() {
	    return $this->destinoOrden;
	}
	public function setDestinoOrden($destinoOrden) {
	    $this->destinoOrden = $destinoOrden;
	}
	
	
	public function getOrigneOrden() {
	    return $this->origenOrden;
	}
	public function setOrigneOrden($origenOrden) {
	    $this->origenOrden = $origenOrden;
	}
	
	
	public function getDestinoFechaDejado() {
	    return $this->destinoFechaDejado;
	}
	public function setDestinoFechaDejado($destinoFechaDejado) {
	    $this->destinoFechaDejado = $destinoFechaDejado;
	}
	
	
	public function getDestinoHoraDejado() {
	    return $this->destinoHoraDejado;
	}
	public function setDestinoHoraDejado($destinoHoraDejado) {
	    $this->destinoHoraDejado = $destinoHoraDejado;
	}
	
	
	
	
	public function getOrigenFechaRecogido() {
	    return $this->origenFechaRecogido;
	}
	public function setOrigenFechaRecogido($origenFechaRecogido) {
	    $this->origenFechaRecogido = $origenFechaRecogido;
	}
	
	
	public function getOrigenHoraRecogido() {
	    return $this->origenHoraRecogido;
	}
	public function setOrigenHoraRecogido($origenHoraRecogido) {
	    $this->origenHoraRecogido = $origenHoraRecogido;
	}
	
	

	
	
	public static function lstPasajeros($params){
		$select  = self::selectObjeto();
		if (isset($params['ida'])){
				
			$select->where('IDA=?',$params['ida']);
			if ($params['ida']==1){
				//$select->order('ord_origen_espa');
				$select->order(array('fecha_Espa','hora_espa'));
			} else {
				$select->order(array('fecha_Espa','hora_espa'));
				//$select->order('ord_destino_espa');
			}
		}
		if (isset($params['contrato']) && $params['contrato']){
			$select->where('contrato=?',$params['contrato']);
		}	
		//echo $select;
		$res = self::selectExecute($select, $params);	
		$datos = $res->getDatos();
		return $datos;
		
	}
	

	/**
	 * Devuelve el número de tareas o viajeros
	 * @return AppResultado
	 */
	public static function getTareasViajeros($idServicio){
		$select = self::selectObjeto();
		$select->where('contrato=?',$idServicio);
		$select->order('ord_origen_espa');
		$res = self::selectExecute($select);
			
		$datos = $res->getDatos();
		return count($datos);
	}
	
	/**
		 * Devuelve los ServicioViajes filtrados por parámetros
		 * IDA=0 es España-Francia
		 * @param array  $params ida=1/0, contrato
		 * @return AppResultado
		 */
		public static function lstTodos($params){
			$select = self::selectObjeto();
			
			if (isset($params['ida'])){
			
				$select->where('IDA=?',$params['ida']);
				if ($params['ida']==1){
					$select->order('ord_origen_espa');
				} else {
					$select->order('ord_destino_espa');
				}
			}
			if (isset($params['contrato']) && $params['contrato']){
				$select->where('contrato=?',$params['contrato']);
			}
			
			$res = self::selectExecute($select, $params);
			
		 	$datos = $res->getDatos();
		 	
		 	
		 	$salida = array();
		 	$salida2 = array();
		 	foreach ($datos as $elemento){
		 		$elemento['dejar'] = 0;
		 		//print_r($elemento);
		 		if ( (($params['todos']==-1) && (!$elemento['origenFechaRecogido'])) || ($params['todos']==1) ){
	 				if(!isset($salida[$elemento['origenOrden']])){
	 					$salida[$elemento['origenOrden']] = $elemento;
	 				}else{
	 					$salida2[] = $elemento;
	 				}
		 		} 
		 		
		 		$elemento['dejar'] = 1;		 		
		 		if ( (($params['todos']==-1) && (!$elemento['destinoFechaDejado'])) || ($params['todos']==1) ){
	 				if(!isset($salida[$elemento['destinoOrden']])){
	 					$salida[$elemento['destinoOrden']] = $elemento;
	 				}else{
	 					$salida2[] = $elemento;
	 				}
		 		}	 
		 		
		 	}
		 	ksort($salida);
		 	if(count($salida2)>0){
			 	foreach ($salida2 as $elemento2){
			 		$salida[] = $elemento2;
			 	}
		 	}
		 	
		 	$res->setDatos($salida);
			return $res;
			
		}

		
		public  static function devolverEstilo($reg){
			$estado = 'Persona_sin_recoger';
			if ($reg['paquetesCantidad']>0){
				$estado = 'Paquete_sin_recoger';
				if ($reg['origenFechaRecogido'] && $reg['dejar']==0)
					$estado = 'Paquete_recogido';
				if ($reg['destinoFechaDejado'] && $reg['dejar']==1)
					$estado = 'Paquete_recogido';
				
		
			} else {
				$estado = 'Persona_sin_recoger';
				if ($reg['origenFechaRecogido'] && $reg['dejar']==0)
					$estado = 'Persona_recogida';
				if ($reg['destinoFechaDejado'] && $reg['dejar']==1)
					$estado = 'Persona_recogida';
							}
			return $estado;
		
		}
		
		public function save(){
			
			
			
			
			$clase = get_class($this);
			$db = $clase::getDb();
		
			// Formatear los valores para BD
			$valores = $this->formatearObjToBd();
		
			// Preparar el array para automatizar el guardado en varias tablas
		
		
			$metadatos = $clase::getMetaDatos();
			//print_r($metadatos);
			$tablasFK = $clase::getTablasRelacionadas();
			// Creamos una regla por cada tabla para guardarlo con objetos
			$reglas = array();
			foreach ($metadatos as $reg) {
				// Si es una propiedad que no tiene bd, no la metemos en la regla
				if (!$reg['campoBD'])
					continue;
		
				$aliasTablaDelCampo = $reg['aliasTabla'];
					
				// Si es un campo de una tabla FK
				if (isset($tablasFK[$aliasTablaDelCampo]) ){
					if ($tablasFK[$aliasTablaDelCampo]['editable']=='1'){
						$tabla = $tablasFK[$aliasTablaDelCampo]['tablaFK'];
						$campoPK = $tablasFK[$aliasTablaDelCampo]['campoFK'];
						// ValorPK: sacamos la propiedad que corresponde
						$claveMeta = $tablasFK[$aliasTablaDelCampo]['aliasTabla'].'-'.$tablasFK[$aliasTablaDelCampo]['campoRelacion'];
						if (isset($metadatos[$claveMeta]['propiedad']))
							$propiedad = $metadatos[$claveMeta]['propiedad'];
						else
							die('(save) No existe la propiedad del campo que vas a grabar: '.$claveMeta);
						$valorPK = $this->$propiedad;
						$editable = $tablasFK[$reg['aliasTabla']]['editable'];
					}
					else {
						continue;
					}
				} else {
					// El campo es de la tabla principal
					$tabla = $clase::$_nombreTabla;
					$campoPK = $clase::$_campoPK;
					if (!isset($metadatos[$aliasTablaDelCampo.'-'.$campoPK])) die('(save)No se encuentra: '.$aliasTablaDelCampo.'-'.$campoPK);
					$propiedadPK = $metadatos[$aliasTablaDelCampo.'-'.$campoPK]['propiedad'];
					$valorPK = $this->$propiedadPK;
					$editable = true;
				}
		
				$campo = $reg['campoBD'];
				$valor = $valores[$reg['propiedad']];
		
				if (!isset($reglas[$aliasTablaDelCampo])){
					$reglas[$aliasTablaDelCampo] = array(
							'tabla' 	=> $tabla,
							'campoPK'	=> $campoPK,
							'valorPK'	=> $valorPK,
							'editable'	=> $editable
					);
				}
				if($campo != $this->getCampoPk())
					$reglas[$aliasTablaDelCampo]['campos'][$campo]=$valor;
					
			}
		
			// Ejecutamos las SQL principal
			foreach ($reglas as $alias => $reg) {
				//$valores = $this->formatearObjToBd();
					
				if ($alias == $clase::getAliasTabla()){
					// Si la tabla es la principal
					if($this->ida != null && $this->linea != null && $this->contrato != null){
						$where = array(
						'CONTRATO=\''.$this->contrato.'\'',
						'LINEA='.$this->linea,
						'IDA='.$this->ida); 
						try {
							/*print_r($where);
								print_r($reg['campos']);
							die();
							*/
							$db->update ( $reg['campos'], $where );
						} catch (Exception $e) {
							echo 'save principal:'.$e;
						}
		
					} else {
							
							
							
						if($clase::$_tipo_primary = self::APP_TIPO_PRIMARY_STRING){
							$reg['campos'][$reg['campoPK']] = $reg['valorPK'];
						}
						$this->linea = $this->siguienteIdMaximo($this->contrato, $this->ida);
						$reg['campos']['LINEA'] = $this->linea;
							
						$id = $db->insert ( $reg['campos'] );
						
					}
				} else {
					// Ejecutamos si es foreign key y es editable
					$nombreTabla = $reg['tabla'];
					$db_actual = new AppDatabase ( $nombreTabla, null, $clase::getAdaptador() );
					if ($reg['valorPK']>0) {
						if($clase::$_tipo_primary = $clase::APP_TIPO_PRIMARY_STRING){
							$where = array (
									$reg['campoPK'] . '= \'' . $reg['valorPK'] .'\''
							);
						}else{
							$where = array (
									$reg['campoPK'] . '= ' . $reg['valorPK']
							);
						}
						$db_actual->update($reg['campos'], $where);
					} else {
						die('Insert de segunda tabla no estï¿½ desarrollado');
						$db_actual->insert($reg['campos']);
					}
					unset($db_actual);
		
		
				}
			}
			//print_r($valores);
			
			
			$potencial = Potencial::getByDNI($this->nif);
			
			
			if($potencial === false){
				$potencial = new Potencial();
				$potencial->setDatos($this->toArray());
				$potencial->setNombre($this->pasajeroNombre);
				$potencial->save();
				$this->contacto = $potencial->id;
				$this->save();
			}else{
				$potencial->setDatos($this->toArray());
				$potencial->setNombre($this->pasajeroNombre);
				$potencial->save();
			}
			
			
			$potencial->setDatos($this->toArray());
			$potencial->save();
			
			
		}
		
	public function getContacto(){
		return $this->contacto;
	}
	
	public function getOrigenDireccion(){
		return $this->origenDireccion;
	}
	
	public function getDestinoDireccion(){
		return $this->destinoDireccion;
	}
		
	public function siguienteIdMaximo($contrato, $ida){
		
		
		
		$db = self::getDb();
		$select = $db->select();
		$select->setIntegrityCheck(false);
		$select->from(array('r'=> self::getNombreTabla()),array('numero_max' => 'MAX(LINEA)'));
		$select->where('CONTRATO = \''.$contrato.'\'');
		$select->where('IDA ='.$ida);
		$resultado = self::selectExecute($select, null, true);
		$datos = $resultado->getDatos();
		$num_max =  $datos[0]['numero_max']+ 1;
		return $num_max;
	}
	
	public static function reordenarElemento($contrato, $linea, $ida, $dejar, $subir){
		$parametros = array('contrato'=> $contrato ,
				'ida'=>$ida,
				'todos'=>1 );
		$lista_viajes = ServicioViaje::lstTodos($parametros)->getDatos();
		
		$tratatods = array();
		$posicion = null;
		foreach ($lista_viajes as $elemento){
			$tratatods[count($tratatods)+1] = $elemento;
			if($elemento['linea'] == $linea && $elemento['dejar']== $dejar){
				$posicion = count($tratatods);	
			}
		}
		$salida = array();
		if($subir){
			if($posicion>1){

				$salida = array_slice($tratatods, 0, $posicion-2, true)
				+ array($posicion => $tratatods[$posicion])
				+ array($posicion-1 => $tratatods[$posicion-1])
				+array_slice($tratatods, $posicion, count($tratatods), true);
			}
			
		}else{
			
			if($posicion < count($tratatods)){
				$salida = array_slice($tratatods, 0, $posicion-1, true)
				+ array($posicion+1 => $tratatods[$posicion+1])
				+ array($posicion => $tratatods[$posicion])
				+array_slice($tratatods, $posicion+1, count($tratatods), true);
			}
		}
		$preparados = $salida = array_slice($salida, 0, count($salida));
		
		
		
		
		foreach ($preparados as $key => $value){
			$viaje = new ServicioViaje($contrato, $value['linea'] ,$ida);
			if($value['dejar']){
				$viaje->setDestinoOrden($key+1);
			}else{
				$viaje->setOrigneOrden($key+1);
			}
			$viaje->save();
			
		}
		
		/*
		$salida = array_slice($tratatods, 0, $posicion-1, true)
		+ array($posicion => $tratatods[$posicion])
		+array_slice($tratatods, $posicion, count($tratatods), true);
		*/
		
		
	}
	
	public function getPasajeroNombre() {
	    return $this->pasajeroNombre;
	}
	public function setPasajeroNombre($pasajeroNombre) {
	    $this->pasajeroNombre = $pasajeroNombre;
	}
	
	public function getLinea() {
	    return $this->linea;
	}
	public function setLinea($linea) {
	    $this->linea = $linea;
	}
	
	public function getIda() {
	    return $this->ida;
	}
	public function setIda($ida) {
	    $this->ida = $ida;
	}
	
	public function getCliente() {
	    return $this->cliente;
	}
	public function setCliente($cliente) {
	    $this->cliente = $cliente;
	}
	
	public function getPersonasImporte() {
	    return $this->personasImporte;
	}
	public function setPersonasImporte($personasImporte) {
	    $this->personasImporte = $personasImporte;
	}
	
	public function getPaquetesImporte() {
	    return $this->paquetesImporte;
	}
	public function setPaquetesImporte($paquetesImporte) {
	    $this->paquetesImporte = $paquetesImporte;
	}
	
}