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,
|
CheckListTemplateHeaderId = checkListHeaderDTO.CheckListTemplateHeaderDTO.Id,
|
||||||
Description = checkListHeaderDTO.Description,
|
Description = checkListHeaderDTO.Description,
|
||||||
|
ShortName = checkListHeaderDTO.ShortName,
|
||||||
GuidNumber = Guid.NewGuid(),
|
GuidNumber = Guid.NewGuid(),
|
||||||
};
|
};
|
||||||
_dbContext.CheckListHeaders.Add(checkListHeader);
|
_dbContext.CheckListHeaders.Add(checkListHeader);
|
||||||
@@ -129,7 +130,7 @@ namespace WorkFlowCheck.BL.Services
|
|||||||
if (checkListHeader != null)
|
if (checkListHeader != null)
|
||||||
{
|
{
|
||||||
checkListHeader.Description = checkListHeaderDTO.Description;
|
checkListHeader.Description = checkListHeaderDTO.Description;
|
||||||
|
checkListHeader.ShortName= checkListHeaderDTO.ShortName;
|
||||||
|
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
retVal = _mapper.Map<CheckListHeaderDTO>(checkListHeader);
|
retVal = _mapper.Map<CheckListHeaderDTO>(checkListHeader);
|
||||||
@@ -239,17 +240,60 @@ namespace WorkFlowCheck.BL.Services
|
|||||||
var filePath = Path.Combine(pdfDirectory, fileName);
|
var filePath = Path.Combine(pdfDirectory, fileName);
|
||||||
await File.WriteAllBytesAsync(filePath, pdf);
|
await File.WriteAllBytesAsync(filePath, pdf);
|
||||||
|
|
||||||
|
await SendMailToAcceptedUser(filePath, checkListHeader, userid);
|
||||||
|
|
||||||
retVal = true;
|
retVal = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
retVal = false;
|
||||||
Log.Error(ex.Message);
|
Log.Error(ex.Message);
|
||||||
}
|
}
|
||||||
return retVal;
|
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)
|
public async Task<byte[]> CreateCheckListHeaderPDFAsync(int checkListHeaderId)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace WorkFlowCheck.BL.Services.Interfaces
|
|||||||
{
|
{
|
||||||
public interface IMessageService
|
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<bool> SendFCMTokenAsync(string token);
|
||||||
Task<string> GetLastFCMTokensAsync();
|
Task<string> GetLastFCMTokensAsync();
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace WorkFlowCheck.BL.Services
|
|||||||
_settings = configuration.GetSection("EmailSettings").Get<EmailSettings>()!;
|
_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();
|
var message = new MimeMessage();
|
||||||
message.From.Add(new MailboxAddress(_settings.SenderName, _settings.Username));
|
message.From.Add(new MailboxAddress(_settings.SenderName, _settings.Username));
|
||||||
@@ -40,11 +40,17 @@ namespace WorkFlowCheck.BL.Services
|
|||||||
|
|
||||||
message.Subject = subject;
|
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();
|
using var smtp = new SmtpClient();
|
||||||
await smtp.ConnectAsync(_settings.SmtpServer, _settings.SmtpPort, SecureSocketOptions.StartTls);
|
await smtp.ConnectAsync(_settings.SmtpServer, _settings.SmtpPort, SecureSocketOptions.StartTls);
|
||||||
await smtp.AuthenticateAsync(_settings.Username, _settings.Password);
|
await smtp.AuthenticateAsync(_settings.Username, _settings.Password);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="HtmlTemplates\AcceptCheckListHeaderBody.html" />
|
||||||
<EmbeddedResource Include="HtmlTemplates\Token2FBody.html" />
|
<EmbeddedResource Include="HtmlTemplates\Token2FBody.html" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
+28
-8
@@ -34,10 +34,17 @@
|
|||||||
<form method="post" id="CheckListHeaderForm">
|
<form method="post" id="CheckListHeaderForm">
|
||||||
<meta name="csrf-token" content="@Antiforgery.GetAndStoreTokens(HttpContext).RequestToken" />
|
<meta name="csrf-token" content="@Antiforgery.GetAndStoreTokens(HttpContext).RequestToken" />
|
||||||
<input type="hidden" asp-for="CheckListHeaderDTO.Id" />
|
<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="row">
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<label asp-for="CheckListHeaderDTO.DocumentNumber"></label>
|
<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>
|
<span asp-validation-for="CheckListHeaderDTO.DocumentNumber" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
@@ -202,7 +209,9 @@
|
|||||||
var formData = getFormAsNestedObject('#CheckListHeaderForm');
|
var formData = getFormAsNestedObject('#CheckListHeaderForm');
|
||||||
const $form = $('#CheckListHeaderForm');
|
const $form = $('#CheckListHeaderForm');
|
||||||
|
|
||||||
formData.CheckListHeader.RoleDTO=[];
|
formData.CheckListHeaderDTO.CheckListRowDTO=[];
|
||||||
|
|
||||||
|
console.log(formData.CheckListHeaderDTO);
|
||||||
|
|
||||||
if ($form.valid())
|
if ($form.valid())
|
||||||
{
|
{
|
||||||
@@ -213,13 +222,24 @@
|
|||||||
'X-CSRF-TOKEN': csrfToken,
|
'X-CSRF-TOKEN': csrfToken,
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
},
|
},
|
||||||
data: JSON.stringify(formData.CheckListHeader),
|
data: JSON.stringify(formData.CheckListHeaderDTO),
|
||||||
success: function (response) {
|
success: function (response) {
|
||||||
showMessageModal({
|
if (response.success)
|
||||||
title: 'Figyelmem!',
|
{
|
||||||
message: 'Sikeres mentés.',
|
showMessageModal({
|
||||||
okText: 'Értettem'
|
title: 'Figyelmem!',
|
||||||
});
|
message: 'Sikeres mentés.',
|
||||||
|
okText: 'Értettem'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
showMessageModal({
|
||||||
|
title: 'Figyelmem, HIBA!',
|
||||||
|
message: 'Sikertelen mentés.',
|
||||||
|
okText: 'Értettem'
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
error: function (xhr, status, error) {
|
error: function (xhr, status, error) {
|
||||||
// Hiba esetén
|
// Hiba esetén
|
||||||
|
|||||||
+22
@@ -1,6 +1,7 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
|
using Serilog;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using WorkFlowCheck.Common.DTO;
|
using WorkFlowCheck.Common.DTO;
|
||||||
using WorkFlowCheck.Web.Services.Interfaces;
|
using WorkFlowCheck.Web.Services.Interfaces;
|
||||||
@@ -32,6 +33,27 @@ namespace WorkFlowCheck.Web.Pages.CheckList.CheckListHeader
|
|||||||
CheckStatus = _checkListService.GetCheckStatus();
|
CheckStatus = _checkListService.GetCheckStatus();
|
||||||
BuildCheckListHeaderInfo();
|
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()
|
private void BuildCheckListHeaderInfo()
|
||||||
{
|
{
|
||||||
CheckListHeaderInfoDTO = new CheckListHeaderInfoDTO();
|
CheckListHeaderInfoDTO = new CheckListHeaderInfoDTO();
|
||||||
|
|||||||
@@ -58,7 +58,34 @@ namespace WorkFlowCheck.Web.Services
|
|||||||
}
|
}
|
||||||
return retVal;
|
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)
|
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.
|
// for details on configuring this project to bundle and minify static web assets.
|
||||||
|
|
||||||
// Write your JavaScript code.
|
// 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) {
|
function getFormAsNestedObject(formSelector) {
|
||||||
var formArray = $(formSelector).serializeArray();
|
var formArray = $(formSelector).serializeArray();
|
||||||
var result = {};
|
var result = {};
|
||||||
|
|
||||||
formArray.forEach(function (item) {
|
formArray.forEach(function (item) {
|
||||||
var keys = item.name.split('.');
|
var keys = item.name.split('.');
|
||||||
var value = item.value;
|
var value = parseValue(item.value);
|
||||||
var current = result;
|
var current = result;
|
||||||
|
|
||||||
for (var i = 0; i < keys.length; i++) {
|
for (var i = 0; i < keys.length; i++) {
|
||||||
|
|||||||
Reference in New Issue
Block a user