Esempio n. 1
0
        public void Comprobar_Que_Usuario_Nuevo_Necesita_Perfiles()
        {
            SecurityServices serv = new SecurityServices();

            _newPersona = CrearLisa();

            _newUser = new Usuario()
            {
                Login = "******",
                FechaExpiracionPassword = DateTime.Now.AddDays(30),
                Persona  = _newPersona,
                Perfiles = new HashSet <Perfil>()
            };

            serv.CrearUsuario(_newUser, "temporal-123");
        }
Esempio n. 2
0
        public void Comprobar_Creacion_Nuevo_Usuario()
        {
            SecurityServices serv = new SecurityServices();
            var perfiles          = from perf in DB.Contexto.Perfiles.Take(2) select perf;

            _newPersona = CrearLisa();

            _newUser = new Usuario()
            {
                Login = "******",
                FechaExpiracionPassword = DateTime.Now.AddDays(30),
                Persona  = _newPersona,
                Perfiles = new HashSet <Perfil>(perfiles)
            };

            serv.CrearUsuario(_newUser, "temporal-123");

            Assert.AreNotEqual(default(Guid), _newPersona.ID,
                               "Cuando se crea una nueva Persona su ID en formato GUID deberia tenerse en el modelo");
        }
Esempio n. 3
0
        public static void CrearUsuarioCompleto()
        {
            SecurityServices serv = new SecurityServices();
            Usuario          user;

            Console.WriteLine("Eliminando posible usuario remanente lsimpson");

            //  Me aseguro que el usuario no exista, solo para fines de prueba, no es un metodo que deba existir en la realidad
            serv.EliminarUsuario("lsimpson");

            //  Creo Persona, Usuario y le asigno al menos un Perfil porque de otra manera la validacion en SecurityServices
            //  fallaria
            //  primero chequeamos que la Persona no exista, si no existe la creamos
            Persona persona;

            Console.WriteLine("Chequeando si existe Persona para Lista Simpson");
            persona = (from per in DB.Contexto.Personas
                       where per.Apellido == "Simpson" && per.Nombre == "Lisa"
                       select per).SingleOrDefault();

            if (persona == null)
            {
                Console.WriteLine("Creando Persona Lisa Simpson");
                persona = CrearPersonaInternal("Lisa", "Simpson", "*****@*****.**", 8);
            }

            Console.WriteLine("Creando Usuario a partir de Persona");
            user = CrearUsuarioInternal("lsimpson", persona);

            //  lo saco directamente del OMBContext pero deberia hacerlo de SecServices (pensar que se utilizaria tambien
            //  en la UI donde asignamos o quitamos perfiles a un usuario)
            //
            var perfiles = from p in DB.Contexto.Perfiles where p.ID == 2 || p.ID == 3 select p;

            user.Perfiles = new HashSet <Perfil>(perfiles);

            //  actualizamos el usuario en la DB
            serv.CrearUsuario(user, "lisa-123");
        }
Esempio n. 4
0
        static void Main(string[] args)
        {
            /*
             * En este codigo no nos interesa separar capas, solo testear el funcionamiento de la base de datos y de los diferentes servicios
             * Podemos usar metodos directamente de DbContext o podemos usar las clases que encapsulan EF
             */
            //  https://www.connectionstrings.com/sql-server-compact/
            //
            //  OMBContext ctx = new OMBContext(@"Data source=F:\CURSO_2016_01\master\OMB\db\OMB.sdf;Persist Security Info=False;");
            OMBContext ctx = OMBContext.DB;

            AppDomain.CurrentDomain.UnhandledException += (o, e) => { ctx.Dispose(); Console.WriteLine("Excepcion"); };

            if (ctx.Database.Exists())
            {
                Console.WriteLine("La base esta!");
            }

#if PASO1
            //  PASO 1 - Crear root categoty (Libros)
            //
            Categoria root = new Categoria()
            {
                Nombre = "Libros"
            };

            ctx.Categorias.Add(root);
            ctx.SaveChanges();
#endif



#if PASO2
            //  PASO 2 - Crear categoria hijas (Informatica) [primero obtengo la root y luego creo las child]
            //
            Categoria root = (from cat in ctx.Categorias where cat.Nombre == "Libros" select cat).FirstOrDefault();

            Categoria newCat = new Categoria()
            {
                Nombre = "Informatica", Parent = root
            };

            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Ficcion", Parent = root
            };
            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);


            newCat = new Categoria()
            {
                Nombre = "No Ficcion", Parent = root
            };

            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Autoayuda", Parent = root
            };

            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Viajes", Parent = root
            };

            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);

            ctx.SaveChanges();
