Merged PR 56: fixed survey issue in response level, and added logic for start and end date...

fixed survey issue in response level, and added logic for start and end date as optional date.
This commit is contained in:
Uppu, Vijay 2023-11-01 18:34:47 +00:00
commit 17cd993a56
8 changed files with 85 additions and 65 deletions

View File

@ -218,16 +218,16 @@ namespace DamageAssesment.Api.Responses.Controllers
return NoContent(); return NoContent();
} }
/// <summary> /// <summary>
/// Export surveys based on role . /// Export all survey response data based on survey id.
/// </summary> /// </summary>
[HttpGet] [HttpGet]
[Route("responses/surveys/export/{surveyid}")]
[Route("responses/surveys/export")] public async Task<ActionResult> GetExcelSurveysAsync(int surveyid, string language, bool IsAdmin = false)
public async Task<ActionResult> GetExcelSurveysAsync(string language,bool IsAdmin=false)
{ {
var result = await this.surveyResponseProvider.ExportSurveyResponsesAsync(language, IsAdmin); var result = await this.surveyResponseProvider.ExportSurveyResponsesAsync(surveyid, language, IsAdmin);
if (result.IsSuccess) if (result.IsSuccess && result.surveyResponses.Count > 0)
{ {
byte[] fileContents = excelExportService.ExportToExcel<object>(result.surveyResponses); byte[] fileContents = excelExportService.ExportToExcel<object>(result.surveyResponses);
return File(fileContents, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "data.xlsx"); return File(fileContents, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "data.xlsx");
//return Ok(result.Surveys); //return Ok(result.Surveys);

View File

@ -9,7 +9,7 @@ namespace DamageAssesment.Api.Responses.Interfaces
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse);
// Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId); // Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId);
Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(int employeeid); Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(int employeeid);
Task<(bool IsSuccess, List<object> surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(string language,bool IsAdmin); Task<(bool IsSuccess, List<object> surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(int surveyId, string language, bool IsAdmin);
Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language); Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language);
Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int? employeeid, string language); Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int? employeeid, string language);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse);

View File

@ -2,13 +2,20 @@
namespace DamageAssesment.Api.Responses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public enum SurveyStatus
{
PENDING,
ACTIVE,
INACTIVE
}
public class Survey public class Survey
{ {
public int Id { get; set; } public int Id { get; set; }
public bool IsEnabled { get; set; } public bool IsEnabled { get; set; }
public DateTime StartDate { get; set; } public DateTime? StartDate { get; set; }
public DateTime EndDate { get; set; } public DateTime? EndDate { get; set; }
public DateTime CreatedDate { get; set; } public DateTime CreatedDate { get; set; }
public string Status { get; set; }
public Dictionary<string, string> Titles { get; set; } public Dictionary<string, string> Titles { get; set; }
} }
} }

View File

@ -38,17 +38,22 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
for (int col = 1; col <= properties.Length; col++) 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)) 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(); List<string> attachments = value.Split("##").ToList();
Uri linkUri = new Uri(attachments[1]); try
worksheet.Cells[row, col].Hyperlink = linkUri; {
worksheet.Cells[row, col].Value = attachments[0]; Uri linkUri = new Uri(attachments[1]);
worksheet.Cells[row, col].Style.Font.UnderLine = true; worksheet.Cells[row, col].Value = attachments[0];
worksheet.Cells[row, col].Style.Font.UnderLine = true;
}
catch { worksheet.Cells[row, col].Value = attachments[1]; }
} }
else else
worksheet.Cells[row, col].Value = value; worksheet.Cells[row, col].Value = value;
} }
} }
} }

View File

