forked from MDCPS/DamageAssessment_Backend
		
	Docker Azure sync with latest changes
This commit is contained in:
		| @ -0,0 +1,62 @@ | ||||
| using ClosedXML.Excel; | ||||
| using DamageAssesment.Api.Responses.Interfaces; | ||||
| using DamageAssesment.Api.Responses.Models; | ||||
| using OfficeOpenXml; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace DamageAssesment.Api.Responses.Providers | ||||
| { | ||||
|     public class ExcelExportService: IExcelExportService | ||||
|     { | ||||
|         public byte[] ExportToExcel<T1>(List<object> responses) | ||||
|         {  | ||||
|             ExcelPackage.LicenseContext = LicenseContext.NonCommercial; | ||||
|             using (var package = new ExcelPackage()) | ||||
|             { | ||||
|                 // Create the first worksheet and populate it with responses | ||||
|                 var workSheet1 = package.Workbook.Worksheets.Add("responses"); | ||||
|                 PopulateWorksheet(workSheet1, responses); | ||||
|                 return package.GetAsByteArray(); | ||||
|             } | ||||
|         } | ||||
|         private void PopulateWorksheet(ExcelWorksheet worksheet, List<object> data) | ||||
|         { | ||||
|             if (data.Count > 0) | ||||
|             { | ||||
|                 var properties = data[0].GetType().GetProperties(); | ||||
|                 List<int> IsAttchments = new List<int>(); | ||||
|                 // Add column headers | ||||
|                 for (int col = 1; col <= properties.Length; col++) | ||||
|                 { | ||||
|                     worksheet.Cells[1, col].Value = properties[col - 1].Name; | ||||
|                     if(properties[col - 1].Name.ToLower().Contains("attachment")) | ||||
|                         IsAttchments.Add(col); | ||||
|                 } | ||||
|  | ||||
|                 // Add data | ||||
|                 for (int row = 2; row <= data.Count + 1; row++) | ||||
|                 { | ||||
|                     for (int col = 1; col <= properties.Length; col++) | ||||
|                     { | ||||
|                         | ||||
|                             string value = Convert.ToString(properties[col - 1].GetValue(data[row - 2])); | ||||
|                         if (IsAttchments.Where(a => a == col).Count() > 0 && !string.IsNullOrEmpty(value)) | ||||
|                         { | ||||
|                             List<string> attachments = value.Split("##").ToList(); | ||||
|                             try | ||||
|                             { | ||||
|                                 Uri linkUri = new Uri(attachments[1]); | ||||
|                                 worksheet.Cells[row, col].Value = attachments[0]; | ||||
|                                 worksheet.Cells[row, col].Style.Font.UnderLine = true; | ||||
|                             } | ||||
|                             catch { worksheet.Cells[row, col].Value = attachments[1]; } | ||||
|                         } | ||||
|                         else | ||||
|                             worksheet.Cells[row, col].Value = value; | ||||
|                          | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -2,7 +2,11 @@ | ||||
| using DamageAssesment.Api.Responses.Db; | ||||
| using DamageAssesment.Api.Responses.Interfaces; | ||||
| using DamageAssesment.Api.Responses.Models; | ||||
| using DamageAssesment.Api.Responses.Services; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Microsoft.EntityFrameworkCore.Metadata.Internal; | ||||
| using System.Reflection; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace DamageAssesment.Api.Responses.Providers | ||||
| { | ||||
| @ -57,7 +61,6 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|                 // Create and save SurveyResponse records with references to existing Employee and Location records | ||||
|                 surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 1, LocationId = 1, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); | ||||
|                 surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 2, LocationId = 2, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); | ||||
|  | ||||
|                 surveyResponseDbContext.SaveChanges(); | ||||
|             } | ||||
|         } | ||||
| @ -125,6 +128,7 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|                 return (false, null, ex.Message); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public async Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language) | ||||
|         { | ||||
|             try | ||||
| @ -132,7 +136,7 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|                 logger?.LogInformation("Querying to get SurveyResponse object from DB"); | ||||
|                 //get all the survey that already taken by the employee | ||||
|                 var surveys = await surveyServiceProvider.getSurveysAsync(language, token); | ||||
|                 surveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now).ToList(); | ||||
|                 surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList(); | ||||
|                 if (employeeid == null || employeeid == 0) | ||||
|                     return (true, surveys, null); | ||||
|                 List<int> listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid.Value).Select(y => y.SurveyId).ToListAsync(); | ||||
| @ -152,9 +156,9 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|             { | ||||
|                 logger?.LogInformation("Querying to get SurveyResponse object from DB"); | ||||
|  | ||||
|                 var surveys = await surveyServiceProvider.getSurveysAsync(language,token); | ||||
|                 var surveys = await surveyServiceProvider.getSurveysAsync(language, token); | ||||
|                 // returning only historic data: end date is less than current date. | ||||
|                 surveys = surveys.Where(s => s.EndDate < DateTime.Now).ToList(); | ||||
|                 surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList(); | ||||
|                 if (employeeid == null || employeeid == 0) | ||||
|                     return (true, surveys, null); | ||||
|                 var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); | ||||
| @ -177,7 +181,7 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|             try | ||||
|             { | ||||
|                 logger?.LogInformation("Querying to get Survey object from microservice"); | ||||
|                 var survey = await surveyServiceProvider.getSurveyAsync(surveyId,token); | ||||
|                 var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token); | ||||
|  | ||||
|                 if (survey != null) | ||||
|                 { | ||||
| @ -271,7 +275,7 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|             { | ||||
|                 logger?.LogInformation("Querying to get Survey object from microservice"); | ||||
|                 var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token); | ||||
|                 var question = await questionServiceProvider.getQuestionsAsync(questionId,token); | ||||
|                 var question = await questionServiceProvider.getQuestionsAsync(questionId, token); | ||||
|                 bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false; | ||||
|  | ||||
|  | ||||
| @ -320,6 +324,26 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|                 return (false, null, ex.Message); | ||||
|             } | ||||
|         } | ||||
|         public async Task<(bool IsSuccess, List<object> surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(int surveyId, string language, bool isadmin) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 var responses = await getAllSurveyResponsesExcelAsync(surveyId, language, isadmin); | ||||
|  | ||||
|                 if (responses != null) | ||||
|                     return (true, responses, "Request Successful."); | ||||
|                 else | ||||
|                 { | ||||
|                     responses = null; | ||||
|                     return (true, responses, "Empty object returned"); | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 logger?.LogError(ex.ToString()); | ||||
|                 return (false, null, ex.Message); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse) | ||||
|         { | ||||
| @ -500,7 +524,7 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|             { | ||||
|                 var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId, token); | ||||
|                 var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id, token); | ||||
|                 var allQuestions = await questionServiceProvider.getQuestionsAsync(token); | ||||
|                 var allQuestions = await questionServiceProvider.getQuestionsAsync(null, token); | ||||
|                 var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId); | ||||
|                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); | ||||
|  | ||||
| @ -541,10 +565,22 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 var surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync(); | ||||
|                 var employees = await employeeServiceProvider.getEmployeesAsync(token); | ||||
|                 List<Db.SurveyResponse> surveyResonses = null; | ||||
|                 Employee employee = null; | ||||
|                 List<Employee> employees = null; | ||||
|                 if (employeeid == 0) | ||||
|                 { | ||||
|                     surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync(); | ||||
|                     employees = await employeeServiceProvider.getEmployeesAsync(token); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync(); | ||||
|                     employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token); | ||||
|                 } | ||||
|  | ||||
|                 var answers = await answerServiceProvider.getAnswersAsync(token); | ||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(token); | ||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(null, token); | ||||
|                 var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; | ||||
|  | ||||
|                 //var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId); | ||||
| @ -612,7 +648,7 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|  | ||||
|  | ||||
|                 var answers = await answerServiceProvider.getAnswersAsync(token); | ||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(token); | ||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(null, token); | ||||
|                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); | ||||
|  | ||||
|                 var result = from r in surveyResonses | ||||
| @ -647,7 +683,136 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|                 return null; | ||||
|             } | ||||
|         } | ||||
|         //Method to get All Survey Responses for excel export | ||||
|         private async Task<List<object>> getAllSurveyResponsesExcelAsync(int surveyId, string language, bool isadmin) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 if (string.IsNullOrEmpty(language)) language = "en"; | ||||
|                 List<Db.SurveyResponse> surveyResonses; | ||||
|                 surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync(); | ||||
|                 var answers = await answerServiceProvider.getAnswersAsync(token); | ||||
|                 var Locations = await locationServiceProvider.getLocationsAsync(token); | ||||
|                 var regions = await regionServiceProvider.getRegionsAsync(token); | ||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(language, token); | ||||
|                 var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language, token); | ||||
|                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); | ||||
|                 List<object> questionLists = new List<object>(); | ||||
|                 var allques = from res in surveyResonses | ||||
|                               join loc in Locations on res.LocationId equals loc.Id | ||||
|                               join reg in regions on loc.RegionId equals reg.Id | ||||
|                               join ans in answers on res.Id equals ans.SurveyResponseId | ||||
|                               join q in questions on ans.QuestionId equals q.Id | ||||
|                               join qc in categories on q.CategoryId equals qc.Id | ||||
|                               select new | ||||
|                               { | ||||
|                                   responseId = res.Id, | ||||
|                                   questionId = q.Id, | ||||
|                                   QuestionNumber = q.QuestionNumber, | ||||
|                                   Category = JsonSerializer.Deserialize<Dictionary<string, string>>(qc.Titles.ToString())[language], | ||||
|                                   question = q.Text[language], | ||||
|                                   answerId = ans.Id, | ||||
|                                   AnswerText = ans.AnswerText, | ||||
|                                   Comment = ans.Comment, | ||||
|                                   Location = loc.LocationCode, | ||||
|                                   school = loc.Name, | ||||
|                                   Region = reg.Name, | ||||
|                                   MC = loc.MaintenanceCenter, | ||||
|                                   ResponseDate = res.CreatedDate, | ||||
|                                   EmployeeId = res.EmployeeId, | ||||
|                                   ClientDevice = res.ClientDevice, | ||||
|                                   Attachments = attachments.Where(a => a.AnswerId == ans.Id).Select(a => a.FileName + "##" + a.URI).ToList() | ||||
|                               }; | ||||
|                 List<object> allresoponses = new List<object>(); | ||||
|                 foreach (var item in allques) | ||||
|                 { | ||||
|  | ||||
|                     List<string> ansattachments = item.Attachments.ToList(); | ||||
|  | ||||
|                     //// Initialize the attachment dictionary | ||||
|                     //var attachmentsobject = new Dictionary<string, string>(); | ||||
|                     //for (int i = 0; i < ansattachments.Count; i++) | ||||
|                     //{ | ||||
|                     //    attachmentsobject["Attachment"+(i+1).ToString()] = ansattachments[i]; | ||||
|                     //} | ||||
|  | ||||
|  | ||||
|                     string[] variables = new string[5]; | ||||
|                     for (int i = 0; i < 5; i++) // Assuming you want to assign 5 values | ||||
|                     { | ||||
|                         if (i < ansattachments.Count()) | ||||
|                         { | ||||
|                             variables[i] = ansattachments[i]; | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             variables[i] = string.Empty; // or null, or any other default value | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     // Now, you can access the values using the variables | ||||
|                     string att1 = variables[0], att2 = variables[1], att3 = variables[2], att4 = variables[3], att5 = variables[4]; | ||||
|                     object response; | ||||
|                     if (isadmin) | ||||
|                     { | ||||
|                         response = new | ||||
|                         { | ||||
|                             SurveyQuestion = item.question, | ||||
|                             Answer = item.AnswerText, | ||||
|                             Category = item.Category, | ||||
|                             School = item.school, | ||||
|                             Location = item.Location, | ||||
|                             Region = item.Region, | ||||
|                             MC = item.MC, | ||||
|                             ResponseDate = item.ResponseDate.ToString(), | ||||
|                             Notes = item.Comment, | ||||
|                             Attachment1 = att1, | ||||
|                             Attachment2 = att2, | ||||
|                             Attachment3 = att3, | ||||
|                             Attachment4 = att4, | ||||
|                             Attachment5 = att5, | ||||
|                             User = item.EmployeeId, | ||||
|                             DeviceType = item.ClientDevice, | ||||
|                             Reference = item.responseId | ||||
|                         }; | ||||
|                         // Add the attachment dictionary to the response object | ||||
|                         // response = new { response, Attachments = attachments }; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         response = new | ||||
|                         { | ||||
|                             SurveyQuestion = item.question, | ||||
|                             Answer = item.AnswerText, | ||||
|                             Category = item.Category, | ||||
|                             School = item.school, | ||||
|                             Location = item.Location, | ||||
|                             Region = item.Region, | ||||
|                             MC = item.MC, | ||||
|                             ResponseDate = item.ResponseDate.ToString(), | ||||
|                             Notes = item.Comment, | ||||
|                             Attachment1 = att1, | ||||
|                             Attachment2 = att2, | ||||
|                             Attachment3 = att3, | ||||
|                             Attachment4 = att4, | ||||
|                             Attachment5 = att5 | ||||
|                         }; | ||||
|  | ||||
|                         // Add the attachment dictionary to the response object | ||||
|                         //  response = new { response, Attachments = attachments }; | ||||
|                     } | ||||
|                     allresoponses.Add(response); | ||||
|                 } | ||||
|                 return allresoponses; | ||||
|  | ||||
|  | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 logger?.LogError($"Exception Found : {ex.Message} - Ref: SurveyResponsesProvider.getSurveyResponseBySurveyIdAsync()"); | ||||
|                 return null; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         //Method to get Answers By Maintenance Center by surveyId | ||||
|         private async Task<dynamic> getResultsByMaintenanceCenterAsync(int surveyId, int employeeid) | ||||
| @ -744,7 +909,7 @@ namespace DamageAssesment.Api.Responses.Providers | ||||
|                 } | ||||
|  | ||||
|                 var answers = await answerServiceProvider.getAnswersAsync(token); | ||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(token); | ||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(null, token); | ||||
|                 var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; | ||||
|                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user