/// <summary> /// invites person /// </summary> /// <param name="invitation"></param> /// <returns></returns> public async Task <Invitation> Invite(Invitation invitation) { invitation.InvitationId = Guid.NewGuid().ToString(); var ret = await SetInvitation(invitation, true); var user = await GetUser(invitation.Email, invitation.PlaceProviderId); var pp = await placeProviderRepository.GetPlaceProvider(invitation.PlaceProviderId); if (pp == null) { throw new Exception("Place provider has not been found"); } invitation.CompanyName = pp.CompanyName; if (user == null) { // invitation with new user await Add( new User() { Email = invitation.Email, Phone = invitation.Phone, Name = invitation.Name, }, invitation.InviterName, pp.CompanyName, false ); } else { // invitation of existing user await emailSender.SendEmail( localizer[Repository_RedisRepository_UserRepository.Invitation_to_covid_testing_place], user.Email, user.Name, new Model.Email.InvitationEmail(CultureInfo.CurrentCulture.Name, configuration["FrontedURL"], configuration["EmailSupport"], configuration["PhoneSupport"]) { Name = user.Name, Roles = user.Roles?.ToArray(), InviterName = invitation.InviterName, CompanyName = pp.CompanyName, WebPath = configuration["FrontedURL"] }); } return(ret); }
/// <summary> /// Extend /// </summary> /// <param name="placeProviderRepository"></param> /// <returns></returns> internal async Task <PlaceProductWithPlace> ToExtendedModel(IPlaceProviderRepository placeProviderRepository) { var pp = await placeProviderRepository.GetPlaceProvider(PlaceProviderId); return(new PlaceProductWithPlace() { Id = this.Id, CustomPrice = this.CustomPrice, From = From, InsuranceOnly = InsuranceOnly, CollectInsurance = CollectInsurance, CollectEmployeeNo = CollectEmployeeNo, CollectNationality = CollectNationality, EmployeesOnly = EmployeesOnly, EmployeesRegistration = EmployeesRegistration, SchoolOnly = SchoolOnly, EHealthDefault = EHealthDefault, PlaceId = PlaceId, PlaceProviderId = PlaceProviderId, Price = Price, PriceCurrency = PriceCurrency, Product = pp?.Products?.FirstOrDefault(pr => pr.Id == ProductId), ProductId = ProductId, Until = Until, }); }
/// <summary> /// Extend /// </summary> /// <param name="placeProviderRepository"></param> /// <returns></returns> internal async Task <PlaceProductWithPlace> ToExtendedModel(IPlaceProviderRepository placeProviderRepository) { var pp = await placeProviderRepository.GetPlaceProvider(PlaceProviderId); return(new PlaceProductWithPlace() { Id = this.Id, CustomPrice = this.CustomPrice, From = From, InsuranceOnly = InsuranceOnly, PlaceId = PlaceId, PlaceProviderId = PlaceProviderId, Price = Price, PriceCurrency = PriceCurrency, Product = pp?.Products?.FirstOrDefault(pr => pr.Id == ProductId), ProductId = ProductId, Until = Until, }); }
/// <summary> /// Log in as company /// </summary> /// <param name="user"></param> /// <param name="userRepository"></param> /// <param name="placeProviderRepository"></param> /// <param name="placeProviderId"></param> /// <returns></returns> public static async Task <bool> IsAuthorizedToLogAsCompany(this ClaimsPrincipal user, IUserRepository userRepository, IPlaceProviderRepository placeProviderRepository, string placeProviderId) { if (user is null) { throw new ArgumentNullException(nameof(user)); } if (userRepository is null) { throw new ArgumentNullException(nameof(userRepository)); } if (user.IsAdmin(userRepository)) { return(true); } if (placeProviderRepository is null) { throw new ArgumentNullException(nameof(placeProviderRepository)); } if (string.IsNullOrEmpty(placeProviderId)) { throw new ArgumentNullException(nameof(placeProviderId)); } var email = user.GetEmail(); var pp = await placeProviderRepository.GetPlaceProvider(placeProviderId); if (pp == null) { return(false); } if (pp.Users?.Any(u => u.Email == email) == true) { return(true); } return(await placeProviderRepository.InAnyGroup(email, placeProviderId, new string[] { Groups.Admin, Groups.PPAdmin, Groups.Accountant, Groups.DataExporter, Groups.DocumentManager, Groups.MedicLab, Groups.MedicTester, Groups.RegistrationManager })); }
public async Task <ActionResult <PlaceProvider> > UpdatePP([FromBody] PlaceProvider placeProvider) { try { if (placeProvider is null) { throw new ArgumentNullException(nameof(placeProvider)); } if (string.IsNullOrEmpty(placeProvider.PlaceProviderId)) { throw new Exception("Invalid data has been received"); } if (string.IsNullOrEmpty(placeProvider.MainContact)) { throw new Exception("Place provide your name in the registration form"); } if (string.IsNullOrEmpty(placeProvider.MainEmail) || !placeProvider.MainEmail.IsValidEmail()) { throw new Exception("Place provide valid main email"); } placeProvider.PrivatePhone = placeProvider.PrivatePhone.FormatPhone(); if (string.IsNullOrEmpty(placeProvider.PrivatePhone) || !placeProvider.PrivatePhone.IsValidPhoneNumber()) { throw new Exception("Place provide valid contact phone number in form +421 907 000 000"); } var toUpdate = await placeProviderRepository.GetPlaceProvider(placeProvider.PlaceProviderId); if (toUpdate == null) { throw new Exception("Place provider has not been found"); } if (!string.IsNullOrEmpty(placeProvider.CompanyId)) { toUpdate.CompanyId = placeProvider.CompanyId; } if (!string.IsNullOrEmpty(placeProvider.CompanyName)) { toUpdate.CompanyName = placeProvider.CompanyName; } if (!string.IsNullOrEmpty(placeProvider.Country)) { toUpdate.Country = placeProvider.Country; } if (!string.IsNullOrEmpty(placeProvider.CSS)) { toUpdate.CSS = placeProvider.CSS; } if (!string.IsNullOrEmpty(placeProvider.Logo)) { toUpdate.Logo = placeProvider.Logo; } if (!string.IsNullOrEmpty(placeProvider.MainContact)) { toUpdate.MainContact = placeProvider.MainContact; } if (!string.IsNullOrEmpty(placeProvider.MainEmail)) { toUpdate.MainEmail = placeProvider.MainEmail; } if (!string.IsNullOrEmpty(placeProvider.PrivatePhone)) { toUpdate.PrivatePhone = placeProvider.PrivatePhone; } if (!string.IsNullOrEmpty(placeProvider.PublicEmail)) { toUpdate.PublicEmail = placeProvider.PublicEmail; } if (!string.IsNullOrEmpty(placeProvider.PublicPhone)) { toUpdate.PublicPhone = placeProvider.PublicPhone; } if (!string.IsNullOrEmpty(placeProvider.VAT)) { toUpdate.VAT = placeProvider.VAT; } if (!string.IsNullOrEmpty(placeProvider.Web)) { toUpdate.Web = placeProvider.Web; } if (!string.IsNullOrEmpty(placeProvider.SupportEmail)) { toUpdate.SupportEmail = placeProvider.SupportEmail; } if (!string.IsNullOrEmpty(placeProvider.SupportName)) { toUpdate.SupportName = placeProvider.SupportName; } if (!string.IsNullOrEmpty(placeProvider.SupportPhone)) { toUpdate.SupportPhone = placeProvider.SupportPhone; } return(Ok(await placeProviderRepository.SetPlaceProvider(toUpdate))); } catch (ArgumentException exc) { logger.LogError(exc.Message); return(BadRequest(new ProblemDetails() { Detail = exc.Message })); } catch (Exception exc) { logger.LogError(exc, exc.Message); return(BadRequest(new ProblemDetails() { Detail = exc.Message })); } }
/// <summary> /// Downloads the visitors from eHealth /// </summary> /// <param name="placeProviderId"></param> /// <param name="managerEmail"></param> /// <param name="day"></param> /// <param name="visitorRepository"></param> /// <param name="placeRepository"></param> /// <param name="placeProviderRepository"></param> /// <param name="slotRepository"></param> /// <param name="loggerFactory"></param> /// <returns></returns> public async Task <int> DownloadEHealthVisitors( string placeProviderId, string managerEmail, DateTimeOffset day, IVisitorRepository visitorRepository, IPlaceRepository placeRepository, IPlaceProviderRepository placeProviderRepository, ISlotRepository slotRepository, ILoggerFactory loggerFactory ) { var logger = loggerFactory.CreateLogger <MojeEZdravieAbstract>(); logger.LogInformation($"eHealth: Downloading {placeProviderId} {managerEmail} {day}"); var rPlaces = (await placeRepository.ListAll())?.Where(p => p.PlaceProviderId == placeProviderId); if (rPlaces == null || !rPlaces.Any()) { throw new Exception("This place provider does not have any place defined"); } var pp = await placeProviderRepository.GetPlaceProvider(placeProviderId); var product = pp.Products.FirstOrDefault(pr => pr.EHealthDefault == true); if (product == null) { product = pp.Products.FirstOrDefault(); } int ret = 0; var data = await MakeSurePlaceProviderIsAuthenticated(placeProviderId, placeProviderRepository); var token = data.LoginPayload.Session.Token; var places = await DriveInQueue(token, day); if (places.Payload == null) { throw new Exception("No places found"); } foreach (var place in places.Payload) { var rPlace = rPlaces.FirstOrDefault(p => p.EHealthId == place.Id); if (rPlace == null) { rPlace = rPlaces.FirstOrDefault(); } var list = await PlaceDetail(token, day, place.Id); foreach (var person in list.Payload) { if (!person.DesignatedDriveinScheduledAt.HasValue) { continue; } if (string.IsNullOrEmpty(person.BirthNumber?.FormatDocument())) { continue; } var slot = await slotRepository.GetCurrentSlot(rPlace.Id, person.DesignatedDriveinScheduledAt.Value); var documentClear = person.BirthNumber.FormatDocument(); var existing = await visitorRepository.GetVisitorByPersonalNumber(documentClear, true); if (existing != null && existing.ChosenPlaceId == rPlace.Id && existing.ChosenSlot == slot.SlotId) { continue; // already exists } var visitor = new Visitor() { ChosenSlot = slot.SlotId, ChosenPlaceId = rPlace.Id, Product = product.Id, FirstName = person.FirstName, LastName = person.LastName, RC = person.BirthNumber, Insurance = person.HealthInsuranceCompany, PersonTrackingNumber = person.PersonTrackingNumber, Gender = person.Gender, Street = person.Street, StreetNo = person.StreetNumber, City = person.City, ZIP = person.PostalCode, Phone = person.PrimaryPhone, Language = "sk", Result = TestResult.NotTaken, DownloadedAt = DateTimeOffset.UtcNow }; var newRegistration = await visitorRepository.Register(visitor, managerEmail, false); logger.LogInformation($"eHealth: Visitor downloaded {visitor.Id} {visitor.RC.GetSHA256Hash()}"); ret++; } } return(ret); }
public async Task <ActionResult <Visitor> > Register([FromBody] Visitor visitor) { try { if (visitor is null) { throw new ArgumentNullException(nameof(visitor)); } if (!string.IsNullOrEmpty(configuration["googleReCaptcha:SiteKey"])) { if (string.IsNullOrEmpty(visitor.Token)) { throw new Exception("Please provide captcha"); } var validation = await captchaValidator.IsCaptchaPassedAsync(visitor.Token); if (!validation) { throw new Exception("Please provide valid captcha"); } visitor.Token = ""; } var time = new DateTimeOffset(visitor.ChosenSlot, TimeSpan.Zero); if (time.AddMinutes(10) < DateTimeOffset.Now) { throw new Exception("Na tento termín sa nedá zaregistrovať pretože časový úsek je už ukončený"); } if (string.IsNullOrEmpty(visitor.Address)) { visitor.Address = $"{visitor.Street} {visitor.StreetNo}, {visitor.ZIP} {visitor.City}"; } if (visitor.PersonType == "foreign") { if (string.IsNullOrEmpty(visitor.Passport)) { throw new Exception("Zadajte číslo cestovného dokladu prosím"); } } else { if (string.IsNullOrEmpty(visitor.RC)) { throw new Exception("Zadajte rodné číslo prosím"); } } if (string.IsNullOrEmpty(visitor.Street)) { throw new Exception("Zadajte ulicu trvalého bydliska prosím"); } if (string.IsNullOrEmpty(visitor.StreetNo)) { throw new Exception("Zadajte číslo domu trvalého bydliska prosím"); } if (string.IsNullOrEmpty(visitor.ZIP)) { throw new Exception("Zadajte PSČ trvalého bydliska prosím"); } if (string.IsNullOrEmpty(visitor.City)) { throw new Exception("Zadajte mesto trvalého bydliska prosím"); } if (string.IsNullOrEmpty(visitor.FirstName)) { throw new Exception("Zadajte svoje meno prosím"); } if (string.IsNullOrEmpty(visitor.LastName)) { throw new Exception("Zadajte svoje priezvisko prosím"); } if (!visitor.BirthDayYear.HasValue || visitor.BirthDayYear < 1900 || visitor.BirthDayYear > 2021) { throw new Exception("Rok Vášho narodenia vyzerá byť chybne vyplnený"); } if (!visitor.BirthDayDay.HasValue || visitor.BirthDayDay < 1 || visitor.BirthDayDay > 31) { throw new Exception("Deň Vášho narodenia vyzerá byť chybne vyplnený"); } if (!visitor.BirthDayMonth.HasValue || visitor.BirthDayMonth < 1 || visitor.BirthDayMonth > 12) { throw new Exception("Mesiac Vášho narodenia vyzerá byť chybne vyplnený"); } visitor.RegistrationTime = DateTimeOffset.UtcNow; visitor.SelfRegistration = true; var place = await placeRepository.GetPlace(visitor.ChosenPlaceId); if (place == null) { throw new Exception("Vybrané miesto nebolo nájdené"); } visitor.PlaceProviderId = place.PlaceProviderId; PlaceProduct placeProduct = null; try { placeProduct = await placeRepository.GetPlaceProduct(visitor.Product); } catch { } Product product = null; try { if (placeProduct == null) { product = await placeProviderRepository.GetProduct(place.PlaceProviderId, visitor.Product); } } catch { } if (product == null && placeProduct == null) { throw new Exception("Vybraná služba nebola nájdená"); } //logger.LogInformation($"EmployeesRegistration: {product.EmployeesRegistration}"); if (placeProduct?.EmployeesRegistration == true || product?.EmployeesRegistration == true) { logger.LogInformation($"EmployeesRegistration 2: {visitor.EmployeeId}"); if (string.IsNullOrEmpty(visitor.EmployeeId)) { throw new Exception("Zadajte prosím osobné číslo zamestnanca"); } var pp = await placeProviderRepository.GetPlaceProvider(place.PlaceProviderId); if (pp == null) { throw new Exception("Miesto má nastavené chybnú spoločnosť. Prosím kontaktujte podporu s chybou 0x021561"); } var hash = visitorRepository.MakeCompanyPeronalNumberHash(pp.CompanyId, visitor.EmployeeId); var regId = await visitorRepository.GetRegistrationIdFromHashedId(hash); var reg = await visitorRepository.GetRegistration(regId); logger.LogInformation($"EmployeesRegistration 3: {hash} {regId} {reg?.Id}"); if (reg == null) { throw new Exception("Zadajte prosím platné osobné číslo zamestnanca"); } var rc = reg.RC ?? ""; if (rc.Length > 4) { rc = rc.Substring(rc.Length - 4); } logger.LogInformation($"EmployeesRegistration 4: {rc}"); if (string.IsNullOrEmpty(visitor.RC) || !visitor.RC.EndsWith(rc)) { throw new Exception("Časť poskytnutého rodného čísla od zamestnávateľa vyzerá byť rozdielna od čísla zadaného v registračnom formulári"); } } return(Ok(await visitorRepository.Register(visitor, "", true))); } catch (ArgumentException exc) { logger.LogError(exc.Message); return(BadRequest(new ProblemDetails() { Detail = exc.Message })); } catch (Exception exc) { logger.LogError(exc, exc.Message); return(BadRequest(new ProblemDetails() { Detail = exc.Message })); } }