#endif

#if PASO2_5
            //  PASO 2 y MEDIO - Crear categorias hijas de una subcategoria...
            //
            Categoria @base = (from cat in ctx.Categorias where cat.Nombre == "Informatica" select cat).FirstOrDefault();

            //  Categoria newCat = new Categoria() { Nombre = "Informatica", Parent = root };
            //  Categoria newCat = new Categoria() { Nombre = "Ficcion", Parent = root };
            Categoria newCat = new Categoria()
            {
                Nombre = "Programacion", Parent = @base
            };

            ctx.Categorias.Add(newCat);
            @base?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Sistemas Operativos", Parent = @base
            };

            ctx.Categorias.Add(newCat);
            @base?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Networking", Parent = @base
            };

            ctx.Categorias.Add(newCat);
            @base?.SubCategorias.Add(newCat);

            ctx.SaveChanges();
#endif


#if PASO3
            //  PASO 3 - Chequear relaciones!! FULL

            //  Categoria root = (from cat in ctx.Categorias.Include("SubCategorias") where cat.Nombre == "Libros" select cat).FirstOrDefault();
            //  1
            //Categoria categoria = (from cat in ctx.Categorias where cat.Nombre == "Libros" select cat).FirstOrDefault();
            Categoria categoria = (from cat in ctx.Categorias where cat.Nombre == "Informatica" select cat).FirstOrDefault();

            //  2
            Console.WriteLine($"{categoria.IDCategoria} {categoria.Nombre} {categoria.SubCategorias.Count}");

            Console.WriteLine("SUB-CATEGORIAS");

            foreach (Categoria cat in categoria.SubCategorias)
            {
                //  3
                Console.WriteLine($"{cat.IDCategoria} {cat.Nombre} {cat.SubCategorias.Count}");
            }

            Console.WriteLine("PARENT CATEGORIA");
            if (categoria.Parent == null)
            {
                //  4
                Console.WriteLine($"{categoria.Nombre} es ROOT");
            }
            else
            {
                Console.WriteLine($"La categoria parent de {categoria.Nombre} es {categoria.Parent.Nombre}");
            }
#endif

#if PASO4
            //  PASO 4 - Ingreso de los Tipos de Documentos
            //
            TipoDocumento tipo = new TipoDocumento()
            {
                Descripcion = "DNI"
            };

            ctx.TiposDeDocumento.Add(tipo);

            tipo = new TipoDocumento()
            {
                Descripcion = "Pasaporte", Observaciones = ""
            };
            ctx.TiposDeDocumento.Add(tipo);

            tipo = new TipoDocumento()
            {
                Descripcion = "LE", Observaciones = "Libreta de Enrolamiento - Solo para hombre nacidos antes del 1960"
            };
            ctx.TiposDeDocumento.Add(tipo);

            tipo = new TipoDocumento()
            {
                Descripcion = "LC", Observaciones = "Libreta Civica - Solo para mujeres nacidas antes de 1955"
            };
            ctx.TiposDeDocumento.Add(tipo);

            tipo = new TipoDocumento()
            {
                Descripcion = "Documento Pendiente de Ingreso", Observaciones = "Averiguar cuanto antes el tipo y numero de documento!!"
            };
            ctx.TiposDeDocumento.Add(tipo);

            ctx.SaveChanges();
#endif

#if PASO4_5
            //  PASO 4_5 - testeamos algunas provincias y localidades...
            var localidades = ctx.Localidades.Where(loc => loc.Nombre.Contains("martin"));

            Console.WriteLine("TODAS LAS LOCALIDADES QUE CONTIENEN <<MARTIN>> EN SU NOMBRE\n\n");

            foreach (Localidad city in localidades)
            {
                Console.WriteLine($"Nombre Localidad: {city.Nombre} ; Provincia: {city.Provincia.Nombre}");
            }

            Console.WriteLine($"Hay {localidades.Count()} localidades cuyo nombre contiene <<MARTIN>>");

            Console.WriteLine("\nPress any key para listar ciudades de FORMOSA");
            Console.ReadLine();

            //  observar que hasta aca no necesito tener Provincias como DbSet...

            Provincia formosa = ctx.Provincias.Where(prov => prov.Nombre == "formosa").FirstOrDefault();

            foreach (var city in formosa.Localidades)
            {
                Console.WriteLine($"Nombre Localidad: {city.Nombre} ; Provincia: {city.Provincia.Nombre}");
            }

            Console.WriteLine($"Hay {formosa.Localidades.Count} localidades en esta provincia");
