public List <TransformacioneslotesLinModel> GenerarLineasSinStock(List <TransformacioneslotesLinModel> listado, TransformacioneslotesLinVistaModel model, ArticulosDocumentosModel articuloObj, int maxId)
        {
            var familiasService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService;
            var unidadesService = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService;

            var monedasService = FService.Instance.GetService(typeof(MonedasModel), _context, _db) as MonedasService;
            var monedasObj     = monedasService.get(model.Fkmonedas) as MonedasModel;
            var familiaObj     = familiasService.get(ArticulosService.GetCodigoFamilia(model.Fkarticulos)) as FamiliasproductosModel;

            var ancho  = model.Ancho;
            var largo  = model.Largo;
            var grueso = model.Grueso;

            if (model.Modificarmedidas)
            {
                ancho  = model.Ancho;
                largo  = model.Largo;
                grueso = model.Grueso;
            }
            else
            {
                ancho  = articuloObj.Ancho.Value;
                largo  = articuloObj.Largo.Value;
                grueso = articuloObj.Grueso.Value;
            }

            var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel;
            var metros      = UnidadesService.CalculaResultado(unidadesObj, model.Cantidad, largo, ancho, grueso, model.Metros);

            model.Metros = metros;

            listado.Add(new TransformacioneslotesLinModel()
            {
                Id               = maxId++,
                Fkarticulos      = model.Fkarticulos,
                Descripcion      = articuloObj.Descripcion,
                Cantidad         = model.Cantidad,
                Largo            = largo,
                Ancho            = ancho,
                Grueso           = grueso,
                Fkunidades       = articuloObj.Fkunidades,
                Metros           = metros,
                Decimalesmedidas = unidadesObj.Decimalestotales,
                Decimalesmonedas = monedasObj.Decimales,
                Canal            = model.Canal,
            }
                        );

            return(listado);
        }
        private ReservasstockLinVistaModel GenerarModeloLin(ReservasstockModel albaranObj, string lote)
        {
            var serviceStock     = new StockactualService(_context, _db);
            var articulosService = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService;
            var familiasService  = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService;
            var unidadesService  = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService;
            var obj = serviceStock.GetArticuloPorLoteOCodigo(lote, albaranObj.Fkalmacen, albaranObj.Empresa) as MovimientosstockModel;

            if (obj != null)
            {
                var fkarticulos  = obj.Fkarticulos;
                var articulosObj = articulosService.GetArticulo(fkarticulos, albaranObj.Fkclientes,
                                                                albaranObj.Fkmonedas.ToString(), albaranObj.Fkregimeniva, TipoFlujo.Venta);
                var familiaObj  = familiasService.get(ArticulosService.GetCodigoFamilia(fkarticulos)) as FamiliasproductosModel;
                var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel;
                var metros      = UnidadesService.CalculaResultado(unidadesObj, obj.Cantidad, obj.Largo, obj.Ancho, obj.Grueso, obj.Metros);
                obj.Metros = metros;
                return(new ReservasstockLinVistaModel()
                {
                    Modificarmedidas = false,
                    Lote = lote,
                    Decimalesmonedas = albaranObj.Decimalesmonedas,
                    Descuentocomercial = albaranObj.Porcentajedescuentocomercialcadena,
                    Descuentoprontopago = albaranObj.Porcentajedescuentoprontopagocadena,
                    Fkcuenta = albaranObj.Fkclientes,
                    Fkmonedas = albaranObj.Fkmonedas.ToString(),
                    Flujo = TipoFlujo.Venta,
                    Fkregimeniva = albaranObj.Fkregimeniva,
                    Portes = albaranObj.Costeportes.ToString(),
                    Fkalmacen = albaranObj.Fkalmacen,
                    Descuento = 0,
                    Precio = articulosObj.Precio ?? 0,
                    Fkarticulos = fkarticulos,
                    Lineas = new List <MovimientosstockModel>(new[] { obj })
                });
            }

            return(new ReservasstockLinVistaModel()
            {
                Fkmonedas = albaranObj.Fkmonedas.ToString()
            });
        }
        public List <ReservasstockLinModel> CrearNuevasLineas(List <ReservasstockLinModel> listado, ReservasstockLinVistaModel model)
        {
            var stockactualService = new StockactualService(_context, _db);
            var articulosService   = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService;
            var familiasService    = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService;
            var unidadesService    = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService;
            var tiposivaService    = FService.Instance.GetService(typeof(TiposIvaModel), _context, _db) as TiposivaService;
            var monedasService     = FService.Instance.GetService(typeof(MonedasModel), _context, _db) as MonedasService;
            var monedasObj         = monedasService.get(model.Fkmonedas) as MonedasModel;

            var maxId = listado.Any() ? listado.Max(f => f.Id) + 1 : 1;

            foreach (var linea in model.Lineas)
            {
                if (!listado.Any(f => f.Lote == linea.Lote && f.Tabla == Funciones.Qint(linea.Loteid)))
                {
                    var articuloObj = articulosService.GetArticulo(linea.Fkarticulos, model.Fkcuenta, model.Fkmonedas, model.Fkregimeniva, model.Flujo);

                    var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(linea.Fkarticulos)) as FamiliasproductosModel;

                    var ancho  = linea.Ancho;
                    var largo  = linea.Largo;
                    var grueso = linea.Grueso;
                    if (model.Modificarmedidas)
                    {
                        ancho  = model.Ancho;
                        largo  = model.Largo;
                        grueso = model.Grueso;
                    }
                    else
                    {
                        var item = familiaObj.Gestionstock
                        ? stockactualService.GetArticuloPorLoteOCodigo(
                            string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)), model.Fkalmacen,
                            Empresa) as MovimientosstockModel : null;
                        ancho  = item?.Ancho ?? linea.Ancho;
                        largo  = item?.Largo ?? linea.Largo;
                        grueso = item?.Grueso ?? linea.Grueso;
                    }

                    var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel;
                    var tiposivaObj = tiposivaService.get(articuloObj.Fktiposiva) as TiposIvaModel;
                    var metros      = UnidadesService.CalculaResultado(unidadesObj, linea.Cantidad, largo, ancho, grueso, model.Metros);
                    linea.Metros = metros;
                    var bruto            = linea.Metros * model.Precio;
                    var importedescuento = Math.Round(((bruto) * model.Descuento / 100.0), model.Decimalesmonedas);
                    var total            = bruto - importedescuento;

                    listado.Add(new ReservasstockLinModel()
                    {
                        Id                            = maxId++,
                        Fkarticulos                   = linea.Fkarticulos,
                        Descripcion                   = articuloObj.Descripcion,
                        Lote                          = linea.Lote,
                        Tabla                         = Funciones.Qint(linea.Loteid),
                        Tblnum                        = Funciones.Qint(linea.Loteid),
                        Cantidad                      = linea.Cantidad,
                        Largo                         = largo,
                        Ancho                         = ancho,
                        Grueso                        = grueso,
                        Fkunidades                    = articuloObj.Fkunidades,
                        Metros                        = metros,
                        Precio                        = model.Precio,
                        Porcentajedescuento           = model.Descuento,
                        Importedescuento              = importedescuento,
                        Importe                       = total,
                        Decimalesmedidas              = unidadesObj.Decimalestotales,
                        Decimalesmonedas              = monedasObj.Decimales,
                        Fktiposiva                    = tiposivaObj.Id,
                        Porcentajeiva                 = tiposivaObj.PorcentajeIva,
                        Porcentajerecargoequivalencia = tiposivaObj.PorcentajeRecargoEquivalencia,
                        Bundle                        = model.Tipopieza == TipoPieza.Bundle ? model.Lote.Replace(linea.Lote, string.Empty) : string.Empty,
                        Caja                          = model.Caja,
                        Canal                         = model.Canal
                    }
                                );
                }
            }

            ValidarKit(listado, model);

            return(listado);
        }
