Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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,
            });
        }
Пример #3
0
        /// <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,
            });
        }
Пример #4
0
        /// <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 }));
        }
Пример #5
0
        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
                }));
            }
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        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
                }));
            }
        }