diff --git a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs index d4bebfe..c53be87 100644 --- a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs +++ b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs @@ -88,8 +88,8 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria using MemoryStream stream = new MemoryStream(); workbook.SaveAs(stream); stream.Position = 0; - - SendEmail(stream); + + SendEmail(stream, wzHeader); } private static string GetColumnLetter(int columnIndex) @@ -104,7 +104,7 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria return columnName; } - private void SendEmail(MemoryStream stream) + private void SendEmail(MemoryStream stream, WzHeaderDto wzHeader) { IConfigurationSection smtpSettings = configuration.GetSection("EmailSettings"); string smtpHost = smtpSettings["SmtpServer"] ?? string.Empty; @@ -112,7 +112,8 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria string smtpUsername = smtpSettings["SenderEmail"] ?? string.Empty; string smtpPassword = smtpSettings["SenderPassword"] ?? string.Empty; string fromEmail = smtpSettings["SenderEmail"] ?? string.Empty; - List toEmail = (smtpSettings["RecipientEmail"] ?? string.Empty).Split(',').ToList(); + List toEmail = wzHeader.EmailAddresses?.Split(',')?.ToList() ?? + (smtpSettings["RecipientEmail"] ?? string.Empty).Split(',').ToList(); string subject = "MEYLE: Packing List"; string body = $"W załączeniu znajduje się Packing List dla klienta MEYLE wygenerowany {DateTime.Now:dd.MM.yyyy HH:mm:ss}"; diff --git a/FaKrosnoApi/Controllers/WzHeaderController.cs b/FaKrosnoApi/Controllers/WzHeaderController.cs index 9ab9496..74f6b64 100644 --- a/FaKrosnoApi/Controllers/WzHeaderController.cs +++ b/FaKrosnoApi/Controllers/WzHeaderController.cs @@ -52,4 +52,16 @@ public class WzHeaderController(IWzHeaderService service, IMaterialTransactionSe WzHeaderDto? wzHeader = await service.GetById(id); return wzHeader != null ? Ok(wzHeader) : NotFound(); } + + [HttpPost("add-emails")] + public async Task AddEmailsToWzHeader([FromQuery] Guid id, [FromBody] string emailAddresses) + { + if (string.IsNullOrWhiteSpace(emailAddresses)) + { + return BadRequest("Email addresses cannot be empty."); + } + + await service.AddEmailsToWzHeader(id, emailAddresses); + return NoContent(); + } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index 51be593..d858eb3 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -8,6 +8,7 @@ @using FilterType = Syncfusion.Blazor.Grids.FilterType @using SelectionMode = Syncfusion.Blazor.Grids.SelectionMode @using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Popups @inject WarehouseService WarehouseService @inject NavigationManager NavigationManager @@ -61,8 +62,7 @@
Packling Listy
- + @@ -82,6 +83,18 @@ } + + + + +

Błąd: Zaznacz przynajmniej jeden rekord, żeby wygenerowac Pack List!