Exemplo n.º 4
0
        public List <ImputacionCostesLinModel> CrearLineasLotes(List <ImputacionCostesLinModel> listado, ImputacionCostesLinVistaModel model)
        {
            var stockactualService = new StockactualService(_context, _db);
            var articulosService   = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService;
            var familiasService    = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService;
            var unidadesService    = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService;
            var tiposivaService    = FService.Instance.GetService(typeof(TiposIvaModel), _context, _db) as TiposivaService;

            var maxId = listado.Any() ? listado.Max(f => f.Id) + 1 : 1;

            foreach (var linea in model.Lineas)
            {
                if (!listado.Any(f => f.Lote == linea.Lote && f.Tabla == Funciones.Qint(linea.Loteid)))
                {
                    var articuloObj = articulosService.GetArticulo(linea.Fkarticulos, model.Fkcuenta, model.Fkmonedas, model.Fkregimeniva, model.Flujo);

                    var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(linea.Fkarticulos)) as FamiliasproductosModel;

                    var ancho  = linea.Anchoentrada;
                    var largo  = linea.Largoentrada;
                    var grueso = linea.Gruesoentrada;
                    //if (model.Modificarmedidas)
                    //{
                    //    ancho = model.Ancho;
                    //    largo = model.Largo;
                    //    grueso = model.Grueso;
                    //}
                    //else
                    //{
                    //    var item = familiaObj.Gestionstock
                    //    ? stockactualService.GetArticuloPorLoteOCodigoHistorico(
                    //        string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)), model.Fkalmacen,
                    //        Empresa) as MovimientosstockModel : null;
                    //    ancho = item?.Ancho ?? linea.Anchoentrada;
                    //    largo = item?.Largo ?? linea.Largoentrada;
                    //    grueso = item?.Grueso ?? linea.Gruesoentrada;
                    //}

                    var metros = linea.MetrosEntrada;

                    var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel;

                    ////lotes en stock historico
                    //if(linea.Cantidad==0 && linea.Metros>0)
                    //{
                    //    linea.Metros = linea.Metros;
                    //}

                    //else
                    //{
                    //    var metros = UnidadesService.CalculaResultado(unidadesObj, linea.Cantidad, largo, ancho, grueso, linea.MetrosEntrada);
                    //    linea.Metros = metros;
                    //}

                    listado.Add(new ImputacionCostesLinModel(_context)
                    {
                        Id               = maxId++,
                        Fkarticulos      = linea.Fkarticulos,
                        Descripcion      = articuloObj.Descripcion,
                        Lote             = linea.Lote,
                        Tabla            = Funciones.Qint(linea.Loteid),
                        Cantidad         = linea.Cantidadentrada,
                        Largo            = largo,
                        Ancho            = ancho,
                        Grueso           = grueso,
                        Fkunidades       = articuloObj.Fkunidades,
                        Metros           = metros,
                        Precio           = model.Precio,
                        Decimalesmedidas = unidadesObj.Decimalestotales,
                        Decimalesmonedas = 0,
                        Canal            = model.Canal
                    }
                                );
                }
            }

            ValidarKit(listado, model);

            return(listado);
        }
        private void ModificarLotesLineas(TraspasosalmacenModel model)
        {
            var familiaService              = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db);
            var contadorlotesService        = FService.Instance.GetService(typeof(ContadoresLotesModel), _context, _db) as ContadoresLotesService;
            var vectoridentificadorlotes    = new Dictionary <string, StLote>();
            var vecetorincrementocontadores = new Dictionary <string, int>();


            foreach (var item in model.Lineas)
            {
                if (item.Nueva && string.IsNullOrEmpty(item.Loteautomaticoid))
                {
                    if (_db.Stockactual.Any(f => f.empresa == model.Empresa && f.lote == item.Lote && f.loteid == item.Tabla.ToString()))
                    {
                        throw new ValidationException(string.Format("El Lote: {0}.{1} ya existe en el Stock", item.Lote, item.Tabla));
                    }
                }
                else if (item.Nueva && !string.IsNullOrEmpty(item.Loteautomaticoid))
                {
                    var familiaObj = familiaService.get(ArticulosService.GetCodigoFamilia(item.Fkarticulos)) as FamiliasproductosModel;
                    if (familiaObj.Tipogestionlotes > Tipogestionlotes.Singestion)
                    {
                        if (!vecetorincrementocontadores.ContainsKey(familiaObj.Fkcontador))
                        {
                            vecetorincrementocontadores.Add(familiaObj.Fkcontador, 0);
                        }

                        var loteObj = contadorlotesService.get(familiaObj.Fkcontador) as ContadoresLotesModel;
                        var objlote = new StLote();
                        if (vectoridentificadorlotes.ContainsKey(item.Loteautomaticoid))
                        {
                            objlote = vectoridentificadorlotes[item.Loteautomaticoid];
                        }
                        else
                        {
                            var incremento = vecetorincrementocontadores[familiaObj.Fkcontador];
                            objlote = new StLote()
                            {
                                Lote = contadorlotesService.CreateLoteId(loteObj, ref incremento), Numero = 0
                            };
                            vecetorincrementocontadores[familiaObj.Fkcontador] = incremento;
                        }

                        if (familiaObj.Tipofamilia != TipoFamilia.Tabla)
                        {
                            objlote.Numero = 0;
                        }
                        else
                        {
                            objlote.Numero++;
                        }

                        if (vectoridentificadorlotes.ContainsKey(item.Loteautomaticoid))
                        {
                            vectoridentificadorlotes.Remove(item.Loteautomaticoid);
                        }



                        item.Lote   = objlote.Lote;
                        item.Tabla  = objlote.Numero;
                        item.Tblnum = objlote.Numero;

                        vectoridentificadorlotes.Add(item.Loteautomaticoid, objlote);
                    }
                }
            }
        }
        private void GenerarMovimientosLineasCostes(IEnumerable <TransformacioneslotesLinModel> lineas, TransformacioneslotesModel nuevo, TipoOperacionService movimiento, TrabajosModel trabajosObj, bool finalizarstock = false)
        {
            var movimientosStockService = new MovimientosstockService(_context, _db);
            var articulosService        = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService;
            var serializer      = new Serializer <TransformacioneslotesDiarioStockSerializable>();
            var vectorArticulos = new Hashtable();

            var operacion = 1;

            if (movimiento == TipoOperacionService.EliminarCostes)
            {
                operacion = -1;
            }

            foreach (var linea in lineas)
            {
                var codigoarticulonuevo = linea.Fkarticulos;

                if (!string.IsNullOrEmpty(trabajosObj.Fkacabadofinal))
                {
                    codigoarticulonuevo = string.Format("{0}{1}{2}{3}{4}", ArticulosService.GetCodigoFamilia(linea.Fkarticulos),
                                                        ArticulosService.GetCodigoMaterial(linea.Fkarticulos), ArticulosService.GetCodigoCaracteristica(linea.Fkarticulos),
                                                        ArticulosService.GetCodigoGrosor(linea.Fkarticulos), trabajosObj.Fkacabadofinal);
                    if (!articulosService.exists(codigoarticulonuevo))
                    {
                        throw new Exception(string.Format("El articulo {0} no existe", codigoarticulonuevo));
                    }
                }

                ArticulosModel articuloObj;
                if (vectorArticulos.ContainsKey(linea.Fkarticulos))
                {
                    articuloObj = vectorArticulos[linea.Fkarticulos] as ArticulosModel;
                }
                else
                {
                    articuloObj = articulosService.get(linea.Fkarticulos) as ArticulosModel;
                    vectorArticulos.Add(linea.Fkarticulos, articuloObj);
                }

                var aux = Funciones.ConverterGeneric <TransformacionesloteslinSerialized>(linea);

                if (articuloObj?.Gestionstock ?? false)
                {
                    var model = new MovimientosstockModel
                    {
                        Empresa             = nuevo.Empresa,
                        Fkalmacenes         = nuevo.Fkalmacen.ToString(),
                        Fkalmaceneszona     = Funciones.Qint(nuevo.Fkzonas),
                        Fkarticulos         = codigoarticulonuevo, //linea.Fkarticulos,
                        Referenciaproveedor = "",
                        Fkcontadorlote      = linea.Fkcontadoreslotes,
                        Lote             = linea.Lote,
                        Loteid           = (linea.Tabla ?? 0).ToString(),
                        Tag              = "",
                        Fkunidadesmedida = linea.Fkunidades,
                        //Cantidad = 0,
                        //Largo = linea.Largo ?? 0,
                        //Ancho = linea.Ancho ?? 0,
                        //Grueso = linea.Grueso ?? 0,
                        //Metros = (linea.Metros ?? 0) * operacion,
                        //Pesoneto = ((articuloObj.Kilosud ?? 0) * linea.Metros) * operacion,
                        Documentomovimiento = serializer.GetXml(
                            new TransformacioneslotesDiarioStockSerializable
                        {
                            Id              = nuevo.Id ?? 0,
                            Referencia      = nuevo.Referencia,
                            Fechadocumento  = nuevo.Fechadocumento,
                            Codigoproveedor = nuevo.Fkproveedores,
                            Linea           = aux
                        }),
                        //Fkusuarios = Usuarioid,
                        //Tipooperacion = operacion,
                        Costeadicionalmaterial = linea.Costeadicionalmaterial * operacion,
                        Costeadicionalotro     = linea.Costeadicionalotro * operacion,
                        Costeadicionalvariable = linea.Costeadicionalvariable * operacion,
                        Costeadicionalportes   = linea.Costeadicionalportes * operacion,
                        Tipodealmacenlote      = linea.Tipodealmacenlote,

                        Tipomovimiento = movimiento
                    };

                    movimientosStockService.GenerarMovimiento(model, movimiento);
                }
            }
        }
        private List <TransformacioneslotesLinModel> GenerarLineasConStock(List <TransformacioneslotesLinModel> listado, TransformacioneslotesLinVistaModel model, ArticulosDocumentosModel articuloObj, int maxId)
        {
            var stockactualService = new StockactualService(_context, _db);
            var articulosService   = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService;
            var familiasService    = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService;
            var unidadesService    = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService;

            var lotesService = new LotesService(_context);

            foreach (var linea in model.Lineas)
            {
                if (!listado.Any(f => f.Lote == linea.Lote && f.Tabla == Funciones.Qint(linea.Loteid)))
                {
                    var stockObj =
                        _db.Stockhistorico.Single(
                            f =>
                            f.fkalmacenes == _context.Fkalmacen && f.empresa == _context.Empresa &&
                            f.lote == linea.Lote && f.loteid == linea.Loteid);
                    var loteObj = lotesService.Get(stockObj.id.ToString());
                    articuloObj = articulosService.GetArticulo(linea.Fkarticulos, model.Fkcuenta, model.Fkmonedas, model.Fkregimeniva, model.Flujo);
                    var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(linea.Fkarticulos)) as FamiliasproductosModel;

                    var ancho  = linea.Ancho;
                    var largo  = linea.Largo;
                    var grueso = linea.Grueso;
                    var item   = familiaObj.Gestionstock
                        ? stockactualService.GetArticuloPorLoteOCodigo(
                        string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)), model.Fkalmacen,
                        Empresa) as MovimientosstockModel : null;
                    if (model.Modificarmedidas)
                    {
                        ancho  = model.Ancho;
                        largo  = model.Largo;
                        grueso = model.Grueso;
                    }
                    else
                    {
                        ancho  = item?.Ancho ?? linea.Ancho;
                        largo  = item?.Largo ?? linea.Largo;
                        grueso = item?.Grueso ?? linea.Grueso;
                    }
                    if (linea.Cantidad > item.Cantidad)
                    {
                        throw new ValidationException(string.Format("La cantidad indicada para el lote {0} es superior a la que hay en el stock actual", string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3))));
                    }
                    var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel;

                    var metros = UnidadesService.CalculaResultado(unidadesObj, articuloObj.Lotefraccionable ? model.Cantidad : linea.Cantidad, largo, ancho, grueso, model.Metros);
                    linea.Metros = metros;

                    listado.Add(new TransformacioneslotesLinModel()
                    {
                        Id                = maxId++,
                        Fkarticulos       = linea.Fkarticulos,
                        Descripcion       = articuloObj.Descripcion,
                        Lote              = linea.Lote,
                        Tabla             = Funciones.Qint(linea.Loteid),
                        Cantidad          = articuloObj.Lotefraccionable ? model.Cantidad : linea.Cantidad,
                        Largo             = largo,
                        Ancho             = ancho,
                        Grueso            = grueso,
                        Fkunidades        = articuloObj.Fkunidades,
                        Metros            = metros,
                        Decimalesmedidas  = unidadesObj.Decimalestotales,
                        Canal             = model.Canal,
                        Flagidentifier    = Guid.NewGuid(),
                        Precio            = loteObj.Costenetocompra,
                        Tipodealmacenlote = loteObj.Tipodealmacenlote
                    }
                                );
                }
            }

            ValidarKit(listado, model);

            return(listado);
        }
