Jóváhagyás utáni automatikus mail + CheckListHeader ShortName és Description javítása
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
+28
-8
@@ -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">
|
||||
@@ -202,7 +209,9 @@
|
||||
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
|
||||
|
||||
+22
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user