+
+
+ + + +
+ FA Krosno Manager © @(DateTime.Now.Year) @@ -90,7 +103,6 @@ @code { private SfGrid _grid; - private SfGrid _wzHeadersGrid; private IEnumerable _clients = new List(); private IEnumerable _materialTransactions = new List(); private IEnumerable _dataSource = new List(); @@ -101,6 +113,8 @@ private WzHeaderDto? _selectedHeader; private SfDropDownList _dropdown; private bool _isVisible; + + private bool Visibility { get; set; } protected override async Task OnAfterRenderAsync(bool firstRender) { @@ -109,14 +123,15 @@ _clients = await WarehouseService.GetAllClientsAsync(); _clients = _clients.Where(x => x.Name.Equals("MEYLE", StringComparison.OrdinalIgnoreCase)); + StateHasChanged(); + var savedClientId = await LocalStorage.GetItemAsync("SelectedClientId"); if (savedClientId != null && _clients.FirstOrDefault(c => c.ID == savedClientId) is {} savedClient) { await OnValueChange(new ChangeEventArgs() { Value = savedClient.ID }); - } - - StateHasChanged(); + StateHasChanged(); + } } } @@ -156,43 +171,54 @@ private async Task CreatePackingList() { var selectedRecords = await _grid.GetSelectedRecordsAsync(); - if (selectedRecords.Any()) + + if (!selectedRecords.Any()) { - WzHeaderDto wzHeader = new WzHeaderDto - { - ID = Guid.NewGuid(), - FK_Client = _selectedClient?.ID - }; - - await WarehouseService.CreateWzHeaderAsync(wzHeader); - - switch (_selectedClient?.Name.ToUpper()) - { - case "MEYLE": - IList rows = new List(); - IList materialTransactions = _materialTransactions.Where(x => selectedRecords.Any(y => y.MTGroupNum == x.MTGroupNum)).ToList(); - - foreach (MaterialTransactionDto materialTransactionDto in materialTransactions) - { - CustomerOrderDto customerOrder = await WarehouseService.GetCustomerOrder(materialTransactionDto.RefNum ?? string.Empty); - ItemCustDto item = await WarehouseService.GetItem(materialTransactionDto.Item ?? string.Empty, customerOrder.CustNum); - - rows.Add(new WzRowMeyleDto - { - ID = Guid.NewGuid(), - Quantity = Math.Abs((int?)materialTransactionDto.Qty ?? 0), - ItemNumber = item.CustItem, - OrderNumber = customerOrder.CustPo, - WzNumber = materialTransactionDto.MTGroupNum ?? string.Empty, - FK_Header = wzHeader.ID - }); - } - - await WarehouseService.CreateWzRowsMeyleAsync(rows); - break; - } - - NavigationManager.NavigateTo("/Warehouse/PackList/" + wzHeader.ID); + Visibility = true; + return; } + + WzHeaderDto wzHeader = new WzHeaderDto + { + ID = Guid.NewGuid(), + FK_Client = _selectedClient?.ID, + CreatedDate = DateTime.Now, + WzNumbers = string.Join(", ",selectedRecords.Select(x => x.MTGroupNum).Distinct()) + }; + + await WarehouseService.CreateWzHeaderAsync(wzHeader); + + switch (_selectedClient?.Name.ToUpper()) + { + case "MEYLE": + IList rows = new List(); + IList materialTransactions = _materialTransactions.Where(x => selectedRecords.Any(y => y.MTGroupNum == x.MTGroupNum)).ToList(); + + foreach (MaterialTransactionDto materialTransactionDto in materialTransactions) + { + CustomerOrderDto customerOrder = await WarehouseService.GetCustomerOrder(materialTransactionDto.RefNum ?? string.Empty); + ItemCustDto item = await WarehouseService.GetItem(materialTransactionDto.Item ?? string.Empty, customerOrder.CustNum); + + rows.Add(new WzRowMeyleDto + { + ID = Guid.NewGuid(), + Quantity = Math.Abs((int?)materialTransactionDto.Qty ?? 0), + ItemNumber = item.CustItem, + OrderNumber = customerOrder.CustPo, + WzNumber = materialTransactionDto.MTGroupNum ?? string.Empty, + FK_Header = wzHeader.ID + }); + } + + await WarehouseService.CreateWzRowsMeyleAsync(rows); + break; + } + + NavigationManager.NavigateTo("/Warehouse/PackList/" + wzHeader.ID); + } + + private void HideModal() + { + Visibility = false; } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 88f29de..a6dd35f 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -4,6 +4,7 @@ @using SytelineSaAppEfDataModel.Dtos @using Syncfusion.Blazor.Navigations @using Syncfusion.Blazor.Popups +@using Syncfusion.Blazor.Inputs @inject WarehouseService WarehouseService @@ -13,6 +14,12 @@

Packing List

