<?php
/**
 * Factura para un servicio en la Web del Banco del tiempo de M锟絣aga.
 **/
class FacturaBtMalaga extends ComponenteBtMalaga {

	static $db = array(
	                   'Precio' => 'Float',
	                   'Estado' => "Enum('ACEPTADA,PENDIENTEOFERTANTE,PENDIENTESOLICITANTE,RECHAZADA,REALIZADA', 'PENDIENTEOFERTANTE')",
	                   'TipoImpuestos' => "Enum('Porcentual,Fijo','Porcentual')",
                           'TipoPrecio' => "Enum('PorHoras,Fijo',null)",
                           'ValorImpuesto' => 'Float',
                           'TipoHoras' => "Enum('Automatico,Manual','Manual')",
                           'Horas' => 'Float'
	                  );
	                  
        static $has_one = array(
	                        'DestinatarioImpuestos' => 'UsuarioBtMalaga'
	                       );
	                                  
	static $has_many = array(
	                         'Servicio' => 'ServicioFacturaBtMalaga',
	                         'EventosCalendario' => 'EventoCalendarioBtMalaga',
                               'Observaciones' => 'ObservacionesBtMalaga'
	                        );
	                                                
	 const PARAMETRO_EXISTE_SERVICIO = 'existeServicioFacturaBtMalaga';
	 
	 /**
      * Nombre del par锟絤etro utilizado para indicar que el servicio se ha modificado.
	  */
	 const PARAMETRO_FACTURA_MODIFICADA = 'facturaBtMalagaModificada';
	                                                
      public $NumFactura;
      public $EstadoFormateado;
      public $EsAutorFacturaOferta;
      public $AccionAceptar;
      public $AccionRechazar;
      public $EsMiFactura = false; //indica si se es el autor o el ofertante-demandante de la factura
      public $ComponenteAutor = null;

	function __construct($record = null, $isSingleton = false) {
		parent::__construct($record, $isSingleton);

		$this->NumFactura = $this->ID;            
		switch ($this->Estado) {
		  case 'PENDIENTEOFERTANTE': $this->EstadoFormateado = 'Pendiente de aceptaci&oacute;n por el ofertante';
		                             break;
		  case 'PENDIENTESOLICITANTE': $this->EstadoFormateado = 'Pendiente de aceptaci&oacute;n por el solicitante';
		                               break;		                                                     
		  case 'ACEPTADA': $this->EstadoFormateado = 'Pendiente de realizar el servicio'; 
		                   break;
		  case 'REALIZADA': $this->EstadoFormateado = 'Servicio realizado'; 
		                    break;
		  case 'RECHAZADA': $this->EstadoFormateado = 'Servicio rechazado'; 
		                    break;		                                  
		}


	}

    /**
     * Devuelve el nombre del componente 
     **/
    public function getNombreComponente() {
        return 'factura';
    }


      /**
       * Carga datos necesarios.
       */
      private function cargarDatosNecesarios() {
        $usuario = $this->obtenerUsuarioConectado();
        $servicioFactura = DataObject::get_one('ServicioFacturaBtMalaga', 'FacturaID='.$this->ID);
        if ($servicioFactura) {
          $servicio = DataObject::get_by_id('ServicioBtMalaga', $servicioFactura->ServicioID); 
        } else {
          $servicio = new ServicioBtMalaga();
        }
	
        if ($this->AutorID == $usuario->ID) {
        	if ($servicio instanceof OfertaBtMalaga) {
		        $this->EsAutorFacturaOferta = false;
	        } else if ($servicio instanceof DemandaBtMalaga) {
		        $this->EsAutorFacturaOferta = true;
	        }
	        $this->EsMiFactura = true;
        } else {				        
            if ($servicio instanceof OfertaBtMalaga) {
            	$componenteUsuario = DataObject::get_one('ComponenteUsuarioBtMalaga', 'UsuarioID='.$servicio->OfertanteID);
	            if ($componenteUsuario->UsuarioID == $usuario->ID) {
	            	$this->EsAutorFacturaOferta = true;
	            	$this->EsMiFactura = true;
	            }
	        } else if ($servicio instanceof DemandaBtMalaga) {
	        	if ($servicio->DemandanteID == $usuario->ID) {
	                $this->EsMiFactura = true;
	            }
	        }
        }
      	
      }
         	                                                	                                                                                  
