/// <summary>
 /// Método Público encargado de la Edicion de los Registros
 /// </summary>
 /// <param name="id_servicio_control_evidencia">Id Servicio  de Control de Evidencia</param>
 /// <param name="id_servicio">Id de Servicio</param>
 /// <param name="id_segmento_control_evidencia">Id Segmento Control Evidencia</param>
 /// <param name="id_segmento">Id Segmento</param>
 /// <param name="id_tipo_documento">Id de Tipo de Documento</param>
 /// <param name="id_estatus_documento">Estatus del Documento</param>
 /// <param name="id_hoja_instruccion_documento">Hoja de Instrucción</param>
 /// <param name="terminal_recepcion">Terminal de Recepción</param>
 /// <param name="fecha_recepcion">Fecha de Recepción</param>
 /// <param name="terminal_cobro">Terminal de Cobro</param>
 /// <param name="bit_original">Origina</param>
 /// <param name="bit_copia">Copia</param>
 /// <param name="bit_sello">Sello</param>
 /// <param name="id_imagen">Id de Imagen</param>
 /// <param name="referencia_imagen">Referencia de Imagen</param>
 /// <param name="id_usuario">Id de Usuario</param>
 /// <returns></returns>
 public RetornoOperacion EditaControlEvidenciaDocumento(int id_servicio_control_evidencia, int id_servicio, int id_segmento_control_evidencia, int id_segmento, byte id_tipo_documento,
                                                        EstatusDocumento id_estatus_documento, int id_hoja_instruccion_documento, int terminal_recepcion,
                                                        DateTime fecha_recepcion, int terminal_cobro, bool bit_original,
                                                        bool bit_copia, bool bit_sello, int id_imagen, string referencia_imagen,
                                                        int id_usuario)
 {   //Invocando Método de Actualización
     return(this.actualizaRegistros(id_servicio_control_evidencia, id_servicio, id_segmento_control_evidencia, id_segmento, id_tipo_documento,
                                    id_estatus_documento, id_hoja_instruccion_documento, terminal_recepcion,
                                    fecha_recepcion, terminal_cobro, bit_original, bit_copia, bit_sello,
                                    id_imagen, referencia_imagen, id_usuario, this._habilitar));
 }
        /// <summary>
        /// Método Público encargado de la Insercion de los Registros
        /// </summary>
        /// <param name="id_servicio_control_evidencia">Id Sevicio Control de Evidencia</param>
        /// <param name="id_servicio">Id de Servcio</param>
        /// <param name="id_segmento_control_evidencia">Id Segmento Control Evidencia</param>
        /// <param name="id_segmento">Id Segmento</param>
        /// <param name="id_tipo_documento">Id de Tipo de Documento</param>
        /// <param name="id_estatus_documento">Estatus del Documento</param>
        /// <param name="id_hoja_instruccion_documento">Hoja de Instrucción</param>
        /// <param name="terminal_recepcion">Terminal de Recepción</param>
        /// <param name="fecha_recepcion">Fecha de Recepción</param>
        /// <param name="terminal_cobro">Terminal de Cobro</param>
        /// <param name="bit_original">Origina</param>
        /// <param name="bit_copia">Copia</param>
        /// <param name="bit_sello">Sello</param>
        /// <param name="id_imagen">Id de Imagen</param>
        /// <param name="referencia_imagen">Referencia de Imagen</param>
        /// <param name="id_usuario">Id de Usuario</param>
        /// <returns></returns>
        public static RetornoOperacion InsertaControlEvidenciaDocumento(int id_servicio_control_evidencia, int id_servicio, int id_segmento_control_evidencia, int id_segmento, byte id_tipo_documento,
                                                                        EstatusDocumento id_estatus_documento, int id_hoja_instruccion_documento, int terminal_recepcion,
                                                                        DateTime fecha_recepcion, int terminal_cobro, bool bit_original,
                                                                        bool bit_copia, bool bit_sello, int id_imagen, string referencia_imagen,
                                                                        int id_usuario)
        {   //Declarando Objeto de Retorno
            RetornoOperacion result = new RetornoOperacion();

            //Creamos la transacción
            using (TransactionScope scope = Transaccion.InicializaBloqueTransaccional(System.Transactions.IsolationLevel.ReadCommitted))
            {
                //Declarando Arreglo de Parametros
                object[] param = { 1,                                                                          0, id_servicio_control_evidencia, id_servicio, id_segmento_control_evidencia, id_segmento,       id_tipo_documento,
                                   (byte)id_estatus_documento,                     id_hoja_instruccion_documento, terminal_recepcion,
                                   Fecha.ConvierteDateTimeObjeto(fecha_recepcion),
                                   terminal_cobro,                                 bit_original,                  bit_copia,                     bit_sello,   id_imagen,                     referencia_imagen,
                                   id_usuario,                                     true,                          "",                            "" };

                //Declarando Variable Auxiliar
                int id_control_evidencia = 0;

                //Obteniendo Resultado del SP
                result = CapaDatos.m_capaDeDatos.EjecutaProcAlmacenadoObjeto(_nom_sp, param);

                //Si se Inserto Correctamente Control Evidencia Documento
                if (result.OperacionExitosa)
                {
                    //Asignando Control Evidencia
                    id_control_evidencia = result.IdRegistro;

                    //Instanciamos SegmentoControlEvidencia
                    using (SegmentoControlEvidencia sce = new SegmentoControlEvidencia(SegmentoControlEvidencia.TipoConsulta.IdSegmentoControlEvidencia, id_segmento_control_evidencia))
                    {
                        //Actualizamos Estatus
                        result = sce.ActualizaEstatusSegmentoControlEvidenciaSegmento(id_usuario);
                    }
                }
                //Validamos Resultado
                if (result.OperacionExitosa)
                {
                    //Actualizamos Estatus
                    result = new RetornoOperacion(id_control_evidencia);

                    //Validamos Transacción
                    scope.Complete();
                }
            }
            //Devolviendo Resultado
            return(result);
        }
        /// <summary>
        /// Actualizamos Estatus de Control Evidencia Documento
        /// </summary>
        /// <param name="estatus"></param>
        /// <param name="id_usuario"></param>
        /// <returns></returns>
        public RetornoOperacion ActualizaEstatusControlEvidenciaDocumento(EstatusDocumento estatus, int id_usuario)
        {
            //Declaramos Objeto Resultado
            RetornoOperacion resultado = new RetornoOperacion(0);

            //Declaramos Variable para fecha de recepción del Documento
            DateTime fecha_recepcion = this._fecha_recepcion;

            //Declaramos IdControl Evidencia
            int IdControl = 0;

            //Validamos que no se encuentre cancelado el Documento
            if ((EstatusDocumento)this._id_estatus_documento != EstatusDocumento.Cancelado)
            {
                //Validamos que el estatus sea Recibido o Recibido con Reención para la asignación de la fecha de recepción
                if (estatus == EstatusDocumento.Recibido || estatus == EstatusDocumento.Recibido_Reenvio)
                {
                    fecha_recepcion = Fecha.ObtieneFechaEstandarMexicoCentro();
                }

                //Actualizamos Estatus del Documento
                resultado = this.actualizaRegistros(this._id_servicio_control_evidencia, this._id_servicio, this._id_segmento_control_evidencia, this._id_segmento, this._id_tipo_documento, estatus, this._id_hoja_instruccion_documento,
                                                    this._terminal_recepcion, this._fecha_recepcion, this._terminal_cobro, this._bit_original,
                                                    this._bit_copia, this._bit_sello, this._id_imagen, this._referencia_imagen, id_usuario, this._habilitar);
                //Establecemos Id del Control Evidencia
                IdControl = resultado.IdRegistro;

                //Si se actualizo Correctamente el Registro
                if (resultado.OperacionExitosa)
                {
                    //Instanciamos Viaje Control Evidencia
                    using (SegmentoControlEvidencia objSegmentoControlEvidencia = new SegmentoControlEvidencia(SegmentoControlEvidencia.TipoConsulta.IdSegmentoControlEvidencia, this._id_segmento_control_evidencia))
                    {
                        //Actualizamos Viaje Control Evidencia
                        resultado = objSegmentoControlEvidencia.ActualizaEstatusSegmentoControlEvidenciaSegmento(id_usuario);
                        //Sila actualización fue correcta
                        if (resultado.OperacionExitosa)
                        {
                            resultado = new RetornoOperacion(IdControl);
                        }
                    }
                }
            }
            return(resultado);
        }
        /// <summary>
        /// Método Privado encargado de las Actualizacion en la BD
        /// </summary>
        /// <param name="id_servicio_control_evidencia">Id de Servicio Control de Evidencia</param>
        /// <param name="id_servicio">Id de Sevicio</param>
        /// <param name="id_segmento_control_evidencia">Id Segmento Control Evidencia</param>
        /// <param name="id_segmento">Id Segmento</param>
        /// <param name="id_tipo_documento">Id de Tipo de Documento</param>
        /// <param name="id_estatus_documento">Estatus del Documento</param>
        /// <param name="id_hoja_instruccion_documento">Hoja de Instrucción</param>
        /// <param name="terminal_recepcion">Terminal de Recepción</param>
        /// <param name="fecha_recepcion">Fecha de Recepción</param>
        /// <param name="terminal_cobro">Terminal de Cobro</param>
        /// <param name="bit_original">Origina</param>
        /// <param name="bit_copia">Copia</param>
        /// <param name="bit_sello">Sello</param>
        /// <param name="id_imagen">Id de Imagen</param>
        /// <param name="referencia_imagen">Referencia de Imagen</param>
        /// <param name="id_usuario">Id de Usuario</param>
        /// <param name="habilitar">Estatus Habilitado</param>
        /// <returns></returns>
        private RetornoOperacion actualizaRegistros(int id_servicio_control_evidencia, int id_servicio, int id_segmento_control_evidencia, int id_segmento,
                                                    byte id_tipo_documento, EstatusDocumento id_estatus_documento, int id_hoja_instruccion_documento, int terminal_recepcion,
                                                    DateTime fecha_recepcion, int terminal_cobro, bool bit_original,
                                                    bool bit_copia, bool bit_sello, int id_imagen, string referencia_imagen,
                                                    int id_usuario, bool habilitar)
        {   //Declarando Objeto de Retorno
            RetornoOperacion result = new RetornoOperacion();

            //Declarando Arreglo de Parametros
            object[] param = { 2,                                              this._id_control_evidencia_documento, id_servicio_control_evidencia, id_servicio, id_segmento_control_evidencia, id_segmento,       id_tipo_documento,
                               (byte)id_estatus_documento,                     id_hoja_instruccion_documento,        terminal_recepcion,
                               Fecha.ConvierteDateTimeObjeto(fecha_recepcion),
                               terminal_cobro,                                 bit_original,                         bit_copia,                     bit_sello,   id_imagen,                     referencia_imagen,
                               id_usuario,                                     habilitar,                            "",                            "" };
            //Obteniendo Resultado del SP
            result = CapaDatos.m_capaDeDatos.EjecutaProcAlmacenadoObjeto(_nom_sp, param);
            //Devolviendo Resultado
            return(result);
        }
        /// <summary>
        /// Ediitamos Control Evidencia Documento
        /// </summary>
        /// <param name="fecha_recepcion">Fecha de Recepción</param>
        /// <param name="id_usuario">Id Usuario</param>
        /// <returns></returns>
        public RetornoOperacion EditaControlEvidenciaDocumentoRecibido(DateTime fecha_recepcion, int id_terminal_recepcion, int id_terminal_cobro, EstatusDocumento estatus, int id_usuario)
        {
            //Declaramos Objeto Resultado
            RetornoOperacion result  = new RetornoOperacion();
            int id_control_evidencia = 0;

            //Creamos la transacción
            using (TransactionScope scope = Transaccion.InicializaBloqueTransaccional(System.Transactions.IsolationLevel.ReadCommitted))
            {
                //Invocando Método de Actualización
                result = this.actualizaRegistros(this._id_servicio_control_evidencia, this._id_servicio, this._id_segmento_control_evidencia, this._id_segmento, this._id_tipo_documento,
                                                 estatus, this._id_hoja_instruccion_documento, id_terminal_recepcion,
                                                 fecha_recepcion, id_terminal_cobro, this._bit_original, this._bit_copia, this._bit_sello,
                                                 this._id_imagen, this._referencia_imagen, id_usuario, this._habilitar);

                //Si se Inserto Correctamente Control Evidencia Documento
                if (result.OperacionExitosa)
                {
                    //Asignando Control Evidencia
                    id_control_evidencia = result.IdRegistro;

                    //Instanciamos SegmentoControlEvidencia
                    using (SegmentoControlEvidencia sce = new SegmentoControlEvidencia(SegmentoControlEvidencia.TipoConsulta.IdSegmentoControlEvidencia, id_segmento_control_evidencia))
                    {
                        //Actualizamos Estatus
                        result = sce.ActualizaEstatusSegmentoControlEvidenciaSegmento(id_usuario);
                    }
                }
                //Validamos Resultado
                if (result.OperacionExitosa)
                {
                    //Actualizamos Estatus
                    result = new RetornoOperacion(id_control_evidencia);

                    //Validamos Transacción
                    scope.Complete();
                }
            }
            //Declaramos Objeto resultado
            return(result);
        }