public static bool guardarSubproductoPropiedadValor(SubproductoPropiedadValor subproductoPropiedadValor)
        {
            bool ret = false;

            try
            {
                using (DbConnection db = new OracleContext().getConnection())
                {
                    int existe = db.ExecuteScalar <int>("SELECT COUNT(*) FROM subproducto_propiedad_valor WHERE subproductoid=:subproductoId AND subproducto_propiedadid=:propiedadId",
                                                        new { subproductoId = subproductoPropiedadValor.subproductoid, propiedadId = subproductoPropiedadValor.subproductoPropiedadid });

                    if (existe > 0)
                    {
                        int guardado = db.Execute("UPDATE subproducto_propiedad_valor SET valor_entero=:valorEntero, valor_string=:valorString, valor_decimal=:valorDecimal, " +
                                                  "valor_tiempo=:valorTiempo, usuario_creo=:usuarioCreo, usuario_actualizo=:usuarioActualizo, fecha_creacion=:fechaCreacion, fecha_actualizacion=:fechaActualizacion, " +
                                                  "estado=:estado WHERE subproductoid=:subproductoid AND subproducto_propiedadid=:subproductoPropiedadid", subproductoPropiedadValor);

                        ret = guardado > 0 ? true : false;
                    }
                    else
                    {
                        int guardado = db.Execute("INSERT INTO subproducto_propiedad_valor VALUES (:subproductoid, :subproducto_propiedadid, :valorEntero, :valorString, " +
                                                  ":valorDecimal, :valorTiempo, :usuarioCreo, :usuarioActualizo, :fechaCreacion, :fechaActualizacion, :estado)", subproductoPropiedadValor);

                        ret = guardado > 0 ? true : false;
                    }
                }
            }
            catch (Exception e)
            {
                CLogger.write("2", "SubproductoPropiedadValorDAO.class", e);
            }
            return(ret);
        }
        public IActionResult SubproductoPropiedadPorTipo(int subproductoId, int subproductoTipoId)
        {
            try
            {
                List <SubproductoPropiedad> subproductopropiedades = SubproductoPropiedadDAO.getSubproductoPropiedadesPorTipo(subproductoTipoId);

                List <Dictionary <String, Object> > campos = new List <Dictionary <String, Object> >();
                foreach (SubproductoPropiedad subProductopropiedad in subproductopropiedades)
                {
                    Dictionary <String, Object> campo = new Dictionary <String, Object>();
                    campo.Add("id", subProductopropiedad.id);
                    campo.Add("nombre", subProductopropiedad.nombre);
                    campo.Add("tipo", subProductopropiedad.datoTipoid);
                    SubproductoPropiedadValor subproductoPropiedadValor = SubproductoPropiedadValorDAO.getValorPorSubProdcutoYPropiedad(subProductopropiedad.id, subproductoId);
                    if (subproductoPropiedadValor != null)
                    {
                        switch (subProductopropiedad.datoTipoid)
                        {
                        case 1:
                            campo.Add("valor", subproductoPropiedadValor.valorString);
                            break;

                        case 2:
                            campo.Add("valor", subproductoPropiedadValor.valorEntero);
                            break;

                        case 3:
                            campo.Add("valor", subproductoPropiedadValor.valorDecimal);
                            break;

                        case 4:
                            campo.Add("valor", subproductoPropiedadValor.valorEntero == 1 ? true : false);
                            break;

                        case 5:
                            campo.Add("valor", subproductoPropiedadValor.valorTiempo != null ? subproductoPropiedadValor.valorTiempo.Value.ToString("dd/MM/yyyy H:mm:ss") : null);
                            break;
                        }
                    }
                    else
                    {
                        campo.Add("valor", "");
                    }
                    campos.Add(campo);
                }

                List <object> estructuraCamposDinamicos = CFormaDinamica.convertirEstructura(campos);

                return(Ok(new { success = true, subproductopropiedades = estructuraCamposDinamicos }));
            }
            catch (Exception e)
            {
                CLogger.write("5", "SubproductoPropiedadController.class", e);
                return(BadRequest(500));
            }
        }
        public static bool eliminarSubproductoPropiedad(SubproductoPropiedadValor subproductoPropiedadValor)
        {
            bool ret = false;

            try
            {
                subproductoPropiedadValor.estado             = 0;
                subproductoPropiedadValor.fechaActualizacion = DateTime.Now;
                ret = guardarSubproductoPropiedadValor(subproductoPropiedadValor);
            }
            catch (Exception e)
            {
                CLogger.write("3", "SubproductoPropiedadValorDAO.class", e);
            }
            return(ret);
        }
        public static SubproductoPropiedadValor getSubproductoPropiedadValor(int propiedadId, int subproductoId)
        {
            SubproductoPropiedadValor ret = null;

            try
            {
                using (DbConnection db = new OracleContext().getConnection())
                {
                    ret = db.QueryFirstOrDefault <SubproductoPropiedadValor>("SELECT * FROM subproducto_propiedad_valor WHERE subproductoid=:subproductoId AND subproducto_propiedadid=:propiedadId",
                                                                             new { subproductoId = subproductoId, propiedadId = propiedadId });
                }
            }
            catch (Exception e)
            {
                CLogger.write("1", "SubproductoPropiedadValorDAO.class", e);
            }
            return(ret);
        }
        /*public static String getJson(Integer productoId) {
         *  String jsonEntidades = "";
         *
         *  List<SubproductoPropiedadValor> pojos = getSubproductoPropiedadValor(productoId);
         *
         *  List<EstructuraPojo> listaEstructuraPojos = new ArrayList<EstructuraPojo>();
         *
         *  for (SubproductoPropiedadValor pojo : pojos) {
         *      EstructuraPojo estructuraPojo = new EstructuraPojo();
         *
         *      estructuraPojo.productoid = pojo.getSubproducto().getId();
         *      estructuraPojo.propiedadid = pojo.getSubproductoPropiedad().getId();
         *
         *      estructuraPojo.valorEntero = pojo.getValorEntero();
         *      estructuraPojo.valorString = pojo.getValorString();
         *      estructuraPojo.valorDecimal = pojo.getValorDecimal();
         *      estructuraPojo.valorTiempo = pojo.getValorTiempo();
         *      estructuraPojo.estado = "C";
         *
         *      listaEstructuraPojos.add(estructuraPojo);
         *  }
         *
         *  jsonEntidades = Utils.getJSonString("productoTipos", listaEstructuraPojos);
         *
         *  return jsonEntidades;
         * }*/



        public static SubproductoPropiedadValor getValorPorSubProdcutoYPropiedad(int idPropiedad, int idSubProducto)
        {
            SubproductoPropiedadValor ret = null;

            try
            {
                using (DbConnection db = new OracleContext().getConnection())
                {
                    string query = String.Join(" ", "SELECT * FROM subproducto_propiedad_valor WHERE subproductoid=:subproductoid AND subproducto_propiedadid=:propiedadid");

                    ret = db.QueryFirstOrDefault <SubproductoPropiedadValor>(query, new { subproductoid = idSubProducto, propiedadid = idPropiedad });
                }
            }
            catch (Exception e)
            {
                CLogger.write("9", "SubproductoPropiedadValorDAO.class", e);
            }
            return(ret);
        }
        public IActionResult Subproducto(int id, [FromBody] dynamic value)
        {
            try
            {
                bool resultado = false;
                SubproductoValidator validator = new SubproductoValidator();
                ValidationResult     results   = validator.Validate(value);

                if (results.IsValid)
                {
                    Subproducto subproducto = SubproductoDAO.getSubproductoPorId(id);

                    subproducto.nombre      = value.nombre;
                    subproducto.descripcion = value.descripcion;
                    subproducto.productoid  = (int)value.producto;
                    /// subproducto.subproductoPadreId = (int)value.subproductoPadre; // no hay nada de subproductopadreid
                    subproducto.subproductoTipoid = (int)value.tiposubproductoid;
                    subproducto.ueunidadEjecutora = value.unidadEjecutora != null ? (int)value.unidadEjecutora : default(int);

                    subproducto.entidad             = value.entidad != null ? (int)value.entidad : default(int);
                    subproducto.ejercicio           = value.ejercicio != null ? (int)value.ejercicio : default(int);
                    subproducto.snip                = value.snip;
                    subproducto.programa            = value.programa;
                    subproducto.subprograma         = value.subprograma;
                    subproducto.proyecto            = value.proyecto;
                    subproducto.obra                = value.obra;
                    subproducto.renglon             = value.renglon;
                    subproducto.ubicacionGeografica = value.ubicacionGeografica;
                    subproducto.actividad           = value.actividad;
                    subproducto.latitud             = value.latitud;
                    subproducto.longitud            = value.longitud;
                    subproducto.costo               = value.costo;
                    subproducto.acumulacionCostoid  = value.acumulacionCostoId;
                    subproducto.fechaInicio         = value.fechaInicio;
                    subproducto.fechaFin            = Convert.ToDateTime(value.fechaFin);
                    subproducto.duracion            = value.duaracion;
                    subproducto.duracionDimension   = value.duracionDimension;
                    subproducto.inversionNueva      = value.inversionNueva;

                    Producto producto = ProductoDAO.getProductoPorId(subproducto.productoid);

                    Subproducto subproductoPadre = new Subproducto();
                    /// subproductoPadre.setId(subproductoPadreId);  // todo esta data no venia

                    SubproductoTipo subproductoTipo = new SubproductoTipo();
                    subproductoTipo.id = subproducto.subproductoTipoid;

                    if ((value.ejercicio != null) && (value.entidad != null) && (value.unidadEjecutora != null))
                    {
                        UnidadEjecutoraDAO.getUnidadEjecutora(value.ejercicio, value.entidad, value.ueunidadEjecutora);
                    }

                    /*UnidadEjecutora unidadEjecutora = (subproducto.ejercicio != null && subproducto.entidad != null && subproducto.ueunidadEjecutora != null) ? UnidadEjecutoraDAO.getUnidadEjecutora(subproducto.ejercicio, subproducto.entidad, subproducto.ueunidadEjecutora) : null;
                     */
                    resultado = SubproductoDAO.guardarSubproducto(subproducto, false);

                    if (resultado)
                    {
                        String pagosPlanificados = value.pagosPlanificados;
                        if (!subproducto.acumulacionCostoid.Equals(2) || pagosPlanificados != null && pagosPlanificados.Replace("[", "").Replace("]", "").Length > 0)
                        {
                            List <PagoPlanificado> pagosActuales = PagoPlanificadoDAO.getPagosPlanificadosPorObjeto(subproducto.id, 4);
                            foreach (PagoPlanificado pagoTemp in pagosActuales)
                            {
                                PagoPlanificadoDAO.eliminarTotalPagoPlanificado(pagoTemp);
                            }
                        }

                        if (subproducto.acumulacionCostoid.Equals(2) && pagosPlanificados != null && pagosPlanificados.Replace("[", "").Replace("]", "").Length > 0)
                        {
                            JArray pagosArreglo = JArray.Parse((string)value.pagosPlanificados);

                            for (int i = 0; i < pagosArreglo.Count; i++)
                            {
                                JObject  objeto    = (JObject)pagosArreglo[i];
                                DateTime fechaPago = objeto["fechaPago"] != null?Convert.ToDateTime(objeto["fechaPago"].ToString()) : default(DateTime);

                                decimal monto = objeto["pago"] != null?Convert.ToDecimal(objeto["pago"]) : default(decimal);

                                PagoPlanificado pagoPlanificado = new PagoPlanificado();

                                pagoPlanificado.fechaPago   = fechaPago;
                                pagoPlanificado.pago        = monto;
                                pagoPlanificado.objetoId    = subproducto.id;
                                pagoPlanificado.objetoTipo  = 4;
                                pagoPlanificado.usuarioCreo = User.Identity.Name;
                                pagoPlanificado.estado      = 1;

                                resultado = resultado && PagoPlanificadoDAO.Guardar(pagoPlanificado);
                            }
                        }

                        if (resultado)
                        {
                            JArray datos = JArray.Parse((string)value.datadinamica);

                            for (int i = 0; i < datos.Count; i++)
                            {
                                JObject data = (JObject)datos[i];

                                if (data["valor"] != null && data["valor"].ToString().Length > 0 && data["valor"].ToString().CompareTo("null") != 0)
                                {
                                    SubproductoPropiedad producotPropiedad = SubproductoPropiedadDAO.getSubproductoPropiedadPorId(Convert.ToInt32(data["id"]));

                                    SubproductoPropiedadValor valor = new SubproductoPropiedadValor();
                                    valor.subproductoid         = subproducto.id;
                                    valor.subproductos          = subproducto;
                                    valor.subproductoPropiedads = producotPropiedad;
                                    valor.usuarioCreo           = User.Identity.Name;
                                    valor.fechaCreacion         = DateTime.Now;
                                    valor.estado = 1;

                                    switch (producotPropiedad.datoTipoid)
                                    {
                                    case 1:
                                        valor.valorString = data["valor"].ToString();
                                        break;

                                    case 2:
                                        valor.valorEntero = Convert.ToInt32(data["valor"].ToString());
                                        break;

                                    case 3:
                                        valor.valorDecimal = Convert.ToDecimal(data["valor"].ToString());
                                        break;

                                    case 4:
                                        break;

                                    case 5:
                                        valor.valorTiempo = Convert.ToDateTime(data["valor_f"].ToString());
                                        break;
                                    }
                                    resultado = (resultado && SubproductoPropiedadValorDAO.guardarSubproductoPropiedadValor(valor));
                                }
                            }
                        }

                        return(Ok(new
                        {
                            success = resultado,
                            subproducto.id,
                            subproducto.usuarioCreo,
                            subproducto.fechaCreacion,
                            subproducto.usuarioActualizo,
                            subproducto.fechaActualizacion
                        }));
                    }
                    else
                    {
                        return(Ok(new { success = false }));
                    }
                }
                else
                {
                    return(Ok(new { success = false }));
                }
            }
            catch (Exception e)
            {
                CLogger.write("3", "SubproductoController.class", e);
                return(BadRequest(500));
            }
        }
        public IActionResult Subproducto([FromBody] dynamic value)
        {
            try
            {
                bool resultado = false;
                SubproductoValidator validator = new SubproductoValidator();
                ValidationResult     results   = validator.Validate(value);

                if (results.IsValid)
                {
                    Subproducto subproducto = new Subproducto();
                    subproducto.nombre      = value.nombre;
                    subproducto.descripcion = value.descripcion;
                    subproducto.productoid  = (int)value.producto;
                    ///subproducto.su.subproductoPadreId = (int)value.subproductoPadre; no tiene subproductopadre
                    subproducto.subproductoTipoid = (int)value.tiposubproductoid;
                    subproducto.ueunidadEjecutora = value.unidadEjecutora != null ? (int)value.unidadEjecutora : default(int);
                    subproducto.entidad           = value.entidad != null ? (int)value.entidad : default(int);
                    subproducto.ejercicio         = value.ejercicio != null ? (int)value.ejercicio : default(int);
                    subproducto.snip                = value.snip;
                    subproducto.programa            = value.programa;
                    subproducto.subprograma         = value.subprograma;
                    subproducto.proyecto            = value.proyecto;
                    subproducto.obra                = value.obra;
                    subproducto.renglon             = value.renglon;
                    subproducto.ubicacionGeografica = value.ubicacionGeografica;
                    subproducto.actividad           = value.actividad;
                    subproducto.latitud             = value.latitud;
                    subproducto.longitud            = value.longitud;
                    subproducto.costo               = value.costo;
                    subproducto.acumulacionCostoid  = value.acumulacionCostoId;
                    subproducto.fechaInicio         = value.fechaInicio;
                    subproducto.fechaFin            = Convert.ToDateTime(value.fechaFin);
                    subproducto.duracion            = value.duaracion;
                    subproducto.duracionDimension   = value.duracionDimension;
                    subproducto.inversionNueva      = value.inversionNueva;
                    //Se agregan estas lineas
                    subproducto.fechaCreacion = DateTime.Now;
                    subproducto.usuarioCreo   = User.Identity.Name;
                    subproducto.estado        = 1;
                    // Se agregan estas lineas
                    DateTime fechaInicioReal;
                    DateTime.TryParse((string)value.fechaInicioReal, out fechaInicioReal);
                    subproducto.fechaInicioReal = fechaInicioReal;

                    DateTime fechaFinReal;
                    DateTime.TryParse((string)value.fechaFinReal, out fechaFinReal);
                    subproducto.fechaFinReal = fechaFinReal;

                    // Se comenta Producto producto = ProductoDAO.getProductoPorId(subproducto.productoid);

                    // Se comenta Subproducto subproductoPadre = new Subproducto();
                    ///subproductoPadre.setId(subproductoPadreId);  // esta data no viene
                    // Se comenta SubproductoTipo subproductoTipo = new SubproductoTipo();
                    // Se comenta subproductoTipo.id = subproducto.subproductoTipoid;

                    // Se comenta if ((value.ejercicio != null) && (value.entidad != null) && (value.unidadEjecutora != null))
                    // Se comenta {
                    // Se comenta    UnidadEjecutoraDAO.getUnidadEjecutora(value.ejercicio, value.entidad, value.ueunidadEjecutora);
                    // Se comenta }

                    /*UnidadEjecutora unidadEjecutora = (subproducto.ejercicio != null && subproducto.entidad != null && subproducto.ueunidadEjecutora != null) ? UnidadEjecutoraDAO.getUnidadEjecutora(subproducto.ejercicio, subproducto.entidad, subproducto.ueunidadEjecutora) : null;
                     */
                    //resultado = SubproductoDAO.guardarSubproducto(subproducto, false);
                    resultado = SubproductoDAO.guardarSubproducto(subproducto, true);

                    if (resultado)
                    {
                        String pagosPlanificados = value.pagosPlanificados;
                        if (!subproducto.acumulacionCostoid.Equals(4) || pagosPlanificados != null && pagosPlanificados.Replace("[", "").Replace("]", "").Length > 0)
                        {
                            List <PagoPlanificado> pagosActuales = PagoPlanificadoDAO.getPagosPlanificadosPorObjeto(subproducto.id, 4);
                            foreach (PagoPlanificado pagoTemp in pagosActuales)
                            {
                                PagoPlanificadoDAO.eliminarTotalPagoPlanificado(pagoTemp);
                            }
                        }

                        if (subproducto.acumulacionCostoid.Equals(4) && pagosPlanificados != null && pagosPlanificados.Replace("[", "").Replace("]", "").Length > 0)
                        {
                            JArray pagosArreglo = JArray.Parse((string)value.pagosPlanificados);
                            for (int i = 0; i < pagosArreglo.Count; i++)
                            {
                                JObject  objeto    = (JObject)pagosArreglo[i];
                                DateTime fechaPago = objeto["fechaPago"] != null?Convert.ToDateTime(objeto["fechaPago"].ToString()) : default(DateTime);

                                decimal monto = objeto["pago"] != null?Convert.ToDecimal(objeto["pago"]) : default(decimal);

                                PagoPlanificado pagoPlanificado = new PagoPlanificado();
                                pagoPlanificado.fechaPago   = fechaPago;
                                pagoPlanificado.pago        = monto;
                                pagoPlanificado.objetoId    = subproducto.id;
                                pagoPlanificado.objetoTipo  = 4;
                                pagoPlanificado.usuarioCreo = User.Identity.Name;
                                // se agrega linea
                                pagoPlanificado.fechaCreacion = DateTime.Now;
                                pagoPlanificado.estado        = 1;
                                resultado = resultado && PagoPlanificadoDAO.Guardar(pagoPlanificado);
                            }
                        }
                    }

                    if (resultado)
                    {
                        // Se agrega este bloque probarlo
                        List <SubproductoPropiedad> subproductoPropiedades = SubproductoPropiedadDAO.getSubproductoPropiedadesPorTipo(subproducto.subproductoTipoid);

                        foreach (SubproductoPropiedad subProductoPropiedad in subproductoPropiedades)
                        {
                            SubcomponentePropiedadValor subProdPropVal = SubcomponentePropiedadValorDAO.getValorPorSubComponenteYPropiedad(subProductoPropiedad.id, subproducto.id);
                            if (subProdPropVal != null)
                            {
                                resultado = resultado && SubcomponentePropiedadValorDAO.eliminarTotalSubComponentePropiedadValor(subProdPropVal);
                            }
                        }
                        // Hasta aqui

                        JArray datos = JArray.Parse((string)value.datadinamica);
                        for (int i = 0; i < datos.Count; i++)
                        {
                            JObject data = (JObject)datos[i];
                            if (data["valor"] != null && data["valor"].ToString().Length > 0 && data["valor"].ToString().CompareTo("null") != 0)
                            {
                                SubproductoPropiedad      subProductoPropiedad = SubproductoPropiedadDAO.getSubproductoPropiedadPorId(Convert.ToInt32(data["id"]));
                                SubproductoPropiedadValor valor = new SubproductoPropiedadValor();
                                valor.subproductoid         = subproducto.id;
                                valor.subproductos          = subproducto;
                                valor.subproductoPropiedads = subProductoPropiedad;
                                //
                                valor.subproductoPropiedadid = subProductoPropiedad.id;
                                valor.usuarioCreo            = User.Identity.Name;
                                valor.fechaCreacion          = DateTime.Now;
                                valor.estado = 1;

                                switch (subProductoPropiedad.datoTipoid)
                                {
                                case 1:
                                    valor.valorString = data["valor"].ToString();
                                    break;

                                case 2:
                                    valor.valorEntero = Convert.ToInt32(data["valor"].ToString());
                                    break;

                                case 3:
                                    valor.valorDecimal = Convert.ToDecimal(data["valor"].ToString());
                                    break;

                                case 4:
                                    valor.valorEntero = data["valor"].ToString() == "true" ? 1 : 0;
                                    break;

                                case 5:
                                    valor.valorTiempo = Convert.ToDateTime(data["valor_f"].ToString());
                                    break;
                                }
                                resultado = (resultado && SubproductoPropiedadValorDAO.guardarSubproductoPropiedadValor(valor));
                            }
                        }
                    }

                    return(Ok(new
                    {
                        /*success = resultado,
                         * subproducto.id,
                         * subproducto.usuarioCreo,
                         * subproducto.fechaCreacion,
                         * subproducto.usuarioActualizo,
                         * subproducto.fechaActualizacion*/
                        success = resultado,
                        id = subproducto.id,
                        usuarioCreo = subproducto.usuarioCreo,
                        usuarioActualizo = subproducto.usuarioActualizo,
                        fechaCreacion = subproducto.fechaCreacion.ToString("dd/MM/yyyy H:mm:ss"),
                        fechaActualizacion = subproducto.fechaActualizacion != null ? subproducto.fechaActualizacion.Value.ToString("dd/MM/yyyy H:mm:ss") : null
                    }));
                }
                else
                {
                    return(Ok(new { success = false }));
                }
                //borrar }
                // borrar else
                // borrar {
                // borrar    return Ok(new { success = false });
                // borrar}
            }
            catch (Exception e)
            {
                CLogger.write("2", "SubproductoController.class", e);
                return(BadRequest(500));
            }
        }