      public function cargarAcciones() {
      	//parent::cargarAcciones();      	 	

      	$this->cargarDatosNecesarios();
      	      
      	$this->NumFactura = $this->ID;
      	
      	$this->AccionVer = 'btmalaga/images/show.png^Ver^javascript:verComponente('.$this->ID.')^_self';
      	        
		switch ($this->Estado) {
		  case 'PENDIENTEOFERTANTE': if ($this->EsAutorFacturaOferta) {
		                               $this->EstadoFormateado = 'Pendiente de aceptar';
		                               $this->AccionAceptar = 'btmalaga/images/accept-icon.png^Aceptar^javascript:cambiarEstadoFactura('.$this->ID.',\"ACEPTADA\")^_self';		                                                       
		                               $this->AccionRechazar = 'btmalaga/images/remove-icon.png^Rechazar^javascript:cambiarEstadoFactura('.$this->ID.',\"RECHAZADA\")^_self';
		                             } else {
		                               $this->EstadoFormateado = 'Pendiente de aceptaci&oacute;n por el ofertante';
		                               $this->AccionAceptar = 'btmalaga/images/accept-icondisabled.png^Aceptar';
		                               $this->AccionRechazar = 'btmalaga/images/remove-icondisabled.png^Rechazar';
		                             }		  
		                             if ($this->EsMiFactura) {
		                               $this->AccionEditar = 'btmalaga/images/edit.gif^Editar^javascript:editarMiFactura('.$this->ID.')^_self';
		                             } else if ($this->puedeEscribir()) {
		                               $this->AccionEditar = 'btmalaga/images/edit.gif^Editar^javascript:editarComponente('.$this->ID.')^_self';
		                             } else {
		                               $this->AccionEditar = 'btmalaga/images/editdisabled.gif^Editar';
		                             }
		                             break;
		  case 'PENDIENTESOLICITANTE': if (!$this->EsAutorFacturaOferta) {
		                                 $this->EstadoFormateado = 'Pendiente de aceptar';
		                                 $this->AccionAceptar = 'btmalaga/images/accept-icon.png^Aceptar^javascript:cambiarEstadoFactura('.$this->ID.',\"ACEPTADA\")^_self';
		                                 $this->AccionRechazar = 'btmalaga/images/remove-icon.png^Rechazar^javascript:cambiarEstadoFactura('.$this->ID.',\"RECHAZADA\")^_self';		                                                       
		                               } else {
		                                 $this->EstadoFormateado = 'Pendiente de aceptaci&oacute;n por el solicitante';
		                                 $this->AccionAceptar = 'btmalaga/images/accept-icondisabled.png^Aceptar';
		                                 $this->AccionRechazar = 'btmalaga/images/remove-icondisabled.png^Rechazar';
		                               }		  
		                               if ($this->EsMiFactura) {
		                                 $this->AccionEditar = 'btmalaga/images/edit.gif^Editar^javascript:editarMiFactura('.$this->ID.')^_self';
		                               } else if ($this->puedeEscribir()) {
		                                 $this->AccionEditar = 'btmalaga/images/edit.gif^Editar^javascript:editarComponente('.$this->ID.')^_self';
		                               } else {
		                                 $this->AccionEditar = 'btmalaga/images/editdisabled.gif^Editar';
		                               }
		                               break;		                                                     
		  case 'ACEPTADA': if ($this->EsAutorFacturaOferta) {
		                     $this->AccionAceptar = 'btmalaga/images/cash-register-icondisabled.png^Indicar servicio realizado'; 		                                   
		                     $this->AccionRechazar = 'btmalaga/images/remove-icondisabled.png^Rechazar';
		                     $this->AccionEditar = 'btmalaga/images/editdisabled.gif^Editar';
		                   } else {
		                     $this->AccionAceptar = 'btmalaga/images/cash-register-icon.png^Indicar servicio realizado^javascript:cambiarEstadoFactura('.$this->ID.',\"REALIZADA\")^_self';
					   $this->AccionEditar = 'btmalaga/images/edit.gif^Editar^javascript:editarComponente('.$this->ID.')^_self';
                                 $this->AccionRechazar = 'btmalaga/images/remove-icon.png^Rechazar^javascript:cambiarEstadoFactura('.$this->ID.',\"RECHAZADA\")^_self';		                                                       
		                   }   
		                   $this->EstadoFormateado = 'Pendiente de realizar el servicio'; 
		                   break;
		  case 'REALIZADA': if ($this->EsMiFactura) {
		  	              $usuario = $this->obtenerUsuarioConectado();
		                      //si existe la opini锟絥 la edita, de lo contrario crea una nueva.
	                              $this->AccionAceptar = 'btmalaga/images/comment-edit-icon.png^Opinar sobre el servicio realizado^javascript:editarOpinionServicio('.$this->ID.','.$usuario->ID.')^_self';
		                    } else {
		                      //muestra las opiniones de la factura.
                                      //$this->AccionAceptar = 'btmalaga/images/comment-icon.png^Ver las opiniones sobre el servicio realizado^javascript:verOpinionFactura('.$this->ID.')^_self';		                                    
                                      $this->AccionAceptar = 'btmalaga/images/comment-icon.png^Ver las opiniones sobre el servicio realizado';		                                    
		                    }  
		                    $this->EstadoFormateado = 'Servicio realizado'; 
		                    $this->AccionRechazar = 'btmalaga/images/remove-icondisabled.png^Rechazar';
		                    $this->AccionEditar = 'btmalaga/images/editdisabled.gif^Editar';
		                    break;
		  case 'RECHAZADA': $this->AccionAceptar = 'btmalaga/images/accept-icondisabled.png^Aceptar';
		                    $this->EstadoFormateado = 'Servicio rechazado'; 
		                    $this->AccionRechazar = 'btmalaga/images/remove-icondisabled.png^Rechazar';
		                    $this->AccionEditar = 'btmalaga/images/editdisabled.gif^Editar';
		                    break;		                                  
		}

      } 

