Jóváhagyás utáni automatikus mail + CheckListHeader ShortName és Description javítása

This commit is contained in:
2025-05-23 20:41:44 +02:00
parent cd0b1da85b
commit d3e63404a2
9 changed files with 170 additions and 17 deletions
@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="hu">
<head>
<meta charset="UTF-8">
<title>Értesítés jóváhagyásról</title>
</head>
<body style="font-family: Arial, sans-serif; background-color: #f9f9f9; padding: 20px;">
<p style="font-size: 18px;">
A következő munkafolyamat jóvá lett hagyva:
</p>
<p style="font-size: 28px; font-weight: bold; color: #333; margin-top: 10px;">
#DocumentNumber#
</p>
</body>
</html>
@@ -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<CheckListHeaderDTO>(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<string>()
{
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<byte[]> CreateCheckListHeaderPDFAsync(int checkListHeaderId)
{
try
@@ -9,7 +9,7 @@ namespace WorkFlowCheck.BL.Services.Interfaces
{
public interface IMessageService
{
Task<bool> SendMailAsync(List<string> recipients, string subject, string htmlBody);
Task<bool> SendMailAsync(List<string> recipients, string subject, string htmlBody, string? attachmentFilePath = null);
Task<bool> SendFCMTokenAsync(string token);
Task<string> GetLastFCMTokensAsync();
@@ -28,7 +28,7 @@ namespace WorkFlowCheck.BL.Services
_settings = configuration.GetSection("EmailSettings").Get<EmailSettings>()!;
}
public async Task<bool> SendMailAsync(List<string> recipients, string subject, string htmlBody)
public async Task<bool> SendMailAsync(List<string> 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);
@@ -11,6 +11,7 @@
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="HtmlTemplates\AcceptCheckListHeaderBody.html" />
<EmbeddedResource Include="HtmlTemplates\Token2FBody.html" />
</ItemGroup>
@@ -34,10 +34,17 @@
<form method="post" id="CheckListHeaderForm">
<meta name="csrf-token" content="@Antiforgery.GetAndStoreTokens(HttpContext).RequestToken" />
<input type="hidden" asp-for="CheckListHeaderDTO.Id" />
<input type="hidden" asp-for="CheckListHeaderDTO.IsEditable" />
<input type="hidden" asp-for="CheckListHeaderDTO.IsStorno" />
<input type="hidden" asp-for="CheckListHeaderDTO.GuidNumber" />
<input type="hidden" asp-for="CheckListHeaderDTO.CheckListTemplateHeaderId" />
<input type="hidden" asp-for="CheckListHeaderDTO.UserId" />
<input type="hidden" name="CheckListHeaderDTO.DateExecution" value="@Model.CheckListHeaderDTO.DateExecution.ToString("yyyy-MM-dd")" />
<input type="hidden" asp-for="CheckListHeaderDTO.AcceptUserId" />
<div class="row">
<div class="col-md-3">
<label asp-for="CheckListHeaderDTO.DocumentNumber"></label>
<input asp-for="CheckListHeaderDTO.DocumentNumber" class="form-control" readonly/>
<input asp-for="CheckListHeaderDTO.DocumentNumber" class="form-control" readonly />
<span asp-validation-for="CheckListHeaderDTO.DocumentNumber" class="text-danger"></span>
</div>
<div class="col-md-3">
@@ -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
@@ -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<IActionResult> 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();
@@ -58,7 +58,34 @@ namespace WorkFlowCheck.Web.Services
}
return retVal;
}
public async Task<ApiResponseDTO<CheckListHeaderDTO>> UpdateCheckListHeader(CheckListHeaderDTO checkListHeaderDTO) => throw new NotImplementedException();
public async Task<ApiResponseDTO<CheckListHeaderDTO>> 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<ApiResponseDTO<CheckListHeaderDTO>>(jsonString);
return response ?? new ApiResponseDTO<CheckListHeaderDTO>
{
IsSuccess = false,
};
}
}
catch (Exception ex)
{
// Hiba visszaadása
return new ApiResponseDTO<CheckListHeaderDTO>
{
IsSuccess = false
};
}
}
public async Task<ApiResponseDTO<bool>> AcceptCheckListHeader(int id, int userid)
{
+16 -1
View File
@@ -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++) {