Exemplo n.º 8
0
        private void ModificarLotesLineas(DivisionLotesModel model)
        {
            var articulosService            = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService;
            var familiaService              = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db);
            var contadorlotesService        = FService.Instance.GetService(typeof(ContadoresLotesModel), _context, _db) as ContadoresLotesService;
            var vecetorincrementocontadores = new Dictionary <string, int>();

            //Obtenemos el tipo de familia de la salida
            String excepcionesGeneradas = "";
            int    loteidMax            = 0;
            var    familiaObj           = familiaService.get(ArticulosService.GetCodigoFamilia(model.LineasEntrada.First().Fkarticulos)) as FamiliasproductosModel;

            //OBTENEMOS CUAL ES EL ID MAX DE LA TABLA EN LA BASE DE DATOS
            if (familiaObj.Tipofamilia == TipoFamilia.Tabla)
            {
                //Maximo id tabla
                string        lotehistorico = model.LineasEntrada.First().Lote ?? "";
                List <String> lotesidString = _db.Stockhistorico.Where(f => f.empresa == model.Empresa && f.lote == lotehistorico).Select(f => f.loteid).ToList();
                List <int>    lotesidInt    = new List <int>();

                //Tenemos que pasar los string a Int porque no nos deja hacer converisones de datos en una consulta a la BD
                foreach (var lid in lotesidString)
                {
                    int aux;
                    if (int.TryParse(lid, out aux))
                    {
                        lotesidInt.Add(aux);
                    }
                }

                //Si ya hay una cantidad establecida, sacamos el maximo
                if (lotesidInt.Count > 0)
                {
                    loteidMax = lotesidInt.Max();
                }

                loteidMax++;
            }

            //PARA CADA UNA DE LAS ENTRADAS, LE VAMOS ASIGNANDO SU NUMERO DE TABLA CORRESPONDIENTE
            foreach (var item in model.LineasEntrada)
            {
                //Hay que generar el lote buscando el numero de la tabla mas alto en la bd
                if (!item.LoteAutomatico)
                {
                    //Si es una tabla
                    if (familiaObj.Tipofamilia == TipoFamilia.Tabla)
                    {
                        item.Lote  = model.LineasSalida.First().Lote; //Mismo lote
                        item.Tabla = loteidMax;                       //Distinto numero de tabla
                        loteidMax++;
                    }
                }

                //Bloques u otros
                if (item.LoteAutomatico)
                {
                    //Si es un bloque
                    if (familiaObj.Tipofamilia == TipoFamilia.Bloque || familiaObj.Tipofamilia == TipoFamilia.General)
                    {
                        if (!vecetorincrementocontadores.ContainsKey(familiaObj.Fkcontador))
                        {
                            vecetorincrementocontadores.Add(familiaObj.Fkcontador, 0);
                        }

                        var loteObj    = contadorlotesService.get(familiaObj.Fkcontador) as ContadoresLotesModel; //Bl
                        var incremento = vecetorincrementocontadores[familiaObj.Fkcontador];                      //190020
                        item.Lote = contadorlotesService.CreateLoteId(loteObj, ref incremento);                   //Bl-190020
                        vecetorincrementocontadores[familiaObj.Fkcontador] = incremento;
                        item.Tabla = 0;
                    }

                    if (_db.Stockhistorico.Any(f => f.empresa == model.Empresa && f.lote == item.Lote && f.loteid == item.Tabla.ToString()))
                    {
                        excepcionesGeneradas += string.Format("El Lote: {0}.{1} ya existe en el Stock", item.Lote, item.Tabla);
                    }
                }

                /*
                 * //automatico
                 * else
                 * {
                 *  if (familiaObj.Tipofamilia == TipoFamilia.Tabla)
                 *  {
                 *      excepcionesGeneradas += " El tipo Tabla no puede generar lote automático";
                 *  }
                 *
                 *  else
                 *  {
                 *      if (familiaObj.Tipogestionlotes > Tipogestionlotes.Singestion)
                 *      {
                 *          if (!vecetorincrementocontadores.ContainsKey(familiaObj.Fkcontador))
                 *              vecetorincrementocontadores.Add(familiaObj.Fkcontador, 0);
                 *
                 *          var loteObj = contadorlotesService.get(familiaObj.Fkcontador) as ContadoresLotesModel;
                 *
                 *          var incremento = vecetorincrementocontadores[familiaObj.Fkcontador];
                 *          item.Lote = contadorlotesService.CreateLoteId(loteObj, ref incremento);
                 *          item.Tabla = 0;
                 *
                 *          vecetorincrementocontadores[familiaObj.Fkcontador] = incremento;
                 *      }
                 *  }
                 * }
                 */
            }

            if (!String.IsNullOrEmpty(excepcionesGeneradas))
            {
                throw new ValidationException(excepcionesGeneradas);
            }
        }
        private void GenerarMovimientosLineas(IEnumerable <TransformacioneslotesLinModel> lineas, TransformacioneslotesModel nuevo, TipoOperacionService movimiento, TrabajosModel trabajosObj, MaterialesModel materialesObj, bool finalizarstock = false)
        {
            var movimientosStockService = new MovimientosstockService(_context, _db);
            var articulosService        = FService.Instance.GetService(typeof(ArticulosModel), _context, _db);
            var serializer      = new Serializer <TransformacioneslotesDiarioStockSerializable>();
            var vectorArticulos = new Hashtable();

            var operacion = 1;

            if (movimiento == TipoOperacionService.InsertarTransformacionloteStock)
            {
                operacion = -1;
            }

            //Rai
            // Ordenamos lineas por articulo y cantidad para procesar primero las positivas evitando error stock negativo no autorizado
            // (ya que se procesan las lineas antes existentes con cantidad negativa para quitarlas
            //   y luego se añade las lineas de grid cantidad +)
            var mylineas = lineas.OrderBy(x => x.Fkarticulos).ThenByDescending(x => x.Cantidad).ToList();

            foreach (var linea in mylineas)
            {
                //Rai -- sustituye el codigo del acabado y el codigo del material en caso de que sea necesario
                var codigoarticulonuevo = linea.Fkarticulos;
                var acabado             = !string.IsNullOrEmpty(trabajosObj.Fkacabadofinal) ? trabajosObj.Fkacabadofinal : ArticulosService.GetCodigoAcabado(linea.Fkarticulos);
                var material            = !string.IsNullOrEmpty(materialesObj.Id) ? materialesObj.Id : ArticulosService.GetCodigoMaterial(linea.Fkarticulos);

                codigoarticulonuevo = string.Format("{0}{1}{2}{3}{4}", ArticulosService.GetCodigoFamilia(linea.Fkarticulos),
                                                    material, ArticulosService.GetCodigoCaracteristica(linea.Fkarticulos),
                                                    ArticulosService.GetCodigoGrosor(linea.Fkarticulos), acabado);

                if (!articulosService.exists(codigoarticulonuevo))
                {
                    throw new Exception(string.Format("El articulo {0} no existe", codigoarticulonuevo));
                }

                ArticulosModel articuloObj;
                if (vectorArticulos.ContainsKey(linea.Fkarticulos))
                {
                    articuloObj = vectorArticulos[linea.Fkarticulos] as ArticulosModel;
                }
                else
                {
                    articuloObj = articulosService.get(linea.Fkarticulos) as ArticulosModel;
                    vectorArticulos.Add(linea.Fkarticulos, articuloObj);
                }

                var aux = Funciones.ConverterGeneric <TransformacionesloteslinSerialized>(linea);

                if (articuloObj?.Gestionstock ?? false)
                {
                    var model = new MovimientosstockModel
                    {
                        Empresa             = nuevo.Empresa,
                        Fkalmacenes         = nuevo.Fkalmacen,
                        Fkalmaceneszona     = Funciones.Qint(nuevo.Fkzonas),
                        Fkarticulos         = codigoarticulonuevo, //linea.Fkarticulos
                        Referenciaproveedor = "",
                        Fkcontadorlote      = linea.Fkcontadoreslotes,
                        Lote                = linea.Lote,
                        Loteid              = (linea.Tabla ?? 0).ToString(),
                        Tag                 = "",
                        Fkunidadesmedida    = linea.Fkunidades,
                        Largo               = linea.Largo ?? 0,
                        Ancho               = linea.Ancho ?? 0,
                        Grueso              = linea.Grueso ?? 0,
                        Documentomovimiento = serializer.GetXml(
                            new TransformacioneslotesDiarioStockSerializable
                        {
                            Id               = nuevo.Id.Value,
                            Referencia       = nuevo.Referencia,
                            Fechadocumento   = nuevo.Fechadocumento,
                            Codigoproveedor  = nuevo.Fkproveedores,
                            Fkarticulosnuevo = codigoarticulonuevo,
                            Linea            = aux
                        }),
                        Fkusuarios = Usuarioid,
                        //Tipooperacion = operacion,

                        Cantidad = (linea.Cantidad ?? 0) * operacion,
                        Metros   = (linea.Metros ?? 0) * operacion,
                        Costeadicionalmaterial = linea.Costeadicionalmaterial,
                        Costeadicionalotro     = linea.Costeadicionalotro,
                        Costeadicionalvariable = linea.Costeadicionalvariable,
                        Costeadicionalportes   = linea.Costeadicionalportes,

                        Tipomovimiento = movimiento
                    };

                    var tipooperacion = finalizarstock
                        ? TipoOperacionService.FinalizarTransformacionloteStock
                        : linea.Nueva
                            ? TipoOperacionService.InsertarTransformacionloteStock
                            : TipoOperacionService.ActualizarTransformacionloteStock;
                    var currentValidationService = _validationService as TransformacioneslotesValidation;


                    if (currentValidationService.ModificarCostes)
                    {
                        tipooperacion = TipoOperacionService.ActualizarcosteTransformacionloteStock;
                    }


                    if (tipooperacion == TipoOperacionService.InsertarTransformacionloteStock)
                    {
                        model.Cantidad = -model.Cantidad;
                    }
                    movimientosStockService.GenerarMovimiento(model, tipooperacion);
                }
            }
        }