#endif

#if PASO4_5_1
            //
            //  Crear nueva Provincia y nueva Localidad
            //  esto normalmente no se haria, pero vemos si funciona (despues borrar desde la DB)

            Localidad nuevaLocalidad = new Localidad()
            {
                Nombre = "Plumas Verdes"
            };
            Provincia nuevaProvincia = new Provincia()
            {
                IDProvincia = "1", Nombre = "Alaska"
            };

            //  primero podemos probar ingresar una localidad sin provincia

            ctx.Localidades.Add(nuevaLocalidad);
            try
            {
                ctx.SaveChanges();

                throw new ApplicationException("Deberia haber fallado el UPDATE!!!");
            }
            catch (DbUpdateException ex)
            {
                Console.WriteLine("Se genero UpdateException!! Todo funciona OK");
                Console.WriteLine(ex.Message);
            }

            nuevaLocalidad.Provincia = nuevaProvincia;
            ctx.SaveChanges();
#endif

#if PASO5
            //  PASO 5 - Ingreso de algunas personas
            //
            Persona   newPersona;
            Localidad rosario, perez;

            rosario = ctx.Localidades.Where(loc => loc.Nombre == "Rosario" && loc.Provincia.Nombre == "Santa Fe").FirstOrDefault();
            perez   = ctx.Localidades.Where(loc => loc.Nombre == "Perez" && loc.Provincia.Nombre == "Santa Fe").FirstOrDefault();


            newPersona = new Persona()
            {
                Nombres = "Martin", Apellidos = "Vidal", Localidad = rosario, Sexo = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Gonzalo", Apellidos = "López", Localidad = rosario, Sexo = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Ruben", Apellidos = "Acevedo", Localidad = rosario, Sexo = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres       = "Enrique",
                Apellidos     = "Thedy",
                Localidad     = rosario,
                Domicilio     = "Mitre 509 Piso 5 Departamento 4",
                CodigoPostal  = "S2000COK",
                Documento     = "18339577",
                TipoDocumento = ctx.TiposDeDocumento.FirstOrDefault(td => td.Descripcion == "DNI"),
                Sexo          = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Ana Laura", Apellidos = "Cardoso", Localidad = rosario, Sexo = Sexo.Femenino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Maria Elisa", Apellidos = "Tron", Localidad = rosario, Sexo = Sexo.Femenino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Valeria Claudia", Apellidos = "Guglielmetti", Localidad = rosario, Sexo = Sexo.Femenino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Guillermo", Apellidos = "Quintana", Localidad = rosario, Sexo = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Irene Leonor", Apellidos = "Acosta", Localidad = perez, Sexo = Sexo.Femenino
            };
            ctx.Personas.Add(newPersona);

            //  newPersona = new Persona() { Nombres = "", Apellidos = "", Localidad = rosario };

            ctx.SaveChanges();
#endif

