Пример #1
0
 private SF.Pedido GenerarPedido(FAR.Recepcion recepcion)
 {
     return(new SF.Pedido
     {
         idPedido = recepcion.Id,
         fechaPedido = recepcion.Fecha,
         hora = DateTime.Now,
         numLineas = recepcion.Lineas,
         importePvp = (float)recepcion.ImportePVP,
         importePuc = (float)recepcion.ImportePUC,
         idProveedor = recepcion.Proveedor?.Id.ToString() ?? "0",
         proveedor = recepcion.Proveedor?.Nombre ?? string.Empty,
         trabajador = string.Empty // no se envía trabajador
     });
 }
Пример #2
0
        public override void Process()
        {
            var repository = _farmacia.Recepciones as RecepcionRespository;
            var pedidos    = (_lastPedido == null)
                ? repository.GetAllByYearAsDTO(_anioInicio)
                : repository.GetAllByDateAsDTO(_lastPedido.fechaPedido ?? DateTime.MinValue);

            if (!pedidos.Any())
            {
                if (_anioInicio < DateTime.Now.Year)
                {
                    _anioInicio++;
                    _lastPedido = null;
                }

                return;
            }

            var pedidosAgrupados = pedidos.GroupBy(k => new { k.Fecha.Year, k.Empresa, k.Pedido })
                                   .ToDictionary(
                k => new RecepcionCompositeKey {
                Anio = k.Key.Year, Empresa = k.Key.Empresa, Pedido = k.Key.Pedido
            },
                v => v.ToList());

            var batchLineasPedidos = new List <LineaPedido>();
            var batchPedidos       = new List <SF.Pedido>();

            foreach (var pedido in pedidosAgrupados)
            {
                var fecha           = pedido.Value.First().Fecha; // a la vuelta preguntamos por > fecha
                var proveedorPedido = pedido.Value.First().Proveedor.HasValue ?
                                      _farmacia.Proveedores.GetOneOrDefaultById(pedido.Value.First().Proveedor.Value) : null;

                var numeroPedido       = pedido.Key.Pedido;
                var numeroPedidoSerial = numeroPedido.ToString().PadLeft(6, '0');
                var empresa            = pedido.Key.Empresa;
                var empresaSerial      = empresa == _empresaUno ? "00001" : "00002";
                var anio     = pedido.Key.Anio;
                var identity = long.Parse($"{anio}{numeroPedidoSerial}{empresaSerial}");

                var totales   = repository.GetTotalesByPedidoAsDTO(anio, numeroPedido, empresa);
                var recepcion = new FAR.Recepcion
                {
                    Id         = identity,
                    Pedido     = numeroPedido,
                    Fecha      = fecha,
                    Lineas     = totales.Lineas,
                    ImportePVP = totales.PVP,
                    ImportePUC = totales.PUC,
                    Proveedor  = proveedorPedido
                };

                var detalle = new List <RecepcionDetalle>();
                foreach (var item in pedido.Value)
                {
                    var farmaco = (_farmacia.Farmacos as FarmacoRespository).GetOneOrDefaultById(item.Farmaco);
                    if (farmaco != null)
                    {
                        var recepcionDetalle = new RecepcionDetalle()
                        {
                            Linea       = item.Linea,
                            RecepcionId = identity,
                            Cantidad    = item.Recibido,
                            Recepcion   = recepcion
                        };

                        var pvp = item.ImportePvp;
                        var puc = item.ImportePuc != 0 ? item.ImportePuc : farmaco.PUC;

                        var proveedor = _farmacia.Proveedores.GetOneOrDefaultByCodigoNacional(farmaco.Codigo)
                                        ?? (item.Proveedor.HasValue ? _farmacia.Proveedores.GetOneOrDefaultById(item.Proveedor.Value)
                                : null);

                        var categoria = _categoriaRepository.GetOneOrDefaultById(farmaco.Codigo);

                        FAR.Familia familia      = null;
                        FAR.Familia superFamilia = null;
                        if (string.IsNullOrWhiteSpace(farmaco.SubFamilia))
                        {
                            familia = new FAR.Familia {
                                Nombre = string.Empty
                            };
                            superFamilia = _familiaRepository.GetOneOrDefaultById(farmaco.Familia)
                                           ?? new FAR.Familia {
                                Nombre = string.Empty
                            };
                        }
                        else
                        {
                            familia = _familiaRepository.GetSubFamiliaOneOrDefault(farmaco.Familia, farmaco.SubFamilia)
                                      ?? new FAR.Familia {
                                Nombre = string.Empty
                            };
                            superFamilia = _familiaRepository.GetOneOrDefaultById(farmaco.Familia)
                                           ?? new FAR.Familia {
                                Nombre = string.Empty
                            };
                        }

                        var laboratorio = !farmaco.Laboratorio.HasValue ? new Laboratorio {
                            Codigo = string.Empty, Nombre = "<Sin Laboratorio>"
                        }
                            : _laboratorioRepository.GetOneOrDefaultByCodigo(farmaco.Laboratorio.Value, farmaco.Clase, farmaco.ClaseBot)
                        ?? new Laboratorio {
                            Codigo = string.Empty, Nombre = "<Sin Laboratorio>"
                        };

                        recepcionDetalle.Farmaco = new Farmaco
                        {
                            Id           = farmaco.Id,
                            Codigo       = item.Farmaco,
                            PrecioCoste  = puc,
                            Proveedor    = proveedor,
                            Categoria    = categoria,
                            Familia      = familia,
                            SuperFamilia = superFamilia,
                            Laboratorio  = laboratorio,
                            Denominacion = farmaco.Denominacion,
                            Precio       = pvp
                        };

                        detalle.Add(recepcionDetalle);
                        batchLineasPedidos.Add(GenerarLineaDePedido(recepcionDetalle));
                    }
                }

                if (detalle.Any())
                {
                    var pedidoCabecera = GenerarPedido(recepcion);
                    batchPedidos.Add(pedidoCabecera);

                    _lastPedido = pedidoCabecera;
                }
            }

            if (batchLineasPedidos.Any())
            {
                _sisfarma.Pedidos.Sincronizar(batchLineasPedidos);
            }
            if (batchPedidos.Any())
            {
                _sisfarma.Pedidos.Sincronizar(batchPedidos);
            }
        }
