public async Task Handle(eFormCompleted message) { Console.WriteLine("[INF] EFormCompletedHandler.Handle: called"); try { _s3Enabled = _sdkCore.GetSdkSetting(Settings.s3Enabled).Result.ToLower() == "true"; _swiftEnabled = _sdkCore.GetSdkSetting(Settings.swiftEnabled).Result.ToLower() == "true"; string downloadPath = Path.Combine(Path.GetTempPath(), "reports", "results"); Directory.CreateDirectory(downloadPath); // Docx and PDF files string timeStamp = DateTime.UtcNow.ToString("yyyyMMdd") + "_" + DateTime.UtcNow.ToString("hhmmss"); string docxFileName = $"{timeStamp}{message.SiteId}_temp.docx"; string tempPDFFileName = $"{timeStamp}{message.SiteId}_temp.pdf"; string tempPDFFilePath = Path.Combine(downloadPath, tempPDFFileName); string newTaskIdValue = _dbContext.PluginConfigurationValues .SingleOrDefault(x => x.Name == "WorkOrdersBaseSettings:NewTaskId")?.Value; bool newTaskIdParseResult = int.TryParse(newTaskIdValue, out int newTaskId); if (!newTaskIdParseResult) { const string errorMessage = "[ERROR] New task eform id not found in setting"; Console.WriteLine(errorMessage); throw new Exception(errorMessage); } string taskListIdValue = _dbContext.PluginConfigurationValues .SingleOrDefault(x => x.Name == "WorkOrdersBaseSettings:TaskListId")?.Value; bool taskListIdParseResult = int.TryParse(taskListIdValue, out int taskListId); if (!taskListIdParseResult) { const string errorMessage = "[ERROR] Task list eform id not found in setting"; Console.WriteLine(errorMessage); throw new Exception(errorMessage); } string folderIdValue = _dbContext.PluginConfigurationValues .SingleOrDefault(x => x.Name == "WorkOrdersBaseSettings:FolderTasksId")?.Value; int?folderId; if (string.IsNullOrEmpty(folderIdValue) || folderIdValue == "0") { folderId = null; } else { bool folderIdParseResult = int.TryParse(folderIdValue, out int result); if (!folderIdParseResult) { var errorMessage = $"[ERROR] Folder id parse error. folderIdValue: {folderIdValue}"; Console.WriteLine(errorMessage); throw new Exception(errorMessage); } folderId = result; } await using MicrotingDbContext sdkDbContext = _sdkCore.DbContextHelper.GetDbContext(); if (message.CheckId == newTaskId) { WorkOrder workOrder = new WorkOrder(); workOrder.MicrotingId = message.MicrotingId; workOrder.CheckMicrotingUid = message.CheckUId; workOrder.CheckId = message.CheckId; Console.WriteLine("[INF] EFormCompletedHandler.Handle: message.CheckId == createNewTaskEFormId"); Language language = await sdkDbContext.Languages .SingleAsync(x => x.LanguageCode == "da"); ReplyElement replyElement = await _sdkCore.CaseRead(message.MicrotingId, message.CheckUId, language); var doneBy = sdkDbContext.Workers .Single(x => x.Id == replyElement.DoneById).full_name(); CheckListValue checkListValue = (CheckListValue)replyElement.ElementList[0]; List <Field> fields = checkListValue.DataItemList.Select(di => di as Field).ToList(); var picturesOfTasks = new List <string>(); if (fields.Any()) { // field[0] - picture of the task if (!string.IsNullOrEmpty(fields[3]?.FieldValues[0]?.Value)) { workOrder.Description = fields[3].FieldValues[0].Value; } if (!string.IsNullOrEmpty(fields[4]?.FieldValues[0]?.Value)) { workOrder.CorrectedAtLatest = DateTime.Parse(fields[4].FieldValues[0].Value); } if (fields[2].FieldValues.Count > 0) { foreach (FieldValue fieldValue in fields[2].FieldValues) { if (fieldValue.UploadedDataObj != null) { picturesOfTasks.Add($"{fieldValue.UploadedDataObj.Id}_700_{fieldValue.UploadedDataObj.Checksum}{fieldValue.UploadedDataObj.Extension}"); } } } } workOrder.CreatedAt = DateTime.UtcNow; workOrder.CreatedByUserId = replyElement.SiteMicrotingUuid; workOrder.WorkflowState = Constants.WorkflowStates.Created; workOrder.AssignedArea = fields[0].FieldValues[0].ValueReadable; workOrder.AssignedWorker = fields[1].FieldValues[0].ValueReadable; await workOrder.Create(_dbContext); foreach (var picturesOfTask in picturesOfTasks) { var pictureOfTask = new PicturesOfTask { FileName = picturesOfTask, WorkOrderId = workOrder.Id, }; await pictureOfTask.Create(_dbContext); } var folderResult = await _dbContext.PluginConfigurationValues.SingleAsync(x => x.Name == "WorkOrdersBaseSettings:FolderTasksId"); string folderMicrotingUid = sdkDbContext.Folders.Single(x => x.Id == folderId) .MicrotingUid.ToString(); var resourceString = "ServiceWorkOrdersPlugin.Resources.Templates.page.html"; var assembly = Assembly.GetExecutingAssembly(); string html; await using (var resourceStream = assembly.GetManifestResourceStream(resourceString)) { using var reader = new StreamReader(resourceStream ?? throw new InvalidOperationException($"{nameof(resourceStream)} is null")); html = await reader.ReadToEndAsync(); } // Read docx stream resourceString = "ServiceWorkOrdersPlugin.Resources.Templates.file.docx"; var docxFileResourceStream = assembly.GetManifestResourceStream(resourceString); if (docxFileResourceStream == null) { throw new InvalidOperationException($"{nameof(docxFileResourceStream)} is null"); } var docxFileStream = new MemoryStream(); await docxFileResourceStream.CopyToAsync(docxFileStream); await docxFileResourceStream.DisposeAsync(); string basePicturePath = Path.Combine(Path.GetTempPath(), "pictures", "workorders"); Directory.CreateDirectory(basePicturePath); var word = new WordProcessor(docxFileStream); string imagesHtml = ""; foreach (var imagesName in picturesOfTasks) { Console.WriteLine($"Trying to insert image into document : {imagesName}"); imagesHtml = await InsertImage(imagesName, imagesHtml, 700, 650, basePicturePath); } html = html.Replace("{%Content%}", imagesHtml); word.AddHtml(html); word.Dispose(); docxFileStream.Position = 0; // Build docx await using (var docxFile = new FileStream(Path.Combine(Path.GetTempPath(), "reports", "results", docxFileName), FileMode.Create, FileAccess.Write)) { docxFileStream.WriteTo(docxFile); } // Convert to PDF ReportHelper.ConvertToPdf(Path.Combine(Path.GetTempPath(), "reports", "results", docxFileName), downloadPath); File.Delete(docxFileName); // Upload PDF // string pdfFileName = null; string hash = await _sdkCore.PdfUpload(tempPDFFilePath); if (hash != null) { //rename local file FileInfo fileInfo = new FileInfo(tempPDFFilePath); fileInfo.CopyTo(downloadPath + "/" + hash + ".pdf", true); fileInfo.Delete(); await _sdkCore.PutFileToStorageSystem(Path.Combine(downloadPath, $"{hash}.pdf"), $"{hash}.pdf"); // TODO Remove from file storage? } List <AssignedSite> sites = await _dbContext.AssignedSites.Where(x => x.WorkflowState != Constants.WorkflowStates.Removed).ToListAsync(); foreach (AssignedSite site in sites) { Site sdkSite = await sdkDbContext.Sites.SingleAsync(x => x.MicrotingUid == site.SiteMicrotingUid); language = await sdkDbContext.Languages.SingleAsync(x => x.Id == sdkSite.LanguageId); Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(language.LanguageCode); MainElement mainElement = await _sdkCore.ReadeForm(taskListId, language); mainElement.Repeated = 1; mainElement.EndDate = DateTime.Now.AddYears(10).ToUniversalTime(); mainElement.StartDate = DateTime.Now.ToUniversalTime(); mainElement.CheckListFolderName = folderMicrotingUid; DateTime startDate = new DateTime(2020, 1, 1); mainElement.DisplayOrder = (workOrder.CorrectedAtLatest - startDate).Days; DataElement dataElement = (DataElement)mainElement.ElementList[0]; mainElement.Label = fields[3].FieldValues[0].Value; mainElement.PushMessageTitle = mainElement.Label; mainElement.PushMessageBody = (string.IsNullOrEmpty(fields[0].FieldValues[0].ValueReadable) || fields[0].FieldValues[0].ValueReadable == "null") ? "" : $"{fields[0].FieldValues[0].ValueReadable}"; mainElement.PushMessageBody += (string.IsNullOrEmpty(fields[1].FieldValues[0].ValueReadable) || fields[1].FieldValues[0].ValueReadable == "null") ? " (" :$" ({fields[1].FieldValues[0].ValueReadable}"; mainElement.PushMessageBody += string.IsNullOrEmpty(fields[4].FieldValues[0].Value) ? ")" : $"; {DateTime.Parse(fields[4].FieldValues[0].Value).ToString("dd.MM.yyyy")})"; dataElement.Label = fields[3].FieldValues[0].Value; dataElement.Description.InderValue += (string.IsNullOrEmpty(fields[0].FieldValues[0].ValueReadable) || fields[0].FieldValues[0].ValueReadable == "null") ? "" : $"<strong>{Translations.Area}:</strong> {fields[0].FieldValues[0].ValueReadable}<br>"; dataElement.Description.InderValue += (string.IsNullOrEmpty(fields[1].FieldValues[0].ValueReadable) || fields[1].FieldValues[0].ValueReadable == "null") ? "" :$"<strong>{Translations.AssignedTo}:</strong> {fields[1].FieldValues[0].ValueReadable}<br>"; dataElement.Description.InderValue += $"<strong>{Translations.TaskCreatedBy}:</strong> {doneBy}<br>"; dataElement.Description.InderValue += $"<strong>{Translations.DontAtTheLatst}:</strong>"; // Needs i18n support "Corrected at the latest:" dataElement.Description.InderValue += string.IsNullOrEmpty(fields[4].FieldValues[0].Value) ? "" : DateTime.Parse(fields[4].FieldValues[0].Value).ToString("dd.MM.yyyy"); dataElement.DataItemList[0].Description.InderValue = dataElement.Description.InderValue; dataElement.DataItemList[0].Label = dataElement.Label; // Read html and template if (hash != null) { ((ShowPdf)dataElement.DataItemList[1]).Value = hash; } int?caseId = await _sdkCore.CaseCreate(mainElement, "", site.SiteMicrotingUid, folderId); var wotCase = new WorkOrdersTemplateCase() { CheckId = message.CheckId, CheckMicrotingUid = message.CheckUId, WorkOrderId = workOrder.Id, CaseId = (int)caseId, CaseMicrotingUid = message.MicrotingId, SdkSiteMicrotingUid = site.SiteMicrotingUid }; await wotCase.Create(_dbContext); } } else if (message.CheckId == taskListId) { Console.WriteLine("[INF] EFormCompletedHandler.Handle: message.CheckId == createTaskListEFormId"); WorkOrdersTemplateCase workOrdersTemplate = await _dbContext.WorkOrdersTemplateCases.Where(x => x.CaseId == message.MicrotingId).FirstOrDefaultAsync(); WorkOrder workOrder = await _dbContext.WorkOrders.FindAsync(workOrdersTemplate.WorkOrderId); Language language = await sdkDbContext.Languages .SingleAsync(x => x.LanguageCode == "da"); ReplyElement replyElement = await _sdkCore.CaseRead(message.MicrotingId, message.CheckUId, language); CheckListValue checkListValue = (CheckListValue)replyElement.ElementList[0]; List <Field> fields = checkListValue.DataItemList.Select(di => di as Field).ToList(); List <WorkOrdersTemplateCase> wotListToDelete = await _dbContext.WorkOrdersTemplateCases.Where(x => x.WorkOrderId == workOrdersTemplate.WorkOrderId && x.CaseId != message.MicrotingId).ToListAsync(); foreach (WorkOrdersTemplateCase wotToDelete in wotListToDelete) { await _sdkCore.CaseDelete(wotToDelete.CaseId); wotToDelete.WorkflowState = Constants.WorkflowStates.Retracted; await wotToDelete.Update(_dbContext); } if (fields.Any()) { // field[3] - pictures of the done task if (fields[3].FieldValues.Count > 0) { foreach (FieldValue fieldValue in fields[3].FieldValues) { if (fieldValue.UploadedDataObj != null) { var pictureOfTask = new PicturesOfTaskDone { FileName = fieldValue.UploadedDataObj.FileName, WorkOrderId = workOrder.Id, }; await pictureOfTask.Create(_dbContext); } } } if (!string.IsNullOrEmpty(fields[4]?.FieldValues[0]?.Value)) { if (string.IsNullOrEmpty(workOrder.DescriptionOfTaskDone)) { workOrder.DescriptionOfTaskDone = fields[4].FieldValues[0].Value; } } // Add pictures, checkbox if (workOrder.DoneAt == null) { workOrder.DoneBySiteId = message.SiteId; workOrder.DoneAt = DateTime.UtcNow; } await workOrder.Update(_dbContext); } } } catch (Exception ex) { Console.WriteLine($"[ERR] ServiceWorkOrdersPlugin.CaseCompleted: Got the following error: {ex.Message}"); } }
public async Task Handle(eFormCompleted message) { WriteLogEntry($"eFormCompletedHandler.Handle: we got called for message.caseId {message.caseId} and message.checkId {message.checkId}"); await using MicrotingDbContext microtingDbContext = _sdkCore.DbContextHelper.GetDbContext(); Language language = await microtingDbContext.Languages.SingleAsync(x => x.LanguageCode == "da"); CaseDto caseDto = await _sdkCore.CaseLookup(message.caseId, message.checkId).ConfigureAwait(false); ReplyElement replyElement = await _sdkCore.CaseRead(message.caseId, message.checkId, language).ConfigureAwait(false); OuterInnerResourceSite machineAreaSite = _dbContext.OuterInnerResourceSites.SingleOrDefault(x => x.MicrotingSdkCaseId == message.caseId); var machineAreaTimeRegistrations = await _dbContext.ResourceTimeRegistrations.Where(x => // x.DoneAt == replyElement.DoneAt && x.SDKCaseId == (int)caseDto.CaseId && x.SDKSiteId == machineAreaSite.MicrotingSdkSiteId).ToListAsync().ConfigureAwait(false); if (machineAreaTimeRegistrations.Count == 0) { ResourceTimeRegistration machineAreaTimeRegistration = new ResourceTimeRegistration(); if (machineAreaSite != null) { var outerInnerResource = await _dbContext.OuterInnerResources.SingleOrDefaultAsync(x => x.Id == machineAreaSite.OuterInnerResourceId); machineAreaTimeRegistration.OuterResourceId = outerInnerResource.OuterResourceId; machineAreaTimeRegistration.InnerResourceId = outerInnerResource.InnerResourceId; machineAreaTimeRegistration.DoneAt = replyElement.DoneAt; if (caseDto.CaseId != null) { machineAreaTimeRegistration.SDKCaseId = (int)caseDto.CaseId; } machineAreaTimeRegistration.SDKSiteId = machineAreaSite.MicrotingSdkSiteId; } CheckListValue dataElement = (CheckListValue)replyElement.ElementList[0]; foreach (var field in dataElement.DataItemList) { Field f = (Field)field; if (f.Label.ToLower().Contains("start/stop tid")) { try { Console.WriteLine($"The field is {f.Label}"); FieldValue fv = f.FieldValues[0]; String fieldValue = fv.Value; if (!string.IsNullOrEmpty(fieldValue)) { Console.WriteLine($"Current field_value is {fieldValue}"); int registeredTime = int.Parse(fieldValue.Split("|")[3]); Console.WriteLine($"We are setting the registered time to {registeredTime.ToString()}"); machineAreaTimeRegistration.SDKFieldValueId = fv.Id; machineAreaTimeRegistration.TimeInSeconds = (registeredTime / 1000); machineAreaTimeRegistration.TimeInMinutes = ((registeredTime / 1000) / 60); machineAreaTimeRegistration.TimeInHours = ((registeredTime / 1000) / 3600); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } await machineAreaTimeRegistration.Create(_dbContext).ConfigureAwait(false); } else { if (machineAreaTimeRegistrations.Count > 1) { int i = 0; foreach (ResourceTimeRegistration machineAreaTimeRegistration in machineAreaTimeRegistrations) { if (i > 0) { await machineAreaTimeRegistration.Delete(_dbContext); } i++; Console.WriteLine("More than one time registration found"); } } else { Console.WriteLine("One time registration found"); } } }
#pragma warning disable 1998 public async Task Handle(eFormCompleted message) { Console.WriteLine("[DBG] TrashInspection: We got a message : " + message.caseId); TrashInspectionCase trashInspectionCase = _dbContext.TrashInspectionCases.SingleOrDefault(x => x.SdkCaseId == message.caseId.ToString()); if (trashInspectionCase != null) { #region get case information CaseDto caseDto = await _sdkCore.CaseLookupMUId(message.caseId); await using MicrotingDbContext microtingDbContext = _sdkCore.DbContextHelper.GetDbContext(); var microtingUId = caseDto.MicrotingUId; var microtingCheckUId = caseDto.CheckUId; Language language = await microtingDbContext.Languages.SingleAsync(x => x.Name == "Danish"); ReplyElement theCase = await _sdkCore.CaseRead((int)microtingUId, (int)microtingCheckUId, language); CheckListValue dataElement = (CheckListValue)theCase.ElementList[0]; bool inspectionApproved = false; string approvedValue = ""; string comment = ""; Console.WriteLine("[DBG] Trying to find the field with the approval value"); foreach (var field in dataElement.DataItemList) { Field f = (Field)field; if (f.Label.Contains("Angiv om læs er Godkendt")) { Console.WriteLine($"The field is {f.Label}"); FieldValue fv = f.FieldValues[0]; String fieldValue = fv.Value; inspectionApproved = (fieldValue == "1"); approvedValue = fieldValue; Console.WriteLine($"[DBG] We are setting the approved state to {inspectionApproved.ToString()}"); } if (f.Label.Equals("Kommentar")) { Console.WriteLine($"[DBG] The field is {f.Label}"); FieldValue fv = f.FieldValues[0]; String fieldValue = fv.Value; comment = fieldValue; Console.WriteLine($"[DBG] We are setting the comment to {comment.ToString()}"); } } #endregion Console.WriteLine("TrashInspection: The incoming case is a trash inspection related case"); trashInspectionCase.Status = 100; await trashInspectionCase.Update(_dbContext); TrashInspection trashInspection = _dbContext.TrashInspections.SingleOrDefault(x => x.Id == trashInspectionCase.TrashInspectionId); if (trashInspection != null) { trashInspection.Status = 100; trashInspection.IsApproved = inspectionApproved; trashInspection.Comment = comment; trashInspection.ApprovedValue = approvedValue; trashInspection.InspectionDone = true; await trashInspection.Update(_dbContext); List <TrashInspectionCase> trashInspectionCases = _dbContext.TrashInspectionCases .Where(x => x.TrashInspectionId == trashInspection.Id).ToList(); foreach (TrashInspectionCase inspectionCase in trashInspectionCases) { if (await _sdkCore.CaseDelete(int.Parse(inspectionCase.SdkCaseId))) { inspectionCase.WorkflowState = Constants.WorkflowStates.Retracted; await inspectionCase.Update(_dbContext); } } #region get settings string callBackUrl = _dbContext.PluginConfigurationValues .SingleOrDefault(x => x.Name == "TrashInspectionBaseSettings:callBackUrl")?.Value; Console.WriteLine("[DBG] callBackUrl is : " + callBackUrl); string callBackCredentialDomain = _dbContext.PluginConfigurationValues.SingleOrDefault(x => x.Name == "TrashInspectionBaseSettings:CallBackCredentialDomain")?.Value; Console.WriteLine("[DBG] callBackCredentialDomain is : " + callBackCredentialDomain); string callbackCredentialUserName = _dbContext.PluginConfigurationValues.SingleOrDefault(x => x.Name == "TrashInspectionBaseSettings:callbackCredentialUserName")?.Value; Console.WriteLine("[DBG] callbackCredentialUserName is : " + callbackCredentialUserName); string callbackCredentialPassword = _dbContext.PluginConfigurationValues.SingleOrDefault(x => x.Name == "TrashInspectionBaseSettings:CallbackCredentialPassword")?.Value; Console.WriteLine("[DBG] callbackCredentialPassword is : " + callbackCredentialPassword); string callbackCredentialAuthType = _dbContext.PluginConfigurationValues.SingleOrDefault(x => x.Name == "TrashInspectionBaseSettings:CallbackCredentialAuthType")?.Value; Console.WriteLine("[DBG] callbackCredentialAuthType is : " + callbackCredentialAuthType); Console.WriteLine($"[DBG] trashInspection.WeighingNumber is {trashInspection.WeighingNumber}"); #endregion switch (callbackCredentialAuthType) { case "NTLM": await CallUrlNtlmAuth(callBackUrl, callBackCredentialDomain, callbackCredentialUserName, callbackCredentialPassword, trashInspection, inspectionApproved); break; case "basic": default: await CallUrlBaiscAuth(callBackUrl, callBackCredentialDomain, callbackCredentialUserName, callbackCredentialPassword, trashInspection, inspectionApproved); break; } } } }