#if PASO6
            //  Agregamos info de contacto
            //
            Persona             persona = null; //  TODO Traer una Persona desde la base de datos
            List <TipoContacto> tipos   = ctx.TiposContacto.ToList();

            if (persona != null)
            {
                Console.WriteLine($"Agregar contactos para {persona.Nombres} {persona.Apellidos}");

                while (true)
                {
                    Console.WriteLine("(A)gregar nuevo contacto? o (S)alir?");
                    if (Console.ReadKey(true).Key == ConsoleKey.A)
                    {
                        //  mostrar la lista de posibles contactos
                        Console.WriteLine("Esta es la lista de posibles tipos de contacto\nElegir un # de tipo y luego ingresarlo");

                        for (int idx = 1; idx <= tipos.Count; idx++)
                        {
                            Console.WriteLine($"{idx} ----- {tipos[idx-1].Descripcion}");
                        }

                        string opcion = Console.ReadLine();
                        int    numOpcion;

                        if (Int32.TryParse(opcion, out numOpcion) && numOpcion >= 1 && numOpcion <= tipos.Count)
                        {
                            Console.WriteLine("Ahora ingrese el dato del contacto");

                            string dato = Console.ReadLine();

                            Console.WriteLine("Por ultimo un comentario (o Enter si no desea comentario)");

                            string comentario = Console.ReadLine();

                            //  TODO Agregar el nuevo contacto a la Persona
                        }
                        else
                        {
                            Console.WriteLine($"Opcion no valida, debe estar entre 1 y {tipos.Count}");
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                if (ctx.ChangeTracker.HasChanges())
                {
                    Console.WriteLine("Guardando info de contacto");
                    //  ctx.MostrarCambios();
                    //  Console.ReadLine();
                    ctx.SaveChanges();
                }
                else
                {
                    Console.WriteLine("No se detectaron cambios");
                }
            }
            else
            {
                Console.WriteLine("Esta persona no existe");
            }
#endif

#if PASO7
            //  Agregamos Empleado asociado a Persona
            //
            Persona persona = ctx.Personas.FirstOrDefault(per => per.Apellidos == "Thedy");

            if (persona != null)
            {
                Empleado nuevo = new Empleado();

                nuevo.Persona      = persona;
                nuevo.Legajo       = "167055";
                nuevo.CUIT         = "20-18339577-8";
                nuevo.FechaIngreso = new DateTime(1986, 12, 9);

                ctx.Empleados.Add(nuevo);
                ctx.SaveChanges();
            }
#endif

#if PASO8
            //  Creamos un usuario y utilizamos el servicio para crearlo con su password
            //
            Empleado         empleado = ctx.Empleados.FirstOrDefault(emp => emp.Legajo == "167055");
            Usuario          user     = new Usuario();
            SecurityServices seg      = new SecurityServices();

            user.Login    = "******";
            user.Empleado = empleado;
            user.Blocked  = false;

            if (seg.ValidarUsuario(user))
            {
                if (seg.CrearUsuario(user, "12345678"))
                {
                    Console.WriteLine("Usuario creado correctamente");
                }
                else
                {
                    Console.WriteLine("Error al crear el usuario");
                }
            }
            else
            {
                Console.WriteLine("Fallo la validacion del usuario");
            }
#endif

            /*
             *    Categoria newCat = new Categoria() {Nombre = "Informatica", Parent = parent};
             *
             *    ctx.Categorias.Add(newCat);
             *
             *    parent.SubCategorias.Add(newCat);
             *    ctx.SaveChanges();
             *
             *
             *    //  ctx.Categorias.Load();
             *
             *    var showCat = ctx.Categorias.FirstOrDefault();
             *
             *      //.Where(categ => categ.Nombre == "Libros").First();
             *
             *    Console.WriteLine(showCat?.CategoriaID.ToString());
             */
            Console.ReadLine();

            ctx.Dispose();
        }
Esempio n. 5
0
        static void Main(string[] args)
        {
            /*
             * En este codigo no nos interesa separar capas, solo testear el funcionamiento de la base de datos y de los diferentes servicios
             * Podemos usar metodos directamente de DbContext o podemos usar las clases que encapsulan EF
             */
            //  https://www.connectionstrings.com/sql-server-compact/
            //
            //  OMBContext ctx = new OMBContext(@"Data source=F:\CURSO_2016_01\master\OMB\db\OMB.sdf;Persist Security Info=False;");
            OMBContext ctx = OMBContext.DB;

            AppDomain.CurrentDomain.UnhandledException += (o, e) => { ctx.Dispose(); Console.WriteLine("Excepcion"); };

            if (ctx.Database.Exists())
            {
                Console.WriteLine("La base esta!");
            }

#if PASO_1
            //  PASO 1 - Crear root categoty (Libros)
            //
            Categoria root = new Categoria()
            {
                Nombre = "Libros"
            };

            ctx.Categorias.Add(root);
            ctx.SaveChanges();
#endif



#if PASO_2
            //  PASO 2 - Crear categoria hijas (Informatica) [primero obtengo la root y luego creo las child]
            //
            Categoria root = (from cat in ctx.Categorias where cat.Nombre == "Libros" select cat).FirstOrDefault();

            Categoria newCat = new Categoria()
            {
                Nombre = "Informatica", Parent = root
            };

            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Ficcion", Parent = root
            };
            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);


            newCat = new Categoria()
            {
                Nombre = "No Ficcion", Parent = root
            };

            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Autoayuda", Parent = root
            };

            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Viajes", Parent = root
            };

            ctx.Categorias.Add(newCat);
            root?.SubCategorias.Add(newCat);

            ctx.SaveChanges();
#endif

#if PASO_2_5
            //  PASO 2 y MEDIO - Crear categorias hijas de una subcategoria...
            //
            Categoria @base = (from cat in ctx.Categorias where cat.Nombre == "Informatica" select cat).FirstOrDefault();

            //  Categoria newCat = new Categoria() { Nombre = "Informatica", Parent = root };
            //  Categoria newCat = new Categoria() { Nombre = "Ficcion", Parent = root };
            Categoria newCat = new Categoria()
            {
                Nombre = "Programacion", Parent = @base
            };

            ctx.Categorias.Add(newCat);
            @base?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Sistemas Operativos", Parent = @base
            };

            ctx.Categorias.Add(newCat);
            @base?.SubCategorias.Add(newCat);

            newCat = new Categoria()
            {
                Nombre = "Networking", Parent = @base
            };

            ctx.Categorias.Add(newCat);
            @base?.SubCategorias.Add(newCat);

            ctx.SaveChanges();
