diff --git a/src/WorkFlowCheck.BL/HtmlTemplates/AcceptCheckListHeaderBody.html b/src/WorkFlowCheck.BL/HtmlTemplates/AcceptCheckListHeaderBody.html new file mode 100644 index 0000000..2e39e5d --- /dev/null +++ b/src/WorkFlowCheck.BL/HtmlTemplates/AcceptCheckListHeaderBody.html @@ -0,0 +1,18 @@ + + + + + Értesítés jóváhagyásról + + + +

+ A következő munkafolyamat jóvá lett hagyva: +

+ +

+ #DocumentNumber# +

+ + + \ No newline at end of file diff --git a/src/WorkFlowCheck.BL/Services/CheckListService.cs b/src/WorkFlowCheck.BL/Services/CheckListService.cs index ccb97f4..196aca2 100644 --- a/src/WorkFlowCheck.BL/Services/CheckListService.cs +++ b/src/WorkFlowCheck.BL/Services/CheckListService.cs @@ -114,6 +114,7 @@ namespace WorkFlowCheck.BL.Services { CheckListTemplateHeaderId = checkListHeaderDTO.CheckListTemplateHeaderDTO.Id, Description = checkListHeaderDTO.Description, + ShortName = checkListHeaderDTO.ShortName, GuidNumber = Guid.NewGuid(), }; _dbContext.CheckListHeaders.Add(checkListHeader); @@ -129,7 +130,7 @@ namespace WorkFlowCheck.BL.Services if (checkListHeader != null) { checkListHeader.Description = checkListHeaderDTO.Description; - + checkListHeader.ShortName= checkListHeaderDTO.ShortName; await _dbContext.SaveChangesAsync(); retVal = _mapper.Map(checkListHeader); @@ -239,17 +240,60 @@ namespace WorkFlowCheck.BL.Services var filePath = Path.Combine(pdfDirectory, fileName); await File.WriteAllBytesAsync(filePath, pdf); + await SendMailToAcceptedUser(filePath, checkListHeader, userid); + retVal = true; } } } catch (Exception ex) { - + retVal = false; Log.Error(ex.Message); } return retVal; } + + private async Task SendMailToAcceptedUser(string filePath, CheckListHeader checkListHeader, int userId) + { + try + { + var user = _dbContext.Users.Where(W => W.Id == userId).FirstOrDefault(); + if (user != null) + { + if (!string.IsNullOrEmpty(user.Email)) + { + var recepients = new List() + { + user.Email, + }; + + await _messageService.SendMailAsync(recepients, + $"Értesítés folyamat jóváhagyásáról {checkListHeader.DocumentNumber}", + GetAcceptCheckListHeaderMessageBody(checkListHeader), + filePath); + } + } + } + catch (Exception ex) + { + + + } + } + private string GetAcceptCheckListHeaderMessageBody(CheckListHeader checkListHeader) + { + var assembly = Assembly.GetExecutingAssembly(); + var resourceName = "WorkFlowCheck.BL.HtmlTemplates.AcceptCheckListHeaderBody.html"; + + using var stream = assembly.GetManifestResourceStream(resourceName); + if (stream == null) + throw new FileNotFoundException($"Nem található a beágyazott erőforrás: {resourceName}"); + + using var reader = new StreamReader(stream); + var html = reader.ReadToEnd(); + return html.Replace("#DocumentNumber#", checkListHeader.DocumentNumber); + } public async Task CreateCheckListHeaderPDFAsync(int checkListHeaderId) { try diff --git a/src/WorkFlowCheck.BL/Services/Interfaces/IMessageService.cs b/src/WorkFlowCheck.BL/Services/Interfaces/IMessageService.cs index aa4d5cf..057692b 100644 --- a/src/WorkFlowCheck.BL/Services/Interfaces/IMessageService.cs +++ b/src/WorkFlowCheck.BL/Services/Interfaces/IMessageService.cs @@ -9,7 +9,7 @@ namespace WorkFlowCheck.BL.Services.Interfaces { public interface IMessageService { - Task SendMailAsync(List recipients, string subject, string htmlBody); + Task SendMailAsync(List recipients, string subject, string htmlBody, string? attachmentFilePath = null); Task SendFCMTokenAsync(string token); Task GetLastFCMTokensAsync(); diff --git a/src/WorkFlowCheck.BL/Services/MessageService.cs b/src/WorkFlowCheck.BL/Services/MessageService.cs index cb9ed60..16d67e7 100644 --- a/src/WorkFlowCheck.BL/Services/MessageService.cs +++ b/src/WorkFlowCheck.BL/Services/MessageService.cs @@ -28,7 +28,7 @@ namespace WorkFlowCheck.BL.Services _settings = configuration.GetSection("EmailSettings").Get()!; } - public async Task SendMailAsync(List recipients, string subject, string htmlBody) + public async Task SendMailAsync(List recipients, string subject, string htmlBody, string? attachmentFilePath = null) { var message = new MimeMessage(); message.From.Add(new MailboxAddress(_settings.SenderName, _settings.Username)); @@ -40,11 +40,17 @@ namespace WorkFlowCheck.BL.Services message.Subject = subject; - message.Body = new TextPart("html") + var builder = new BodyBuilder { - Text = htmlBody + HtmlBody = htmlBody }; + if (!string.IsNullOrEmpty(attachmentFilePath) && File.Exists(attachmentFilePath)) + { + builder.Attachments.Add(attachmentFilePath); + } + + message.Body = builder.ToMessageBody(); using var smtp = new SmtpClient(); await smtp.ConnectAsync(_settings.SmtpServer, _settings.SmtpPort, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync(_settings.Username, _settings.Password); diff --git a/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj b/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj index 72db9dd..7234e8d 100644 --- a/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj +++ b/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj @@ -11,6 +11,7 @@ + diff --git a/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderEditPage.cshtml b/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderEditPage.cshtml index 22a75b2..11fcec0 100644 --- a/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderEditPage.cshtml +++ b/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderEditPage.cshtml @@ -34,10 +34,17 @@
+ + + + + + +
- +
@@ -201,8 +208,10 @@ const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); var formData = getFormAsNestedObject('#CheckListHeaderForm'); const $form = $('#CheckListHeaderForm'); - - formData.CheckListHeader.RoleDTO=[]; + + formData.CheckListHeaderDTO.CheckListRowDTO=[]; + + console.log(formData.CheckListHeaderDTO); if ($form.valid()) { @@ -213,13 +222,24 @@ 'X-CSRF-TOKEN': csrfToken, 'Content-Type': 'application/json' }, - data: JSON.stringify(formData.CheckListHeader), + data: JSON.stringify(formData.CheckListHeaderDTO), success: function (response) { - showMessageModal({ - title: 'Figyelmem!', - message: 'Sikeres mentés.', - okText: 'Értettem' - }); + if (response.success) + { + showMessageModal({ + title: 'Figyelmem!', + message: 'Sikeres mentés.', + okText: 'Értettem' + }); + } + else + { + showMessageModal({ + title: 'Figyelmem, HIBA!', + message: 'Sikertelen mentés.', + okText: 'Értettem' + }); + } }, error: function (xhr, status, error) { // Hiba esetén diff --git a/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderEditPage.cshtml.cs b/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderEditPage.cshtml.cs index 011dcc0..e47db53 100644 --- a/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderEditPage.cshtml.cs +++ b/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderEditPage.cshtml.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; +using Serilog; using System.Globalization; using WorkFlowCheck.Common.DTO; using WorkFlowCheck.Web.Services.Interfaces; @@ -32,6 +33,27 @@ namespace WorkFlowCheck.Web.Pages.CheckList.CheckListHeader CheckStatus = _checkListService.GetCheckStatus(); BuildCheckListHeaderInfo(); } + public async Task OnPostSave([FromBody] CheckListHeaderDTO checkListHeaderDTO) + { + try + { + var result = await _checkListService.UpdateCheckListHeader(checkListHeaderDTO); + if (result.IsSuccess) + { + return new JsonResult(new { success = true }); + } + else + { + return new JsonResult(new { success = false }); + } + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + + return new JsonResult(new { success = false }); + } private void BuildCheckListHeaderInfo() { CheckListHeaderInfoDTO = new CheckListHeaderInfoDTO(); diff --git a/src/WorkFlowCheck.Web/Services/CheckListService.cs b/src/WorkFlowCheck.Web/Services/CheckListService.cs index 75cbe72..f492619 100644 --- a/src/WorkFlowCheck.Web/Services/CheckListService.cs +++ b/src/WorkFlowCheck.Web/Services/CheckListService.cs @@ -58,7 +58,34 @@ namespace WorkFlowCheck.Web.Services } return retVal; } - public async Task> UpdateCheckListHeader(CheckListHeaderDTO checkListHeaderDTO) => throw new NotImplementedException(); + public async Task> UpdateCheckListHeader(CheckListHeaderDTO checkListHeaderDTO) + { + try + { + string endpoint = $"{_httpClient.BaseAddress}api/CheckList/UpdateCheckListHeader"; + + using (HttpResponseMessage httpResponseMessage = await _httpClient.PostAsJsonAsync(endpoint, checkListHeaderDTO)) + { + httpResponseMessage.EnsureSuccessStatusCode(); + + var jsonString = await httpResponseMessage.Content.ReadAsStringAsync(); + var response = JsonConvert.DeserializeObject>(jsonString); + + return response ?? new ApiResponseDTO + { + IsSuccess = false, + }; + } + } + catch (Exception ex) + { + // Hiba visszaadása + return new ApiResponseDTO + { + IsSuccess = false + }; + } + } public async Task> AcceptCheckListHeader(int id, int userid) { diff --git a/src/WorkFlowCheck.Web/wwwroot/js/site.js b/src/WorkFlowCheck.Web/wwwroot/js/site.js index a35e974..d05f211 100644 --- a/src/WorkFlowCheck.Web/wwwroot/js/site.js +++ b/src/WorkFlowCheck.Web/wwwroot/js/site.js @@ -2,13 +2,28 @@ // for details on configuring this project to bundle and minify static web assets. // Write your JavaScript code. +function parseValue(value) { + if (value === "") return null; + + // Boolean + if (value.toLowerCase() === "true") return true; + if (value.toLowerCase() === "false") return false; + + // Number + if (!isNaN(value) && value.trim() !== "") return Number(value); + + // ISO dátum formátum felismerése (alap logika) + if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/.test(value)) return new Date(value).toISOString(); + + return value; +} function getFormAsNestedObject(formSelector) { var formArray = $(formSelector).serializeArray(); var result = {}; formArray.forEach(function (item) { var keys = item.name.split('.'); - var value = item.value; + var value = parseValue(item.value); var current = result; for (var i = 0; i < keys.length; i++) {