Files
C4IT-F4SD-Client/FasdExcelToJsonConverter/ExcelHealthcardParser.cs
2025-11-11 11:03:42 +01:00

346 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using C4IT.FASD.Base;
using FasdCockpitCommunicationDemo;
using static C4IT.Logging.cLogManager;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
using System.Windows.Shapes;
using System.Text.RegularExpressions;
using FasdCockpitBase.Models;
namespace FasdExcelToJsonConverter
{
public class cExcelHealthcardParser
{
private Dictionary<string, Worksheet> workSheets;
public cExcelHealthcardParser(Workbook selectedWorkBook)
{
if (LoadWorkSheets(selectedWorkBook, out var workSheets))
this.workSheets = workSheets;
}
private bool LoadWorkSheets(Workbook selectedWorkBook, out Dictionary<string, Worksheet> workSheets)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
workSheets = new Dictionary<string, Worksheet>();
if (selectedWorkBook == null)
return false;
try
{
foreach (Worksheet workSheet in selectedWorkBook.Worksheets)
{
workSheets.Add(workSheet.Name, workSheet);
}
return true;
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogMethodEnd(CM);
}
return false;
}
public bool GetHealthcardDataFromExcel(string WorkSheetName, out cF4SDHealthCardJsonRawData HealthcardJsonData)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
HealthcardJsonData = new cF4SDHealthCardJsonRawData();
if (string.IsNullOrEmpty(WorkSheetName))
return false;
try
{
if (!workSheets.TryGetValue(WorkSheetName, out var selectedWorkSheet))
return false;
var range = selectedWorkSheet.UsedRange;
var healthCardData = new cF4SDHealthCardRawData();
for (int excelRow = 2; excelRow <= range.Rows.Count; excelRow++) // start from 2 because not zero based and 1st row contains header
{
//Get values of excel row
var values = new List<object>();
for (int excelColumn = 3; excelColumn <= range.Columns.Count; excelColumn++) // start from 2 because not zero based and 1st and 2nd column contains ValueTable & ValueColumn
{
var cellValue = range.Cells[excelRow, excelColumn].Value as object;
values.Add(cellValue);
}
//Get Table of Dictionary
var valueTable = range.Cells[excelRow, 1].Value?.ToString();
if (!healthCardData.Tables.ContainsKey(valueTable))
healthCardData.Tables.Add(valueTable, new cF4SDHealthCardRawData.cHealthCardTable() { Name = valueTable });
//Add Columns
if (healthCardData.Tables.TryGetValue(valueTable, out cF4SDHealthCardRawData.cHealthCardTable tableDictionaryEntry))
{
var columnName = range.Cells[excelRow, 2].Value?.ToString();
if (tableDictionaryEntry.Columns.ContainsKey(columnName))
continue;
tableDictionaryEntry.Columns.Add(columnName, new cF4SDHealthCardRawData.cHealthCardTableColumn() { ColumnName = columnName, Values = values.ToList() });
if (tableDictionaryEntry.TimeFrames == null)
tableDictionaryEntry.TimeFrames = new DateTime[1, 2];
if (tableDictionaryEntry.TimeFrames.GetLength(0) < values.Count)
tableDictionaryEntry.TimeFrames = new DateTime[values.Count, 2];
}
}
foreach (var table in healthCardData.Tables)
{
table.Value.TimeFrames[0, 0] = DateTime.Now;
table.Value.TimeFrames[0, 1] = DateTime.Today;
for (int i = 1; i < table.Value.TimeFrames.GetLength(0) - 1; i++)
{
table.Value.TimeFrames[i, 0] = DateTime.Today.AddDays(-i);
table.Value.TimeFrames[i, 1] = DateTime.Today.AddDays(-i - 1);
}
}
HealthcardJsonData = cF4SDHealthCardJsonRawData.GetHealthCardJsonRawData(healthCardData);
HealthcardJsonData.DetailsTables = GetDetailsTablesFromExcel();
HealthcardJsonData.Tickets = GetTicketsFromExcel();
return true;
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogMethodEnd(CM);
}
return false;
}
private List<cF4SDHealthCardRawData.cHealthCardDetailsTable> GetDetailsTablesFromExcel()
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
var output = new List<cF4SDHealthCardRawData.cHealthCardDetailsTable>();
try
{
foreach (var workSheet in workSheets)
{
if (!workSheet.Key.StartsWith("details-"))
continue;
var selectedWorkSheet = workSheet.Value;
var range = selectedWorkSheet.UsedRange;
var tableName = workSheet.Key.Replace("details-", "agnt-computer-event-details-");
var tableColumns = new List<string>();
for (int i = 2; i <= range.Columns.Count; i++)
{
tableColumns.Add(range.Cells[1, i].Value?.ToString());
}
var tableValues = new Dictionary<int, List<object[]>>();
for (int excelRow = 2; excelRow <= range.Rows.Count; excelRow++)
{
var dayValue = range.Cells[excelRow, 1].Value?.ToString();
int dayIndex = int.MinValue;
if (DateTime.TryParse(dayValue, out DateTime dayDate))
dayIndex = (DateTime.Today - dayDate).Days;
List<object> rowValues = new List<object>();
for (int excelColumn = 2; excelColumn <= range.Columns.Count; excelColumn++)
{
rowValues.Add(range.Cells[excelRow, excelColumn].Value);
}
if (tableValues.TryGetValue(dayIndex, out var dayValues))
dayValues.Add(rowValues.ToArray());
else
tableValues.Add(dayIndex, new List<object[]>() { rowValues.ToArray() });
}
var tableToAdd = new cF4SDHealthCardRawData.cHealthCardDetailsTable() { Name = tableName, Columns = tableColumns, Values = tableValues };
output.Add(tableToAdd);
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogMethodEnd(CM);
}
return output;
}
private List<cF4SDTicket> GetTicketsFromExcel()
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
List<cF4SDTicket> output = new List<cF4SDTicket>();
try
{
if (!workSheets.TryGetValue("%TicketData%", out var TicketWorksheet))
return output;
Dictionary<double, cF4SDTicket> tempTickets = new Dictionary<double, cF4SDTicket>();
var ticketRange = TicketWorksheet.UsedRange;
for (int row = 2; row <= ticketRange.Rows.Count; row++)
{
double ticketId = ticketRange.Cells[row, 1].Value;
string affectedUser = ticketRange.Cells[row, 2].Value;
double creationDaysSinceNow = ticketRange.Cells[row, 3].Value;
DateTime creationDate = DateTime.Now.AddDays(-creationDaysSinceNow);
double? closingDaysSinceNow = ticketRange.Cells[row, 4].Value;
DateTime? closingDate = null;
if (closingDaysSinceNow.HasValue)
closingDate = DateTime.Now.AddDays(closingDaysSinceNow.Value);
enumTicketStatus ticketStatus = enumTicketStatus.Unknown;
Enum.TryParse<enumTicketStatus>(ticketRange.Cells[row, 5].Value?.ToString(), out ticketStatus);
cF4SDTicket.enumTicketCreationSource creationSource = cF4SDTicket.enumTicketCreationSource.Unknown;
Enum.TryParse<cF4SDTicket.enumTicketCreationSource>(ticketRange.Cells[row, 6].Value, out creationSource);
// classification = ticketRange.Cells[row, 7].Value;
string asset = ticketRange.Cells[row, 8].Value;
string ticketName = ticketRange.Cells[row, 9].Value;
string summary = ticketRange.Cells[row, 10].Value;
string category = ticketRange.Cells[row, 11].Value;
double priority = ticketRange.Cells[row, 12].Value;
string description = ticketRange.Cells[row, 13].Value;
string htmlDescription = ticketRange.Cells[row, 14].Value;
string solution = ticketRange.Cells[row, 15].Value;
string directLinkPreview = ticketRange.Cells[row, 16].Value;
string directLinkEdit = ticketRange.Cells[row, 17].Value;
string directLinkClose = ticketRange.Cells[row, 18].Value;
if (tempTickets.ContainsKey(ticketId))
{
LogEntry($"Ticket with id {ticketId} allready exists.");
continue;
}
cF4SDTicket tempTicket = new cF4SDTicket()
{
Id = Guid.NewGuid(),
AffectedUser = affectedUser,
CreationDaysSinceNow = creationDaysSinceNow,
CreationDate = creationDate,
ClosingDaysSinceNow = closingDaysSinceNow,
ClosingDate = closingDate,
Status = ticketStatus,
CreationSource = creationSource,
Asset = asset,
Name = ticketName,
Summary = summary,
Category = category,
Priority = (int)priority,
Description = description,
DescriptionHtml = htmlDescription,
Solution = solution,
JournalItems = new List<cF4SDTicket.cTicketJournalItem>(),
DirectLinks = new Dictionary<string, string>()
};
if (!(string.IsNullOrWhiteSpace(directLinkPreview)))
{
tempTicket.DirectLinks.Add("DirectLinkPreview", directLinkPreview);
var ticketIdString = Regex.Match(directLinkPreview, @"[0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}");
if (ticketIdString.Success && Guid.TryParse(ticketIdString.Value, out var tempTicketId))
tempTicket.Id = tempTicketId;
}
if (!(string.IsNullOrWhiteSpace(directLinkEdit)))
tempTicket.DirectLinks.Add("DirectLinkEdit", directLinkEdit);
if (!(string.IsNullOrWhiteSpace(directLinkClose)))
tempTicket.DirectLinks.Add("DirectLinkClose", directLinkClose);
tempTickets.Add(ticketId, tempTicket);
}
output = tempTickets.Values.ToList();
if (!workSheets.TryGetValue("%TicketDetails%", out var DetailsWorksheet))
return output;
var detailRange = DetailsWorksheet.UsedRange;
for (int row = 2; row <= detailRange.Rows.Count; row++)
{
double ticketId = detailRange.Cells[row, 1].Value;
double creationDaysSinceNow = detailRange.Cells[row, 2].Value;
DateTime creationDate = DateTime.Now.AddDays(-creationDaysSinceNow);
bool isVisibleForUser = bool.Parse(detailRange.Cells[row, 3].Value);
string header = detailRange.Cells[row, 4].Value;
string createdBy = detailRange.Cells[row, 5].Value;
string description = detailRange.Cells[row, 6].Value;
var tempJournalItem = new cF4SDTicket.cTicketJournalItem()
{
CreationDaysSinceNow = creationDaysSinceNow,
CreationDate = creationDate,
IsVisibleForUser = isVisibleForUser,
Header = header,
CreatedBy = createdBy,
Description = description
};
if (tempTickets.ContainsKey(ticketId))
{
var tempJournalItems = tempTickets[ticketId].JournalItems;
if (tempJournalItems is null)
tempJournalItems = new List<cF4SDTicket.cTicketJournalItem>();
tempJournalItems.Add(tempJournalItem);
}
}
output = tempTickets.Values.ToList();
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogMethodEnd(CM);
}
return output;
}
}
}