@ -121,7 +121,7 @@ namespace DamageAssesment.Api.Responses.Providers
logger?.LogInformation("Querying to get SurveyResponse object from DB"); logger?.LogInformation("Querying to get SurveyResponse object from DB");
//get all the survey that already taken by the employee //get all the survey that already taken by the employee
var surveys = await surveyServiceProvider.getSurveysAsync(language); var surveys = await surveyServiceProvider.getSurveysAsync(language);
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) if (employeeid == null || employeeid == 0)
return (true, surveys, null); 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();
@ -143,7 +143,7 @@ namespace DamageAssesment.Api.Responses.Providers
var surveys = await surveyServiceProvider.getSurveysAsync(language); var surveys = await surveyServiceProvider.getSurveysAsync(language);
// returning only historic data: end date is less than current date. // 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) if (employeeid == null || employeeid == 0)
return (true, surveys, null); return (true, surveys, null);
var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
@ -309,11 +309,11 @@ namespace DamageAssesment.Api.Responses.Providers
return (false, null, ex.Message); return (false, null, ex.Message);
} }
} }
public async Task<(bool IsSuccess, List<object> surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(string language,bool isadmin) public async Task<(bool IsSuccess, List<object> surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(int surveyId, string language, bool isadmin)
{ {
try try
{ {
var responses = await getAllSurveyResponsesExcelAsync(language, isadmin); var responses = await getAllSurveyResponsesExcelAsync(surveyId, language, isadmin);
if (responses != null) if (responses != null)
return (true, responses, "Request Successful."); return (true, responses, "Request Successful.");
@ -709,13 +709,13 @@ namespace DamageAssesment.Api.Responses.Providers
} }
} }
//Method to get All Survey Responses for excel export //Method to get All Survey Responses for excel export
private async Task<List<object>> getAllSurveyResponsesExcelAsync(string language,bool isadmin) private async Task<List<object>> getAllSurveyResponsesExcelAsync(int surveyId, string language, bool isadmin)
{ {
try try
{ {
if (string.IsNullOrEmpty(language)) language = "en"; if (string.IsNullOrEmpty(language)) language = "en";
List<Db.SurveyResponse> surveyResonses; List<Db.SurveyResponse> surveyResonses;
surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync();
var answers = await answerServiceProvider.getAnswersAsync(); var answers = await answerServiceProvider.getAnswersAsync();
var Locations = await locationServiceProvider.getLocationsAsync(); var Locations = await locationServiceProvider.getLocationsAsync();
var regions = await regionServiceProvider.getRegionsAsync(); var regions = await regionServiceProvider.getRegionsAsync();
@ -726,33 +726,33 @@ namespace DamageAssesment.Api.Responses.Providers
var allques = from res in surveyResonses var allques = from res in surveyResonses
join loc in Locations on res.LocationId equals loc.Id join loc in Locations on res.LocationId equals loc.Id
join reg in regions on loc.RegionId equals reg.Id join reg in regions on loc.RegionId equals reg.Id
join ans in answers on res.Id equals ans.SurveyResponseId join ans in answers on res.Id equals ans.SurveyResponseId
join q in questions on ans.QuestionId equals q.Id join q in questions on ans.QuestionId equals q.Id
join qc in categories on q.CategoryId equals qc.Id join qc in categories on q.CategoryId equals qc.Id
select new select new
{ {
responseId = res.Id, responseId = res.Id,
questionId = q.Id, questionId = q.Id,
QuestionNumber = q.QuestionNumber, QuestionNumber = q.QuestionNumber,
Category = JsonSerializer.Deserialize<Dictionary<string, string>>(qc.Titles.ToString())[language], Category = JsonSerializer.Deserialize<Dictionary<string, string>>(qc.Titles.ToString())[language],
question = q.Text[language], question = q.Text[language],
answerId = ans.Id, answerId = ans.Id,
AnswerText = ans.AnswerText, AnswerText = ans.AnswerText,
Comment = ans.Comment, Comment = ans.Comment,
Location=loc.LocationCode, Location = loc.LocationCode,
school=loc.Name, school = loc.Name,
Region=reg.Name, Region = reg.Name,
MC=loc.MaintenanceCenter, MC = loc.MaintenanceCenter,
ResponseDate=res.CreatedDate, ResponseDate = res.CreatedDate,
EmployeeId=res.EmployeeId, EmployeeId = res.EmployeeId,
ClientDevice=res.ClientDevice, ClientDevice = res.ClientDevice,
Attachments = attachments.Where(a=>a.AnswerId==ans.Id).Select(a=>a.FileName+"##"+a.URI).ToList() Attachments = attachments.Where(a => a.AnswerId == ans.Id).Select(a => a.FileName + "##" + a.URI).ToList()
}; };
List<object> allresoponses = new List<object>(); List<object> allresoponses = new List<object>();
foreach (var item in allques) foreach (var item in allques)
{ {
List<string> ansattachments=item.Attachments.ToList(); List<string> ansattachments = item.Attachments.ToList();
//// Initialize the attachment dictionary //// Initialize the attachment dictionary
//var attachmentsobject = new Dictionary<string, string>(); //var attachmentsobject = new Dictionary<string, string>();
@ -776,11 +776,11 @@ namespace DamageAssesment.Api.Responses.Providers
} }
// Now, you can access the values using the variables // 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]; string att1 = variables[0], att2 = variables[1], att3 = variables[2], att4 = variables[3], att5 = variables[4];
object response; object response;
if (isadmin) if (isadmin)
{ {
response = new response = new
{ {
SurveyQuestion = item.question, SurveyQuestion = item.question,
Answer = item.AnswerText, Answer = item.AnswerText,
@ -791,12 +791,12 @@ namespace DamageAssesment.Api.Responses.Providers
MC = item.MC, MC = item.MC,
ResponseDate = item.ResponseDate.ToString(), ResponseDate = item.ResponseDate.ToString(),
Notes = item.Comment, Notes = item.Comment,
Attachment1 = att1, Attachment1 = att1,
Attachment2 = att2, Attachment2 = att2,
Attachment3 = att3, Attachment3 = att3,
Attachment4 = att4, Attachment4 = att4,
Attachment5 = att5, Attachment5 = att5,
User = item.EmployeeId, User = item.EmployeeId,
DeviceType = item.ClientDevice, DeviceType = item.ClientDevice,
Reference = item.responseId Reference = item.responseId
}; };
@ -811,7 +811,7 @@ namespace DamageAssesment.Api.Responses.Providers
Answer = item.AnswerText, Answer = item.AnswerText,
Category = item.Category, Category = item.Category,
School = item.school, School = item.school,
Location=item.Location, Location = item.Location,
Region = item.Region, Region = item.Region,
MC = item.MC, MC = item.MC,
ResponseDate = item.ResponseDate.ToString(), ResponseDate = item.ResponseDate.ToString(),
@ -824,7 +824,7 @@ namespace DamageAssesment.Api.Responses.Providers
}; };
// Add the attachment dictionary to the response object // Add the attachment dictionary to the response object
// response = new { response, Attachments = attachments }; // response = new { response, Attachments = attachments };
} }
allresoponses.Add(response); allresoponses.Add(response);
} }

View File

@ -13,9 +13,9 @@ namespace DamageAssesment.Api.Surveys.Db
public bool IsEnabled { get; set; } public bool IsEnabled { get; set; }
public DateTime StartDate { get; set; } public DateTime? StartDate { get; set; }
public DateTime EndDate { get; set; } public DateTime? EndDate { get; set; }
public DateTime CreatedDate { get; set; } = DateTime.Now; public DateTime CreatedDate { get; set; } = DateTime.Now;
/* /*

View File

@ -21,8 +21,8 @@ namespace DamageAssesment.Api.Surveys.Models
{ {
public int Id { get; set; } public int Id { get; set; }
public bool IsEnabled { get; set; } public bool IsEnabled { get; set; }
public DateTime StartDate { get; set; } public DateTime? StartDate { get; set; }
public DateTime EndDate { get; set; } public DateTime? EndDate { get; set; }
public DateTime CreatedDate { get; set; } public DateTime? CreatedDate { get; set; }
} }
} }

View File

@ -85,14 +85,21 @@ namespace DamageAssesment.Api.Surveys.Providers
MultiLanguage = dict; MultiLanguage = dict;
return MultiLanguage; return MultiLanguage;
} }
public string GetStatus(DateTime StartDate,DateTime EndDate) public string GetStatus(DateTime? StartDate,DateTime? EndDate)
{ {
if (StartDate > DateTime.Now) try
return SurveyStatus.PENDING.ToString(); {
else if (StartDate <= DateTime.Now && EndDate > DateTime.Now) if (StartDate > DateTime.Now)
return SurveyStatus.ACTIVE.ToString(); return SurveyStatus.PENDING.ToString();
else else if (StartDate <= DateTime.Now && EndDate > DateTime.Now)
return SurveyStatus.ACTIVE.ToString();
else
return SurveyStatus.INACTIVE.ToString();
}
catch
{
return SurveyStatus.INACTIVE.ToString(); return SurveyStatus.INACTIVE.ToString();
}
} }
// Method to get surveys asynchronously with multi-language support // Method to get surveys asynchronously with multi-language support
public async Task<(bool IsSuccess, IEnumerable<Models.MultiLanSurvey> Surveys, string ErrorMessage)> GetSurveysAsync(string language) public async Task<(bool IsSuccess, IEnumerable<Models.MultiLanSurvey> Surveys, string ErrorMessage)> GetSurveysAsync(string language)
@ -136,7 +143,8 @@ namespace DamageAssesment.Api.Surveys.Providers
try try
{ {
logger?.LogInformation("Query Survey"); logger?.LogInformation("Query Survey");
var survey = await surveyDbContext.Surveys.SingleOrDefaultAsync(s => s.Id == id && s.IsEnabled == true); // removed is enabled becuase we are using it in responses to get response
var survey = await surveyDbContext.Surveys.SingleOrDefaultAsync(s => s.Id == id);
if (survey != null) if (survey != null)
{ {