Exemplo n.º 10
0
        public List <DivisionLotesentradaLinModel> CrearUnaNuevaLineaEntrada(DivisionLotessalidaLinModel first, List <DivisionLotesentradaLinModel> listadoEntrada, double?cantidad)
        {
            //CODE
            DivisionLotesentradaLinModel d1 = new DivisionLotesentradaLinModel();

            d1.Cantidad = 1;

            if (listadoEntrada?.Count == 0)
            {
                d1.Id = 1;
            }

            else
            {
                d1.Id = (listadoEntrada?.Max(l => l.Id) ?? 0) + 1;
            }

            //Obtenemos la familoa a la que pertenece ese articulo
            var familiaService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db);
            var familiaObj     = familiaService.get(ArticulosService.GetCodigoFamilia(first.Fkarticulos)) as FamiliasproductosModel;

            //Si es una tabla, son metros cuadrados y el lote es el mismo pero la tabla es el maximo de la BD + 1
            if (familiaObj.Tipofamilia == TipoFamilia.Tabla)
            {
                d1.Cantidad = cantidad;

                d1.Largo  = first.Largo / 2;
                d1.Ancho  = first.Ancho;
                d1.Grueso = first.Grueso;
                d1.Metros = d1.Ancho * d1.Largo * d1.Cantidad;

                d1.Lote           = first.Lote;
                d1.LoteAutomatico = false;

                d1.Decimalesmonedas = first.Decimalesmonedas;
                d1.Decimalesmedidas = first.Decimalesmedidas;
            }

            //Si es un bloque, metros 3 y el lote es automatico
            else if (familiaObj.Tipofamilia == TipoFamilia.Bloque)
            {
                d1.Cantidad = cantidad;

                d1.Largo  = first.Largo / 2;
                d1.Ancho  = first.Ancho;
                d1.Grueso = first.Grueso;
                d1.Metros = d1.Ancho * d1.Largo * d1.Grueso * d1.Cantidad;

                d1.Tabla          = 0;
                d1.Lote           = "Lote " + ((listadoEntrada?.Count() ?? 0) + 1).ToString();
                d1.LoteAutomatico = true;

                d1.Decimalesmonedas = first.Decimalesmonedas;
                d1.Decimalesmedidas = first.Decimalesmedidas;
            }

            //Si son losas
            else
            {
                d1.Cantidad = cantidad;

                d1.Largo  = first.Largo;
                d1.Ancho  = first.Ancho;
                d1.Grueso = first.Grueso;

                d1.Metros         = d1.Largo * d1.Ancho * d1.Cantidad;
                d1.Tabla          = 0;
                d1.Lote           = "Lote " + ((listadoEntrada?.Count() ?? 0) + 1).ToString();
                d1.LoteAutomatico = true;

                d1.Decimalesmonedas = first.Decimalesmonedas;
                d1.Decimalesmedidas = first.Decimalesmedidas;
            }

            d1.Fkarticulos       = first.Fkarticulos;
            d1.Descripcion       = first.Descripcion;
            d1.Tipodealmacenlote = first.Tipodealmacenlote;
            d1.Fkunidades        = first.Fkunidades;
            d1.Canal             = first.Canal;

            listadoEntrada.Add(d1);

            return(listadoEntrada);
        }