Пример #3
0
        public override void Process()
        {
            var repository  = _farmacia.Recepciones as RecepcionRespository;
            var recepciones = (_lastPedido == null)
                ? repository.GetAllByYearAsDTO(_anioInicio)
                : repository.GetAllByDateAsDTO(_lastPedido.fechaPedido ?? DateTime.MinValue);

            if (!recepciones.Any())
            {
                _anioInicio++;
                _lastPedido = null;
                return;
            }

            var groups = recepciones.GroupBy(k => new { k.Fecha.Value.Year, k.Albaran.Value })
                         .ToDictionary(
                k => new RecepcionCompositeKey {
                Anio = k.Key.Year, Albaran = k.Key.Value
            },
                v => v.ToList());

            var batchLineasPedidos = new List <LineaPedido>();
            var batchPedidos       = new List <SF.Pedido>();

            foreach (var group in groups)
            {
                Task.Delay(5).Wait();
                _cancellationToken.ThrowIfCancellationRequested();

                _anioInicio = group.Key.Anio;

                var linea           = 0;
                var fecha           = group.Value.First().Fecha; // a la vuelta preguntamos por > fecha
                var proveedorPedido = group.Value.First().Proveedor.HasValue ? _farmacia.Proveedores.GetOneOrDefaultById(group.Value.First().Proveedor.Value) : null;

                var albaran   = group.Key.Albaran > 0 ? group.Key.Albaran : 0;
                var identity  = int.Parse($"{group.Key.Anio}{albaran}");
                var recepcion = new FAR.Recepcion
                {
                    Id         = identity,
                    Fecha      = fecha.Value,
                    ImportePVP = group.Value.Sum(x => x.PVP * x.Recibido * _factorCentecimal),
                    ImportePUC = group.Value.Sum(x => x.PCTotal * _factorCentecimal),
                    Proveedor  = proveedorPedido
                };


                var detalle = new List <RecepcionDetalle>();
                foreach (var item in group.Value)
                {
                    var farmaco = (_farmacia.Farmacos as FarmacoRespository).GetOneOrDefaultById(item.Farmaco);
                    if (farmaco != null)
                    {
                        var recepcionDetalle = new RecepcionDetalle()
                        {
                            Linea              = ++linea,
                            RecepcionId        = identity,
                            Cantidad           = item.Recibido - item.Devuelto,
                            CantidadBonificada = item.Bonificado,
                            Recepcion          = recepcion
                        };

                        var pcoste = 0m;
                        if (item.PVAlbaran > 0)
                        {
                            pcoste = item.PVAlbaran * _factorCentecimal;
                        }
                        else if (item.PC > 0)
                        {
                            pcoste = item.PC * _factorCentecimal;
                        }
                        else
                        {
                            pcoste = farmaco.PrecioUnicoEntrada.HasValue && farmaco.PrecioUnicoEntrada != 0
                                ? (decimal)farmaco.PrecioUnicoEntrada.Value * _factorCentecimal
                                : ((decimal?)farmaco.PrecioMedio ?? 0m) * _factorCentecimal;
                        }

                        var proveedor = _farmacia.Proveedores.GetOneOrDefaultByCodigoNacional(farmaco.Id)
                                        ?? _farmacia.Proveedores.GetOneOrDefaultById(farmaco.Id);

                        var categoria = farmaco.CategoriaId.HasValue
                            ? _categoriaRepository.GetOneOrDefaultById(farmaco.CategoriaId.Value)
                            : null;

                        var subcategoria = farmaco.CategoriaId.HasValue && farmaco.SubcategoriaId.HasValue
                            ? _categoriaRepository.GetSubcategoriaOneOrDefaultByKey(
                            farmaco.CategoriaId.Value,
                            farmaco.SubcategoriaId.Value)
                            : null;

                        var familia     = _farmacia.Familias.GetOneOrDefaultById(farmaco.Familia);
                        var laboratorio = _laboratorioRepository.GetOneOrDefaultByCodigo(farmaco.Laboratorio);

                        var codigoBarra = _barraRepository.GetOneByFarmacoId(farmaco.Id);

                        var iva = default(decimal);
                        switch (farmaco.IVA)
                        {
                        case 1: iva = 4; break;

                        case 2: iva = 10; break;

                        case 3: iva = 21; break;

                        default: iva = 0; break;
                        }

                        recepcionDetalle.Farmaco = new Farmaco
                        {
                            Id                = farmaco.Id,
                            Codigo            = item.Farmaco.ToString(),
                            PrecioCoste       = pcoste,
                            Proveedor         = proveedor,
                            Categoria         = categoria,
                            Subcategoria      = subcategoria,
                            Familia           = familia,
                            Laboratorio       = laboratorio,
                            Denominacion      = farmaco.Denominacion,
                            Precio            = item.PVP * _factorCentecimal,
                            Stock             = farmaco.ExistenciasAux ?? 0,
                            CodigoBarras      = codigoBarra,
                            FechaUltimaCompra = farmaco.FechaUltimaEntrada.HasValue && farmaco.FechaUltimaEntrada.Value > 0 ? (DateTime?)$"{farmaco.FechaUltimaEntrada.Value}".ToDateTimeOrDefault("yyyyMMdd") : null,
                            FechaUltimaVenta  = farmaco.FechaUltimaSalida.HasValue && farmaco.FechaUltimaSalida.Value > 0 ? (DateTime?)$"{farmaco.FechaUltimaSalida.Value}".ToDateTimeOrDefault("yyyyMMdd") : null,
                            Ubicacion         = farmaco.Ubicacion ?? string.Empty,
                            Web               = farmaco.BolsaPlastico,
                            Iva               = iva,
                            StockMinimo       = farmaco.Stock ?? 0,
                            Baja              = farmaco.FechaBaja > 0,
                            FechaCaducidad    = farmaco.FechaCaducidad.HasValue && farmaco.FechaCaducidad.Value > 0 ? (DateTime?)$"{farmaco.FechaCaducidad.Value}".ToDateTimeOrDefault("yyyyMM") : null
                        };

                        detalle.Add(recepcionDetalle);
                        batchLineasPedidos.Add(GenerarLineaDePedido(recepcionDetalle));
                    }
                }

                if (detalle.Any())
                {
                    recepcion.Lineas = detalle.Count();
                    var pedido = GenerarPedido(recepcion);
                    batchPedidos.Add(pedido);

                    _lastPedido = pedido;
                }
                else
                {
                    recepcion.Lineas = 0;
                    var pedido = GenerarPedido(recepcion);

                    _lastPedido = pedido;
                }
            }

            if (batchLineasPedidos.Any())
            {
                _sisfarma.Pedidos.Sincronizar(batchLineasPedidos);
            }
            if (batchPedidos.Any())
            {
                _sisfarma.Pedidos.Sincronizar(batchPedidos);
            }
        }