#endif


#if PASO_3
            //  PASO 3 - Chequear relaciones!! FULL

            //  Categoria root = (from cat in ctx.Categorias.Include("SubCategorias") where cat.Nombre == "Libros" select cat).FirstOrDefault();
            //  1
            //Categoria categoria = (from cat in ctx.Categorias where cat.Nombre == "Libros" select cat).FirstOrDefault();
            Categoria categoria = (from cat in ctx.Categorias where cat.Nombre == "Informatica" select cat).FirstOrDefault();

            //  2
            Console.WriteLine($"{categoria.IDCategoria} {categoria.Nombre} {categoria.SubCategorias.Count}");

            Console.WriteLine("SUB-CATEGORIAS");

            foreach (Categoria cat in categoria.SubCategorias)
            {
                //  3
                Console.WriteLine($"{cat.IDCategoria} {cat.Nombre} {cat.SubCategorias.Count}");
            }

            Console.WriteLine("PARENT CATEGORIA");
            if (categoria.Parent == null)
            {
                //  4
                Console.WriteLine($"{categoria.Nombre} es ROOT");
            }
            else
            {
                Console.WriteLine($"La categoria parent de {categoria.Nombre} es {categoria.Parent.Nombre}");
            }
#endif

#if PASO_4
            //  PASO 4 - Ingreso de los Tipos de Documentos
            //
            TipoDocumento tipo = new TipoDocumento()
            {
                Descripcion = "DNI"
            };

            ctx.TiposDeDocumento.Add(tipo);

            tipo = new TipoDocumento()
            {
                Descripcion = "Pasaporte", Observaciones = ""
            };
            ctx.TiposDeDocumento.Add(tipo);

            tipo = new TipoDocumento()
            {
                Descripcion = "LE", Observaciones = "Libreta de Enrolamiento - Solo para hombre nacidos antes del 1960"
            };
            ctx.TiposDeDocumento.Add(tipo);

            tipo = new TipoDocumento()
            {
                Descripcion = "LC", Observaciones = "Libreta Civica - Solo para mujeres nacidas antes de 1955"
            };
            ctx.TiposDeDocumento.Add(tipo);

            tipo = new TipoDocumento()
            {
                Descripcion = "Documento Pendiente de Ingreso", Observaciones = "Averiguar cuanto antes el tipo y numero de documento!!"
            };
            ctx.TiposDeDocumento.Add(tipo);

            ctx.SaveChanges();
#endif

#if PASO_4_5
            //  PASO 4_5 - testeamos algunas provincias y localidades...
            var localidades = ctx.Localidades.Where(loc => loc.Nombre.Contains("martin"));

            Console.WriteLine("TODAS LAS LOCALIDADES QUE CONTIENEN <<MARTIN>> EN SU NOMBRE\n\n");

            foreach (Localidad city in localidades)
            {
                Console.WriteLine($"Nombre Localidad: {city.Nombre} ; Provincia: {city.Provincia.Nombre}");
            }

            Console.WriteLine($"Hay {localidades.Count()} localidades cuyo nombre contiene <<MARTIN>>");

            Console.WriteLine("\nPress any key para listar ciudades de FORMOSA");
            Console.ReadLine();

            //  observar que hasta aca no necesito tener Provincias como DbSet...

            Provincia formosa = ctx.Provincias.Where(prov => prov.Nombre == "formosa").FirstOrDefault();

            foreach (var city in formosa.Localidades)
            {
                Console.WriteLine($"Nombre Localidad: {city.Nombre} ; Provincia: {city.Provincia.Nombre}");
            }

            Console.WriteLine($"Hay {formosa.Localidades.Count} localidades en esta provincia");
#endif

#if PASO_4_5_1
            //
            //  Crear nueva Provincia y nueva Localidad
            //  esto normalmente no se haria, pero vemos si funciona (despues borrar desde la DB)

            Localidad nuevaLocalidad = new Localidad()
            {
                Nombre = "Plumas Verdes"
            };
            Provincia nuevaProvincia = new Provincia()
            {
                IDProvincia = "1", Nombre = "Alaska"
            };

            //  primero podemos probar ingresar una localidad sin provincia

            ctx.Localidades.Add(nuevaLocalidad);
            try
            {
                ctx.SaveChanges();

                throw new ApplicationException("Deberia haber fallado el UPDATE!!!");
            }
            catch (DbUpdateException ex)
            {
                Console.WriteLine("Se genero UpdateException!! Todo funciona OK");
                Console.WriteLine(ex.Message);
            }

            nuevaLocalidad.Provincia = nuevaProvincia;
            ctx.SaveChanges();