+ + + + + + - - + @@ -68,7 +75,11 @@ {

Packing List został wygenerowany i wysłany!

} - else + else if(string.IsNullOrWhiteSpace(EmailAddresses)) + { +

Błąd: Proszę wprowadzić przynajmniej jeden ADRES EMAIL do wysyłki raportu!

+ } + else if (!_isValid) {

Błąd: Nie Wszystkie linie mają wypełniony NUMER PALETY.
Packing List nie zostanie wygenerowany!

} @@ -90,11 +101,14 @@ private SfGrid _grid; private IEnumerable _wzRowsMeyle { get; set; } = new List(); + private WzHeaderDto _wzHeader; private bool _isValid; - + private bool Visibility { get; set; } + private string EmailAddresses { get; set; } = string.Empty; + private void HideModal() { Visibility = false; @@ -104,13 +118,18 @@ { if (firstRender) { + _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); + + EmailAddresses = _wzHeader.EmailAddresses; + StateHasChanged(); } } private async Task SaveChanges() { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); await _grid.EndEditAsync(); } @@ -119,6 +138,8 @@ var changes = obj.BatchChanges; var changedRecords = changes.ChangedRecords; + if (!changedRecords.Any()) return; + await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); @@ -129,11 +150,13 @@ private async Task ExportXls() { int count = _wzRowsMeyle.Count(x => x.PalletNumber == null); - - _isValid = count == 0; + _isValid = count == 0; + _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); + if (_isValid) { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); await WarehouseService.GenerateXlsForMeyleAsync(WzHeader); } diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index f9c8ac4..b74faf5 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -6,6 +6,13 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) { private readonly HttpClient _httpClient = httpClientFactory.CreateClient("FaKrosnoApi"); + public async Task GetWzHeaderByIdAsync(Guid wzHeaderId) + { + var response = await _httpClient.GetAsync($"api/WzHeader/by-id?id={wzHeaderId}"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync(); + } + public async Task> GetAllClientsAsync() { var response = await _httpClient.GetAsync($"api/WzClient"); @@ -98,4 +105,13 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) throw new Exception("Failed to generate XLS for Mayle"); } } + + public async Task AddEmailsToWzHeaderAsync(Guid wzHeaderId, string emailAddresses) + { + var response = await _httpClient.PostAsJsonAsync( + $"api/WzHeader/add-emails?id={wzHeaderId}", + emailAddresses); + + response.EnsureSuccessStatusCode(); + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs b/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs index ffbe71c..c618a0e 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs @@ -5,6 +5,7 @@ public class WzHeaderDto public Guid ID { get; set; } public Guid? FK_Client { get; set; } public DateTime CreatedDate { get; set; } - + public string? EmailAddresses { get; set; } + public string? WzNumbers { get; set; } public IEnumerable WzRowsMeyle { get; set; } = new List(); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzHeader.cs b/SytelineSaAppEfDataModel/Entities/WzHeader.cs index 9c79c28..8fabda1 100644 --- a/SytelineSaAppEfDataModel/Entities/WzHeader.cs +++ b/SytelineSaAppEfDataModel/Entities/WzHeader.cs @@ -5,6 +5,8 @@ public class WzHeader public Guid ID { get; set; } public Guid? FK_Client { get; set; } public DateTime CreatedDate { get; set; } + public string? EmailAddresses { get; set; } + public string? WzNumbers { get; set; } // Navigation property public WzClient Client { get; set; } diff --git a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs index cecf78a..53b59b8 100644 --- a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs @@ -8,4 +8,5 @@ public interface IWzHeaderService Task> GetByCustomerNumber(string customerNumber, int customerSequence); Task CreateHeader(WzHeaderDto wzHeader); Task GetById(Guid id); + Task AddEmailsToWzHeader(Guid id, string emailAddresses); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs index 28718f2..5779d2e 100644 --- a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs @@ -37,4 +37,18 @@ public class WzHeaderService(SytelineSaAppDbContext context, IMapper mapper) : I return wzHeader; } + + public async Task AddEmailsToWzHeader(Guid id, string emailAddresses) + { + var entity = await context.WzHeaders.FindAsync(id); + + if (entity == null) + { + throw new KeyNotFoundException($"WzHeader with ID {id} not found."); + } + + entity.EmailAddresses = emailAddresses; + context.WzHeaders.Update(entity); + await context.SaveChangesAsync(); + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 9ce067d..da3081d 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -901,6 +901,16 @@ namespace SytelineSaAppEfDataModel .HasColumnName("CreatedDate") .HasColumnType("DateTime") .IsRowVersion(); + + entity.Property(e => e.EmailAddresses) + .HasColumnName("EmailAddresses") + .HasMaxLength(1000) + .IsRequired(false); + + entity.Property(e => e.WzNumbers) + .HasColumnName("WzNumbers") + .HasMaxLength(500) + .IsRequired(false); // Relationship entity.HasOne(e => e.Client)