Exemplo n.º 11
0
        private List <AlbaranesLinModel> GenerarLineasConStock(List <AlbaranesLinModel> listado, AlbaranesLinVistaModel model, ArticulosDocumentosModel articuloObj, int maxId)
        {
            var stockactualService = new StockactualService(_context, _db);
            var articulosService   = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService;
            var familiasService    = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService;
            var unidadesService    = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService;
            var tiposivaService    = FService.Instance.GetService(typeof(TiposIvaModel), _context, _db) as TiposivaService;
            var monedasService     = FService.Instance.GetService(typeof(MonedasModel), _context, _db) as MonedasService;
            var monedasObj         = monedasService.get(model.Fkmonedas) as MonedasModel;

            foreach (var linea in model.Lineas)
            {
                if (!listado.Any(f => f.Lote == linea.Lote && f.Tabla == Funciones.Qint(linea.Loteid)))
                {
                    articuloObj = articulosService.GetArticulo(linea.Fkarticulos, model.Fkcuenta, model.Fkmonedas, model.Fkregimeniva, model.Flujo);
                    var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(linea.Fkarticulos)) as FamiliasproductosModel;

                    var ancho  = linea.Ancho;
                    var largo  = linea.Largo;
                    var grueso = linea.Grueso;
                    var item   = familiaObj.Gestionstock
                        ? stockactualService.GetArticuloPorLoteOCodigo(
                        string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)), model.Fkalmacen,
                        Empresa) as MovimientosstockModel : null;
                    if (model.Modificarmedidas)
                    {
                        ancho  = model.Ancho;
                        largo  = model.Largo;
                        grueso = model.Grueso;
                    }
                    else
                    {
                        ancho  = item?.Ancho ?? linea.Ancho;
                        largo  = item?.Largo ?? linea.Largo;
                        grueso = item?.Grueso ?? linea.Grueso;
                    }
                    if (linea.Cantidad > item.Cantidad)
                    {
                        throw new ValidationException(string.Format("La cantidad indicada para el lote {0} es superior a la que hay en el stock actual", string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3))));
                    }
                    var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel;
                    var tiposivaObj = tiposivaService.get(articuloObj.Fktiposiva) as TiposIvaModel;
                    var metros      = UnidadesService.CalculaResultado(unidadesObj, articuloObj.Lotefraccionable ? model.Cantidad :linea.Cantidad, largo, ancho, grueso, model.Metros);
                    linea.Metros = metros;
                    var bruto            = linea.Metros * model.Precio;
                    var importedescuento = Math.Round(((bruto) * model.Descuento / 100.0), model.Decimalesmonedas);
                    var total            = bruto - importedescuento;

                    listado.Add(new AlbaranesLinModel()
                    {
                        Nueva                         = true,
                        Id                            = maxId++,
                        Fkarticulos                   = linea.Fkarticulos,
                        Descripcion                   = articuloObj.Descripcion,
                        Lote                          = linea.Lote,
                        Tabla                         = Funciones.Qint(linea.Loteid),
                        Tblnum                        = Funciones.Qint(linea.Loteid),
                        Cantidad                      = articuloObj.Lotefraccionable ? model.Cantidad : linea.Cantidad,
                        Largo                         = largo,
                        Ancho                         = ancho,
                        Grueso                        = grueso,
                        Fkunidades                    = articuloObj.Fkunidades,
                        Metros                        = metros,
                        Precio                        = model.Precio,
                        Porcentajedescuento           = model.Descuento,
                        Importedescuento              = importedescuento,
                        Importe                       = total,
                        Decimalesmedidas              = unidadesObj.Decimalestotales,
                        Decimalesmonedas              = monedasObj.Decimales,
                        Fktiposiva                    = tiposivaObj.Id,
                        Porcentajeiva                 = tiposivaObj.PorcentajeIva,
                        Porcentajerecargoequivalencia = tiposivaObj.PorcentajeRecargoEquivalencia,
                        Bundle                        = model.Tipopieza == TipoPieza.Bundle ? model.Lote.Replace(linea.Lote, string.Empty) : string.Empty,
                        Caja                          = model.Caja,
                        Canal                         = model.Canal,
                        Flagidentifier                = Guid.NewGuid()
                    }
                                );
                }
            }

            ValidarKit(listado, model);

            return(listado);
        }