	/**
	 * Funci锟絥 que indica los campos para poner en el grid de listado.
	 * Nota: debe ser sobreescrito por cada componentes.
	 **/
	protected function camposGrid() {
		$resultado = '{"Nombre": "", "Columna":"Seleccionado", "Ordenacion":"na", "Tipo":"ch", "Tamano":20, "Filtro":"&nbsp;", "Alineacion":"left"},';
		$resultado .= '{"Nombre": "", "Columna":"AccionVer", "Ordenacion":"na", "Tipo":"img", "Tamano":20, "Filtro":"&nbsp;", "Alineacion":"left"},';
		//$resultado .= '{"Nombre": "", "Columna":"AccionEditar", "Ordenacion":"na", "Tipo":"img", "Tamano":20, "Filtro":"&nbsp;", "Alineacion":"left"},';
		//$resultado .= '{"Nombre": "", "Columna":"AccionAceptar", "Ordenacion":"na", "Tipo":"img", "Tamano":20, "Filtro":"&nbsp;", "Alineacion":"left"},';		
		//$resultado .= '{"Nombre": "", "Columna":"AccionRechazar", "Ordenacion":"na", "Tipo":"img", "Tamano":20, "Filtro":"&nbsp;", "Alineacion":"left"},';
        $resultado .= '{"Nombre": "Num. Factura", "Columna":"NumFactura", "Ordenacion":"int", "Tipo":"ro", "Tamano":80, "Filtro":"#text_filter", "Alineacion":"left"},';
        $resultado .= '{"Nombre": "Precio", "Columna":"Precio", "Ordenacion":"int", "Tipo":"dyn", "Tamano":80, "Filtro":"#text_filter", "Alineacion":"left"},';
        $resultado .= '{"Nombre": "Estado", "Columna":"EstadoFormateado", "Ordenacion":"str", "Tipo":"ro", "Tamano":"*", "Filtro":"#text_filter", "Alineacion":"left"}';
        return $resultado;
	}
	
