forked from MDCPS/DamageAssessment_Backend
added excel export and removed random number
This commit is contained in:
@ -0,0 +1,56 @@
|
||||
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();
|
||||
Uri linkUri = new Uri(attachments[1]);
|
||||
worksheet.Cells[row, col].Hyperlink = linkUri;
|
||||
worksheet.Cells[row, col].Value = attachments[0];
|
||||
worksheet.Cells[row, col].Style.Font.UnderLine = true;
|
||||
}
|
||||
else
|
||||
worksheet.Cells[row, col].Value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -3,6 +3,9 @@ using DamageAssesment.Api.Responses.Db;
|
||||
using DamageAssesment.Api.Responses.Interfaces;
|
||||
using DamageAssesment.Api.Responses.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace DamageAssesment.Api.Responses.Providers
|
||||
{
|
||||
@ -43,7 +46,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();
|
||||
}
|
||||
}
|
||||
@ -111,7 +113,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
|
||||
@ -120,9 +122,9 @@ namespace DamageAssesment.Api.Responses.Providers
|
||||
//get all the survey that already taken by the employee
|
||||
var surveys = await surveyServiceProvider.getSurveysAsync(language);
|
||||
surveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now).ToList();
|
||||
if (employeeid==null || employeeid==0)
|
||||
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();
|
||||
List<int> listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid.Value).Select(y => y.SurveyId).ToListAsync();
|
||||
var activeSurveys = surveys.Where(s => !listOfsurveysId.Contains(s.Id));
|
||||
return (true, activeSurveys, null);
|
||||
}
|
||||
@ -142,10 +144,9 @@ namespace DamageAssesment.Api.Responses.Providers
|
||||
var surveys = await surveyServiceProvider.getSurveysAsync(language);
|
||||
// returning only historic data: end date is less than current date.
|
||||
surveys = surveys.Where(s => s.EndDate < DateTime.Now).ToList();
|
||||
if(employeeid==null|| employeeid==0)
|
||||
if (employeeid == null || employeeid == 0)
|
||||
return (true, surveys, null);
|
||||
var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
|
||||
|
||||
var historicSurveys = from s in surveys
|
||||
from r in surveyResponses
|
||||
where s.Id == r.SurveyId
|
||||
@ -308,6 +309,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)
|
||||
{
|
||||
@ -488,7 +509,7 @@ namespace DamageAssesment.Api.Responses.Providers
|
||||
{
|
||||
var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId);
|
||||
var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id);
|
||||
var allQuestions = await questionServiceProvider.getQuestionsAsync();
|
||||
var allQuestions = await questionServiceProvider.getQuestionsAsync(null);
|
||||
var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId);
|
||||
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
|
||||
|
||||
@ -544,7 +565,7 @@ namespace DamageAssesment.Api.Responses.Providers
|
||||
}
|
||||
|
||||
var answers = await answerServiceProvider.getAnswersAsync();
|
||||
var questions = await questionServiceProvider.getQuestionsAsync();
|
||||
var questions = await questionServiceProvider.getQuestionsAsync(null);
|
||||
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
|
||||
|
||||
//var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId);
|
||||
@ -650,7 +671,7 @@ namespace DamageAssesment.Api.Responses.Providers
|
||||
|
||||
|
||||
var answers = await answerServiceProvider.getAnswersAsync();
|
||||
var questions = await questionServiceProvider.getQuestionsAsync();
|
||||
var questions = await questionServiceProvider.getQuestionsAsync(null);
|
||||
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
|
||||
|
||||
var result = from r in surveyResonses
|
||||
@ -687,7 +708,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();
|
||||
var Locations = await locationServiceProvider.getLocationsAsync();
|
||||
var regions = await regionServiceProvider.getRegionsAsync();
|
||||
var questions = await questionServiceProvider.getQuestionsAsync(language);
|
||||
var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language);
|
||||
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
|
||||
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)
|
||||
@ -784,7 +934,7 @@ namespace DamageAssesment.Api.Responses.Providers
|
||||
}
|
||||
|
||||
var answers = await answerServiceProvider.getAnswersAsync();
|
||||
var questions = await questionServiceProvider.getQuestionsAsync();
|
||||
var questions = await questionServiceProvider.getQuestionsAsync(null);
|
||||
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
|
||||
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
|
||||
|
||||
|
Reference in New Issue
Block a user