#endif

#if PASO_5
            //  PASO 5 - Ingreso de algunas personas
            //
            Persona   newPersona;
            Localidad rosario, perez;

            rosario = ctx.Localidades.Where(loc => loc.Nombre == "Rosario" && loc.Provincia.Nombre == "Santa Fe").FirstOrDefault();
            perez   = ctx.Localidades.Where(loc => loc.Nombre == "Perez" && loc.Provincia.Nombre == "Santa Fe").FirstOrDefault();


            newPersona = new Persona()
            {
                Nombres = "Martin", Apellidos = "Vidal", Localidad = rosario, Sexo = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Gonzalo", Apellidos = "López", Localidad = rosario, Sexo = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Ruben", Apellidos = "Acevedo", Localidad = rosario, Sexo = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres       = "Enrique",
                Apellidos     = "Thedy",
                Localidad     = rosario,
                Domicilio     = "Mitre 509 Piso 5 Departamento 4",
                CodigoPostal  = "S2000COK",
                Documento     = "18339577",
                TipoDocumento = ctx.TiposDeDocumento.FirstOrDefault(td => td.Descripcion == "DNI"),
                Sexo          = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Ana Laura", Apellidos = "Cardoso", Localidad = rosario, Sexo = Sexo.Femenino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Maria Elisa", Apellidos = "Tron", Localidad = rosario, Sexo = Sexo.Femenino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Valeria Claudia", Apellidos = "Guglielmetti", Localidad = rosario, Sexo = Sexo.Femenino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Guillermo", Apellidos = "Quintana", Localidad = rosario, Sexo = Sexo.Masculino
            };
            ctx.Personas.Add(newPersona);

            newPersona = new Persona()
            {
                Nombres = "Irene Leonor", Apellidos = "Acosta", Localidad = perez, Sexo = Sexo.Femenino
            };
            ctx.Personas.Add(newPersona);

            //  newPersona = new Persona() { Nombres = "", Apellidos = "", Localidad = rosario };

            ctx.SaveChanges();
#endif

#if PASO_5_5
            //  Modificar propiedades de alguna persona
            Persona persona = ctx.Personas.Where(per => per.Apellidos == "Thedy").First();

            persona.AmpliacionDomicilio = "Es el edificio de la esquina";

            if (ctx.ChangeTracker.HasChanges())
            {
                Console.WriteLine("Guardando info de contacto");

                ctx.MostrarCambios();
                Console.ReadLine();

                ctx.SaveChanges();
            }
            else
            {
                Console.WriteLine("No se detectaron cambios");
            }
#endif

