Exemplo n.º 1
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
                }));
            }
        }