<?php

class RegistroDocumento extends AppObjeto {

	/**
	 * Ayuda para calcular el n�mero nuevo
	 *
	 * 1 - Primero se calcula la serie, que se compone de 3 d�gitos:  los 2 primeros son el c�digo de la empresa. Y el tercero puede ser :
	 - "0":  Documento en papel.
	 - "D": Documento digital.
	 - "F":  Definitivo.
	 Por ejemplo, un documento digital de la empresa "00", tendr�a la serie "00D".
	
	 2 - Una vez tenemos la serie, hay que hacer una consulta en la base de datos, para buscar cu�l es el n�mero m�s alto con esa serie.
	 3 - A dicho n�mero de sumamos 1.
	 4 - Completamos con ceros, para formar un n�mero de 10 d�gitos que empiece por la serie  y acabe con el n�mero calculado.
	 Por ejemplo: "00D0000452" donde "00D" es la serie y 452 el �ltimo n�mero + 1
	 *
	 */
	
	protected $numero;
	protected $empresa;
	protected $fecha;
	protected $codigoContacto;
	protected $codigoCliente;
	protected $codigoVehiculo;
	protected $codigoChofer;
	protected $observaciones;
	protected $medioRecepcion;
	protected $tipoDocumento;
	protected $formato;
	protected $codigoPresupuesto;
	protected $codigoReserva;
	protected $codigoServicio;
	protected $codigoFactura;
	protected $localizador;
	protected $codigoComisionista;
	protected $codigoSubcomisionista;
	protected $elDocumentoSaleDeLaEmpresa;
	protected $rutaEnDisco;
	protected $logCreadoFecha;
	protected $logCreadoUsuario;
	protected $logUltimaModificacionFecha;
	protected $logUltimaModificacionUsuario;
	protected $logTratadoFecha;
	protected $logTratadoUsuario;
	protected $logVistoBuenoFecha;
	protected $logVistoBuenoUsuario;
	protected $logUsuarioWebSubido;
	protected $ticket;
	
	const FORMATO_PAPEL = 0;
	const FORMATO_DIGITAL = 1;
	const FORMATO_DEFINITIV0 = 2;
	const FORMATO_PAPEL_CODIFICACION = '000';
	const FORMATO_DIGITAL_CODIFICACION = '00D';
	const FORMATO_DEFINITIVO_CODIFICACION = '00F';
	
	const MEDIO_RECEPCION_APP = 18;
	
	const TIPODOCUMENTO_HOJA_DE_RUTA = 22;
	const TIPODOCUMENTO_TICKET_APP = 871;
	const TIPODOCUMENTO_DNI = 79;
	const TIPODOCUMENTO_TARJETA_SANITARIA = 80;
	const TIPODOCUMENTO_CARNET_CONDUCIR = 78;
	const TIPODOCUMENTO_CURRICULUM = 57;
	
	const RUTA_POR_DEFECTO = "C:\Dropbox\ESCANEOS APP";
	const RUTA_POR_DEFECTO_PARA_KARVE = "D:\Dropbox\ESCANEOS APP";
	//const RUTA_POR_DEFECTO = "D:\ESCANEOSPRUEBA";
	
	/* para conectar con bd */
	protected static $_aliasTabla = 'rd';
	protected static $_nombreTabla = 'REG_DOCS_ENTRA';
	protected static $_campoPK = 'NUMERO';
	protected static $_tipo_primary = self::APP_TIPO_PRIMARY_STRING;
	
	public static function findByUsuarioAndTipo($usuario, $tipo) {
		$select = self::selectObjeto();
		$select->where(sprintf("rd.TIPO_DOCU = %d AND rd.CONTACTO ='%s'", $tipo, $usuario));
		$res = self::selectExecute($select);
		$rd = new RegistroDocumento();
		if (!$res->estaVacio()){
			$datos = $res->getDatos();
			$rd->id = $datos[0]['numero'];
			$rd->asignaDatosObjeto($datos[0]);
		}
		return $rd;
	}

	public static function findAllByUsuarioAndTipo($usuario, $tipo) {
		$select = self::selectObjeto();
		$select->where(sprintf("rd.TIPO_DOCU = %d AND rd.CONTACTO ='%s'", $tipo, $usuario));
		$res = self::selectExecute($select);
		$result = [];
		
		if (!$res->estaVacio()){

			$datos = $res->getDatos();
			foreach($datos as $reg) {
				$rd = new RegistroDocumento();
				$rd->id = $reg['numero'];
				$rd->asignaDatosObjeto($reg);
				$result[] = $rd;
			}
			
		}
		return $result;
	}

