public async Task <IActionResult> Create(EstablecimientoViewModel vm)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    throw new Exception("Error de validacion no controlado.");
                }

                ViewBag.EstablecimientoDuplicado = false;
                // Existe establecimiento
                var existeEstablecimiento = await _establecimientoServicio.Existe(vm.Nombre, vm.Direccion.Descripcion, vm.Direccion.LocalidadId);

                if (existeEstablecimiento)
                {
                    ViewBag.EstablecimientoDuplicado = true;
                    throw new Exception("Establecimiento duplicado.");
                }
                // Existe direccion -> si no existe la creo y obtengo el id
                var direccionId = await _helperDireccion.ExisteDireccion(vm.Direccion);

                if (!direccionId.HasValue)
                {
                    // creo la direccion y devuelvo el id
                    direccionId = await _helperDireccion.NuevaDireccion(vm.Direccion);
                }
                vm.DireccionId = direccionId.Value;

                // creo el establecimiento
                var dto = new EstablecimientoDto()
                {
                    Nombre      = vm.Nombre,
                    DireccionId = vm.DireccionId
                };

                await _establecimientoServicio.Insertar(dto);

                return(RedirectToAction(nameof(Index)));
            }
            catch (Exception)
            {
                return(View(vm));
            }
        }
        public async Task <IActionResult> Edit(EmpresaViewModel vm)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    throw new Exception("Error de validacion no controlado.");
                }

                // comprobar si cambio la direccion
                var direccionId = await _helperDireccion.ExisteDireccion(vm.Direccion);

                if (!direccionId.HasValue)
                {
                    direccionId = await _helperDireccion.NuevaDireccion(vm.Direccion);
                }

                vm.DireccionId = direccionId.Value;

                var dto = new EmpresaDto()
                {
                    Id             = vm.Id,
                    Cuil           = vm.Cuil,
                    DireccionId    = vm.DireccionId,
                    Email          = vm.Email,
                    NombreFantasia = vm.NombreFantasia,
                    RazonSocial    = vm.RazonSocial,
                };

                await _empresaServicio.Modificar(dto);

                return(RedirectToAction(nameof(Index)));
            }
            catch (Exception)
            {
                return(View(vm));
            }
        }
        public async Task <IActionResult> EmpresaRegister(UsuarioEmpresaViewModel vm)
        {
            try
            {
                ViewBag.EmpresaDuplicada = false;
                ViewBag.EmailRequerido   = false;
                if (!ModelState.IsValid)
                {
                    if (vm.Empresa.Email == null)
                    {
                        ViewBag.EmailRequerido = true;
                    }
                    throw new Exception("Error de validacion no controlado.");
                }

                // verificar que no exista una empresa con el mismo cuil y razon social
                var existeEmpresa = await _helperEmpresa.ExisteEmpresa(vm.Empresa.Cuil, vm.Empresa.RazonSocial);

                if (existeEmpresa)
                {
                    ViewBag.EmpresaDuplicada = true;
                    throw new Exception("Empresa existente.");
                }

                // verificar que no exista una direccion con la misma descripcion y localidadId -> si existe no crearla y obtener el Id
                var direccionId = await _helperDireccion.ExisteDireccion(vm.Empresa.Direccion);

                if (!direccionId.HasValue)
                {
                    // creamos la direccion y optenemos el id
                    direccionId = await _helperDireccion.NuevaDireccion(vm.Empresa.Direccion);
                }

                vm.Empresa.DireccionId = direccionId.Value;

                // validar el usuario
                var user = new AppUser()
                {
                    UserName      = vm.Empresa.Email,
                    Email         = vm.Empresa.Email,
                    NombreMostrar = vm.Empresa.RazonSocial
                };

                var usuarioCreado = await _userManager.CreateAsync(user, vm.Password);

                if (!usuarioCreado.Succeeded)
                {
                    ViewBag.UsuarioCreado    = usuarioCreado;
                    ViewBag.EmpresaDuplicada = true;
                    throw new Exception("Error al crear usuario.");
                }

                // verificar si existe el rol "Empresa" -> si no existe crearlo
                var existeRol = await _roleManager.FindByNameAsync("Empresa");

                if (existeRol == null)
                {
                    var rol = new AppRole()
                    {
                        Name = "Empresa"
                    };
                    await _roleManager.CreateAsync(rol);
                }

                // asignar el rol al usuario
                await _userManager.AddToRoleAsync(user, "Empresa");

                // guardar la empresa si lo anterior es valido -> si no es valido eliminar el usuario y arrojar new Exception()
                var empresaCreada = await _helperEmpresa.NuevaEmpresa(vm.Empresa);

                if (!empresaCreada)
                {
                    await _userManager.DeleteAsync(user);

                    throw new Exception("Error al crear la empresa.");
                }

                // realizar login y redireccionar a home
                var result = await _signInManager.PasswordSignInAsync(user, vm.Password, false, false);

                if (!result.Succeeded)
                {
                    throw new Exception("Error al inicir sesion.");
                }

                return(RedirectToAction("Index", "Home"));
            }
            catch (Exception)
            {
                return(View(vm));
            }
        }