public DTO.Farmaco GetOneOrDefaultById(string id)
        {
            var conn = FarmaciaContext.GetConnection();

            try
            {
                conn.Open();
                var sql = $@"SELECT
                    EAN_13, PRECIO_LAB_EUROS,
                    FAMSB_CODIGO, FAM_CODIGO,
                    LAB_CODIGO, CLASE, CLASE_BOT,
                    DESCRIPCION, PVP_EUROS
                    FROM appul.ab_articulos where codigo = '{id}'";

                var cmd = conn.CreateCommand();
                cmd.CommandText = sql;
                var reader = cmd.ExecuteReader();

                if (!reader.Read())
                {
                    reader.Close();
                    reader.Dispose();
                    return(null);
                }

                var ean13          = Convert.ToString(reader["EAN_13"]);
                var precioLabEuros = !Convert.IsDBNull(reader["PRECIO_LAB_EUROS"]) ? Convert.ToDecimal(reader["PRECIO_LAB_EUROS"]) : 0;
                var pvpEuros       = !Convert.IsDBNull(reader["PVP_EUROS"]) ? Convert.ToDecimal(reader["PVP_EUROS"]) : 0;
                var fambsCodigo    = Convert.ToString(reader["FAMSB_CODIGO"]);
                var famCodigo      = Convert.ToInt32(reader["FAM_CODIGO"]);
                var labCodigo      = !Convert.IsDBNull(reader["LAB_CODIGO"]) ? (long?)Convert.ToInt64(reader["LAB_CODIGO"]) : null;
                var clase          = Convert.ToString(reader["CLASE"]);
                var claseBot       = Convert.ToString(reader["CLASE_BOT"]);
                var descripcion    = Convert.ToString(reader["DESCRIPCION"]);

                var farmaco = new DTO.Farmaco
                {
                    Codigo       = id,
                    CodigoBarras = !string.IsNullOrWhiteSpace(ean13) ? ean13
                        : "847000" + id.ToString().PadLeft(6, '0'),
                    Familia      = famCodigo,
                    SubFamilia   = fambsCodigo,
                    Laboratorio  = labCodigo,
                    Clase        = clase,
                    ClaseBot     = claseBot,
                    Denominacion = descripcion
                };

                reader.Close();

                // cargar precios
                sql = $@"SELECT
                        NVL(MAX(ubicacion),'') AS UBICACION,
                        NVL(MAX(pmc_es),0) AS PCMEDIO,
                        NVL(MAX(puc_es),0) AS PUC
                        FROM appul.ac_existencias WHERE art_codigo = '{id}'";

                cmd.CommandText = sql;
                reader          = cmd.ExecuteReader();

                var puc       = 0m;
                var pcm       = 0m;
                var ubicacion = string.Empty;
                if (reader.Read())
                {
                    puc       = Convert.ToDecimal(reader["PUC"]);
                    pcm       = Convert.ToDecimal(reader["PCMEDIO"]);
                    ubicacion = Convert.ToString(reader["UBICACION"]);
                }

                farmaco.PUC = puc != 0 ? puc
                    : pcm != 0 ? pcm
                    : precioLabEuros;

                farmaco.Ubicacion   = ubicacion;
                farmaco.PrecioMedio = pvpEuros;

                reader.Close();
                reader.Dispose();

                return(farmaco);
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                conn.Close();
                conn.Dispose();
            }
        }
        public Farmaco GenerarFarmaco(DTO.Farmaco farmaco)
        {
            var proveedor = _proveedorRepository.GetOneOrDefaultByCodigoNacional(farmaco.Codigo);
            var categoria = _categoriaRepository.GetOneOrDefaultById(farmaco.Codigo);

            Familia familia      = null;
            Familia superFamilia = null;

            if (string.IsNullOrWhiteSpace(farmaco.SubFamilia))
            {
                familia = new Familia {
                    Nombre = string.Empty
                };
                superFamilia = _familiaRepository.GetOneOrDefaultById(farmaco.Familia)
                               ?? new Familia {
                    Nombre = string.Empty
                };
            }
            else
            {
                familia = _familiaRepository.GetSubFamiliaOneOrDefault(farmaco.Familia, farmaco.SubFamilia)
                          ?? new Familia {
                    Nombre = string.Empty
                };
                superFamilia = _familiaRepository.GetOneOrDefaultById(farmaco.Familia)
                               ?? new 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>"
            };

            var impuesto = !string.IsNullOrWhiteSpace(farmaco.CodigoImpuesto) ? farmaco.CodigoImpuesto : "0";
            var iva      = _tarifaRepository.GetTarifaOrDefaultByCodigoImpuesto(impuesto) ?? 0m;

            return(new Farmaco
            {
                Id = farmaco.Id,
                Codigo = farmaco.Codigo,
                Denominacion = farmaco.Denominacion,
                Familia = familia,
                SuperFamilia = superFamilia,
                Categoria = categoria,
                CodigoBarras = farmaco.CodigoBarras,
                Proveedor = proveedor,
                FechaUltimaCompra = farmaco.FechaUltimaCompra,
                FechaUltimaVenta = farmaco.FechaUltimaVenta,
                FechaCaducidad = farmaco.FechaCaducidad,
                Ubicacion = farmaco.Ubicacion ?? string.Empty,
                Precio = farmaco.Precio,
                PrecioCoste = farmaco.PrecioCoste,
                Iva = iva,
                Stock = farmaco.Stock,
                StockMinimo = farmaco.StockMinimo,
                StockMaximo = farmaco.StockMaximo,
                Laboratorio = laboratorio,
                Baja = farmaco.FechaBaja.HasValue
            });
        }
        public IEnumerable <DTO.Farmaco> GetWithStockByIdGreaterAsDTO(string codArticu)
        {
            var farmacos = new List <DTO.Farmaco>();
            var conn     = FarmaciaContext.GetConnection();

            try
            {
                var sqlOrZeroCode = string.Empty;
                if (codArticu == "0")
                {
                    sqlOrZeroCode = @"OR a.codigo = '000000'";
                }

                var sqlExtra = string.Empty;
                if (_empresaRepository.Count() == 2)
                {
                    sqlExtra = $@"WHERE emp_codigo = (
                                        CASE WHEN codigo >= '600000' THEN
                                            case when nvl(pvp_euros,0) > 0 then 'EMP1' else 'EMP2'
                                        END ELSE CASE WHEN nvl(pvp_euros,0) > 0 then 'EMP2' else 'EMP1'
                                  END END)";
                }

                var sql = $@"select o.* from (
                    select a.codigo, a.precio_lab_euros, a.Pvp_euros, a.famsb_codigo, a.fam_codigo, a.descripcion, a.lab_codigo, a.clase, a.clase_bot,
                           a.imp_codigo, a.ean_13, a.Fecha_Baja, sum(e.actuales) as stock, max(e.stock_min) as stock_minimo, max(e.stock_max) as stock_maximo,
                           max(to_date(e.fecha_caducidad)) as fecha_caducidad, max(e.fuc) AS fuc, max(e.fuv) as fuv,
                           NVL(MAX(e.pmc_es),0) AS pcmedio, NVL(MAX(e.puc_es),0) AS puc, NVL(MAX(e.ubicacion),'') AS ubicacion
                    from (select distinct
                                codigo, precio_lab_euros, Pvp_euros, famsb_codigo, fam_codigo, descripcion, lab_codigo, clase, clase_bot,
                                imp_codigo, ean_13, Fecha_Baja from appul.ab_articulos {sqlExtra}) a
                    LEFT JOIN appul.ac_existencias e ON e.art_codigo = a.codigo
                    WHERE a.codigo > '{codArticu.PadLeft(6, '0')}' {sqlOrZeroCode}
                    GROUP BY a.codigo, a.precio_lab_euros, a.Pvp_euros, a.famsb_codigo, a.fam_codigo,
                            a.descripcion, a.lab_codigo, a.clase, a.clase_bot, a.imp_codigo, a.ean_13, a.Fecha_Baja
                    HAVING NVL(sum(e.actuales),0) > 0 ORDER BY a.codigo ASC) o
                    WHERE rownum <= 999";

                conn.Open();
                var cmd = conn.CreateCommand();
                cmd.CommandText = sql;
                var reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    var rCodigo         = Convert.ToString(reader["codigo"]);
                    var rPrecioLabEuros = !Convert.IsDBNull(reader["precio_lab_euros"]) ? (decimal?)Convert.ToDecimal(reader["precio_lab_euros"]) : null;
                    var rPvpEuros       = !Convert.IsDBNull(reader["Pvp_euros"]) ? (decimal?)Convert.ToDecimal(reader["Pvp_euros"]) : null;
                    var rFamsbCodigo    = Convert.ToString(reader["famsb_codigo"]);
                    var rFamCodigo      = Convert.ToString(reader["fam_codigo"]);
                    var rDescripcion    = Convert.ToString(reader["descripcion"]);
                    var rLabCodigo      = !Convert.IsDBNull(reader["lab_codigo"]) ? (long?)Convert.ToInt64(reader["lab_codigo"]) : null;
                    var rClase          = Convert.ToString(reader["clase"]);
                    var rClaseBot       = Convert.ToString(reader["clase_bot"]);
                    var rImpCodigo      = Convert.ToString(reader["imp_codigo"]);
                    var rEan13          = Convert.ToString(reader["ean_13"]);
                    var rFechaBaja      = !Convert.IsDBNull(reader["Fecha_Baja"]) ? (DateTime?)Convert.ToDateTime(reader["Fecha_Baja"]) : null;
                    var rStock          = !Convert.IsDBNull(reader["stock"]) ? Convert.ToInt64(reader["stock"]) : 0L;
                    var rStockMinimo    = !Convert.IsDBNull(reader["stock_minimo"]) ? Convert.ToInt64(reader["stock_minimo"]) : 0L;
                    var rStockMaximo    = !Convert.IsDBNull(reader["stock_maximo"]) ? Convert.ToInt64(reader["stock_maximo"]) : 0L;
                    var rFechaCaducidad = !Convert.IsDBNull(reader["fecha_caducidad"]) ? (DateTime?)Convert.ToDateTime(reader["fecha_caducidad"]) : null;
                    var rFuc            = !Convert.IsDBNull(reader["fuc"]) ? (DateTime?)Convert.ToDateTime(reader["fuc"]) : null;
                    var rFuv            = !Convert.IsDBNull(reader["fuv"]) ? (DateTime?)Convert.ToDateTime(reader["fuv"]) : null;
                    var rPcMedio        = !Convert.IsDBNull(reader["pcmedio"]) ? Convert.ToDecimal(reader["pcmedio"]) : 0m;
                    var rPuc            = !Convert.IsDBNull(reader["puc"]) ? Convert.ToDecimal(reader["puc"]) : 0m;
                    var rUbicacion      = Convert.ToString(reader["ubicacion"]);

                    var farmaco = new DTO.Farmaco
                    {
                        Codigo            = rCodigo,
                        Stock             = rStock,
                        StockMinimo       = rStockMinimo,
                        StockMaximo       = rStockMaximo,
                        FechaCaducidad    = rFechaCaducidad,
                        FechaUltimaCompra = rFuc,
                        FechaUltimaVenta  = rFuv,
                        PrecioCoste       = rPuc != 0m ? rPuc
                            : rPcMedio != 0m ? rPcMedio
                            : rPrecioLabEuros ?? 0m,
                        Precio         = rPvpEuros ?? 0m,
                        Familia        = rFamCodigo.ToIntegerOrDefault(),
                        SubFamilia     = rFamsbCodigo,
                        Laboratorio    = rLabCodigo,
                        CodigoBarras   = rEan13,
                        CodigoImpuesto = rImpCodigo,
                        Denominacion   = rDescripcion,
                        FechaBaja      = rFechaBaja,
                        Ubicacion      = rUbicacion,
                    };

                    farmacos.Add(farmaco);
                }

                reader.Close();
                reader.Dispose();

                return(farmacos);
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                conn.Close();
                conn.Dispose();
            }
        }