	public static function findByNumero($numero){
		$select = self::selectObjeto();
		$select->where(sprintf("rd.NUMERO = %d", $numero));
		$res = self::selectExecute($select);
		$rd = new RegistroDocumento();
		if (!$res->estaVacio()){
			$datos = $res->getDatos();
			$rd->id = $datos[0]['numero'];
			$rd->asignaDatosObjeto($datos[0]);
		}
		return $rd;
	}


	public static function findHojaRutaByServicio($servicio){
		$select = self::selectObjeto();
		$select->where(sprintf("rd.TIPO_DOCU = %d AND rd.SERVICIO ='%s'", self::TIPODOCUMENTO_HOJA_DE_RUTA, $servicio));
		$res = self::selectExecute($select);
		$rd = new RegistroDocumento();
		if (!$res->estaVacio()){
			$datos = $res->getDatos();
			$rd->id = $datos[0]['numero'];
			$rd->asignaDatosObjeto($datos[0]);
		}
		return $rd;
	}

	public static function findTicketsByServicio($servicio){
		$select = self::selectObjeto();
		$select->where(sprintf("rd.TIPO_DOCU = %d AND rd.SERVICIO ='%s'", self::TIPODOCUMENTO_TICKET_APP, $servicio));
		$res = self::selectExecute($select);
		if ($res->estaVacio()){
			return null;
		}
		
		$datos = $res->getDatos();
		$res = [];
		foreach ($datos as $dato) {
			$rd = new RegistroDocumento();
			$rd->id = $dato['numero'];
			$rd->asignaDatosObjeto($dato);
			$res[] = $rd;	
		}
		return $res;
	}

