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 void ActualizarStock(TransformacioneslotesModel original, TransformacioneslotesModel nuevo, TrabajosModel trabajosObj, MaterialesModel materialesObj)
        {
            var list = new List <TransformacioneslotesLinModel>();
            var lineasModificadas = nuevo.Lineas.Where(f => !original.Lineas.Any(j => j.Flagidentifier == f.Flagidentifier)).ToList();


            var lineasEliminadas = original.Lineas.Where(f => !nuevo.Lineas.Where(j => !lineasModificadas.Any(h => h.Flagidentifier == j.Flagidentifier)).Any(j => j.Flagidentifier == f.Flagidentifier)).ToList();

            foreach (var item in lineasEliminadas)
            {
                item.Cantidad *= -1;
            }

            list = lineasEliminadas.Union(lineasModificadas).ToList();
            GenerarMovimientosLineas(list, nuevo, TipoOperacionService.ActualizarTransformacionloteStock, trabajosObj, materialesObj);
        }
        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);
                }
            }
        }
 private void FinalizarStock(TransformacioneslotesModel original, TransformacioneslotesModel nuevo, TrabajosModel trabajosObj, MaterialesModel materialesObj)
 {
     GenerarMovimientosLineas(nuevo.Lineas, nuevo, TipoOperacionService.FinalizarTransformacionloteStock, trabajosObj, materialesObj, true);
 }