    /**
     * Funci贸n que devuelve los campos para editar
     * el contenido en modo principal.
     **/
    protected function cargarEdicionPrincipal() {
        $pestanasEditable = parent::cargarEdicionPrincipal();       

        $objServicio = null;
        $datos = $this->Pagina()->Datos();
        
        $esOferta = false;
        $ponerAutor = false;
        
        //Campo Servicio.
        $campoServicio = new CampoEditable();
        $campoServicio->setNombre('Servicio');
        
        $demandante = null;
        $servicioFactura = null; 

        if (isset($datos[FacturaBtMalaga::PARAMETRO_EXISTE_SERVICIO])) {
          $servicioFactura = $this->Servicio()->First();
          $objServicio = DataObject::get_by_id('ServicioBtMalaga', $servicioFactura->ServicioID);
          $campoServicio->setField(new ReadonlyField('Servicio', 'Servicio', $objServicio->Titulo));
          if ($objServicio instanceof OfertaBtMalaga) { 
            $esOferta = true;
          } else {
          	$demandante = $objServicio->Demandante();
          }  	        
        } else if (!isset($datos[ServicioBtMalaga::SERVICIO_SELECCIONADO])) {
            $aux = $this->Servicio()->First();
            if ($aux) {
                $objServicio = $aux->Servicio();
            }
            $campoServicio->setMinOccurs(0);
	    $campoServicio->setMaxOccurs(1);
	    $campoServicio->setSubCampos($this->Servicio()); 
	    $campoServicio->setTipoSubCampos('ServicioFacturaBtMalaga');
	    $campoServicio->setCampoSubCampos('Servicio');
	    $campoServicio->setPonerHeredados(true);
            $ponerAutor = true;
        } else {
          $objServicio = DataObject::get_by_id('ServicioBtMalaga', $datos[ServicioBtMalaga::SERVICIO_SELECCIONADO]);          
          if ($this->ID != 0) {
            $servicioFactura = DataObject::get('ServicioFacturaBtMalaga', 'FacturaID='.$this->ID);
            if (($servicioFactura == null) || ($servicioFactura->Count() == 0)) {
              if ($objServicio instanceof OfertaBtMalaga) {
                $servicioFactura = new OfertaFacturaBtMalaga();
              } else if ($objServicio instanceof DemandaBtMalaga) {
              	$servicioFactura = new DemandaFacturaBtMalaga();
              }
              $servicioFactura->ServicioID = $datos[ServicioBtMalaga::SERVICIO_SELECCIONADO];
              $servicioFactura->FacturaID = $this->ID;
              $servicioFactura->write();
            }  
          }
          $campoServicio->setField(new ReadonlyField('TituloServicio', 'TituloServicio', $objServicio->Titulo));
          $this->Precio = $objServicio->Precio;
          $this->TipoPrecio = $objServicio->TipoPrecio;
          if ($objServicio instanceof OfertaBtMalaga) {                         
            $esOferta = true;
          }	else if ($objServicio instanceof DemandaBtMalaga) {
          	$demandante = $objServicio->Demandante();
          }  	        
        }
        $pestanasEditable->add("Contenido",$campoServicio);

        //Tipo del precio
        $campoTipoPrecio = new CampoEditable();
        $campoTipoPrecio->setNombre('Tipo del precio');
        $grupoSeleccion = new OptionsetField($name = "TipoPrecio",
                                             $title = "TipoPrecio",
                                             $source = array(
                                                             "PorHoras" => "Por horas",
                                                             "Fijo" => "Fijo"
                                                            ),
                                             $value = $this->TipoPrecio
                                            );
        $grupoSeleccion->value = $this->TipoPrecio;
        $campoTipoPrecio->setField($grupoSeleccion);
        $campoTipoPrecio->setValidador(new FacturaBtMalagaValidador($this));

	$pestanasEditable->add('Contenido', $campoTipoPrecio);

                  
	//Precio de la factura.	
        $campoPrecio = new CampoEditable();
        $sistema = Session::get(ComponenteBtMalagaControl::SISTEMA);
        $objSistema = DataObject::get_by_id('SistemaBtMalaga', $sistema);
        if ($objSistema) {
	    $campoPrecio->setNombre('Precio ('.$objSistema->TipoMoneda()->SimboloPlural.')');
        } else {
	    $campoPrecio->setNombre('Precio');
        }
	//if ($esOferta) {
	  //$campoPrecio->setField(new ReadonlyField('Precio', 'Precio', $this->Precio));
	//} else {
	  $campoPrecio->setField(new TextField('Precio', 'Precio', $this->Precio, 4));
	  //$validadorPrecio = new PrecioDemandaBtMalagaValidador();
	  //$validadorPrecio->setDemandante($demandante);
	  //$campoPrecio->setValidador($validadorPrecio);
	//}  
        $pestanasEditable->add('Contenido', $campoPrecio);

        //Tipo de horas del servicio
        $campoTipoHoras = new CampoEditable();
        $campoTipoHoras->setNombre('Horas del servicio');
        $grupoSeleccion = new SelectionGroup('TipoHoras',array('Automatico' => new HiddenField('HorasOulto','HorasOculto',$this->Horas),
                                                               'Manual' => new TextField('datos[HorasVisible]','Horas:',$this->Horas)
                                                        ));
        $grupoSeleccion->value = $this->TipoHoras;
        $campoTipoHoras->setField($grupoSeleccion);

        $pestanasEditable->add('Contenido', $campoTipoHoras);
	
	//Scheduler 
	$valoresCalendario = '';
	foreach ($this->EventosCalendario() as $eventoCalendario) {
		$valoresCalendario .= $eventoCalendario->ID.';'.$eventoCalendario->FechaInicio.';'.$eventoCalendario->FechaFin.';'.$eventoCalendario->Descripcion.'&';
	}
	$campoScheduler = new CampoEditable();
	$campoScheduler->setNombre('Caledario');
	$campoScheduler->setField(new SchedulerField('datos[Calendario]', $valoresCalendario));
	$pestanasEditable->add('Calendario', $campoScheduler);
	
	//Autor
	if ($ponerAutor) {
        //if (!isset($datos[ServicioBtMalaga::AUTOR_SERVICIO])) {
	  if ($this->AutorID) {
	    $objComponenteAutor = DataObject::get_one('ComponenteUsuarioBtMalaga', 'UsuarioId='.$this->AutorID);
	    $this->ComponenteAutor = $objComponenteAutor->ID;
	  }  
	  
	  //pone el nuevo autor
	  $columnasAutor = '{"Campos":[
	                               {"Nombre": "", "Columna":"Seleccionado", "Ordenacion":"na", "Tipo":"ra", "Tamano":20, "Filtro":"&nbsp;", "Alineacion":"left"},
		                           {"Nombre": "Email", "Columna":"Email", "Ordenacion":"str", "Tipo":"ro", "Tamano":180, "Filtro":"#text_filter", "Alineacion":"left"},
		                           {"Nombre": "Nombre", "Columna":"FirtsName", "Ordenacion":"str", "Tipo":"ro", "Tamano":160, "Filtro":"#text_filter", "Alineacion":"left"},
		                           {"Nombre": "Primer Apellido", "Columna":"Surname", "Ordenacion":"str", "Tipo":"ro", "Tamano":160, "Filtro":"#text_filter", "Alineacion":"left"},
		                           {"Nombre": "Segundo Apellido", "Columna":"SApellido", "Ordenacion":"str", "Tipo":"ro", "Tamano":"*", "Filtro":"#text_filter", "Alineacion":"left"}
                                  ]}';
          $sistema = Session::get(ComponenteBtMalagaControl::SISTEMA); 
          $records = DB::query('select distinct ContenidoEditable.ClassName, ContenidoEditableConPermisos.*, ComponenteUsuarioBtMalaga.* from ContenidoEditable, ContenidoEditableConPermisos, ComponenteUsuarioBtMalaga, UsuarioBtMalaga, SistemaUsuarioBtMalaga where ContenidoEditable.ID = ComponenteUsuarioBtMalaga.ID and ContenidoEditableConPermisos.ID=ContenidoEditable.ID and ComponenteUsuarioBtMalaga.UsuarioID=UsuarioBtMalaga.ID and UsuarioBtMalaga.Estado like \'Activo\' and SistemaUsuarioBtMalaga.UsuarioID=UsuarioBtMalaga.ID and SistemaUsuarioBtMalaga.SistemaID='.$sistema);
          $autores = singleton('ComponenteUsuarioBtMalaga')->buildDataObjectSet($records);
	  $autorField = new DataGridField(
	                                  'ComponenteAutor',
	                                  $columnasAutor,
                                          $autores,
	                                  $this->ComponenteAutor
	                                 );     
	      $campoAutor = new CampoEditable();
          $campoAutor->setNombre('Receptor de la factura');
          $campoAutor->setField($autorField);
          $campoAutor->setValidador(new ReferenciaRequeridaValidador());
          $pestanasEditable->add('Contenido', $campoAutor);

        }

        //Observaciones
        $campoObservaciones = new CampoEditable();
        $campoObservaciones->setNombre('Observaciones');
        $campoObservaciones->setMinOccurs(0);
	  $campoObservaciones->setMaxOccurs('unbounded');
	  $campoObservaciones->setSubCampos($this->Observaciones());
	  $campoObservaciones->setTipoSubCampos('ObservacionesBtMalaga');
	  $campoObservaciones->setCampoSubCampos('Observaciones');
	  $campoObservaciones->setPonerHeredados(false);
        $pestanasEditable->add("Contenido",$campoObservaciones);

        
        return $pestanasEditable;
    }	
    
    /**
     * Funci髇 que guarda el contenido.
     **/
    protected function guardar($datos = null) {
      if ($datos != null) {
        $datosComponente = $datos['datos'];
        if (isset($datosComponente['ComponenteAutor'])) {
          $objAutor = DataObject::get_by_id('ComponenteUsuarioBtMalaga', $datosComponente['ComponenteAutor']);
          $this->AutorID = $objAutor->UsuarioID;  
        } 
      }            
      
      $this->cargarDatosNecesarios();
      
      //cambia el estado
      if (($this->EsAutorFacturaOferta) && ($this->Estado == 'PENDIENTEOFERTANTE')) {
      		$this->Estado = 'PENDIENTESOLICITANTE';
      } else if ((!$this->EsAutorFacturaOferta) && ($this->Estado == 'PENDIENTESOLICITANTE')) {
      		$this->Estado = 'PENDIENTEOFERTANTE';
      } else if ($this->Estado == 'ACEPTADA') {
      		$this->Estado = 'PENDIENTEOFERTANTE';
      }

      $eventosCalendario = $this->EventosCalendario();
      //borra todos los eventos de calendario existentes.
      foreach ($eventosCalendario as $eventoCalendario) {
        $eventoCalendario->delete();
      }     

      $this->Horas = 0;
      if ($datosComponente['Calendario'] != null) {
        $eventos = split('&', $datosComponente['Calendario']);      
        foreach ($eventos as $evento) {
      	  $valoresEvento = split(';', $evento);
      	  if (count($valoresEvento) == 3) {
      	    $eventoCalendario = new EventoCalendarioBtMalaga();
      	    $eventoCalendario->FechaInicio = $valoresEvento[0];
      	    $eventoCalendario->FechaFin = $valoresEvento[1];
      	    $eventoCalendario->Descripcion = $valoresEvento[2];
      	    $eventoCalendario->ComponenteID = $this->ID;
      	    $eventoCalendario->write();

                //coge las horas
                $aux = explode(' ', $valoresEvento[0]);
                $fecha = explode('/', $aux[0]);
                $hora = explode(':', $aux[1]);
                $fechaInicio = mktime($hora[0], $hora[1], 0, $fecha[1], $fecha[0], $fecha[2]);

                $aux = explode(' ', $valoresEvento[1]);
                $fecha = explode('/', $aux[0]);
                $hora = explode(':', $aux[1]);
                $fechaFin = mktime($hora[0], $hora[1], 0, $fecha[1], $fecha[0], $fecha[2]);

                $horas = (($fechaFin - $fechaInicio) / 3600);
                $this->Horas += $horas;
      	  }  
      	}  	
      }

      if ($this->TipoHoras == 'Manual') {
        $this->Horas = $datosComponente['HorasVisible'];
      }
      if ($this->Horas > 0) {
          $this->Horas = round($this->Horas * 100)/100;
      }
      
      if (isset($datos[ServicioBtMalaga::SERVICIO_SELECCIONADO])) {
        if ($this->Servicio()->Count() == 0) {
                $servicioID = $datos[ServicioBtMalaga::SERVICIO_SELECCIONADO];
                $servicio = DataObject::get_by_id('ServicioBtMalaga', $servicioID);
                if ($servicio instanceof OfertaBtMalaga) {
                	$servicioFactura = new OfertaFacturaBtMalaga();
        	        $this->Estado = 'PENDIENTEOFERTANTE';
        	    } else {
        	        $servicioFactura = new ServicioFacturaBtMalaga();
        	        $this->Estado = 'PENDIENTEDEMANDANTE';
        	    }  
        	    $servicioFactura->FacturaID = $this->ID;
        	    $servicioFactura->ServicioID = $datos[ServicioBtMalaga::SERVICIO_SELECCIONADO];
        	    $servicioFactura->write();
        }
      }
      
      //guarda los datos del impuesto si no estan.
      if (!$this->DestinatarioImpuestosID) {
          $servicio = $this->Servicio()->First()->Servicio();
          $sistemaServicio = $servicio->Sistema();
          $this->TipoImpuestos = $sistemaServicio->TipoImpuestos;
          if ($this->TipoImpuestos == 'Porcentual') {
              $this->ValorImpuesto = $sistemaServicio->ValorImpuestoPorcentual;
          } else {
              $this->ValorImpuesto = $sistemaServicio->ValorImpuestoFijo;
          }           
          $this->DestinatarioImpuestosID = $sistemaServicio->AdministradorSistemaID;
      }
      
      parent::guardar($datos);
      
      Session::set(FacturaBtMalaga::PARAMETRO_FACTURA_MODIFICADA, 'si');
   }
   
    /**
     * Funci锟絥 para borrar el contenido.
     **/
    public function borrar() {
      $servicios = $this->Servicio();
      foreach ($servicios as $servicio) {
        $servicio->delete(); 
      }
      
      $eventosCalendario = $this->EventosCalendario();
      //borra todos los eventos de calendario existentes.
      foreach ($eventosCalendario as $eventoCalendario) {
        $eventoCalendario->delete();
      }      
      
      parent::delete();
    }	
    
   /**
    * Sobreescribe el m锟絫odo puede leer para mostrar
    * unicamente las facturas del sistema seleccionado.
    **/
   public function puedeLeer() {
     $resultado = false;
     
     //el administrador ve todo independientemente del sistema.
     $usuario = $this->obtenerUsuarioConectado();
     if ($usuario->esAdministrador()) {
       $resultado = parent::puedeLeer();
     } else {
       //solo va a permitir leer los usuarios que pertenezcan al sistema.
       if (($sistema = Session::get(ComponenteBtMalagaControl::SISTEMA)) != null) {
         $consulta = DB::query('SELECT DISTINCT servicio.SistemaID AS sistemaServicio
                                                    FROM ServicioFacturaBtMalaga servicioFactura, ServicioBtMalaga servicio
                                                      WHERE servicioFactura.FacturaID='.$this->ID.'
                                                           AND servicioFactura.ServicioID = servicio.ID');
         if ($consulta->numRecords() > 0) {
           foreach ($consulta as $filas) {
             $sistemaServicio = $filas['sistemaServicio'];
             if ($sistemaServicio == $sistema) {
               $resultado = parent::puedeLeer();
             }
           }               
         }                           
       }
     }
     
     return $resultado;
   }     
    
    /**
     * Devuelve el c锟絛igo par ver la factura.
     **/	
    public $PrestadorDelServicio;
    public $ReceptorDelServicio;
    public $ComponenteServicio;
    public $ComponenteSistema;
    protected function CodigoVer() {
      $servicioFactura = DataObject::get_one('ServicioFacturaBtMalaga','FacturaID='.$this->ID);      
      $this->ComponenteServicio = DataObject::get_by_id('ServicioBtMalaga', $servicioFactura->ServicioID);
      if ($this->ComponenteServicio instanceof OfertaBtMalaga) {
        $this->PrestadorDelServicio = DataObject::get_one('ComponenteUsuarioBtMalaga', 'UsuarioID='.$this->ComponenteServicio->OfertanteID);
        $this->ReceptorDelServicio = DataObject::get_one('ComponenteUsuarioBtMalaga', 'UsuarioID='.$this->Autor()->ID);        
      } else if ($this->ComponenteServicio instanceof DemandaBtMalaga) {
        $this->PrestadorDelServicio = DataObject::get_one('ComponenteUsuarioBtMalaga', 'UsuarioID='.$this->Autor()->ID);
        $this->ReceptorDelServicio = DataObject::get_one('ComponenteUsuarioBtMalaga', 'UsuarioID='.$this->ComponenteServicio->DemandanteID);      	
      }
      $this->ComponenteSistema = DataObject::get_by_id('SistemaBtMalaga', $this->ComponenteServicio->SistemaID);
      
      switch ($this->Estado) {
        case 'PENDIENTEOFERTANTE': $this->EstadoFormateado = 'Pendiente de aceptar por el prestador del servicio';
                                                             break;
	    case 'PENDIENTESOLICITANTE': $this->EstadoFormateado = 'Pendiente de aceptar por el receptor del servicio';
                                                               break;		                                                     
        case 'ACEPTADA': $this->EstadoFormateado = 'Pendiente de realizar el servicio'; 
                                                   break;
        case 'REALIZADA': $this->EstadoFormateado = 'Servicio realizado'; 
                                                    break;
        case 'RECHAZADA': $this->EstadoFormateado = 'Servicio rechazado'; 
                                                    break;		                                  
      }     
      return $this->renderWith('PlantillaVerFactura');
    }
    
    /**
     * Devuelve el c锟絛igo para ver las opiniones de la factura.
     **/
    public $OpinionPrestadorDelServicio;
    public $OpinionReceptorDelServicio; 
    public function verOpinionesFactura() {
      $servicioFactura = DataObject::get_one('ServicioFacturaBtMalaga','FacturaID='.$this->ID);      
      $componenteServicio = DataObject::get_by_id('ServicioBtMalaga', $servicioFactura->ServicioID);
      if ($componenteServicio instanceof OfertaBtMalaga) {
        $prestadorDelServicio = DataObject::get_by_id('ComponenteUsuarioBtMalaga', $componenteServicio->OfertanteID);
        $receptorDelServicio = DataObject::get_one('ComponenteUsuarioBtMalaga', 'UsuarioID='.$this->Autor()->ID);        
      }
      $this->OpinionPrestadorDelServicio = DataObject::get_one('OpinionServicioBtMalaga','AutorID='.$prestadorDelServicio->Usuario()->ID.' AND FacturaID='.$this->ID);
      $this->OpinionReceptorDelServicio = DataObject::get_one('OpinionServicioBtMalaga','AutorID='.$receptorDelServicio->Usuario()->ID.' AND FacturaID='.$this->ID);      
      return $this->renderWith('PlantillaVerOpinionesFactura');
    }
    
 	/**
	 * Clase que devuelve los botones para el toolbar.
	 * Nota: debe ser sobreescrito por cada componente.
	 **/
	public function botonesToolbar() {
		$this->cargarAcciones();
		$xml = parent::botonesToolbar();
		
		$edicion = "editarFactura";
		$usuario = $this->obtenerUsuarioConectado();
     	if ($usuario->esAdministrador()) {
     		$edicion = "editar";
     	}
		//bot锟絥 para editar
        $xml .= '<item id="'.$edicion.'#'.$this->ID.'" type="button" text="Editar" img="btmalaga/images/edit.gif" imgdis="btmalaga/images/editdisabled.gif"';
        if (strpos($this->AccionEditar,'javascript') === false) {
        	$xml .= ' enabled="false"';
     	}        
        $xml .= '></item>';
        
        //bot锟絥 para aceptar
        $cadenas = split('\^',$this->AccionAceptar);
        $imagen = str_replace('btmalaga/images/','',$cadenas[0]);
        $funcionAccion;
        if (($imagen == 'accept-icon.png') || ($imagen == 'accept-icondisabled.png')) {
        	$imagen = 'accept-icon.png';
        	$imagendes = 'accept-icondisabled.png';
        	$texto = 'Aceptar';
        	$funcionAccion = '0';
        } else if (($imagen == 'cash-register-icon.png') || ($imagen == 'cash-register-icondisabled.png')) {
        	$imagen = 'cash-register-icon.png';
        	$imagendes = 'cash-register-icondisabled.png';
        	$texto = 'Pagar';
        	$funcionAccion = '0';
        }  else if (($imagen == 'comment-edit-icon.png') || ($imagen == 'comment-edit-icondisabled.png')) {
        	$imagen = 'comment-edit-icon.png';
        	$imagendes = 'comment-edit-icondisabled.png';
        	$texto = 'Opinar';
        	$funcionAccion = '1';
        }  else if (($imagen == 'comment-icon.png') || ($imagen == 'comment-icondisabled.png')) {
        	$imagen = 'comment-icon.png';
        	$imagendes = 'comment-icon.png';
        	$texto = 'Opinar';
        	$funcionAccion = '1';
        }

        $imagen = str_replace('disabled','',$imagen);
        $nuevoEstado = '';
        if ($funcionAccion == '0') {
        	if (isset($cadenas[2])) {        	        	
        		$inicioEstado = strpos($cadenas[2],'"')+1;
        		$finalEstado = strpos($cadenas[2],'"',$inicioEstado)-1;
        		$nuevoEstado = substr($cadenas[2],$inicioEstado,$finalEstado - $inicioEstado);
        	}	        	
        } else if ($funcionAccion == '1') {
        	$usuario = $this->obtenerUsuarioConectado();
          	$nuevoEstado = $usuario->ID;	
        }

        $xml .= '<item id="aceptar#'.$this->ID.'#'.$funcionAccion.'#'.$nuevoEstado.'" type="button" text="'.$texto.'" img="btmalaga/images/'.$imagen.'" imgdis="btmalaga/images/'.$imagendes.'"';
        if (strpos($this->AccionAceptar,'javascript') === false) {
        	$xml .= ' enabled="false"';
     	}        
        $xml .= '></item>';
        //bot锟絥 para rechazar
        $cadenas = split('\^',$this->AccionRechazar);
        $imagen = str_replace('btmalaga/images/','',$cadenas[0]);
        if ($imagen == 'remove-icondisabled.png') {
        	$deshabilitado = true;
        } else if ($imagen == 'remove-icon.png') {
        	$deshabilitado = false;
        }
        $xml .= '<item id="rechazar#'.$this->ID.'" type="button" text="Rechazar" img="btmalaga/images/remove-icon.png" imgdis="btmalaga/images/remove-icondisabled.png"';
        if ($deshabilitado === true) {
        	$xml .= ' enabled="false"';
     	}        
        $xml .= '></item>';        
        
        return $xml;
    }    

    /**
     * Devuelve los campso para el formulario para el filtrado de datos.
     **/
    public function formularioFiltro() {
      if (($sistema = Session::get(ComponenteBtMalagaControl::SISTEMA)) != null) {
        $fieldSistema = new HiddenField('Sistema','Sistema',$sistema);
      } else {
        $sistemas = DataObject::get('SistemaBtMalaga');
        if ($sistemas) {
	    $sistemas = $sistemas->toDropdownMap('ID', 'Nombre', ' ', true);
          $fieldSistema = new DropdownField('Sistema', 'Sistema:', $sistemas);
	  }
      }
      $tiposServicios = array('' => ' ',
                              'OfertaBtMalaga' => 'Oferta',
                              'DemandaBtMalaga' => 'Demanda'
                             );
 
      $fieldTipoServicio = new DropdownField('TipoServicio','Tipo de servicio:',$tiposServicios);      

      $fields = new FieldSet($fieldSistema,
                             $fieldTipoServicio,
                             new TextField('AutorServicio','Autor del servicio (Email):'),
                             new TextField('AutorFactura','Solicitante del servicio (Email):'),
                             new CalendarDateField('FCreacionAntes', 'Creada antes de:', ''),
                             new CalendarDateField('FCreacionDespues', 'Creada desp&uacute;es de:', '')
                            );
      return $fields;
    }

    /**
     * Devuelve los campos para el formulario para el filtrado de datos.
     **/
    public function formularioFiltroMisFacturas() {
      $this->variablePuedeEditarEnListado = true;
      if (($sistema = Session::get(ComponenteBtMalagaControl::SISTEMA)) != null) {
        $fieldSistema = new HiddenField('Sistema','Sistema',$sistema);
      } else {
        $sistemas = DataObject::get('SistemaBtMalaga');
        if ($sistemas) {
	    $sistemas = $sistemas->toDropdownMap('ID', 'Nombre', ' ', true);
          $fieldSistema = new DropdownField('Sistema', 'Sistema:', $sistemas);
	  }
      }
      $tiposServicios = array('' => ' ',
                              'OfertaBtMalaga' => 'Oferta',
                              'DemandaBtMalaga' => 'Demanda'
                             );
 
      $fieldTipoServicio = new DropdownField('TipoServicio','Tipo de servicio:',$tiposServicios);      

      $fields = new FieldSet($fieldSistema,
                             $fieldTipoServicio,
                             new HiddenField('Usuario','Usuario', $this->obtenerUsuarioConectado()->ID),
                             new CalendarDateField('FCreacionAntes', 'Creada antes de:', ''),
                             new CalendarDateField('FCreacionDespues', 'Creada desp&uacute;es de:', '')
                            );
      return $fields;
    }

    public function TipoPrecioAMostar() {
        $resultado = '';
        if ($this->TipoPrecio == 'Fijo') {
            $resultado = ', precio fijo';
        } else if ($this->TipoPrecio == 'PorHoras') {
            $resultado = ' por hora';
        } else {
            $resultado = ' a convenir';
        }
        return $resultado;
    }

    public function PrecioFinal() {
        if ($this->Precio == 0) { 
          return '';
        } else {
            if ($this->TipoPrecio == 'Fijo') {
                $precio = $this->Precio;
            } else {
                $precio = $this->Precio * $this->Horas;
            }
            if ($this->TipoImpuestos == 'Fijo') {
                $impuestos = $this->ValorImpuesto;
            } else {
                $impuestos = ($this->ValorImpuesto * $precio) / 100;
            }
            $redondeoPrecio = round(($precio - $impuestos)*100)/100;
            $redondeoImpuestos = round($impuestos*100)/100; 
            $resultado = $redondeoPrecio.' + '.$redondeoImpuestos.' de impuestos';
            return $resultado;
        }
    }

   /**
     * Devuelve los parametros para el listado.
     **/
    /*public function parametrosListado() {
        $parametros = '&'.ServicioBtMalaga::AUTOR_SERVICIO.'='.$this->obtenerUsuarioConectado()->ID;
        return $parametros;
    }*/
            
}
?>