	public function generarNuevoCodigo(){
		$prefijo = '';
		switch ($this->formato) {
			case self::FORMATO_PAPEL:
				$prefijo = self::FORMATO_PAPEL_CODIFICACION;
				break;
			case self::FORMATO_DEFINITIV0:
				$prefijo = self::FORMATO_DEFINITIVO_CODIFICACION;
				break;
			case self::FORMATO_DIGITAL:
				$prefijo = self::FORMATO_DIGITAL_CODIFICACION;
				break;
		}
		$sql = sprintf("select max(convert(int,substring(numero,4,7)+1)) as siguienteNumero
				from reg_docs_entra
				where numero like '%s%%'", $prefijo);
		$db = self::getDb();
		$adapter = $db->getAdapter();
		
		try {
			$stmt = $adapter->query($sql);
		} catch (Exception $e) {
			echo $e->getMessage();
		}
		$rows = $stmt->fetch();
		$siguiente = $rows['siguienteNumero'];
		$siguiente = str_pad($siguiente, 7, '0', STR_PAD_LEFT);
		$siguiente = $prefijo.$siguiente;
		return $siguiente;
	}
	
	public function __construct($id = null) {
		parent::__construct($id);
		if (!$id){
			$this->setLogCreadoFecha(date('Ymdh:m'));
			$this->setFecha(date('y-m-d'));
			$this->logCreadoUsuario = UsuarioKarve::USU_INTRANET;
		}
	}
	
	
	public function guardarFichero($file){
		$nombre = $file['name'];
		$extension = substr($nombre,strpos($nombre,'.')+1);
		$ano = substr($this->logCreadoFecha,0,4);
		$filename = '\\'.$ano.'\\'.$this->numero.'.'.$extension;
		$this->rutaEnDisco = self::RUTA_POR_DEFECTO_PARA_KARVE.$filename;
		echo 'ruta:'.self::RUTA_POR_DEFECTO.$filename;
		if (move_uploaded_file($file['tmp_name'], self::RUTA_POR_DEFECTO.$filename)) {
			return true;
		} else {
			return false;
		}
	}
	
	public function asignarServicio($codigoServicio){
		$servicio = new Servicio($codigoServicio);
		$potencial = Potencial::getByCliente($servicio->getCodigoCliente());
		$reserva = new Reserva($servicio->getReserva());
		$codigoPresupuesto = $reserva->getCodigoPresupuesto();
		$presupuesto = new Presupuesto($codigoPresupuesto);
		if ($servicio->getNumeroServicio()){
			$this->codigoServicio 	= $codigoServicio;
			$this->empresa 			= $servicio->getEmpresa();
			$this->codigoContacto 	= $potencial->getCodigo();
			$this->codigoCliente 	= $servicio->getCodigoCliente();
			$this->codigoChofer		= $servicio->getCodigoChofer();
			$this->codigoVehiculo	= $servicio->getCodigoVehiculo();
			$this->codigoPresupuesto = $codigoPresupuesto;
			$this->codigoReserva	= $servicio->getReserva();
			$this->localizador		= $servicio->getLocalizador();
			$this->codigoComisionista = $servicio->getComisionista();
			$this->codigoSubcomisionista = $servicio->getSubcomisionista();
			$this->codigoFactura	= $servicio->getFactura();
		}
	}

	public function asignarPotencial($usuario){
		$this->empresa 			= $usuario->getEmpresa();
		$this->codigoContacto 	= $potencial->getCodigo();
	}

	
	public function asignarSubidaApp($usuario){
		$this->logUsuarioWebSubido = $usuario;
		$this->medioRecepcion = self::MEDIO_RECEPCION_APP;
		$this->elDocumentoSaleDeLaEmpresa = 0;
		$this->formato = self::FORMATO_DIGITAL;
	}

	public function remove() {
		
		$clase = get_called_class();
		$campoPK = $clase::getCampoPK();
		if(isset($this->id)) {
			if($clase::getTipoPrimary() == self::APP_TIPO_PRIMARY_STRING){
				$where = array (
					$campoPK . '= \'' . $this->id .'\''
				);
			}else{
				$where = array (
						$campoPK . '= ' . $this->id
				);
			}
			$db = $clase::getDb();
			$db->delete($where);
		}
	}
	
	protected static function initMetaDatos(){
		//pant::initMetaDatos();
		self::addPropiedadBD('rd', 'NUMERO', 'numero', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'FECHA', 'fecha', self::META_DATE);
		self::addPropiedadBD('rd', 'EMPRESA', 'empresa', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'CONTACTO', 'codigoContacto', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'CLIENTE', 'codigoCliente', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'VEHI', 'codigoVehiculo', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'CHOFER', 'codigoChofer', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'COMENTARIO', 'observaciones', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'MEDIO_REC',	'medioRecepcion', self::META_INT);
		self::addPropiedadBD('rd', 'TIPO_DOCU', 'tipoDocumento', self::META_INT);
		self::addPropiedadBD('rd', 'DIGITAL', 'formato', self::META_INT);
		self::addPropiedadBD('rd', 'PRESUPUESTO', 'codigoPresupuesto', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'RESERVA', 'codigoReserva', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'SERVICIO', 'codigoServicio', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'FACTURA', 'codigoFactura', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'LOCALIZADOR', 'localizador', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'COMISIO', 'codigoComisionista', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'SUBCOMISIO', 'codigoSubcomisionista', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'SALIENTE', 'elDocumentoSaleDeLaEmpresa', self::META_INT);
		self::addPropiedadBD('rd', 'RUTADOCU', 'rutaEnDisco', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'USUCREA', 'logCreadoUsuario', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'FECHACREA', 'logCreadoFecha', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'USUARIO', 'logUltimaModificacionUsuario', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'ULTMODI', 'logUltimaModificacionFecha', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'USUARIO_CWEB', 'logUsuarioWebSubido', self::META_VARCHAR);
		self::addPropiedadBD('rd', 'TICKET', 'ticket', self::META_VARCHAR);
	}
	
	public function getUsuarioWebSubido() {
	    return $this->logUsuarioWebSubido;
	}
	public function setUsuarioWebSubido($logUsuarioWebSubido) {
	    $this->logUsuarioWebSubido = $logUsuarioWebSubido;
	}
	
	public function getLogUltimaModificacionFecha() {
	    return $this->logUltimaModificacionFecha;
	}
	public function setLogUltimaModificacionFecha($logUltimaModificacionFecha) {
	    $this->logUltimaModificacionFecha = $logUltimaModificacionFecha;
	}
	
	public function getLogUltimaModificacionUsuario() {
	    return $this->logUltimaModificacionUsuario;
	}
	public function setLogUltimaModificacionUsuario($logUltimaModificacionUsuario) {
	    $this->logUltimaModificacionUsuario = $logUltimaModificacionUsuario;
	}
	
	public function getLogCreadoFecha() {
	    return $this->logCreadoFecha;
	}
	public function setLogCreadoFecha($logCreadoFecha) {
	    $this->logCreadoFecha = $logCreadoFecha;
	}

	public function getLogCreadoUsuario() {
	    return $this->logCreadoUsuario;
	}
	public function setLogCreadoUsuario($logCreadoUsuario) {
	    $this->logCreadoUsuario = $logCreadoUsuario;
	}
	
	public function getRutaEnDisco() {
	    return $this->rutaEnDisco;
	}
	public function setRutaEnDisco($rutaEnDisco) {
	    $this->rutaEnDisco = $rutaEnDisco;
	}
	
	public function getElDocumentoSaleDeLaEmpresa() {
	    return $this->elDocumentoSaleDeLaEmpresa;
	}
	public function setElDocumentoSaleDeLaEmpresa($elDocumentoSaleDeLaEmpresa) {
	    $this->elDocumentoSaleDeLaEmpresa = $elDocumentoSaleDeLaEmpresa;
	}
	
	public function getCodigoSubcomisionista() {
	    return $this->codigoSubcomisionista;
	}
	public function setCodigoSubcomisionista($codigoSubcomisionista) {
	    $this->codigoSubcomisionista = $codigoSubcomisionista;
	}
	
	public function getCodigoComisionista() {
	    return $this->codigoComisionista;
	}
	public function setCodigoComisionista($codigoComisionista) {
	    $this->codigoComisionista = $codigoComisionista;
	}
	
	public function getLocalizador() {
	    return $this->localizador;
	}
	public function setLocalizador($localizador) {
	    $this->localizador = $localizador;
	}

	public function getCodigoFactura() {
	    return $this->codigoFactura;
	}
	public function setCodigoFactura($codigoFactura) {
	    $this->codigoFactura = $codigoFactura;
	}
	
	public function getCodigoServicio() {
	    return $this->codigoServicio;
	}
	public function setCodigoServicio($codigoServicio) {
	    $this->codigoServicio = $codigoServicio;
	}
	
	public function getCodigoReserva() {
	    return $this->codigoReserva;
	}
	public function setCodigoReserva($codigoReserva) {
	    $this->codigoReserva = $codigoReserva;
	}
	
	public function getCodigoPresupuesto() {
	    return $this->codigoPresupuesto;
	}
	public function setCodigoPresupuesto($codigoPresupuesto) {
	    $this->codigoPresupuesto = $codigoPresupuesto;
	}
	
	public function getFormato() {
	    return $this->formato;
	}
	public function setFormato($formato) {
	    $this->formato = $formato;
	}
	
	public function getTipoDocumento() {
	    return $this->tipoDocumento;
	}
	public function setTipoDocumento($tipoDocumento) {
	    $this->tipoDocumento = $tipoDocumento;
	}
	
	public function getMedioRecepcion() {
	    return $this->medioRecepcion;
	}
	public function setMedioRecepcion($medioRecepcion) {
	    $this->medioRecepcion = $medioRecepcion;
	}
	
	public function getObservaciones() {
	    return $this->observaciones;
	}
	public function setObservaciones($observaciones) {
	    $this->observaciones = $observaciones;
	}
	
	public function getCodigoChofer() {
	    return $this->codigoChofer;
	}
	public function setCodigoChofer($codigoChofer) {
	    $this->codigoChofer = $codigoChofer;
	}
		
	public function getCodigoVehiculo() {
	    return $this->codigoVehiculo;
	}
	public function setCodigoVehiculo($codigoVehiculo) {
	    $this->codigoVehiculo = $codigoVehiculo;
	}

	public function getCodigoCliente() {
	    return $this->codigoCliente;
	}
	public function setCodigoCliente($codigoCliente) {
	    $this->codigoCliente = $codigoCliente;
	}

	public function getCodigoContacto() {
	    return $this->codigoContacto;
	}
	public function setCodigoContacto($codigoContacto) {
	    $this->codigoContacto = $codigoContacto;
	}
	
	public function getNumero() {
	    return $this->numero;
	}
	public function setNumero($numero) {
	    $this->numero = $numero;
	}
	
	public function getEmpresa() {
	    return $this->empresa;
	}
	public function setEmpresa($empresa) {
	    $this->empresa = $empresa;
	}
	
	public function getFecha() {
	    return $this->fecha;
	}
	public function setFecha($fecha) {
	    $this->fecha = $fecha;
	}
	
	public function setTicket($ticket) {
		$this->ticket = $ticket;
	}
	
	
}