public ActionResult AlbaranesComprasLinUpdate([ModelBinder(typeof(DevExpressEditorsBinder))] AlbaranesComprasLinModel item)
        {
            var model = Session[session] as List <AlbaranesComprasLinModel>;

            try
            {
                if (ModelState.IsValid)
                {
                    var configuracionAplicacion = appService.GetConfiguracion();
                    if (configuracionAplicacion.ComprasUsarCanal && configuracionAplicacion.ComprasCanalObligatorio &&
                        string.IsNullOrEmpty(item.Canal))
                    {
                        ModelState.AddModelError("Canal",
                                                 string.Format(General.ErrorCampoObligatorio, AlbaranesCompras.Canal));
                    }
                    else
                    {
                        var editItem          = model.Single(f => f.Id == item.Id);
                        var moneda            = Funciones.Qnull(Request.Params["fkmonedas"]);
                        var decimalesunidades = Funciones.Qint(Request.Params["decimalesunidades"]);
                        var decimalesmonedas  = Funciones.Qint(Request.Params["decimalesmonedas"]);
                        var serviceEmpresa    = FService.Instance.GetService(typeof(EmpresaModel), ContextService);
                        var empresa           = serviceEmpresa.get(ContextService.Empresa) as EmpresaModel;

                        var serviceMonedas = FService.Instance.GetService(typeof(MonedasModel), ContextService);
                        var monedaObj      = serviceMonedas.get(moneda) as MonedasModel;
                        editItem.Decimalesmedidas              = decimalesunidades ?? 0;
                        editItem.Decimalesmonedas              = decimalesmonedas ?? 0;
                        editItem.Ancho                         = item.Ancho;
                        editItem.Largo                         = item.Largo;
                        editItem.Grueso                        = item.Grueso;
                        editItem.Canal                         = item.Canal;
                        editItem.Cantidad                      = item.Cantidad;
                        editItem.Cantidadpedida                = item.Cantidadpedida;
                        editItem.Fkarticulos                   = item.Fkarticulos;
                        editItem.Descripcion                   = item.Descripcion;
                        editItem.Metros                        = item.Metros;
                        editItem.Cuotaiva                      = item.Cuotaiva;
                        editItem.Cuotarecargoequivalencia      = item.Cuotarecargoequivalencia;
                        editItem.Fktiposiva                    = item.Fktiposiva;
                        editItem.Porcentajeiva                 = item.Porcentajeiva;
                        editItem.Porcentajerecargoequivalencia = item.Porcentajerecargoequivalencia;
                        editItem.Fkunidades                    = item.Fkunidades;
                        editItem.Importe                       = Math.Round(item.Importe ?? 0, monedaObj.Decimales);
                        editItem.Importedescuento              = item.Importedescuento;
                        editItem.Lote                = item.Lote;
                        editItem.Precio              = Math.Round(item.Precio ?? 0, empresa.Decimalesprecios ?? 2);
                        editItem.Precioanterior      = item.Precioanterior;
                        editItem.Porcentajedescuento = item.Porcentajedescuento;
                        editItem.Tabla               = item.Tabla;
                        editItem.Revision            = item.Revision?.ToUpper();
                        editItem.Orden               = item.Orden;

                        // Validar dimensiones artículo
                        try
                        {
                            var familiasProductosService = FService.Instance.GetService(typeof(FamiliasproductosModel), ContextService) as FamiliasproductosService;
                            familiasProductosService.ValidarDimensiones(item.Fkarticulos, item.Largo, item.Ancho, item.Grueso);
                        }
                        catch (ValidationException ex)
                        {
                            Regex rgx = new Regex(@"\{.*\}");

                            if (Regex.IsMatch(ex.Message, rgx.Replace(RFamilias.ErrorLargo, ".*") + ".*"))
                            {
                                ModelState.AddModelError("SLargo", Regex.Match(ex.Message, rgx.Replace(RFamilias.ErrorLargo, ".*")).Value);
                            }
                            if (Regex.IsMatch(ex.Message, ".*" + rgx.Replace(RFamilias.ErrorAncho, ".*") + ".*"))
                            {
                                ModelState.AddModelError("SAncho", Regex.Match(ex.Message, rgx.Replace(RFamilias.ErrorAncho, ".*")).Value);
                            }
                            if (Regex.IsMatch(ex.Message, ".*" + rgx.Replace(RFamilias.ErrorGrueso, ".*") + "."))
                            {
                                ModelState.AddModelError("SGrueso", Regex.Match(ex.Message, rgx.Replace(RFamilias.ErrorGrueso, ".*")).Value);
                            }

                            return(PartialView("_Albaranescompraslin", model));
                        }

                        Session[session] = model;

                        var descuentopp        = Funciones.Qdouble(Request.Params["descuentopp"]) ?? 0;
                        var descuentocomercial = Funciones.Qdouble(Request.Params["descuentocomercial"]) ?? 0;
                        var portes             = 0;

                        var service = FService.Instance.GetService(typeof(AlbaranesComprasModel), ContextService) as AlbaranesComprasService;
                        Session[sessiontotales] = service.Recalculartotales(model, descuentopp, descuentocomercial, portes, monedaObj.Decimales);
                    }
                }
            }
            catch (ValidationException)
            {
                throw;
            }

            return(PartialView("_AlbaranesCompraslin", model));
        }
        public ActionResult AlbaranesComprasLinAddNew([ModelBinder(typeof(DevExpressEditorsBinder))] AlbaranesComprasLinModel item)
        {
            var model = Session[session] as List <AlbaranesComprasLinModel>;

            try
            {
                if (ModelState.IsValid)
                {
                    var max = model.Any() ? model.Max(f => f.Id) : 0;
                    item.Id = max + 1;

                    var moneda = Funciones.Qnull(Request.Params["fkmonedas"]);

                    var serviceMonedas   = FService.Instance.GetService(typeof(MonedasModel), ContextService);
                    var serviceArticulos = FService.Instance.GetService(typeof(ArticulosModel), ContextService);
                    var serviceEmpresa   = FService.Instance.GetService(typeof(EmpresaModel), ContextService);
                    var empresa          = serviceEmpresa.get(ContextService.Empresa) as EmpresaModel;

                    if (serviceArticulos.exists(item.Fkarticulos))
                    {
                        var configuracionAplicacion = appService.GetConfiguracion();
                        if (configuracionAplicacion.ComprasUsarCanal && configuracionAplicacion.ComprasCanalObligatorio && string.IsNullOrEmpty(item.Canal))
                        {
                            ModelState.AddModelError("Canal", string.Format(General.ErrorCampoObligatorio, AlbaranesCompras.Canal));
                        }
                        else
                        {
                            var monedaObj          = serviceMonedas.get(moneda) as MonedasModel;
                            var descuentopp        = Funciones.Qdouble(Request.Params["descuentopp"]) ?? 0;
                            var descuentocomercial = Funciones.Qdouble(Request.Params["descuentocomercial"]) ?? 0;
                            var decimalesunidades  = Funciones.Qint(Request.Params["decimalesunidades"]);
                            var portes             = 0;

                            item.Decimalesmonedas = monedaObj.Decimales;
                            item.Importe          = Math.Round(item.Importe ?? 0, monedaObj.Decimales);
                            item.Precio           = Math.Round(item.Precio ?? 0, empresa.Decimalesprecios ?? 2);
                            item.Decimalesmedidas = decimalesunidades ?? 0;
                            item.Revision         = item.Revision?.ToUpper();
                            item.EnFactura        = false;

                            // Validar dimensiones artículo
                            try
                            {
                                var familiasProductosService = FService.Instance.GetService(typeof(FamiliasproductosModel), ContextService) as FamiliasproductosService;
                                familiasProductosService.ValidarDimensiones(item.Fkarticulos, item.Largo, item.Ancho, item.Grueso);
                            }
                            catch (ValidationException ex)
                            {
                                Regex rgx = new Regex(@"\{.*\}");

                                if (Regex.IsMatch(ex.Message, rgx.Replace(RFamilias.ErrorLargo, ".*") + ".*"))
                                {
                                    ModelState.AddModelError("SLargo", Regex.Match(ex.Message, rgx.Replace(RFamilias.ErrorLargo, ".*")).Value);
                                }
                                if (Regex.IsMatch(ex.Message, ".*" + rgx.Replace(RFamilias.ErrorAncho, ".*") + ".*"))
                                {
                                    ModelState.AddModelError("SAncho", Regex.Match(ex.Message, rgx.Replace(RFamilias.ErrorAncho, ".*")).Value);
                                }
                                if (Regex.IsMatch(ex.Message, ".*" + rgx.Replace(RFamilias.ErrorGrueso, ".*") + "."))
                                {
                                    ModelState.AddModelError("SGrueso", Regex.Match(ex.Message, rgx.Replace(RFamilias.ErrorGrueso, ".*")).Value);
                                }

                                return(PartialView("_Albaranescompraslin", model));
                            }


                            model.Add(item);

                            Session[session] = model;
                            var service = FService.Instance.GetService(typeof(AlbaranesComprasModel), ContextService) as AlbaranesComprasService;
                            Session[sessiontotales] = service.Recalculartotales(model, descuentopp, descuentocomercial, portes, monedaObj.Decimales);
                        }
                    }
                    else
                    {
                        ModelState.AddModelError("Fkarticulos", Articulos.ErrorArticuloInexistente);
                    }
                }
            }
            catch (ValidationException)
            {
                model.Remove(item);
                throw;
            }



            return(PartialView("_Albaranescompraslin", model));
        }