#if PASO_6
            //  Agregamos info de contacto
            //
            //  TODO Traer una Persona desde la base de datos
            Persona             persona = ctx.Personas.Where(per => per.Apellidos == "Thedy").FirstOrDefault();
            List <TipoContacto> tipos   = ctx.TiposContacto.ToList();

            if (persona != null)
            {
                Console.WriteLine($"Agregar contactos para {persona.Nombres} {persona.Apellidos}");

                while (true)
                {
                    Console.WriteLine("(A)gregar nuevo contacto? o (S)alir?");
                    if (Console.ReadKey(true).Key == ConsoleKey.A)
                    {
                        //  mostrar la lista de posibles contactos
                        Console.WriteLine("Esta es la lista de posibles tipos de contacto\nElegir un # de tipo y luego ingresarlo");

                        for (int idx = 1; idx <= tipos.Count; idx++)
                        {
                            Console.WriteLine($"{idx} ----- {tipos[idx-1].Descripcion}");
                        }

                        string opcion = Console.ReadLine();
                        int    numOpcion;

                        if (Int32.TryParse(opcion, out numOpcion) && numOpcion >= 1 && numOpcion <= tipos.Count)
                        {
                            Console.WriteLine("Ahora ingrese el dato del contacto");

                            string dato = Console.ReadLine();

                            Console.WriteLine("Por ultimo un comentario (o Enter si no desea comentario)");

                            string comentario = Console.ReadLine();

                            //  TODO Agregar el nuevo contacto a la Persona
                            Contacto nuevoContacto = new Contacto();

                            nuevoContacto.Dato       = dato;
                            nuevoContacto.Comentario = string.IsNullOrWhiteSpace(comentario) ? null : comentario;
                            nuevoContacto.Tipo       = tipos[numOpcion];

                            persona.InfoContacto.Add(nuevoContacto);
                        }
                        else
                        {
                            Console.WriteLine($"Opcion no valida, debe estar entre 1 y {tipos.Count}");
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                if (ctx.ChangeTracker.HasChanges())
                {
                    Console.WriteLine("Guardando info de contacto");

                    ctx.MostrarCambios();
                    Console.ReadLine();

                    ctx.SaveChanges();
                }
                else
                {
                    Console.WriteLine("No se detectaron cambios");
                }
            }
            else
            {
                Console.WriteLine("Esta persona no existe");
            }
#endif

#if PASO_7
            //  Agregamos Empleado asociado a Persona
            //
            Persona persona = ctx.Personas.FirstOrDefault(per => per.Apellidos == "Thedy");

            if (persona != null)
            {
                Empleado nuevo = new Empleado();

                nuevo.Persona      = persona;
                nuevo.Legajo       = "167055";
                nuevo.CUIT         = "20-18339577-8";
                nuevo.FechaIngreso = new DateTime(1986, 12, 9);

                ctx.Empleados.Add(nuevo);
                ctx.SaveChanges();
            }
#endif

#if PASO_8
            //  Creamos un usuario y utilizamos el servicio para crearlo con su password
            //
            Empleado         empleado = ctx.Empleados.FirstOrDefault(emp => emp.Legajo == "167055");
            Usuario          user     = new Usuario();
            SecurityServices seg      = new SecurityServices();

            user.Login    = "******";
            user.Empleado = empleado;
            user.Blocked  = false;

            if (seg.CrearUsuario(user, "12345678"))
            {
                Console.WriteLine("Usuario creado correctamente");
            }
            else
            {
                Console.WriteLine("Error al crear el usuario");
            }
#endif

#if PASO_9
            //  TODO agregar codigo para ingresar con el ID y password que asignamos a nuestro usuario
            //
            SecurityServices seg = new SecurityServices();

            //  Probamos login incorrecto...por usuario inexistente
            //
            Usuario usrlogin = seg.LoginUsuario("pirulo", "12345678");

            if (usrlogin == null)
            {
                Console.WriteLine(seg.ErrorInfo);
            }
            else
            {
                Console.WriteLine("NO PUEDE SER!!!");
            }
            //  Probamos login incorrecto...por password incorrecta ==> esto tiene que modificar la tabla (last login BAD))
            //
            usrlogin = seg.LoginUsuario("ethedy", "1234567890");

            if (usrlogin == null)
            {
                Console.WriteLine(seg.ErrorInfo);
            }
            else
            {
                Console.WriteLine("NO PUEDE SER!!!");
            }

            //  Probamos login incorrecto...por password incorrecta ==> esto tiene que modificar la tabla (last login OK)
            //
            usrlogin = seg.LoginUsuario("ethedy", "12345678");

            if (usrlogin != null)
            {
                Console.WriteLine($"Usuario {usrlogin.Empleado.Persona.Nombres} {usrlogin.Empleado.Persona.Apellidos} conectado!!");
            }
            else
            {
                Console.WriteLine("NO PUEDE SER!!!");
            }
#endif

#if PASO_12
            //  Agregamos codigo para incorporar editoriales y algunos libros
            //  string pathPortadas = @"F:\CURSO_2016_01\src\OMB\imagenes\portadas";
            //  string pathPortadas = @"F:\CURSO_2016_01\src\OMB\imagenes\portadas";
            string[] editoriales =
            {
                // "Addison-Wesley Professional",
                "The MIT Press",
                "O'Reilly Media",
                "No Starch Press",
                "Apress",
                "Microsoft Press",
                "Wrox",
                "McGraw-Hill Education",
                "Wiley"
            };

            Editorial editorial;
            //  ProductServices prods = new ProductServices();

            foreach (string item in editoriales)
            {
                editorial = new Editorial()
                {
                    Nombre = item
                };
                ctx.Editoriales.Add(editorial);
            }
            ctx.SaveChanges();

/*
 *    Libro nuevo = prods.NuevoLibro(editorial,
 *      "The C++ Standard Library: A Tutorial and Reference", "9780321623218",
 *      Path.Combine(pathPortadas, "The C++ Standard Library A Tutorial and Reference.jpg"),
 *      new DateTime(2012, 4, 9), 1128);
 *
 *    if (nuevo != null)
 *      Console.WriteLine($"Libro agregado correctamente con ID = {nuevo.IDLibro}");
 * */
#endif

#if PASO_13
            //  Agregamos codigo para incorporar editoriales y algunos libros
            //  string pathPortadas = @"F:\CURSO_2016_01\src\OMB\imagenes\portadas";
            string pathPortadas = @"D:\DESARROLLO\OMB_2016\OMB\imagenes\portadas";

            ProductServices prods = new ProductServices();
            Libro           nuevo;

            nuevo = prods.NuevoLibro(
                ctx.Editoriales.FirstOrDefault(ed => ed.Nombre.Contains("Wesley")),
                "The C++ Standard Library: A Tutorial and Reference",
                "9780321623218",
                "0321623215",
                Path.Combine(pathPortadas, "The C++ Standard Library A Tutorial and Reference.jpg"),
                new DateTime(2012, 4, 9),
                1128);

            if (nuevo != null)
            {
                Console.WriteLine("Libro agregado correctamente con ID = {0}", nuevo.IDLibro);
            }

            nuevo = prods.NuevoLibro(
                ctx.Editoriales.FirstOrDefault(ed => ed.Nombre.Contains("MIT Press")),
                "Introduction to Algorithms",
                "9780262033848",
                "0262033844",
                Path.Combine(pathPortadas, "Introduction to Algorithms.jpg"),
                new DateTime(2009, 7, 31),
                1312);

            if (nuevo != null)
            {
                Console.WriteLine("Libro agregado correctamente con ID = {0}", nuevo.IDLibro);
            }

            nuevo = prods.NuevoLibro(
                ctx.Editoriales.FirstOrDefault(ed => ed.Nombre.Contains("Reilly")),
                "Algorithms in a Nutshell: A Practical Guide",
                "9781491948927",
                "1491948922",
                Path.Combine(pathPortadas, "Algorithms in a Nutshell A Practical Guide.jpg"),
                new DateTime(2016, 4, 2),
                390);

            if (nuevo != null)
            {
                Console.WriteLine("Libro agregado correctamente con ID = {0}", nuevo.IDLibro);
            }

            nuevo = prods.NuevoLibro(
                ctx.Editoriales.FirstOrDefault(ed => ed.Nombre.Contains("Reilly")),
                "The Hitchhiker's Guide to Python: Best Practices for Development",
                "9781491933176",
                "1491933178",
                Path.Combine(pathPortadas, "The Hitchhiker's Guide to Python Best Practices for Development.jpg"),
                new DateTime(2016, 9, 18),
                338);

            if (nuevo != null)
            {
                Console.WriteLine("Libro agregado correctamente con ID = {0}", nuevo.IDLibro);
            }

            nuevo = prods.NuevoLibro(
                ctx.Editoriales.FirstOrDefault(ed => ed.Nombre.Contains("Reilly")),
                "Understanding the Linux Kernel",
                "9780596005658",
                "0596005652",
                Path.Combine(pathPortadas, "Understanding the Linux Kernel.jpg"),
                new DateTime(2005, 11, 1),
                944);

            if (nuevo != null)
            {
                Console.WriteLine("Libro agregado correctamente con ID = {0}", nuevo.IDLibro);
            }

            nuevo = prods.NuevoLibro(
                ctx.Editoriales.FirstOrDefault(ed => ed.Nombre.Contains("Addison-Wesley")),
                "Unix Network Programming, Volume 1: The Sockets Networking API",
                "9780131411555",
                "0131411551",
                Path.Combine(pathPortadas, "Unix Network Programming, Volume 1 The Sockets Networking API.jpg"),
                new DateTime(2003, 11, 24),
                1024);

            if (nuevo != null)
            {
                Console.WriteLine("Libro agregado correctamente con ID = {0}", nuevo.IDLibro);
            }
#endif

            /*
             *    Categoria newCat = new Categoria() {Nombre = "Informatica", Parent = parent};
             *
             *    ctx.Categorias.Add(newCat);
             *
             *    parent.SubCategorias.Add(newCat);
             *    ctx.SaveChanges();
             *
             *
             *    //  ctx.Categorias.Load();
             *
             *    var showCat = ctx.Categorias.FirstOrDefault();
             *
             *      //.Where(categ => categ.Nombre == "Libros").First();
             *
             *    Console.WriteLine(showCat?.CategoriaID.ToString());
             */
            Console.WriteLine("Press Any Key To Continue...");
            Console.ReadLine();

            ctx.Dispose();
        }