//guardar carga masiva
        public string saveFile(CargaMasivaCreateDto model)
        {
            var rpta = "";

            try
            {
                using (var ctx = new PresupuestoContext())
                {
                    using (DbContextTransaction transaction = ctx.Database.BeginTransaction())
                    {
                        try
                        {
                            foreach (var d in model.detalle)
                            {
                                var detalle = new SPDetallePresupuesto
                                {
                                    Id               = model.Id,
                                    presupuestoId    = model.presupuestoId,
                                    referencia       = d.referencia,
                                    cantidad         = d.cantidad,
                                    total_referencia = d.total_referencia,
                                    fincaId          = d.fincaId,
                                    subloteId        = d.subloteId,
                                    unidad_by_p_cs   = d.unidad_by_p_cs,
                                    costo_by_p_cs    = d.costo_by_p_cs
                                };


                                ctx.Configuration.AutoDetectChangesEnabled = false;
                                ctx.SPDetallePresupuesto.Add(detalle);
                                ctx.SaveChanges();

                                var detalleId = detalle.Id;

                                if (model.codigoTipo == "P_MO")
                                {
                                    //obtener dimensiones por actividad
                                    SPDimension _dimension  = new SPDimension();
                                    var         dimensiones = _dimension.GetDimensionesbyActividad(detalle.referencia);
                                    if (dimensiones.Count > 0)
                                    {
                                        //eliminamos los existentes para sustituirlos
                                        var costosdim = ctx.SPCostoByDimension.Where(x => x.detalle_presupuesdoId == detalleId).ToList();
                                        ctx.SPCostoByDimension.RemoveRange(costosdim);
                                        ctx.SaveChanges();

                                        foreach (var ca in dimensiones)
                                        {
                                            var costo_actividad = new SPCostoByDimension
                                            {
                                                dimensionId           = ca.dimensionId,
                                                detalle_presupuesdoId = detalleId,
                                                costo = Convert.ToDouble(detalle.total_referencia) * (ca.factor / 100)
                                            };

                                            //costo_actividad.costo = Math.Round(Convert.ToDecimal(costo_actividad.costo), 2);
                                            ctx.Configuration.AutoDetectChangesEnabled = false;
                                            ctx.SPCostoByDimension.Add(costo_actividad);
                                            ctx.SaveChanges();
                                        }
                                    }
                                }
                            }

                            transaction.Commit();
                            rpta = "Carga de datos realizada correctamente";
                        }
                        catch (Exception e)
                        {
                            transaction.Rollback();
                            throw e;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            return(rpta);
        }
        //guardar o actualizar lotes
        public string Save(CreateDetalleManoObraDto model)
        {
            var rpta = "";

            try
            {
                using (var ctx = new PresupuestoContext())
                {
                    using (DbContextTransaction transaction = ctx.Database.BeginTransaction())
                    {
                        try
                        {
                            if (model.referencia == null)
                            {
                                model.referencia = model.referencia_producto;
                            }

                            var d_manoObra = new SPDetallePresupuesto
                            {
                                Id               = model.Id,
                                presupuestoId    = model.presupuestoId,
                                fincaId          = model.fincaId,
                                subloteId        = model.loteId,
                                referencia       = model.referencia,
                                total_referencia = model.total_referencia,
                                cantidad         = model.cantidad,
                                unidad_by_p_cs   = model.unidad_by_p_cs,
                                costo_by_p_cs    = model.costo_by_p_cs,
                                estado           = "I"
                            };

                            if (d_manoObra.Id > 0)
                            {
                                ctx.Entry(d_manoObra).State = EntityState.Modified;
                            }
                            else
                            {
                                ctx.Entry(d_manoObra).State = EntityState.Added;
                            }
                            ctx.SaveChanges();

                            ctx.Database.ExecuteSqlCommand("UPDATE SPDetallePresupuesto SET estado = 'I' WHERE presupuestoId IN (@p0) and fincaId IN (@p1)", d_manoObra.presupuestoId, d_manoObra.fincaId);

                            var detalleId = d_manoObra.Id;

                            //obtener dimensiones por actividad
                            SPDimension _dimension  = new SPDimension();
                            var         dimensiones = _dimension.GetDimensionesbyActividad(d_manoObra.referencia);
                            if (dimensiones.Count > 0)
                            {
                                //eliminamos los existentes para sustituirlos
                                var costosdim = ctx.SPCostoByDimension.Where(x => x.detalle_presupuesdoId == detalleId).ToList();
                                ctx.SPCostoByDimension.RemoveRange(costosdim);
                                ctx.SaveChanges();

                                foreach (var ca in dimensiones)
                                {
                                    var costo_actividad = new SPCostoByDimension
                                    {
                                        dimensionId           = ca.dimensionId,
                                        detalle_presupuesdoId = detalleId,
                                        costo = Convert.ToDouble(d_manoObra.total_referencia) * (ca.factor / 100)
                                    };

                                    //costo_actividad.costo = Math.Round(Convert.ToDecimal(costo_actividad.costo), 2);

                                    ctx.SPCostoByDimension.Add(costo_actividad);
                                    ctx.SaveChanges();
                                }
                            }

                            transaction.Commit();
                            rpta = "accion se agrego presupuesto correctamente";
                        }
                        catch (Exception e)
                        {
                            transaction.Rollback();
                            throw e;
                        }
                    }
                }
            }
            catch
            {
            }
            return(rpta);
        }