/// <summary> /// Send visitor registered in rychlejsie or downloaded from eHealth to eHealth system /// /// Returns true if successful, False or Exception if not successful /// </summary> /// <param name="visitor"></param> /// <param name="placeProviderId"></param> /// <param name="placeProviderRepository"></param> /// <param name="configuration"></param> /// <returns></returns> public async Task <bool> SendResultToEHealth( Visitor visitor, string placeProviderId, IPlaceProviderRepository placeProviderRepository, IConfiguration configuration ) { await SendResultToEHealth(visitor); var data = await MakeSurePlaceProviderIsAuthenticated(placeProviderId, placeProviderRepository); if (visitor.PersonType == "foreign") { throw new Exception("Only residents supported right now"); } // session is valid if (string.IsNullOrEmpty(visitor.RC)) { throw new Exception("Error - invalid personal number"); } var check = await this.CheckPerson(data.LoginPayload.Session.Token, visitor.RC); if (check?.CfdId > 0) { // ok } else { if (configuration["AllowEHealthRegistration"] != "1") { return(false); } var personData = await RegisterPerson(data.LoginPayload.Session.Token, RegisterPersonRequest.FromVisitor(visitor, data.LoginPayload)); check = await this.CheckPerson(data.LoginPayload.Session.Token, visitor.RC); if (check?.CfdId > 0) { // ok } else { throw new Exception("Unable to process visitor in ehealth - not found in search"); } } var driveIn = await DriveInQueue(data.LoginPayload.Session.Token, DateTimeOffset.Now); var place = driveIn.Payload.OrderByDescending(p => p.DailyCapacity).FirstOrDefault(); var t = DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss"); var input = new DriveInRequest() { DesignatedDriveinCity = place.City, DesignatedDriveinId = place.Id, DesignatedDriveinLatitude = place.Latitude, DesignatedDriveinLongitude = place.Longitude, DesignatedDriveinScheduledAt = t, DesignatedDriveinStreetName = place.StreetName, DesignatedDriveinStreetNumber = place.StreetNumber, DesignatedDriveinTitle = place.Title, DesignatedDriveinZipCode = place.ZipCode, MedicalAssessedAt = t, State = "SD", Triage = "2", }; var addPersonToPlace = await AddPersonToTestingPlace(data.LoginPayload.Session.Token, check.CfdId, input); if (addPersonToPlace != "1") { throw new Exception("Unexpected error returned while adding person to place"); } string result; switch (visitor.Result) { case TestResult.PositiveWaitingForCertificate: case TestResult.PositiveCertificateTaken: result = "POSITIVE"; break; case TestResult.NegativeWaitingForCertificate: case TestResult.NegativeCertificateTaken: case TestResult.NegativeCertificateTakenTypo: result = "NEGATIVE"; break; default: throw new Exception($"Unable to determine state: {visitor.Result}"); } var setResultRequest = new CovidMassTesting.Model.EZdravie.Request.SetResultRequest() { Id = 0, UserId = data.LoginPayload.User.Id, CovidFormDataId = check.CfdId, FinalResult = result, ScreeningFinalResult = result, SpecimenId = visitor.TestingSet, SpecimenCollectedAt = visitor.TestingTime.Value.ToString("yyyy-MM-dd HH:mm:ss"), ScreeningEndedAt = visitor.TestResultTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? visitor.TestingTime.Value.ToString("yyyy-MM-dd HH:mm:ss"), }; var setResult = await SetTestResultToPerson(data.LoginPayload.Session.Token, setResultRequest); return(setResult[0][0].HttpStatusCode == 200); }
public abstract Task <string> AddPersonToTestingPlace(string token, int cfid, DriveInRequest request);
public override async Task <string> AddPersonToTestingPlace(string token, int cfid, DriveInRequest driveInRequest) { var request = new RestSharp.RestRequest($"api/covid_form_data/{cfid}", RestSharp.Method.PUT, RestSharp.DataFormat.Json); request.AddHeader("Authorization", $"Bearer {token}"); //request.AddJsonBody(driveInRequest); var body = Serialize(driveInRequest); request.AddParameter("application/json", body, ParameterType.RequestBody); await Task.Delay(500); logger.LogInformation($"eHealth: AddPersonToTestingPlace {cfid}"); var response = await client.ExecuteAsync(request); if (!response.IsSuccessful) { throw new Exception(response.Content); } return(response.Content); }