Exemplo n.º 12
0
        public List <AlbaranesLinModel> GenerarLineasSinStock(List <AlbaranesLinModel> listado, AlbaranesLinVistaModel model, ArticulosDocumentosModel articuloObj, int maxId)
        {
            var familiasService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService;
            var unidadesService = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService;
            var tiposivaService = FService.Instance.GetService(typeof(TiposIvaModel), _context, _db) as TiposivaService;
            var monedasService  = FService.Instance.GetService(typeof(MonedasModel), _context, _db) as MonedasService;
            var monedasObj      = monedasService.get(model.Fkmonedas) as MonedasModel;
            var familiaObj      = familiasService.get(ArticulosService.GetCodigoFamilia(model.Fkarticulos)) as FamiliasproductosModel;

            var ancho  = model.Ancho;
            var largo  = model.Largo;
            var grueso = model.Grueso;

            if (model.Modificarmedidas)
            {
                ancho  = model.Ancho;
                largo  = model.Largo;
                grueso = model.Grueso;
            }
            else
            {
                ancho  = articuloObj.Ancho.Value;
                largo  = articuloObj.Largo.Value;
                grueso = articuloObj.Grueso.Value;
            }

            var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel;
            var tiposivaObj = tiposivaService.get(articuloObj.Fktiposiva) as TiposIvaModel;
            var metros      = UnidadesService.CalculaResultado(unidadesObj, model.Cantidad, largo, ancho, grueso, model.Metros);

            model.Metros = metros;
            var bruto            = model.Metros * model.Precio;
            var importedescuento = Math.Round(((bruto) * model.Descuento / 100.0), model.Decimalesmonedas);
            var total            = bruto - importedescuento;

            listado.Add(new AlbaranesLinModel()
            {
                Nueva                         = true,
                Id                            = maxId++,
                Fkarticulos                   = model.Fkarticulos,
                Descripcion                   = articuloObj.Descripcion,
                Cantidad                      = model.Cantidad,
                Largo                         = largo,
                Ancho                         = ancho,
                Grueso                        = grueso,
                Fkunidades                    = articuloObj.Fkunidades,
                Metros                        = metros,
                Precio                        = model.Precio,
                Porcentajedescuento           = model.Descuento,
                Importedescuento              = importedescuento,
                Importe                       = total,
                Decimalesmedidas              = unidadesObj.Decimalestotales,
                Decimalesmonedas              = monedasObj.Decimales,
                Fktiposiva                    = tiposivaObj.Id,
                Porcentajeiva                 = tiposivaObj.PorcentajeIva,
                Porcentajerecargoequivalencia = tiposivaObj.PorcentajeRecargoEquivalencia,
                Canal                         = model.Canal
            }
                        );



            return(listado);
        }
        public void ValidarDimensiones(string articulo, double?largo, double?ancho, double?grueso)
        {
            var familiacodigo = ArticulosService.GetCodigoFamilia(articulo);

            ValidarDimensiones(familiacodigo, largo, ancho, grueso, articulo);
        }
        public static void GestionarLote(ArticulosModel articulo, FamiliasproductosModel familia, IEnumerable <IDocumentosLinModel> lineas, IDocumentoLinVistaModel linea, out string lote, out string loteautomaticoid, out int lotenuevocontador,
                                         out int?tabla)
        {
            lote              = "";
            loteautomaticoid  = "";
            lotenuevocontador = 0;
            tabla             = null;

            if (articulo.Tipogestionlotes == Tipogestionlotes.Loteobligatorio || (articulo.Tipogestionlotes == Tipogestionlotes.Loteopcional && (linea.Loteautomatico || !string.IsNullOrEmpty(linea.Lote))))
            {
                var contadorLotes = 1;
                //Si Lote automatico
                if (linea.Loteautomatico && string.IsNullOrEmpty(linea.Lote))//Lote automatico y es un nuevo lote
                {
                    contadorLotes = lineas.Any(f => f.Lotenuevocontador > 0) ? lineas.Max(f => f.Lotenuevocontador) : 0;
                    contadorLotes++;
                }
                else if (linea.Loteautomatico && !string.IsNullOrEmpty(linea.Lote))//Si el lote es automatico y ya existe
                {
                    contadorLotes = lineas.First(f => (f.Loteautomaticoid?.ToLower() ?? string.Empty) == linea.Lote.ToLower()).Lotenuevocontador;
                }
                else if (!linea.Loteautomatico && !string.IsNullOrEmpty(linea.Lote))                                                      //Si el lote es manual
                {
                    contadorLotes = lineas.Any(f => f.Lote.ToLower() == linea.Lote.ToLower()) ? lineas.Max(f => f.Lotenuevocontador) : 0; //comprbamos que si el lote manual existe y asignamos el siguiente contador, sino usamos el  0 por defecto
                    contadorLotes++;
                }
                else
                {
                    throw new ValidationException(RAlbaranes.ErrorGestionLotes);
                }

                lote             = linea.Loteautomatico ? RAlbaranes.Lote + (contadorLotes) : linea.Lote;
                loteautomaticoid = linea.Loteautomatico && string.IsNullOrEmpty(linea.Lote) ? Guid.NewGuid().ToString() : linea.Lote;

                var loteactual = linea.Loteautomatico ? loteautomaticoid : lote;

                //no se pueden duplicar lotes para elementos tipos tablas
                if (linea.Tipofamilia != TipoFamilia.Tabla && lineas.Any(f => f.Lote == loteactual || f.Loteautomaticoid == loteactual))
                {
                    throw new ValidationException(RAlbaranes.ErrorLoteRepetido);
                }

                if (!linea.Loteautomatico && lineas.Any(f => f.Lote == loteactual))
                {
                    //comprobar las condiciones
                    var oldlinea    = lineas.First(f => f.Lote == loteactual);
                    var oldfamilia  = ArticulosService.GetCodigoFamilia(oldlinea.Fkarticulos);
                    var oldmaterial = ArticulosService.GetCodigoMaterial(oldlinea.Fkarticulos);
                    var newfamilia  = ArticulosService.GetCodigoFamilia(linea.Fkarticulos);
                    var newmaterial = ArticulosService.GetCodigoMaterial(linea.Fkarticulos);
                    if (oldfamilia != newfamilia || oldmaterial != newmaterial)
                    {
                        throw new ValidationException(string.Format("No se puede agregar el artículo al lote {0} porque las propiedades del lote no coinciden con las del artículo nuevo", loteactual));
                    }
                }

                loteautomaticoid  = linea.Loteautomatico ? loteautomaticoid : string.Empty;
                lotenuevocontador = contadorLotes;
                if (familia.Tipofamilia == TipoFamilia.Tabla)
                {
                    tabla = linea.Loteautomatico
                        ? null
                        : (int?)
                            (lineas.Any() ? (lineas.Where(f => f.Lote == linea.Lote).Max(j => j.Tabla) + 1 ?? 1) : 1);
                }
                else if (!string.IsNullOrEmpty(lote))
                {
                    tabla = linea.Loteautomatico ? null : (int?)0;
                }
            }
        }