From 04e18374da67cde021dc9ed0e76a572cbfcb191b Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Wed, 7 May 2025 20:03:29 +0200 Subject: [PATCH 001/149] * Added Recipient description to Products view --- FaKrosnoEfDataModel/Dtos/ProductDto.cs | 3 +++ FaKrosnoEfDataModel/Entities/Product.cs | 2 ++ OrdersManagement/Components/Pages/Products.razor | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/FaKrosnoEfDataModel/Dtos/ProductDto.cs b/FaKrosnoEfDataModel/Dtos/ProductDto.cs index 6883ce1..26a67eb 100644 --- a/FaKrosnoEfDataModel/Dtos/ProductDto.cs +++ b/FaKrosnoEfDataModel/Dtos/ProductDto.cs @@ -6,4 +6,7 @@ public class ProductDto : DtoBase public int RecipientID { get; set; } public string RecipientIdx { get; set; } public string FaIdx { get; set; } + public string RecipientName => Recipient.RecipientDesc; + + public RecipientDto Recipient { get; set; } } \ No newline at end of file diff --git a/FaKrosnoEfDataModel/Entities/Product.cs b/FaKrosnoEfDataModel/Entities/Product.cs index 554a2ac..afd31c1 100644 --- a/FaKrosnoEfDataModel/Entities/Product.cs +++ b/FaKrosnoEfDataModel/Entities/Product.cs @@ -6,4 +6,6 @@ public class Product : EntityBase public int RecipientID { get; set; } public string RecipientIdx { get; set; } public string FaIdx { get; set; } + + public Recipient Recipient { get; set; } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/Products.razor b/OrdersManagement/Components/Pages/Products.razor index 3ef59a6..3f836cc 100644 --- a/OrdersManagement/Components/Pages/Products.razor +++ b/OrdersManagement/Components/Pages/Products.razor @@ -18,7 +18,7 @@ Toolbar="@(new List { "Update" })"> - + From 9f3899813508b00c841cce1c1f6927506ec42f1d Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Wed, 7 May 2025 20:15:20 +0200 Subject: [PATCH 002/149] * Fixed issue with wrong Recipient mapping --- FaKrosnoEfDataModel/Dtos/ProductDto.cs | 2 +- .../Services/ProductService.cs | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/FaKrosnoEfDataModel/Dtos/ProductDto.cs b/FaKrosnoEfDataModel/Dtos/ProductDto.cs index 26a67eb..d2f00b5 100644 --- a/FaKrosnoEfDataModel/Dtos/ProductDto.cs +++ b/FaKrosnoEfDataModel/Dtos/ProductDto.cs @@ -6,7 +6,7 @@ public class ProductDto : DtoBase public int RecipientID { get; set; } public string RecipientIdx { get; set; } public string FaIdx { get; set; } - public string RecipientName => Recipient.RecipientDesc; + public string RecipientName { get; set; } public RecipientDto Recipient { get; set; } } \ No newline at end of file diff --git a/FaKrosnoEfDataModel/Services/ProductService.cs b/FaKrosnoEfDataModel/Services/ProductService.cs index cebdfa2..1788ea3 100644 --- a/FaKrosnoEfDataModel/Services/ProductService.cs +++ b/FaKrosnoEfDataModel/Services/ProductService.cs @@ -20,9 +20,24 @@ public class ProductService : ServiceBase, IProductService public async Task> GetEntitiesToFix(string indexName) { + IList recipients = + (await Context.Recipients.ToListAsync()).Select(x => Mapper.Map(x)).ToList(); IList products = (await GetAll()).ToList(); - - return products.Where(x => x?.FaIdx == indexName); + + IEnumerable productDtos = products.Where(x => x?.FaIdx == indexName); + + foreach (ProductDto productDto in productDtos) + { + RecipientDto? recipient = recipients.FirstOrDefault(x => x.ID == productDto.RecipientID); + + if (recipient != null) + { + productDto.Recipient = recipient; + productDto.RecipientName = recipient.RecipientDesc; + } + } + + return productDtos; } public async Task UpdateEntity(ProductDto entity) From 1f08ae05f09e7e0499dc102771f6281957c1d6ec Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Wed, 7 May 2025 21:21:02 +0200 Subject: [PATCH 003/149] * Created Entities, Dtos and Mapping for WzClient and WzHeader --- .../Components/Layout/MainLayout.razor | 1 + .../Components/Pages/Warehouse.razor | 78 +++++++++++++++++++ SytelineSaAppEfDataModel/Dtos/WzClientDto.cs | 9 +++ SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs | 8 ++ SytelineSaAppEfDataModel/Entities/WzClient.cs | 9 +++ SytelineSaAppEfDataModel/Entities/WzHeader.cs | 11 +++ SytelineSaAppEfDataModel/MappingProfile.cs | 1 + .../Services/IWzClientService.cs | 8 ++ .../Services/IWzHeaderService.cs | 8 ++ .../Services/WzClientService.cs | 13 ++++ .../Services/WzHeaderService.cs | 13 ++++ .../SytelineSaAppDbContext.cs | 56 +++++++++++++ 12 files changed, 215 insertions(+) create mode 100644 OrdersManagement/Components/Pages/Warehouse.razor create mode 100644 SytelineSaAppEfDataModel/Dtos/WzClientDto.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/WzClient.cs create mode 100644 SytelineSaAppEfDataModel/Entities/WzHeader.cs create mode 100644 SytelineSaAppEfDataModel/Services/IWzClientService.cs create mode 100644 SytelineSaAppEfDataModel/Services/IWzHeaderService.cs create mode 100644 SytelineSaAppEfDataModel/Services/WzClientService.cs create mode 100644 SytelineSaAppEfDataModel/Services/WzHeaderService.cs diff --git a/OrdersManagement/Components/Layout/MainLayout.razor b/OrdersManagement/Components/Layout/MainLayout.razor index 1906219..d650ddc 100644 --- a/OrdersManagement/Components/Layout/MainLayout.razor +++ b/OrdersManagement/Components/Layout/MainLayout.razor @@ -34,6 +34,7 @@ + @* *@ @* *@ @if (UserName == "pkus") diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor new file mode 100644 index 0000000..2023ffe --- /dev/null +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -0,0 +1,78 @@ +@page "/Warehouse" + +@using Syncfusion.Blazor.Cards +@using Syncfusion.Blazor.Grids + +
+ + +

Dokumenty WZ na Magazynie

+
+ + + + + @{ + var order = context as EdiCustomerOrderDto; + + +
+
+ Numer zamówienia EDI: @order?.CustomerOrderNumber
+ Numer zamówienia Klienta: @order?.CustomerPoNumber
+ Numer klienta: @order?.CustomerNumber
+ Klient: @order?.CustomerName
+ Numer odbiorcy: @(order?.CustomerSequence?.ToString() ?? "N/A")
+ Data otrzymania: @(order?.RecivedDate?.ToString("dd.MM.yyyy") ?? "N/A")
+ Wysłano do Syteline?: @((order?.Posted?.ToString() ?? "0") == "0" ? "NIE" : "TAK")
+ Data wysyłki do Syteline: @(order?.PostedDate?.ToString("dd.MM.yyyy") ?? "N/A")
+ Data zamówienia: @(order?.OrderDate?.ToString("dd.MM.yyyy") ?? "N/A")
+
+
+ Cena: @(order?.Price?.ToString("F2") ?? "N/A")
+ Waga: @(order?.Weight?.ToString("F2") ?? "N/A")
+ Magazyn: @order?.Warehouse
+ Gate: @order?.Gate
+ Kod odbiorcy: @order?.RecipientCode
+ Kod wysyłającego: @order?.SenderCode
+ Kod sprzedawcy: @order?.SellerCode
+ Kod kupującego: @order?.BuyerCode
+ Typ dokumentu: @order?.DocType
+
+
+
+
+ } +
+
+ + + + + + + + + + + + + +
+
+ + FA Krosno Manager © @(DateTime.Now.Year) + +
+
+ +@code { + +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs new file mode 100644 index 0000000..d3d8e49 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs @@ -0,0 +1,9 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class WzClientDto +{ + public Guid ID { get; set; } + public string CustomerNumber { get; set; } + public int? CustomerSequence { get; set; } + public DateTime CreatedDate { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs b/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs new file mode 100644 index 0000000..b45c435 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs @@ -0,0 +1,8 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class WzHeaderDto +{ + public Guid ID { get; set; } + public Guid? FK_Client { get; set; } + public DateTime CreatedDate { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzClient.cs b/SytelineSaAppEfDataModel/Entities/WzClient.cs new file mode 100644 index 0000000..117aaa2 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/WzClient.cs @@ -0,0 +1,9 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class WzClient +{ + public Guid ID { get; set; } + public string CustomerNumber { get; set; } + public int? CustomerSequence { get; set; } + public DateTime CreatedDate { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzHeader.cs b/SytelineSaAppEfDataModel/Entities/WzHeader.cs new file mode 100644 index 0000000..9c79c28 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/WzHeader.cs @@ -0,0 +1,11 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class WzHeader +{ + public Guid ID { get; set; } + public Guid? FK_Client { get; set; } + public DateTime CreatedDate { get; set; } + + // Navigation property + public WzClient Client { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index d8d3847..d75825e 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -20,6 +20,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/IWzClientService.cs b/SytelineSaAppEfDataModel/Services/IWzClientService.cs new file mode 100644 index 0000000..09e91dc --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IWzClientService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IWzClientService +{ + Task> GetAll(); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs new file mode 100644 index 0000000..ef77795 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IWzHeaderService +{ + Task> GetAll(); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzClientService.cs b/SytelineSaAppEfDataModel/Services/WzClientService.cs new file mode 100644 index 0000000..1b7086e --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/WzClientService.cs @@ -0,0 +1,13 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public class WzClientService(SytelineSaAppDbContext context, IMapper mapper) : IWzClientService +{ + public async Task> GetAll() + { + return await context.WzClients.Select(x => mapper.Map(x)).ToListAsync(); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs new file mode 100644 index 0000000..ea2f02d --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs @@ -0,0 +1,13 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public class WzHeaderService(SytelineSaAppDbContext context, IMapper mapper) : IWzHeaderService +{ + public async Task> GetAll() + { + return await context.WzHeaders.Select(x => mapper.Map(x)).ToListAsync(); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index ec06d4d..d34fe3f 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -20,6 +20,9 @@ namespace SytelineSaAppEfDataModel public DbSet EdiUsers { get; set; } public DbSet MaterialTransactions { get; set; } + + public DbSet WzClients { get; set; } + public DbSet WzHeaders { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { @@ -875,6 +878,59 @@ namespace SytelineSaAppEfDataModel .HasMaxLength(20) .IsRequired(false); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("wz_header"); + + entity.HasKey(e => e.ID); + + entity.Property(e => e.ID) + .HasColumnName("ID") + .HasColumnType("uniqueidentifier"); + + entity.Property(e => e.FK_Client) + .HasColumnName("FK_Client") + .HasColumnType("uniqueidentifier") + .IsRequired(false); + + entity.Property(e => e.CreatedDate) + .HasColumnName("CreatedDate") + .HasColumnType("timestamp") + .IsRowVersion(); + + // Relationship + entity.HasOne(e => e.Client) + .WithMany() + .HasForeignKey(e => e.FK_Client) + .HasConstraintName("wz_header_wz_clients_ID_fk"); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("wz_clients"); + + entity.HasKey(e => e.ID); + + entity.Property(e => e.ID) + .HasColumnName("ID") + .HasColumnType("uniqueidentifier"); + + entity.Property(e => e.CustomerNumber) + .HasColumnName("CustomerNumber") + .HasMaxLength(20) + .IsRequired(false); + + entity.Property(e => e.CustomerSequence) + .HasColumnName("CustomerSequence") + .HasColumnType("int") + .IsRequired(false); + + entity.Property(e => e.CreatedDate) + .HasColumnName("CreatedDate") + .HasColumnType("timestamp") + .IsRowVersion(); + }); } } } From da1eae8ca91d29a1d3ba9fa788cfe74622228f62 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 May 2025 20:44:20 +0200 Subject: [PATCH 004/149] * Added new Controllers to API * Added methods to get WZs for specific client --- FaKrosnoApi/Controllers/WzClientController.cs | 17 ++++ FaKrosnoApi/Controllers/WzHeaderController.cs | 26 +++++ FaKrosnoApi/Program.cs | 5 +- .../Components/Pages/Warehouse.razor | 96 ++++++++----------- OrdersManagement/Program.cs | 1 + OrdersManagement/Services/WarehouseService.cs | 21 ++++ .../Services/IMaterialTransactionService.cs | 1 + .../Services/MaterialTransactionService.cs | 17 ++++ 8 files changed, 125 insertions(+), 59 deletions(-) create mode 100644 FaKrosnoApi/Controllers/WzClientController.cs create mode 100644 FaKrosnoApi/Controllers/WzHeaderController.cs create mode 100644 OrdersManagement/Services/WarehouseService.cs diff --git a/FaKrosnoApi/Controllers/WzClientController.cs b/FaKrosnoApi/Controllers/WzClientController.cs new file mode 100644 index 0000000..2e0e653 --- /dev/null +++ b/FaKrosnoApi/Controllers/WzClientController.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class WzClientController(IWzClientService service) : Controller +{ + [HttpGet] + public async Task>> GetAll() + { + IEnumerable wzClients = await service.GetAll(); + return Ok(wzClients); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/WzHeaderController.cs b/FaKrosnoApi/Controllers/WzHeaderController.cs new file mode 100644 index 0000000..1fb947e --- /dev/null +++ b/FaKrosnoApi/Controllers/WzHeaderController.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class WzHeaderController(IWzHeaderService service, IMaterialTransactionService materialTransactionService) : Controller +{ + [HttpGet] + public async Task>> GetAll() + { + IEnumerable wzHeaders = await service.GetAll(); + return Ok(wzHeaders); + } + + [HttpGet("by-customer-number")] + public async Task>> GetByCustomerNumber( + [FromQuery] string customerNumber, [FromQuery] int customerSequence) + { + IEnumerable materialTransactions = + await materialTransactionService.GetByCustomerNumber(customerNumber, customerSequence); + return Ok(materialTransactions); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index d0e531f..b4d5d9a 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -65,7 +65,7 @@ builder.Services.AddOpenApiDocument(config => In = OpenApiSecurityApiKeyLocation.Header, Description = "Wprowadź token JWT w formacie: Bearer {token}" }); - + config.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer")); }); @@ -100,6 +100,9 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index 2023ffe..74081f0 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -2,6 +2,9 @@ @using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Grids +@using SytelineSaAppEfDataModel.Dtos + +@inject WarehouseService WarehouseService
@@ -9,63 +12,34 @@

Dokumenty WZ na Magazynie

- - - - @{ - var order = context as EdiCustomerOrderDto; - - -
-
- Numer zamówienia EDI: @order?.CustomerOrderNumber
- Numer zamówienia Klienta: @order?.CustomerPoNumber
- Numer klienta: @order?.CustomerNumber
- Klient: @order?.CustomerName
- Numer odbiorcy: @(order?.CustomerSequence?.ToString() ?? "N/A")
- Data otrzymania: @(order?.RecivedDate?.ToString("dd.MM.yyyy") ?? "N/A")
- Wysłano do Syteline?: @((order?.Posted?.ToString() ?? "0") == "0" ? "NIE" : "TAK")
- Data wysyłki do Syteline: @(order?.PostedDate?.ToString("dd.MM.yyyy") ?? "N/A")
- Data zamówienia: @(order?.OrderDate?.ToString("dd.MM.yyyy") ?? "N/A")
-
-
- Cena: @(order?.Price?.ToString("F2") ?? "N/A")
- Waga: @(order?.Weight?.ToString("F2") ?? "N/A")
- Magazyn: @order?.Warehouse
- Gate: @order?.Gate
- Kod odbiorcy: @order?.RecipientCode
- Kod wysyłającego: @order?.SenderCode
- Kod sprzedawcy: @order?.SellerCode
- Kod kupującego: @order?.BuyerCode
- Typ dokumentu: @order?.DocType
-
-
-
-
- } -
-
- - - - - - - - - - - - - -
+ @* *@ + @* *@ + @* *@ + @* @{ *@ + @* } *@ + @* *@ + @* *@ + @* *@ + @* $1$ #1# *@ + @* $1$ #1# *@ + @* $1$ #1# *@ + @* $1$ #1# *@ + @* $1$ #1# *@ + @* $1$ #1# *@ + @* $1$ #1# *@ + @* *@ + @* *@ + @* *@ + @* *@ + @* $1$ #1# *@ + @* *@
FA Krosno Manager © @(DateTime.Now.Year) @@ -74,5 +48,11 @@
@code { - + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + IEnumerable task = await WarehouseService.GetAllClientWzsAsync("K005531", 0); + } + } } \ No newline at end of file diff --git a/OrdersManagement/Program.cs b/OrdersManagement/Program.cs index 2a820f3..04c31b1 100644 --- a/OrdersManagement/Program.cs +++ b/OrdersManagement/Program.cs @@ -52,6 +52,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); var app = builder.Build(); diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs new file mode 100644 index 0000000..656b549 --- /dev/null +++ b/OrdersManagement/Services/WarehouseService.cs @@ -0,0 +1,21 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace OrdersManagement.Services; + +public class WarehouseService +{ + private readonly HttpClient _httpClient; + + public WarehouseService(IHttpClientFactory httpClientFactory) + { + _httpClient = httpClientFactory.CreateClient("FaKrosnoApi"); + } + + public async Task> GetAllClientWzsAsync(string customerNumber, int customerSequence) + { + var response = await _httpClient.GetAsync( + $"api/WzHeader/by-customer-number?customerNumber={customerNumber}&customerSequence={customerSequence}"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync>(); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs index 9050da6..78535cb 100644 --- a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs @@ -9,4 +9,5 @@ public interface IMaterialTransactionService Task> GetByWzNumbers(ISet wzNumbers); Task> GetByOrderNumber(string orderNumber); Task> GetOrderNumbersByWz(ISet wzNumbers); + Task> GetByCustomerNumber(string customerNumber, int customerSequence); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs index a2e9fb8..4cdff57 100644 --- a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs @@ -66,4 +66,21 @@ public class MaterialTransactionService(SytelineSaAppDbContext context, IMapper return result.Select(x => mapper.Map(x)); } + + public async Task> GetByCustomerNumber(string customerNumber, int customerSequence) + { + IList coNumbers = await context.CustomerOrders + .Where(x => x.CustNum == customerNumber && x.CustSeq == customerSequence && (x.Stat == "P" || x.Stat == "O")) + .Select(x => x.CoNum).ToListAsync(); + + List result = new List(); + + foreach (string coNumber in coNumbers) + { + IEnumerable materialTransactions = await GetByOrderNumber(coNumber); + result.AddRange(materialTransactions); + } + + return result.OrderByDescending(x => x.CreateDate); + } } \ No newline at end of file From 55f7ed76fdc9686522c6125128792c40af99f5d5 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 16 May 2025 21:48:43 +0200 Subject: [PATCH 005/149] * Further improvements to generate Packing List --- .../Controllers/HangfireJobsController.cs | 302 +++++++++--------- FaKrosnoApi/Controllers/WzHeaderController.cs | 12 + .../Controllers/WzRowMeyleController.cs | 29 ++ FaKrosnoApi/Program.cs | 1 + .../Components/Layout/MainLayout.razor | 18 +- .../Components/Pages/Admin/Scheduler.razor | 2 +- .../Components/Pages/Admin/UsersManager.razor | 2 +- .../Components/Pages/CustomerOrder.razor | 2 +- .../Components/Pages/CustomerOrders.razor | 2 +- .../Pages/CustomerOrdersTranslations.razor | 2 +- .../Components/Pages/EdiCustomerOrder.razor | 2 +- .../Components/Pages/EdiCustomerOrders.razor | 2 +- .../Components/Pages/Warehouse.razor | 126 ++++++-- .../Components/Pages/WarehousePackList.razor | 7 + OrdersManagement/Services/WarehouseService.cs | 30 +- SytelineSaAppEfDataModel/Dtos/WzClientDto.cs | 1 + .../Dtos/WzRowMeyleDto.cs | 13 + SytelineSaAppEfDataModel/Entities/WzClient.cs | 1 + .../Entities/WzRowMeyle.cs | 16 + SytelineSaAppEfDataModel/MappingProfile.cs | 2 + .../Services/IWzHeaderService.cs | 1 + .../Services/IWzRowMeyleService.cs | 9 + .../Services/WzHeaderService.cs | 8 + .../Services/WzRowMeyleService.cs | 21 ++ .../SytelineSaAppDbContext.cs | 61 +++- 25 files changed, 474 insertions(+), 198 deletions(-) create mode 100644 FaKrosnoApi/Controllers/WzRowMeyleController.cs create mode 100644 OrdersManagement/Components/Pages/WarehousePackList.razor create mode 100644 SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs create mode 100644 SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs create mode 100644 SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs diff --git a/FaKrosnoApi/Controllers/HangfireJobsController.cs b/FaKrosnoApi/Controllers/HangfireJobsController.cs index 86e89d0..e4b3bc1 100644 --- a/FaKrosnoApi/Controllers/HangfireJobsController.cs +++ b/FaKrosnoApi/Controllers/HangfireJobsController.cs @@ -16,155 +16,155 @@ public class HangfireJobsController( IRecurringJobManager recurringJobManager, ITaskSchedulerService service) : Controller { - [HttpGet("GetJobsToRun")] - public async Task>> GetJobsToRun() - { - IList jobsToRun = new List(); - - using (IStorageConnection? connection = jobStorage.GetConnection()) - { - IList? recurringJobs = connection.GetRecurringJobs(); - IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); - - foreach (var recurringJob in recurringJobs) - { - TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); - - if (taskScheduler != null) - { - jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, - recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); - } - } - } - - return Ok(jobsToRun); - } - - [HttpPost("run")] - public async Task RunJobs() - { - var jobsToRun = (await GetJobsToRun()).Value?.ToList(); - - if (jobsToRun == null || jobsToRun.Count == 0) - { - return BadRequest("Nie udało się pobrać zadań do uruchomienia."); - } - - foreach (var job in jobsToRun) - { - if (!string.IsNullOrEmpty(job.Path)) - { - recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, - new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - } - } - - return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); - } - - [HttpPost("add")] - public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) - { - var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler - { - Name = taskSchedulerDto.Name, - Path = taskSchedulerDto.Path, - CronOptions = taskSchedulerDto.CronOptions, - CreateDate = DateTime.UtcNow - }; - - int result = await service.AddTaskScheduler(taskSchedulerDto); - - if (result == 0) - { - return BadRequest("Nie udało się dodać zadania."); - } - - recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), - taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - - return Ok("Zadanie zostało dodane."); - } - - [HttpPost("delete")] - public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) - { - int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); - - if (result == 0) - { - return BadRequest("Nie udało się usunąć zadania."); - } - - recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); - - return Ok("Zadanie zostało usunięte."); - } - - [HttpGet] - public async Task>> GetTasks() - { - var tasks = await service.GetTaskSchedulers(); - - foreach (TaskSchedulerDto taskSchedulerDto in tasks) - { - var job = GetJob(taskSchedulerDto.Name); - taskSchedulerDto.LastExecution = job?.LastExecution; - taskSchedulerDto.NextExecution = job?.NextExecution; - } - - return Ok(tasks); - } - - [HttpGet("by-name")] - public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) - { - var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); - - if (taskSchedulerDto == null) return NotFound(); - - var job = GetJob(taskSchedulerDto.Name); - taskSchedulerDto.LastExecution = job?.LastExecution; - taskSchedulerDto.NextExecution = job?.NextExecution; - - return Ok(taskSchedulerDto); - } - - private RecurringJobDto? GetJob(string jobId) - { - using IStorageConnection? connection = jobStorage.GetConnection(); - IList? recurringJobs = connection.GetRecurringJobs(); - return recurringJobs.FirstOrDefault(x => x.Id == jobId); - } - - public void RunConsoleApplication(string pathToApp) - { - try - { - var process = new Process - { - StartInfo = new ProcessStartInfo - { - FileName = pathToApp, - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - CreateNoWindow = true, - WorkingDirectory = Path.GetDirectoryName(pathToApp) - } - }; - process.Start(); - string output = process.StandardOutput.ReadToEnd(); - string error = process.StandardError.ReadToEnd(); - process.WaitForExit(); - - Console.WriteLine($"Output: {output}"); - Console.WriteLine($"Error: {error}"); - } - catch (Exception ex) - { - Console.WriteLine($"Error executing console application: {ex.Message}"); - } - } + // [HttpGet("GetJobsToRun")] + // public async Task>> GetJobsToRun() + // { + // IList jobsToRun = new List(); + // + // using (IStorageConnection? connection = jobStorage.GetConnection()) + // { + // IList? recurringJobs = connection.GetRecurringJobs(); + // IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); + // + // foreach (var recurringJob in recurringJobs) + // { + // TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); + // + // if (taskScheduler != null) + // { + // jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, + // recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); + // } + // } + // } + // + // return Ok(jobsToRun); + // } + // + // [HttpPost("run")] + // public async Task RunJobs() + // { + // var jobsToRun = (await GetJobsToRun()).Value?.ToList(); + // + // if (jobsToRun == null || jobsToRun.Count == 0) + // { + // return BadRequest("Nie udało się pobrać zadań do uruchomienia."); + // } + // + // foreach (var job in jobsToRun) + // { + // if (!string.IsNullOrEmpty(job.Path)) + // { + // recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, + // new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + // } + // } + // + // return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); + // } + // + // [HttpPost("add")] + // public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) + // { + // var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler + // { + // Name = taskSchedulerDto.Name, + // Path = taskSchedulerDto.Path, + // CronOptions = taskSchedulerDto.CronOptions, + // CreateDate = DateTime.UtcNow + // }; + // + // int result = await service.AddTaskScheduler(taskSchedulerDto); + // + // if (result == 0) + // { + // return BadRequest("Nie udało się dodać zadania."); + // } + // + // recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), + // taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + // + // return Ok("Zadanie zostało dodane."); + // } + // + // [HttpPost("delete")] + // public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) + // { + // int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); + // + // if (result == 0) + // { + // return BadRequest("Nie udało się usunąć zadania."); + // } + // + // recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); + // + // return Ok("Zadanie zostało usunięte."); + // } + // + // [HttpGet] + // public async Task>> GetTasks() + // { + // var tasks = await service.GetTaskSchedulers(); + // + // foreach (TaskSchedulerDto taskSchedulerDto in tasks) + // { + // var job = GetJob(taskSchedulerDto.Name); + // taskSchedulerDto.LastExecution = job?.LastExecution; + // taskSchedulerDto.NextExecution = job?.NextExecution; + // } + // + // return Ok(tasks); + // } + // + // [HttpGet("by-name")] + // public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) + // { + // var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); + // + // if (taskSchedulerDto == null) return NotFound(); + // + // var job = GetJob(taskSchedulerDto.Name); + // taskSchedulerDto.LastExecution = job?.LastExecution; + // taskSchedulerDto.NextExecution = job?.NextExecution; + // + // return Ok(taskSchedulerDto); + // } + // + // private RecurringJobDto? GetJob(string jobId) + // { + // using IStorageConnection? connection = jobStorage.GetConnection(); + // IList? recurringJobs = connection.GetRecurringJobs(); + // return recurringJobs.FirstOrDefault(x => x.Id == jobId); + // } + // + // public void RunConsoleApplication(string pathToApp) + // { + // try + // { + // var process = new Process + // { + // StartInfo = new ProcessStartInfo + // { + // FileName = pathToApp, + // UseShellExecute = false, + // RedirectStandardOutput = true, + // RedirectStandardError = true, + // CreateNoWindow = true, + // WorkingDirectory = Path.GetDirectoryName(pathToApp) + // } + // }; + // process.Start(); + // string output = process.StandardOutput.ReadToEnd(); + // string error = process.StandardError.ReadToEnd(); + // process.WaitForExit(); + // + // Console.WriteLine($"Output: {output}"); + // Console.WriteLine($"Error: {error}"); + // } + // catch (Exception ex) + // { + // Console.WriteLine($"Error executing console application: {ex.Message}"); + // } + // } } \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/WzHeaderController.cs b/FaKrosnoApi/Controllers/WzHeaderController.cs index 1fb947e..b1035a8 100644 --- a/FaKrosnoApi/Controllers/WzHeaderController.cs +++ b/FaKrosnoApi/Controllers/WzHeaderController.cs @@ -23,4 +23,16 @@ public class WzHeaderController(IWzHeaderService service, IMaterialTransactionSe await materialTransactionService.GetByCustomerNumber(customerNumber, customerSequence); return Ok(materialTransactions); } + + [HttpPost] + public async Task CreateHeader([FromBody] WzHeaderDto wzHeader) + { + if (wzHeader == null) + { + return BadRequest("WzHeader cannot be null."); + } + + await service.CreateHeader(wzHeader); + return CreatedAtAction(nameof(CreateHeader), wzHeader); + } } \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/WzRowMeyleController.cs b/FaKrosnoApi/Controllers/WzRowMeyleController.cs new file mode 100644 index 0000000..db04ee2 --- /dev/null +++ b/FaKrosnoApi/Controllers/WzRowMeyleController.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class WzRowMeyleController(IWzRowMeyleService service) : Controller +{ + [HttpGet] + public async Task>> GetAll() + { + IEnumerable wzRows = await service.GetAll(); + return Ok(wzRows); + } + + [HttpPost] + public async Task CreateRows([FromBody] IEnumerable rows) + { + if (rows == null || !rows.Any()) + { + return BadRequest("No rows provided."); + } + + await service.CreateRows(rows); + return CreatedAtAction(nameof(GetAll), new { count = rows.Count() }, rows); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index b4d5d9a..309804f 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -103,6 +103,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); diff --git a/OrdersManagement/Components/Layout/MainLayout.razor b/OrdersManagement/Components/Layout/MainLayout.razor index d650ddc..cdf48fb 100644 --- a/OrdersManagement/Components/Layout/MainLayout.razor +++ b/OrdersManagement/Components/Layout/MainLayout.razor @@ -35,14 +35,14 @@ - @* *@ - @* *@ - @if (UserName == "pkus") + @if (IsAdminRoute()) { - + - - + + + + } @@ -64,6 +64,12 @@ private bool IsAuthenticated { get; set; } private string UserName { get; set; } = string.Empty; + private bool IsAdminRoute() + { + var path = new Uri(NavigationManager.Uri).AbsolutePath; + return path.StartsWith("/admin", StringComparison.OrdinalIgnoreCase); + } + protected override void OnInitialized() { // ClaimsPrincipal currentUser = AuthenticationStateProvider.GetCurrentUser(); diff --git a/OrdersManagement/Components/Pages/Admin/Scheduler.razor b/OrdersManagement/Components/Pages/Admin/Scheduler.razor index 72e25c5..99ac7f1 100644 --- a/OrdersManagement/Components/Pages/Admin/Scheduler.razor +++ b/OrdersManagement/Components/Pages/Admin/Scheduler.razor @@ -1,4 +1,4 @@ -@page "/Admin/Scheduler" +@page "/Admin/PK/Scheduler" @using System.Security.Claims @using Microsoft.AspNetCore.Authorization diff --git a/OrdersManagement/Components/Pages/Admin/UsersManager.razor b/OrdersManagement/Components/Pages/Admin/UsersManager.razor index 7262b2d..84f1642 100644 --- a/OrdersManagement/Components/Pages/Admin/UsersManager.razor +++ b/OrdersManagement/Components/Pages/Admin/UsersManager.razor @@ -1,4 +1,4 @@ -@page "/admin/UsersManager" +@page "/Admin/PK/UsersManager" @using System.Security.Claims @using Microsoft.AspNetCore.Authorization diff --git a/OrdersManagement/Components/Pages/CustomerOrder.razor b/OrdersManagement/Components/Pages/CustomerOrder.razor index 1e1464a..42a0810 100644 --- a/OrdersManagement/Components/Pages/CustomerOrder.razor +++ b/OrdersManagement/Components/Pages/CustomerOrder.razor @@ -1,4 +1,4 @@ -@page "/CustomerOrder/{CustomerOrderId:guid}" +@page "/Admin/PK/CustomerOrder/{CustomerOrderId:guid}" @inject CustomerOrderService CustomerOrderService @inject ScheduleOrderService ScheduleOrderService diff --git a/OrdersManagement/Components/Pages/CustomerOrders.razor b/OrdersManagement/Components/Pages/CustomerOrders.razor index 2ea4343..83a7a74 100644 --- a/OrdersManagement/Components/Pages/CustomerOrders.razor +++ b/OrdersManagement/Components/Pages/CustomerOrders.razor @@ -1,4 +1,4 @@ -@page "/CustomerOrders" +@page "/Admin/PK/CustomerOrders" @inject CustomerOrderService CustomerOrderService @inject NavigationManager NavigationManager diff --git a/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor b/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor index 361b150..5d33776 100644 --- a/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor +++ b/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor @@ -1,4 +1,4 @@ -@page "/CustomerOrdersTranslations" +@page "/admin" @using SytelineSaAppEfDataModel.Dtos @using Syncfusion.Blazor.Cards diff --git a/OrdersManagement/Components/Pages/EdiCustomerOrder.razor b/OrdersManagement/Components/Pages/EdiCustomerOrder.razor index d2f444f..a26d1cf 100644 --- a/OrdersManagement/Components/Pages/EdiCustomerOrder.razor +++ b/OrdersManagement/Components/Pages/EdiCustomerOrder.razor @@ -1,4 +1,4 @@ -@page "/EdiCustomerOrder/{CustomerOrderId:guid}" +@page "/Admin/PK/EdiCustomerOrder/{CustomerOrderId:guid}" @inject EdiCustomerOrderService EdiCustomerOrderService @inject NavigationManager NavigationManager diff --git a/OrdersManagement/Components/Pages/EdiCustomerOrders.razor b/OrdersManagement/Components/Pages/EdiCustomerOrders.razor index e5289c5..f5883e4 100644 --- a/OrdersManagement/Components/Pages/EdiCustomerOrders.razor +++ b/OrdersManagement/Components/Pages/EdiCustomerOrders.razor @@ -1,4 +1,4 @@ -@page "/EdiCustomerOrders" +@page "/Admin/PK/EdiCustomerOrders" @inject EdiCustomerOrderService EdiCustomerOrderService @inject NavigationManager NavigationManager diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index 74081f0..baacf4e 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -3,6 +3,10 @@ @using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Grids @using SytelineSaAppEfDataModel.Dtos +@using Syncfusion.Blazor.DropDowns +@using FilterType = Syncfusion.Blazor.Grids.FilterType +@using SelectionMode = Syncfusion.Blazor.Grids.SelectionMode +@using Syncfusion.Blazor.Navigations @inject WarehouseService WarehouseService @@ -12,34 +16,41 @@

Dokumenty WZ na Magazynie

- @* *@ - @* *@ - @* *@ - @* @{ *@ - @* } *@ - @* *@ - @* *@ - @* *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* *@ - @* *@ - @* *@ - @* *@ - @* $1$ #1# *@ - @* *@ +
Klient
+ + + + + @if (_isVisible) + { +
Dokumenty WZ
+ + + + + + + + + + + + + + + + + @* *@ + + }
FA Krosno Manager © @(DateTime.Now.Year) @@ -48,11 +59,68 @@ @code { + private SfGrid _grid; + IEnumerable _clients = new List(); + IEnumerable _materialTransactions = new List(); + + WzClientDto? _selectedClient; + + bool _isVisible = false; + protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { - IEnumerable task = await WarehouseService.GetAllClientWzsAsync("K005531", 0); + _clients = await WarehouseService.GetAllClientsAsync(); + StateHasChanged(); + } + } + + private async Task OnValueChange(ChangeEventArgs args) + { + if (args.Value.HasValue) + { + _selectedClient = args.ItemData; + _isVisible = true; + _materialTransactions = await WarehouseService.GetAllClientWzsAsync(_selectedClient.CustomerNumber, _selectedClient.CustomerSequence ?? 0); + } + else + { + _selectedClient = null; + _isVisible = false; + } + + StateHasChanged(); + } + + private async Task CreatePackingList() + { + var selectedRecords = await _grid.GetSelectedRecordsAsync(); + 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(); + foreach (MaterialTransactionDto materialTransactionDto in selectedRecords) + { + rows.Add(new WzRowMeyleDto + { + ID = Guid.NewGuid(), + Quantity = Math.Abs((int?)materialTransactionDto.Qty ?? 0), + //ItemNumber = + }); + } + break; + } } } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor new file mode 100644 index 0000000..89ae813 --- /dev/null +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -0,0 +1,7 @@ +@page "/Warehouse/PackList" + +

WarehousePackList

+ +@code { + +} \ No newline at end of file diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index 656b549..63d841e 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -2,13 +2,15 @@ using SytelineSaAppEfDataModel.Dtos; namespace OrdersManagement.Services; -public class WarehouseService +public class WarehouseService(IHttpClientFactory httpClientFactory) { - private readonly HttpClient _httpClient; + private readonly HttpClient _httpClient = httpClientFactory.CreateClient("FaKrosnoApi"); - public WarehouseService(IHttpClientFactory httpClientFactory) + public async Task> GetAllClientsAsync() { - _httpClient = httpClientFactory.CreateClient("FaKrosnoApi"); + var response = await _httpClient.GetAsync($"api/WzClient"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync>(); } public async Task> GetAllClientWzsAsync(string customerNumber, int customerSequence) @@ -18,4 +20,24 @@ public class WarehouseService response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync>(); } + + public async Task CreateWzHeaderAsync(WzHeaderDto wzHeader) + { + var response = await _httpClient.PostAsJsonAsync("api/WzHeader", wzHeader); + response.EnsureSuccessStatusCode(); + if (response.StatusCode != System.Net.HttpStatusCode.Created) + { + throw new Exception("Failed to create WzHeader"); + } + } + + public async Task CreateWzRowMeyleAsync(IEnumerable wzRowMeyles) + { + var response = await _httpClient.PostAsJsonAsync("api/WzRowMeyle", wzRowMeyles); + response.EnsureSuccessStatusCode(); + if (response.StatusCode != System.Net.HttpStatusCode.Created) + { + throw new Exception("Failed to create WzRowMeyle"); + } + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs index d3d8e49..05950ce 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs @@ -6,4 +6,5 @@ public class WzClientDto public string CustomerNumber { get; set; } public int? CustomerSequence { get; set; } public DateTime CreatedDate { get; set; } + public string Name { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs new file mode 100644 index 0000000..69f4b3a --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs @@ -0,0 +1,13 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class WzRowMeyleDto +{ + public Guid ID { get; set; } + public Guid? FK_Header { get; set; } + public string OrderNumber { get; set; } + public string ItemNumber { get; set; } + public int? Quantity { get; set; } + public int? PalletNumber { get; set; } + public string WzNumber { get; set; } + public string PartNumber { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzClient.cs b/SytelineSaAppEfDataModel/Entities/WzClient.cs index 117aaa2..d9af197 100644 --- a/SytelineSaAppEfDataModel/Entities/WzClient.cs +++ b/SytelineSaAppEfDataModel/Entities/WzClient.cs @@ -6,4 +6,5 @@ public class WzClient public string CustomerNumber { get; set; } public int? CustomerSequence { get; set; } public DateTime CreatedDate { get; set; } + public string Name { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs new file mode 100644 index 0000000..044d965 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs @@ -0,0 +1,16 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class WzRowMeyle +{ + public Guid ID { get; set; } + public Guid? FK_Header { get; set; } + public string OrderNumber { get; set; } + public string ItemNumber { get; set; } + public int? Quantity { get; set; } + public int? PalletNumber { get; set; } + public string WzNumber { get; set; } + public string PartNumber { get; set; } + + // Navigation property + public WzHeader Header { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index d75825e..9063798 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -21,6 +21,8 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs index ef77795..d4c5630 100644 --- a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs @@ -5,4 +5,5 @@ namespace SytelineSaAppEfDataModel.Services; public interface IWzHeaderService { Task> GetAll(); + Task CreateHeader(WzHeaderDto wzHeader); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs b/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs new file mode 100644 index 0000000..65d1dc5 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs @@ -0,0 +1,9 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IWzRowMeyleService +{ + Task> GetAll(); + Task CreateRows(IEnumerable rows); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs index ea2f02d..79f96a5 100644 --- a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs @@ -1,6 +1,7 @@ using AutoMapper; using Microsoft.EntityFrameworkCore; using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Entities; namespace SytelineSaAppEfDataModel.Services; @@ -10,4 +11,11 @@ public class WzHeaderService(SytelineSaAppDbContext context, IMapper mapper) : I { return await context.WzHeaders.Select(x => mapper.Map(x)).ToListAsync(); } + + public async Task CreateHeader(WzHeaderDto wzHeader) + { + var entity = mapper.Map(wzHeader); + await context.WzHeaders.AddAsync(entity); + await context.SaveChangesAsync(); + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs b/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs new file mode 100644 index 0000000..4684adf --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs @@ -0,0 +1,21 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Entities; + +namespace SytelineSaAppEfDataModel.Services; + +public class WzRowMeyleService(SytelineSaAppDbContext context, IMapper mapper) : IWzRowMeyleService +{ + public async Task> GetAll() + { + return await context.WzRowsMeyle.Select(x => mapper.Map(x)).ToListAsync(); + } + + public async Task CreateRows(IEnumerable rows) + { + var entities = mapper.Map>(rows); + await context.WzRowsMeyle.AddRangeAsync(entities); + await context.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index d34fe3f..15ff01f 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -24,6 +24,7 @@ namespace SytelineSaAppEfDataModel public DbSet WzClients { get; set; } public DbSet WzHeaders { get; set; } + public DbSet WzRowsMeyle { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var configuration = new ConfigurationBuilder() @@ -799,7 +800,7 @@ namespace SytelineSaAppEfDataModel entity.Property(e => e.WhseSplit) .HasColumnName("WhseSplit") .HasColumnType("tinyint") - .IsRequired(false);; + .IsRequired(false); entity.Property(e => e.VariableId) .HasColumnName("VariableId") @@ -930,6 +931,64 @@ namespace SytelineSaAppEfDataModel .HasColumnName("CreatedDate") .HasColumnType("timestamp") .IsRowVersion(); + + entity.Property(e => e.Name) + .HasColumnName("Name") + .HasMaxLength(255) + .IsRequired(false); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("wz_row_meyle"); + + entity.HasKey(e => e.ID); + + entity.Property(e => e.ID) + .HasColumnName("ID") + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("newid()"); + + entity.Property(e => e.FK_Header) + .HasColumnName("FK_Header") + .HasColumnType("uniqueidentifier") + .IsRequired(false); + + entity.Property(e => e.OrderNumber) + .HasColumnName("order_number") + .HasMaxLength(100) + .IsRequired(false); + + entity.Property(e => e.ItemNumber) + .HasColumnName("item_number") + .HasMaxLength(100) + .IsRequired(false); + + entity.Property(e => e.Quantity) + .HasColumnName("quantity") + .HasColumnType("int") + .IsRequired(false); + + entity.Property(e => e.PalletNumber) + .HasColumnName("pallet_number") + .HasColumnType("int") + .IsRequired(false); + + entity.Property(e => e.WzNumber) + .HasColumnName("wz_number") + .HasMaxLength(100) + .IsRequired(false); + + entity.Property(e => e.PartNumber) + .HasColumnName("part_number") + .HasMaxLength(100) + .IsRequired(false); + + // Relationship + entity.HasOne(e => e.Header) + .WithMany() + .HasForeignKey(e => e.FK_Header) + .HasConstraintName("wz_rows_meyle_wz_header_ID_fk"); }); } } From bc28c5d63dac64c8ee48a2a786e01f9d42926766 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sat, 17 May 2025 04:37:56 +0200 Subject: [PATCH 006/149] * Revert changes --- .../Controllers/HangfireJobsController.cs | 302 +++++++++--------- 1 file changed, 151 insertions(+), 151 deletions(-) diff --git a/FaKrosnoApi/Controllers/HangfireJobsController.cs b/FaKrosnoApi/Controllers/HangfireJobsController.cs index e4b3bc1..d2e754e 100644 --- a/FaKrosnoApi/Controllers/HangfireJobsController.cs +++ b/FaKrosnoApi/Controllers/HangfireJobsController.cs @@ -16,155 +16,155 @@ public class HangfireJobsController( IRecurringJobManager recurringJobManager, ITaskSchedulerService service) : Controller { - // [HttpGet("GetJobsToRun")] - // public async Task>> GetJobsToRun() - // { - // IList jobsToRun = new List(); - // - // using (IStorageConnection? connection = jobStorage.GetConnection()) - // { - // IList? recurringJobs = connection.GetRecurringJobs(); - // IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); - // - // foreach (var recurringJob in recurringJobs) - // { - // TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); - // - // if (taskScheduler != null) - // { - // jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, - // recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); - // } - // } - // } - // - // return Ok(jobsToRun); - // } - // - // [HttpPost("run")] - // public async Task RunJobs() - // { - // var jobsToRun = (await GetJobsToRun()).Value?.ToList(); - // - // if (jobsToRun == null || jobsToRun.Count == 0) - // { - // return BadRequest("Nie udało się pobrać zadań do uruchomienia."); - // } - // - // foreach (var job in jobsToRun) - // { - // if (!string.IsNullOrEmpty(job.Path)) - // { - // recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, - // new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - // } - // } - // - // return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); - // } - // - // [HttpPost("add")] - // public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) - // { - // var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler - // { - // Name = taskSchedulerDto.Name, - // Path = taskSchedulerDto.Path, - // CronOptions = taskSchedulerDto.CronOptions, - // CreateDate = DateTime.UtcNow - // }; - // - // int result = await service.AddTaskScheduler(taskSchedulerDto); - // - // if (result == 0) - // { - // return BadRequest("Nie udało się dodać zadania."); - // } - // - // recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), - // taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - // - // return Ok("Zadanie zostało dodane."); - // } - // - // [HttpPost("delete")] - // public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) - // { - // int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); - // - // if (result == 0) - // { - // return BadRequest("Nie udało się usunąć zadania."); - // } - // - // recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); - // - // return Ok("Zadanie zostało usunięte."); - // } - // - // [HttpGet] - // public async Task>> GetTasks() - // { - // var tasks = await service.GetTaskSchedulers(); - // - // foreach (TaskSchedulerDto taskSchedulerDto in tasks) - // { - // var job = GetJob(taskSchedulerDto.Name); - // taskSchedulerDto.LastExecution = job?.LastExecution; - // taskSchedulerDto.NextExecution = job?.NextExecution; - // } - // - // return Ok(tasks); - // } - // - // [HttpGet("by-name")] - // public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) - // { - // var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); - // - // if (taskSchedulerDto == null) return NotFound(); - // - // var job = GetJob(taskSchedulerDto.Name); - // taskSchedulerDto.LastExecution = job?.LastExecution; - // taskSchedulerDto.NextExecution = job?.NextExecution; - // - // return Ok(taskSchedulerDto); - // } - // - // private RecurringJobDto? GetJob(string jobId) - // { - // using IStorageConnection? connection = jobStorage.GetConnection(); - // IList? recurringJobs = connection.GetRecurringJobs(); - // return recurringJobs.FirstOrDefault(x => x.Id == jobId); - // } - // - // public void RunConsoleApplication(string pathToApp) - // { - // try - // { - // var process = new Process - // { - // StartInfo = new ProcessStartInfo - // { - // FileName = pathToApp, - // UseShellExecute = false, - // RedirectStandardOutput = true, - // RedirectStandardError = true, - // CreateNoWindow = true, - // WorkingDirectory = Path.GetDirectoryName(pathToApp) - // } - // }; - // process.Start(); - // string output = process.StandardOutput.ReadToEnd(); - // string error = process.StandardError.ReadToEnd(); - // process.WaitForExit(); - // - // Console.WriteLine($"Output: {output}"); - // Console.WriteLine($"Error: {error}"); - // } - // catch (Exception ex) - // { - // Console.WriteLine($"Error executing console application: {ex.Message}"); - // } - // } + + public async Task>> GetJobsToRun() + { + IList jobsToRun = new List(); + + using (IStorageConnection? connection = jobStorage.GetConnection()) + { + IList? recurringJobs = connection.GetRecurringJobs(); + IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); + + foreach (var recurringJob in recurringJobs) + { + TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); + + if (taskScheduler != null) + { + jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, + recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); + } + } + } + + return Ok(jobsToRun); + } + + [HttpPost("run")] + public async Task RunJobs() + { + var jobsToRun = (await GetJobsToRun()).Value?.ToList(); + + if (jobsToRun == null || jobsToRun.Count == 0) + { + return BadRequest("Nie udało się pobrać zadań do uruchomienia."); + } + + foreach (var job in jobsToRun) + { + if (!string.IsNullOrEmpty(job.Path)) + { + recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, + new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + } + } + + return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); + } + + [HttpPost("add")] + public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) + { + var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler + { + Name = taskSchedulerDto.Name, + Path = taskSchedulerDto.Path, + CronOptions = taskSchedulerDto.CronOptions, + CreateDate = DateTime.UtcNow + }; + + int result = await service.AddTaskScheduler(taskSchedulerDto); + + if (result == 0) + { + return BadRequest("Nie udało się dodać zadania."); + } + + recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), + taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + + return Ok("Zadanie zostało dodane."); + } + + [HttpPost("delete")] + public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) + { + int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); + + if (result == 0) + { + return BadRequest("Nie udało się usunąć zadania."); + } + + recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); + + return Ok("Zadanie zostało usunięte."); + } + + [HttpGet] + public async Task>> GetTasks() + { + var tasks = await service.GetTaskSchedulers(); + + foreach (TaskSchedulerDto taskSchedulerDto in tasks) + { + var job = GetJob(taskSchedulerDto.Name); + taskSchedulerDto.LastExecution = job?.LastExecution; + taskSchedulerDto.NextExecution = job?.NextExecution; + } + + return Ok(tasks); + } + + [HttpGet("by-name")] + public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) + { + var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); + + if (taskSchedulerDto == null) return NotFound(); + + var job = GetJob(taskSchedulerDto.Name); + taskSchedulerDto.LastExecution = job?.LastExecution; + taskSchedulerDto.NextExecution = job?.NextExecution; + + return Ok(taskSchedulerDto); + } + + private RecurringJobDto? GetJob(string jobId) + { + using IStorageConnection? connection = jobStorage.GetConnection(); + IList? recurringJobs = connection.GetRecurringJobs(); + return recurringJobs.FirstOrDefault(x => x.Id == jobId); + } + + public void RunConsoleApplication(string pathToApp) + { + try + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = pathToApp, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + WorkingDirectory = Path.GetDirectoryName(pathToApp) + } + }; + process.Start(); + string output = process.StandardOutput.ReadToEnd(); + string error = process.StandardError.ReadToEnd(); + process.WaitForExit(); + + Console.WriteLine($"Output: {output}"); + Console.WriteLine($"Error: {error}"); + } + catch (Exception ex) + { + Console.WriteLine($"Error executing console application: {ex.Message}"); + } + } } \ No newline at end of file From 6ab3960e500ea3302972755b580075e63d50dcdb Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sat, 17 May 2025 18:36:11 +0200 Subject: [PATCH 007/149] * Further improvements to generate PackList --- .../Controllers/CustomerOrdersController.cs | 14 + .../Controllers/HangfireJobsController.cs | 300 +++++++++--------- FaKrosnoApi/Controllers/ItemCustController.cs | 16 + .../Controllers/WzRowMeyleController.cs | 19 ++ FaKrosnoApi/Program.cs | 29 +- .../Components/Pages/Warehouse.razor | 30 +- .../Components/Pages/WarehousePackList.razor | 101 +++++- OrdersManagement/Services/WarehouseService.cs | 50 ++- SytelineSaAppEfDataModel/Dtos/ItemCustDto.cs | 30 ++ .../Dtos/WzRowMeyleDto.cs | 2 +- SytelineSaAppEfDataModel/Entities/ItemCust.cs | 30 ++ .../Entities/WzRowMeyle.cs | 2 +- SytelineSaAppEfDataModel/MappingProfile.cs | 1 + .../Services/CustomerOrderService.cs | 49 ++- .../Services/ICustomerOrderService.cs | 2 + .../Services/IItemCustService.cs | 8 + .../Services/IWzRowMeyleService.cs | 2 + .../Services/ItemCustService.cs | 17 + .../Services/WzRowMeyleService.cs | 15 + .../SytelineSaAppDbContext.cs | 145 +++++++++ 20 files changed, 671 insertions(+), 191 deletions(-) create mode 100644 FaKrosnoApi/Controllers/ItemCustController.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/ItemCustDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/ItemCust.cs create mode 100644 SytelineSaAppEfDataModel/Services/IItemCustService.cs create mode 100644 SytelineSaAppEfDataModel/Services/ItemCustService.cs diff --git a/FaKrosnoApi/Controllers/CustomerOrdersController.cs b/FaKrosnoApi/Controllers/CustomerOrdersController.cs index 39fa4a3..ab7cd69 100644 --- a/FaKrosnoApi/Controllers/CustomerOrdersController.cs +++ b/FaKrosnoApi/Controllers/CustomerOrdersController.cs @@ -22,5 +22,19 @@ namespace FaKrosnoApi.Controllers CustomerOrderDto? scheduleOrder = await service.GetByOrderNumber(customerOrderNumber); return scheduleOrder != null ? Ok(scheduleOrder) : NotFound(); } + + [HttpGet("by-co-number")] + public async Task> GetByCoNumber([FromQuery] string customerOrderNumber) + { + CustomerOrderDto? scheduleOrder = await service.GetByCoNumber(customerOrderNumber); + return scheduleOrder != null ? Ok(scheduleOrder) : NotFound(); + } + + [HttpGet("items-by-co-number")] + public async Task> GetItemsByCoNumber([FromQuery] string customerOrderNumber) + { + var customerOrderLineItems = await service.GetItemsByCoNumber(customerOrderNumber); + return customerOrderLineItems != null ? Ok(customerOrderLineItems) : NotFound(); + } } } diff --git a/FaKrosnoApi/Controllers/HangfireJobsController.cs b/FaKrosnoApi/Controllers/HangfireJobsController.cs index d2e754e..b016636 100644 --- a/FaKrosnoApi/Controllers/HangfireJobsController.cs +++ b/FaKrosnoApi/Controllers/HangfireJobsController.cs @@ -17,154 +17,154 @@ public class HangfireJobsController( ITaskSchedulerService service) : Controller { - public async Task>> GetJobsToRun() - { - IList jobsToRun = new List(); - - using (IStorageConnection? connection = jobStorage.GetConnection()) - { - IList? recurringJobs = connection.GetRecurringJobs(); - IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); - - foreach (var recurringJob in recurringJobs) - { - TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); - - if (taskScheduler != null) - { - jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, - recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); - } - } - } - - return Ok(jobsToRun); - } - - [HttpPost("run")] - public async Task RunJobs() - { - var jobsToRun = (await GetJobsToRun()).Value?.ToList(); - - if (jobsToRun == null || jobsToRun.Count == 0) - { - return BadRequest("Nie udało się pobrać zadań do uruchomienia."); - } - - foreach (var job in jobsToRun) - { - if (!string.IsNullOrEmpty(job.Path)) - { - recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, - new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - } - } - - return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); - } - - [HttpPost("add")] - public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) - { - var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler - { - Name = taskSchedulerDto.Name, - Path = taskSchedulerDto.Path, - CronOptions = taskSchedulerDto.CronOptions, - CreateDate = DateTime.UtcNow - }; - - int result = await service.AddTaskScheduler(taskSchedulerDto); - - if (result == 0) - { - return BadRequest("Nie udało się dodać zadania."); - } - - recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), - taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - - return Ok("Zadanie zostało dodane."); - } - - [HttpPost("delete")] - public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) - { - int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); - - if (result == 0) - { - return BadRequest("Nie udało się usunąć zadania."); - } - - recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); - - return Ok("Zadanie zostało usunięte."); - } - - [HttpGet] - public async Task>> GetTasks() - { - var tasks = await service.GetTaskSchedulers(); - - foreach (TaskSchedulerDto taskSchedulerDto in tasks) - { - var job = GetJob(taskSchedulerDto.Name); - taskSchedulerDto.LastExecution = job?.LastExecution; - taskSchedulerDto.NextExecution = job?.NextExecution; - } - - return Ok(tasks); - } - - [HttpGet("by-name")] - public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) - { - var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); - - if (taskSchedulerDto == null) return NotFound(); - - var job = GetJob(taskSchedulerDto.Name); - taskSchedulerDto.LastExecution = job?.LastExecution; - taskSchedulerDto.NextExecution = job?.NextExecution; - - return Ok(taskSchedulerDto); - } - - private RecurringJobDto? GetJob(string jobId) - { - using IStorageConnection? connection = jobStorage.GetConnection(); - IList? recurringJobs = connection.GetRecurringJobs(); - return recurringJobs.FirstOrDefault(x => x.Id == jobId); - } - - public void RunConsoleApplication(string pathToApp) - { - try - { - var process = new Process - { - StartInfo = new ProcessStartInfo - { - FileName = pathToApp, - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - CreateNoWindow = true, - WorkingDirectory = Path.GetDirectoryName(pathToApp) - } - }; - process.Start(); - string output = process.StandardOutput.ReadToEnd(); - string error = process.StandardError.ReadToEnd(); - process.WaitForExit(); - - Console.WriteLine($"Output: {output}"); - Console.WriteLine($"Error: {error}"); - } - catch (Exception ex) - { - Console.WriteLine($"Error executing console application: {ex.Message}"); - } - } + // public async Task>> GetJobsToRun() + // { + // IList jobsToRun = new List(); + // + // using (IStorageConnection? connection = jobStorage.GetConnection()) + // { + // IList? recurringJobs = connection.GetRecurringJobs(); + // IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); + // + // foreach (var recurringJob in recurringJobs) + // { + // TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); + // + // if (taskScheduler != null) + // { + // jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, + // recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); + // } + // } + // } + // + // return Ok(jobsToRun); + // } + // + // [HttpPost("run")] + // public async Task RunJobs() + // { + // var jobsToRun = (await GetJobsToRun()).Value?.ToList(); + // + // if (jobsToRun == null || jobsToRun.Count == 0) + // { + // return BadRequest("Nie udało się pobrać zadań do uruchomienia."); + // } + // + // foreach (var job in jobsToRun) + // { + // if (!string.IsNullOrEmpty(job.Path)) + // { + // recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, + // new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + // } + // } + // + // return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); + // } + // + // [HttpPost("add")] + // public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) + // { + // var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler + // { + // Name = taskSchedulerDto.Name, + // Path = taskSchedulerDto.Path, + // CronOptions = taskSchedulerDto.CronOptions, + // CreateDate = DateTime.UtcNow + // }; + // + // int result = await service.AddTaskScheduler(taskSchedulerDto); + // + // if (result == 0) + // { + // return BadRequest("Nie udało się dodać zadania."); + // } + // + // recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), + // taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + // + // return Ok("Zadanie zostało dodane."); + // } + // + // [HttpPost("delete")] + // public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) + // { + // int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); + // + // if (result == 0) + // { + // return BadRequest("Nie udało się usunąć zadania."); + // } + // + // recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); + // + // return Ok("Zadanie zostało usunięte."); + // } + // + // [HttpGet] + // public async Task>> GetTasks() + // { + // var tasks = await service.GetTaskSchedulers(); + // + // foreach (TaskSchedulerDto taskSchedulerDto in tasks) + // { + // var job = GetJob(taskSchedulerDto.Name); + // taskSchedulerDto.LastExecution = job?.LastExecution; + // taskSchedulerDto.NextExecution = job?.NextExecution; + // } + // + // return Ok(tasks); + // } + // + // [HttpGet("by-name")] + // public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) + // { + // var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); + // + // if (taskSchedulerDto == null) return NotFound(); + // + // var job = GetJob(taskSchedulerDto.Name); + // taskSchedulerDto.LastExecution = job?.LastExecution; + // taskSchedulerDto.NextExecution = job?.NextExecution; + // + // return Ok(taskSchedulerDto); + // } + // + // private RecurringJobDto? GetJob(string jobId) + // { + // using IStorageConnection? connection = jobStorage.GetConnection(); + // IList? recurringJobs = connection.GetRecurringJobs(); + // return recurringJobs.FirstOrDefault(x => x.Id == jobId); + // } + // + // public void RunConsoleApplication(string pathToApp) + // { + // try + // { + // var process = new Process + // { + // StartInfo = new ProcessStartInfo + // { + // FileName = pathToApp, + // UseShellExecute = false, + // RedirectStandardOutput = true, + // RedirectStandardError = true, + // CreateNoWindow = true, + // WorkingDirectory = Path.GetDirectoryName(pathToApp) + // } + // }; + // process.Start(); + // string output = process.StandardOutput.ReadToEnd(); + // string error = process.StandardError.ReadToEnd(); + // process.WaitForExit(); + // + // Console.WriteLine($"Output: {output}"); + // Console.WriteLine($"Error: {error}"); + // } + // catch (Exception ex) + // { + // Console.WriteLine($"Error executing console application: {ex.Message}"); + // } + // } } \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/ItemCustController.cs b/FaKrosnoApi/Controllers/ItemCustController.cs new file mode 100644 index 0000000..f5c6ddd --- /dev/null +++ b/FaKrosnoApi/Controllers/ItemCustController.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class ItemCustController(IItemCustService service) : Controller +{ + public async Task> GetItem([FromQuery] string itemNumber, [FromQuery] string customerNumber) + { + ItemCustDto item = await service.GetItem(itemNumber, customerNumber); + return item != null ? Ok(item) : NotFound(); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/WzRowMeyleController.cs b/FaKrosnoApi/Controllers/WzRowMeyleController.cs index db04ee2..6ee43f5 100644 --- a/FaKrosnoApi/Controllers/WzRowMeyleController.cs +++ b/FaKrosnoApi/Controllers/WzRowMeyleController.cs @@ -26,4 +26,23 @@ public class WzRowMeyleController(IWzRowMeyleService service) : Controller await service.CreateRows(rows); return CreatedAtAction(nameof(GetAll), new { count = rows.Count() }, rows); } + + [HttpGet("by-wz-header-id")] + public async Task>> GetByWzHeaderId(Guid wzHeaderId) + { + IEnumerable wzRows = await service.GetByWzHeaderId(wzHeaderId); + return Ok(wzRows); + } + + [HttpPut] + public async Task UpdateRows([FromBody] IEnumerable rows) + { + if (rows == null || !rows.Any()) + { + return BadRequest("No rows provided."); + } + + await service.UpdateRows(rows); + return NoContent(); + } } \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index 309804f..b7288ad 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -69,19 +69,19 @@ builder.Services.AddOpenApiDocument(config => config.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer")); }); -builder.Services.AddHangfire(config => config - .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) - .UseSimpleAssemblyNameTypeSerializer() - .UseRecommendedSerializerSettings() - .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions - { - CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), - SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), - QueuePollInterval = TimeSpan.Zero, - UseRecommendedIsolationLevel = true, - DisableGlobalLocks = true - })); -builder.Services.AddHangfireServer(); +// builder.Services.AddHangfire(config => config +// .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) +// .UseSimpleAssemblyNameTypeSerializer() +// .UseRecommendedSerializerSettings() +// .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions +// { +// CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), +// SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), +// QueuePollInterval = TimeSpan.Zero, +// UseRecommendedIsolationLevel = true, +// DisableGlobalLocks = true +// })); +// builder.Services.AddHangfireServer(); builder.Services.AddAutoMapper(typeof(FaKrosnoMappingProfile), typeof(SytelineSaAppMappingProfile), typeof(OrdersManagementMappingProfile)); @@ -104,6 +104,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); @@ -119,6 +120,6 @@ app.UseAuthorization(); app.MapControllers(); -app.UseHangfireDashboard(); +// app.UseHangfireDashboard(); app.Run(); diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index baacf4e..c9a85de 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -9,6 +9,7 @@ @using Syncfusion.Blazor.Navigations @inject WarehouseService WarehouseService +@inject NavigationManager NavigationManager
@@ -30,12 +31,10 @@ AllowSorting="true" AllowSelection="true" TValue="MaterialTransactionDto" - DataSource="@_materialTransactions" + DataSource="@_dataSource" EnableAdaptiveUI="true"> - - @@ -48,7 +47,6 @@ - @* *@ } @@ -60,10 +58,11 @@ @code { private SfGrid _grid; - IEnumerable _clients = new List(); - IEnumerable _materialTransactions = new List(); + private IEnumerable _clients = new List(); + private IEnumerable _materialTransactions = new List(); + private IEnumerable _dataSource = new List(); - WzClientDto? _selectedClient; + private WzClientDto? _selectedClient; bool _isVisible = false; @@ -83,6 +82,7 @@ _selectedClient = args.ItemData; _isVisible = true; _materialTransactions = await WarehouseService.GetAllClientWzsAsync(_selectedClient.CustomerNumber, _selectedClient.CustomerSequence ?? 0); + _dataSource = _materialTransactions.GroupBy(x => x.MTGroupNum).Select(x => x.First()).ToList(); } else { @@ -110,17 +110,29 @@ { case "MEYLE": IList rows = new List(); - foreach (MaterialTransactionDto materialTransactionDto in selectedRecords) + 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 = + 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); } } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 89ae813..b0b72a5 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -1,7 +1,104 @@ -@page "/Warehouse/PackList" +@page "/Warehouse/PackList/{WzHeader:guid}" +@using Syncfusion.Blazor.Cards +@using Syncfusion.Blazor.Grids +@using SytelineSaAppEfDataModel.Dtos +@using Syncfusion.Blazor.Navigations -

WarehousePackList

+@inject WarehouseService WarehouseService + +
+ + +

Packing List

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + FA Krosno Manager © @(DateTime.Now.Year) + +
+
@code { + [Parameter] public Guid WzHeader { get; set; } + + private SfGrid _grid; + private IEnumerable _wzRowsMeyle { get; set; } = new List(); + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); + StateHasChanged(); + } + } + private async Task SaveChanges() + { + await _grid.EndEditAsync(); + } + + private async Task OnBatchSave(BeforeBatchSaveArgs obj) + { + var changes = obj.BatchChanges; + var changedRecords = changes.ChangedRecords; + + await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); + + _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); + StateHasChanged(); + await _grid.Refresh(); + } + + private async Task ExportXls() + { + await _grid.ExportToExcelAsync(); + } } \ No newline at end of file diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index 63d841e..0998fe8 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -31,13 +31,53 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) } } - public async Task CreateWzRowMeyleAsync(IEnumerable wzRowMeyles) + public async Task CreateWzRowsMeyleAsync(IEnumerable wzRowMeyles) { - var response = await _httpClient.PostAsJsonAsync("api/WzRowMeyle", wzRowMeyles); - response.EnsureSuccessStatusCode(); - if (response.StatusCode != System.Net.HttpStatusCode.Created) + if (wzRowMeyles == null || !wzRowMeyles.Any()) { - throw new Exception("Failed to create WzRowMeyle"); + throw new ArgumentException("No rows provided to create."); } + + var response = await _httpClient.PostAsJsonAsync("api/WzRowMeyle", wzRowMeyles); + if (!response.IsSuccessStatusCode) + { + var errorContent = await response.Content.ReadAsStringAsync(); + throw new HttpRequestException($"Failed to create WzRowMeyle: {response.StatusCode}, Content: {errorContent}"); + } + + } + + public async Task GetCustomerOrder(string customerOrderNumber) + { + var response = await _httpClient.GetAsync( + $"api/CustomerOrders/by-co-number/?customerOrderNumber={customerOrderNumber}"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync(); + } + + public async Task GetItem(string itemNumber, string customerNumber) + { + var response = await _httpClient.GetAsync( + $"api/ItemCust?itemNumber={itemNumber}&customerNumber={customerNumber}"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync(); + } + + public async Task> GetWzRowsByWzHeaderId(Guid wzHeaderId) + { + var response = await _httpClient.GetAsync($"api/WzRowMeyle/by-wz-header-id?wzHeaderId={wzHeaderId}"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync>(); + } + + public async Task UpdateWzRowsMeyleAsync(IEnumerable wzRowsMeyle) + { + if (wzRowsMeyle == null || !wzRowsMeyle.Any()) + { + throw new ArgumentException("No rows provided to update."); + } + + var response = await _httpClient.PutAsJsonAsync("api/WzRowMeyle", wzRowsMeyle); + response.EnsureSuccessStatusCode(); } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/ItemCustDto.cs b/SytelineSaAppEfDataModel/Dtos/ItemCustDto.cs new file mode 100644 index 0000000..5b479e6 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/ItemCustDto.cs @@ -0,0 +1,30 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class ItemCustDto +{ + public string Item { get; set; } + public string CustNum { get; set; } + public int CustItemSeq { get; set; } + public string CustItem { get; set; } + public int? PurchYtd { get; set; } + public decimal? OrderYtd { get; set; } + public decimal? ShipYtd { get; set; } + public decimal? OrderPtd { get; set; } + public string UM { get; set; } + public int? DuePeriod { get; set; } + public byte NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public byte InWorkflow { get; set; } + public int? Rank { get; set; } + public string EndUser { get; set; } + public string Uf_FKR_CustItem2 { get; set; } + public string Uf_KOD_EAN13 { get; set; } + public string Uf_Paleta_BROSE { get; set; } + public string Uf_Pojemnik_BROSE { get; set; } + public string Uf_Paleta_BROSE_Pokrywa { get; set; } + public string Uf_RewizjaRysunku { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs index 69f4b3a..c53f11c 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs @@ -9,5 +9,5 @@ public class WzRowMeyleDto public int? Quantity { get; set; } public int? PalletNumber { get; set; } public string WzNumber { get; set; } - public string PartNumber { get; set; } + public string? PartNumber { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/ItemCust.cs b/SytelineSaAppEfDataModel/Entities/ItemCust.cs new file mode 100644 index 0000000..bc897ea --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/ItemCust.cs @@ -0,0 +1,30 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class ItemCust +{ + public string Item { get; set; } + public string CustNum { get; set; } + public int CustItemSeq { get; set; } + public string CustItem { get; set; } + public int? PurchYtd { get; set; } + public decimal? OrderYtd { get; set; } + public decimal? ShipYtd { get; set; } + public decimal? OrderPtd { get; set; } + public string UM { get; set; } + public int? DuePeriod { get; set; } + public byte NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public byte InWorkflow { get; set; } + public int? Rank { get; set; } + public string EndUser { get; set; } + public string Uf_FKR_CustItem2 { get; set; } + public string Uf_KOD_EAN13 { get; set; } + public string Uf_Paleta_BROSE { get; set; } + public string Uf_Pojemnik_BROSE { get; set; } + public string Uf_Paleta_BROSE_Pokrywa { get; set; } + public string Uf_RewizjaRysunku { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs index 044d965..dfeaffd 100644 --- a/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs +++ b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs @@ -9,7 +9,7 @@ public class WzRowMeyle public int? Quantity { get; set; } public int? PalletNumber { get; set; } public string WzNumber { get; set; } - public string PartNumber { get; set; } + public string? PartNumber { get; set; } // Navigation property public WzHeader Header { get; set; } diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 9063798..3c86434 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -23,6 +23,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs index 616ec7b..246325b 100644 --- a/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs @@ -1,9 +1,4 @@ using AutoMapper; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using SytelineSaAppEfDataModel.Dtos; @@ -22,7 +17,7 @@ namespace SytelineSaAppEfDataModel.Services .Where(x => x.RowPointer == orderNumber) .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); if (customerOrder == null) return null; - + customerOrder.CustomerOrderLines = await context.CustomerOrderLines .Where(x => x.CoNum == customerOrder.CoNum) .Select(x => mapper.Map(x)).ToListAsync(); @@ -33,14 +28,50 @@ namespace SytelineSaAppEfDataModel.Services .Where(x => x.CoNum == customerOrder.CoNum && x.CoLine == customerOrderLine.CoLine) .Select(x => mapper.Map(x)).ToListAsync(); } - + IList ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates .Where(x => x.CoCoNum == customerOrder.CoNum) .Select(x => mapper.Map(x)).ToListAsync(); - + customerOrder.EdiCustomerOrderTranslates = ediCustomerOrderTranslates; return customerOrder; } + + public async Task GetByCoNumber(string orderNumber) + { + CustomerOrderDto? customerOrder = await context.CustomerOrders + .Where(x => x.CoNum == orderNumber) + .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); + if (customerOrder == null) return null; + + customerOrder.CustomerOrderLines = await context.CustomerOrderLines + .Where(x => x.CoNum == customerOrder.CoNum) + .Select(x => mapper.Map(x)).ToListAsync(); + + foreach (CustomerOrderLineDto customerOrderLine in customerOrder.CustomerOrderLines) + { + customerOrderLine.CustomerOrderLineItems = await context.CustomerOrderLineItems + .Where(x => x.CoNum == customerOrder.CoNum && x.CoLine == customerOrderLine.CoLine) + .Select(x => mapper.Map(x)).ToListAsync(); + } + + IList ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates + .Where(x => x.CoCoNum == customerOrder.CoNum) + .Select(x => mapper.Map(x)).ToListAsync(); + + customerOrder.EdiCustomerOrderTranslates = ediCustomerOrderTranslates; + + return customerOrder; + } + + public async Task?> GetItemsByCoNumber(string customerOrderNumber) + { + List customerOrderLineItems = await context.CustomerOrderLineItems + .Where(x => x.CoNum == customerOrderNumber) + .Select(x => mapper.Map(x)).ToListAsync(); + + return customerOrderLineItems; + } } -} +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs index 5db216a..55ca634 100644 --- a/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs @@ -11,5 +11,7 @@ namespace SytelineSaAppEfDataModel.Services { Task> GetAll(); Task GetByOrderNumber(Guid orderNumber); + Task GetByCoNumber(string orderNumber); + Task?> GetItemsByCoNumber(string customerOrderNumber); } } diff --git a/SytelineSaAppEfDataModel/Services/IItemCustService.cs b/SytelineSaAppEfDataModel/Services/IItemCustService.cs new file mode 100644 index 0000000..37dc032 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IItemCustService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IItemCustService +{ + Task GetItem(string itemNumber, string customerNumber); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs b/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs index 65d1dc5..47ff117 100644 --- a/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs +++ b/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs @@ -6,4 +6,6 @@ public interface IWzRowMeyleService { Task> GetAll(); Task CreateRows(IEnumerable rows); + Task> GetByWzHeaderId(Guid wzHeaderId); + Task UpdateRows(IEnumerable rows); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/ItemCustService.cs b/SytelineSaAppEfDataModel/Services/ItemCustService.cs new file mode 100644 index 0000000..9877609 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/ItemCustService.cs @@ -0,0 +1,17 @@ +using AutoMapper; +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public class ItemCustService(SytelineSaAppDbContext context, IMapper mapper) : IItemCustService +{ + public Task GetItem(string itemNumber, string customerNumber) + { + var item = context.ItemCusts + .FirstOrDefault(x => x.Item == itemNumber && x.CustNum == customerNumber); + + return item == null + ? Task.FromResult(null) + : Task.FromResult(mapper.Map(item)); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs b/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs index 4684adf..a0f11e3 100644 --- a/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs +++ b/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs @@ -18,4 +18,19 @@ public class WzRowMeyleService(SytelineSaAppDbContext context, IMapper mapper) : await context.WzRowsMeyle.AddRangeAsync(entities); await context.SaveChangesAsync(); } + + public async Task> GetByWzHeaderId(Guid wzHeaderId) + { + return await context.WzRowsMeyle + .Where(x => x.FK_Header == wzHeaderId) + .Select(x => mapper.Map(x)) + .ToListAsync(); + } + + public async Task UpdateRows(IEnumerable rows) + { + var entities = mapper.Map>(rows); + context.WzRowsMeyle.UpdateRange(entities); + await context.SaveChangesAsync(); + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 15ff01f..557aaf4 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -25,6 +25,8 @@ namespace SytelineSaAppEfDataModel public DbSet WzHeaders { get; set; } public DbSet WzRowsMeyle { get; set; } + + public DbSet ItemCusts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var configuration = new ConfigurationBuilder() @@ -990,6 +992,149 @@ namespace SytelineSaAppEfDataModel .HasForeignKey(e => e.FK_Header) .HasConstraintName("wz_rows_meyle_wz_header_ID_fk"); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("itemcust"); + + entity.HasKey(e => new { e.Item, e.CustNum, e.CustItemSeq }); + + entity.Property(e => e.Item) + .HasColumnName("item") + .HasMaxLength(60) + .IsRequired(); + + entity.Property(e => e.CustNum) + .HasColumnName("cust_num") + .HasMaxLength(14) + .IsRequired(); + + entity.Property(e => e.CustItemSeq) + .HasColumnName("cust_item_seq") + .HasColumnType("int") + .HasDefaultValueSql("1"); + + entity.Property(e => e.CustItem) + .HasColumnName("cust_item") + .HasMaxLength(60) + .IsRequired(false); + + entity.Property(e => e.PurchYtd) + .HasColumnName("purch_ytd") + .HasDefaultValueSql("0") + .IsRequired(false); + + entity.Property(e => e.OrderYtd) + .HasColumnName("order_ytd") + .HasDefaultValueSql("0") + .IsRequired(false); + + entity.Property(e => e.ShipYtd) + .HasColumnName("ship_ytd") + .HasDefaultValueSql("0") + .IsRequired(false); + + entity.Property(e => e.OrderPtd) + .HasColumnName("order_ptd") + .HasDefaultValueSql("0") + .IsRequired(false); + + entity.Property(e => e.UM) + .HasColumnName("u_m") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.DuePeriod) + .HasColumnName("due_period") + .HasColumnType("smallint") + .IsRequired(false); + + entity.Property(e => e.NoteExistsFlag) + .HasColumnName("NoteExistsFlag") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.RecordDate) + .HasColumnName("RecordDate") + .HasDefaultValueSql("getdate()"); + + entity.Property(e => e.RowPointer) + .HasColumnName("RowPointer") + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("newid()"); + + entity.Property(e => e.CreatedBy) + .HasColumnName("CreatedBy") + .HasMaxLength(60) + .HasDefaultValueSql("suser_sname()"); + + entity.Property(e => e.UpdatedBy) + .HasColumnName("UpdatedBy") + .HasMaxLength(60) + .HasDefaultValueSql("suser_sname()"); + + entity.Property(e => e.CreateDate) + .HasColumnName("CreateDate") + .HasDefaultValueSql("getdate()"); + + entity.Property(e => e.InWorkflow) + .HasColumnName("InWorkflow") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.Rank) + .HasColumnName("rank") + .HasColumnType("int") + .IsRequired(false); + + entity.Property(e => e.EndUser) + .HasColumnName("end_user") + .HasMaxLength(60) + .IsRequired(false); + + entity.Property(e => e.Uf_FKR_CustItem2) + .HasColumnName("Uf_FKR_CustItem2") + .HasMaxLength(30) + .IsRequired(false); + + entity.Property(e => e.Uf_KOD_EAN13) + .HasColumnName("Uf_KOD_EAN13") + .HasMaxLength(13) + .IsRequired(false); + + entity.Property(e => e.Uf_Paleta_BROSE) + .HasColumnName("Uf_Paleta_BROSE") + .HasMaxLength(20) + .IsRequired(false); + + entity.Property(e => e.Uf_Pojemnik_BROSE) + .HasColumnName("Uf_Pojemnik_BROSE") + .HasMaxLength(20) + .IsRequired(false); + + entity.Property(e => e.Uf_Paleta_BROSE_Pokrywa) + .HasColumnName("Uf_Paleta_BROSE_Pokrywa") + .HasMaxLength(30) + .IsRequired(false); + + entity.Property(e => e.Uf_RewizjaRysunku) + .HasColumnName("Uf_RewizjaRysunku") + .HasMaxLength(20) + .IsRequired(false); + + // Indexes + entity.HasIndex(e => new { e.CustNum, e.Item, e.CustItemSeq }) + .HasDatabaseName("IX_itemcust_custitem") + .IsUnique(); + + entity.HasIndex(e => new { e.CustNum, e.Item, e.CustItem }) + .HasDatabaseName("IX_itemcust_custitemci") + .IsUnique(); + + entity.HasIndex(e => e.RowPointer) + .HasDatabaseName("IX_itemcust_RowPointer") + .IsUnique(); + }); } } } From f4195a540cb862c2fd141292b709f407a61e639f Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sat, 17 May 2025 20:31:42 +0200 Subject: [PATCH 008/149] * Added ExcelGenerator and EmailSender --- .../Controllers/ExcelGeneratorController.cs | 136 ++++++++++++++++++ FaKrosnoApi/Controllers/WzHeaderController.cs | 7 + FaKrosnoApi/FaKrosnoApi.csproj | 1 + FaKrosnoApi/Program.cs | 2 + .../Components/Pages/WarehousePackList.razor | 6 +- OrdersManagement/Services/WarehouseService.cs | 10 ++ SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs | 2 + .../Services/IWzHeaderService.cs | 1 + .../Services/WzHeaderService.cs | 12 ++ 9 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 FaKrosnoApi/Controllers/ExcelGeneratorController.cs diff --git a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs new file mode 100644 index 0000000..d4bebfe --- /dev/null +++ b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs @@ -0,0 +1,136 @@ +using System.Net; +using System.Net.Mail; +using Microsoft.AspNetCore.Mvc; +using Syncfusion.Drawing; +using Syncfusion.XlsIO; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMaterialTransactionService materialTransactionService, IConfiguration configuration) : Controller +{ + [HttpGet("generate-meyle")] + public async Task GeneratePackListForMeyle(Guid packListId) + { + WzHeaderDto wzHeader = await wzHeaderService.GetById(packListId); + MaterialTransactionDto? materialTransaction = await materialTransactionService.GetByWzNumber(wzHeader.WzRowsMeyle.First().WzNumber); + + using ExcelEngine excelEngine = new ExcelEngine(); + IApplication application = excelEngine.Excel; + application.DefaultVersion = ExcelVersion.Xlsx; + + IWorkbook workbook = application.Workbooks.Create(1); + IWorksheet worksheet = workbook.Worksheets[0]; + + IStyle boldFontStyle = workbook.Styles.Add("BoldFontStyle"); + boldFontStyle.Font.Bold = true; + + var mainHeaders = new List + { "Numer zamówienia Meyle", "Meyle Numer", "Ilość w dostawie", "Numer Palety", "Nr Wz", "Nr Partii" }; + + worksheet["B1"].Value = "Packing List"; + worksheet["B1"].CellStyle = boldFontStyle; + + worksheet["B3"].Value = "Supplier Name"; + worksheet["B3"].CellStyle = boldFontStyle; + + worksheet["D3"].Value = "FA KROSNO"; + worksheet["D3"].CellStyle = boldFontStyle; + + worksheet["B4"].Value = "Packing List nr"; + worksheet["B4"].CellStyle = boldFontStyle; + + worksheet["B6"].Value = "Related delivery note"; + worksheet["B6"].CellStyle = boldFontStyle; + + worksheet["D6"].Value = string.Join(", ", wzHeader.WzRowsMeyle.Select(x => x.WzNumber).Distinct()); + worksheet["D6"].CellStyle = boldFontStyle; + + worksheet["B9"].Value = "Forwarder"; + worksheet["B9"].CellStyle = boldFontStyle; + + worksheet["B10"].Value = "Date"; + worksheet["B10"].CellStyle = boldFontStyle; + + worksheet["D10"].DateTime = materialTransaction?.CreateDate ?? DateTime.Now; + + int currentRow = 12; + + for (int i = 0; i < mainHeaders.Count; i++) + { + string columnLetter = GetColumnLetter(i); + worksheet.Range[$"{columnLetter}{currentRow}"].Text = mainHeaders[i]; + worksheet.Range[$"{columnLetter}{currentRow}"].CellStyle = boldFontStyle; + } + + currentRow++; + + foreach (var wzRow in wzHeader.WzRowsMeyle) + { + worksheet.Range[$"A{currentRow}"].Text = wzRow.OrderNumber; + worksheet.Range[$"B{currentRow}"].Text = wzRow.ItemNumber; + worksheet.Range[$"C{currentRow}"].Number = (double)wzRow.Quantity!; + worksheet.Range[$"D{currentRow}"].Number = (double)wzRow.PalletNumber!; + worksheet.Range[$"E{currentRow}"].Text = wzRow.WzNumber; + worksheet.Range[$"F{currentRow}"].Text = wzRow.PartNumber; + + currentRow++; + } + + for (int i = 0; i < 6; i++) + { + worksheet.AutofitColumn(i + 1); + } + + using MemoryStream stream = new MemoryStream(); + workbook.SaveAs(stream); + stream.Position = 0; + + SendEmail(stream); + } + + private static string GetColumnLetter(int columnIndex) + { + string columnName = string.Empty; + while (columnIndex >= 0) + { + columnName = (char)('A' + (columnIndex % 26)) + columnName; + columnIndex = (columnIndex / 26) - 1; + } + + return columnName; + } + + private void SendEmail(MemoryStream stream) + { + IConfigurationSection smtpSettings = configuration.GetSection("EmailSettings"); + string smtpHost = smtpSettings["SmtpServer"] ?? string.Empty; + int smtpPort = int.Parse(smtpSettings["Port"] ?? "0"); + 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(); + 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}"; + + using var mailMessage = new MailMessage(); + mailMessage.From = new MailAddress(fromEmail); + mailMessage.Subject = subject; + mailMessage.Body = body; + mailMessage.IsBodyHtml = false; + + mailMessage.Attachments.Add(new Attachment(stream, $"PackingList_Meyle_{DateTime.Now:yyyyMMddHHmmss}.xlsx", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); + + toEmail.ForEach(x => mailMessage.To.Add(x)); + + using var smtpClient = new SmtpClient(smtpHost, smtpPort); + smtpClient.EnableSsl = true; + smtpClient.Credentials = new NetworkCredential(smtpUsername, smtpPassword); + smtpClient.Send(mailMessage); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/WzHeaderController.cs b/FaKrosnoApi/Controllers/WzHeaderController.cs index b1035a8..13155dc 100644 --- a/FaKrosnoApi/Controllers/WzHeaderController.cs +++ b/FaKrosnoApi/Controllers/WzHeaderController.cs @@ -35,4 +35,11 @@ public class WzHeaderController(IWzHeaderService service, IMaterialTransactionSe await service.CreateHeader(wzHeader); return CreatedAtAction(nameof(CreateHeader), wzHeader); } + + [HttpGet("by-id")] + public async Task> GetById([FromQuery] Guid id) + { + WzHeaderDto? wzHeader = await service.GetById(id); + return wzHeader != null ? Ok(wzHeader) : NotFound(); + } } \ No newline at end of file diff --git a/FaKrosnoApi/FaKrosnoApi.csproj b/FaKrosnoApi/FaKrosnoApi.csproj index 595a074..736fd0f 100644 --- a/FaKrosnoApi/FaKrosnoApi.csproj +++ b/FaKrosnoApi/FaKrosnoApi.csproj @@ -18,6 +18,7 @@ + diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index b7288ad..ce45794 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -108,6 +108,8 @@ builder.Services.AddScoped(); builder.Services.AddHostedService(); +Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("NRAiBiAaIQQuGjN/V09+XU9HdVRDX3xKf0x/TGpQb19xflBPallYVBYiSV9jS3tTckVgWHldc3ZUR2lfVE90Vg=="); + var app = builder.Build(); app.UseOpenApi(); diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index b0b72a5..587a72f 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -24,8 +24,8 @@ - + @@ -99,6 +99,6 @@ private async Task ExportXls() { - await _grid.ExportToExcelAsync(); + await WarehouseService.GenerateXlsForMeyleAsync(WzHeader); } } \ No newline at end of file diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index 0998fe8..2d2f8e0 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -80,4 +80,14 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) var response = await _httpClient.PutAsJsonAsync("api/WzRowMeyle", wzRowsMeyle); response.EnsureSuccessStatusCode(); } + + public async Task GenerateXlsForMeyleAsync(Guid wzHeaderId) + { + var response = await _httpClient.GetAsync($"api/ExcelGenerator/generate-meyle?packListId={wzHeaderId}"); + response.EnsureSuccessStatusCode(); + if (response.StatusCode != System.Net.HttpStatusCode.OK) + { + throw new Exception("Failed to generate XLS for Mayle"); + } + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs b/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs index b45c435..ffbe71c 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs @@ -5,4 +5,6 @@ public class WzHeaderDto public Guid ID { get; set; } public Guid? FK_Client { get; set; } public DateTime CreatedDate { get; set; } + + public IEnumerable WzRowsMeyle { get; set; } = new List(); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs index d4c5630..6235e2b 100644 --- a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs @@ -6,4 +6,5 @@ public interface IWzHeaderService { Task> GetAll(); Task CreateHeader(WzHeaderDto wzHeader); + Task GetById(Guid id); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs index 79f96a5..2b4461c 100644 --- a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs @@ -18,4 +18,16 @@ public class WzHeaderService(SytelineSaAppDbContext context, IMapper mapper) : I await context.WzHeaders.AddAsync(entity); await context.SaveChangesAsync(); } + + public async Task GetById(Guid id) + { + var entity = await context.WzHeaders.FindAsync(id); + var items = await context.WzRowsMeyle.Where(x => x.FK_Header == id).Select(x => mapper.Map(x)) + .ToListAsync(); + + WzHeaderDto wzHeader = mapper.Map(entity); + wzHeader.WzRowsMeyle = items; + + return wzHeader; + } } \ No newline at end of file From 71dd78cbd7270ccf8d3984c7ddf548c976f461b0 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sat, 17 May 2025 20:32:24 +0200 Subject: [PATCH 009/149] * Revert change --- FaKrosnoApi/Program.cs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index ce45794..4b879cb 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -69,19 +69,19 @@ builder.Services.AddOpenApiDocument(config => config.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer")); }); -// builder.Services.AddHangfire(config => config -// .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) -// .UseSimpleAssemblyNameTypeSerializer() -// .UseRecommendedSerializerSettings() -// .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions -// { -// CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), -// SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), -// QueuePollInterval = TimeSpan.Zero, -// UseRecommendedIsolationLevel = true, -// DisableGlobalLocks = true -// })); -// builder.Services.AddHangfireServer(); +builder.Services.AddHangfire(config => config + .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) + .UseSimpleAssemblyNameTypeSerializer() + .UseRecommendedSerializerSettings() + .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions + { + CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), + SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), + QueuePollInterval = TimeSpan.Zero, + UseRecommendedIsolationLevel = true, + DisableGlobalLocks = true + })); +builder.Services.AddHangfireServer(); builder.Services.AddAutoMapper(typeof(FaKrosnoMappingProfile), typeof(SytelineSaAppMappingProfile), typeof(OrdersManagementMappingProfile)); @@ -122,6 +122,6 @@ app.UseAuthorization(); app.MapControllers(); -// app.UseHangfireDashboard(); +app.UseHangfireDashboard(); app.Run(); From f58d2ab04cdbfaf13cb363906e7afac73895947e Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sat, 24 May 2025 21:47:32 +0200 Subject: [PATCH 010/149] * Further improvements of Warehouse view * Fixed issue with not saving Products updates --- FaKrosnoApi/Controllers/WzHeaderController.cs | 10 ++ .../Services/ProductService.cs | 17 ++- .../Components/Pages/Warehouse.razor | 116 +++++++++++++----- .../Components/Pages/WarehousePackList.razor | 54 ++++++-- OrdersManagement/Services/WarehouseService.cs | 8 ++ .../Services/IWzHeaderService.cs | 1 + .../Services/WzHeaderService.cs | 7 ++ .../SytelineSaAppDbContext.cs | 4 +- 8 files changed, 173 insertions(+), 44 deletions(-) diff --git a/FaKrosnoApi/Controllers/WzHeaderController.cs b/FaKrosnoApi/Controllers/WzHeaderController.cs index 13155dc..9ab9496 100644 --- a/FaKrosnoApi/Controllers/WzHeaderController.cs +++ b/FaKrosnoApi/Controllers/WzHeaderController.cs @@ -24,6 +24,16 @@ public class WzHeaderController(IWzHeaderService service, IMaterialTransactionSe return Ok(materialTransactions); } + [HttpGet("all-wz-headers")] + public async Task>> GetHeadersByCustomerNumber( + [FromQuery] string customerNumber, [FromQuery] int customerSequence) + { + IEnumerable wzHeaders = + await service.GetByCustomerNumber(customerNumber, customerSequence); + + return Ok(wzHeaders.OrderByDescending(x => x.CreatedDate)); + } + [HttpPost] public async Task CreateHeader([FromBody] WzHeaderDto wzHeader) { diff --git a/FaKrosnoEfDataModel/Services/ProductService.cs b/FaKrosnoEfDataModel/Services/ProductService.cs index 1788ea3..5b97f18 100644 --- a/FaKrosnoEfDataModel/Services/ProductService.cs +++ b/FaKrosnoEfDataModel/Services/ProductService.cs @@ -5,12 +5,9 @@ using Microsoft.EntityFrameworkCore; namespace FaKrosnoEfDataModel.Services; -public class ProductService : ServiceBase, IProductService +public class ProductService(FaKrosnoDbContext context, IMapper mapper) + : ServiceBase(context, mapper), IProductService { - public ProductService(FaKrosnoDbContext context, IMapper mapper) : base(context, mapper) - { - } - public async Task> GetEntities() { IList products = (await GetAll()).ToList(); @@ -22,9 +19,10 @@ public class ProductService : ServiceBase, IProductService { IList recipients = (await Context.Recipients.ToListAsync()).Select(x => Mapper.Map(x)).ToList(); + IList purchasers = (await Context.Purchasers.ToListAsync()).Select(x => Mapper.Map(x)).ToList(); IList products = (await GetAll()).ToList(); - IEnumerable productDtos = products.Where(x => x?.FaIdx == indexName); + IEnumerable productDtos = products.Where(x => x.FaIdx == indexName).ToList(); foreach (ProductDto productDto in productDtos) { @@ -35,6 +33,13 @@ public class ProductService : ServiceBase, IProductService productDto.Recipient = recipient; productDto.RecipientName = recipient.RecipientDesc; } + + PurchaserDto? purchaser = purchasers.FirstOrDefault(x => x.ID == productDto.Recipient.PurchaserID); + + if (purchaser != null) + { + productDto.Recipient.Purchaser = purchaser; + } } return productDtos; diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index c9a85de..51be593 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -1,5 +1,6 @@ @page "/Warehouse" +@using Blazored.LocalStorage @using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Grids @using SytelineSaAppEfDataModel.Dtos @@ -10,6 +11,7 @@ @inject WarehouseService WarehouseService @inject NavigationManager NavigationManager +@inject ILocalStorageService LocalStorage
@@ -18,36 +20,66 @@
Klient
- + @if (_isVisible) { -
Dokumenty WZ
- - - - - - - - - - - - - - - + + +
Dokumenty WZ
+
+ + + + + + + + + + + + + + + + + +
+ + +
Packling Listy
+
+ + + + + + + + + + + + +
}
@@ -58,19 +90,32 @@ @code { private SfGrid _grid; + private SfGrid _wzHeadersGrid; private IEnumerable _clients = new List(); private IEnumerable _materialTransactions = new List(); private IEnumerable _dataSource = new List(); + private IEnumerable _wzHeaders = new List(); private WzClientDto? _selectedClient; - bool _isVisible = false; - + private WzHeaderDto? _selectedHeader; + private SfDropDownList _dropdown; + private bool _isVisible; + protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { _clients = await WarehouseService.GetAllClientsAsync(); + _clients = _clients.Where(x => x.Name.Equals("MEYLE", StringComparison.OrdinalIgnoreCase)); + + 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(); } } @@ -79,10 +124,18 @@ { if (args.Value.HasValue) { - _selectedClient = args.ItemData; + _selectedClient = args.ItemData ?? _clients.FirstOrDefault(x => x.ID == args.Value); + + if (_selectedClient == null) { return; } + _isVisible = true; _materialTransactions = await WarehouseService.GetAllClientWzsAsync(_selectedClient.CustomerNumber, _selectedClient.CustomerSequence ?? 0); _dataSource = _materialTransactions.GroupBy(x => x.MTGroupNum).Select(x => x.First()).ToList(); + _wzHeaders = await WarehouseService.GetAllClientWzHeadersAsync(_selectedClient.CustomerNumber, _selectedClient.CustomerSequence ?? 0); + + await LocalStorage.SetItemAsync("SelectedClientId", _selectedClient.ID); + + _dropdown.Value = _selectedClient.ID; } else { @@ -93,6 +146,13 @@ StateHasChanged(); } + private void OnRowDoubleClick(RecordDoubleClickEventArgs obj) + { + Guid headerId = obj.RowData.ID; + + NavigationManager.NavigateTo("/Warehouse/PackList/" + headerId); + } + private async Task CreatePackingList() { var selectedRecords = await _grid.GetSelectedRecordsAsync(); diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 587a72f..88f29de 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -3,6 +3,7 @@ @using Syncfusion.Blazor.Grids @using SytelineSaAppEfDataModel.Dtos @using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Popups @inject WarehouseService WarehouseService @@ -13,13 +14,13 @@ + AllowFiltering="true" + AllowPaging="true" + AllowSorting="true" + AllowSelection="true" + TValue="WzRowMeyleDto" + DataSource="@_wzRowsMeyle" + EnableAdaptiveUI="true"> + + + + + @if (_isValid) + { +

Packing List został wygenerowany i wysłany!

+ } + else + { +

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

+ } +
+
+ + + +
+ FA Krosno Manager © @(DateTime.Now.Year) @@ -71,6 +91,15 @@ private SfGrid _grid; private IEnumerable _wzRowsMeyle { get; set; } = new List(); + private bool _isValid; + + private bool Visibility { get; set; } + + private void HideModal() + { + Visibility = false; + } + protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) @@ -99,6 +128,15 @@ private async Task ExportXls() { - await WarehouseService.GenerateXlsForMeyleAsync(WzHeader); + int count = _wzRowsMeyle.Count(x => x.PalletNumber == null); + + _isValid = count == 0; + + if (_isValid) + { + await WarehouseService.GenerateXlsForMeyleAsync(WzHeader); + } + + Visibility = true; } } \ No newline at end of file diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index 2d2f8e0..f9c8ac4 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -21,6 +21,14 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) return await response.Content.ReadFromJsonAsync>(); } + public async Task> GetAllClientWzHeadersAsync(string customerNumber, int customerSequence) + { + var response = await _httpClient.GetAsync( + $"api/WzHeader/all-wz-headers?customerNumber={customerNumber}&customerSequence={customerSequence}"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync>(); + } + public async Task CreateWzHeaderAsync(WzHeaderDto wzHeader) { var response = await _httpClient.PostAsJsonAsync("api/WzHeader", wzHeader); diff --git a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs index 6235e2b..cecf78a 100644 --- a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs @@ -5,6 +5,7 @@ namespace SytelineSaAppEfDataModel.Services; public interface IWzHeaderService { Task> GetAll(); + Task> GetByCustomerNumber(string customerNumber, int customerSequence); Task CreateHeader(WzHeaderDto wzHeader); Task GetById(Guid id); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs index 2b4461c..28718f2 100644 --- a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs @@ -12,6 +12,13 @@ public class WzHeaderService(SytelineSaAppDbContext context, IMapper mapper) : I return await context.WzHeaders.Select(x => mapper.Map(x)).ToListAsync(); } + public async Task> GetByCustomerNumber(string customerNumber, int customerSequence) + { + return await context.WzHeaders.Include(x => x.Client) + .Where(x => x.Client.CustomerNumber == customerNumber && x.Client.CustomerSequence == customerSequence) + .Select(x => mapper.Map(x)).ToListAsync(); + } + public async Task CreateHeader(WzHeaderDto wzHeader) { var entity = mapper.Map(wzHeader); diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 557aaf4..9ce067d 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -899,7 +899,7 @@ namespace SytelineSaAppEfDataModel entity.Property(e => e.CreatedDate) .HasColumnName("CreatedDate") - .HasColumnType("timestamp") + .HasColumnType("DateTime") .IsRowVersion(); // Relationship @@ -931,7 +931,7 @@ namespace SytelineSaAppEfDataModel entity.Property(e => e.CreatedDate) .HasColumnName("CreatedDate") - .HasColumnType("timestamp") + .HasColumnType("DateTime") .IsRowVersion(); entity.Property(e => e.Name) From 393db2cc7cce4ab73087f3e1bbab62de7ca98121 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sat, 24 May 2025 21:57:10 +0200 Subject: [PATCH 011/149] * Revert changes --- .../Controllers/HangfireJobsController.cs | 300 +++++++++--------- 1 file changed, 150 insertions(+), 150 deletions(-) diff --git a/FaKrosnoApi/Controllers/HangfireJobsController.cs b/FaKrosnoApi/Controllers/HangfireJobsController.cs index b016636..d2e754e 100644 --- a/FaKrosnoApi/Controllers/HangfireJobsController.cs +++ b/FaKrosnoApi/Controllers/HangfireJobsController.cs @@ -17,154 +17,154 @@ public class HangfireJobsController( ITaskSchedulerService service) : Controller { - // public async Task>> GetJobsToRun() - // { - // IList jobsToRun = new List(); - // - // using (IStorageConnection? connection = jobStorage.GetConnection()) - // { - // IList? recurringJobs = connection.GetRecurringJobs(); - // IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); - // - // foreach (var recurringJob in recurringJobs) - // { - // TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); - // - // if (taskScheduler != null) - // { - // jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, - // recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); - // } - // } - // } - // - // return Ok(jobsToRun); - // } - // - // [HttpPost("run")] - // public async Task RunJobs() - // { - // var jobsToRun = (await GetJobsToRun()).Value?.ToList(); - // - // if (jobsToRun == null || jobsToRun.Count == 0) - // { - // return BadRequest("Nie udało się pobrać zadań do uruchomienia."); - // } - // - // foreach (var job in jobsToRun) - // { - // if (!string.IsNullOrEmpty(job.Path)) - // { - // recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, - // new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - // } - // } - // - // return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); - // } - // - // [HttpPost("add")] - // public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) - // { - // var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler - // { - // Name = taskSchedulerDto.Name, - // Path = taskSchedulerDto.Path, - // CronOptions = taskSchedulerDto.CronOptions, - // CreateDate = DateTime.UtcNow - // }; - // - // int result = await service.AddTaskScheduler(taskSchedulerDto); - // - // if (result == 0) - // { - // return BadRequest("Nie udało się dodać zadania."); - // } - // - // recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), - // taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - // - // return Ok("Zadanie zostało dodane."); - // } - // - // [HttpPost("delete")] - // public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) - // { - // int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); - // - // if (result == 0) - // { - // return BadRequest("Nie udało się usunąć zadania."); - // } - // - // recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); - // - // return Ok("Zadanie zostało usunięte."); - // } - // - // [HttpGet] - // public async Task>> GetTasks() - // { - // var tasks = await service.GetTaskSchedulers(); - // - // foreach (TaskSchedulerDto taskSchedulerDto in tasks) - // { - // var job = GetJob(taskSchedulerDto.Name); - // taskSchedulerDto.LastExecution = job?.LastExecution; - // taskSchedulerDto.NextExecution = job?.NextExecution; - // } - // - // return Ok(tasks); - // } - // - // [HttpGet("by-name")] - // public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) - // { - // var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); - // - // if (taskSchedulerDto == null) return NotFound(); - // - // var job = GetJob(taskSchedulerDto.Name); - // taskSchedulerDto.LastExecution = job?.LastExecution; - // taskSchedulerDto.NextExecution = job?.NextExecution; - // - // return Ok(taskSchedulerDto); - // } - // - // private RecurringJobDto? GetJob(string jobId) - // { - // using IStorageConnection? connection = jobStorage.GetConnection(); - // IList? recurringJobs = connection.GetRecurringJobs(); - // return recurringJobs.FirstOrDefault(x => x.Id == jobId); - // } - // - // public void RunConsoleApplication(string pathToApp) - // { - // try - // { - // var process = new Process - // { - // StartInfo = new ProcessStartInfo - // { - // FileName = pathToApp, - // UseShellExecute = false, - // RedirectStandardOutput = true, - // RedirectStandardError = true, - // CreateNoWindow = true, - // WorkingDirectory = Path.GetDirectoryName(pathToApp) - // } - // }; - // process.Start(); - // string output = process.StandardOutput.ReadToEnd(); - // string error = process.StandardError.ReadToEnd(); - // process.WaitForExit(); - // - // Console.WriteLine($"Output: {output}"); - // Console.WriteLine($"Error: {error}"); - // } - // catch (Exception ex) - // { - // Console.WriteLine($"Error executing console application: {ex.Message}"); - // } - // } + public async Task>> GetJobsToRun() + { + IList jobsToRun = new List(); + + using (IStorageConnection? connection = jobStorage.GetConnection()) + { + IList? recurringJobs = connection.GetRecurringJobs(); + IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); + + foreach (var recurringJob in recurringJobs) + { + TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); + + if (taskScheduler != null) + { + jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, + recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); + } + } + } + + return Ok(jobsToRun); + } + + [HttpPost("run")] + public async Task RunJobs() + { + var jobsToRun = (await GetJobsToRun()).Value?.ToList(); + + if (jobsToRun == null || jobsToRun.Count == 0) + { + return BadRequest("Nie udało się pobrać zadań do uruchomienia."); + } + + foreach (var job in jobsToRun) + { + if (!string.IsNullOrEmpty(job.Path)) + { + recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, + new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + } + } + + return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); + } + + [HttpPost("add")] + public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) + { + var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler + { + Name = taskSchedulerDto.Name, + Path = taskSchedulerDto.Path, + CronOptions = taskSchedulerDto.CronOptions, + CreateDate = DateTime.UtcNow + }; + + int result = await service.AddTaskScheduler(taskSchedulerDto); + + if (result == 0) + { + return BadRequest("Nie udało się dodać zadania."); + } + + recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), + taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + + return Ok("Zadanie zostało dodane."); + } + + [HttpPost("delete")] + public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) + { + int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); + + if (result == 0) + { + return BadRequest("Nie udało się usunąć zadania."); + } + + recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); + + return Ok("Zadanie zostało usunięte."); + } + + [HttpGet] + public async Task>> GetTasks() + { + var tasks = await service.GetTaskSchedulers(); + + foreach (TaskSchedulerDto taskSchedulerDto in tasks) + { + var job = GetJob(taskSchedulerDto.Name); + taskSchedulerDto.LastExecution = job?.LastExecution; + taskSchedulerDto.NextExecution = job?.NextExecution; + } + + return Ok(tasks); + } + + [HttpGet("by-name")] + public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) + { + var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); + + if (taskSchedulerDto == null) return NotFound(); + + var job = GetJob(taskSchedulerDto.Name); + taskSchedulerDto.LastExecution = job?.LastExecution; + taskSchedulerDto.NextExecution = job?.NextExecution; + + return Ok(taskSchedulerDto); + } + + private RecurringJobDto? GetJob(string jobId) + { + using IStorageConnection? connection = jobStorage.GetConnection(); + IList? recurringJobs = connection.GetRecurringJobs(); + return recurringJobs.FirstOrDefault(x => x.Id == jobId); + } + + public void RunConsoleApplication(string pathToApp) + { + try + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = pathToApp, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + WorkingDirectory = Path.GetDirectoryName(pathToApp) + } + }; + process.Start(); + string output = process.StandardOutput.ReadToEnd(); + string error = process.StandardError.ReadToEnd(); + process.WaitForExit(); + + Console.WriteLine($"Output: {output}"); + Console.WriteLine($"Error: {error}"); + } + catch (Exception ex) + { + Console.WriteLine($"Error executing console application: {ex.Message}"); + } + } } \ No newline at end of file From 1a4ff2ef6d78dc869d1f3d0357bb5747548328e1 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sat, 24 May 2025 22:04:11 +0200 Subject: [PATCH 012/149] * Fixed Navigation issues --- OrdersManagement/Components/Pages/CustomerOrders.razor | 2 +- .../Components/Pages/CustomerOrdersTranslations.razor | 2 +- OrdersManagement/Components/Pages/EdiCustomerOrders.razor | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OrdersManagement/Components/Pages/CustomerOrders.razor b/OrdersManagement/Components/Pages/CustomerOrders.razor index 83a7a74..45a5e2c 100644 --- a/OrdersManagement/Components/Pages/CustomerOrders.razor +++ b/OrdersManagement/Components/Pages/CustomerOrders.razor @@ -109,7 +109,7 @@ { Guid customerOrderId = obj.RowData.RowPointer; - NavigationManager.NavigateTo($"/CustomerOrder/{customerOrderId}"); + NavigationManager.NavigateTo($"/Admin/PK/CustomerOrder/{customerOrderId}"); } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor b/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor index 5d33776..273a19b 100644 --- a/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor +++ b/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor @@ -1,4 +1,4 @@ -@page "/admin" +@page "/admin/pk" @using SytelineSaAppEfDataModel.Dtos @using Syncfusion.Blazor.Cards diff --git a/OrdersManagement/Components/Pages/EdiCustomerOrders.razor b/OrdersManagement/Components/Pages/EdiCustomerOrders.razor index f5883e4..ec07b1e 100644 --- a/OrdersManagement/Components/Pages/EdiCustomerOrders.razor +++ b/OrdersManagement/Components/Pages/EdiCustomerOrders.razor @@ -161,7 +161,7 @@ { Guid customerOrderId = obj.RowData.RowPointer; - NavigationManager.NavigateTo($"/EdiCustomerOrder/{customerOrderId}"); + NavigationManager.NavigateTo($"/Admin/PK/EdiCustomerOrder/{customerOrderId}"); } private async Task SendOrderToSyteLine() From ad641560eac5745ac595c1141c3713026ec92178 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sun, 25 May 2025 11:01:18 +0200 Subject: [PATCH 013/149] * Added EmailAddresses and WzNumbers to WzHeader * Changed approach to send email to addresses added to WzHeader --- .../Controllers/ExcelGeneratorController.cs | 9 +- FaKrosnoApi/Controllers/WzHeaderController.cs | 12 ++ .../Components/Pages/Warehouse.razor | 110 +++++++++++------- .../Components/Pages/WarehousePackList.razor | 37 ++++-- OrdersManagement/Services/WarehouseService.cs | 16 +++ SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs | 3 +- SytelineSaAppEfDataModel/Entities/WzHeader.cs | 2 + .../Services/IWzHeaderService.cs | 1 + .../Services/WzHeaderService.cs | 14 +++ .../SytelineSaAppDbContext.cs | 10 ++ 10 files changed, 160 insertions(+), 54 deletions(-) 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) From 53d99bf65f6323621cb242ee6aef7a3a322a6c33 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 27 May 2025 21:09:25 +0200 Subject: [PATCH 014/149] * Fixed issue with trying to save with empty addresses --- OrdersManagement/Components/Pages/WarehousePackList.razor | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index a6dd35f..56ddcfb 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -129,7 +129,11 @@ private async Task SaveChanges() { - await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + if (!string.IsNullOrWhiteSpace(EmailAddresses)) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + } + await _grid.EndEditAsync(); } From 269d9c87a438cac8e40fd340586dffb9550663ec Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Wed, 28 May 2025 21:06:39 +0200 Subject: [PATCH 015/149] * Added fields for scanning barcodes --- .../Components/Pages/WarehousePackList.razor | 54 +++++++++++++++---- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 56ddcfb..7c0035d 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -20,6 +20,16 @@
+ + + + + + + + + + _grid; private IEnumerable _wzRowsMeyle { get; set; } = new List(); - private WzHeaderDto _wzHeader; + private WzHeaderDto _wzHeader; private bool _isValid; private bool Visibility { get; set; } - - private string EmailAddresses { get; set; } = string.Empty; - + + private string? EmailAddresses { get; set; } = string.Empty; + private string PalletNumber { get; set; } = "0"; + private string ScannedValues { get; set; } = string.Empty; + + private IDictionary ScannedValuesWithItems { get; set; } = new Dictionary(); + + private string LastScannedValue { get; set; } = string.Empty; + private string ScannedValue { get; set; } = string.Empty; + private void HideModal() { Visibility = false; @@ -120,20 +137,22 @@ { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); + + _wzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(x.ItemNumber.Replace(" ", ""), null)); EmailAddresses = _wzHeader.EmailAddresses; - + StateHasChanged(); } } - + private async Task SaveChanges() { if (!string.IsNullOrWhiteSpace(EmailAddresses)) { await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); } - + await _grid.EndEditAsync(); } @@ -143,7 +162,7 @@ var changedRecords = changes.ChangedRecords; if (!changedRecords.Any()) return; - + await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); @@ -157,7 +176,7 @@ _isValid = count == 0; _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); - + if (_isValid) { await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); @@ -166,4 +185,21 @@ Visibility = true; } + + private void ScanValue(KeyboardEventArgs obj) + { + if (obj.Key != "Enter") return; + + LastScannedValue = ScannedValue.Trim(); + + if (!ScannedValuesWithItems.ContainsKey(ScannedValues.Replace(" ", "").Trim()) && ScannedValuesWithItems.ContainsKey(LastScannedValue.Replace(" ", "").Trim())) + { + ScannedValuesWithItems[LastScannedValue] = ScannedValue.Trim(); + ScannedValues += $"{ScannedValue})\n"; + } + else if(!string.IsNullOrWhiteSpace(ScannedValue)) + { + ScannedValues += $"{ScannedValue}: "; + } + } } \ No newline at end of file From 24e2836f77e84ac72c3f6eb392db47e98ba0f43e Mon Sep 17 00:00:00 2001 From: trencik91 Date: Thu, 29 May 2025 12:42:48 +0200 Subject: [PATCH 016/149] * Fixed issue with wrong scanning behaviour --- .../Components/Pages/WarehousePackList.razor | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 7c0035d..1fcc226 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -25,7 +25,7 @@ - + @@ -138,7 +138,8 @@ _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); - _wzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(x.ItemNumber.Replace(" ", ""), null)); + _wzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(x.ItemNumber.Replace(" ", "").Replace("-", ""), null)); + ScannedValuesWithItems.Add("40409100006", null); EmailAddresses = _wzHeader.EmailAddresses; @@ -186,20 +187,23 @@ Visibility = true; } - private void ScanValue(KeyboardEventArgs obj) + private void ScanValue(ChangedEventArgs obj) { - if (obj.Key != "Enter") return; + if (string.IsNullOrWhiteSpace(obj.Value)) return; - LastScannedValue = ScannedValue.Trim(); - - if (!ScannedValuesWithItems.ContainsKey(ScannedValues.Replace(" ", "").Trim()) && ScannedValuesWithItems.ContainsKey(LastScannedValue.Replace(" ", "").Trim())) + ScannedValue = obj.Value.Replace(" ", "").Replace("-", "").Replace("http://qr.meyle.com/", "").Trim(); + + if (!ScannedValuesWithItems.ContainsKey(ScannedValue) && ScannedValuesWithItems.ContainsKey(LastScannedValue.Trim())) { ScannedValuesWithItems[LastScannedValue] = ScannedValue.Trim(); - ScannedValues += $"{ScannedValue})\n"; + ScannedValues += $"{ScannedValue}\n"; } else if(!string.IsNullOrWhiteSpace(ScannedValue)) { ScannedValues += $"{ScannedValue}: "; } + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; } } \ No newline at end of file From 9cb7210aa54a46a40f2a998cc774fbd6b0fe3d58 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 12 Jun 2025 21:18:37 +0200 Subject: [PATCH 017/149] * Added TransactionNumber to have unique values in Dictionary * Added Saving scanned values --- .../Components/Pages/Warehouse.razor | 3 +- .../Components/Pages/WarehousePackList.razor | 87 ++++++++++++++----- OrdersManagement/Models/RowMeyleModel.cs | 28 ++++++ .../Dtos/WzRowMeyleDto.cs | 1 + .../Entities/WzRowMeyle.cs | 1 + .../SytelineSaAppDbContext.cs | 5 ++ 6 files changed, 101 insertions(+), 24 deletions(-) create mode 100644 OrdersManagement/Models/RowMeyleModel.cs diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index d858eb3..d76474c 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -206,7 +206,8 @@ ItemNumber = item.CustItem, OrderNumber = customerOrder.CustPo, WzNumber = materialTransactionDto.MTGroupNum ?? string.Empty, - FK_Header = wzHeader.ID + FK_Header = wzHeader.ID, + TransactionNumber = (int?)materialTransactionDto.TransNum ?? 0 }); } diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 7c0035d..05d98ef 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -1,4 +1,5 @@ @page "/Warehouse/PackList/{WzHeader:guid}" +@using OrdersManagement.Models @using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Grids @using SytelineSaAppEfDataModel.Dtos @@ -17,17 +18,21 @@ - + - + - + - + Packing List został wygenerowany i wysłany!

} - else if(string.IsNullOrWhiteSpace(EmailAddresses)) + 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!

+

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

} @@ -99,7 +105,7 @@ - + FA Krosno Manager © @(DateTime.Now.Year) @@ -112,6 +118,7 @@ private SfGrid _grid; private IEnumerable _wzRowsMeyle { get; set; } = new List(); private WzHeaderDto _wzHeader; + private SfTextBox _scanner; private bool _isValid; @@ -121,7 +128,7 @@ private string PalletNumber { get; set; } = "0"; private string ScannedValues { get; set; } = string.Empty; - private IDictionary ScannedValuesWithItems { get; set; } = new Dictionary(); + private IDictionary ScannedValuesWithItems { get; set; } = new Dictionary(); private string LastScannedValue { get; set; } = string.Empty; private string ScannedValue { get; set; } = string.Empty; @@ -137,22 +144,47 @@ { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); - - _wzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(x.ItemNumber.Replace(" ", ""), null)); + + _wzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(new RowMeyleModel + { + ItemNumber = x.ItemNumber.Replace(" ", "").Replace("-", ""), + TransactionNumber = x.TransactionNumber, + WzNumber = x.WzNumber + }, null)); EmailAddresses = _wzHeader.EmailAddresses; + await _scanner.FocusAsync(); StateHasChanged(); } } private async Task SaveChanges() { + List changedRecords = new List(); + if (!string.IsNullOrWhiteSpace(EmailAddresses)) { await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); } + IDictionary scannedValuesWithNotNullValues = ScannedValuesWithItems.Where(x => x.Value is not null).ToDictionary(x => x.Key, y => y.Value); + + foreach (KeyValuePair scannedValueWithNotNullValue in scannedValuesWithNotNullValues) + { + WzRowMeyleDto rowMeyleDto = _wzRowsMeyle.First(r => r.ItemNumber.Replace(" ", "").Replace("-", "").Trim() == scannedValueWithNotNullValue.Key.ItemNumber && r.TransactionNumber == scannedValueWithNotNullValue.Key.TransactionNumber && r.WzNumber == scannedValueWithNotNullValue.Key.WzNumber); + + rowMeyleDto.PalletNumber = int.Parse(PalletNumber); + rowMeyleDto.PartNumber = scannedValueWithNotNullValue.Value; + + changedRecords.Add(rowMeyleDto); + } + + if (changedRecords.Any()) + { + await UpdateRows(changedRecords); + } + await _grid.EndEditAsync(); } @@ -163,11 +195,7 @@ if (!changedRecords.Any()) return; - await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); - - _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); - StateHasChanged(); - await _grid.Refresh(); + await UpdateRows(changedRecords); } private async Task ExportXls() @@ -186,20 +214,33 @@ Visibility = true; } - private void ScanValue(KeyboardEventArgs obj) + private void ScanValue(ChangedEventArgs obj) { - if (obj.Key != "Enter") return; + if (string.IsNullOrWhiteSpace(obj.Value)) return; - LastScannedValue = ScannedValue.Trim(); - - if (!ScannedValuesWithItems.ContainsKey(ScannedValues.Replace(" ", "").Trim()) && ScannedValuesWithItems.ContainsKey(LastScannedValue.Replace(" ", "").Trim())) + ScannedValue = obj.Value.Replace(" ", "").Replace("-", "").Replace("http://qr.meyle.com/", "").Trim(); + ScannedValue = ScannedValue.Replace("40409100006", "1409100076"); + if (ScannedValuesWithItems.All(x => x.Key.ItemNumber != ScannedValue.Replace(" ", "").Trim()) && ScannedValuesWithItems.Any(x => x.Key.ItemNumber == LastScannedValue.Replace(" ", "").Trim())) { - ScannedValuesWithItems[LastScannedValue] = ScannedValue.Trim(); - ScannedValues += $"{ScannedValue})\n"; + RowMeyleModel key = ScannedValuesWithItems.First(x => x.Key.ItemNumber == LastScannedValue).Key; + ScannedValuesWithItems[key] = ScannedValue.Trim(); + ScannedValues += $"{ScannedValue}\n"; } - else if(!string.IsNullOrWhiteSpace(ScannedValue)) + else if (!string.IsNullOrWhiteSpace(ScannedValue)) { ScannedValues += $"{ScannedValue}: "; } + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + } + + private async Task UpdateRows(IList changedRecords) + { + await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); + + _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); + StateHasChanged(); + await _grid.Refresh(); } } \ No newline at end of file diff --git a/OrdersManagement/Models/RowMeyleModel.cs b/OrdersManagement/Models/RowMeyleModel.cs new file mode 100644 index 0000000..365532f --- /dev/null +++ b/OrdersManagement/Models/RowMeyleModel.cs @@ -0,0 +1,28 @@ +namespace OrdersManagement.Models; + +public class RowMeyleModel : IEquatable +{ + public string ItemNumber {get; set;} = string.Empty; + public string WzNumber { get; set; } = string.Empty; + public int? TransactionNumber { get; set; } + + public bool Equals(RowMeyleModel? other) + { + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; + return ItemNumber == other.ItemNumber && WzNumber == other.WzNumber && TransactionNumber == other.TransactionNumber; + } + + public override bool Equals(object? obj) + { + if (obj is null) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != GetType()) return false; + return Equals((RowMeyleModel)obj); + } + + public override int GetHashCode() + { + return HashCode.Combine(ItemNumber, WzNumber, TransactionNumber); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs index c53f11c..53e6f47 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs @@ -10,4 +10,5 @@ public class WzRowMeyleDto public int? PalletNumber { get; set; } public string WzNumber { get; set; } public string? PartNumber { get; set; } + public int? TransactionNumber { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs index dfeaffd..679a4f2 100644 --- a/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs +++ b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs @@ -10,6 +10,7 @@ public class WzRowMeyle public int? PalletNumber { get; set; } public string WzNumber { get; set; } public string? PartNumber { get; set; } + public int? TransactionNumber { get; set; } // Navigation property public WzHeader Header { get; set; } diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index da3081d..4397d3a 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -995,6 +995,11 @@ namespace SytelineSaAppEfDataModel .HasColumnName("part_number") .HasMaxLength(100) .IsRequired(false); + + entity.Property(e => e.TransactionNumber) + .HasColumnName("trans_num") + .HasColumnType("int") + .IsRequired(false); // Relationship entity.HasOne(e => e.Header) From e96bcc95badec0efb7662286569784860011778a Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 12 Jun 2025 21:23:51 +0200 Subject: [PATCH 018/149] * Comment line --- OrdersManagement/Components/Pages/WarehousePackList.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 05d98ef..e7465d6 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -219,7 +219,7 @@ if (string.IsNullOrWhiteSpace(obj.Value)) return; ScannedValue = obj.Value.Replace(" ", "").Replace("-", "").Replace("http://qr.meyle.com/", "").Trim(); - ScannedValue = ScannedValue.Replace("40409100006", "1409100076"); + //ScannedValue = ScannedValue.Replace("40409100006", "1409100076"); if (ScannedValuesWithItems.All(x => x.Key.ItemNumber != ScannedValue.Replace(" ", "").Trim()) && ScannedValuesWithItems.Any(x => x.Key.ItemNumber == LastScannedValue.Replace(" ", "").Trim())) { RowMeyleModel key = ScannedValuesWithItems.First(x => x.Key.ItemNumber == LastScannedValue).Key; From a8e3a8be66cad3a13faf0b6811a276581f306231 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 17 Jun 2025 08:30:10 +0200 Subject: [PATCH 019/149] * Added Lot table and service * Changed behaviour of scanning to scan first PartNumber, select specific record and then scan MeylePartNumber --- .../Controllers/WzRowMeyleController.cs | 9 +- .../Components/Pages/Warehouse.razor | 4 +- .../Components/Pages/WarehousePackList.razor | 93 ++++++++--- OrdersManagement/Models/RowMeyleModel.cs | 5 +- OrdersManagement/Services/WarehouseService.cs | 20 ++- SytelineSaAppEfDataModel/Dtos/LotDto.cs | 32 ++++ .../Dtos/WzRowMeyleDto.cs | 2 + SytelineSaAppEfDataModel/Entities/Lot.cs | 32 ++++ .../Entities/WzRowMeyle.cs | 2 + SytelineSaAppEfDataModel/MappingProfile.cs | 1 + .../Services/ILotService.cs | 10 ++ .../Services/IMaterialTransactionService.cs | 1 + .../Services/LotService.cs | 25 +++ .../Services/MaterialTransactionService.cs | 7 + .../SytelineSaAppDbContext.cs | 156 ++++++++++++++++++ 15 files changed, 374 insertions(+), 25 deletions(-) create mode 100644 SytelineSaAppEfDataModel/Dtos/LotDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/Lot.cs create mode 100644 SytelineSaAppEfDataModel/Services/ILotService.cs create mode 100644 SytelineSaAppEfDataModel/Services/LotService.cs diff --git a/FaKrosnoApi/Controllers/WzRowMeyleController.cs b/FaKrosnoApi/Controllers/WzRowMeyleController.cs index 6ee43f5..97d7305 100644 --- a/FaKrosnoApi/Controllers/WzRowMeyleController.cs +++ b/FaKrosnoApi/Controllers/WzRowMeyleController.cs @@ -6,7 +6,7 @@ namespace FaKrosnoApi.Controllers; [ApiController] [Route("api/[controller]")] -public class WzRowMeyleController(IWzRowMeyleService service) : Controller +public class WzRowMeyleController(IWzRowMeyleService service, IMaterialTransactionService materialTransactionService) : Controller { [HttpGet] public async Task>> GetAll() @@ -34,6 +34,13 @@ public class WzRowMeyleController(IWzRowMeyleService service) : Controller return Ok(wzRows); } + [HttpGet("by-part-number")] + public async Task> GetByPartNumber([FromQuery] string partNumber) + { + MaterialTransactionDto materialTransaction = await materialTransactionService.GetByPartNumber(partNumber); + return Ok(materialTransaction); + } + [HttpPut] public async Task UpdateRows([FromBody] IEnumerable rows) { diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index d76474c..9ed444e 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -207,7 +207,9 @@ OrderNumber = customerOrder.CustPo, WzNumber = materialTransactionDto.MTGroupNum ?? string.Empty, FK_Header = wzHeader.ID, - TransactionNumber = (int?)materialTransactionDto.TransNum ?? 0 + TransactionNumber = (int?)materialTransactionDto.TransNum ?? 0, + PartNumberSl = materialTransactionDto.NR_KARTY_KONTROLNEJ, + FaIndex = item.Item }); } diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index e7465d6..7103e87 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -41,7 +41,7 @@ AllowSorting="true" AllowSelection="true" TValue="WzRowMeyleDto" - DataSource="@_wzRowsMeyle" + DataSource="@WzRowsMeyle" EnableAdaptiveUI="true"> @@ -57,16 +57,20 @@ + + TextAlign="TextAlign.Center" HeaderText="Numer Indeksu Meyle" Width="100"> + + HeaderText="Nr Partii Meyle" Width="80"> _grid; - private IEnumerable _wzRowsMeyle { get; set; } = new List(); + private List WzRowsMeyle { get; set; } = new List(); private WzHeaderDto _wzHeader; private SfTextBox _scanner; + private WzRowMeyleDto? SelectedRow { get; set; } + private bool _isValid; private bool Visibility { get; set; } @@ -143,11 +149,12 @@ if (firstRender) { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); - _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); + WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); - _wzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(new RowMeyleModel + WzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(new RowMeyleModel { ItemNumber = x.ItemNumber.Replace(" ", "").Replace("-", ""), + PartNumberSl = x.PartNumberSl, TransactionNumber = x.TransactionNumber, WzNumber = x.WzNumber }, null)); @@ -172,7 +179,7 @@ foreach (KeyValuePair scannedValueWithNotNullValue in scannedValuesWithNotNullValues) { - WzRowMeyleDto rowMeyleDto = _wzRowsMeyle.First(r => r.ItemNumber.Replace(" ", "").Replace("-", "").Trim() == scannedValueWithNotNullValue.Key.ItemNumber && r.TransactionNumber == scannedValueWithNotNullValue.Key.TransactionNumber && r.WzNumber == scannedValueWithNotNullValue.Key.WzNumber); + WzRowMeyleDto rowMeyleDto = WzRowsMeyle.First(r => r.ItemNumber.Replace(" ", "").Replace("-", "").Trim() == scannedValueWithNotNullValue.Key.ItemNumber && r.PartNumberSl == scannedValueWithNotNullValue.Key.PartNumberSl && r.WzNumber == scannedValueWithNotNullValue.Key.WzNumber); rowMeyleDto.PalletNumber = int.Parse(PalletNumber); rowMeyleDto.PartNumber = scannedValueWithNotNullValue.Value; @@ -191,7 +198,7 @@ private async Task OnBatchSave(BeforeBatchSaveArgs obj) { var changes = obj.BatchChanges; - var changedRecords = changes.ChangedRecords; + List changedRecords = changes.ChangedRecords; if (!changedRecords.Any()) return; @@ -200,7 +207,7 @@ private async Task ExportXls() { - int count = _wzRowsMeyle.Count(x => x.PalletNumber == null); + int count = WzRowsMeyle.Count(x => x.PalletNumber == null); _isValid = count == 0; _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); @@ -214,32 +221,80 @@ Visibility = true; } - private void ScanValue(ChangedEventArgs obj) + private async Task ScanValue(ChangedEventArgs obj) { if (string.IsNullOrWhiteSpace(obj.Value)) return; - ScannedValue = obj.Value.Replace(" ", "").Replace("-", "").Replace("http://qr.meyle.com/", "").Trim(); - //ScannedValue = ScannedValue.Replace("40409100006", "1409100076"); - if (ScannedValuesWithItems.All(x => x.Key.ItemNumber != ScannedValue.Replace(" ", "").Trim()) && ScannedValuesWithItems.Any(x => x.Key.ItemNumber == LastScannedValue.Replace(" ", "").Trim())) + MaterialTransactionDto? materialTransactionByPartNumber = await GetMaterialTransactionByPartNumber(ScannedValue).ConfigureAwait(false); + + if (materialTransactionByPartNumber != null) { - RowMeyleModel key = ScannedValuesWithItems.First(x => x.Key.ItemNumber == LastScannedValue).Key; - ScannedValuesWithItems[key] = ScannedValue.Trim(); - ScannedValues += $"{ScannedValue}\n"; + var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.Item && x.Quantity == materialTransactionByPartNumber.Qty); + rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA24278.18" && x.Quantity == 70); + + if (_grid.AllowPaging) + { + int pageSize = _grid.PageSettings.PageSize; + int targetPage = (rowIndex / pageSize) + 1; + await _grid.GoToPageAsync(targetPage).ConfigureAwait(false); + + rowIndex %= pageSize; + } + + await _grid.SelectRowAsync(rowIndex).ConfigureAwait(false); + await _grid.ScrollIntoViewAsync(rowIndex: rowIndex).ConfigureAwait(false); + await _grid.FocusAsync().ConfigureAwait(false); + + SelectedRow = WzRowsMeyle[rowIndex]; } - else if (!string.IsNullOrWhiteSpace(ScannedValue)) + else if (ValidateScannedValue(obj.Value) && SelectedRow != null) { - ScannedValues += $"{ScannedValue}: "; + SelectedRow.PartNumber = obj.Value.Trim(); + await InvokeAsync(StateHasChanged).ConfigureAwait(false); + await _grid.Refresh().ConfigureAwait(false); } + else + { + ScannedValue = obj.Value.Trim(); + SelectedRow = null; + } + + // if (ScannedValuesWithItems.All(x => x.Key.ItemNumber != ScannedValue.Replace(" ", "").Trim()) && ScannedValuesWithItems.Any(x => x.Key.ItemNumber == LastScannedValue.Replace(" ", "").Trim())) + // { + // RowMeyleModel key = ScannedValuesWithItems.First(x => x.Key.ItemNumber == LastScannedValue).Key; + // ScannedValuesWithItems[key] = ScannedValue.Trim(); + // ScannedValues += $"{ScannedValue}\n"; + // } + // else if (!string.IsNullOrWhiteSpace(ScannedValue)) + // { + // ScannedValues += $"{ScannedValue}: "; + // } LastScannedValue = ScannedValue; ScannedValue = string.Empty; } + private bool ValidateScannedValue(string scannedValue) + { + int year = DateTime.Now.Year - 2000; + + string format = $"{year}X"; + + return scannedValue.StartsWith(format); + } + + private async Task GetMaterialTransactionByPartNumber(string partNumber) + { + MaterialTransactionDto? materialTransaction = await WarehouseService.GetMaterialTransactionByPartNumberAsync(partNumber).ConfigureAwait(false); + + return materialTransaction; + } + private async Task UpdateRows(IList changedRecords) { await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); - _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); + WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); StateHasChanged(); await _grid.Refresh(); } diff --git a/OrdersManagement/Models/RowMeyleModel.cs b/OrdersManagement/Models/RowMeyleModel.cs index 365532f..c4ced10 100644 --- a/OrdersManagement/Models/RowMeyleModel.cs +++ b/OrdersManagement/Models/RowMeyleModel.cs @@ -4,13 +4,14 @@ public class RowMeyleModel : IEquatable { public string ItemNumber {get; set;} = string.Empty; public string WzNumber { get; set; } = string.Empty; + public string? PartNumberSl { get; set; } public int? TransactionNumber { get; set; } public bool Equals(RowMeyleModel? other) { if (other is null) return false; if (ReferenceEquals(this, other)) return true; - return ItemNumber == other.ItemNumber && WzNumber == other.WzNumber && TransactionNumber == other.TransactionNumber; + return ItemNumber == other.ItemNumber && WzNumber == other.WzNumber && PartNumberSl == other.PartNumberSl && TransactionNumber == other.TransactionNumber; } public override bool Equals(object? obj) @@ -23,6 +24,6 @@ public class RowMeyleModel : IEquatable public override int GetHashCode() { - return HashCode.Combine(ItemNumber, WzNumber, TransactionNumber); + return HashCode.Combine(ItemNumber, WzNumber, PartNumberSl, TransactionNumber); } } \ No newline at end of file diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index b74faf5..f9321ae 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -1,3 +1,5 @@ +using System.Net; +using System.Web; using SytelineSaAppEfDataModel.Dtos; namespace OrdersManagement.Services; @@ -28,6 +30,20 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) return await response.Content.ReadFromJsonAsync>(); } + public async Task GetMaterialTransactionByPartNumberAsync(string partNumber) + { + string encodedPartNumber = HttpUtility.UrlEncode(partNumber); + var response = await _httpClient.GetAsync( + $"api/WzRowMeyle/by-part-number?partNumber={encodedPartNumber}").ConfigureAwait(false);; + + if (response.StatusCode == HttpStatusCode.NoContent) + { + return null; + } + + return await response.Content.ReadFromJsonAsync().ConfigureAwait(false);; + } + public async Task> GetAllClientWzHeadersAsync(string customerNumber, int customerSequence) { var response = await _httpClient.GetAsync( @@ -85,7 +101,7 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) return await response.Content.ReadFromJsonAsync>(); } - public async Task UpdateWzRowsMeyleAsync(IEnumerable wzRowsMeyle) + public async Task UpdateWzRowsMeyleAsync(IEnumerable wzRowsMeyle) { if (wzRowsMeyle == null || !wzRowsMeyle.Any()) { @@ -106,7 +122,7 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) } } - public async Task AddEmailsToWzHeaderAsync(Guid wzHeaderId, string emailAddresses) + public async Task AddEmailsToWzHeaderAsync(Guid wzHeaderId, string? emailAddresses) { var response = await _httpClient.PostAsJsonAsync( $"api/WzHeader/add-emails?id={wzHeaderId}", diff --git a/SytelineSaAppEfDataModel/Dtos/LotDto.cs b/SytelineSaAppEfDataModel/Dtos/LotDto.cs new file mode 100644 index 0000000..3008569 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/LotDto.cs @@ -0,0 +1,32 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class LotDto +{ + public string Item { get; set; } + public string LotNumber { get; set; } + public decimal? RcvdQty { get; set; } + public DateTime? CreateDate { get; set; } + public DateTime? ExpDate { get; set; } + public DateTime? PurgeDate { get; set; } + public string VendLot { get; set; } + public string CertNum { get; set; } + public string Charfld1 { get; set; } + public string Charfld2 { get; set; } + public string Charfld3 { get; set; } + public DateTime? Datefld { get; set; } + public decimal? Decifld1 { get; set; } + public decimal? Decifld2 { get; set; } + public decimal? Decifld3 { get; set; } + public bool Logifld { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDateField { get; set; } + public bool InWorkflow { get; set; } + public bool ContainsTaxFreeMatl { get; set; } + public string AttrGroup { get; set; } + public string ManufacturerId { get; set; } + public string ManufacturerItem { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs index 53e6f47..8a16c6c 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs @@ -11,4 +11,6 @@ public class WzRowMeyleDto public string WzNumber { get; set; } public string? PartNumber { get; set; } public int? TransactionNumber { get; set; } + public string? FaIndex { get; set; } + public string? PartNumberSl { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/Lot.cs b/SytelineSaAppEfDataModel/Entities/Lot.cs new file mode 100644 index 0000000..6f5f0b4 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/Lot.cs @@ -0,0 +1,32 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class Lot +{ + public string Item { get; set; } + public string LotNumber { get; set; } + public decimal? RcvdQty { get; set; } + public DateTime? CreateDate { get; set; } + public DateTime? ExpDate { get; set; } + public DateTime? PurgeDate { get; set; } + public string VendLot { get; set; } + public string CertNum { get; set; } + public string Charfld1 { get; set; } + public string Charfld2 { get; set; } + public string Charfld3 { get; set; } + public DateTime? Datefld { get; set; } + public decimal? Decifld1 { get; set; } + public decimal? Decifld2 { get; set; } + public decimal? Decifld3 { get; set; } + public bool Logifld { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDateField { get; set; } + public bool InWorkflow { get; set; } + public bool ContainsTaxFreeMatl { get; set; } + public string AttrGroup { get; set; } + public string ManufacturerId { get; set; } + public string ManufacturerItem { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs index 679a4f2..445f8d7 100644 --- a/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs +++ b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs @@ -11,6 +11,8 @@ public class WzRowMeyle public string WzNumber { get; set; } public string? PartNumber { get; set; } public int? TransactionNumber { get; set; } + public string? FaIndex { get; set; } + public string? PartNumberSl { get; set; } // Navigation property public WzHeader Header { get; set; } diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 3c86434..23eabcd 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -24,6 +24,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/ILotService.cs b/SytelineSaAppEfDataModel/Services/ILotService.cs new file mode 100644 index 0000000..ceb6519 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/ILotService.cs @@ -0,0 +1,10 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface ILotService +{ + Task> GetAll(); + Task GetByItemNumber(string itemNumber); + Task GetByLotNumber(string lotNumber); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs index 78535cb..ccae08a 100644 --- a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs @@ -10,4 +10,5 @@ public interface IMaterialTransactionService Task> GetByOrderNumber(string orderNumber); Task> GetOrderNumbersByWz(ISet wzNumbers); Task> GetByCustomerNumber(string customerNumber, int customerSequence); + Task GetByPartNumber(string partNumber); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/LotService.cs b/SytelineSaAppEfDataModel/Services/LotService.cs new file mode 100644 index 0000000..1d217a0 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/LotService.cs @@ -0,0 +1,25 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public class LotService(SytelineSaAppDbContext context, IMapper mapper) : ILotService +{ + public async Task> GetAll() + { + return await context.Lots.Select(x => mapper.Map(x)).ToListAsync(); + } + + public async Task GetByItemNumber(string itemNumber) + { + return await context.Lots.Where(x => x.Item == itemNumber).Select(x => mapper.Map(x)) + .FirstOrDefaultAsync(); + } + + public async Task GetByLotNumber(string lotNumber) + { + return await context.Lots.Where(x => x.LotNumber == lotNumber).Select(x => mapper.Map(x)) + .FirstOrDefaultAsync(); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs index 4cdff57..46e5ffb 100644 --- a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs @@ -83,4 +83,11 @@ public class MaterialTransactionService(SytelineSaAppDbContext context, IMapper return result.OrderByDescending(x => x.CreateDate); } + + public async Task GetByPartNumber(string partNumber) + { + return await context.MaterialTransactions + .Where(x => x.NR_KARTY_KONTROLNEJ == partNumber) + .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 4397d3a..2921637 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -27,6 +27,8 @@ namespace SytelineSaAppEfDataModel public DbSet WzRowsMeyle { get; set; } public DbSet ItemCusts { get; set; } + + public DbSet Lots { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var configuration = new ConfigurationBuilder() @@ -1000,7 +1002,17 @@ namespace SytelineSaAppEfDataModel .HasColumnName("trans_num") .HasColumnType("int") .IsRequired(false); + + entity.Property(e => e.FaIndex) + .HasColumnName("fa_index") + .HasMaxLength(100) + .IsRequired(false); + entity.Property(e => e.PartNumberSl) + .HasColumnName("part_number_sl") + .HasMaxLength(100) + .IsRequired(false); + // Relationship entity.HasOne(e => e.Header) .WithMany() @@ -1150,6 +1162,150 @@ namespace SytelineSaAppEfDataModel .HasDatabaseName("IX_itemcust_RowPointer") .IsUnique(); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("lot"); + + entity.HasKey(e => new { e.Item, e.LotNumber }); + + entity.Property(e => e.Item) + .HasColumnName("item") + .HasMaxLength(60) + .IsRequired(); + + entity.Property(e => e.LotNumber) + .HasColumnName("lot") + .HasMaxLength(15) + .IsRequired(); + + entity.Property(e => e.RcvdQty) + .HasColumnName("rcvd_qty") + .HasDefaultValueSql("0") + .IsRequired(false); + + entity.Property(e => e.CreateDate) + .HasColumnName("create_date") + .IsRequired(false); + + entity.Property(e => e.ExpDate) + .HasColumnName("exp_date") + .IsRequired(false); + + entity.Property(e => e.PurgeDate) + .HasColumnName("purge_date") + .IsRequired(false); + + entity.Property(e => e.VendLot) + .HasColumnName("vend_lot") + .HasMaxLength(30) + .IsRequired(false); + + entity.Property(e => e.CertNum) + .HasColumnName("cert_num") + .HasMaxLength(20) + .IsRequired(false); + + entity.Property(e => e.Charfld1) + .HasColumnName("charfld1") + .HasMaxLength(40) + .IsRequired(false); + + entity.Property(e => e.Charfld2) + .HasColumnName("charfld2") + .HasMaxLength(40) + .IsRequired(false); + + entity.Property(e => e.Charfld3) + .HasColumnName("charfld3") + .HasMaxLength(40) + .IsRequired(false); + + entity.Property(e => e.Datefld) + .HasColumnName("datefld") + .IsRequired(false); + + entity.Property(e => e.Decifld1) + .HasColumnName("decifld1") + .HasDefaultValueSql("0") + .IsRequired(false); + + entity.Property(e => e.Decifld2) + .HasColumnName("decifld2") + .HasDefaultValueSql("0") + .IsRequired(false); + + entity.Property(e => e.Decifld3) + .HasColumnName("decifld3") + .HasDefaultValueSql("0") + .IsRequired(false); + + entity.Property(e => e.Logifld) + .HasColumnName("logifld") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.NoteExistsFlag) + .HasColumnName("NoteExistsFlag") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.RecordDate) + .HasColumnName("RecordDate") + .HasDefaultValueSql("getdate()"); + + entity.Property(e => e.RowPointer) + .HasColumnName("RowPointer") + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("newid()"); + + entity.Property(e => e.CreatedBy) + .HasColumnName("CreatedBy") + .HasMaxLength(60) + .HasDefaultValueSql("suser_sname()"); + + entity.Property(e => e.UpdatedBy) + .HasColumnName("UpdatedBy") + .HasMaxLength(60) + .HasDefaultValueSql("suser_sname()"); + + entity.Property(e => e.CreateDateField) + .HasColumnName("CreateDate") + .HasDefaultValueSql("getdate()"); + + entity.Property(e => e.InWorkflow) + .HasColumnName("InWorkflow") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.ContainsTaxFreeMatl) + .HasColumnName("contains_tax_free_matl") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.AttrGroup) + .HasColumnName("attr_group") + .HasMaxLength(20) + .IsRequired(false); + + entity.Property(e => e.ManufacturerId) + .HasColumnName("manufacturer_id") + .HasMaxLength(14) + .IsRequired(false); + + entity.Property(e => e.ManufacturerItem) + .HasColumnName("manufacturer_item") + .HasMaxLength(60) + .IsRequired(false); + + // Indexes + entity.HasIndex(e => e.LotNumber) + .HasDatabaseName("IX_lot"); + + entity.HasIndex(e => e.RowPointer) + .HasDatabaseName("IX_lot_RowPointer") + .IsUnique(); + }); } } } From 30d2984add0089d040c973c9bb91677b789dbf6b Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 17 Jun 2025 22:05:15 +0200 Subject: [PATCH 020/149] * Further improvements --- .../Controllers/WzRowMeyleController.cs | 7 + .../Components/Pages/WarehousePackList.razor | 133 ++++++++++-------- OrdersManagement/Models/TransactionModel.cs | 29 ++++ OrdersManagement/Services/WarehouseService.cs | 14 +- .../Services/IMaterialTransactionService.cs | 1 + .../Services/MaterialTransactionService.cs | 7 + 6 files changed, 133 insertions(+), 58 deletions(-) create mode 100644 OrdersManagement/Models/TransactionModel.cs diff --git a/FaKrosnoApi/Controllers/WzRowMeyleController.cs b/FaKrosnoApi/Controllers/WzRowMeyleController.cs index 97d7305..265176d 100644 --- a/FaKrosnoApi/Controllers/WzRowMeyleController.cs +++ b/FaKrosnoApi/Controllers/WzRowMeyleController.cs @@ -41,6 +41,13 @@ public class WzRowMeyleController(IWzRowMeyleService service, IMaterialTransacti return Ok(materialTransaction); } + [HttpGet("transactions-with-part-number")] + public async Task> GetTransactionsWithPartNumber() + { + IEnumerable materialTransactions = await materialTransactionService.GetWithPartNumber(); + return Ok(materialTransactions); + } + [HttpPut] public async Task UpdateRows([FromBody] IEnumerable rows) { diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 7103e87..8237e42 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -30,9 +30,6 @@ - - Błąd: Nie Wszystkie linie mają wypełniony NUMER PALETY.
Packing List nie zostanie wygenerowany!

} + else if (!_notValidatedNumber) + { +

Błąd: Proszę zeskanować poprawny Numer Partii SL (istniejący w tabeli) lub poprawny numer Partii Meyle zaczynający się od @($"{DateTime.Now.Year - 2001}X")!

+ } + + + + + + + + + + +

Błąd: Proszę zeskanować poprawny Numer Partii SL (istniejący w tabeli) lub poprawny numer Partii Meyle zaczynający się od @($"{DateTime.Now.Year - 2000}X")!

@@ -120,21 +132,22 @@ [Parameter] public Guid WzHeader { get; set; } private SfGrid _grid; - private List WzRowsMeyle { get; set; } = new List(); + private List WzRowsMeyle { get; set; } = new(); + private IDictionary> TransactionModelsByPartNumber { get; set; } = new Dictionary>(); + private List ChangedRecords = new(); private WzHeaderDto _wzHeader; private SfTextBox _scanner; private WzRowMeyleDto? SelectedRow { get; set; } private bool _isValid; + private bool _notValidatedNumber; private bool Visibility { get; set; } + private bool VisibilityValidation { get; set; } private string? EmailAddresses { get; set; } = string.Empty; private string PalletNumber { get; set; } = "0"; - private string ScannedValues { get; set; } = string.Empty; - - private IDictionary ScannedValuesWithItems { get; set; } = new Dictionary(); private string LastScannedValue { get; set; } = string.Empty; private string ScannedValue { get; set; } = string.Empty; @@ -142,6 +155,7 @@ private void HideModal() { Visibility = false; + VisibilityValidation = false; } protected override async Task OnAfterRenderAsync(bool firstRender) @@ -150,15 +164,9 @@ { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); - - WzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(new RowMeyleModel - { - ItemNumber = x.ItemNumber.Replace(" ", "").Replace("-", ""), - PartNumberSl = x.PartNumberSl, - TransactionNumber = x.TransactionNumber, - WzNumber = x.WzNumber - }, null)); - + + TransactionModelsByPartNumber = await GetTransactionModels(); + EmailAddresses = _wzHeader.EmailAddresses; await _scanner.FocusAsync(); @@ -167,29 +175,15 @@ } private async Task SaveChanges() - { - List changedRecords = new List(); - + { if (!string.IsNullOrWhiteSpace(EmailAddresses)) { await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); } - IDictionary scannedValuesWithNotNullValues = ScannedValuesWithItems.Where(x => x.Value is not null).ToDictionary(x => x.Key, y => y.Value); - - foreach (KeyValuePair scannedValueWithNotNullValue in scannedValuesWithNotNullValues) + if (ChangedRecords.Any()) { - WzRowMeyleDto rowMeyleDto = WzRowsMeyle.First(r => r.ItemNumber.Replace(" ", "").Replace("-", "").Trim() == scannedValueWithNotNullValue.Key.ItemNumber && r.PartNumberSl == scannedValueWithNotNullValue.Key.PartNumberSl && r.WzNumber == scannedValueWithNotNullValue.Key.WzNumber); - - rowMeyleDto.PalletNumber = int.Parse(PalletNumber); - rowMeyleDto.PartNumber = scannedValueWithNotNullValue.Value; - - changedRecords.Add(rowMeyleDto); - } - - if (changedRecords.Any()) - { - await UpdateRows(changedRecords); + await UpdateRows(ChangedRecords); } await _grid.EndEditAsync(); @@ -223,55 +217,75 @@ private async Task ScanValue(ChangedEventArgs obj) { + _notValidatedNumber = false; + if (string.IsNullOrWhiteSpace(obj.Value)) return; - MaterialTransactionDto? materialTransactionByPartNumber = await GetMaterialTransactionByPartNumber(ScannedValue).ConfigureAwait(false); + TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); + + TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); if (materialTransactionByPartNumber != null) { - var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.Item && x.Quantity == materialTransactionByPartNumber.Qty); - rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA24278.18" && x.Quantity == 70); + var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA23956.18" && x.Quantity == 130); + + SelectedRow = WzRowsMeyle[rowIndex]; + + SelectedRow.PartNumberSl = ScannedValue; + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + await SaveChanges(); + await InvokeAsync(StateHasChanged); + await _grid.Refresh(); if (_grid.AllowPaging) { int pageSize = _grid.PageSettings.PageSize; int targetPage = (rowIndex / pageSize) + 1; - await _grid.GoToPageAsync(targetPage).ConfigureAwait(false); + await _grid.GoToPageAsync(targetPage); rowIndex %= pageSize; } - - await _grid.SelectRowAsync(rowIndex).ConfigureAwait(false); - await _grid.ScrollIntoViewAsync(rowIndex: rowIndex).ConfigureAwait(false); - await _grid.FocusAsync().ConfigureAwait(false); - - SelectedRow = WzRowsMeyle[rowIndex]; + + await _grid.SelectRowAsync(rowIndex); + await _grid.ScrollIntoViewAsync(rowIndex: rowIndex); + await _grid.FocusAsync(); + + ChangedRecords.Clear(); } else if (ValidateScannedValue(obj.Value) && SelectedRow != null) { SelectedRow.PartNumber = obj.Value.Trim(); - await InvokeAsync(StateHasChanged).ConfigureAwait(false); - await _grid.Refresh().ConfigureAwait(false); + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + await SaveChanges(); + await InvokeAsync(StateHasChanged); + await _grid.Refresh(); + + ChangedRecords.Clear(); } else { + _notValidatedNumber = true; + VisibilityValidation = true; + ScannedValue = obj.Value.Trim(); SelectedRow = null; } - // if (ScannedValuesWithItems.All(x => x.Key.ItemNumber != ScannedValue.Replace(" ", "").Trim()) && ScannedValuesWithItems.Any(x => x.Key.ItemNumber == LastScannedValue.Replace(" ", "").Trim())) - // { - // RowMeyleModel key = ScannedValuesWithItems.First(x => x.Key.ItemNumber == LastScannedValue).Key; - // ScannedValuesWithItems[key] = ScannedValue.Trim(); - // ScannedValues += $"{ScannedValue}\n"; - // } - // else if (!string.IsNullOrWhiteSpace(ScannedValue)) - // { - // ScannedValues += $"{ScannedValue}: "; - // } - LastScannedValue = ScannedValue; ScannedValue = string.Empty; + + await _scanner.FocusAsync(); } private bool ValidateScannedValue(string scannedValue) @@ -290,12 +304,17 @@ return materialTransaction; } + private async Task>> GetTransactionModels() + { + return await WarehouseService.GetTransactionsModels(); + } + private async Task UpdateRows(IList changedRecords) { await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); - StateHasChanged(); + await InvokeAsync(StateHasChanged); await _grid.Refresh(); } } \ No newline at end of file diff --git a/OrdersManagement/Models/TransactionModel.cs b/OrdersManagement/Models/TransactionModel.cs new file mode 100644 index 0000000..5348642 --- /dev/null +++ b/OrdersManagement/Models/TransactionModel.cs @@ -0,0 +1,29 @@ +namespace OrdersManagement.Models; + +public class TransactionModel : IEquatable +{ + public string? PartNumber { get; set; } + public string? ItemNumber { get; set; } + public decimal? Quantity { get; set; } + + + public bool Equals(TransactionModel? other) + { + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; + return PartNumber == other.PartNumber; + } + + public override bool Equals(object? obj) + { + if (obj is null) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != GetType()) return false; + return Equals((TransactionModel)obj); + } + + public override int GetHashCode() + { + return PartNumber.GetHashCode(); + } +} \ No newline at end of file diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index f9321ae..c05c99f 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -1,5 +1,6 @@ using System.Net; using System.Web; +using OrdersManagement.Models; using SytelineSaAppEfDataModel.Dtos; namespace OrdersManagement.Services; @@ -100,7 +101,18 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync>(); } - + + public async Task>> GetTransactionsModels() + { + var response = await _httpClient.GetAsync($"api/WzRowMeyle/transactions-with-part-number"); + response.EnsureSuccessStatusCode(); + IEnumerable materialTransactions = + await response.Content.ReadFromJsonAsync>(); + + return materialTransactions.GroupBy(x => x.NR_KARTY_KONTROLNEJ).ToDictionary(x => x.Key ?? "", + y => y.Select(z => new TransactionModel() { ItemNumber = z.Item, PartNumber = z.NR_KARTY_KONTROLNEJ, Quantity = z.Qty }).ToList()); + } + public async Task UpdateWzRowsMeyleAsync(IEnumerable wzRowsMeyle) { if (wzRowsMeyle == null || !wzRowsMeyle.Any()) diff --git a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs index ccae08a..b7709ce 100644 --- a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs @@ -11,4 +11,5 @@ public interface IMaterialTransactionService Task> GetOrderNumbersByWz(ISet wzNumbers); Task> GetByCustomerNumber(string customerNumber, int customerSequence); Task GetByPartNumber(string partNumber); + Task> GetWithPartNumber(); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs index 46e5ffb..2ff8933 100644 --- a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs @@ -90,4 +90,11 @@ public class MaterialTransactionService(SytelineSaAppDbContext context, IMapper .Where(x => x.NR_KARTY_KONTROLNEJ == partNumber) .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); } + + public async Task> GetWithPartNumber() + { + return await context.MaterialTransactions + .Where(x => x.NR_KARTY_KONTROLNEJ != null) + .Select(x => mapper.Map(x)).ToListAsync(); + } } \ No newline at end of file From 52439e73cb194a5cb514a10e6d63104b8017024d Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 17 Jun 2025 22:17:03 +0200 Subject: [PATCH 021/149] * Bugfixes --- .../Components/Pages/WarehousePackList.razor | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 8237e42..d82e082 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -100,10 +100,6 @@

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

} - else if (!_notValidatedNumber) - { -

Błąd: Proszę zeskanować poprawny Numer Partii SL (istniejący w tabeli) lub poprawny numer Partii Meyle zaczynający się od @($"{DateTime.Now.Year - 2001}X")!

- } @@ -141,7 +137,6 @@ private WzRowMeyleDto? SelectedRow { get; set; } private bool _isValid; - private bool _notValidatedNumber; private bool Visibility { get; set; } private bool VisibilityValidation { get; set; } @@ -217,8 +212,6 @@ private async Task ScanValue(ChangedEventArgs obj) { - _notValidatedNumber = false; - if (string.IsNullOrWhiteSpace(obj.Value)) return; TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); @@ -228,7 +221,18 @@ if (materialTransactionByPartNumber != null) { var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); - rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA23956.18" && x.Quantity == 130); + //rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA23956.18" && x.Quantity == 130); + + if (rowIndex == -1) + { + VisibilityValidation = true; + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + await _scanner.FocusAsync(); + + return; + } SelectedRow = WzRowsMeyle[rowIndex]; @@ -275,7 +279,6 @@ } else { - _notValidatedNumber = true; VisibilityValidation = true; ScannedValue = obj.Value.Trim(); From 2bf87c0091faf49842dc2818266474bc2b7617f3 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sat, 21 Jun 2025 09:00:49 +0200 Subject: [PATCH 022/149] * Added line splitter --- .../Components/Pages/WarehousePackList.razor | 96 ++++++++++++++++--- 1 file changed, 81 insertions(+), 15 deletions(-) diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index d82e082..fefa77e 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -44,6 +44,8 @@ + @@ -80,7 +82,7 @@ - +
@@ -106,11 +108,16 @@ - + -

Błąd: Proszę zeskanować poprawny Numer Partii SL (istniejący w tabeli) lub poprawny numer Partii Meyle zaczynający się od @($"{DateTime.Now.Year - 2000}X")!

+

Błąd skanowania! Wystąpił jeden z wyjątków:

+
    +
  • Zeskanowano niepoprawny Numer Partii SL (nieistniejący w tabeli)

  • +
  • Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od @($"{DateTime.Now.Year - 2000}X"))

  • +
  • Numer Palety nie jest większy niż 0

  • +
@@ -118,6 +125,20 @@
+ + + + + + + + + + + + + FA Krosno Manager © @(DateTime.Now.Year) @@ -140,17 +161,23 @@ private bool Visibility { get; set; } private bool VisibilityValidation { get; set; } - + private bool VisibilityLineSplitter { get; set; } + private string? EmailAddresses { get; set; } = string.Empty; private string PalletNumber { get; set; } = "0"; private string LastScannedValue { get; set; } = string.Empty; private string ScannedValue { get; set; } = string.Empty; + private string NewQuantity { get; set; } = "0"; + + private bool IsDisabled => SelectedRow == null; + private void HideModal() { Visibility = false; VisibilityValidation = false; + VisibilityLineSplitter = false; } protected override async Task OnAfterRenderAsync(bool firstRender) @@ -214,6 +241,8 @@ { if (string.IsNullOrWhiteSpace(obj.Value)) return; + int palletNumber = int.Parse(PalletNumber); + TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); @@ -223,20 +252,21 @@ var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); //rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA23956.18" && x.Quantity == 130); - if (rowIndex == -1) + if (rowIndex == -1 || palletNumber <= 0) { VisibilityValidation = true; LastScannedValue = ScannedValue; ScannedValue = string.Empty; - + await _scanner.FocusAsync(); - + return; } - + SelectedRow = WzRowsMeyle[rowIndex]; SelectedRow.PartNumberSl = ScannedValue; + SelectedRow.PalletNumber = palletNumber; if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) { @@ -300,13 +330,6 @@ return scannedValue.StartsWith(format); } - private async Task GetMaterialTransactionByPartNumber(string partNumber) - { - MaterialTransactionDto? materialTransaction = await WarehouseService.GetMaterialTransactionByPartNumberAsync(partNumber).ConfigureAwait(false); - - return materialTransaction; - } - private async Task>> GetTransactionModels() { return await WarehouseService.GetTransactionsModels(); @@ -320,4 +343,47 @@ await InvokeAsync(StateHasChanged); await _grid.Refresh(); } + + private async Task SplitLine(MouseEventArgs arg) + { + int newQuantity = int.Parse(NewQuantity); + + if (newQuantity > 0 && SelectedRow != null) + { + WzRowMeyleDto splitRow = new WzRowMeyleDto + { + ID = Guid.NewGuid(), + FK_Header = SelectedRow.FK_Header, + Quantity = newQuantity, + FaIndex = SelectedRow.FaIndex, + ItemNumber = SelectedRow.ItemNumber, + OrderNumber = SelectedRow.OrderNumber, + PalletNumber = SelectedRow.PalletNumber, + WzNumber = SelectedRow.WzNumber, + TransactionNumber = SelectedRow.TransactionNumber + }; + + WzRowsMeyle.Add(splitRow); + SelectedRow.Quantity -= newQuantity; + + ChangedRecords.Add(SelectedRow); + + await WarehouseService.CreateWzRowsMeyleAsync(new List { splitRow }); + await UpdateRows(ChangedRecords); + } + + VisibilityLineSplitter = false; + } + + private void ShowSplitDialog(ClickEventArgs obj) + { + VisibilityLineSplitter = true; + NewQuantity = "0"; + } + + private void OnRowSelected(RowSelectEventArgs obj) + { + SelectedRow = obj.Data; + } + } \ No newline at end of file From d3e6c815ac0fcc8172078c4b8c9ef92db8233604 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sun, 29 Jun 2025 09:50:13 +0200 Subject: [PATCH 023/149] * Further improvements of scanning data --- .../Pages/Shared/ScheduleOrdersGrid.razor | 2 +- .../Components/Pages/WarehousePackList.razor | 222 ++++++++++++------ 2 files changed, 149 insertions(+), 75 deletions(-) diff --git a/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor b/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor index d1a4194..62e5425 100644 --- a/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor +++ b/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor @@ -210,7 +210,7 @@ private void OnRowDataBound(RowDataBoundEventArgs args) { - if (args.Data.QtyType == "83" || args.Data.QtyType == "84") + if (new[] { "54", "83", "84" }.Any(x => x == args.Data.QtyType)) { args.Row.AddClass(["highlight-red"]); } diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index fefa77e..1bbf3a8 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -1,4 +1,5 @@ @page "/Warehouse/PackList/{WzHeader:guid}" +@using System.Diagnostics @using OrdersManagement.Models @using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Grids @@ -6,6 +7,7 @@ @using Syncfusion.Blazor.Navigations @using Syncfusion.Blazor.Popups @using Syncfusion.Blazor.Inputs +@using Action = System.Action @inject WarehouseService WarehouseService @@ -22,6 +24,12 @@ CssClass="e-outline"/> + + + + + + @@ -64,8 +72,6 @@ HeaderText="Ilość w Dostawie" Width="80"> - -

Błąd skanowania! Wystąpił jeden z wyjątków:

+

Błąd skanowania! Wystąpił jeden z wyjątków (Zeskanowana wartość '@ScannedValue'):

  • Zeskanowano niepoprawny Numer Partii SL (nieistniejący w tabeli)

  • Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od @($"{DateTime.Now.Year - 2000}X"))

  • -
  • Numer Palety nie jest większy niż 0

  • +
  • Numer Palety nie jest większy niż 0 (aktualnie wybrany numer palety: '@PalletNumber')

@@ -156,7 +162,10 @@ private SfTextBox _scanner; private WzRowMeyleDto? SelectedRow { get; set; } + private List SelectedRows { get; set; } = new(); + private string WzNumber { get; set; } = string.Empty; + private bool _isValid; private bool Visibility { get; set; } @@ -178,6 +187,11 @@ Visibility = false; VisibilityValidation = false; VisibilityLineSplitter = false; + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); } protected override async Task OnAfterRenderAsync(bool firstRender) @@ -191,6 +205,8 @@ EmailAddresses = _wzHeader.EmailAddresses; + WzNumber = _wzHeader.WzNumbers ?? string.Empty; + await _scanner.FocusAsync(); StateHasChanged(); } @@ -237,91 +253,51 @@ Visibility = true; } - private async Task ScanValue(ChangedEventArgs obj) + private void ScanValue(ChangedEventArgs obj) { if (string.IsNullOrWhiteSpace(obj.Value)) return; + if (int.Parse(PalletNumber) <= 0) + { + ShowValidationMessage(); + return; + } - int palletNumber = int.Parse(PalletNumber); + ScannedValue = obj.Value.Trim(); + + StateHasChanged(); TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); - TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); + if (materialTransactionByPartNumber == null && IsValidScannedValue(obj.Value)) + { + FillMeylePartNumber(ScannedValue); + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + return; + } + if (materialTransactionByPartNumber != null) { - var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); - //rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA23956.18" && x.Quantity == 130); - - if (rowIndex == -1 || palletNumber <= 0) - { - VisibilityValidation = true; - LastScannedValue = ScannedValue; - ScannedValue = string.Empty; - - await _scanner.FocusAsync(); - - return; - } - - SelectedRow = WzRowsMeyle[rowIndex]; - - SelectedRow.PartNumberSl = ScannedValue; - SelectedRow.PalletNumber = palletNumber; - - if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) - { - ChangedRecords.Add(SelectedRow); - } - - await SaveChanges(); - await InvokeAsync(StateHasChanged); - await _grid.Refresh(); - - if (_grid.AllowPaging) - { - int pageSize = _grid.PageSettings.PageSize; - int targetPage = (rowIndex / pageSize) + 1; - await _grid.GoToPageAsync(targetPage); - - rowIndex %= pageSize; - } - - await _grid.SelectRowAsync(rowIndex); - await _grid.ScrollIntoViewAsync(rowIndex: rowIndex); - await _grid.FocusAsync(); - - ChangedRecords.Clear(); + SelectedRows.Clear(); + FillFaPartNumberAndPalletNumber(materialTransactionByPartNumber, obj.Value.Trim()); } - else if (ValidateScannedValue(obj.Value) && SelectedRow != null) + + if (materialTransactionByPartNumber == null) { - SelectedRow.PartNumber = obj.Value.Trim(); - - if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) - { - ChangedRecords.Add(SelectedRow); - } - - await SaveChanges(); - await InvokeAsync(StateHasChanged); - await _grid.Refresh(); - - ChangedRecords.Clear(); + ShowValidationMessage(); + return; } - else - { - VisibilityValidation = true; - - ScannedValue = obj.Value.Trim(); - SelectedRow = null; - } - + LastScannedValue = ScannedValue; ScannedValue = string.Empty; - - await _scanner.FocusAsync(); + + _scanner.FocusAsync(); } - private bool ValidateScannedValue(string scannedValue) + private bool IsValidScannedValue(string scannedValue) { int year = DateTime.Now.Year - 2000; @@ -330,6 +306,104 @@ return scannedValue.StartsWith(format); } + private void FillMeylePartNumber(string scannedValue) + { + if (SelectedRow != null) + { + SelectedRow.PartNumber = scannedValue; + ChangedRecords.Add(SelectedRow); + } + + foreach (WzRowMeyleDto wzRowMeyleDto in SelectedRows) + { + wzRowMeyleDto.PartNumber = scannedValue; + ChangedRecords.Add(wzRowMeyleDto); + } + + SaveChanges(); + InvokeAsync(StateHasChanged); + _grid.Refresh(); + _scanner.FocusAsync(); + ChangedRecords.Clear(); + } + + private void FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) + { + var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + + switch (rowIndex) + { + case -1 when int.Parse(PalletNumber) <= 0: + ShowValidationMessage(); + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + return; + case -1: + { + SelectedRows = WzRowsMeyle.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList(); + + if (SelectedRows.Count == 0) + { + ShowValidationMessage(); + return; + } + + foreach (WzRowMeyleDto wzRowMeyleDto in SelectedRows) + { + wzRowMeyleDto.PartNumberSl = scannedValue; + ChangedRecords.Add(wzRowMeyleDto); + } + + break; + } + default: + { + SelectedRow = WzRowsMeyle[rowIndex]; + + SelectedRow.PartNumberSl = ScannedValue; + SelectedRow.PalletNumber = int.Parse(PalletNumber); + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + FocusGridRow(rowIndex); + break; + } + } + + SaveChanges(); + InvokeAsync(StateHasChanged); + _grid.Refresh(); + _scanner.FocusAsync(); + ChangedRecords.Clear(); + } + + private void FocusGridRow(int rowIndex) + { + if (_grid.AllowPaging) + { + int pageSize = _grid.PageSettings.PageSize; + int targetPage = (rowIndex / pageSize) + 1; + _grid.GoToPageAsync(targetPage); + + rowIndex %= pageSize; + } + + _grid.SelectRowAsync(rowIndex); + _grid.ScrollIntoViewAsync(rowIndex: rowIndex); + _grid.FocusAsync(); + } + + private void ShowValidationMessage() + { + VisibilityValidation = true; + + ChangedRecords.Clear(); + _scanner.FocusAsync(); + } + private async Task>> GetTransactionModels() { return await WarehouseService.GetTransactionsModels(); @@ -360,7 +434,7 @@ OrderNumber = SelectedRow.OrderNumber, PalletNumber = SelectedRow.PalletNumber, WzNumber = SelectedRow.WzNumber, - TransactionNumber = SelectedRow.TransactionNumber + TransactionNumber = SelectedRow.TransactionNumber += 10000 }; WzRowsMeyle.Add(splitRow); From 82cb7a3dbe1873e82137b2a79b8d654e50a3d4d0 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sun, 29 Jun 2025 10:16:24 +0200 Subject: [PATCH 024/149] * Little bugfix --- .../Components/Pages/WarehousePackList.razor | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 1bbf3a8..52ed7d8 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -307,9 +307,12 @@ } private void FillMeylePartNumber(string scannedValue) - { + { if (SelectedRow != null) { + var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == SelectedRow?.ItemNumber && x.Quantity == SelectedRow?.Quantity); + FocusGridRow(rowIndex); + SelectedRow.PartNumber = scannedValue; ChangedRecords.Add(SelectedRow); } @@ -358,6 +361,8 @@ } default: { + FocusGridRow(rowIndex); + SelectedRow = WzRowsMeyle[rowIndex]; SelectedRow.PartNumberSl = ScannedValue; @@ -367,8 +372,7 @@ { ChangedRecords.Add(SelectedRow); } - - FocusGridRow(rowIndex); + break; } } From 4cfb422ad4bf8e2d2a562a3ec7220450140ea218 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 3 Jul 2025 07:21:26 +0200 Subject: [PATCH 025/149] * Fixed Focus issues in Grid --- .../Components/Layout/MainLayout.razor.css | 9 + .../Components/Pages/WarehousePackList.razor | 186 ++++++++++++------ 2 files changed, 140 insertions(+), 55 deletions(-) diff --git a/OrdersManagement/Components/Layout/MainLayout.razor.css b/OrdersManagement/Components/Layout/MainLayout.razor.css index 038baf1..a72fb73 100644 --- a/OrdersManagement/Components/Layout/MainLayout.razor.css +++ b/OrdersManagement/Components/Layout/MainLayout.razor.css @@ -94,3 +94,12 @@ main { right: 0.75rem; top: 0.5rem; } + +.e-grid .e-row.e-selection { + background-color: #D3D3D3 !important; /* Jasny szary */ +} + +/* Domyślny styl dla wierszy (na wszelki wypadek) */ +.e-grid .e-row { + background-color: #FFFFFF; /* Biały, domyślny kolor */ +} diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 52ed7d8..f23dcfb 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -37,7 +37,7 @@ CssClass="e-outline"/> + CssClass="e-outline" @ref="_scanner"/>
+ PrefixIcon="e-icons e-split-horizontal" OnClick="ShowSplitDialog" + Disabled="IsDisabled"/>
@@ -72,7 +73,8 @@ HeaderText="Ilość w Dostawie" Width="80"> - @@ -114,15 +116,17 @@ - +

Błąd skanowania! Wystąpił jeden z wyjątków (Zeskanowana wartość '@ScannedValue'):

  • Zeskanowano niepoprawny Numer Partii SL (nieistniejący w tabeli)

  • -
  • Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od @($"{DateTime.Now.Year - 2000}X"))

  • -
  • Numer Palety nie jest większy niż 0 (aktualnie wybrany numer palety: '@PalletNumber')

  • +
  • Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od + @($"{DateTime.Now.Year - 2000}X"))

  • +
  • Numer Palety nie jest większy niż 0 (aktualnie wybrany numer palety: + '@PalletNumber')

@@ -131,10 +135,24 @@
- + - +

Błąd skanowania! Wybierz NUMER PALETY większy niż 0 (Aktualnie '@PalletNumber'):

+
+
+ + + +
+ + + + + @@ -165,13 +183,14 @@ private List SelectedRows { get; set; } = new(); private string WzNumber { get; set; } = string.Empty; - + private bool _isValid; private bool Visibility { get; set; } private bool VisibilityValidation { get; set; } private bool VisibilityLineSplitter { get; set; } - + public bool VisibilityPalletNumber { get; set; } + private string? EmailAddresses { get; set; } = string.Empty; private string PalletNumber { get; set; } = "0"; @@ -187,6 +206,7 @@ Visibility = false; VisibilityValidation = false; VisibilityLineSplitter = false; + VisibilityPalletNumber = false; LastScannedValue = ScannedValue; ScannedValue = string.Empty; @@ -200,9 +220,9 @@ { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); - + TransactionModelsByPartNumber = await GetTransactionModels(); - + EmailAddresses = _wzHeader.EmailAddresses; WzNumber = _wzHeader.WzNumbers ?? string.Empty; @@ -213,7 +233,7 @@ } private async Task SaveChanges() - { + { if (!string.IsNullOrWhiteSpace(EmailAddresses)) { await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); @@ -258,21 +278,21 @@ if (string.IsNullOrWhiteSpace(obj.Value)) return; if (int.Parse(PalletNumber) <= 0) { - ShowValidationMessage(); + VisibilityPalletNumber = true; return; } ScannedValue = obj.Value.Trim(); - + StateHasChanged(); - + TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); if (materialTransactionByPartNumber == null && IsValidScannedValue(obj.Value)) { FillMeylePartNumber(ScannedValue); - + LastScannedValue = ScannedValue; ScannedValue = string.Empty; @@ -290,7 +310,7 @@ ShowValidationMessage(); return; } - + LastScannedValue = ScannedValue; ScannedValue = string.Empty; @@ -306,13 +326,12 @@ return scannedValue.StartsWith(format); } - private void FillMeylePartNumber(string scannedValue) - { - if (SelectedRow != null) + private async Task FillMeylePartNumber(string scannedValue) + { + var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == SelectedRow?.FaIndex && x.Quantity == SelectedRow?.Quantity); + + if (SelectedRow != null && !SelectedRows.Any()) { - var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == SelectedRow?.ItemNumber && x.Quantity == SelectedRow?.Quantity); - FocusGridRow(rowIndex); - SelectedRow.PartNumber = scannedValue; ChangedRecords.Add(SelectedRow); } @@ -323,65 +342,92 @@ ChangedRecords.Add(wzRowMeyleDto); } - SaveChanges(); - InvokeAsync(StateHasChanged); - _grid.Refresh(); - _scanner.FocusAsync(); + await SaveChanges(); + ChangedRecords.Clear(); + SelectedRows.Clear(); + + FocusGridRow(rowIndex); + await _scanner.FocusAsync(); } - private void FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) + private async Task FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) { - var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + await _grid.ClearSelectionAsync(); + await _grid.Refresh(); + await InvokeAsync(StateHasChanged); + + List selectedIndices = new List(); + int palletNumber = int.Parse(PalletNumber); + int rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); switch (rowIndex) { - case -1 when int.Parse(PalletNumber) <= 0: - ShowValidationMessage(); - LastScannedValue = ScannedValue; - ScannedValue = string.Empty; - return; case -1: { SelectedRows = WzRowsMeyle.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList(); - + if (SelectedRows.Count == 0) { ShowValidationMessage(); return; } - foreach (WzRowMeyleDto wzRowMeyleDto in SelectedRows) + rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == SelectedRows.First().FaIndex && x.Quantity == SelectedRows.First().Quantity); + + var validCombinations = FindCombinations(SelectedRows, (int?)materialTransactionByPartNumber.Quantity ?? 0); + + foreach (var combination in validCombinations) { - wzRowMeyleDto.PartNumberSl = scannedValue; - ChangedRecords.Add(wzRowMeyleDto); + foreach (var record in combination) + { + record.PartNumberSl = scannedValue; + ChangedRecords.Add(record); + + int index = WzRowsMeyle.IndexOf(record); + if (index >= 0) + { + selectedIndices.Add(index); + Console.WriteLine($"Dodano indeks: {index}"); // Debugowanie + } + } } + SelectedRows.Clear(); + SelectedRows.AddRange(ChangedRecords); + break; } default: { - FocusGridRow(rowIndex); - SelectedRow = WzRowsMeyle[rowIndex]; + selectedIndices.Add(rowIndex); - SelectedRow.PartNumberSl = ScannedValue; - SelectedRow.PalletNumber = int.Parse(PalletNumber); + SelectedRow.PartNumberSl = scannedValue; + SelectedRow.PalletNumber = palletNumber; if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) { ChangedRecords.Add(SelectedRow); } - + break; } } - SaveChanges(); - InvokeAsync(StateHasChanged); - _grid.Refresh(); - _scanner.FocusAsync(); + await SaveChanges(); ChangedRecords.Clear(); + + if (selectedIndices.Any()) + { + await _grid.SelectRowsAsync(selectedIndices.ToArray()); + } + + await _grid.Refresh(); + await InvokeAsync(StateHasChanged); + + FocusGridRow(rowIndex); + await _scanner.FocusAsync(); } private void FocusGridRow(int rowIndex) @@ -391,10 +437,10 @@ int pageSize = _grid.PageSettings.PageSize; int targetPage = (rowIndex / pageSize) + 1; _grid.GoToPageAsync(targetPage); - + rowIndex %= pageSize; } - + _grid.SelectRowAsync(rowIndex); _grid.ScrollIntoViewAsync(rowIndex: rowIndex); _grid.FocusAsync(); @@ -438,18 +484,20 @@ OrderNumber = SelectedRow.OrderNumber, PalletNumber = SelectedRow.PalletNumber, WzNumber = SelectedRow.WzNumber, - TransactionNumber = SelectedRow.TransactionNumber += 10000 + TransactionNumber = SelectedRow.TransactionNumber += 10000, + PartNumberSl = SelectedRow.PartNumberSl, + PartNumber = SelectedRow.PartNumber }; - + WzRowsMeyle.Add(splitRow); SelectedRow.Quantity -= newQuantity; - + ChangedRecords.Add(SelectedRow); await WarehouseService.CreateWzRowsMeyleAsync(new List { splitRow }); await UpdateRows(ChangedRecords); - } - + } + VisibilityLineSplitter = false; } @@ -464,4 +512,32 @@ SelectedRow = obj.Data; } + private List> FindCombinations(List records, int targetSum) + { + var result = new List>(); + var currentCombination = new List(); + + void Backtrack(int start, int currentSum) + { + if (currentSum == targetSum) + { + result.Add(new List(currentCombination)); + return; + } + + for (int i = start; i < records.Count; i++) + { + if (currentSum + records[i].Quantity <= targetSum) + { + currentCombination.Add(records[i]); + Backtrack(i + 1, currentSum + records[i].Quantity ?? 0); + currentCombination.RemoveAt(currentCombination.Count - 1); + } + } + } + + Backtrack(0, 0); + return result; + } + } \ No newline at end of file From 4392cce6c90515fe2858b64ff033b20d967cd7cd Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 4 Aug 2025 05:52:04 +0200 Subject: [PATCH 026/149] * Added filling pallet number when there is a batch found * Changed headers in ScheduleOrdersGrid --- .../Components/Pages/Shared/ScheduleOrdersGrid.razor | 4 ++-- OrdersManagement/Components/Pages/WarehousePackList.razor | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor b/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor index 62e5425..84adc12 100644 --- a/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor +++ b/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor @@ -76,9 +76,9 @@ HeaderText="Kod odbiorcy" Width="100" AllowFiltering="true"> - + diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index f23dcfb..9f6d14c 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -382,6 +382,7 @@ foreach (var record in combination) { record.PartNumberSl = scannedValue; + record.PalletNumber = palletNumber; ChangedRecords.Add(record); int index = WzRowsMeyle.IndexOf(record); From 96a6d7772e8f5d65b221dc30d08b7d99b33fe52e Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 4 Aug 2025 06:10:05 +0200 Subject: [PATCH 027/149] * Added resizing on the Grid columns --- .../Pages/Shared/ScheduleOrdersGrid.razor | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor b/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor index 84adc12..b94eebb 100644 --- a/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor +++ b/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor @@ -39,17 +39,17 @@
- - - - - + @@ -67,18 +67,18 @@ AdaptiveUIMode="AdaptiveMode.Both"> + HeaderText="Numer Zamówienia" MinWidth="100" AllowResizing="true"> + MinWidth="100" AllowResizing="true"> + HeaderText="Odbiorca" MinWidth="100" AllowResizing="true"> + HeaderText="Kod odbiorcy" MinWidth="100" + AllowFiltering="true" AllowResizing="true"> + HeaderText="Pozycja Klienta" MinWidth="100" AllowResizing="true"> + HeaderText="Pozycja" MinWidth="100" AllowResizing="true"> @@ -94,17 +94,17 @@ AdaptiveUIMode="AdaptiveMode.Both"> + HeaderText="Data Od" MinWidth="100" AllowResizing="true"> + HeaderText="Data Do" MinWidth="100" AllowResizing="true"> + MinWidth="50" AllowResizing="true"> + MinWidth="50" AllowResizing="true"> + HeaderText="Opis Typu" MinWidth="100" AllowResizing="true"> From e69b10398fee65c5e4d45f5758c9d29e663c03d2 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 4 Aug 2025 07:09:20 +0200 Subject: [PATCH 028/149] * Resize columns --- .../Pages/Shared/ScheduleOrdersGrid.razor | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor b/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor index b94eebb..e81c88f 100644 --- a/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor +++ b/OrdersManagement/Components/Pages/Shared/ScheduleOrdersGrid.razor @@ -39,17 +39,17 @@ - - - - - - + @@ -67,18 +67,18 @@ AdaptiveUIMode="AdaptiveMode.Both"> + HeaderText="Numer Zamówienia" Width="100" AllowResizing="true"> + Width="100" AllowResizing="true"> + HeaderText="Odbiorca" Width="100" AllowResizing="true"> + HeaderText="Pozycja Klienta" Width="100" AllowResizing="true"> + HeaderText="Pozycja" Width="100" AllowResizing="true"> @@ -94,17 +94,17 @@ AdaptiveUIMode="AdaptiveMode.Both"> + HeaderText="Data Od" Width="100" AllowResizing="true"> + HeaderText="Data Do" Width="100" AllowResizing="true"> + Width="50" AllowResizing="true"> + Width="50" AllowResizing="true"> + HeaderText="Opis Typu" Width="100" AllowResizing="true"> From 1842fd6146cb77d95f4d57917a4f87c4b371757c Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 4 Aug 2025 20:13:54 +0200 Subject: [PATCH 029/149] * Added validation to not generate more than one PackingList to the same WZ * Added filtering when found more than one item after scanning --- .../Components/Pages/Warehouse.razor | 23 ++++++++++++++++++- .../Components/Pages/WarehousePackList.razor | 20 +++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index 9ed444e..eac9d5e 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -94,6 +94,17 @@ + + + + +

Błąd: Dla zaznaczonego rekordu istnieje już PackingList!

+
+
+ + + +
FA Krosno Manager © @(DateTime.Now.Year) @@ -115,6 +126,7 @@ private bool _isVisible; private bool Visibility { get; set; } + private bool VisibilityError { get; set; } protected override async Task OnAfterRenderAsync(bool firstRender) { @@ -178,12 +190,20 @@ return; } + string wzNumbers = string.Join(", ",selectedRecords.Select(x => x.MTGroupNum).Distinct()); + + if (_wzHeaders.Any(x => x.WzNumbers == wzNumbers)) + { + VisibilityError = 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()) + WzNumbers = wzNumbers }; await WarehouseService.CreateWzHeaderAsync(wzHeader); @@ -223,5 +243,6 @@ private void HideModal() { Visibility = false; + VisibilityError = false; } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 9f6d14c..8e11b74 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -1,13 +1,16 @@ @page "/Warehouse/PackList/{WzHeader:guid}" @using System.Diagnostics @using OrdersManagement.Models +@using Syncfusion.Blazor @using Syncfusion.Blazor.Cards +@using Syncfusion.Blazor.Data @using Syncfusion.Blazor.Grids @using SytelineSaAppEfDataModel.Dtos @using Syncfusion.Blazor.Navigations @using Syncfusion.Blazor.Popups @using Syncfusion.Blazor.Inputs @using Action = System.Action +@using FilterType = Syncfusion.Blazor.Grids.FilterType @inject WarehouseService WarehouseService @@ -65,7 +68,7 @@ - @@ -299,6 +302,9 @@ return; } + _grid.Query = null; + _grid.ClearFilteringAsync(); + if (materialTransactionByPartNumber != null) { SelectedRows.Clear(); @@ -386,10 +392,10 @@ ChangedRecords.Add(record); int index = WzRowsMeyle.IndexOf(record); + if (index >= 0) { selectedIndices.Add(index); - Console.WriteLine($"Dodano indeks: {index}"); // Debugowanie } } } @@ -397,6 +403,10 @@ SelectedRows.Clear(); SelectedRows.AddRange(ChangedRecords); + SelectedRow = SelectedRows.FirstOrDefault(); + + await ApplyFilter(ChangedRecords); + break; } default: @@ -540,5 +550,9 @@ Backtrack(0, 0); return result; } - + + private async Task ApplyFilter(IList selectedRecords) + { + await _grid.FilterByColumnAsync(nameof(WzRowMeyleDto.FaIndex), "equal", selectedRecords.First().FaIndex); + } } \ No newline at end of file From 6139ce97d70ca29e178ae087f74589d5e2117673 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 7 Aug 2025 06:46:43 +0200 Subject: [PATCH 030/149] * Added new Entities and Dtos * Mapping new classes * Added new services and Controllers in API --- FaKrosnoApi/Controllers/CustomerController.cs | 17 + .../Controllers/CustomerTpController.cs | 17 + .../EdiCustomerOrderImportController.cs | 16 + FaKrosnoApi/Program.cs | 5 +- SytelineSaAppEfDataModel/Dtos/CustomerDto.cs | 132 +++++++ .../Dtos/CustomerTpDto.cs | 41 ++ .../Dtos/EdiCustomerOrderImportDto.cs | 12 + SytelineSaAppEfDataModel/Entities/Customer.cs | 132 +++++++ .../Entities/CustomerTp.cs | 41 ++ .../Entities/EdiCustomerOrderImport.cs | 12 + SytelineSaAppEfDataModel/MappingProfile.cs | 3 + .../Services/CustomerService.cs | 13 + .../Services/CustomerTpService.cs | 13 + .../Services/EdiCustomerOrderImportService.cs | 13 + .../Services/ICustomerService.cs | 8 + .../Services/ICustomerTpService.cs | 8 + .../IEdiCustomerOrderImportService.cs | 6 + .../SytelineSaAppDbContext.cs | 372 +++++++++++++++++- 18 files changed, 855 insertions(+), 6 deletions(-) create mode 100644 FaKrosnoApi/Controllers/CustomerController.cs create mode 100644 FaKrosnoApi/Controllers/CustomerTpController.cs create mode 100644 FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/CustomerDto.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/CustomerTpDto.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderImportDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/Customer.cs create mode 100644 SytelineSaAppEfDataModel/Entities/CustomerTp.cs create mode 100644 SytelineSaAppEfDataModel/Entities/EdiCustomerOrderImport.cs create mode 100644 SytelineSaAppEfDataModel/Services/CustomerService.cs create mode 100644 SytelineSaAppEfDataModel/Services/CustomerTpService.cs create mode 100644 SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs create mode 100644 SytelineSaAppEfDataModel/Services/ICustomerService.cs create mode 100644 SytelineSaAppEfDataModel/Services/ICustomerTpService.cs create mode 100644 SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs diff --git a/FaKrosnoApi/Controllers/CustomerController.cs b/FaKrosnoApi/Controllers/CustomerController.cs new file mode 100644 index 0000000..abf4b1a --- /dev/null +++ b/FaKrosnoApi/Controllers/CustomerController.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class CustomerController(ICustomerService service) : Controller +{ + [HttpGet] + public async Task>> GetAllCustomers() + { + IList customers = await service.GetAllCustomers(); + return Ok(customers); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/CustomerTpController.cs b/FaKrosnoApi/Controllers/CustomerTpController.cs new file mode 100644 index 0000000..e0a45dc --- /dev/null +++ b/FaKrosnoApi/Controllers/CustomerTpController.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class CustomerTpController(ICustomerTpService service) : Controller +{ + [HttpGet] + public async Task>> GetAllCustomers() + { + IList customers = await service.GetAllCustomersTp(); + return Ok(customers); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs b/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs new file mode 100644 index 0000000..1f59aee --- /dev/null +++ b/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class EdiCustomerOrderImportController(IEdiCustomerOrderImportService service) : Controller +{ + [HttpGet("last-update-date")] + public async Task> GetLastUpdateDate() + { + DateTime lastUpdateDate = await service.GetLastUpdateDate(); + return Ok(lastUpdateDate); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index 4b879cb..a9c4b67 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -105,6 +105,9 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); @@ -122,6 +125,6 @@ app.UseAuthorization(); app.MapControllers(); -app.UseHangfireDashboard(); +// app.UseHangfireDashboard(); app.Run(); diff --git a/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs b/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs new file mode 100644 index 0000000..2253a94 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs @@ -0,0 +1,132 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class CustomerDto +{ + public string CustNum { get; set; } + public int CustSeq { get; set; } + public string Contact1 { get; set; } + public string Contact2 { get; set; } + public string Contact3 { get; set; } + public string Phone1 { get; set; } + public string Phone2 { get; set; } + public string Phone3 { get; set; } + public string CustType { get; set; } + public string TermsCode { get; set; } + public string ShipCode { get; set; } + public string Slsman { get; set; } + public string StateCycle { get; set; } + public bool FinChg { get; set; } + public DateTime? LastInv { get; set; } + public DateTime? LastPaid { get; set; } + public decimal? SalesYtd { get; set; } + public decimal? SalesLstYr { get; set; } + public decimal? DiscYtd { get; set; } + public decimal? DiscLstYr { get; set; } + public DateTime? LastFinChg { get; set; } + public decimal? SalesPtd { get; set; } + public DateTime? CalcDate { get; set; } + public int? NumPeriods { get; set; } + public int? AvgDaysOs { get; set; } + public int? NumInvoices { get; set; } + public int? HistDaysOs { get; set; } + public int? LargDaysOs { get; set; } + public int? LastDaysOs { get; set; } + public decimal? AvgBalOs { get; set; } + public decimal? LargeBalOs { get; set; } + public decimal? LastBalOs { get; set; } + public string Whse { get; set; } + public string Charfld1 { get; set; } + public string Charfld2 { get; set; } + public string Charfld3 { get; set; } + public decimal? Decifld1 { get; set; } + public decimal? Decifld2 { get; set; } + public decimal? Decifld3 { get; set; } + public bool Logifld { get; set; } + public DateTime? Datefld { get; set; } + public string TaxRegNum1 { get; set; } + public string BankCode { get; set; } + public string TaxRegNum2 { get; set; } + public string PayType { get; set; } + public bool EdiCust { get; set; } + public string BranchId { get; set; } + public string TransNat { get; set; } + public string Delterm { get; set; } + public string ProcessInd { get; set; } + public bool UseExchRate { get; set; } + public string TaxCode1 { get; set; } + public string TaxCode2 { get; set; } + public string Pricecode { get; set; } + public bool ShipEarly { get; set; } + public bool ShipPartial { get; set; } + public string LangCode { get; set; } + public string EndUserType { get; set; } + public string ShipSite { get; set; } + public bool LcrReqd { get; set; } + public string CustBank { get; set; } + public bool DraftPrintFlag { get; set; } + public bool RcvInternalEmail { get; set; } + public string CustomerEmailAddr { get; set; } + public bool SendCustomerEmail { get; set; } + public bool ApsPullUp { get; set; } + public string DoInvoice { get; set; } + public bool Consolidate { get; set; } + public string InvFreq { get; set; } + public bool Summarize { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public bool Einvoice { get; set; } + public decimal? OrderBal { get; set; } + public decimal? PostedBal { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public string CrmGuid { get; set; } + public bool InWorkflow { get; set; } + public bool PrintPackInv { get; set; } + public bool OnePackInv { get; set; } + public string InvCategory { get; set; } + public bool IncludeTaxInPrice { get; set; } + public string TransNat2 { get; set; } + public bool UseRevisionPayDays { get; set; } + public int? RevisionDay { get; set; } + public TimeSpan? RevisionDayStartTime1 { get; set; } + public TimeSpan? RevisionDayStartTime2 { get; set; } + public TimeSpan? RevisionDayEndTime1 { get; set; } + public TimeSpan? RevisionDayEndTime2 { get; set; } + public int? PayDay { get; set; } + public TimeSpan? PayDayStartTime1 { get; set; } + public TimeSpan? PayDayStartTime2 { get; set; } + public TimeSpan? PayDayEndTime1 { get; set; } + public TimeSpan? PayDayEndTime2 { get; set; } + public string ExportType { get; set; } + public bool ActiveForDataIntegration { get; set; } + public bool ShowInShipToDropDownList { get; set; } + public bool ShowInDropDownList { get; set; } + public string SicCode { get; set; } + public int? NumberOfEmployees { get; set; } + public decimal? CompanyRevenue { get; set; } + public string TerritoryCode { get; set; } + public string SalesTeamId { get; set; } + public int? DaysShippedBeforeDueDateTolerance { get; set; } + public int? DaysShippedAfterDueDateTolerance { get; set; } + public decimal? ShippedOverOrderedQtyTolerance { get; set; } + public decimal? ShippedUnderOrderedQtyTolerance { get; set; } + public int DefaultShipTo { get; set; } + public bool IncludeOrdersInTaxRpt { get; set; } + public decimal? ConstructiveSalePricePct { get; set; } + public string Uf_ZPL_FedId { get; set; } + public string Uf_ZPL_VATRegisterCode { get; set; } + public int? Uf_INT_CustSeq { get; set; } + public bool Uf_INT_Replicate { get; set; } + public int? Uf_FKR_FA_SL_SYKOF { get; set; } + public bool? Uf_FKR_FA_Eksport_SYKOF { get; set; } + public string Uf_FKR_FA_Kod_Dostawcy_u_Klienta { get; set; } + public string Uf_FKR_FA_Rampa { get; set; } + public string Uf_FKR_FA_Zaklad_Przeznaczenia { get; set; } + public char? Uf_FKR_Customer_Status { get; set; } + public bool? Uf_bpx_customer_printbatch { get; set; } + public string Uf_cust_receiver_line1 { get; set; } + public string Uf_cust_receiver_line2 { get; set; } + public int? Uf_cust_supplier_no { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/CustomerTpDto.cs b/SytelineSaAppEfDataModel/Dtos/CustomerTpDto.cs new file mode 100644 index 0000000..6f245e1 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/CustomerTpDto.cs @@ -0,0 +1,41 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class CustomerTpDto +{ + public string CustNum { get; set; } + public int CustSeq { get; set; } + public bool UpdCustAddress { get; set; } + public string TpCode { get; set; } + public string DunsNum { get; set; } + public bool GenAck { get; set; } + public bool PaperAck { get; set; } + public bool GenAsn { get; set; } + public bool PaperAsn { get; set; } + public bool GenInv { get; set; } + public bool PaperInv { get; set; } + public string AutoPost { get; set; } + public bool PostPlanned { get; set; } + public string ReleaseProc { get; set; } + public bool PooledAsn { get; set; } + public bool ValPrice { get; set; } + public string UsePrice { get; set; } + public bool ValCredit { get; set; } + public string NoteProc { get; set; } + public string UseDate { get; set; } + public int? DateOffset { get; set; } + public string InvCode { get; set; } + public string AckCode { get; set; } + public string AsnCode { get; set; } + public DateTime? LastItemDate { get; set; } + public DateTime? LastCustaDate { get; set; } + public bool IncludeSerial { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public bool InWorkflow { get; set; } + public string Uf_FKR_EDI_RSSBussFolder { get; set; } + public string Uf_FKR_EDI_IdentificationCode { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderImportDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderImportDto.cs new file mode 100644 index 0000000..f11d1c5 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderImportDto.cs @@ -0,0 +1,12 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class EdiCustomerOrderImportDto +{ + public int Id { get; set; } + public int ScheduleOrderId { get; set; } + public DateTime LastUpdateDate { get; set; } + public DateTime CreatedDate { get; set; } + public string Status { get; set; } + public string LogData { get; set; } + public int ItemsCount { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/Customer.cs b/SytelineSaAppEfDataModel/Entities/Customer.cs new file mode 100644 index 0000000..807e099 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/Customer.cs @@ -0,0 +1,132 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class Customer +{ + public string CustNum { get; set; } + public int CustSeq { get; set; } + public string Contact1 { get; set; } + public string Contact2 { get; set; } + public string Contact3 { get; set; } + public string Phone1 { get; set; } + public string Phone2 { get; set; } + public string Phone3 { get; set; } + public string CustType { get; set; } + public string TermsCode { get; set; } + public string ShipCode { get; set; } + public string Slsman { get; set; } + public string StateCycle { get; set; } + public bool FinChg { get; set; } + public DateTime? LastInv { get; set; } + public DateTime? LastPaid { get; set; } + public decimal? SalesYtd { get; set; } + public decimal? SalesLstYr { get; set; } + public decimal? DiscYtd { get; set; } + public decimal? DiscLstYr { get; set; } + public DateTime? LastFinChg { get; set; } + public decimal? SalesPtd { get; set; } + public DateTime? CalcDate { get; set; } + public int? NumPeriods { get; set; } + public int? AvgDaysOs { get; set; } + public int? NumInvoices { get; set; } + public int? HistDaysOs { get; set; } + public int? LargDaysOs { get; set; } + public int? LastDaysOs { get; set; } + public decimal? AvgBalOs { get; set; } + public decimal? LargeBalOs { get; set; } + public decimal? LastBalOs { get; set; } + public string Whse { get; set; } + public string Charfld1 { get; set; } + public string Charfld2 { get; set; } + public string Charfld3 { get; set; } + public decimal? Decifld1 { get; set; } + public decimal? Decifld2 { get; set; } + public decimal? Decifld3 { get; set; } + public bool Logifld { get; set; } + public DateTime? Datefld { get; set; } + public string TaxRegNum1 { get; set; } + public string BankCode { get; set; } + public string TaxRegNum2 { get; set; } + public string PayType { get; set; } + public bool EdiCust { get; set; } + public string BranchId { get; set; } + public string TransNat { get; set; } + public string Delterm { get; set; } + public string ProcessInd { get; set; } + public bool UseExchRate { get; set; } + public string TaxCode1 { get; set; } + public string TaxCode2 { get; set; } + public string Pricecode { get; set; } + public bool ShipEarly { get; set; } + public bool ShipPartial { get; set; } + public string LangCode { get; set; } + public string EndUserType { get; set; } + public string ShipSite { get; set; } + public bool LcrReqd { get; set; } + public string CustBank { get; set; } + public bool DraftPrintFlag { get; set; } + public bool RcvInternalEmail { get; set; } + public string CustomerEmailAddr { get; set; } + public bool SendCustomerEmail { get; set; } + public bool ApsPullUp { get; set; } + public string DoInvoice { get; set; } + public bool Consolidate { get; set; } + public string InvFreq { get; set; } + public bool Summarize { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public bool Einvoice { get; set; } + public decimal? OrderBal { get; set; } + public decimal? PostedBal { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public string CrmGuid { get; set; } + public bool InWorkflow { get; set; } + public bool PrintPackInv { get; set; } + public bool OnePackInv { get; set; } + public string InvCategory { get; set; } + public bool IncludeTaxInPrice { get; set; } + public string TransNat2 { get; set; } + public bool UseRevisionPayDays { get; set; } + public int? RevisionDay { get; set; } + public TimeSpan? RevisionDayStartTime1 { get; set; } + public TimeSpan? RevisionDayStartTime2 { get; set; } + public TimeSpan? RevisionDayEndTime1 { get; set; } + public TimeSpan? RevisionDayEndTime2 { get; set; } + public int? PayDay { get; set; } + public TimeSpan? PayDayStartTime1 { get; set; } + public TimeSpan? PayDayStartTime2 { get; set; } + public TimeSpan? PayDayEndTime1 { get; set; } + public TimeSpan? PayDayEndTime2 { get; set; } + public string ExportType { get; set; } + public bool ActiveForDataIntegration { get; set; } + public bool ShowInShipToDropDownList { get; set; } + public bool ShowInDropDownList { get; set; } + public string SicCode { get; set; } + public int? NumberOfEmployees { get; set; } + public decimal? CompanyRevenue { get; set; } + public string TerritoryCode { get; set; } + public string SalesTeamId { get; set; } + public int? DaysShippedBeforeDueDateTolerance { get; set; } + public int? DaysShippedAfterDueDateTolerance { get; set; } + public decimal? ShippedOverOrderedQtyTolerance { get; set; } + public decimal? ShippedUnderOrderedQtyTolerance { get; set; } + public int DefaultShipTo { get; set; } + public bool IncludeOrdersInTaxRpt { get; set; } + public decimal? ConstructiveSalePricePct { get; set; } + public string Uf_ZPL_FedId { get; set; } + public string Uf_ZPL_VATRegisterCode { get; set; } + public int? Uf_INT_CustSeq { get; set; } + public bool Uf_INT_Replicate { get; set; } + public int? Uf_FKR_FA_SL_SYKOF { get; set; } + public bool? Uf_FKR_FA_Eksport_SYKOF { get; set; } + public string Uf_FKR_FA_Kod_Dostawcy_u_Klienta { get; set; } + public string Uf_FKR_FA_Rampa { get; set; } + public string Uf_FKR_FA_Zaklad_Przeznaczenia { get; set; } + public char? Uf_FKR_Customer_Status { get; set; } + public bool? Uf_bpx_customer_printbatch { get; set; } + public string Uf_cust_receiver_line1 { get; set; } + public string Uf_cust_receiver_line2 { get; set; } + public int? Uf_cust_supplier_no { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/CustomerTp.cs b/SytelineSaAppEfDataModel/Entities/CustomerTp.cs new file mode 100644 index 0000000..828f609 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/CustomerTp.cs @@ -0,0 +1,41 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class CustomerTp +{ + public string CustNum { get; set; } + public int CustSeq { get; set; } + public bool UpdCustAddress { get; set; } + public string TpCode { get; set; } + public string DunsNum { get; set; } + public bool GenAck { get; set; } + public bool PaperAck { get; set; } + public bool GenAsn { get; set; } + public bool PaperAsn { get; set; } + public bool GenInv { get; set; } + public bool PaperInv { get; set; } + public string AutoPost { get; set; } + public bool PostPlanned { get; set; } + public string ReleaseProc { get; set; } + public bool PooledAsn { get; set; } + public bool ValPrice { get; set; } + public string UsePrice { get; set; } + public bool ValCredit { get; set; } + public string NoteProc { get; set; } + public string UseDate { get; set; } + public int? DateOffset { get; set; } + public string InvCode { get; set; } + public string AckCode { get; set; } + public string AsnCode { get; set; } + public DateTime? LastItemDate { get; set; } + public DateTime? LastCustaDate { get; set; } + public bool IncludeSerial { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public bool InWorkflow { get; set; } + public string Uf_FKR_EDI_RSSBussFolder { get; set; } + public string Uf_FKR_EDI_IdentificationCode { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderImport.cs b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderImport.cs new file mode 100644 index 0000000..ea9e369 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderImport.cs @@ -0,0 +1,12 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class EdiCustomerOrderImport +{ + public int Id { get; set; } + public int ScheduleOrderId { get; set; } + public DateTime LastUpdateDate { get; set; } + public DateTime CreatedDate { get; set; } + public string Status { get; set; } + public string LogData { get; set; } + public int ItemsCount { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 23eabcd..91523ef 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -25,6 +25,9 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/CustomerService.cs b/SytelineSaAppEfDataModel/Services/CustomerService.cs new file mode 100644 index 0000000..a0ef006 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/CustomerService.cs @@ -0,0 +1,13 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public class CustomerService(SytelineSaAppDbContext context, IMapper mapper) : ICustomerService +{ + public async Task> GetAllCustomers() + { + return await context.Customers.Select(x => mapper.Map(x)).ToListAsync(); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/CustomerTpService.cs b/SytelineSaAppEfDataModel/Services/CustomerTpService.cs new file mode 100644 index 0000000..e5acd16 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/CustomerTpService.cs @@ -0,0 +1,13 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public class CustomerTpService(SytelineSaAppDbContext context, IMapper mapper) : ICustomerTpService +{ + public async Task> GetAllCustomersTp() + { + return await context.CustomerTps.Select(x => mapper.Map(x)).ToListAsync(); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs new file mode 100644 index 0000000..edf9e36 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs @@ -0,0 +1,13 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; + +namespace SytelineSaAppEfDataModel.Services; + +public class EdiCustomerOrderImportService(SytelineSaAppDbContext context, IMapper mapper) : IEdiCustomerOrderImportService +{ + public async Task GetLastUpdateDate() + { + return (await context.EdiCustomerOrderImports.OrderByDescending(x => x.LastUpdateDate) + .FirstOrDefaultAsync())?.LastUpdateDate ?? DateTime.Now.Date; + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/ICustomerService.cs b/SytelineSaAppEfDataModel/Services/ICustomerService.cs new file mode 100644 index 0000000..ab1d42d --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/ICustomerService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface ICustomerService +{ + Task> GetAllCustomers(); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/ICustomerTpService.cs b/SytelineSaAppEfDataModel/Services/ICustomerTpService.cs new file mode 100644 index 0000000..061bb59 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/ICustomerTpService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface ICustomerTpService +{ + Task> GetAllCustomersTp(); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs new file mode 100644 index 0000000..12c0cb8 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs @@ -0,0 +1,6 @@ +namespace SytelineSaAppEfDataModel.Services; + +public interface IEdiCustomerOrderImportService +{ + Task GetLastUpdateDate(); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 2921637..c759c5b 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -18,17 +18,16 @@ namespace SytelineSaAppEfDataModel public DbSet CustomerOrderLineItems { get; set; } public DbSet UserNames { get; set; } public DbSet EdiUsers { get; set; } - public DbSet MaterialTransactions { get; set; } - public DbSet WzClients { get; set; } public DbSet WzHeaders { get; set; } - public DbSet WzRowsMeyle { get; set; } - public DbSet ItemCusts { get; set; } - public DbSet Lots { get; set; } + public DbSet EdiCustomerOrderImports { get; set; } + public DbSet Customers { get; set; } + public DbSet CustomerTps { get; set; } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var configuration = new ConfigurationBuilder() @@ -1306,6 +1305,369 @@ namespace SytelineSaAppEfDataModel .HasDatabaseName("IX_lot_RowPointer") .IsUnique(); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("edi_co_import"); + + entity.HasKey(e => e.Id); + + entity.Property(e => e.Id) + .HasColumnName("Id") + .ValueGeneratedOnAdd(); + + entity.Property(e => e.ScheduleOrderId) + .HasColumnName("ScheduleOrderId") + .IsRequired(); + + entity.Property(e => e.LastUpdateDate) + .HasColumnName("LastUpdateDate") + .IsRequired(); + + entity.Property(e => e.CreatedDate) + .HasColumnName("CreatedDate") + .IsRequired(); + + entity.Property(e => e.Status) + .HasColumnName("Status") + .HasMaxLength(50) + .IsRequired(); + + entity.Property(e => e.LogData) + .HasColumnName("LogData") + .HasColumnType("varchar(max)") + .IsRequired(false); + + entity.Property(e => e.ItemsCount) + .HasColumnName("ItemsCount") + .IsRequired(); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("customer"); + + entity.HasKey(e => new { e.CustNum, e.CustSeq }); + + entity.Property(e => e.CustNum).HasColumnName("cust_num").HasMaxLength(14).IsRequired(); + entity.Property(e => e.CustSeq).HasColumnName("cust_seq").HasDefaultValueSql("0"); + entity.Property(e => e.Contact1).HasColumnName("contact##1").HasMaxLength(60).IsRequired(false); + entity.Property(e => e.Contact2).HasColumnName("contact##2").HasMaxLength(60).IsRequired(false); + entity.Property(e => e.Contact3).HasColumnName("contact##3").HasMaxLength(60).IsRequired(false); + entity.Property(e => e.Phone1).HasColumnName("phone##1").HasMaxLength(50).IsRequired(false); + entity.Property(e => e.Phone2).HasColumnName("phone##2").HasMaxLength(50).IsRequired(false); + entity.Property(e => e.Phone3).HasColumnName("phone##3").HasMaxLength(50).IsRequired(false); + entity.Property(e => e.CustType).HasColumnName("cust_type").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.TermsCode).HasColumnName("terms_code").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.ShipCode).HasColumnName("ship_code").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.Slsman).HasColumnName("slsman").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.StateCycle).HasColumnName("state_cycle").HasMaxLength(2).IsRequired(false); + entity.Property(e => e.FinChg).HasColumnName("fin_chg").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.LastInv).HasColumnName("last_inv").IsRequired(false); + entity.Property(e => e.LastPaid).HasColumnName("last_paid").IsRequired(false); + entity.Property(e => e.SalesYtd).HasColumnName("sales_ytd").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.SalesLstYr).HasColumnName("sales_lst_yr").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.DiscYtd).HasColumnName("disc_ytd").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.DiscLstYr).HasColumnName("disc_lst_yr").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.LastFinChg).HasColumnName("last_fin_chg").IsRequired(false); + entity.Property(e => e.SalesPtd).HasColumnName("sales_ptd").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.CalcDate).HasColumnName("calc_date").IsRequired(false); + entity.Property(e => e.NumPeriods).HasColumnName("num_periods").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.AvgDaysOs).HasColumnName("avg_days_os").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.NumInvoices).HasColumnName("num_invoices").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.HistDaysOs).HasColumnName("hist_days_os").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.LargDaysOs).HasColumnName("larg_days_os").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.LastDaysOs).HasColumnName("last_days_os").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.AvgBalOs).HasColumnName("avg_bal_os").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.LargeBalOs).HasColumnName("large_bal_os").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.LastBalOs).HasColumnName("last_bal_os").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.Whse).HasColumnName("whse").HasMaxLength(8).IsRequired(false); + entity.Property(e => e.Charfld1).HasColumnName("charfld1").HasMaxLength(40).IsRequired(false); + entity.Property(e => e.Charfld2).HasColumnName("charfld2").HasMaxLength(40).IsRequired(false); + entity.Property(e => e.Charfld3).HasColumnName("charfld3").HasMaxLength(40).IsRequired(false); + entity.Property(e => e.Decifld1).HasColumnName("decifld1").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.Decifld2).HasColumnName("decifld2").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.Decifld3).HasColumnName("decifld3").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.Logifld).HasColumnName("logifld").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.Datefld).HasColumnName("datefld").IsRequired(false); + entity.Property(e => e.TaxRegNum1).HasColumnName("tax_reg_num1").HasMaxLength(40).IsRequired(false); + entity.Property(e => e.BankCode).HasColumnName("bank_code").HasMaxLength(8).IsRequired(false); + entity.Property(e => e.TaxRegNum2).HasColumnName("tax_reg_num2").HasMaxLength(40).IsRequired(false); + entity.Property(e => e.PayType).HasColumnName("pay_type").HasMaxLength(1).HasDefaultValueSql("'C'"); + entity.Property(e => e.EdiCust).HasColumnName("edi_cust").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.BranchId).HasColumnName("branch_id").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.TransNat).HasColumnName("trans_nat").HasMaxLength(4).IsRequired(false); + entity.Property(e => e.Delterm).HasColumnName("delterm").HasMaxLength(8).IsRequired(false); + entity.Property(e => e.ProcessInd).HasColumnName("process_ind").HasMaxLength(2).IsRequired(false); + entity.Property(e => e.UseExchRate).HasColumnName("use_exch_rate").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.TaxCode1).HasColumnName("tax_code1").HasMaxLength(12).IsRequired(false); + entity.Property(e => e.TaxCode2).HasColumnName("tax_code2").HasMaxLength(12).IsRequired(false); + entity.Property(e => e.Pricecode).HasColumnName("pricecode").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.ShipEarly).HasColumnName("ship_early").HasColumnType("tinyint").HasDefaultValueSql("1"); + entity.Property(e => e.ShipPartial).HasColumnName("ship_partial").HasColumnType("tinyint").HasDefaultValueSql("1"); + entity.Property(e => e.LangCode).HasColumnName("lang_code").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.EndUserType).HasColumnName("end_user_type").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.ShipSite).HasColumnName("ship_site").HasMaxLength(16).IsRequired(false); + entity.Property(e => e.LcrReqd).HasColumnName("lcr_reqd").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.CustBank).HasColumnName("cust_bank").HasMaxLength(8).IsRequired(false); + entity.Property(e => e.DraftPrintFlag).HasColumnName("draft_print_flag").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.RcvInternalEmail).HasColumnName("rcv_internal_email").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.CustomerEmailAddr).HasColumnName("customer_email_addr").HasMaxLength(60).IsRequired(false); + entity.Property(e => e.SendCustomerEmail).HasColumnName("send_customer_email").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.ApsPullUp).HasColumnName("aps_pull_up").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.DoInvoice).HasColumnName("do_invoice").HasMaxLength(1).HasDefaultValueSql("'S'"); + entity.Property(e => e.Consolidate).HasColumnName("consolidate").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.InvFreq).HasColumnName("inv_freq").HasMaxLength(1).HasDefaultValueSql("'W'"); + entity.Property(e => e.Summarize).HasColumnName("summarize").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.NoteExistsFlag).HasColumnName("NoteExistsFlag").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.RecordDate).HasColumnName("RecordDate").HasDefaultValueSql("getdate()"); + entity.Property(e => e.RowPointer).HasColumnName("RowPointer").HasColumnType("uniqueidentifier").HasDefaultValueSql("newid()"); + entity.Property(e => e.Einvoice).HasColumnName("einvoice").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.OrderBal).HasColumnName("order_bal").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.PostedBal).HasColumnName("posted_bal").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.CreatedBy).HasColumnName("CreatedBy").HasMaxLength(60).HasDefaultValueSql("suser_sname()"); + entity.Property(e => e.UpdatedBy).HasColumnName("UpdatedBy").HasMaxLength(60).HasDefaultValueSql("suser_sname()"); + entity.Property(e => e.CreateDate).HasColumnName("CreateDate").HasDefaultValueSql("getdate()"); + entity.Property(e => e.CrmGuid).HasColumnName("crm_guid").HasMaxLength(36).IsRequired(false); + entity.Property(e => e.InWorkflow).HasColumnName("InWorkflow").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.PrintPackInv).HasColumnName("print_pack_inv").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.OnePackInv).HasColumnName("one_pack_inv").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.InvCategory).HasColumnName("inv_category").HasMaxLength(20).HasDefaultValueSql("'DEFAULTCATEGORY'"); + entity.Property(e => e.IncludeTaxInPrice).HasColumnName("include_tax_in_price").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.TransNat2).HasColumnName("trans_nat_2").HasMaxLength(4).IsRequired(false); + entity.Property(e => e.UseRevisionPayDays).HasColumnName("use_revision_pay_days").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.RevisionDay).HasColumnName("revision_day").IsRequired(false); + entity.Property(e => e.RevisionDayStartTime1).HasColumnName("revision_day_start_time##1").IsRequired(false); + entity.Property(e => e.RevisionDayStartTime2).HasColumnName("revision_day_start_time##2").IsRequired(false); + entity.Property(e => e.RevisionDayEndTime1).HasColumnName("revision_day_end_time##1").IsRequired(false); + entity.Property(e => e.RevisionDayEndTime2).HasColumnName("revision_day_end_time##2").IsRequired(false); + entity.Property(e => e.PayDay).HasColumnName("pay_day").IsRequired(false); + entity.Property(e => e.PayDayStartTime1).HasColumnName("pay_day_start_time##1").IsRequired(false); + entity.Property(e => e.PayDayStartTime2).HasColumnName("pay_day_start_time##2").IsRequired(false); + entity.Property(e => e.PayDayEndTime1).HasColumnName("pay_day_end_time##1").IsRequired(false); + entity.Property(e => e.PayDayEndTime2).HasColumnName("pay_day_end_time##2").IsRequired(false); + entity.Property(e => e.ExportType).HasColumnName("export_type").HasMaxLength(1).HasDefaultValueSql("'N'"); + entity.Property(e => e.ActiveForDataIntegration).HasColumnName("active_for_data_integration").HasColumnType("tinyint").HasDefaultValueSql("1"); + entity.Property(e => e.ShowInShipToDropDownList).HasColumnName("show_in_ship_to_drop_down_list").HasColumnType("tinyint").HasDefaultValueSql("1"); + entity.Property(e => e.ShowInDropDownList).HasColumnName("show_in_drop_down_list").HasColumnType("tinyint").HasDefaultValueSql("1"); + entity.Property(e => e.SicCode).HasColumnName("sic_code").HasMaxLength(8).IsRequired(false); + entity.Property(e => e.NumberOfEmployees).HasColumnName("number_of_employees").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.CompanyRevenue).HasColumnName("company_revenue").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.TerritoryCode).HasColumnName("territory_code").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.SalesTeamId).HasColumnName("sales_team_id").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.DaysShippedBeforeDueDateTolerance).HasColumnName("days_shipped_before_due_date_tolerance").IsRequired(false); + entity.Property(e => e.DaysShippedAfterDueDateTolerance).HasColumnName("days_shipped_after_due_date_tolerance").IsRequired(false); + entity.Property(e => e.ShippedOverOrderedQtyTolerance).HasColumnName("shipped_over_ordered_qty_tolerance").IsRequired(false); + entity.Property(e => e.ShippedUnderOrderedQtyTolerance).HasColumnName("shipped_under_ordered_qty_tolerance").IsRequired(false); + entity.Property(e => e.DefaultShipTo).HasColumnName("default_ship_to").HasDefaultValueSql("0"); + entity.Property(e => e.IncludeOrdersInTaxRpt).HasColumnName("include_orders_in_tax_rpt").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.ConstructiveSalePricePct).HasColumnName("constructive_sale_price_pct").IsRequired(false); + entity.Property(e => e.Uf_ZPL_FedId).HasColumnName("uf_ZPL_FedId").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_ZPL_VATRegisterCode).HasColumnName("uf_ZPL_VATRegisterCode").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_INT_CustSeq).HasColumnName("Uf_INT_CustSeq").IsRequired(false); + entity.Property(e => e.Uf_INT_Replicate).HasColumnName("UF_INT_Replicate").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.Uf_FKR_FA_SL_SYKOF).HasColumnName("Uf_FKR_FA_SL_SYKOF").IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Eksport_SYKOF).HasColumnName("Uf_FKR_FA_Eksport_SYKOF").HasColumnType("tinyint").IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Kod_Dostawcy_u_Klienta).HasColumnName("Uf_FKR_FA_Kod_Dostawcy_u_Klienta").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Rampa).HasColumnName("Uf_FKR_FA_Rampa").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Zaklad_Przeznaczenia).HasColumnName("Uf_FKR_FA_Zaklad_Przeznaczenia").HasMaxLength(100).IsRequired(false); + entity.Property(e => e.Uf_FKR_Customer_Status).HasColumnName("Uf_FKR_Customer_Status").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.Uf_bpx_customer_printbatch).HasColumnName("Uf_bpx_customer_printbatch").HasColumnType("tinyint").IsRequired(false); + entity.Property(e => e.Uf_cust_receiver_line1).HasColumnName("Uf_cust_receiver_line1").HasMaxLength(100).IsRequired(false); + entity.Property(e => e.Uf_cust_receiver_line2).HasColumnName("Uf_cust_receiver_line2").HasMaxLength(100).IsRequired(false); + entity.Property(e => e.Uf_cust_supplier_no).HasColumnName("Uf_cust_supplier_no").IsRequired(false); + + entity.HasIndex(e => e.RowPointer).HasDatabaseName("IX_customer_RowPointer").IsUnique(); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("cust_tp"); + + entity.HasKey(e => new { e.CustNum, e.CustSeq }); + + entity.Property(e => e.CustNum) + .HasColumnName("cust_num") + .HasMaxLength(14) + .IsRequired(); + + entity.Property(e => e.CustSeq) + .HasColumnName("cust_seq") + .HasColumnType("int") + .HasDefaultValueSql("0"); + + entity.Property(e => e.UpdCustAddress) + .HasColumnName("upd_cust_address") + .HasColumnType("tinyint") + .HasDefaultValueSql("1"); + + entity.Property(e => e.TpCode) + .HasColumnName("tp_code") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.DunsNum) + .HasColumnName("duns_num") + .HasMaxLength(20) + .IsRequired(false); + + entity.Property(e => e.GenAck) + .HasColumnName("gen_ack") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.PaperAck) + .HasColumnName("paper_ack") + .HasColumnType("tinyint") + .HasDefaultValueSql("1"); + + entity.Property(e => e.GenAsn) + .HasColumnName("gen_asn") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.PaperAsn) + .HasColumnName("paper_asn") + .HasColumnType("tinyint") + .HasDefaultValueSql("1"); + + entity.Property(e => e.GenInv) + .HasColumnName("gen_inv") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.PaperInv) + .HasColumnName("paper_inv") + .HasColumnType("tinyint") + .HasDefaultValueSql("1"); + + entity.Property(e => e.AutoPost) + .HasColumnName("auto_post") + .HasMaxLength(1) + .HasDefaultValueSql("'N'"); + + entity.Property(e => e.PostPlanned) + .HasColumnName("post_planned") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.ReleaseProc) + .HasColumnName("release_proc") + .HasMaxLength(1) + .HasDefaultValueSql("'R'"); + + entity.Property(e => e.PooledAsn) + .HasColumnName("pooled_asn") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.ValPrice) + .HasColumnName("val_price") + .HasColumnType("tinyint") + .HasDefaultValueSql("1"); + + entity.Property(e => e.UsePrice) + .HasColumnName("use_price") + .HasMaxLength(1) + .HasDefaultValueSql("'S'"); + + entity.Property(e => e.ValCredit) + .HasColumnName("val_credit") + .HasColumnType("tinyint") + .HasDefaultValueSql("1"); + + entity.Property(e => e.NoteProc) + .HasColumnName("note_proc") + .HasMaxLength(2) + .HasDefaultValueSql("'A'"); + + entity.Property(e => e.UseDate) + .HasColumnName("use_date") + .HasMaxLength(1) + .HasDefaultValueSql("'C'"); + + entity.Property(e => e.DateOffset) + .HasColumnName("date_offset") + .HasColumnType("int") + .HasDefaultValueSql("0") + .IsRequired(false); + + entity.Property(e => e.InvCode) + .HasColumnName("inv_code") + .HasMaxLength(10) + .IsRequired(false); + + entity.Property(e => e.AckCode) + .HasColumnName("ack_code") + .HasMaxLength(10) + .IsRequired(false); + + entity.Property(e => e.AsnCode) + .HasColumnName("asn_code") + .HasMaxLength(10) + .IsRequired(false); + + entity.Property(e => e.LastItemDate) + .HasColumnName("last_item_date") + .IsRequired(false); + + entity.Property(e => e.LastCustaDate) + .HasColumnName("last_custa_date") + .IsRequired(false); + + entity.Property(e => e.IncludeSerial) + .HasColumnName("include_serial") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.NoteExistsFlag) + .HasColumnName("NoteExistsFlag") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.RecordDate) + .HasColumnName("RecordDate") + .HasDefaultValueSql("getdate()"); + + entity.Property(e => e.RowPointer) + .HasColumnName("RowPointer") + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("newid()"); + + entity.Property(e => e.CreatedBy) + .HasColumnName("CreatedBy") + .HasMaxLength(60) + .HasDefaultValueSql("suser_sname()"); + + entity.Property(e => e.UpdatedBy) + .HasColumnName("UpdatedBy") + .HasMaxLength(60) + .HasDefaultValueSql("suser_sname()"); + + entity.Property(e => e.CreateDate) + .HasColumnName("CreateDate") + .HasDefaultValueSql("getdate()"); + + entity.Property(e => e.InWorkflow) + .HasColumnName("InWorkflow") + .HasColumnType("tinyint") + .HasDefaultValueSql("0"); + + entity.Property(e => e.Uf_FKR_EDI_RSSBussFolder) + .HasColumnName("uf_FKR_EDI_RSSBussFolder") + .HasMaxLength(100) + .IsRequired(false); + + entity.Property(e => e.Uf_FKR_EDI_IdentificationCode) + .HasColumnName("uf_FKR_EDI_IdentificationCode") + .HasMaxLength(20) + .IsRequired(false); + + // Index + entity.HasIndex(e => e.RowPointer) + .HasDatabaseName("IX_cust_tp_RowPointer") + .IsUnique(); + }); } } } From 88daf6d3926ce851763320938e5394b96ea260e9 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 7 Aug 2025 06:56:42 +0200 Subject: [PATCH 031/149] * Added Nugget config --- SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj index c44357d..3232ad8 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj +++ b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj @@ -4,6 +4,14 @@ net8.0 enable enable + + SytelineSaAppEfDataModel + 1.0.0 + PK + Data Manager for SYTELINE_SA_APP database + MIT + true + $(MSBuildThisFileDirectory)bin\NuGet From d7210417f5c7c9d963df373da4c94cc579c7c272 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 7 Aug 2025 06:58:36 +0200 Subject: [PATCH 032/149] * Package version incremented --- SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj index 3232ad8..bf38756 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj +++ b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj @@ -6,7 +6,7 @@ enable SytelineSaAppEfDataModel - 1.0.0 + 1.1 PK Data Manager for SYTELINE_SA_APP database MIT From f400c35c6013c5298a4e79b6df329f2a46b75ee8 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 21 Aug 2025 05:39:08 +0200 Subject: [PATCH 033/149] * Extended DataModels by Customer and CustomerTp * Added new services and controllers for both models --- .../Controllers/CustomerOrdersController.cs | 20 +- SytelineSaAppEfDataModel/Dtos/CustomerDto.cs | 226 +++++++++--------- .../Dtos/CustomerTpDto.cs | 2 +- SytelineSaAppEfDataModel/Entities/Customer.cs | 226 +++++++++--------- .../Entities/CustomerTp.cs | 2 +- .../Services/CustomerOrderService.cs | 8 + .../Services/ICustomerOrderService.cs | 1 + .../SytelineSaAppDbContext.cs | 184 +++++++++----- .../SytelineSaAppEfDataModel.csproj | 2 +- 9 files changed, 374 insertions(+), 297 deletions(-) diff --git a/FaKrosnoApi/Controllers/CustomerOrdersController.cs b/FaKrosnoApi/Controllers/CustomerOrdersController.cs index ab7cd69..4a91c1e 100644 --- a/FaKrosnoApi/Controllers/CustomerOrdersController.cs +++ b/FaKrosnoApi/Controllers/CustomerOrdersController.cs @@ -12,22 +12,22 @@ namespace FaKrosnoApi.Controllers [HttpGet] public async Task>> GetAll() { - IEnumerable ediCustomerOrders = await service.GetAll(); - return Ok(ediCustomerOrders); + IEnumerable customerOrders = await service.GetAll(); + return Ok(customerOrders); } [HttpGet("by-order-number")] public async Task> GetByCustomerOrderNumber([FromQuery] Guid customerOrderNumber) { - CustomerOrderDto? scheduleOrder = await service.GetByOrderNumber(customerOrderNumber); - return scheduleOrder != null ? Ok(scheduleOrder) : NotFound(); + CustomerOrderDto? customerOrder = await service.GetByOrderNumber(customerOrderNumber); + return customerOrder != null ? Ok(customerOrder) : NotFound(); } [HttpGet("by-co-number")] public async Task> GetByCoNumber([FromQuery] string customerOrderNumber) { - CustomerOrderDto? scheduleOrder = await service.GetByCoNumber(customerOrderNumber); - return scheduleOrder != null ? Ok(scheduleOrder) : NotFound(); + CustomerOrderDto? customerOrder = await service.GetByCoNumber(customerOrderNumber); + return customerOrder != null ? Ok(customerOrder) : NotFound(); } [HttpGet("items-by-co-number")] @@ -36,5 +36,13 @@ namespace FaKrosnoApi.Controllers var customerOrderLineItems = await service.GetItemsByCoNumber(customerOrderNumber); return customerOrderLineItems != null ? Ok(customerOrderLineItems) : NotFound(); } + + [HttpGet("by-customer-and-po")] + public async Task> GetByCustomerAndPo([FromQuery] string customerNumber, [FromQuery] int customerSequence, [FromQuery] string poNumber) + { + CustomerOrderDto? customerOrder = + await service.GetByCustomerAndPo(customerNumber, customerSequence, poNumber); + return customerOrder != null ? Ok(customerOrder) : NotFound(); + } } } diff --git a/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs b/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs index 2253a94..101ba65 100644 --- a/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs @@ -16,117 +16,117 @@ public class CustomerDto public string Slsman { get; set; } public string StateCycle { get; set; } public bool FinChg { get; set; } - public DateTime? LastInv { get; set; } - public DateTime? LastPaid { get; set; } - public decimal? SalesYtd { get; set; } - public decimal? SalesLstYr { get; set; } - public decimal? DiscYtd { get; set; } - public decimal? DiscLstYr { get; set; } - public DateTime? LastFinChg { get; set; } - public decimal? SalesPtd { get; set; } - public DateTime? CalcDate { get; set; } - public int? NumPeriods { get; set; } - public int? AvgDaysOs { get; set; } - public int? NumInvoices { get; set; } - public int? HistDaysOs { get; set; } - public int? LargDaysOs { get; set; } - public int? LastDaysOs { get; set; } - public decimal? AvgBalOs { get; set; } - public decimal? LargeBalOs { get; set; } - public decimal? LastBalOs { get; set; } - public string Whse { get; set; } - public string Charfld1 { get; set; } - public string Charfld2 { get; set; } - public string Charfld3 { get; set; } - public decimal? Decifld1 { get; set; } - public decimal? Decifld2 { get; set; } - public decimal? Decifld3 { get; set; } - public bool Logifld { get; set; } - public DateTime? Datefld { get; set; } - public string TaxRegNum1 { get; set; } - public string BankCode { get; set; } - public string TaxRegNum2 { get; set; } - public string PayType { get; set; } - public bool EdiCust { get; set; } - public string BranchId { get; set; } - public string TransNat { get; set; } - public string Delterm { get; set; } - public string ProcessInd { get; set; } - public bool UseExchRate { get; set; } - public string TaxCode1 { get; set; } - public string TaxCode2 { get; set; } - public string Pricecode { get; set; } - public bool ShipEarly { get; set; } - public bool ShipPartial { get; set; } - public string LangCode { get; set; } - public string EndUserType { get; set; } - public string ShipSite { get; set; } - public bool LcrReqd { get; set; } - public string CustBank { get; set; } - public bool DraftPrintFlag { get; set; } - public bool RcvInternalEmail { get; set; } - public string CustomerEmailAddr { get; set; } - public bool SendCustomerEmail { get; set; } - public bool ApsPullUp { get; set; } - public string DoInvoice { get; set; } - public bool Consolidate { get; set; } - public string InvFreq { get; set; } - public bool Summarize { get; set; } - public bool NoteExistsFlag { get; set; } - public DateTime RecordDate { get; set; } - public Guid RowPointer { get; set; } - public bool Einvoice { get; set; } - public decimal? OrderBal { get; set; } - public decimal? PostedBal { get; set; } - public string CreatedBy { get; set; } - public string UpdatedBy { get; set; } - public DateTime CreateDate { get; set; } - public string CrmGuid { get; set; } - public bool InWorkflow { get; set; } - public bool PrintPackInv { get; set; } - public bool OnePackInv { get; set; } - public string InvCategory { get; set; } - public bool IncludeTaxInPrice { get; set; } - public string TransNat2 { get; set; } - public bool UseRevisionPayDays { get; set; } - public int? RevisionDay { get; set; } - public TimeSpan? RevisionDayStartTime1 { get; set; } - public TimeSpan? RevisionDayStartTime2 { get; set; } - public TimeSpan? RevisionDayEndTime1 { get; set; } - public TimeSpan? RevisionDayEndTime2 { get; set; } - public int? PayDay { get; set; } - public TimeSpan? PayDayStartTime1 { get; set; } - public TimeSpan? PayDayStartTime2 { get; set; } - public TimeSpan? PayDayEndTime1 { get; set; } - public TimeSpan? PayDayEndTime2 { get; set; } - public string ExportType { get; set; } - public bool ActiveForDataIntegration { get; set; } - public bool ShowInShipToDropDownList { get; set; } - public bool ShowInDropDownList { get; set; } - public string SicCode { get; set; } - public int? NumberOfEmployees { get; set; } - public decimal? CompanyRevenue { get; set; } - public string TerritoryCode { get; set; } - public string SalesTeamId { get; set; } - public int? DaysShippedBeforeDueDateTolerance { get; set; } - public int? DaysShippedAfterDueDateTolerance { get; set; } - public decimal? ShippedOverOrderedQtyTolerance { get; set; } - public decimal? ShippedUnderOrderedQtyTolerance { get; set; } - public int DefaultShipTo { get; set; } - public bool IncludeOrdersInTaxRpt { get; set; } - public decimal? ConstructiveSalePricePct { get; set; } - public string Uf_ZPL_FedId { get; set; } - public string Uf_ZPL_VATRegisterCode { get; set; } - public int? Uf_INT_CustSeq { get; set; } - public bool Uf_INT_Replicate { get; set; } - public int? Uf_FKR_FA_SL_SYKOF { get; set; } - public bool? Uf_FKR_FA_Eksport_SYKOF { get; set; } - public string Uf_FKR_FA_Kod_Dostawcy_u_Klienta { get; set; } - public string Uf_FKR_FA_Rampa { get; set; } - public string Uf_FKR_FA_Zaklad_Przeznaczenia { get; set; } - public char? Uf_FKR_Customer_Status { get; set; } - public bool? Uf_bpx_customer_printbatch { get; set; } - public string Uf_cust_receiver_line1 { get; set; } - public string Uf_cust_receiver_line2 { get; set; } - public int? Uf_cust_supplier_no { get; set; } + public DateTime? LastInv { get; set; } + public DateTime? LastPaid { get; set; } + public decimal? SalesYtd { get; set; } + public decimal? SalesLstYr { get; set; } + public decimal? DiscYtd { get; set; } + public decimal? DiscLstYr { get; set; } + public DateTime? LastFinChg { get; set; } + public decimal? SalesPtd { get; set; } + public DateTime? CalcDate { get; set; } + public short? NumPeriods { get; set; } + public short? AvgDaysOs { get; set; } + public int? NumInvoices { get; set; } + public int? HistDaysOs { get; set; } + public int? LargDaysOs { get; set; } + public short? LastDaysOs { get; set; } + public decimal? AvgBalOs { get; set; } + public decimal? LargeBalOs { get; set; } + public decimal? LastBalOs { get; set; } + public string Whse { get; set; } + public string Charfld1 { get; set; } + public string Charfld2 { get; set; } + public string Charfld3 { get; set; } + public decimal? Decifld1 { get; set; } + public decimal? Decifld2 { get; set; } + public decimal? Decifld3 { get; set; } + public bool Logifld { get; set; } + public DateTime? Datefld { get; set; } + public string TaxRegNum1 { get; set; } + public string BankCode { get; set; } + public string TaxRegNum2 { get; set; } + public string PayType { get; set; } + public bool EdiCust { get; set; } + public string BranchId { get; set; } + public string TransNat { get; set; } + public string Delterm { get; set; } + public string ProcessInd { get; set; } + public bool UseExchRate { get; set; } + public string TaxCode1 { get; set; } + public string TaxCode2 { get; set; } + public string Pricecode { get; set; } + public bool ShipEarly { get; set; } + public bool ShipPartial { get; set; } + public string LangCode { get; set; } + public string EndUserType { get; set; } + public string ShipSite { get; set; } + public bool LcrReqd { get; set; } + public string CustBank { get; set; } + public bool DraftPrintFlag { get; set; } + public bool RcvInternalEmail { get; set; } + public string CustomerEmailAddr { get; set; } + public bool SendCustomerEmail { get; set; } + public bool ApsPullUp { get; set; } + public string DoInvoice { get; set; } + public bool Consolidate { get; set; } + public string InvFreq { get; set; } + public bool Summarize { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public bool Einvoice { get; set; } + public decimal? OrderBal { get; set; } + public decimal? PostedBal { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public string CrmGuid { get; set; } + public bool InWorkflow { get; set; } + public bool PrintPackInv { get; set; } + public bool OnePackInv { get; set; } + public string InvCategory { get; set; } + public bool IncludeTaxInPrice { get; set; } + public string TransNat2 { get; set; } + public bool UseRevisionPayDays { get; set; } + public int? RevisionDay { get; set; } + public TimeSpan? RevisionDayStartTime1 { get; set; } + public TimeSpan? RevisionDayStartTime2 { get; set; } + public TimeSpan? RevisionDayEndTime1 { get; set; } + public TimeSpan? RevisionDayEndTime2 { get; set; } + public int? PayDay { get; set; } + public TimeSpan? PayDayStartTime1 { get; set; } + public TimeSpan? PayDayStartTime2 { get; set; } + public TimeSpan? PayDayEndTime1 { get; set; } + public TimeSpan? PayDayEndTime2 { get; set; } + public string ExportType { get; set; } + public bool ActiveForDataIntegration { get; set; } + public bool ShowInShipToDropDownList { get; set; } + public bool ShowInDropDownList { get; set; } + public string SicCode { get; set; } + public int? NumberOfEmployees { get; set; } + public decimal? CompanyRevenue { get; set; } + public string TerritoryCode { get; set; } + public string SalesTeamId { get; set; } + public short? DaysShippedBeforeDueDateTolerance { get; set; } + public short? DaysShippedAfterDueDateTolerance { get; set; } + public decimal? ShippedOverOrderedQtyTolerance { get; set; } + public decimal? ShippedUnderOrderedQtyTolerance { get; set; } + public int DefaultShipTo { get; set; } + public bool IncludeOrdersInTaxRpt { get; set; } + public decimal? ConstructiveSalePricePct { get; set; } + public string Uf_ZPL_FedId { get; set; } + public string Uf_ZPL_VATRegisterCode { get; set; } + public int? Uf_INT_CustSeq { get; set; } + public bool Uf_INT_Replicate { get; set; } + public int? Uf_FKR_FA_SL_SYKOF { get; set; } + public bool? Uf_FKR_FA_Eksport_SYKOF { get; set; } + public string Uf_FKR_FA_Kod_Dostawcy_u_Klienta { get; set; } + public string Uf_FKR_FA_Rampa { get; set; } + public string Uf_FKR_FA_Zaklad_Przeznaczenia { get; set; } + public char? Uf_FKR_Customer_Status { get; set; } + public bool? Uf_bpx_customer_printbatch { get; set; } + public string Uf_cust_receiver_line1 { get; set; } + public string Uf_cust_receiver_line2 { get; set; } + public int? Uf_cust_supplier_no { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/CustomerTpDto.cs b/SytelineSaAppEfDataModel/Dtos/CustomerTpDto.cs index 6f245e1..9b66ee3 100644 --- a/SytelineSaAppEfDataModel/Dtos/CustomerTpDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/CustomerTpDto.cs @@ -22,7 +22,7 @@ public class CustomerTpDto public bool ValCredit { get; set; } public string NoteProc { get; set; } public string UseDate { get; set; } - public int? DateOffset { get; set; } + public short? DateOffset { get; set; } public string InvCode { get; set; } public string AckCode { get; set; } public string AsnCode { get; set; } diff --git a/SytelineSaAppEfDataModel/Entities/Customer.cs b/SytelineSaAppEfDataModel/Entities/Customer.cs index 807e099..d659435 100644 --- a/SytelineSaAppEfDataModel/Entities/Customer.cs +++ b/SytelineSaAppEfDataModel/Entities/Customer.cs @@ -16,117 +16,117 @@ public class Customer public string Slsman { get; set; } public string StateCycle { get; set; } public bool FinChg { get; set; } - public DateTime? LastInv { get; set; } - public DateTime? LastPaid { get; set; } - public decimal? SalesYtd { get; set; } - public decimal? SalesLstYr { get; set; } - public decimal? DiscYtd { get; set; } - public decimal? DiscLstYr { get; set; } - public DateTime? LastFinChg { get; set; } - public decimal? SalesPtd { get; set; } - public DateTime? CalcDate { get; set; } - public int? NumPeriods { get; set; } - public int? AvgDaysOs { get; set; } - public int? NumInvoices { get; set; } - public int? HistDaysOs { get; set; } - public int? LargDaysOs { get; set; } - public int? LastDaysOs { get; set; } - public decimal? AvgBalOs { get; set; } - public decimal? LargeBalOs { get; set; } - public decimal? LastBalOs { get; set; } - public string Whse { get; set; } - public string Charfld1 { get; set; } - public string Charfld2 { get; set; } - public string Charfld3 { get; set; } - public decimal? Decifld1 { get; set; } - public decimal? Decifld2 { get; set; } - public decimal? Decifld3 { get; set; } - public bool Logifld { get; set; } - public DateTime? Datefld { get; set; } - public string TaxRegNum1 { get; set; } - public string BankCode { get; set; } - public string TaxRegNum2 { get; set; } - public string PayType { get; set; } - public bool EdiCust { get; set; } - public string BranchId { get; set; } - public string TransNat { get; set; } - public string Delterm { get; set; } - public string ProcessInd { get; set; } - public bool UseExchRate { get; set; } - public string TaxCode1 { get; set; } - public string TaxCode2 { get; set; } - public string Pricecode { get; set; } - public bool ShipEarly { get; set; } - public bool ShipPartial { get; set; } - public string LangCode { get; set; } - public string EndUserType { get; set; } - public string ShipSite { get; set; } - public bool LcrReqd { get; set; } - public string CustBank { get; set; } - public bool DraftPrintFlag { get; set; } - public bool RcvInternalEmail { get; set; } - public string CustomerEmailAddr { get; set; } - public bool SendCustomerEmail { get; set; } - public bool ApsPullUp { get; set; } - public string DoInvoice { get; set; } - public bool Consolidate { get; set; } - public string InvFreq { get; set; } - public bool Summarize { get; set; } - public bool NoteExistsFlag { get; set; } - public DateTime RecordDate { get; set; } - public Guid RowPointer { get; set; } - public bool Einvoice { get; set; } - public decimal? OrderBal { get; set; } - public decimal? PostedBal { get; set; } - public string CreatedBy { get; set; } - public string UpdatedBy { get; set; } - public DateTime CreateDate { get; set; } - public string CrmGuid { get; set; } - public bool InWorkflow { get; set; } - public bool PrintPackInv { get; set; } - public bool OnePackInv { get; set; } - public string InvCategory { get; set; } - public bool IncludeTaxInPrice { get; set; } - public string TransNat2 { get; set; } - public bool UseRevisionPayDays { get; set; } - public int? RevisionDay { get; set; } - public TimeSpan? RevisionDayStartTime1 { get; set; } - public TimeSpan? RevisionDayStartTime2 { get; set; } - public TimeSpan? RevisionDayEndTime1 { get; set; } - public TimeSpan? RevisionDayEndTime2 { get; set; } - public int? PayDay { get; set; } - public TimeSpan? PayDayStartTime1 { get; set; } - public TimeSpan? PayDayStartTime2 { get; set; } - public TimeSpan? PayDayEndTime1 { get; set; } - public TimeSpan? PayDayEndTime2 { get; set; } - public string ExportType { get; set; } - public bool ActiveForDataIntegration { get; set; } - public bool ShowInShipToDropDownList { get; set; } - public bool ShowInDropDownList { get; set; } - public string SicCode { get; set; } - public int? NumberOfEmployees { get; set; } - public decimal? CompanyRevenue { get; set; } - public string TerritoryCode { get; set; } - public string SalesTeamId { get; set; } - public int? DaysShippedBeforeDueDateTolerance { get; set; } - public int? DaysShippedAfterDueDateTolerance { get; set; } - public decimal? ShippedOverOrderedQtyTolerance { get; set; } - public decimal? ShippedUnderOrderedQtyTolerance { get; set; } - public int DefaultShipTo { get; set; } - public bool IncludeOrdersInTaxRpt { get; set; } - public decimal? ConstructiveSalePricePct { get; set; } - public string Uf_ZPL_FedId { get; set; } - public string Uf_ZPL_VATRegisterCode { get; set; } - public int? Uf_INT_CustSeq { get; set; } - public bool Uf_INT_Replicate { get; set; } - public int? Uf_FKR_FA_SL_SYKOF { get; set; } - public bool? Uf_FKR_FA_Eksport_SYKOF { get; set; } - public string Uf_FKR_FA_Kod_Dostawcy_u_Klienta { get; set; } - public string Uf_FKR_FA_Rampa { get; set; } - public string Uf_FKR_FA_Zaklad_Przeznaczenia { get; set; } - public char? Uf_FKR_Customer_Status { get; set; } - public bool? Uf_bpx_customer_printbatch { get; set; } - public string Uf_cust_receiver_line1 { get; set; } - public string Uf_cust_receiver_line2 { get; set; } - public int? Uf_cust_supplier_no { get; set; } + public DateTime? LastInv { get; set; } + public DateTime? LastPaid { get; set; } + public decimal? SalesYtd { get; set; } + public decimal? SalesLstYr { get; set; } + public decimal? DiscYtd { get; set; } + public decimal? DiscLstYr { get; set; } + public DateTime? LastFinChg { get; set; } + public decimal? SalesPtd { get; set; } + public DateTime? CalcDate { get; set; } + public short? NumPeriods { get; set; } + public short? AvgDaysOs { get; set; } + public int? NumInvoices { get; set; } + public int? HistDaysOs { get; set; } + public int? LargDaysOs { get; set; } + public short? LastDaysOs { get; set; } + public decimal? AvgBalOs { get; set; } + public decimal? LargeBalOs { get; set; } + public decimal? LastBalOs { get; set; } + public string Whse { get; set; } + public string Charfld1 { get; set; } + public string Charfld2 { get; set; } + public string Charfld3 { get; set; } + public decimal? Decifld1 { get; set; } + public decimal? Decifld2 { get; set; } + public decimal? Decifld3 { get; set; } + public bool Logifld { get; set; } + public DateTime? Datefld { get; set; } + public string TaxRegNum1 { get; set; } + public string BankCode { get; set; } + public string TaxRegNum2 { get; set; } + public string PayType { get; set; } + public bool EdiCust { get; set; } + public string BranchId { get; set; } + public string TransNat { get; set; } + public string Delterm { get; set; } + public string ProcessInd { get; set; } + public bool UseExchRate { get; set; } + public string TaxCode1 { get; set; } + public string TaxCode2 { get; set; } + public string Pricecode { get; set; } + public bool ShipEarly { get; set; } + public bool ShipPartial { get; set; } + public string LangCode { get; set; } + public string EndUserType { get; set; } + public string ShipSite { get; set; } + public bool LcrReqd { get; set; } + public string CustBank { get; set; } + public bool DraftPrintFlag { get; set; } + public bool RcvInternalEmail { get; set; } + public string CustomerEmailAddr { get; set; } + public bool SendCustomerEmail { get; set; } + public bool ApsPullUp { get; set; } + public string DoInvoice { get; set; } + public bool Consolidate { get; set; } + public string InvFreq { get; set; } + public bool Summarize { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public bool Einvoice { get; set; } + public decimal? OrderBal { get; set; } + public decimal? PostedBal { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public string CrmGuid { get; set; } + public bool InWorkflow { get; set; } + public bool PrintPackInv { get; set; } + public bool OnePackInv { get; set; } + public string InvCategory { get; set; } + public bool IncludeTaxInPrice { get; set; } + public string TransNat2 { get; set; } + public bool UseRevisionPayDays { get; set; } + public int? RevisionDay { get; set; } + public TimeSpan? RevisionDayStartTime1 { get; set; } + public TimeSpan? RevisionDayStartTime2 { get; set; } + public TimeSpan? RevisionDayEndTime1 { get; set; } + public TimeSpan? RevisionDayEndTime2 { get; set; } + public int? PayDay { get; set; } + public TimeSpan? PayDayStartTime1 { get; set; } + public TimeSpan? PayDayStartTime2 { get; set; } + public TimeSpan? PayDayEndTime1 { get; set; } + public TimeSpan? PayDayEndTime2 { get; set; } + public string ExportType { get; set; } + public bool ActiveForDataIntegration { get; set; } + public bool ShowInShipToDropDownList { get; set; } + public bool ShowInDropDownList { get; set; } + public string SicCode { get; set; } + public int? NumberOfEmployees { get; set; } + public decimal? CompanyRevenue { get; set; } + public string TerritoryCode { get; set; } + public string SalesTeamId { get; set; } + public short? DaysShippedBeforeDueDateTolerance { get; set; } + public short? DaysShippedAfterDueDateTolerance { get; set; } + public decimal? ShippedOverOrderedQtyTolerance { get; set; } + public decimal? ShippedUnderOrderedQtyTolerance { get; set; } + public int DefaultShipTo { get; set; } + public bool IncludeOrdersInTaxRpt { get; set; } + public decimal? ConstructiveSalePricePct { get; set; } + public string Uf_ZPL_FedId { get; set; } + public string Uf_ZPL_VATRegisterCode { get; set; } + public int? Uf_INT_CustSeq { get; set; } + public bool Uf_INT_Replicate { get; set; } + public int? Uf_FKR_FA_SL_SYKOF { get; set; } + public bool? Uf_FKR_FA_Eksport_SYKOF { get; set; } + public string Uf_FKR_FA_Kod_Dostawcy_u_Klienta { get; set; } + public string Uf_FKR_FA_Rampa { get; set; } + public string Uf_FKR_FA_Zaklad_Przeznaczenia { get; set; } + public char? Uf_FKR_Customer_Status { get; set; } + public bool? Uf_bpx_customer_printbatch { get; set; } + public string Uf_cust_receiver_line1 { get; set; } + public string Uf_cust_receiver_line2 { get; set; } + public int? Uf_cust_supplier_no { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/CustomerTp.cs b/SytelineSaAppEfDataModel/Entities/CustomerTp.cs index 828f609..77eee35 100644 --- a/SytelineSaAppEfDataModel/Entities/CustomerTp.cs +++ b/SytelineSaAppEfDataModel/Entities/CustomerTp.cs @@ -22,7 +22,7 @@ public class CustomerTp public bool ValCredit { get; set; } public string NoteProc { get; set; } public string UseDate { get; set; } - public int? DateOffset { get; set; } + public short? DateOffset { get; set; } public string InvCode { get; set; } public string AckCode { get; set; } public string AsnCode { get; set; } diff --git a/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs index 246325b..1415b29 100644 --- a/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs @@ -65,6 +65,14 @@ namespace SytelineSaAppEfDataModel.Services return customerOrder; } + public async Task GetByCustomerAndPo(string customerNumber, int customerSequence, + string poNumber) + { + return await context.CustomerOrders + .Where(x => x.CustNum == customerNumber && x.CustSeq == customerSequence && x.CustPo == poNumber) + .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); + } + public async Task?> GetItemsByCoNumber(string customerOrderNumber) { List customerOrderLineItems = await context.CustomerOrderLineItems diff --git a/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs index 55ca634..e729da4 100644 --- a/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs @@ -12,6 +12,7 @@ namespace SytelineSaAppEfDataModel.Services Task> GetAll(); Task GetByOrderNumber(Guid orderNumber); Task GetByCoNumber(string orderNumber); + Task GetByCustomerAndPo(string customerNumber, int customerSequence, string poNumber); Task?> GetItemsByCoNumber(string customerOrderNumber); } } diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index c759c5b..ec54a67 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -1342,7 +1342,7 @@ namespace SytelineSaAppEfDataModel .HasColumnName("ItemsCount") .IsRequired(); }); - + modelBuilder.Entity(entity => { entity.ToTable("customer"); @@ -1362,25 +1362,36 @@ namespace SytelineSaAppEfDataModel entity.Property(e => e.ShipCode).HasColumnName("ship_code").HasMaxLength(6).IsRequired(false); entity.Property(e => e.Slsman).HasColumnName("slsman").HasMaxLength(6).IsRequired(false); entity.Property(e => e.StateCycle).HasColumnName("state_cycle").HasMaxLength(2).IsRequired(false); - entity.Property(e => e.FinChg).HasColumnName("fin_chg").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.FinChg).HasColumnName("fin_chg").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.LastInv).HasColumnName("last_inv").IsRequired(false); entity.Property(e => e.LastPaid).HasColumnName("last_paid").IsRequired(false); entity.Property(e => e.SalesYtd).HasColumnName("sales_ytd").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.SalesLstYr).HasColumnName("sales_lst_yr").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.SalesLstYr).HasColumnName("sales_lst_yr").HasDefaultValueSql("0") + .IsRequired(false); entity.Property(e => e.DiscYtd).HasColumnName("disc_ytd").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.DiscLstYr).HasColumnName("disc_lst_yr").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.DiscLstYr).HasColumnName("disc_lst_yr").HasDefaultValueSql("0") + .IsRequired(false); entity.Property(e => e.LastFinChg).HasColumnName("last_fin_chg").IsRequired(false); entity.Property(e => e.SalesPtd).HasColumnName("sales_ptd").HasDefaultValueSql("0").IsRequired(false); entity.Property(e => e.CalcDate).HasColumnName("calc_date").IsRequired(false); - entity.Property(e => e.NumPeriods).HasColumnName("num_periods").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.AvgDaysOs).HasColumnName("avg_days_os").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.NumInvoices).HasColumnName("num_invoices").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.HistDaysOs).HasColumnName("hist_days_os").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.LargDaysOs).HasColumnName("larg_days_os").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.LastDaysOs).HasColumnName("last_days_os").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.NumPeriods).HasColumnName("num_periods").HasDefaultValueSql("0") + .IsRequired(false); + entity.Property(e => e.AvgDaysOs).HasColumnName("avg_days_os").HasDefaultValueSql("0") + .IsRequired(false); + entity.Property(e => e.NumInvoices).HasColumnName("num_invoices").HasDefaultValueSql("0") + .IsRequired(false); + entity.Property(e => e.HistDaysOs).HasColumnName("hist_days_os").HasDefaultValueSql("0") + .IsRequired(false); + entity.Property(e => e.LargDaysOs).HasColumnName("larg_days_os").HasDefaultValueSql("0") + .IsRequired(false); + entity.Property(e => e.LastDaysOs).HasColumnName("last_days_os").HasDefaultValueSql("0") + .IsRequired(false); entity.Property(e => e.AvgBalOs).HasColumnName("avg_bal_os").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.LargeBalOs).HasColumnName("large_bal_os").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.LastBalOs).HasColumnName("last_bal_os").HasDefaultValueSql("0").IsRequired(false); + entity.Property(e => e.LargeBalOs).HasColumnName("large_bal_os").HasDefaultValueSql("0") + .IsRequired(false); + entity.Property(e => e.LastBalOs).HasColumnName("last_bal_os").HasDefaultValueSql("0") + .IsRequired(false); entity.Property(e => e.Whse).HasColumnName("whse").HasMaxLength(8).IsRequired(false); entity.Property(e => e.Charfld1).HasColumnName("charfld1").HasMaxLength(40).IsRequired(false); entity.Property(e => e.Charfld2).HasColumnName("charfld2").HasMaxLength(40).IsRequired(false); @@ -1388,57 +1399,83 @@ namespace SytelineSaAppEfDataModel entity.Property(e => e.Decifld1).HasColumnName("decifld1").HasDefaultValueSql("0").IsRequired(false); entity.Property(e => e.Decifld2).HasColumnName("decifld2").HasDefaultValueSql("0").IsRequired(false); entity.Property(e => e.Decifld3).HasColumnName("decifld3").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.Logifld).HasColumnName("logifld").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.Logifld).HasColumnName("logifld").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.Datefld).HasColumnName("datefld").IsRequired(false); entity.Property(e => e.TaxRegNum1).HasColumnName("tax_reg_num1").HasMaxLength(40).IsRequired(false); entity.Property(e => e.BankCode).HasColumnName("bank_code").HasMaxLength(8).IsRequired(false); entity.Property(e => e.TaxRegNum2).HasColumnName("tax_reg_num2").HasMaxLength(40).IsRequired(false); entity.Property(e => e.PayType).HasColumnName("pay_type").HasMaxLength(1).HasDefaultValueSql("'C'"); - entity.Property(e => e.EdiCust).HasColumnName("edi_cust").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.EdiCust).HasColumnName("edi_cust").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.BranchId).HasColumnName("branch_id").HasMaxLength(20).IsRequired(false); entity.Property(e => e.TransNat).HasColumnName("trans_nat").HasMaxLength(4).IsRequired(false); entity.Property(e => e.Delterm).HasColumnName("delterm").HasMaxLength(8).IsRequired(false); entity.Property(e => e.ProcessInd).HasColumnName("process_ind").HasMaxLength(2).IsRequired(false); - entity.Property(e => e.UseExchRate).HasColumnName("use_exch_rate").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.UseExchRate).HasColumnName("use_exch_rate").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.TaxCode1).HasColumnName("tax_code1").HasMaxLength(12).IsRequired(false); entity.Property(e => e.TaxCode2).HasColumnName("tax_code2").HasMaxLength(12).IsRequired(false); entity.Property(e => e.Pricecode).HasColumnName("pricecode").HasMaxLength(6).IsRequired(false); - entity.Property(e => e.ShipEarly).HasColumnName("ship_early").HasColumnType("tinyint").HasDefaultValueSql("1"); - entity.Property(e => e.ShipPartial).HasColumnName("ship_partial").HasColumnType("tinyint").HasDefaultValueSql("1"); + entity.Property(e => e.ShipEarly).HasColumnName("ship_early").HasColumnType("tinyint") + .HasDefaultValueSql("1"); + entity.Property(e => e.ShipPartial).HasColumnName("ship_partial").HasColumnType("tinyint") + .HasDefaultValueSql("1"); entity.Property(e => e.LangCode).HasColumnName("lang_code").HasMaxLength(6).IsRequired(false); entity.Property(e => e.EndUserType).HasColumnName("end_user_type").HasMaxLength(6).IsRequired(false); entity.Property(e => e.ShipSite).HasColumnName("ship_site").HasMaxLength(16).IsRequired(false); - entity.Property(e => e.LcrReqd).HasColumnName("lcr_reqd").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.LcrReqd).HasColumnName("lcr_reqd").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.CustBank).HasColumnName("cust_bank").HasMaxLength(8).IsRequired(false); - entity.Property(e => e.DraftPrintFlag).HasColumnName("draft_print_flag").HasColumnType("tinyint").HasDefaultValueSql("0"); - entity.Property(e => e.RcvInternalEmail).HasColumnName("rcv_internal_email").HasColumnType("tinyint").HasDefaultValueSql("0"); - entity.Property(e => e.CustomerEmailAddr).HasColumnName("customer_email_addr").HasMaxLength(60).IsRequired(false); - entity.Property(e => e.SendCustomerEmail).HasColumnName("send_customer_email").HasColumnType("tinyint").HasDefaultValueSql("0"); - entity.Property(e => e.ApsPullUp).HasColumnName("aps_pull_up").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.DraftPrintFlag).HasColumnName("draft_print_flag").HasColumnType("tinyint") + .HasDefaultValueSql("0"); + entity.Property(e => e.RcvInternalEmail).HasColumnName("rcv_internal_email").HasColumnType("tinyint") + .HasDefaultValueSql("0"); + entity.Property(e => e.CustomerEmailAddr).HasColumnName("customer_email_addr").HasMaxLength(60) + .IsRequired(false); + entity.Property(e => e.SendCustomerEmail).HasColumnName("send_customer_email").HasColumnType("tinyint") + .HasDefaultValueSql("0"); + entity.Property(e => e.ApsPullUp).HasColumnName("aps_pull_up").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.DoInvoice).HasColumnName("do_invoice").HasMaxLength(1).HasDefaultValueSql("'S'"); - entity.Property(e => e.Consolidate).HasColumnName("consolidate").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.Consolidate).HasColumnName("consolidate").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.InvFreq).HasColumnName("inv_freq").HasMaxLength(1).HasDefaultValueSql("'W'"); - entity.Property(e => e.Summarize).HasColumnName("summarize").HasColumnType("tinyint").HasDefaultValueSql("0"); - entity.Property(e => e.NoteExistsFlag).HasColumnName("NoteExistsFlag").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.Summarize).HasColumnName("summarize").HasColumnType("tinyint") + .HasDefaultValueSql("0"); + entity.Property(e => e.NoteExistsFlag).HasColumnName("NoteExistsFlag").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.RecordDate).HasColumnName("RecordDate").HasDefaultValueSql("getdate()"); - entity.Property(e => e.RowPointer).HasColumnName("RowPointer").HasColumnType("uniqueidentifier").HasDefaultValueSql("newid()"); - entity.Property(e => e.Einvoice).HasColumnName("einvoice").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.RowPointer).HasColumnName("RowPointer").HasColumnType("uniqueidentifier") + .HasDefaultValueSql("newid()"); + entity.Property(e => e.Einvoice).HasColumnName("einvoice").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.OrderBal).HasColumnName("order_bal").HasDefaultValueSql("0").IsRequired(false); entity.Property(e => e.PostedBal).HasColumnName("posted_bal").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.CreatedBy).HasColumnName("CreatedBy").HasMaxLength(60).HasDefaultValueSql("suser_sname()"); - entity.Property(e => e.UpdatedBy).HasColumnName("UpdatedBy").HasMaxLength(60).HasDefaultValueSql("suser_sname()"); + entity.Property(e => e.CreatedBy).HasColumnName("CreatedBy").HasMaxLength(60) + .HasDefaultValueSql("suser_sname()"); + entity.Property(e => e.UpdatedBy).HasColumnName("UpdatedBy").HasMaxLength(60) + .HasDefaultValueSql("suser_sname()"); entity.Property(e => e.CreateDate).HasColumnName("CreateDate").HasDefaultValueSql("getdate()"); entity.Property(e => e.CrmGuid).HasColumnName("crm_guid").HasMaxLength(36).IsRequired(false); - entity.Property(e => e.InWorkflow).HasColumnName("InWorkflow").HasColumnType("tinyint").HasDefaultValueSql("0"); - entity.Property(e => e.PrintPackInv).HasColumnName("print_pack_inv").HasColumnType("tinyint").HasDefaultValueSql("0"); - entity.Property(e => e.OnePackInv).HasColumnName("one_pack_inv").HasColumnType("tinyint").HasDefaultValueSql("0"); - entity.Property(e => e.InvCategory).HasColumnName("inv_category").HasMaxLength(20).HasDefaultValueSql("'DEFAULTCATEGORY'"); - entity.Property(e => e.IncludeTaxInPrice).HasColumnName("include_tax_in_price").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.InWorkflow).HasColumnName("InWorkflow").HasColumnType("tinyint") + .HasDefaultValueSql("0"); + entity.Property(e => e.PrintPackInv).HasColumnName("print_pack_inv").HasColumnType("tinyint") + .HasDefaultValueSql("0"); + entity.Property(e => e.OnePackInv).HasColumnName("one_pack_inv").HasColumnType("tinyint") + .HasDefaultValueSql("0"); + entity.Property(e => e.InvCategory).HasColumnName("inv_category").HasMaxLength(20) + .HasDefaultValueSql("'DEFAULTCATEGORY'"); + entity.Property(e => e.IncludeTaxInPrice).HasColumnName("include_tax_in_price").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.TransNat2).HasColumnName("trans_nat_2").HasMaxLength(4).IsRequired(false); - entity.Property(e => e.UseRevisionPayDays).HasColumnName("use_revision_pay_days").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.UseRevisionPayDays).HasColumnName("use_revision_pay_days") + .HasColumnType("tinyint").HasDefaultValueSql("0"); entity.Property(e => e.RevisionDay).HasColumnName("revision_day").IsRequired(false); - entity.Property(e => e.RevisionDayStartTime1).HasColumnName("revision_day_start_time##1").IsRequired(false); - entity.Property(e => e.RevisionDayStartTime2).HasColumnName("revision_day_start_time##2").IsRequired(false); + entity.Property(e => e.RevisionDayStartTime1).HasColumnName("revision_day_start_time##1") + .IsRequired(false); + entity.Property(e => e.RevisionDayStartTime2).HasColumnName("revision_day_start_time##2") + .IsRequired(false); entity.Property(e => e.RevisionDayEndTime1).HasColumnName("revision_day_end_time##1").IsRequired(false); entity.Property(e => e.RevisionDayEndTime2).HasColumnName("revision_day_end_time##2").IsRequired(false); entity.Property(e => e.PayDay).HasColumnName("pay_day").IsRequired(false); @@ -1446,35 +1483,58 @@ namespace SytelineSaAppEfDataModel entity.Property(e => e.PayDayStartTime2).HasColumnName("pay_day_start_time##2").IsRequired(false); entity.Property(e => e.PayDayEndTime1).HasColumnName("pay_day_end_time##1").IsRequired(false); entity.Property(e => e.PayDayEndTime2).HasColumnName("pay_day_end_time##2").IsRequired(false); - entity.Property(e => e.ExportType).HasColumnName("export_type").HasMaxLength(1).HasDefaultValueSql("'N'"); - entity.Property(e => e.ActiveForDataIntegration).HasColumnName("active_for_data_integration").HasColumnType("tinyint").HasDefaultValueSql("1"); - entity.Property(e => e.ShowInShipToDropDownList).HasColumnName("show_in_ship_to_drop_down_list").HasColumnType("tinyint").HasDefaultValueSql("1"); - entity.Property(e => e.ShowInDropDownList).HasColumnName("show_in_drop_down_list").HasColumnType("tinyint").HasDefaultValueSql("1"); + entity.Property(e => e.ExportType).HasColumnName("export_type").HasMaxLength(1) + .HasDefaultValueSql("'N'"); + entity.Property(e => e.ActiveForDataIntegration).HasColumnName("active_for_data_integration") + .HasColumnType("tinyint").HasDefaultValueSql("1"); + entity.Property(e => e.ShowInShipToDropDownList).HasColumnName("show_in_ship_to_drop_down_list") + .HasColumnType("tinyint").HasDefaultValueSql("1"); + entity.Property(e => e.ShowInDropDownList).HasColumnName("show_in_drop_down_list") + .HasColumnType("tinyint").HasDefaultValueSql("1"); entity.Property(e => e.SicCode).HasColumnName("sic_code").HasMaxLength(8).IsRequired(false); - entity.Property(e => e.NumberOfEmployees).HasColumnName("number_of_employees").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.CompanyRevenue).HasColumnName("company_revenue").HasDefaultValueSql("0").IsRequired(false); - entity.Property(e => e.TerritoryCode).HasColumnName("territory_code").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.NumberOfEmployees).HasColumnName("number_of_employees").HasDefaultValueSql("0") + .IsRequired(false); + entity.Property(e => e.CompanyRevenue).HasColumnName("company_revenue").HasDefaultValueSql("0") + .IsRequired(false); + entity.Property(e => e.TerritoryCode).HasColumnName("territory_code").HasMaxLength(10) + .IsRequired(false); entity.Property(e => e.SalesTeamId).HasColumnName("sales_team_id").HasMaxLength(10).IsRequired(false); - entity.Property(e => e.DaysShippedBeforeDueDateTolerance).HasColumnName("days_shipped_before_due_date_tolerance").IsRequired(false); - entity.Property(e => e.DaysShippedAfterDueDateTolerance).HasColumnName("days_shipped_after_due_date_tolerance").IsRequired(false); - entity.Property(e => e.ShippedOverOrderedQtyTolerance).HasColumnName("shipped_over_ordered_qty_tolerance").IsRequired(false); - entity.Property(e => e.ShippedUnderOrderedQtyTolerance).HasColumnName("shipped_under_ordered_qty_tolerance").IsRequired(false); + entity.Property(e => e.DaysShippedBeforeDueDateTolerance) + .HasColumnName("days_shipped_before_due_date_tolerance").IsRequired(false); + entity.Property(e => e.DaysShippedAfterDueDateTolerance) + .HasColumnName("days_shipped_after_due_date_tolerance").IsRequired(false); + entity.Property(e => e.ShippedOverOrderedQtyTolerance) + .HasColumnName("shipped_over_ordered_qty_tolerance").IsRequired(false); + entity.Property(e => e.ShippedUnderOrderedQtyTolerance) + .HasColumnName("shipped_under_ordered_qty_tolerance").IsRequired(false); entity.Property(e => e.DefaultShipTo).HasColumnName("default_ship_to").HasDefaultValueSql("0"); - entity.Property(e => e.IncludeOrdersInTaxRpt).HasColumnName("include_orders_in_tax_rpt").HasColumnType("tinyint").HasDefaultValueSql("0"); - entity.Property(e => e.ConstructiveSalePricePct).HasColumnName("constructive_sale_price_pct").IsRequired(false); + entity.Property(e => e.IncludeOrdersInTaxRpt).HasColumnName("include_orders_in_tax_rpt") + .HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.ConstructiveSalePricePct).HasColumnName("constructive_sale_price_pct") + .IsRequired(false); entity.Property(e => e.Uf_ZPL_FedId).HasColumnName("uf_ZPL_FedId").HasMaxLength(20).IsRequired(false); - entity.Property(e => e.Uf_ZPL_VATRegisterCode).HasColumnName("uf_ZPL_VATRegisterCode").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_ZPL_VATRegisterCode).HasColumnName("uf_ZPL_VATRegisterCode").HasMaxLength(20) + .IsRequired(false); entity.Property(e => e.Uf_INT_CustSeq).HasColumnName("Uf_INT_CustSeq").IsRequired(false); - entity.Property(e => e.Uf_INT_Replicate).HasColumnName("UF_INT_Replicate").HasColumnType("tinyint").HasDefaultValueSql("0"); + entity.Property(e => e.Uf_INT_Replicate).HasColumnName("UF_INT_Replicate").HasColumnType("tinyint") + .HasDefaultValueSql("0"); entity.Property(e => e.Uf_FKR_FA_SL_SYKOF).HasColumnName("Uf_FKR_FA_SL_SYKOF").IsRequired(false); - entity.Property(e => e.Uf_FKR_FA_Eksport_SYKOF).HasColumnName("Uf_FKR_FA_Eksport_SYKOF").HasColumnType("tinyint").IsRequired(false); - entity.Property(e => e.Uf_FKR_FA_Kod_Dostawcy_u_Klienta).HasColumnName("Uf_FKR_FA_Kod_Dostawcy_u_Klienta").HasMaxLength(20).IsRequired(false); - entity.Property(e => e.Uf_FKR_FA_Rampa).HasColumnName("Uf_FKR_FA_Rampa").HasMaxLength(20).IsRequired(false); - entity.Property(e => e.Uf_FKR_FA_Zaklad_Przeznaczenia).HasColumnName("Uf_FKR_FA_Zaklad_Przeznaczenia").HasMaxLength(100).IsRequired(false); - entity.Property(e => e.Uf_FKR_Customer_Status).HasColumnName("Uf_FKR_Customer_Status").HasMaxLength(1).IsRequired(false); - entity.Property(e => e.Uf_bpx_customer_printbatch).HasColumnName("Uf_bpx_customer_printbatch").HasColumnType("tinyint").IsRequired(false); - entity.Property(e => e.Uf_cust_receiver_line1).HasColumnName("Uf_cust_receiver_line1").HasMaxLength(100).IsRequired(false); - entity.Property(e => e.Uf_cust_receiver_line2).HasColumnName("Uf_cust_receiver_line2").HasMaxLength(100).IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Eksport_SYKOF).HasColumnName("Uf_FKR_FA_Eksport_SYKOF") + .HasColumnType("tinyint").IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Kod_Dostawcy_u_Klienta) + .HasColumnName("Uf_FKR_FA_Kod_Dostawcy_u_Klienta").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Rampa).HasColumnName("Uf_FKR_FA_Rampa").HasMaxLength(20) + .IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Zaklad_Przeznaczenia).HasColumnName("Uf_FKR_FA_Zaklad_Przeznaczenia") + .HasMaxLength(100).IsRequired(false); + entity.Property(e => e.Uf_FKR_Customer_Status).HasColumnName("Uf_FKR_Customer_Status").HasMaxLength(1) + .IsRequired(false); + entity.Property(e => e.Uf_bpx_customer_printbatch).HasColumnName("Uf_bpx_customer_printbatch") + .HasColumnType("tinyint").IsRequired(false); + entity.Property(e => e.Uf_cust_receiver_line1).HasColumnName("Uf_cust_receiver_line1").HasMaxLength(100) + .IsRequired(false); + entity.Property(e => e.Uf_cust_receiver_line2).HasColumnName("Uf_cust_receiver_line2").HasMaxLength(100) + .IsRequired(false); entity.Property(e => e.Uf_cust_supplier_no).HasColumnName("Uf_cust_supplier_no").IsRequired(false); entity.HasIndex(e => e.RowPointer).HasDatabaseName("IX_customer_RowPointer").IsUnique(); @@ -1588,7 +1648,7 @@ namespace SytelineSaAppEfDataModel entity.Property(e => e.DateOffset) .HasColumnName("date_offset") - .HasColumnType("int") + .HasColumnType("smallint") .HasDefaultValueSql("0") .IsRequired(false); diff --git a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj index bf38756..f12e45b 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj +++ b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj @@ -6,7 +6,7 @@ enable SytelineSaAppEfDataModel - 1.1 + 1.1.2 PK Data Manager for SYTELINE_SA_APP database MIT From a0c7c2f6aa3134367dc2c87ddd1a773c170676a0 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 21 Aug 2025 05:40:04 +0200 Subject: [PATCH 034/149] * Initial submit * First application draft --- FaKrosnoApi/Program.cs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index a9c4b67..315c376 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -69,19 +69,19 @@ builder.Services.AddOpenApiDocument(config => config.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer")); }); -builder.Services.AddHangfire(config => config - .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) - .UseSimpleAssemblyNameTypeSerializer() - .UseRecommendedSerializerSettings() - .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions - { - CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), - SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), - QueuePollInterval = TimeSpan.Zero, - UseRecommendedIsolationLevel = true, - DisableGlobalLocks = true - })); -builder.Services.AddHangfireServer(); +// builder.Services.AddHangfire(config => config +// .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) +// .UseSimpleAssemblyNameTypeSerializer() +// .UseRecommendedSerializerSettings() +// .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions +// { +// CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), +// SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), +// QueuePollInterval = TimeSpan.Zero, +// UseRecommendedIsolationLevel = true, +// DisableGlobalLocks = true +// })); +// builder.Services.AddHangfireServer(); builder.Services.AddAutoMapper(typeof(FaKrosnoMappingProfile), typeof(SytelineSaAppMappingProfile), typeof(OrdersManagementMappingProfile)); From eb40cc35fe8707c444b240a368e3484773b10928 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 22 Aug 2025 06:47:09 +0200 Subject: [PATCH 035/149] * Added new Entity * Added new Controller --- FaKrosnoApi/Controllers/ItemController.cs | 17 ++ FaKrosnoApi/Program.cs | 32 +-- SytelineSaAppEfDataModel/Dtos/ItemDto.cs | 227 +++++++++++++++ SytelineSaAppEfDataModel/Entities/Item.cs | 227 +++++++++++++++ SytelineSaAppEfDataModel/MappingProfile.cs | 1 + .../Services/IItemService.cs | 8 + .../Services/ItemService.cs | 14 + .../SytelineSaAppDbContext.cs | 260 ++++++++++++++++++ 8 files changed, 769 insertions(+), 17 deletions(-) create mode 100644 FaKrosnoApi/Controllers/ItemController.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/ItemDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/Item.cs create mode 100644 SytelineSaAppEfDataModel/Services/IItemService.cs create mode 100644 SytelineSaAppEfDataModel/Services/ItemService.cs diff --git a/FaKrosnoApi/Controllers/ItemController.cs b/FaKrosnoApi/Controllers/ItemController.cs new file mode 100644 index 0000000..5142b7a --- /dev/null +++ b/FaKrosnoApi/Controllers/ItemController.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class ItemController(IItemService service) : Controller +{ + [HttpGet("by-number")] + public async Task> Get([FromQuery] string itemNumber) + { + ItemDto item = await service.GetItem(itemNumber); + return Ok(item); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index 315c376..2784783 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -1,13 +1,10 @@ using Microsoft.EntityFrameworkCore; -using Microsoft.IdentityModel.Tokens; -using System.Text; using FaKrosnoApi.Models; using FaKrosnoApi.Services; using FaKrosnoEfDataModel; using FaKrosnoEfDataModel.Services; using Hangfire; using Hangfire.SqlServer; -using Microsoft.AspNetCore.Authentication.JwtBearer; using OrdersManagementDataModel; using OrdersManagementDataModel.Services; using SytelineSaAppEfDataModel; @@ -69,19 +66,19 @@ builder.Services.AddOpenApiDocument(config => config.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer")); }); -// builder.Services.AddHangfire(config => config -// .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) -// .UseSimpleAssemblyNameTypeSerializer() -// .UseRecommendedSerializerSettings() -// .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions -// { -// CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), -// SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), -// QueuePollInterval = TimeSpan.Zero, -// UseRecommendedIsolationLevel = true, -// DisableGlobalLocks = true -// })); -// builder.Services.AddHangfireServer(); +builder.Services.AddHangfire(config => config + .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) + .UseSimpleAssemblyNameTypeSerializer() + .UseRecommendedSerializerSettings() + .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions + { + CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), + SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), + QueuePollInterval = TimeSpan.Zero, + UseRecommendedIsolationLevel = true, + DisableGlobalLocks = true + })); +builder.Services.AddHangfireServer(); builder.Services.AddAutoMapper(typeof(FaKrosnoMappingProfile), typeof(SytelineSaAppMappingProfile), typeof(OrdersManagementMappingProfile)); @@ -108,6 +105,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); @@ -125,6 +123,6 @@ app.UseAuthorization(); app.MapControllers(); -// app.UseHangfireDashboard(); +app.UseHangfireDashboard(); app.Run(); diff --git a/SytelineSaAppEfDataModel/Dtos/ItemDto.cs b/SytelineSaAppEfDataModel/Dtos/ItemDto.cs new file mode 100644 index 0000000..9bf8543 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/ItemDto.cs @@ -0,0 +1,227 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class ItemDto +{ + public string ItemCode { get; set; } + public string Description { get; set; } + public decimal? QtyAllocjob { get; set; } + public string UM { get; set; } + public int LeadTime { get; set; } + public decimal? LotSize { get; set; } + public decimal? QtyUsedYtd { get; set; } + public decimal? QtyMfgYtd { get; set; } + public string AbcCode { get; set; } + public string DrawingNbr { get; set; } + public string ProductCode { get; set; } + public string PMTCode { get; set; } + public string CostMethod { get; set; } + public decimal? LstLotSize { get; set; } + public decimal? UnitCost { get; set; } + public decimal? LstUCost { get; set; } + public decimal? AvgUCost { get; set; } + public string Job { get; set; } + public int? Suffix { get; set; } + public bool Stocked { get; set; } + public string MatlType { get; set; } + public string FamilyCode { get; set; } + public int? LowLevel { get; set; } + public DateTime? LastInv { get; set; } + public int? DaysSupply { get; set; } + public decimal? OrderMin { get; set; } + public decimal? OrderMult { get; set; } + public string PlanCode { get; set; } + public bool MpsFlag { get; set; } + public bool AcceptReq { get; set; } + public DateTime? ChangeDate { get; set; } + public string Revision { get; set; } + public bool PhantomFlag { get; set; } + public bool PlanFlag { get; set; } + public int PaperTime { get; set; } + public int DockTime { get; set; } + public decimal? AsmSetup { get; set; } + public decimal? AsmRun { get; set; } + public decimal? AsmMatl { get; set; } + public decimal? AsmTool { get; set; } + public decimal? AsmFixture { get; set; } + public decimal? AsmOther { get; set; } + public decimal? AsmFixed { get; set; } + public decimal? AsmVar { get; set; } + public decimal? AsmOutside { get; set; } + public decimal? CompSetup { get; set; } + public decimal? CompRun { get; set; } + public decimal? CompMatl { get; set; } + public decimal? CompTool { get; set; } + public decimal? CompFixture { get; set; } + public decimal? CompOther { get; set; } + public decimal? CompFixed { get; set; } + public decimal? CompVar { get; set; } + public decimal? CompOutside { get; set; } + public decimal? SubMatl { get; set; } + public decimal? ShrinkFact { get; set; } + public string AltItem { get; set; } + public decimal? UnitWeight { get; set; } + public string WeightUnits { get; set; } + public string Charfld4 { get; set; } + public decimal? CurUCost { get; set; } + public string FeatType { get; set; } + public int? VarLead { get; set; } + public string FeatStr { get; set; } + public int? NextConfig { get; set; } + public string FeatTempl { get; set; } + public bool Backflush { get; set; } + public string Charfld1 { get; set; } + public string Charfld2 { get; set; } + public string Charfld3 { get; set; } + public decimal? Decifld1 { get; set; } + public decimal? Decifld2 { get; set; } + public decimal? Decifld3 { get; set; } + public bool Logifld { get; set; } + public DateTime? Datefld { get; set; } + public bool TrackEcn { get; set; } + public string CommCode { get; set; } + public string Origin { get; set; } + public decimal? UnitMatCost { get; set; } + public decimal? UnitDutyCost { get; set; } + public decimal? UnitFreightCost { get; set; } + public decimal? UnitBrokerageCost { get; set; } + public decimal? CurMatCost { get; set; } + public decimal? CurDutyCost { get; set; } + public decimal? CurFreightCost { get; set; } + public decimal? CurBrokerageCost { get; set; } + public string TaxCode1 { get; set; } + public string TaxCode2 { get; set; } + public string BflushLoc { get; set; } + public bool Reservable { get; set; } + public int? ShelfLife { get; set; } + public string LotPrefix { get; set; } + public string SerialPrefix { get; set; } + public int? SerialLength { get; set; } + public string IssueBy { get; set; } + public bool SerialTracked { get; set; } + public bool LotTracked { get; set; } + public string CostType { get; set; } + public decimal? MatlCost { get; set; } + public decimal? LbrCost { get; set; } + public decimal? FovhdCost { get; set; } + public decimal? VovhdCost { get; set; } + public decimal? OutCost { get; set; } + public decimal? CurMatlCost { get; set; } + public decimal? CurLbrCost { get; set; } + public decimal? CurFovhdCost { get; set; } + public decimal? CurVovhdCost { get; set; } + public decimal? CurOutCost { get; set; } + public decimal? AvgMatlCost { get; set; } + public decimal? AvgLbrCost { get; set; } + public decimal? AvgFovhdCost { get; set; } + public decimal? AvgVovhdCost { get; set; } + public decimal? AvgOutCost { get; set; } + public string ProdType { get; set; } + public decimal? RatePerDay { get; set; } + public int? MpsPlanFence { get; set; } + public bool PassReq { get; set; } + public bool LotGenExp { get; set; } + public string SupplySite { get; set; } + public string ProdMix { get; set; } + public string Stat { get; set; } + public string StatusChgUserCode { get; set; } + public DateTime? ChgDate { get; set; } + public string ReasonCode { get; set; } + public string SupplyWhse { get; set; } + public int? DuePeriod { get; set; } + public decimal? OrderMax { get; set; } + public bool MrpPart { get; set; } + public bool InfinitePart { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public int? SupplyToleranceHrs { get; set; } + public int ExpLeadTime { get; set; } + public int? VarExpLead { get; set; } + public string Buyer { get; set; } + public bool OrderConfigurable { get; set; } + public bool JobConfigurable { get; set; } + public string CfgModel { get; set; } + public string CoPostConfig { get; set; } + public string JobPostConfig { get; set; } + public string AutoJob { get; set; } + public string AutoPost { get; set; } + public string Setupgroup { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public bool InWorkflow { get; set; } + public bool MfgSupplySwitchingActive { get; set; } + public int? TimeFenceRule { get; set; } + public decimal? TimeFenceValue { get; set; } + public DateTime? EarliestPlannedPoReceipt { get; set; } + public bool UseReorderPoint { get; set; } + public decimal? ReorderPoint { get; set; } + public decimal? FixedOrderQty { get; set; } + public decimal? UnitInsuranceCost { get; set; } + public decimal? UnitLocFrtCost { get; set; } + public decimal? CurInsuranceCost { get; set; } + public decimal? CurLocFrtCost { get; set; } + public bool TaxFreeMatl { get; set; } + public int? TaxFreeDays { get; set; } + public decimal? SafetyStockPercent { get; set; } + public string TariffClassification { get; set; } + public DateTime Lowdate { get; set; } + public string RcptRqmt { get; set; } + public bool ActiveForDataIntegration { get; set; } + public decimal? RcvdOverPoQtyTolerance { get; set; } + public decimal? RcvdUnderPoQtyTolerance { get; set; } + public bool IncludeInNetChangePlanning { get; set; } + public bool Kit { get; set; } + public bool PrintKitComponents { get; set; } + public int? SafetyStockRule { get; set; } + public bool ShowInDropDownList { get; set; } + public bool ControlledByExternalIcs { get; set; } + public decimal? InventoryUclTolerance { get; set; } + public decimal? InventoryLclTolerance { get; set; } + public string SeparationAttribute { get; set; } + public decimal? BatchReleaseAttribute1 { get; set; } + public decimal? BatchReleaseAttribute2 { get; set; } + public decimal? BatchReleaseAttribute3 { get; set; } + public byte[] Picture { get; set; } + public bool ActiveForCustomerPortal { get; set; } + public bool Featured { get; set; } + public bool TopSeller { get; set; } + public string Overview { get; set; } + public bool PreassignLots { get; set; } + public bool PreassignSerials { get; set; } + public string AttrGroup { get; set; } + public string DimensionGroup { get; set; } + public string LotAttrGroup { get; set; } + public bool TrackPieces { get; set; } + public DateTime? BomLastImportDate { get; set; } + public bool SaveCurrentRevUponBomImport { get; set; } + public string NaftaPrefCrit { get; set; } + public bool SubjectToNaftaRvc { get; set; } + public bool Producer { get; set; } + public string NaftaCountryOfOrigin { get; set; } + public bool MustUseFutureRcptsBeforePln { get; set; } + public bool SubjectToExciseTax { get; set; } + public decimal? ExciseTaxPercent { get; set; } + public string Uf_PLT_AddItemDesc { get; set; } + public string Uf_PLT_Class { get; set; } + public string Uf_PLT_CNCode { get; set; } + public string Uf_PLT_Norm { get; set; } + public string Uf_PLT_OldItemID { get; set; } + public decimal? Uf_PLT_Volume { get; set; } + public string Uf_PLT_VolumeUnit { get; set; } + public bool Uf_INT_Replicate { get; set; } + public string BoxId { get; set; } + public decimal? ItemLength { get; set; } + public decimal? ItemFi { get; set; } + public int? BoxItemsCnt { get; set; } + public string Klient { get; set; } + public string Uf_FKR_FA_RodzajPozycji { get; set; } + public string Uf_Nr_Klienta { get; set; } + public int? Uf_FKR_FA_Items_Nr_Zmiany { get; set; } + public string Uf_FKR_FA_item_core { get; set; } + public string Uf_FKR_GTU { get; set; } + public int? Uf_FKR_FA_Ilosc_Na_Jedn_Pak { get; set; } + public int? Uf_Element_Ilosc_W_Palecie { get; set; } + public bool? Uf_PUDELKO { get; set; } + public string Uf_IMP_OrginalItem { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/Item.cs b/SytelineSaAppEfDataModel/Entities/Item.cs new file mode 100644 index 0000000..4705498 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/Item.cs @@ -0,0 +1,227 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class Item +{ + public string ItemCode { get; set; } + public string Description { get; set; } + public decimal? QtyAllocjob { get; set; } + public string UM { get; set; } + public int LeadTime { get; set; } + public decimal? LotSize { get; set; } + public decimal? QtyUsedYtd { get; set; } + public decimal? QtyMfgYtd { get; set; } + public string AbcCode { get; set; } + public string DrawingNbr { get; set; } + public string ProductCode { get; set; } + public string PMTCode { get; set; } + public string CostMethod { get; set; } + public decimal? LstLotSize { get; set; } + public decimal? UnitCost { get; set; } + public decimal? LstUCost { get; set; } + public decimal? AvgUCost { get; set; } + public string Job { get; set; } + public int? Suffix { get; set; } + public bool Stocked { get; set; } + public string MatlType { get; set; } + public string FamilyCode { get; set; } + public int? LowLevel { get; set; } + public DateTime? LastInv { get; set; } + public int? DaysSupply { get; set; } + public decimal? OrderMin { get; set; } + public decimal? OrderMult { get; set; } + public string PlanCode { get; set; } + public bool MpsFlag { get; set; } + public bool AcceptReq { get; set; } + public DateTime? ChangeDate { get; set; } + public string Revision { get; set; } + public bool PhantomFlag { get; set; } + public bool PlanFlag { get; set; } + public int PaperTime { get; set; } + public int DockTime { get; set; } + public decimal? AsmSetup { get; set; } + public decimal? AsmRun { get; set; } + public decimal? AsmMatl { get; set; } + public decimal? AsmTool { get; set; } + public decimal? AsmFixture { get; set; } + public decimal? AsmOther { get; set; } + public decimal? AsmFixed { get; set; } + public decimal? AsmVar { get; set; } + public decimal? AsmOutside { get; set; } + public decimal? CompSetup { get; set; } + public decimal? CompRun { get; set; } + public decimal? CompMatl { get; set; } + public decimal? CompTool { get; set; } + public decimal? CompFixture { get; set; } + public decimal? CompOther { get; set; } + public decimal? CompFixed { get; set; } + public decimal? CompVar { get; set; } + public decimal? CompOutside { get; set; } + public decimal? SubMatl { get; set; } + public decimal? ShrinkFact { get; set; } + public string AltItem { get; set; } + public decimal? UnitWeight { get; set; } + public string WeightUnits { get; set; } + public string Charfld4 { get; set; } + public decimal? CurUCost { get; set; } + public string FeatType { get; set; } + public int? VarLead { get; set; } + public string FeatStr { get; set; } + public int? NextConfig { get; set; } + public string FeatTempl { get; set; } + public bool Backflush { get; set; } + public string Charfld1 { get; set; } + public string Charfld2 { get; set; } + public string Charfld3 { get; set; } + public decimal? Decifld1 { get; set; } + public decimal? Decifld2 { get; set; } + public decimal? Decifld3 { get; set; } + public bool Logifld { get; set; } + public DateTime? Datefld { get; set; } + public bool TrackEcn { get; set; } + public string CommCode { get; set; } + public string Origin { get; set; } + public decimal? UnitMatCost { get; set; } + public decimal? UnitDutyCost { get; set; } + public decimal? UnitFreightCost { get; set; } + public decimal? UnitBrokerageCost { get; set; } + public decimal? CurMatCost { get; set; } + public decimal? CurDutyCost { get; set; } + public decimal? CurFreightCost { get; set; } + public decimal? CurBrokerageCost { get; set; } + public string TaxCode1 { get; set; } + public string TaxCode2 { get; set; } + public string BflushLoc { get; set; } + public bool Reservable { get; set; } + public int? ShelfLife { get; set; } + public string LotPrefix { get; set; } + public string SerialPrefix { get; set; } + public int? SerialLength { get; set; } + public string IssueBy { get; set; } + public bool SerialTracked { get; set; } + public bool LotTracked { get; set; } + public string CostType { get; set; } + public decimal? MatlCost { get; set; } + public decimal? LbrCost { get; set; } + public decimal? FovhdCost { get; set; } + public decimal? VovhdCost { get; set; } + public decimal? OutCost { get; set; } + public decimal? CurMatlCost { get; set; } + public decimal? CurLbrCost { get; set; } + public decimal? CurFovhdCost { get; set; } + public decimal? CurVovhdCost { get; set; } + public decimal? CurOutCost { get; set; } + public decimal? AvgMatlCost { get; set; } + public decimal? AvgLbrCost { get; set; } + public decimal? AvgFovhdCost { get; set; } + public decimal? AvgVovhdCost { get; set; } + public decimal? AvgOutCost { get; set; } + public string ProdType { get; set; } + public decimal? RatePerDay { get; set; } + public int? MpsPlanFence { get; set; } + public bool PassReq { get; set; } + public bool LotGenExp { get; set; } + public string SupplySite { get; set; } + public string ProdMix { get; set; } + public string Stat { get; set; } + public string StatusChgUserCode { get; set; } + public DateTime? ChgDate { get; set; } + public string ReasonCode { get; set; } + public string SupplyWhse { get; set; } + public int? DuePeriod { get; set; } + public decimal? OrderMax { get; set; } + public bool MrpPart { get; set; } + public bool InfinitePart { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public int? SupplyToleranceHrs { get; set; } + public int ExpLeadTime { get; set; } + public int? VarExpLead { get; set; } + public string Buyer { get; set; } + public bool OrderConfigurable { get; set; } + public bool JobConfigurable { get; set; } + public string CfgModel { get; set; } + public string CoPostConfig { get; set; } + public string JobPostConfig { get; set; } + public string AutoJob { get; set; } + public string AutoPost { get; set; } + public string Setupgroup { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public bool InWorkflow { get; set; } + public bool MfgSupplySwitchingActive { get; set; } + public int? TimeFenceRule { get; set; } + public decimal? TimeFenceValue { get; set; } + public DateTime? EarliestPlannedPoReceipt { get; set; } + public bool UseReorderPoint { get; set; } + public decimal? ReorderPoint { get; set; } + public decimal? FixedOrderQty { get; set; } + public decimal? UnitInsuranceCost { get; set; } + public decimal? UnitLocFrtCost { get; set; } + public decimal? CurInsuranceCost { get; set; } + public decimal? CurLocFrtCost { get; set; } + public bool TaxFreeMatl { get; set; } + public int? TaxFreeDays { get; set; } + public decimal? SafetyStockPercent { get; set; } + public string TariffClassification { get; set; } + public DateTime Lowdate { get; set; } + public string RcptRqmt { get; set; } + public bool ActiveForDataIntegration { get; set; } + public decimal? RcvdOverPoQtyTolerance { get; set; } + public decimal? RcvdUnderPoQtyTolerance { get; set; } + public bool IncludeInNetChangePlanning { get; set; } + public bool Kit { get; set; } + public bool PrintKitComponents { get; set; } + public int? SafetyStockRule { get; set; } + public bool ShowInDropDownList { get; set; } + public bool ControlledByExternalIcs { get; set; } + public decimal? InventoryUclTolerance { get; set; } + public decimal? InventoryLclTolerance { get; set; } + public string SeparationAttribute { get; set; } + public decimal? BatchReleaseAttribute1 { get; set; } + public decimal? BatchReleaseAttribute2 { get; set; } + public decimal? BatchReleaseAttribute3 { get; set; } + public byte[] Picture { get; set; } + public bool ActiveForCustomerPortal { get; set; } + public bool Featured { get; set; } + public bool TopSeller { get; set; } + public string Overview { get; set; } + public bool PreassignLots { get; set; } + public bool PreassignSerials { get; set; } + public string AttrGroup { get; set; } + public string DimensionGroup { get; set; } + public string LotAttrGroup { get; set; } + public bool TrackPieces { get; set; } + public DateTime? BomLastImportDate { get; set; } + public bool SaveCurrentRevUponBomImport { get; set; } + public string NaftaPrefCrit { get; set; } + public bool SubjectToNaftaRvc { get; set; } + public bool Producer { get; set; } + public string NaftaCountryOfOrigin { get; set; } + public bool MustUseFutureRcptsBeforePln { get; set; } + public bool SubjectToExciseTax { get; set; } + public decimal? ExciseTaxPercent { get; set; } + public string Uf_PLT_AddItemDesc { get; set; } + public string Uf_PLT_Class { get; set; } + public string Uf_PLT_CNCode { get; set; } + public string Uf_PLT_Norm { get; set; } + public string Uf_PLT_OldItemID { get; set; } + public decimal? Uf_PLT_Volume { get; set; } + public string Uf_PLT_VolumeUnit { get; set; } + public bool Uf_INT_Replicate { get; set; } + public string BoxId { get; set; } + public decimal? ItemLength { get; set; } + public decimal? ItemFi { get; set; } + public int? BoxItemsCnt { get; set; } + public string Klient { get; set; } + public string Uf_FKR_FA_RodzajPozycji { get; set; } + public string Uf_Nr_Klienta { get; set; } + public int? Uf_FKR_FA_Items_Nr_Zmiany { get; set; } + public string Uf_FKR_FA_item_core { get; set; } + public string Uf_FKR_GTU { get; set; } + public int? Uf_FKR_FA_Ilosc_Na_Jedn_Pak { get; set; } + public int? Uf_Element_Ilosc_W_Palecie { get; set; } + public bool? Uf_PUDELKO { get; set; } + public string Uf_IMP_OrginalItem { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 91523ef..aec29a7 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -28,6 +28,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/IItemService.cs b/SytelineSaAppEfDataModel/Services/IItemService.cs new file mode 100644 index 0000000..8b40cbc --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IItemService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IItemService +{ + Task GetItem(string itemNumber); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/ItemService.cs b/SytelineSaAppEfDataModel/Services/ItemService.cs new file mode 100644 index 0000000..0d3cad5 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/ItemService.cs @@ -0,0 +1,14 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public class ItemService(SytelineSaAppDbContext context, IMapper mapper) : IItemService +{ + public async Task GetItem(string itemNumber) + { + var item = await context.Items.FirstOrDefaultAsync(x => x.ItemCode == itemNumber); + return mapper.Map(item); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index ec54a67..01a0ebe 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -27,6 +27,7 @@ namespace SytelineSaAppEfDataModel public DbSet EdiCustomerOrderImports { get; set; } public DbSet Customers { get; set; } public DbSet CustomerTps { get; set; } + public DbSet Items { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { @@ -1728,6 +1729,265 @@ namespace SytelineSaAppEfDataModel .HasDatabaseName("IX_cust_tp_RowPointer") .IsUnique(); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("item"); + + entity.HasKey(e => e.ItemCode); + + entity.Property(e => e.ItemCode).HasColumnName("item").HasMaxLength(60).IsRequired(); + entity.Property(e => e.Description).HasColumnName("description").HasMaxLength(60).IsRequired(false); + entity.Property(e => e.QtyAllocjob).HasColumnName("qty_allocjob").IsRequired(false); + entity.Property(e => e.UM).HasColumnName("u_m").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.LeadTime).HasColumnName("lead_time").IsRequired(); + entity.Property(e => e.LotSize).HasColumnName("lot_size").IsRequired(false); + entity.Property(e => e.QtyUsedYtd).HasColumnName("qty_used_ytd").IsRequired(false); + entity.Property(e => e.QtyMfgYtd).HasColumnName("qty_mfg_ytd").IsRequired(false); + entity.Property(e => e.AbcCode).HasColumnName("abc_code").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.DrawingNbr).HasColumnName("drawing_nbr").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.ProductCode).HasColumnName("product_code").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.PMTCode).HasColumnName("p_m_t_code").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.CostMethod).HasColumnName("cost_method").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.LstLotSize).HasColumnName("lst_lot_size").IsRequired(false); + entity.Property(e => e.UnitCost).HasColumnName("unit_cost").IsRequired(false); + entity.Property(e => e.LstUCost).HasColumnName("lst_u_cost").IsRequired(false); + entity.Property(e => e.AvgUCost).HasColumnName("avg_u_cost").IsRequired(false); + entity.Property(e => e.Job).HasColumnName("job").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.Suffix).HasColumnName("suffix").IsRequired(false); + entity.Property(e => e.Stocked).HasColumnName("stocked").HasColumnType("tinyint"); + entity.Property(e => e.MatlType).HasColumnName("matl_type").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.FamilyCode).HasColumnName("family_code").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.LowLevel).HasColumnName("low_level").IsRequired(false); + entity.Property(e => e.LastInv).HasColumnName("last_inv").IsRequired(false); + entity.Property(e => e.DaysSupply).HasColumnName("days_supply").IsRequired(false); + entity.Property(e => e.OrderMin).HasColumnName("order_min").IsRequired(false); + entity.Property(e => e.OrderMult).HasColumnName("order_mult").IsRequired(false); + entity.Property(e => e.PlanCode).HasColumnName("plan_code").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.MpsFlag).HasColumnName("mps_flag").HasColumnType("tinyint"); + entity.Property(e => e.AcceptReq).HasColumnName("accept_req").HasColumnType("tinyint"); + entity.Property(e => e.ChangeDate).HasColumnName("change_date").IsRequired(false); + entity.Property(e => e.Revision).HasColumnName("revision").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.PhantomFlag).HasColumnName("phantom_flag").HasColumnType("tinyint"); + entity.Property(e => e.PlanFlag).HasColumnName("plan_flag").HasColumnType("tinyint"); + entity.Property(e => e.PaperTime).HasColumnName("paper_time").IsRequired(); + entity.Property(e => e.DockTime).HasColumnName("dock_time").IsRequired(); + entity.Property(e => e.AsmSetup).HasColumnName("asm_setup").IsRequired(false); + entity.Property(e => e.AsmRun).HasColumnName("asm_run").IsRequired(false); + entity.Property(e => e.AsmMatl).HasColumnName("asm_matl").IsRequired(false); + entity.Property(e => e.AsmTool).HasColumnName("asm_tool").IsRequired(false); + entity.Property(e => e.AsmFixture).HasColumnName("asm_fixture").IsRequired(false); + entity.Property(e => e.AsmOther).HasColumnName("asm_other").IsRequired(false); + entity.Property(e => e.AsmFixed).HasColumnName("asm_fixed").IsRequired(false); + entity.Property(e => e.AsmVar).HasColumnName("asm_var").IsRequired(false); + entity.Property(e => e.AsmOutside).HasColumnName("asm_outside").IsRequired(false); + entity.Property(e => e.CompSetup).HasColumnName("comp_setup").IsRequired(false); + entity.Property(e => e.CompRun).HasColumnName("comp_run").IsRequired(false); + entity.Property(e => e.CompMatl).HasColumnName("comp_matl").IsRequired(false); + entity.Property(e => e.CompTool).HasColumnName("comp_tool").IsRequired(false); + entity.Property(e => e.CompFixture).HasColumnName("comp_fixture").IsRequired(false); + entity.Property(e => e.CompOther).HasColumnName("comp_other").IsRequired(false); + entity.Property(e => e.CompFixed).HasColumnName("comp_fixed").IsRequired(false); + entity.Property(e => e.CompVar).HasColumnName("comp_var").IsRequired(false); + entity.Property(e => e.CompOutside).HasColumnName("comp_outside").IsRequired(false); + entity.Property(e => e.SubMatl).HasColumnName("sub_matl").IsRequired(false); + entity.Property(e => e.ShrinkFact).HasColumnName("shrink_fact").IsRequired(false); + entity.Property(e => e.AltItem).HasColumnName("alt_item").HasMaxLength(60).IsRequired(false); + entity.Property(e => e.UnitWeight).HasColumnName("unit_weight").IsRequired(false); + entity.Property(e => e.WeightUnits).HasColumnName("weight_units").HasMaxLength(4).IsRequired(false); + entity.Property(e => e.Charfld4).HasColumnName("charfld4").HasMaxLength(40).IsRequired(false); + entity.Property(e => e.CurUCost).HasColumnName("cur_u_cost").IsRequired(false); + entity.Property(e => e.FeatType).HasColumnName("feat_type").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.VarLead).HasColumnName("var_lead").IsRequired(false); + entity.Property(e => e.FeatStr).HasColumnName("feat_str").HasMaxLength(255).IsRequired(false); + entity.Property(e => e.NextConfig).HasColumnName("next_config").IsRequired(false); + entity.Property(e => e.FeatTempl).HasColumnName("feat_templ").HasMaxLength(255).IsRequired(false); + entity.Property(e => e.Backflush).HasColumnName("backflush").HasColumnType("tinyint"); + entity.Property(e => e.Charfld1).HasColumnName("charfld1").HasMaxLength(40).IsRequired(false); + entity.Property(e => e.Charfld2).HasColumnName("charfld2").HasMaxLength(40).IsRequired(false); + entity.Property(e => e.Charfld3).HasColumnName("charfld3").HasMaxLength(40).IsRequired(false); + entity.Property(e => e.Decifld1).HasColumnName("decifld1").IsRequired(false); + entity.Property(e => e.Decifld2).HasColumnName("decifld2").IsRequired(false); + entity.Property(e => e.Decifld3).HasColumnName("decifld3").IsRequired(false); + entity.Property(e => e.Logifld).HasColumnName("logifld").HasColumnType("tinyint"); + entity.Property(e => e.Datefld).HasColumnName("datefld").IsRequired(false); + entity.Property(e => e.TrackEcn).HasColumnName("track_ecn").HasColumnType("tinyint"); + entity.Property(e => e.CommCode).HasColumnName("comm_code").HasMaxLength(12).IsRequired(false); + entity.Property(e => e.Origin).HasColumnName("origin").HasMaxLength(3).IsRequired(false); + entity.Property(e => e.UnitMatCost).HasColumnName("unit_mat_cost").IsRequired(false); + entity.Property(e => e.UnitDutyCost).HasColumnName("unit_duty_cost").IsRequired(false); + entity.Property(e => e.UnitFreightCost).HasColumnName("unit_freight_cost").IsRequired(false); + entity.Property(e => e.UnitBrokerageCost).HasColumnName("unit_brokerage_cost").IsRequired(false); + entity.Property(e => e.CurMatCost).HasColumnName("cur_mat_cost").IsRequired(false); + entity.Property(e => e.CurDutyCost).HasColumnName("cur_duty_cost").IsRequired(false); + entity.Property(e => e.CurFreightCost).HasColumnName("cur_freight_cost").IsRequired(false); + entity.Property(e => e.CurBrokerageCost).HasColumnName("cur_brokerage_cost").IsRequired(false); + entity.Property(e => e.TaxCode1).HasColumnName("tax_code1").HasMaxLength(12).IsRequired(false); + entity.Property(e => e.TaxCode2).HasColumnName("tax_code2").HasMaxLength(12).IsRequired(false); + entity.Property(e => e.BflushLoc).HasColumnName("bflush_loc").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Reservable).HasColumnName("reservable").HasColumnType("tinyint"); + entity.Property(e => e.ShelfLife).HasColumnName("shelf_life").IsRequired(false); + entity.Property(e => e.LotPrefix).HasColumnName("lot_prefix").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.SerialPrefix).HasColumnName("serial_prefix").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.SerialLength).HasColumnName("serial_length").IsRequired(false); + entity.Property(e => e.IssueBy).HasColumnName("issue_by").HasMaxLength(3).IsRequired(false); + entity.Property(e => e.SerialTracked).HasColumnName("serial_tracked").HasColumnType("tinyint"); + entity.Property(e => e.LotTracked).HasColumnName("lot_tracked").HasColumnType("tinyint"); + entity.Property(e => e.CostType).HasColumnName("cost_type").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.MatlCost).HasColumnName("matl_cost").IsRequired(false); + entity.Property(e => e.LbrCost).HasColumnName("lbr_cost").IsRequired(false); + entity.Property(e => e.FovhdCost).HasColumnName("fovhd_cost").IsRequired(false); + entity.Property(e => e.VovhdCost).HasColumnName("vovhd_cost").IsRequired(false); + entity.Property(e => e.OutCost).HasColumnName("out_cost").IsRequired(false); + entity.Property(e => e.CurMatlCost).HasColumnName("cur_matl_cost").IsRequired(false); + entity.Property(e => e.CurLbrCost).HasColumnName("cur_lbr_cost").IsRequired(false); + entity.Property(e => e.CurFovhdCost).HasColumnName("cur_fovhd_cost").IsRequired(false); + entity.Property(e => e.CurVovhdCost).HasColumnName("cur_vovhd_cost").IsRequired(false); + entity.Property(e => e.CurOutCost).HasColumnName("cur_out_cost").IsRequired(false); + entity.Property(e => e.AvgMatlCost).HasColumnName("avg_matl_cost").IsRequired(false); + entity.Property(e => e.AvgLbrCost).HasColumnName("avg_lbr_cost").IsRequired(false); + entity.Property(e => e.AvgFovhdCost).HasColumnName("avg_fovhd_cost").IsRequired(false); + entity.Property(e => e.AvgVovhdCost).HasColumnName("avg_vovhd_cost").IsRequired(false); + entity.Property(e => e.AvgOutCost).HasColumnName("avg_out_cost").IsRequired(false); + entity.Property(e => e.ProdType).HasColumnName("prod_type").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.RatePerDay).HasColumnName("rate_per_day").IsRequired(false); + entity.Property(e => e.MpsPlanFence).HasColumnName("mps_plan_fence").IsRequired(false); + entity.Property(e => e.PassReq).HasColumnName("pass_req").HasColumnType("tinyint"); + entity.Property(e => e.LotGenExp).HasColumnName("lot_gen_exp").HasColumnType("tinyint"); + entity.Property(e => e.SupplySite).HasColumnName("supply_site").HasMaxLength(16).IsRequired(false); + entity.Property(e => e.ProdMix).HasColumnName("prod_mix").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.Stat).HasColumnName("stat").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.StatusChgUserCode).HasColumnName("status_chg_user_code").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.ChgDate).HasColumnName("chg_date").IsRequired(false); + entity.Property(e => e.ReasonCode).HasColumnName("reason_code").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.SupplyWhse).HasColumnName("supply_whse").HasMaxLength(8).IsRequired(false); + entity.Property(e => e.DuePeriod).HasColumnName("due_period").IsRequired(false); + entity.Property(e => e.OrderMax).HasColumnName("order_max").IsRequired(false); + entity.Property(e => e.MrpPart).HasColumnName("mrp_part").HasColumnType("tinyint"); + entity.Property(e => e.InfinitePart).HasColumnName("infinite_part").HasColumnType("tinyint"); + entity.Property(e => e.NoteExistsFlag).HasColumnName("NoteExistsFlag").HasColumnType("tinyint"); + entity.Property(e => e.RecordDate).HasColumnName("RecordDate").IsRequired(); + entity.Property(e => e.RowPointer).HasColumnName("RowPointer").HasColumnType("uniqueidentifier").IsRequired(); + entity.Property(e => e.SupplyToleranceHrs).HasColumnName("supply_tolerance_hrs").IsRequired(false); + entity.Property(e => e.ExpLeadTime).HasColumnName("exp_lead_time").IsRequired(); + entity.Property(e => e.VarExpLead).HasColumnName("var_exp_lead").IsRequired(false); + entity.Property(e => e.Buyer).HasColumnName("buyer").HasMaxLength(60).IsRequired(false); + entity.Property(e => e.OrderConfigurable).HasColumnName("order_configurable").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.JobConfigurable).HasColumnName("job_configurable").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.CfgModel).HasColumnName("cfg_model").HasMaxLength(255).IsRequired(false); + entity.Property(e => e.CoPostConfig).HasColumnName("co_post_config").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.JobPostConfig).HasColumnName("job_post_config").HasMaxLength(1).IsRequired(false); + entity.Property(e => e.AutoJob).HasColumnName("auto_job").HasMaxLength(1).IsRequired(); + entity.Property(e => e.AutoPost).HasColumnName("auto_post").HasMaxLength(1).IsRequired(); + entity.Property(e => e.Setupgroup).HasColumnName("setupgroup").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.CreatedBy).HasColumnName("CreatedBy").HasMaxLength(60).IsRequired(); + entity.Property(e => e.UpdatedBy).HasColumnName("UpdatedBy").HasMaxLength(60).IsRequired(); + entity.Property(e => e.CreateDate).HasColumnName("CreateDate").IsRequired(); + entity.Property(e => e.InWorkflow).HasColumnName("InWorkflow").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.MfgSupplySwitchingActive).HasColumnName("mfg_supply_switching_active").HasColumnType("tinyint"); + entity.Property(e => e.TimeFenceRule).HasColumnName("time_fence_rule").IsRequired(false); + entity.Property(e => e.TimeFenceValue).HasColumnName("time_fence_value").IsRequired(false); + entity.Property(e => e.EarliestPlannedPoReceipt).HasColumnName("earliest_planned_po_receipt").IsRequired(false); + entity.Property(e => e.UseReorderPoint).HasColumnName("use_reorder_point").HasColumnType("tinyint"); + entity.Property(e => e.ReorderPoint).HasColumnName("reorder_point").IsRequired(false); + entity.Property(e => e.FixedOrderQty).HasColumnName("fixed_order_qty").IsRequired(false); + entity.Property(e => e.UnitInsuranceCost).HasColumnName("unit_insurance_cost").IsRequired(false); + entity.Property(e => e.UnitLocFrtCost).HasColumnName("unit_loc_frt_cost").IsRequired(false); + entity.Property(e => e.CurInsuranceCost).HasColumnName("cur_insurance_cost").IsRequired(false); + entity.Property(e => e.CurLocFrtCost).HasColumnName("cur_loc_frt_cost").IsRequired(false); + entity.Property(e => e.TaxFreeMatl).HasColumnName("tax_free_matl").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.TaxFreeDays).HasColumnName("tax_free_days").IsRequired(false); + entity.Property(e => e.SafetyStockPercent).HasColumnName("safety_stock_percent").IsRequired(); + entity.Property(e => e.TariffClassification).HasColumnName("tariff_classification").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Lowdate).HasColumnName("lowdate").IsRequired(); + entity.Property(e => e.RcptRqmt).HasColumnName("rcpt_rqmt").HasMaxLength(1).IsRequired(); + entity.Property(e => e.ActiveForDataIntegration).HasColumnName("active_for_data_integration").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.RcvdOverPoQtyTolerance).HasColumnName("rcvd_over_po_qty_tolerance").IsRequired(false); + entity.Property(e => e.RcvdUnderPoQtyTolerance).HasColumnName("rcvd_under_po_qty_tolerance").IsRequired(false); + entity.Property(e => e.IncludeInNetChangePlanning).HasColumnName("include_in_net_change_planning").HasColumnType("tinyint"); + entity.Property(e => e.Kit).HasColumnName("kit").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.PrintKitComponents).HasColumnName("print_kit_components").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.SafetyStockRule).HasColumnName("safety_stock_rule").IsRequired(false); + entity.Property(e => e.ShowInDropDownList).HasColumnName("show_in_drop_down_list").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.ControlledByExternalIcs).HasColumnName("controlled_by_external_ics").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.InventoryUclTolerance).HasColumnName("inventory_ucl_tolerance").IsRequired(false); + entity.Property(e => e.InventoryLclTolerance).HasColumnName("inventory_lcl_tolerance").IsRequired(false); + entity.Property(e => e.SeparationAttribute).HasColumnName("separation_attribute").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.BatchReleaseAttribute1).HasColumnName("batch_release_attribute1").IsRequired(false); + entity.Property(e => e.BatchReleaseAttribute2).HasColumnName("batch_release_attribute2").IsRequired(false); + entity.Property(e => e.BatchReleaseAttribute3).HasColumnName("batch_release_attribute3").IsRequired(false); + entity.Property(e => e.Picture).HasColumnName("picture").HasColumnType("image").IsRequired(false); + entity.Property(e => e.ActiveForCustomerPortal).HasColumnName("active_for_customer_portal").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.Featured).HasColumnName("featured").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.TopSeller).HasColumnName("top_seller").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.Overview).HasColumnName("overview").HasMaxLength(2000).IsRequired(false); + entity.Property(e => e.PreassignLots).HasColumnName("preassign_lots").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.PreassignSerials).HasColumnName("preassign_serials").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.AttrGroup).HasColumnName("attr_group").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.DimensionGroup).HasColumnName("dimension_group").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.LotAttrGroup).HasColumnName("lot_attr_group").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.TrackPieces).HasColumnName("track_pieces").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.BomLastImportDate).HasColumnName("bom_last_import_date").IsRequired(false); + entity.Property(e => e.SaveCurrentRevUponBomImport).HasColumnName("save_current_rev_upon_bom_import").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.NaftaPrefCrit).HasColumnName("nafta_pref_crit").HasMaxLength(2).IsRequired(false); + entity.Property(e => e.SubjectToNaftaRvc).HasColumnName("subject_to_nafta_rvc").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.Producer).HasColumnName("producer").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.NaftaCountryOfOrigin).HasColumnName("nafta_country_of_origin").HasMaxLength(3).IsRequired(false); + entity.Property(e => e.MustUseFutureRcptsBeforePln).HasColumnName("must_use_future_rcpts_before_pln").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.SubjectToExciseTax).HasColumnName("subject_to_excise_tax").HasColumnType("tinyint").IsRequired(); + entity.Property(e => e.ExciseTaxPercent).HasColumnName("excise_tax_percent").IsRequired(false); + entity.Property(e => e.Uf_PLT_AddItemDesc).HasColumnName("uf_PLT_AddItemDesc").HasMaxLength(60).IsRequired(false); + entity.Property(e => e.Uf_PLT_Class).HasColumnName("uf_PLT_Class").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_PLT_CNCode).HasColumnName("uf_PLT_CNCode").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_PLT_Norm).HasColumnName("uf_PLT_Norm").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_PLT_OldItemID).HasColumnName("uf_PLT_OldItemID").HasMaxLength(60).IsRequired(false); + entity.Property(e => e.Uf_PLT_Volume).HasColumnName("uf_PLT_Volume").IsRequired(false); + entity.Property(e => e.Uf_PLT_VolumeUnit).HasColumnName("uf_PLT_VolumeUnit").HasMaxLength(6).IsRequired(false); + entity.Property(e => e.Uf_INT_Replicate).HasColumnName("UF_INT_Replicate").HasColumnType("tinyint"); + entity.Property(e => e.BoxId).HasColumnName("box_id").HasMaxLength(3).IsRequired(false); + entity.Property(e => e.ItemLength).HasColumnName("item_length").HasColumnType("decimal(8,2)").IsRequired(false); + entity.Property(e => e.ItemFi).HasColumnName("item_fi").HasColumnType("decimal(8,2)").IsRequired(false); + entity.Property(e => e.BoxItemsCnt).HasColumnName("BoxItemsCnt").IsRequired(false); + entity.Property(e => e.Klient).HasColumnName("klient").HasMaxLength(10).IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_RodzajPozycji).HasColumnName("Uf_FKR_FA_RodzajPozycji").HasMaxLength(4).IsRequired(false); + entity.Property(e => e.Uf_Nr_Klienta).HasColumnName("Uf_Nr_Klienta").HasMaxLength(20).IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Items_Nr_Zmiany).HasColumnName("Uf_FKR_FA_Items_Nr_Zmiany").IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_item_core).HasColumnName("Uf_FKR_FA_item_core").HasMaxLength(30).IsRequired(false); + entity.Property(e => e.Uf_FKR_GTU).HasColumnName("Uf_FKR_GTU").HasMaxLength(15).IsRequired(false); + entity.Property(e => e.Uf_FKR_FA_Ilosc_Na_Jedn_Pak).HasColumnName("Uf_FKR_FA_Ilosc_Na_Jedn_Pak").IsRequired(false); + entity.Property(e => e.Uf_Element_Ilosc_W_Palecie).HasColumnName("Uf_Element_Ilosc_W_Palecie").IsRequired(false); + entity.Property(e => e.Uf_PUDELKO).HasColumnName("Uf_PUDELKO").HasColumnType("tinyint").IsRequired(false); + entity.Property(e => e.Uf_IMP_OrginalItem).HasColumnName("Uf_IMP_OrginalItem").HasMaxLength(60).IsRequired(false); + + // Indexes + entity.HasIndex(e => new { e.ItemCode, e.Lowdate, e.RcptRqmt, e.RowPointer }) + .HasDatabaseName("IX_item_item_lowdate") + .IsUnique(); + + entity.HasIndex(e => new { e.LowLevel, e.ItemCode }) + .HasDatabaseName("IX_item_level") + .IsUnique(); + + entity.HasIndex(e => new { e.PlanCode, e.ItemCode }) + .HasDatabaseName("IX_item_plan") + .IsUnique(); + + entity.HasIndex(e => new { e.ProductCode, e.ItemCode }) + .HasDatabaseName("IX_item_product") + .IsUnique(); + + entity.HasIndex(e => new { e.SerialTracked, e.ItemCode }) + .HasDatabaseName("IX_item_serial") + .IsUnique(); + + entity.HasIndex(e => new { e.UseReorderPoint, e.ItemCode }) + .HasDatabaseName("IX_item_use_reorder_point") + .IsUnique(); + + entity.HasIndex(e => e.RowPointer) + .HasDatabaseName("IX_item_RowPointer") + .IsUnique(); + }); } } } From 8c646d4bc77d45c60412d0bb5716e8022cd4dfb4 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 22 Aug 2025 07:01:13 +0200 Subject: [PATCH 036/149] * Added VatCodeAssociation --- .../VatCodeAssociationController.cs | 25 ++ FaKrosnoApi/Program.cs | 1 + .../Dtos/VatCodeAssociationDto.cs | 66 ++++ .../Entities/VatCodeAssociation.cs | 66 ++++ SytelineSaAppEfDataModel/MappingProfile.cs | 1 + .../Services/IVatCodeAssociationService.cs | 8 + .../Services/VatCodeAssociationService.cs | 14 + .../SytelineSaAppDbContext.cs | 311 ++++++++++++++++++ 8 files changed, 492 insertions(+) create mode 100644 FaKrosnoApi/Controllers/VatCodeAssociationController.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/VatCodeAssociationDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/VatCodeAssociation.cs create mode 100644 SytelineSaAppEfDataModel/Services/IVatCodeAssociationService.cs create mode 100644 SytelineSaAppEfDataModel/Services/VatCodeAssociationService.cs diff --git a/FaKrosnoApi/Controllers/VatCodeAssociationController.cs b/FaKrosnoApi/Controllers/VatCodeAssociationController.cs new file mode 100644 index 0000000..4c495d3 --- /dev/null +++ b/FaKrosnoApi/Controllers/VatCodeAssociationController.cs @@ -0,0 +1,25 @@ +using AutoMapper; +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class VatCodeAssociationController(IVatCodeAssociationService service, IMapper mapper) : Controller +{ + [HttpGet("by-parameters")] + public async Task> GetVatCodesAssociation(string customerDoInvoice, + string endUserType, string productCode) + { + var result = await service.GetVatCodesAssociation(customerDoInvoice, endUserType, productCode); + if (result == null) + { + return NotFound(); + } + + return Ok(mapper.Map(result)); + } + +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index 2784783..7dcbed3 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -106,6 +106,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); diff --git a/SytelineSaAppEfDataModel/Dtos/VatCodeAssociationDto.cs b/SytelineSaAppEfDataModel/Dtos/VatCodeAssociationDto.cs new file mode 100644 index 0000000..22ccfab --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/VatCodeAssociationDto.cs @@ -0,0 +1,66 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class VatCodeAssociationDto +{ + public string VATRegisterType { get; set; } + public string EndUserType { get; set; } + public string Category { get; set; } + public string ProdCode { get; set; } + public string TaxCode { get; set; } + public string VATRegisterCode { get; set; } + public bool InWorkflow { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public string Uf_ZPL_CodesCgsAcct { get; set; } + public string Uf_ZPL_CodesCgsAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCgsAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCgsAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCgsAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCgsDescription { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcct { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCgsFovhdDescription { get; set; } + public string Uf_ZPL_CodesCgsLbrAcct { get; set; } + public string Uf_ZPL_CodesCgsLbrAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCgsLbrAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCgsLbrAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCgsLbrAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCgsLbrDescription { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcct { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCgsVovhdDescription { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcct { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCOGVarsDescription { get; set; } + public string Uf_ZPL_CodesOutAcct { get; set; } + public string Uf_ZPL_CodesOutAcctUnit1 { get; set; } + public string Uf_ZPL_CodesOutAcctUnit2 { get; set; } + public string Uf_ZPL_CodesOutAcctUnit3 { get; set; } + public string Uf_ZPL_CodesOutAcctUnit4 { get; set; } + public string Uf_ZPL_CodesOutDescription { get; set; } + public string Uf_ZPL_CodesSaleDsAcct { get; set; } + public string Uf_ZPL_CodesSaleDsAcctUnit1 { get; set; } + public string Uf_ZPL_CodesSaleDsAcctUnit2 { get; set; } + public string Uf_ZPL_CodesSaleDsAcctUnit3 { get; set; } + public string Uf_ZPL_CodesSaleDsAcctUnit4 { get; set; } + public string Uf_ZPL_CodesSaleDsDescription { get; set; } + public string Uf_ZPL_CodesSalesAcct { get; set; } + public string Uf_ZPL_CodesSalesAcctUnit1 { get; set; } + public string Uf_ZPL_CodesSalesAcctUnit2 { get; set; } + public string Uf_ZPL_CodesSalesAcctUnit3 { get; set; } + public string Uf_ZPL_CodesSalesAcctUnit4 { get; set; } + public string Uf_ZPL_CodesSalesDescription { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/VatCodeAssociation.cs b/SytelineSaAppEfDataModel/Entities/VatCodeAssociation.cs new file mode 100644 index 0000000..5d24d0a --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/VatCodeAssociation.cs @@ -0,0 +1,66 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class VatCodeAssociation +{ + public string VATRegisterType { get; set; } + public string EndUserType { get; set; } + public string Category { get; set; } + public string ProdCode { get; set; } + public string TaxCode { get; set; } + public string VATRegisterCode { get; set; } + public bool InWorkflow { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public string Uf_ZPL_CodesCgsAcct { get; set; } + public string Uf_ZPL_CodesCgsAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCgsAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCgsAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCgsAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCgsDescription { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcct { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCgsFovhdAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCgsFovhdDescription { get; set; } + public string Uf_ZPL_CodesCgsLbrAcct { get; set; } + public string Uf_ZPL_CodesCgsLbrAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCgsLbrAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCgsLbrAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCgsLbrAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCgsLbrDescription { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcct { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCgsVovhdAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCgsVovhdDescription { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcct { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcctUnit1 { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcctUnit2 { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcctUnit3 { get; set; } + public string Uf_ZPL_CodesCOGSVarsAcctUnit4 { get; set; } + public string Uf_ZPL_CodesCOGVarsDescription { get; set; } + public string Uf_ZPL_CodesOutAcct { get; set; } + public string Uf_ZPL_CodesOutAcctUnit1 { get; set; } + public string Uf_ZPL_CodesOutAcctUnit2 { get; set; } + public string Uf_ZPL_CodesOutAcctUnit3 { get; set; } + public string Uf_ZPL_CodesOutAcctUnit4 { get; set; } + public string Uf_ZPL_CodesOutDescription { get; set; } + public string Uf_ZPL_CodesSaleDsAcct { get; set; } + public string Uf_ZPL_CodesSaleDsAcctUnit1 { get; set; } + public string Uf_ZPL_CodesSaleDsAcctUnit2 { get; set; } + public string Uf_ZPL_CodesSaleDsAcctUnit3 { get; set; } + public string Uf_ZPL_CodesSaleDsAcctUnit4 { get; set; } + public string Uf_ZPL_CodesSaleDsDescription { get; set; } + public string Uf_ZPL_CodesSalesAcct { get; set; } + public string Uf_ZPL_CodesSalesAcctUnit1 { get; set; } + public string Uf_ZPL_CodesSalesAcctUnit2 { get; set; } + public string Uf_ZPL_CodesSalesAcctUnit3 { get; set; } + public string Uf_ZPL_CodesSalesAcctUnit4 { get; set; } + public string Uf_ZPL_CodesSalesDescription { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index aec29a7..b3b81b3 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -29,6 +29,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/IVatCodeAssociationService.cs b/SytelineSaAppEfDataModel/Services/IVatCodeAssociationService.cs new file mode 100644 index 0000000..6bb52a0 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IVatCodeAssociationService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IVatCodeAssociationService +{ + Task GetVatCodesAssociation(string customerDoInvoice, string endUserType, string productCode); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/VatCodeAssociationService.cs b/SytelineSaAppEfDataModel/Services/VatCodeAssociationService.cs new file mode 100644 index 0000000..fa163a6 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/VatCodeAssociationService.cs @@ -0,0 +1,14 @@ +using AutoMapper; +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public class VatCodeAssociationService(SytelineSaAppDbContext context, IMapper mapper) : IVatCodeAssociationService +{ + public async Task GetVatCodesAssociation(string customerDoInvoice, string endUserType, + string productCode) + { + return await Task.FromResult(mapper.Map(context.VatCodeAssociations.FirstOrDefault(x => + x.VATRegisterType == customerDoInvoice && x.EndUserType == endUserType && x.ProdCode == productCode))); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 01a0ebe..a7fd0e6 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -28,6 +28,7 @@ namespace SytelineSaAppEfDataModel public DbSet Customers { get; set; } public DbSet CustomerTps { get; set; } public DbSet Items { get; set; } + public DbSet VatCodeAssociations { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { @@ -1988,6 +1989,316 @@ namespace SytelineSaAppEfDataModel .HasDatabaseName("IX_item_RowPointer") .IsUnique(); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("ZPL_VAT_CodesAssociations"); + + entity.HasKey(e => new { e.VATRegisterType, e.EndUserType, e.Category, e.ProdCode }); + + entity.Property(e => e.VATRegisterType) + .HasColumnName("VATRegisterType") + .HasMaxLength(20) + .IsRequired(); + + entity.Property(e => e.EndUserType) + .HasColumnName("end_user_type") + .HasMaxLength(6) + .IsRequired(); + + entity.Property(e => e.Category) + .HasColumnName("category") + .HasMaxLength(20) + .IsRequired(); + + entity.Property(e => e.ProdCode) + .HasColumnName("prod_code") + .HasMaxLength(10) + .IsRequired(); + + entity.Property(e => e.TaxCode) + .HasColumnName("tax_code") + .HasMaxLength(12) + .IsRequired(); + + entity.Property(e => e.VATRegisterCode) + .HasColumnName("VATRegisterCode") + .HasMaxLength(20) + .IsRequired(); + + entity.Property(e => e.InWorkflow) + .HasColumnName("InWorkflow") + .HasColumnType("tinyint") + .IsRequired(); + + entity.Property(e => e.NoteExistsFlag) + .HasColumnName("NoteExistsFlag") + .HasColumnType("tinyint") + .IsRequired(); + + entity.Property(e => e.RecordDate) + .HasColumnName("RecordDate") + .IsRequired(); + + entity.Property(e => e.RowPointer) + .HasColumnName("RowPointer") + .HasColumnType("uniqueidentifier") + .IsRequired(); + + entity.Property(e => e.CreatedBy) + .HasColumnName("CreatedBy") + .HasMaxLength(60) + .IsRequired(); + + entity.Property(e => e.UpdatedBy) + .HasColumnName("UpdatedBy") + .HasMaxLength(60) + .IsRequired(); + + entity.Property(e => e.CreateDate) + .HasColumnName("CreateDate") + .IsRequired(); + + entity.Property(e => e.Uf_ZPL_CodesCgsAcct) + .HasColumnName("uf_ZPL_CodesCgsAcct") + .HasMaxLength(12) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsAcctUnit1) + .HasColumnName("uf_ZPL_CodesCgsAcctUnit1") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsAcctUnit2) + .HasColumnName("uf_ZPL_CodesCgsAcctUnit2") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsAcctUnit3) + .HasColumnName("uf_ZPL_CodesCgsAcctUnit3") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsAcctUnit4) + .HasColumnName("uf_ZPL_CodesCgsAcctUnit4") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsDescription) + .HasColumnName("uf_ZPL_CodesCgsDescription") + .HasMaxLength(200) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsFovhdAcct) + .HasColumnName("uf_ZPL_CodesCgsFovhdAcct") + .HasMaxLength(12) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsFovhdAcctUnit1) + .HasColumnName("uf_ZPL_CodesCgsFovhdAcctUnit1") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsFovhdAcctUnit2) + .HasColumnName("uf_ZPL_CodesCgsFovhdAcctUnit2") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsFovhdAcctUnit3) + .HasColumnName("uf_ZPL_CodesCgsFovhdAcctUnit3") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsFovhdAcctUnit4) + .HasColumnName("uf_ZPL_CodesCgsFovhdAcctUnit4") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsFovhdDescription) + .HasColumnName("uf_ZPL_CodesCgsFovhdDescription") + .HasMaxLength(200) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsLbrAcct) + .HasColumnName("uf_ZPL_CodesCgsLbrAcct") + .HasMaxLength(12) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsLbrAcctUnit1) + .HasColumnName("uf_ZPL_CodesCgsLbrAcctUnit1") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsLbrAcctUnit2) + .HasColumnName("uf_ZPL_CodesCgsLbrAcctUnit2") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsLbrAcctUnit3) + .HasColumnName("uf_ZPL_CodesCgsLbrAcctUnit3") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsLbrAcctUnit4) + .HasColumnName("uf_ZPL_CodesCgsLbrAcctUnit4") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsLbrDescription) + .HasColumnName("uf_ZPL_CodesCgsLbrDescription") + .HasMaxLength(200) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsVovhdAcct) + .HasColumnName("uf_ZPL_CodesCgsVovhdAcct") + .HasMaxLength(12) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsVovhdAcctUnit1) + .HasColumnName("uf_ZPL_CodesCgsVovhdAcctUnit1") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsVovhdAcctUnit2) + .HasColumnName("uf_ZPL_CodesCgsVovhdAcctUnit2") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsVovhdAcctUnit3) + .HasColumnName("uf_ZPL_CodesCgsVovhdAcctUnit3") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsVovhdAcctUnit4) + .HasColumnName("uf_ZPL_CodesCgsVovhdAcctUnit4") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCgsVovhdDescription) + .HasColumnName("uf_ZPL_CodesCgsVovhdDescription") + .HasMaxLength(200) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCOGSVarsAcct) + .HasColumnName("uf_ZPL_CodesCOGSVarsAcct") + .HasMaxLength(12) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCOGSVarsAcctUnit1) + .HasColumnName("uf_ZPL_CodesCOGSVarsAcctUnit1") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCOGSVarsAcctUnit2) + .HasColumnName("uf_ZPL_CodesCOGSVarsAcctUnit2") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCOGSVarsAcctUnit3) + .HasColumnName("uf_ZPL_CodesCOGSVarsAcctUnit3") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCOGSVarsAcctUnit4) + .HasColumnName("uf_ZPL_CodesCOGSVarsAcctUnit4") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesCOGVarsDescription) + .HasColumnName("uf_ZPL_CodesCOGVarsDescription") + .HasMaxLength(200) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesOutAcct) + .HasColumnName("uf_ZPL_CodesOutAcct") + .HasMaxLength(12) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesOutAcctUnit1) + .HasColumnName("uf_ZPL_CodesOutAcctUnit1") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesOutAcctUnit2) + .HasColumnName("uf_ZPL_CodesOutAcctUnit2") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesOutAcctUnit3) + .HasColumnName("uf_ZPL_CodesOutAcctUnit3") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesOutAcctUnit4) + .HasColumnName("uf_ZPL_CodesOutAcctUnit4") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesOutDescription) + .HasColumnName("uf_ZPL_CodesOutDescription") + .HasMaxLength(200) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSaleDsAcct) + .HasColumnName("uf_ZPL_CodesSaleDsAcct") + .HasMaxLength(12) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSaleDsAcctUnit1) + .HasColumnName("uf_ZPL_CodesSaleDsAcctUnit1") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSaleDsAcctUnit2) + .HasColumnName("uf_ZPL_CodesSaleDsAcctUnit2") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSaleDsAcctUnit3) + .HasColumnName("uf_ZPL_CodesSaleDsAcctUnit3") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSaleDsAcctUnit4) + .HasColumnName("uf_ZPL_CodesSaleDsAcctUnit4") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSaleDsDescription) + .HasColumnName("uf_ZPL_CodesSaleDsDescription") + .HasMaxLength(200) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSalesAcct) + .HasColumnName("uf_ZPL_CodesSalesAcct") + .HasMaxLength(12) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSalesAcctUnit1) + .HasColumnName("uf_ZPL_CodesSalesAcctUnit1") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSalesAcctUnit2) + .HasColumnName("uf_ZPL_CodesSalesAcctUnit2") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSalesAcctUnit3) + .HasColumnName("uf_ZPL_CodesSalesAcctUnit3") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSalesAcctUnit4) + .HasColumnName("uf_ZPL_CodesSalesAcctUnit4") + .HasMaxLength(6) + .IsRequired(false); + + entity.Property(e => e.Uf_ZPL_CodesSalesDescription) + .HasColumnName("uf_ZPL_CodesSalesDescription") + .HasMaxLength(200) + .IsRequired(false); + }); } } } From 764ba68f56cb65fe90a2ffc1c02c4409c5e9be2b Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 22 Aug 2025 07:13:47 +0200 Subject: [PATCH 037/149] * Added ItemCustPriceAll entity --- .../Controllers/ItemCustPriceAllController.cs | 23 +++ FaKrosnoApi/Program.cs | 1 + .../Dtos/ItemCustPriceAllDto.cs | 39 ++++ .../Entities/ItemCustPriceAll.cs | 39 ++++ SytelineSaAppEfDataModel/MappingProfile.cs | 1 + .../Services/IItemCustPriceAllService.cs | 8 + .../Services/ItemCustPriceAllService.cs | 13 ++ .../SytelineSaAppDbContext.cs | 169 ++++++++++++++++++ 8 files changed, 293 insertions(+) create mode 100644 FaKrosnoApi/Controllers/ItemCustPriceAllController.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/ItemCustPriceAllDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/ItemCustPriceAll.cs create mode 100644 SytelineSaAppEfDataModel/Services/IItemCustPriceAllService.cs create mode 100644 SytelineSaAppEfDataModel/Services/ItemCustPriceAllService.cs diff --git a/FaKrosnoApi/Controllers/ItemCustPriceAllController.cs b/FaKrosnoApi/Controllers/ItemCustPriceAllController.cs new file mode 100644 index 0000000..deca1a9 --- /dev/null +++ b/FaKrosnoApi/Controllers/ItemCustPriceAllController.cs @@ -0,0 +1,23 @@ +using AutoMapper; +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class ItemCustPriceAllController(IItemCustPriceAllService service, IMapper mapper) : Controller +{ + [HttpGet("by-parameters")] + public async Task> GetItemCustPriceAll(string itemCode, string customerDoInvoice) + { + var result = await service.GetItemCustPriceAllAsync(itemCode, customerDoInvoice); + if (result == null) + { + return NotFound(); + } + + return Ok(mapper.Map(result)); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index 7dcbed3..6a75ea6 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -107,6 +107,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); diff --git a/SytelineSaAppEfDataModel/Dtos/ItemCustPriceAllDto.cs b/SytelineSaAppEfDataModel/Dtos/ItemCustPriceAllDto.cs new file mode 100644 index 0000000..262dd20 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/ItemCustPriceAllDto.cs @@ -0,0 +1,39 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class ItemCustPriceAllDto +{ + public string SiteRef { get; set; } + public string Item { get; set; } + public string CustNum { get; set; } + public int CustItemSeq { get; set; } + public DateTime EffectDate { get; set; } + public decimal? ContPrice { get; set; } + public decimal? BrkQty1 { get; set; } + public decimal? BrkQty2 { get; set; } + public decimal? BrkQty3 { get; set; } + public decimal? BrkQty4 { get; set; } + public decimal? BrkQty5 { get; set; } + public decimal? BrkPrice1 { get; set; } + public decimal? BrkPrice2 { get; set; } + public decimal? BrkPrice3 { get; set; } + public decimal? BrkPrice4 { get; set; } + public decimal? BrkPrice5 { get; set; } + public string BaseCode1 { get; set; } + public string BaseCode2 { get; set; } + public string BaseCode3 { get; set; } + public string BaseCode4 { get; set; } + public string BaseCode5 { get; set; } + public string DolPercent1 { get; set; } + public string DolPercent2 { get; set; } + public string DolPercent3 { get; set; } + public string DolPercent4 { get; set; } + public string DolPercent5 { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public bool InWorkflow { get; set; } + public bool IncludeTaxInPrice { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/ItemCustPriceAll.cs b/SytelineSaAppEfDataModel/Entities/ItemCustPriceAll.cs new file mode 100644 index 0000000..8862ed4 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/ItemCustPriceAll.cs @@ -0,0 +1,39 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class ItemCustPriceAll +{ + public string SiteRef { get; set; } + public string Item { get; set; } + public string CustNum { get; set; } + public int CustItemSeq { get; set; } + public DateTime EffectDate { get; set; } + public decimal? ContPrice { get; set; } + public decimal? BrkQty1 { get; set; } + public decimal? BrkQty2 { get; set; } + public decimal? BrkQty3 { get; set; } + public decimal? BrkQty4 { get; set; } + public decimal? BrkQty5 { get; set; } + public decimal? BrkPrice1 { get; set; } + public decimal? BrkPrice2 { get; set; } + public decimal? BrkPrice3 { get; set; } + public decimal? BrkPrice4 { get; set; } + public decimal? BrkPrice5 { get; set; } + public string BaseCode1 { get; set; } + public string BaseCode2 { get; set; } + public string BaseCode3 { get; set; } + public string BaseCode4 { get; set; } + public string BaseCode5 { get; set; } + public string DolPercent1 { get; set; } + public string DolPercent2 { get; set; } + public string DolPercent3 { get; set; } + public string DolPercent4 { get; set; } + public string DolPercent5 { get; set; } + public bool NoteExistsFlag { get; set; } + public DateTime RecordDate { get; set; } + public Guid RowPointer { get; set; } + public string CreatedBy { get; set; } + public string UpdatedBy { get; set; } + public DateTime CreateDate { get; set; } + public bool InWorkflow { get; set; } + public bool IncludeTaxInPrice { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index b3b81b3..9a27cfa 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -30,6 +30,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/IItemCustPriceAllService.cs b/SytelineSaAppEfDataModel/Services/IItemCustPriceAllService.cs new file mode 100644 index 0000000..c52f43e --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IItemCustPriceAllService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IItemCustPriceAllService +{ + Task GetItemCustPriceAllAsync(string item, string customerNumber); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/ItemCustPriceAllService.cs b/SytelineSaAppEfDataModel/Services/ItemCustPriceAllService.cs new file mode 100644 index 0000000..c0b0969 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/ItemCustPriceAllService.cs @@ -0,0 +1,13 @@ +using AutoMapper; +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public class ItemCustPriceAllService(SytelineSaAppDbContext context, IMapper mapper) : IItemCustPriceAllService +{ + public async Task GetItemCustPriceAllAsync(string item, string customerNumber) + { + return await Task.FromResult(mapper.Map(context.ItemCustPriceAlls + .OrderByDescending(x => x.EffectDate).FirstOrDefault(x => x.Item == item && x.CustNum == customerNumber))); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index a7fd0e6..8495b6f 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -29,6 +29,7 @@ namespace SytelineSaAppEfDataModel public DbSet CustomerTps { get; set; } public DbSet Items { get; set; } public DbSet VatCodeAssociations { get; set; } + public DbSet ItemCustPriceAlls { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { @@ -2299,6 +2300,174 @@ namespace SytelineSaAppEfDataModel .HasMaxLength(200) .IsRequired(false); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("itemcustprice_all"); + + entity.HasKey(e => new { e.SiteRef, e.Item, e.CustNum, e.CustItemSeq, e.EffectDate }); + + entity.Property(e => e.SiteRef) + .HasColumnName("site_ref") + .HasMaxLength(16) + .IsRequired(); + + entity.Property(e => e.Item) + .HasColumnName("item") + .HasMaxLength(60) + .IsRequired(); + + entity.Property(e => e.CustNum) + .HasColumnName("cust_num") + .HasMaxLength(14) + .IsRequired(); + + entity.Property(e => e.CustItemSeq) + .HasColumnName("cust_item_seq") + .HasColumnType("int") + .IsRequired(); + + entity.Property(e => e.EffectDate) + .HasColumnName("effect_date") + .IsRequired(); + + entity.Property(e => e.ContPrice) + .HasColumnName("cont_price") + .IsRequired(false); + + entity.Property(e => e.BrkQty1) + .HasColumnName("brk_qty##1") + .IsRequired(false); + + entity.Property(e => e.BrkQty2) + .HasColumnName("brk_qty##2") + .IsRequired(false); + + entity.Property(e => e.BrkQty3) + .HasColumnName("brk_qty##3") + .IsRequired(false); + + entity.Property(e => e.BrkQty4) + .HasColumnName("brk_qty##4") + .IsRequired(false); + + entity.Property(e => e.BrkQty5) + .HasColumnName("brk_qty##5") + .IsRequired(false); + + entity.Property(e => e.BrkPrice1) + .HasColumnName("brk_price##1") + .IsRequired(false); + + entity.Property(e => e.BrkPrice2) + .HasColumnName("brk_price##2") + .IsRequired(false); + + entity.Property(e => e.BrkPrice3) + .HasColumnName("brk_price##3") + .IsRequired(false); + + entity.Property(e => e.BrkPrice4) + .HasColumnName("brk_price##4") + .IsRequired(false); + + entity.Property(e => e.BrkPrice5) + .HasColumnName("brk_price##5") + .IsRequired(false); + + entity.Property(e => e.BaseCode1) + .HasColumnName("base_code##1") + .HasMaxLength(2) + .IsRequired(false); + + entity.Property(e => e.BaseCode2) + .HasColumnName("base_code##2") + .HasMaxLength(2) + .IsRequired(false); + + entity.Property(e => e.BaseCode3) + .HasColumnName("base_code##3") + .HasMaxLength(2) + .IsRequired(false); + + entity.Property(e => e.BaseCode4) + .HasColumnName("base_code##4") + .HasMaxLength(2) + .IsRequired(false); + + entity.Property(e => e.BaseCode5) + .HasColumnName("base_code##5") + .HasMaxLength(2) + .IsRequired(false); + + entity.Property(e => e.DolPercent1) + .HasColumnName("dol_percent##1") + .HasMaxLength(1) + .IsRequired(false); + + entity.Property(e => e.DolPercent2) + .HasColumnName("dol_percent##2") + .HasMaxLength(1) + .IsRequired(false); + + entity.Property(e => e.DolPercent3) + .HasColumnName("dol_percent##3") + .HasMaxLength(1) + .IsRequired(false); + + entity.Property(e => e.DolPercent4) + .HasColumnName("dol_percent##4") + .HasMaxLength(1) + .IsRequired(false); + + entity.Property(e => e.DolPercent5) + .HasColumnName("dol_percent##5") + .HasMaxLength(1) + .IsRequired(false); + + entity.Property(e => e.NoteExistsFlag) + .HasColumnName("NoteExistsFlag") + .HasColumnType("tinyint") + .IsRequired(); + + entity.Property(e => e.RecordDate) + .HasColumnName("RecordDate") + .IsRequired(); + + entity.Property(e => e.RowPointer) + .HasColumnName("RowPointer") + .HasColumnType("uniqueidentifier") + .IsRequired(); + + entity.Property(e => e.CreatedBy) + .HasColumnName("CreatedBy") + .HasMaxLength(60) + .IsRequired(); + + entity.Property(e => e.UpdatedBy) + .HasColumnName("UpdatedBy") + .HasMaxLength(60) + .IsRequired(); + + entity.Property(e => e.CreateDate) + .HasColumnName("CreateDate") + .IsRequired(); + + entity.Property(e => e.InWorkflow) + .HasColumnName("InWorkflow") + .HasColumnType("tinyint") + .IsRequired(); + + entity.Property(e => e.IncludeTaxInPrice) + .HasColumnName("include_tax_in_price") + .HasColumnType("tinyint") + .IsRequired(); + + // Index + entity.HasIndex(e => new { e.RowPointer, e.SiteRef }) + .HasDatabaseName("IX_itemcustprice_all_RowPointer") + .IsUnique(); + }); } } } From 9b13c8e099b1604cf1b6ae662eb5e3085c1960cb Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 22 Aug 2025 07:14:36 +0200 Subject: [PATCH 038/149] * Fixed Validator --- .../Controllers/HangfireJobsController.cs | 300 +++++++++--------- 1 file changed, 150 insertions(+), 150 deletions(-) diff --git a/FaKrosnoApi/Controllers/HangfireJobsController.cs b/FaKrosnoApi/Controllers/HangfireJobsController.cs index d2e754e..b016636 100644 --- a/FaKrosnoApi/Controllers/HangfireJobsController.cs +++ b/FaKrosnoApi/Controllers/HangfireJobsController.cs @@ -17,154 +17,154 @@ public class HangfireJobsController( ITaskSchedulerService service) : Controller { - public async Task>> GetJobsToRun() - { - IList jobsToRun = new List(); - - using (IStorageConnection? connection = jobStorage.GetConnection()) - { - IList? recurringJobs = connection.GetRecurringJobs(); - IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); - - foreach (var recurringJob in recurringJobs) - { - TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); - - if (taskScheduler != null) - { - jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, - recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); - } - } - } - - return Ok(jobsToRun); - } - - [HttpPost("run")] - public async Task RunJobs() - { - var jobsToRun = (await GetJobsToRun()).Value?.ToList(); - - if (jobsToRun == null || jobsToRun.Count == 0) - { - return BadRequest("Nie udało się pobrać zadań do uruchomienia."); - } - - foreach (var job in jobsToRun) - { - if (!string.IsNullOrEmpty(job.Path)) - { - recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, - new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - } - } - - return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); - } - - [HttpPost("add")] - public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) - { - var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler - { - Name = taskSchedulerDto.Name, - Path = taskSchedulerDto.Path, - CronOptions = taskSchedulerDto.CronOptions, - CreateDate = DateTime.UtcNow - }; - - int result = await service.AddTaskScheduler(taskSchedulerDto); - - if (result == 0) - { - return BadRequest("Nie udało się dodać zadania."); - } - - recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), - taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - - return Ok("Zadanie zostało dodane."); - } - - [HttpPost("delete")] - public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) - { - int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); - - if (result == 0) - { - return BadRequest("Nie udało się usunąć zadania."); - } - - recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); - - return Ok("Zadanie zostało usunięte."); - } - - [HttpGet] - public async Task>> GetTasks() - { - var tasks = await service.GetTaskSchedulers(); - - foreach (TaskSchedulerDto taskSchedulerDto in tasks) - { - var job = GetJob(taskSchedulerDto.Name); - taskSchedulerDto.LastExecution = job?.LastExecution; - taskSchedulerDto.NextExecution = job?.NextExecution; - } - - return Ok(tasks); - } - - [HttpGet("by-name")] - public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) - { - var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); - - if (taskSchedulerDto == null) return NotFound(); - - var job = GetJob(taskSchedulerDto.Name); - taskSchedulerDto.LastExecution = job?.LastExecution; - taskSchedulerDto.NextExecution = job?.NextExecution; - - return Ok(taskSchedulerDto); - } - - private RecurringJobDto? GetJob(string jobId) - { - using IStorageConnection? connection = jobStorage.GetConnection(); - IList? recurringJobs = connection.GetRecurringJobs(); - return recurringJobs.FirstOrDefault(x => x.Id == jobId); - } - - public void RunConsoleApplication(string pathToApp) - { - try - { - var process = new Process - { - StartInfo = new ProcessStartInfo - { - FileName = pathToApp, - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - CreateNoWindow = true, - WorkingDirectory = Path.GetDirectoryName(pathToApp) - } - }; - process.Start(); - string output = process.StandardOutput.ReadToEnd(); - string error = process.StandardError.ReadToEnd(); - process.WaitForExit(); - - Console.WriteLine($"Output: {output}"); - Console.WriteLine($"Error: {error}"); - } - catch (Exception ex) - { - Console.WriteLine($"Error executing console application: {ex.Message}"); - } - } + // public async Task>> GetJobsToRun() + // { + // IList jobsToRun = new List(); + // + // using (IStorageConnection? connection = jobStorage.GetConnection()) + // { + // IList? recurringJobs = connection.GetRecurringJobs(); + // IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); + // + // foreach (var recurringJob in recurringJobs) + // { + // TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); + // + // if (taskScheduler != null) + // { + // jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, + // recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); + // } + // } + // } + // + // return Ok(jobsToRun); + // } + // + // [HttpPost("run")] + // public async Task RunJobs() + // { + // var jobsToRun = (await GetJobsToRun()).Value?.ToList(); + // + // if (jobsToRun == null || jobsToRun.Count == 0) + // { + // return BadRequest("Nie udało się pobrać zadań do uruchomienia."); + // } + // + // foreach (var job in jobsToRun) + // { + // if (!string.IsNullOrEmpty(job.Path)) + // { + // recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, + // new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + // } + // } + // + // return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); + // } + // + // [HttpPost("add")] + // public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) + // { + // var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler + // { + // Name = taskSchedulerDto.Name, + // Path = taskSchedulerDto.Path, + // CronOptions = taskSchedulerDto.CronOptions, + // CreateDate = DateTime.UtcNow + // }; + // + // int result = await service.AddTaskScheduler(taskSchedulerDto); + // + // if (result == 0) + // { + // return BadRequest("Nie udało się dodać zadania."); + // } + // + // recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), + // taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + // + // return Ok("Zadanie zostało dodane."); + // } + // + // [HttpPost("delete")] + // public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) + // { + // int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); + // + // if (result == 0) + // { + // return BadRequest("Nie udało się usunąć zadania."); + // } + // + // recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); + // + // return Ok("Zadanie zostało usunięte."); + // } + // + // [HttpGet] + // public async Task>> GetTasks() + // { + // var tasks = await service.GetTaskSchedulers(); + // + // foreach (TaskSchedulerDto taskSchedulerDto in tasks) + // { + // var job = GetJob(taskSchedulerDto.Name); + // taskSchedulerDto.LastExecution = job?.LastExecution; + // taskSchedulerDto.NextExecution = job?.NextExecution; + // } + // + // return Ok(tasks); + // } + // + // [HttpGet("by-name")] + // public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) + // { + // var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); + // + // if (taskSchedulerDto == null) return NotFound(); + // + // var job = GetJob(taskSchedulerDto.Name); + // taskSchedulerDto.LastExecution = job?.LastExecution; + // taskSchedulerDto.NextExecution = job?.NextExecution; + // + // return Ok(taskSchedulerDto); + // } + // + // private RecurringJobDto? GetJob(string jobId) + // { + // using IStorageConnection? connection = jobStorage.GetConnection(); + // IList? recurringJobs = connection.GetRecurringJobs(); + // return recurringJobs.FirstOrDefault(x => x.Id == jobId); + // } + // + // public void RunConsoleApplication(string pathToApp) + // { + // try + // { + // var process = new Process + // { + // StartInfo = new ProcessStartInfo + // { + // FileName = pathToApp, + // UseShellExecute = false, + // RedirectStandardOutput = true, + // RedirectStandardError = true, + // CreateNoWindow = true, + // WorkingDirectory = Path.GetDirectoryName(pathToApp) + // } + // }; + // process.Start(); + // string output = process.StandardOutput.ReadToEnd(); + // string error = process.StandardError.ReadToEnd(); + // process.WaitForExit(); + // + // Console.WriteLine($"Output: {output}"); + // Console.WriteLine($"Error: {error}"); + // } + // catch (Exception ex) + // { + // Console.WriteLine($"Error executing console application: {ex.Message}"); + // } + // } } \ No newline at end of file From 3fd97b10eb54fda3cba5813bb6b47d02b9454b43 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 22 Aug 2025 07:20:42 +0200 Subject: [PATCH 039/149] * Added function to get LastOrderNumber --- FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs | 7 +++++++ .../Services/EdiCustomerOrderService.cs | 9 +++++++++ .../Services/IEdiCustomerOrderService.cs | 1 + 3 files changed, 17 insertions(+) diff --git a/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs b/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs index f3954ef..bb5fc86 100644 --- a/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs +++ b/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs @@ -30,6 +30,13 @@ namespace FaKrosnoApi.Controllers return scheduleOrder != null ? Ok(scheduleOrder) : NotFound(); } + [HttpGet("last-order-number")] + public async Task> GetLastOrderNumber() + { + int lastOrderNumber = await service.GetLastOrderNumber(); + return Ok(lastOrderNumber); + } + [HttpPost("send-to-syteline")] public async Task> SendOrderToSyteline([FromQuery] Guid customerOrderNumber) { diff --git a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs index a958d33..9cf2726 100644 --- a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs @@ -9,6 +9,15 @@ namespace SytelineSaAppEfDataModel.Services { public class EdiCustomerOrderService(SytelineSaAppDbContext context, IMapper mapper) : IEdiCustomerOrderService { + public async Task GetLastOrderNumber() + { + var lastOrderNumber = + (await context.EdiCustomerOrders.OrderByDescending(x => x.CustomerOrderNumber).FirstOrDefaultAsync()) + ?.CustomerOrderNumber[3..] ?? "0"; + + return int.Parse(lastOrderNumber); + } + public async Task> GetAll() { IList ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates diff --git a/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderService.cs index 1c61e65..72dff5a 100644 --- a/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderService.cs @@ -9,6 +9,7 @@ namespace SytelineSaAppEfDataModel.Services { public interface IEdiCustomerOrderService { + Task GetLastOrderNumber(); Task> GetAll(); Task> GetByDate(DateTime date); Task GetByOrderNumber(Guid orderNumber); From 81aae81016385765964901efff55bb31ec04b8a9 Mon Sep 17 00:00:00 2001 From: trencik91 Date: Sat, 23 Aug 2025 08:01:31 +0200 Subject: [PATCH 040/149] * Added Translator * Further development --- SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs index e11c8aa..3ff2624 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs @@ -89,18 +89,18 @@ namespace SytelineSaAppEfDataModel.Dtos public string DiscountType { get; set; } public decimal? DiscountAmount { get; set; } public string TransNatTwo { get; set; } - public string UfFkrEdiMessageRefNum { get; set; } + public string? UfFkrEdiMessageRefNum { get; set; } public string UfFkrEdiConsigneeAddress { get; set; } public string UfFkrEdiConsigneeName { get; set; } public string UfFkrEdiFileName { get; set; } public string UfFkrEdiBuyerDunsNumber { get; set; } public string Gate { get; set; } public string CustomerName { get; set; } - public string RecipientCode { get; set; } - public string SenderCode { get; set; } - public string SellerCode { get; set; } - public string DocType { get; set; } - public string BuyerCode { get; set; } + public string? RecipientCode { get; set; } + public string? SenderCode { get; set; } + public string? SellerCode { get; set; } + public string? DocType { get; set; } + public string? BuyerCode { get; set; } public string TranslatedStatus => TranslateStatus(Status); public string? SlOrderNumber => EdiCustomerOrderTranslates.MaxBy(x => x.CreatedDate)?.CoCoNum; From eb756eedec7c4e2f19d05b4b5239a44795879809 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sun, 24 Aug 2025 08:48:11 +0200 Subject: [PATCH 041/149] * Fixed Hangfire update jobs --- .../Controllers/HangfireJobsController.cs | 316 +++++++++--------- .../Components/Pages/Admin/Scheduler.razor | 14 + OrdersManagement/Services/HangfireService.cs | 6 + 3 files changed, 185 insertions(+), 151 deletions(-) diff --git a/FaKrosnoApi/Controllers/HangfireJobsController.cs b/FaKrosnoApi/Controllers/HangfireJobsController.cs index b016636..bccbc0d 100644 --- a/FaKrosnoApi/Controllers/HangfireJobsController.cs +++ b/FaKrosnoApi/Controllers/HangfireJobsController.cs @@ -2,7 +2,6 @@ using System.Diagnostics; using FaKrosnoApi.Models; using Hangfire; using Hangfire.Storage; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using OrdersManagementDataModel.Dtos; using OrdersManagementDataModel.Services; @@ -16,155 +15,170 @@ public class HangfireJobsController( IRecurringJobManager recurringJobManager, ITaskSchedulerService service) : Controller { + public async Task>> GetJobsToRun() + { + IList jobsToRun = new List(); - // public async Task>> GetJobsToRun() - // { - // IList jobsToRun = new List(); - // - // using (IStorageConnection? connection = jobStorage.GetConnection()) - // { - // IList? recurringJobs = connection.GetRecurringJobs(); - // IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); - // - // foreach (var recurringJob in recurringJobs) - // { - // TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); - // - // if (taskScheduler != null) - // { - // jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, - // recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); - // } - // } - // } - // - // return Ok(jobsToRun); - // } - // - // [HttpPost("run")] - // public async Task RunJobs() - // { - // var jobsToRun = (await GetJobsToRun()).Value?.ToList(); - // - // if (jobsToRun == null || jobsToRun.Count == 0) - // { - // return BadRequest("Nie udało się pobrać zadań do uruchomienia."); - // } - // - // foreach (var job in jobsToRun) - // { - // if (!string.IsNullOrEmpty(job.Path)) - // { - // recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, - // new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - // } - // } - // - // return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); - // } - // - // [HttpPost("add")] - // public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) - // { - // var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler - // { - // Name = taskSchedulerDto.Name, - // Path = taskSchedulerDto.Path, - // CronOptions = taskSchedulerDto.CronOptions, - // CreateDate = DateTime.UtcNow - // }; - // - // int result = await service.AddTaskScheduler(taskSchedulerDto); - // - // if (result == 0) - // { - // return BadRequest("Nie udało się dodać zadania."); - // } - // - // recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), - // taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - // - // return Ok("Zadanie zostało dodane."); - // } - // - // [HttpPost("delete")] - // public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) - // { - // int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); - // - // if (result == 0) - // { - // return BadRequest("Nie udało się usunąć zadania."); - // } - // - // recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); - // - // return Ok("Zadanie zostało usunięte."); - // } - // - // [HttpGet] - // public async Task>> GetTasks() - // { - // var tasks = await service.GetTaskSchedulers(); - // - // foreach (TaskSchedulerDto taskSchedulerDto in tasks) - // { - // var job = GetJob(taskSchedulerDto.Name); - // taskSchedulerDto.LastExecution = job?.LastExecution; - // taskSchedulerDto.NextExecution = job?.NextExecution; - // } - // - // return Ok(tasks); - // } - // - // [HttpGet("by-name")] - // public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) - // { - // var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); - // - // if (taskSchedulerDto == null) return NotFound(); - // - // var job = GetJob(taskSchedulerDto.Name); - // taskSchedulerDto.LastExecution = job?.LastExecution; - // taskSchedulerDto.NextExecution = job?.NextExecution; - // - // return Ok(taskSchedulerDto); - // } - // - // private RecurringJobDto? GetJob(string jobId) - // { - // using IStorageConnection? connection = jobStorage.GetConnection(); - // IList? recurringJobs = connection.GetRecurringJobs(); - // return recurringJobs.FirstOrDefault(x => x.Id == jobId); - // } - // - // public void RunConsoleApplication(string pathToApp) - // { - // try - // { - // var process = new Process - // { - // StartInfo = new ProcessStartInfo - // { - // FileName = pathToApp, - // UseShellExecute = false, - // RedirectStandardOutput = true, - // RedirectStandardError = true, - // CreateNoWindow = true, - // WorkingDirectory = Path.GetDirectoryName(pathToApp) - // } - // }; - // process.Start(); - // string output = process.StandardOutput.ReadToEnd(); - // string error = process.StandardError.ReadToEnd(); - // process.WaitForExit(); - // - // Console.WriteLine($"Output: {output}"); - // Console.WriteLine($"Error: {error}"); - // } - // catch (Exception ex) - // { - // Console.WriteLine($"Error executing console application: {ex.Message}"); - // } - // } + using (IStorageConnection? connection = jobStorage.GetConnection()) + { + IList? recurringJobs = connection.GetRecurringJobs(); + IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); + + foreach (var recurringJob in recurringJobs) + { + TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); + + if (taskScheduler != null) + { + jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, + recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); + } + } + } + + return Ok(jobsToRun); + } + + [HttpPost("run")] + public async Task RunJobs() + { + var jobsToRun = (await GetJobsToRun()).Value?.ToList(); + + if (jobsToRun == null || jobsToRun.Count == 0) + { + return BadRequest("Nie udało się pobrać zadań do uruchomienia."); + } + + foreach (var job in jobsToRun) + { + if (!string.IsNullOrEmpty(job.Path)) + { + recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, + new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + } + } + + return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); + } + + [HttpPost("add")] + public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) + { + var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler + { + Name = taskSchedulerDto.Name, + Path = taskSchedulerDto.Path, + CronOptions = taskSchedulerDto.CronOptions, + CreateDate = DateTime.UtcNow + }; + + int result = await service.AddTaskScheduler(taskSchedulerDto); + + if (result == 0) + { + return BadRequest("Nie udało się dodać zadania."); + } + + recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), + taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + + return Ok("Zadanie zostało dodane."); + } + + [HttpPost("delete")] + public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) + { + int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); + + if (result == 0) + { + return BadRequest("Nie udało się usunąć zadania."); + } + + recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); + + return Ok("Zadanie zostało usunięte."); + } + + [HttpPost("update")] + public async Task UpdateTask([FromBody] TaskSchedulerDto taskSchedulerDto) + { + int result = await service.UpdateTaskScheduler(taskSchedulerDto); + + if (result == 0) + { + return BadRequest("Nie udało się uaktualnic zadania."); + } + + recurringJobManager.AddOrUpdate(taskSchedulerDto.Name, () => RunConsoleApplication(taskSchedulerDto.Path), + taskSchedulerDto.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + + return Ok("Zadanie zostało zaktualizowane."); + } + + [HttpGet] + public async Task>> GetTasks() + { + var tasks = await service.GetTaskSchedulers(); + + foreach (TaskSchedulerDto taskSchedulerDto in tasks) + { + var job = GetJob(taskSchedulerDto.Name); + taskSchedulerDto.LastExecution = job?.LastExecution; + taskSchedulerDto.NextExecution = job?.NextExecution; + } + + return Ok(tasks); + } + + [HttpGet("by-name")] + public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) + { + var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); + + if (taskSchedulerDto == null) return NotFound(); + + var job = GetJob(taskSchedulerDto.Name); + taskSchedulerDto.LastExecution = job?.LastExecution; + taskSchedulerDto.NextExecution = job?.NextExecution; + + return Ok(taskSchedulerDto); + } + + private RecurringJobDto? GetJob(string jobId) + { + using IStorageConnection? connection = jobStorage.GetConnection(); + IList? recurringJobs = connection.GetRecurringJobs(); + return recurringJobs.FirstOrDefault(x => x.Id == jobId); + } + + public void RunConsoleApplication(string pathToApp) + { + try + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = pathToApp, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + WorkingDirectory = Path.GetDirectoryName(pathToApp) + } + }; + process.Start(); + string output = process.StandardOutput.ReadToEnd(); + string error = process.StandardError.ReadToEnd(); + process.WaitForExit(); + + Console.WriteLine($"Output: {output}"); + Console.WriteLine($"Error: {error}"); + } + catch (Exception ex) + { + Console.WriteLine($"Error executing console application: {ex.Message}"); + } + } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/Admin/Scheduler.razor b/OrdersManagement/Components/Pages/Admin/Scheduler.razor index 99ac7f1..46313e1 100644 --- a/OrdersManagement/Components/Pages/Admin/Scheduler.razor +++ b/OrdersManagement/Components/Pages/Admin/Scheduler.razor @@ -92,6 +92,17 @@ await LoadTasks(); } } + + private async Task UpdateTask(TaskSchedulerDto taskSchedulerDto) + { + var response = await HangfireService.UpdateTaskSchedulerAsync(taskSchedulerDto); + if (response == 1) + { + await LoadTasks(); + } + } + + private async Task LoadTasks() { @@ -108,6 +119,9 @@ case Action.Save when args.Data.Id == 0: await AddTask(args.Data); break; + case Action.Save when args.Data.Id != 0: + await UpdateTask(args.Data); + break; } } diff --git a/OrdersManagement/Services/HangfireService.cs b/OrdersManagement/Services/HangfireService.cs index 86701c1..05c12e2 100644 --- a/OrdersManagement/Services/HangfireService.cs +++ b/OrdersManagement/Services/HangfireService.cs @@ -28,4 +28,10 @@ public class HangfireService( HttpResponseMessage responseMessage = await PostAsJsonAsync("api/HangfireJobs/delete", taskSchedulerDto); return responseMessage.IsSuccessStatusCode ? 1 : 0; } + + public async Task UpdateTaskSchedulerAsync(TaskSchedulerDto taskSchedulerDto) + { + HttpResponseMessage responseMessage = await PostAsJsonAsync("api/HangfireJobs/update", taskSchedulerDto); + return responseMessage.IsSuccessStatusCode ? 1 : 0; + } } \ No newline at end of file From de9f6e53aa42a9696ff8d5d97812dc5387144fa5 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sun, 24 Aug 2025 10:29:27 +0200 Subject: [PATCH 042/149] * Extended Validator * Added new Services --- FaKrosnoApi/Program.cs | 28 ++++++++++---------- SytelineSaAppEfDataModel/Dtos/CustomerDto.cs | 4 +-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index 6a75ea6..476fa0e 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -66,19 +66,19 @@ builder.Services.AddOpenApiDocument(config => config.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer")); }); -builder.Services.AddHangfire(config => config - .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) - .UseSimpleAssemblyNameTypeSerializer() - .UseRecommendedSerializerSettings() - .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions - { - CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), - SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), - QueuePollInterval = TimeSpan.Zero, - UseRecommendedIsolationLevel = true, - DisableGlobalLocks = true - })); -builder.Services.AddHangfireServer(); +// builder.Services.AddHangfire(config => config +// .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) +// .UseSimpleAssemblyNameTypeSerializer() +// .UseRecommendedSerializerSettings() +// .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions +// { +// CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), +// SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), +// QueuePollInterval = TimeSpan.Zero, +// UseRecommendedIsolationLevel = true, +// DisableGlobalLocks = true +// })); +// builder.Services.AddHangfireServer(); builder.Services.AddAutoMapper(typeof(FaKrosnoMappingProfile), typeof(SytelineSaAppMappingProfile), typeof(OrdersManagementMappingProfile)); @@ -125,6 +125,6 @@ app.UseAuthorization(); app.MapControllers(); -app.UseHangfireDashboard(); +//app.UseHangfireDashboard(); app.Run(); diff --git a/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs b/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs index 101ba65..3215118 100644 --- a/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs @@ -1,6 +1,6 @@ namespace SytelineSaAppEfDataModel.Dtos; -public class CustomerDto +public class CustomerDto : DtoBase { public string CustNum { get; set; } public int CustSeq { get; set; } @@ -34,7 +34,7 @@ public class CustomerDto public decimal? AvgBalOs { get; set; } public decimal? LargeBalOs { get; set; } public decimal? LastBalOs { get; set; } - public string Whse { get; set; } + public string? Whse { get; set; } public string Charfld1 { get; set; } public string Charfld2 { get; set; } public string Charfld3 { get; set; } From f0b94bea74f9890282a6e3a218e1f9a129e3ca2a Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sun, 24 Aug 2025 10:36:36 +0200 Subject: [PATCH 043/149] * Fixed parameters names --- FaKrosnoApi/Controllers/ItemCustPriceAllController.cs | 4 ++-- SytelineSaAppEfDataModel/Services/IItemCustPriceAllService.cs | 2 +- SytelineSaAppEfDataModel/Services/ItemCustPriceAllService.cs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/FaKrosnoApi/Controllers/ItemCustPriceAllController.cs b/FaKrosnoApi/Controllers/ItemCustPriceAllController.cs index deca1a9..1fbb591 100644 --- a/FaKrosnoApi/Controllers/ItemCustPriceAllController.cs +++ b/FaKrosnoApi/Controllers/ItemCustPriceAllController.cs @@ -10,9 +10,9 @@ namespace FaKrosnoApi.Controllers; public class ItemCustPriceAllController(IItemCustPriceAllService service, IMapper mapper) : Controller { [HttpGet("by-parameters")] - public async Task> GetItemCustPriceAll(string itemCode, string customerDoInvoice) + public async Task> GetItemCustPriceAll([FromQuery] string itemNumber, [FromQuery] string customerNumber) { - var result = await service.GetItemCustPriceAllAsync(itemCode, customerDoInvoice); + var result = await service.GetItemCustPriceAllAsync(itemNumber, customerNumber); if (result == null) { return NotFound(); diff --git a/SytelineSaAppEfDataModel/Services/IItemCustPriceAllService.cs b/SytelineSaAppEfDataModel/Services/IItemCustPriceAllService.cs index c52f43e..408acef 100644 --- a/SytelineSaAppEfDataModel/Services/IItemCustPriceAllService.cs +++ b/SytelineSaAppEfDataModel/Services/IItemCustPriceAllService.cs @@ -4,5 +4,5 @@ namespace SytelineSaAppEfDataModel.Services; public interface IItemCustPriceAllService { - Task GetItemCustPriceAllAsync(string item, string customerNumber); + Task GetItemCustPriceAllAsync(string itemNumber, string customerNumber); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/ItemCustPriceAllService.cs b/SytelineSaAppEfDataModel/Services/ItemCustPriceAllService.cs index c0b0969..a06b5ec 100644 --- a/SytelineSaAppEfDataModel/Services/ItemCustPriceAllService.cs +++ b/SytelineSaAppEfDataModel/Services/ItemCustPriceAllService.cs @@ -5,9 +5,9 @@ namespace SytelineSaAppEfDataModel.Services; public class ItemCustPriceAllService(SytelineSaAppDbContext context, IMapper mapper) : IItemCustPriceAllService { - public async Task GetItemCustPriceAllAsync(string item, string customerNumber) + public async Task GetItemCustPriceAllAsync(string itemNumber, string customerNumber) { return await Task.FromResult(mapper.Map(context.ItemCustPriceAlls - .OrderByDescending(x => x.EffectDate).FirstOrDefault(x => x.Item == item && x.CustNum == customerNumber))); + .OrderByDescending(x => x.EffectDate).FirstOrDefault(x => x.Item == itemNumber && x.CustNum == customerNumber))); } } \ No newline at end of file From cd3d939efe114b2e57eea2259d6634f795cec078 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Sun, 24 Aug 2025 11:13:51 +0200 Subject: [PATCH 044/149] * Added detail translator --- SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs index 1d1088e..792b305 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs @@ -35,8 +35,8 @@ namespace SytelineSaAppEfDataModel.Dtos public DateTime CreateDate { get; set; } public byte InWorkflow { get; set; } public string BoxType { get; set; } - public string Address { get; set; } - public string FinalDestination { get; set; } + public string? Address { get; set; } + public string? FinalDestination { get; set; } public int? QtyPerBox { get; set; } public string TranslatedStatus => TranslateStatus(Status); From 8b67aa3851db106874e8b5afcb714e76e2feae79 Mon Sep 17 00:00:00 2001 From: trencik91 Date: Mon, 25 Aug 2025 14:25:16 +0200 Subject: [PATCH 045/149] * Added new Enrichers * Added new Translators * Changed in DTOs * Further development --- .../Controllers/CustomerOrdersController.cs | 64 +++++++++++++++++-- .../Dtos/EdiCustomerOrderLineItemDto.cs | 4 +- .../Dtos/EdiCustomerOrderTranslateDto.cs | 3 + .../Dtos/ItemCustPriceAllDto.cs | 2 +- SytelineSaAppEfDataModel/Dtos/ItemDto.cs | 2 +- .../Services/CustomerOrderService.cs | 23 +++++++ .../Services/ICustomerOrderService.cs | 6 ++ 7 files changed, 94 insertions(+), 10 deletions(-) diff --git a/FaKrosnoApi/Controllers/CustomerOrdersController.cs b/FaKrosnoApi/Controllers/CustomerOrdersController.cs index 4a91c1e..ebf620c 100644 --- a/FaKrosnoApi/Controllers/CustomerOrdersController.cs +++ b/FaKrosnoApi/Controllers/CustomerOrdersController.cs @@ -17,32 +17,84 @@ namespace FaKrosnoApi.Controllers } [HttpGet("by-order-number")] - public async Task> GetByCustomerOrderNumber([FromQuery] Guid customerOrderNumber) + public async Task> GetByCustomerOrderNumber( + [FromQuery] Guid customerOrderNumber) { CustomerOrderDto? customerOrder = await service.GetByOrderNumber(customerOrderNumber); return customerOrder != null ? Ok(customerOrder) : NotFound(); } - + [HttpGet("by-co-number")] public async Task> GetByCoNumber([FromQuery] string customerOrderNumber) { CustomerOrderDto? customerOrder = await service.GetByCoNumber(customerOrderNumber); return customerOrder != null ? Ok(customerOrder) : NotFound(); } - + + [HttpGet("lines-by-co-number")] + public async Task?>> GetLinesByCoNumber( + [FromQuery] string customerOrderNumber) + { + var customerOrderLines = await service.GetLinesByCoNumber(customerOrderNumber); + return customerOrderLines != null ? Ok(customerOrderLines) : NotFound(); + } + [HttpGet("items-by-co-number")] - public async Task> GetItemsByCoNumber([FromQuery] string customerOrderNumber) + public async Task?>> GetItemsByCoNumber( + [FromQuery] string customerOrderNumber) { var customerOrderLineItems = await service.GetItemsByCoNumber(customerOrderNumber); return customerOrderLineItems != null ? Ok(customerOrderLineItems) : NotFound(); } - + [HttpGet("by-customer-and-po")] - public async Task> GetByCustomerAndPo([FromQuery] string customerNumber, [FromQuery] int customerSequence, [FromQuery] string poNumber) + public async Task> GetByCustomerAndPo([FromQuery] string customerNumber, + [FromQuery] int customerSequence, [FromQuery] string poNumber) { CustomerOrderDto? customerOrder = await service.GetByCustomerAndPo(customerNumber, customerSequence, poNumber); return customerOrder != null ? Ok(customerOrder) : NotFound(); } + + [HttpGet("list-by-customer-and-po")] + public async Task>> GetListByCustomerAndPo( + [FromQuery] string customerNumber, [FromQuery] int customerSequence, [FromQuery] string poNumber) + { + IList customerOrders = + await service.GetListByCustomerAndPo(customerNumber, customerSequence, poNumber); + + foreach (CustomerOrderDto customerOrder in customerOrders) + { + customerOrder.CustomerOrderLines = await service.GetLinesByCoNumber(customerOrder.CoNum) ?? []; + + foreach (CustomerOrderLineDto customerOrderLine in customerOrder.CustomerOrderLines) + { + customerOrderLine.CustomerOrderLineItems = + await service.GetItemsByCoNumber(customerOrder.CoNum) ?? []; + } + } + + return Ok(customerOrders); + } + + [HttpGet("list-by-customer")] + public async Task>> GetListByCustomer([FromQuery] string customerNumber, + [FromQuery] int customerSequence) + { + IList customerOrders = await service.GetListByCustomer(customerNumber, customerSequence); + + foreach (CustomerOrderDto customerOrder in customerOrders) + { + customerOrder.CustomerOrderLines = await service.GetLinesByCoNumber(customerOrder.CoNum) ?? []; + + foreach (CustomerOrderLineDto customerOrderLine in customerOrder.CustomerOrderLines) + { + customerOrderLine.CustomerOrderLineItems = + await service.GetItemsByCoNumber(customerOrder.CoNum) ?? []; + } + } + + return Ok(customerOrders); + } } } diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs index cc85648..5cd9d5f 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs @@ -100,8 +100,8 @@ namespace SytelineSaAppEfDataModel.Dtos public string UfFkrEdiAddIntDest { get; set; } public string UfFkrEdiCustPoLineNum { get; set; } public string UfFkrEdiPlaceOrPortDischarge { get; set; } - public string RoutingCode { get; set; } - public string DeliveryCallNumber { get; set; } + public string? RoutingCode { get; set; } + public string? DeliveryCallNumber { get; set; } public string UnloadingPoint { get; set; } public string DestinationPoint { get; set; } public string NewStatus { get; set; } diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderTranslateDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderTranslateDto.cs index bc1e487..f78ccca 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderTranslateDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderTranslateDto.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using AutoMapper.Configuration.Annotations; namespace SytelineSaAppEfDataModel.Dtos { @@ -20,5 +21,7 @@ namespace SytelineSaAppEfDataModel.Dtos public DateTime CreatedDate { get; set; } public string FoundNumbers { get; set; } public int ScheduleOrderId { get; set; } + + [Ignore] public string PoNumber { get; set; } } } diff --git a/SytelineSaAppEfDataModel/Dtos/ItemCustPriceAllDto.cs b/SytelineSaAppEfDataModel/Dtos/ItemCustPriceAllDto.cs index 262dd20..cb39d8f 100644 --- a/SytelineSaAppEfDataModel/Dtos/ItemCustPriceAllDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/ItemCustPriceAllDto.cs @@ -1,6 +1,6 @@ namespace SytelineSaAppEfDataModel.Dtos; -public class ItemCustPriceAllDto +public class ItemCustPriceAllDto : DtoBase { public string SiteRef { get; set; } public string Item { get; set; } diff --git a/SytelineSaAppEfDataModel/Dtos/ItemDto.cs b/SytelineSaAppEfDataModel/Dtos/ItemDto.cs index 9bf8543..1f85a17 100644 --- a/SytelineSaAppEfDataModel/Dtos/ItemDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/ItemDto.cs @@ -1,6 +1,6 @@ namespace SytelineSaAppEfDataModel.Dtos; -public class ItemDto +public class ItemDto : DtoBase { public string ItemCode { get; set; } public string Description { get; set; } diff --git a/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs index 1415b29..0d0b09c 100644 --- a/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs @@ -73,6 +73,29 @@ namespace SytelineSaAppEfDataModel.Services .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); } + public async Task> GetListByCustomerAndPo(string customerNumber, int customerSequence, + string poNumber) + { + return await context.CustomerOrders + .Where(x => x.CustNum == customerNumber && x.CustSeq == customerSequence && x.CustPo == poNumber) + .Select(x => mapper.Map(x)).ToListAsync(); + } + + public async Task> GetListByCustomer(string customerNumber, int customerSequence) + { + return await context.CustomerOrders.Where(x => x.CustNum == customerNumber && x.CustSeq == customerSequence) + .Select(x => mapper.Map(x)).ToListAsync(); + } + + public async Task?> GetLinesByCoNumber(string customerOrderNumber) + { + List customerOrderLines = await context.CustomerOrderLines + .Where(x => x.CoNum == customerOrderNumber).Select(x => mapper.Map(x)) + .ToListAsync(); + + return customerOrderLines; + } + public async Task?> GetItemsByCoNumber(string customerOrderNumber) { List customerOrderLineItems = await context.CustomerOrderLineItems diff --git a/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs index e729da4..b30d3fc 100644 --- a/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs @@ -13,6 +13,12 @@ namespace SytelineSaAppEfDataModel.Services Task GetByOrderNumber(Guid orderNumber); Task GetByCoNumber(string orderNumber); Task GetByCustomerAndPo(string customerNumber, int customerSequence, string poNumber); + + Task> GetListByCustomerAndPo(string customerNumber, int customerSequence, + string poNumber); + + Task> GetListByCustomer(string customerNumber, int customerSequence); + Task?> GetLinesByCoNumber(string customerOrderNumber); Task?> GetItemsByCoNumber(string customerOrderNumber); } } From f6deaa3da0a4f9a6d76b28ccdb94c3e45d1e1e02 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 25 Aug 2025 20:56:15 +0200 Subject: [PATCH 046/149] * Changed Dto --- SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs | 3 +++ SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs index 792b305..cdb4d75 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using AutoMapper.Configuration.Annotations; namespace SytelineSaAppEfDataModel.Dtos { @@ -41,6 +42,8 @@ namespace SytelineSaAppEfDataModel.Dtos public string TranslatedStatus => TranslateStatus(Status); + [Ignore] public string VatCode { get; set; } + public IEnumerable EdiCustomerOrderLineItems { get; set; } } } diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs index 5cd9d5f..9978071 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs @@ -102,8 +102,8 @@ namespace SytelineSaAppEfDataModel.Dtos public string UfFkrEdiPlaceOrPortDischarge { get; set; } public string? RoutingCode { get; set; } public string? DeliveryCallNumber { get; set; } - public string UnloadingPoint { get; set; } - public string DestinationPoint { get; set; } + public string? UnloadingPoint { get; set; } + public string? DestinationPoint { get; set; } public string NewStatus { get; set; } public string PalletCode { get; set; } public string PalletNumber { get; set; } From 23c26b4c65461b430822bccc1b697864b96952de Mon Sep 17 00:00:00 2001 From: trencik91 Date: Tue, 26 Aug 2025 14:22:36 +0200 Subject: [PATCH 047/149] * Type fixes --- .../Dtos/EdiCustomerOrderLineDto.cs | 2 +- .../Dtos/EdiCustomerOrderLineItemDto.cs | 2 +- SytelineSaAppEfDataModel/Dtos/ItemDto.cs | 47 ++++++++++--------- SytelineSaAppEfDataModel/Entities/Item.cs | 47 ++++++++++--------- 4 files changed, 50 insertions(+), 48 deletions(-) diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs index cdb4d75..0fd22f5 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs @@ -35,7 +35,7 @@ namespace SytelineSaAppEfDataModel.Dtos public string UpdatedBy { get; set; } public DateTime CreateDate { get; set; } public byte InWorkflow { get; set; } - public string BoxType { get; set; } + public string? BoxType { get; set; } public string? Address { get; set; } public string? FinalDestination { get; set; } public int? QtyPerBox { get; set; } diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs index 9978071..4cc46d8 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs @@ -106,7 +106,7 @@ namespace SytelineSaAppEfDataModel.Dtos public string? DestinationPoint { get; set; } public string NewStatus { get; set; } public string PalletCode { get; set; } - public string PalletNumber { get; set; } + public string? PalletNumber { get; set; } public string DocumentType { get; set; } public string TranslatedStatus => TranslateStatus(Status); diff --git a/SytelineSaAppEfDataModel/Dtos/ItemDto.cs b/SytelineSaAppEfDataModel/Dtos/ItemDto.cs index 1f85a17..8402956 100644 --- a/SytelineSaAppEfDataModel/Dtos/ItemDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/ItemDto.cs @@ -6,7 +6,7 @@ public class ItemDto : DtoBase public string Description { get; set; } public decimal? QtyAllocjob { get; set; } public string UM { get; set; } - public int LeadTime { get; set; } + public short LeadTime { get; set; } public decimal? LotSize { get; set; } public decimal? QtyUsedYtd { get; set; } public decimal? QtyMfgYtd { get; set; } @@ -20,13 +20,13 @@ public class ItemDto : DtoBase public decimal? LstUCost { get; set; } public decimal? AvgUCost { get; set; } public string Job { get; set; } - public int? Suffix { get; set; } + public short? Suffix { get; set; } public bool Stocked { get; set; } public string MatlType { get; set; } public string FamilyCode { get; set; } - public int? LowLevel { get; set; } + public byte? LowLevel { get; set; } public DateTime? LastInv { get; set; } - public int? DaysSupply { get; set; } + public short? DaysSupply { get; set; } public decimal? OrderMin { get; set; } public decimal? OrderMult { get; set; } public string PlanCode { get; set; } @@ -36,8 +36,8 @@ public class ItemDto : DtoBase public string Revision { get; set; } public bool PhantomFlag { get; set; } public bool PlanFlag { get; set; } - public int PaperTime { get; set; } - public int DockTime { get; set; } + public short PaperTime { get; set; } + public short DockTime { get; set; } public decimal? AsmSetup { get; set; } public decimal? AsmRun { get; set; } public decimal? AsmMatl { get; set; } @@ -64,9 +64,9 @@ public class ItemDto : DtoBase public string Charfld4 { get; set; } public decimal? CurUCost { get; set; } public string FeatType { get; set; } - public int? VarLead { get; set; } + public decimal? VarLead { get; set; } public string FeatStr { get; set; } - public int? NextConfig { get; set; } + public short? NextConfig { get; set; } public string FeatTempl { get; set; } public bool Backflush { get; set; } public string Charfld1 { get; set; } @@ -78,6 +78,7 @@ public class ItemDto : DtoBase public bool Logifld { get; set; } public DateTime? Datefld { get; set; } public bool TrackEcn { get; set; } + public string CommCode { get; set; } public string Origin { get; set; } public decimal? UnitMatCost { get; set; } @@ -92,10 +93,10 @@ public class ItemDto : DtoBase public string TaxCode2 { get; set; } public string BflushLoc { get; set; } public bool Reservable { get; set; } - public int? ShelfLife { get; set; } + public short? ShelfLife { get; set; } public string LotPrefix { get; set; } public string SerialPrefix { get; set; } - public int? SerialLength { get; set; } + public byte? SerialLength { get; set; } public string IssueBy { get; set; } public bool SerialTracked { get; set; } public bool LotTracked { get; set; } @@ -117,7 +118,7 @@ public class ItemDto : DtoBase public decimal? AvgOutCost { get; set; } public string ProdType { get; set; } public decimal? RatePerDay { get; set; } - public int? MpsPlanFence { get; set; } + public short? MpsPlanFence { get; set; } public bool PassReq { get; set; } public bool LotGenExp { get; set; } public string SupplySite { get; set; } @@ -127,16 +128,16 @@ public class ItemDto : DtoBase public DateTime? ChgDate { get; set; } public string ReasonCode { get; set; } public string SupplyWhse { get; set; } - public int? DuePeriod { get; set; } + public short? DuePeriod { get; set; } public decimal? OrderMax { get; set; } public bool MrpPart { get; set; } public bool InfinitePart { get; set; } public bool NoteExistsFlag { get; set; } public DateTime RecordDate { get; set; } public Guid RowPointer { get; set; } - public int? SupplyToleranceHrs { get; set; } - public int ExpLeadTime { get; set; } - public int? VarExpLead { get; set; } + public decimal? SupplyToleranceHrs { get; set; } + public short ExpLeadTime { get; set; } + public decimal? VarExpLead { get; set; } public string Buyer { get; set; } public bool OrderConfigurable { get; set; } public bool JobConfigurable { get; set; } @@ -151,8 +152,8 @@ public class ItemDto : DtoBase public DateTime CreateDate { get; set; } public bool InWorkflow { get; set; } public bool MfgSupplySwitchingActive { get; set; } - public int? TimeFenceRule { get; set; } - public decimal? TimeFenceValue { get; set; } + public short? TimeFenceRule { get; set; } + public double? TimeFenceValue { get; set; } public DateTime? EarliestPlannedPoReceipt { get; set; } public bool UseReorderPoint { get; set; } public decimal? ReorderPoint { get; set; } @@ -162,7 +163,7 @@ public class ItemDto : DtoBase public decimal? CurInsuranceCost { get; set; } public decimal? CurLocFrtCost { get; set; } public bool TaxFreeMatl { get; set; } - public int? TaxFreeDays { get; set; } + public short? TaxFreeDays { get; set; } public decimal? SafetyStockPercent { get; set; } public string TariffClassification { get; set; } public DateTime Lowdate { get; set; } @@ -173,15 +174,15 @@ public class ItemDto : DtoBase public bool IncludeInNetChangePlanning { get; set; } public bool Kit { get; set; } public bool PrintKitComponents { get; set; } - public int? SafetyStockRule { get; set; } + public short? SafetyStockRule { get; set; } public bool ShowInDropDownList { get; set; } public bool ControlledByExternalIcs { get; set; } public decimal? InventoryUclTolerance { get; set; } public decimal? InventoryLclTolerance { get; set; } public string SeparationAttribute { get; set; } - public decimal? BatchReleaseAttribute1 { get; set; } - public decimal? BatchReleaseAttribute2 { get; set; } - public decimal? BatchReleaseAttribute3 { get; set; } + public double? BatchReleaseAttribute1 { get; set; } + public double? BatchReleaseAttribute2 { get; set; } + public double? BatchReleaseAttribute3 { get; set; } public byte[] Picture { get; set; } public bool ActiveForCustomerPortal { get; set; } public bool Featured { get; set; } @@ -213,7 +214,7 @@ public class ItemDto : DtoBase public string BoxId { get; set; } public decimal? ItemLength { get; set; } public decimal? ItemFi { get; set; } - public int? BoxItemsCnt { get; set; } + public decimal? BoxItemsCnt { get; set; } public string Klient { get; set; } public string Uf_FKR_FA_RodzajPozycji { get; set; } public string Uf_Nr_Klienta { get; set; } diff --git a/SytelineSaAppEfDataModel/Entities/Item.cs b/SytelineSaAppEfDataModel/Entities/Item.cs index 4705498..c01deca 100644 --- a/SytelineSaAppEfDataModel/Entities/Item.cs +++ b/SytelineSaAppEfDataModel/Entities/Item.cs @@ -6,7 +6,7 @@ public class Item public string Description { get; set; } public decimal? QtyAllocjob { get; set; } public string UM { get; set; } - public int LeadTime { get; set; } + public short LeadTime { get; set; } public decimal? LotSize { get; set; } public decimal? QtyUsedYtd { get; set; } public decimal? QtyMfgYtd { get; set; } @@ -20,13 +20,13 @@ public class Item public decimal? LstUCost { get; set; } public decimal? AvgUCost { get; set; } public string Job { get; set; } - public int? Suffix { get; set; } + public short? Suffix { get; set; } public bool Stocked { get; set; } public string MatlType { get; set; } public string FamilyCode { get; set; } - public int? LowLevel { get; set; } + public byte? LowLevel { get; set; } public DateTime? LastInv { get; set; } - public int? DaysSupply { get; set; } + public short? DaysSupply { get; set; } public decimal? OrderMin { get; set; } public decimal? OrderMult { get; set; } public string PlanCode { get; set; } @@ -36,8 +36,8 @@ public class Item public string Revision { get; set; } public bool PhantomFlag { get; set; } public bool PlanFlag { get; set; } - public int PaperTime { get; set; } - public int DockTime { get; set; } + public short PaperTime { get; set; } + public short DockTime { get; set; } public decimal? AsmSetup { get; set; } public decimal? AsmRun { get; set; } public decimal? AsmMatl { get; set; } @@ -64,9 +64,9 @@ public class Item public string Charfld4 { get; set; } public decimal? CurUCost { get; set; } public string FeatType { get; set; } - public int? VarLead { get; set; } + public decimal? VarLead { get; set; } public string FeatStr { get; set; } - public int? NextConfig { get; set; } + public short? NextConfig { get; set; } public string FeatTempl { get; set; } public bool Backflush { get; set; } public string Charfld1 { get; set; } @@ -78,6 +78,7 @@ public class Item public bool Logifld { get; set; } public DateTime? Datefld { get; set; } public bool TrackEcn { get; set; } + public string CommCode { get; set; } public string Origin { get; set; } public decimal? UnitMatCost { get; set; } @@ -92,10 +93,10 @@ public class Item public string TaxCode2 { get; set; } public string BflushLoc { get; set; } public bool Reservable { get; set; } - public int? ShelfLife { get; set; } + public short? ShelfLife { get; set; } public string LotPrefix { get; set; } public string SerialPrefix { get; set; } - public int? SerialLength { get; set; } + public byte? SerialLength { get; set; } public string IssueBy { get; set; } public bool SerialTracked { get; set; } public bool LotTracked { get; set; } @@ -117,7 +118,7 @@ public class Item public decimal? AvgOutCost { get; set; } public string ProdType { get; set; } public decimal? RatePerDay { get; set; } - public int? MpsPlanFence { get; set; } + public short? MpsPlanFence { get; set; } public bool PassReq { get; set; } public bool LotGenExp { get; set; } public string SupplySite { get; set; } @@ -127,16 +128,16 @@ public class Item public DateTime? ChgDate { get; set; } public string ReasonCode { get; set; } public string SupplyWhse { get; set; } - public int? DuePeriod { get; set; } + public short? DuePeriod { get; set; } public decimal? OrderMax { get; set; } public bool MrpPart { get; set; } public bool InfinitePart { get; set; } public bool NoteExistsFlag { get; set; } public DateTime RecordDate { get; set; } public Guid RowPointer { get; set; } - public int? SupplyToleranceHrs { get; set; } - public int ExpLeadTime { get; set; } - public int? VarExpLead { get; set; } + public decimal? SupplyToleranceHrs { get; set; } + public short ExpLeadTime { get; set; } + public decimal? VarExpLead { get; set; } public string Buyer { get; set; } public bool OrderConfigurable { get; set; } public bool JobConfigurable { get; set; } @@ -151,8 +152,8 @@ public class Item public DateTime CreateDate { get; set; } public bool InWorkflow { get; set; } public bool MfgSupplySwitchingActive { get; set; } - public int? TimeFenceRule { get; set; } - public decimal? TimeFenceValue { get; set; } + public short? TimeFenceRule { get; set; } + public double? TimeFenceValue { get; set; } public DateTime? EarliestPlannedPoReceipt { get; set; } public bool UseReorderPoint { get; set; } public decimal? ReorderPoint { get; set; } @@ -162,7 +163,7 @@ public class Item public decimal? CurInsuranceCost { get; set; } public decimal? CurLocFrtCost { get; set; } public bool TaxFreeMatl { get; set; } - public int? TaxFreeDays { get; set; } + public short? TaxFreeDays { get; set; } public decimal? SafetyStockPercent { get; set; } public string TariffClassification { get; set; } public DateTime Lowdate { get; set; } @@ -173,15 +174,15 @@ public class Item public bool IncludeInNetChangePlanning { get; set; } public bool Kit { get; set; } public bool PrintKitComponents { get; set; } - public int? SafetyStockRule { get; set; } + public short? SafetyStockRule { get; set; } public bool ShowInDropDownList { get; set; } public bool ControlledByExternalIcs { get; set; } public decimal? InventoryUclTolerance { get; set; } public decimal? InventoryLclTolerance { get; set; } public string SeparationAttribute { get; set; } - public decimal? BatchReleaseAttribute1 { get; set; } - public decimal? BatchReleaseAttribute2 { get; set; } - public decimal? BatchReleaseAttribute3 { get; set; } + public double? BatchReleaseAttribute1 { get; set; } + public double? BatchReleaseAttribute2 { get; set; } + public double? BatchReleaseAttribute3 { get; set; } public byte[] Picture { get; set; } public bool ActiveForCustomerPortal { get; set; } public bool Featured { get; set; } @@ -213,7 +214,7 @@ public class Item public string BoxId { get; set; } public decimal? ItemLength { get; set; } public decimal? ItemFi { get; set; } - public int? BoxItemsCnt { get; set; } + public decimal? BoxItemsCnt { get; set; } public string Klient { get; set; } public string Uf_FKR_FA_RodzajPozycji { get; set; } public string Uf_Nr_Klienta { get; set; } From 47f37d016d8ce05b93cfc01ec5fb36ab8483b94a Mon Sep 17 00:00:00 2001 From: trencik91 Date: Thu, 28 Aug 2025 14:50:46 +0200 Subject: [PATCH 048/149] * Fixed DTOs issues * Added service to save data --- .../EdiCustomerOrdersController.cs | 15 +++ SytelineSaAppEfDataModel/Dtos/CustomerDto.cs | 6 +- .../Dtos/EdiCustomerOrderDto.cs | 86 ++++++++--------- .../Dtos/EdiCustomerOrderImportDto.cs | 4 +- .../Dtos/EdiCustomerOrderLineDto.cs | 26 ++--- .../Dtos/EdiCustomerOrderLineItemDto.cs | 80 ++++++++-------- .../Dtos/EdiCustomerOrderTranslateDto.cs | 12 +-- .../Entities/EdiCustomerOrder.cs | 96 +++++++++---------- .../Entities/EdiCustomerOrderLine.cs | 32 +++---- .../Entities/EdiCustomerOrderLineItem.cs | 90 ++++++++--------- .../Entities/EdiCustomerOrderTranslate.cs | 10 +- .../Services/EdiCustomerOrderService.cs | 53 ++++++++-- .../Services/IEdiCustomerOrderService.cs | 1 + 13 files changed, 280 insertions(+), 231 deletions(-) diff --git a/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs b/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs index bb5fc86..d11a1b5 100644 --- a/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs +++ b/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs @@ -43,5 +43,20 @@ namespace FaKrosnoApi.Controllers int result = await service.SendOrderToSyteline(customerOrderNumber); return result > 0 ? Ok() : BadRequest(); } + + [HttpPost("save-orders")] + public async Task SaveOrdersWithDetails([FromBody] List ediCustomerOrders) + { + if (!ediCustomerOrders.Any()) + { + return BadRequest("The list of orders cannot be null or empty."); + } + + var result = await service.SaveOrdersWithDetails(ediCustomerOrders); + + return result.Item1 + ? Ok("Orders saved successfully.") + : BadRequest($"Failed to save orders. Error: {result.Item2}"); + } } } diff --git a/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs b/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs index 3215118..f9b5cfa 100644 --- a/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/CustomerDto.cs @@ -4,9 +4,9 @@ public class CustomerDto : DtoBase { public string CustNum { get; set; } public int CustSeq { get; set; } - public string Contact1 { get; set; } - public string Contact2 { get; set; } - public string Contact3 { get; set; } + public string? Contact1 { get; set; } + public string? Contact2 { get; set; } + public string? Contact3 { get; set; } public string Phone1 { get; set; } public string Phone2 { get; set; } public string Phone3 { get; set; } diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs index 3ff2624..0986ca9 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs @@ -8,8 +8,8 @@ namespace SytelineSaAppEfDataModel.Dtos { public class EdiCustomerOrderDto : DtoBase { - public string TransactionCode { get; set; } - public string TpCode { get; set; } + public string? TransactionCode { get; set; } + public string? TpCode { get; set; } public DateTime? RecivedDate { get; set; } public byte? Posted { get; set; } public DateTime? PostedDate { get; set; } @@ -17,24 +17,24 @@ namespace SytelineSaAppEfDataModel.Dtos public short? ErrorMessage { get; set; } public byte? Override { get; set; } public byte? Ack { get; set; } - public string AckNumber { get; set; } + public string? AckNumber { get; set; } public int? AckSequence { get; set; } - public string AckType { get; set; } + public string? AckType { get; set; } public DateTime? AckDate { get; set; } - public string SymbolicCustomerOrderNumber { get; set; } + public string? SymbolicCustomerOrderNumber { get; set; } public decimal? BlanketDollar { get; set; } - public string Type { get; set; } - public string CustomerOrderNumber { get; set; } - public string EstimatedNumber { get; set; } - public string CustomerNumber { get; set; } + public string? Type { get; set; } + public string? CustomerOrderNumber { get; set; } + public string? EstimatedNumber { get; set; } + public string? CustomerNumber { get; set; } public int? CustomerSequence { get; set; } - public string Contact { get; set; } - public string Phone { get; set; } - public string CustomerPoNumber { get; set; } + public string? Contact { get; set; } + public string? Phone { get; set; } + public string? CustomerPoNumber { get; set; } public DateTime? OrderDate { get; set; } - public string TakenBy { get; set; } - public string TermsCode { get; set; } - public string ShipCode { get; set; } + public string? TakenBy { get; set; } + public string? TermsCode { get; set; } + public string? ShipCode { get; set; } public decimal? Price { get; set; } public decimal? Weight { get; set; } public short? QtyPackages { get; set; } @@ -42,67 +42,67 @@ namespace SytelineSaAppEfDataModel.Dtos public decimal? MiscCharges { get; set; } public decimal? PrepaidAmount { get; set; } public decimal? SalesTax { get; set; } - public string Status { get; set; } + public string? Status { get; set; } public decimal? Cost { get; set; } public DateTime? CloseDate { get; set; } public decimal? FreightT { get; set; } public decimal? MchargesT { get; set; } public decimal? PrepaidT { get; set; } public decimal? SalesTaxT { get; set; } - public string Salesman { get; set; } + public string? Salesman { get; set; } public DateTime? EffectiveDate { get; set; } public DateTime? ExpirationDate { get; set; } - public string Warehouse { get; set; } + public string? Warehouse { get; set; } public decimal? SalesTaxTwo { get; set; } public decimal? SalesTaxTwoT { get; set; } - public string CharFieldOne { get; set; } - public string CharFieldTwo { get; set; } - public string CharFieldThree { get; set; } + public string? CharFieldOne { get; set; } + public string? CharFieldTwo { get; set; } + public string? CharFieldThree { get; set; } public DateTime? DateField { get; set; } public decimal? DecimalFieldOne { get; set; } public decimal? DecimalFieldTwo { get; set; } public decimal? DecimalFieldThree { get; set; } public byte? LogiField { get; set; } public byte? EdiOrder { get; set; } - public string TransactionNat { get; set; } - public string ProcessInd { get; set; } - public string DelTerm { get; set; } + public string? TransactionNat { get; set; } + public string? ProcessInd { get; set; } + public string? DelTerm { get; set; } public byte? UseExchangeRate { get; set; } - public string TaxCodeOne { get; set; } - public string TaxCodeTwo { get; set; } - public string FreightTaxCodeOne { get; set; } - public string FreightTaxCodeTwo { get; set; } - public string MscTaxCodeOne { get; set; } - public string MscTaxCodeTwo { get; set; } + public string? TaxCodeOne { get; set; } + public string? TaxCodeTwo { get; set; } + public string? FreightTaxCodeOne { get; set; } + public string? FreightTaxCodeTwo { get; set; } + public string? MscTaxCodeOne { get; set; } + public string? MscTaxCodeTwo { get; set; } public decimal? Discount { get; set; } - public string PriceCode { get; set; } + public string? PriceCode { get; set; } public byte? ShipPartial { get; set; } public byte? ShipEarly { get; set; } - public string NonApplyData { get; set; } + public string? NonApplyData { get; set; } public byte NoteExistsFlag { get; set; } public DateTime RecordDate { get; set; } public Guid RowPointer { get; set; } - public string CreatedBy { get; set; } - public string UpdatedBy { get; set; } + public string? CreatedBy { get; set; } + public string? UpdatedBy { get; set; } public DateTime CreateDate { get; set; } public byte InWorkflow { get; set; } - public string DiscountType { get; set; } + public string? DiscountType { get; set; } public decimal? DiscountAmount { get; set; } - public string TransNatTwo { get; set; } + public string? TransNatTwo { get; set; } public string? UfFkrEdiMessageRefNum { get; set; } - public string UfFkrEdiConsigneeAddress { get; set; } - public string UfFkrEdiConsigneeName { get; set; } - public string UfFkrEdiFileName { get; set; } - public string UfFkrEdiBuyerDunsNumber { get; set; } - public string Gate { get; set; } - public string CustomerName { get; set; } + public string? UfFkrEdiConsigneeAddress { get; set; } + public string? UfFkrEdiConsigneeName { get; set; } + public string? UfFkrEdiFileName { get; set; } + public string? UfFkrEdiBuyerDunsNumber { get; set; } + public string? Gate { get; set; } + public string? CustomerName { get; set; } public string? RecipientCode { get; set; } public string? SenderCode { get; set; } public string? SellerCode { get; set; } public string? DocType { get; set; } public string? BuyerCode { get; set; } - public string TranslatedStatus => TranslateStatus(Status); + public string TranslatedStatus => TranslateStatus(Status ?? string.Empty); public string? SlOrderNumber => EdiCustomerOrderTranslates.MaxBy(x => x.CreatedDate)?.CoCoNum; public string SentToSl => Posted == 1 ? "TAK" : "NIE"; diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderImportDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderImportDto.cs index f11d1c5..1da4730 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderImportDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderImportDto.cs @@ -6,7 +6,7 @@ public class EdiCustomerOrderImportDto public int ScheduleOrderId { get; set; } public DateTime LastUpdateDate { get; set; } public DateTime CreatedDate { get; set; } - public string Status { get; set; } - public string LogData { get; set; } + public string? Status { get; set; } + public string? LogData { get; set; } public int ItemsCount { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs index 0fd22f5..9c6764f 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineDto.cs @@ -9,31 +9,31 @@ namespace SytelineSaAppEfDataModel.Dtos { public class EdiCustomerOrderLineDto : DtoBase { - public string CustomerOrderNumber { get; set; } + public string? CustomerOrderNumber { get; set; } public int CustomerOrderLine { get; set; } - public string Item { get; set; } - public string CustomerItemNumber { get; set; } - public string FeatStr { get; set; } + public string? Item { get; set; } + public string? CustomerItemNumber { get; set; } + public string? FeatStr { get; set; } public decimal? BlanketQty { get; set; } public DateTime? EffectiveDate { get; set; } public DateTime? ExpirationDate { get; set; } public decimal? ContPrice { get; set; } - public string Status { get; set; } + public string? Status { get; set; } public DateTime? PromiseDate { get; set; } - public string PriceCode { get; set; } - public string Uom { get; set; } + public string? PriceCode { get; set; } + public string? Uom { get; set; } public decimal? BlanketQtyReleased { get; set; } public decimal? ContPriceReleased { get; set; } public decimal? QtySent { get; set; } - public string SentCode { get; set; } - public string NonAppliedData { get; set; } + public string? SentCode { get; set; } + public string? NonAppliedData { get; set; } public byte NoteExistsFlag { get; set; } public DateTime RecordDate { get; set; } public Guid RowPointer { get; set; } - public string Description { get; set; } - public string CreatedBy { get; set; } - public string UpdatedBy { get; set; } - public DateTime CreateDate { get; set; } + public string? Description { get; set; } + public string? CreatedBy { get; set; } + public string? UpdatedBy { get; set; } + public DateTime? CreateDate { get; set; } public byte InWorkflow { get; set; } public string? BoxType { get; set; } public string? Address { get; set; } diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs index 4cc46d8..d5f8b0a 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderLineItemDto.cs @@ -8,7 +8,7 @@ namespace SytelineSaAppEfDataModel.Dtos { public class EdiCustomerOrderLineItemDto : DtoBase { - public string TransactionCode { get; set; } + public string? TransactionCode { get; set; } public DateTime? ReceivedDate { get; set; } public byte? Posted { get; set; } public DateTime? PostedDate { get; set; } @@ -17,17 +17,17 @@ namespace SytelineSaAppEfDataModel.Dtos public byte? Override { get; set; } public byte? Edi { get; set; } public byte? Ack { get; set; } - public string AckNumber { get; set; } - public string AckType { get; set; } + public string? AckNumber { get; set; } + public string? AckType { get; set; } public DateTime? AckDate { get; set; } - public string SymCustomerOrderNumber { get; set; } + public string? SymCustomerOrderNumber { get; set; } public byte? QtyChanged { get; set; } public byte? DateChanged { get; set; } public byte? PriceChanged { get; set; } - public string CustomerOrderNumber { get; set; } + public string? CustomerOrderNumber { get; set; } public int CustomerOrderLine { get; set; } public int CustomerOrderRelease { get; set; } - public string Item { get; set; } + public string? Item { get; set; } public decimal? QtyOrdered { get; set; } public decimal? QtyReady { get; set; } public decimal? QtyShipped { get; set; } @@ -35,8 +35,8 @@ namespace SytelineSaAppEfDataModel.Dtos public decimal? Discount { get; set; } public decimal? Cost { get; set; } public decimal? Price { get; set; } - public string RefType { get; set; } - public string RefNumber { get; set; } + public string? RefType { get; set; } + public string? RefNumber { get; set; } public short? RefLineSuf { get; set; } public short? RefRelease { get; set; } public DateTime? DueDate { get; set; } @@ -47,68 +47,68 @@ namespace SytelineSaAppEfDataModel.Dtos public decimal? BrkQtyFour { get; set; } public decimal? BrkQtyFive { get; set; } public byte? Reprice { get; set; } - public string CustomerItem { get; set; } + public string? CustomerItem { get; set; } public decimal? QtyInvoiced { get; set; } public decimal? QtyReturned { get; set; } public decimal? CgsTotal { get; set; } - public string FeatStr { get; set; } - public string Status { get; set; } - public string CustomerNumber { get; set; } + public string? FeatStr { get; set; } + public string? Status { get; set; } + public string? CustomerNumber { get; set; } public int? CustomerSequence { get; set; } public decimal? PrgBillTot { get; set; } public decimal? PrgBillApp { get; set; } public DateTime? ReleaseDate { get; set; } public DateTime? PromiseDate { get; set; } - public string Warehouse { get; set; } - public string WksBasis { get; set; } + public string? Warehouse { get; set; } + public string? WksBasis { get; set; } public decimal? WksValue { get; set; } - public string CommCode { get; set; } - public string TransNat { get; set; } - public string ProcessInd { get; set; } - public string DelTerm { get; set; } + public string? CommCode { get; set; } + public string? TransNat { get; set; } + public string? ProcessInd { get; set; } + public string? DelTerm { get; set; } public decimal? UnitWeight { get; set; } - public string Origin { get; set; } + public string? Origin { get; set; } public int? ConsNumber { get; set; } - public string TaxCodeOne { get; set; } - public string TaxCodeTwo { get; set; } + public string? TaxCodeOne { get; set; } + public string? TaxCodeTwo { get; set; } public decimal? ExportValue { get; set; } - public string EcCode { get; set; } - public string Transport { get; set; } + public string? EcCode { get; set; } + public string? Transport { get; set; } public DateTime? PickupDate { get; set; } - public string PriceCode { get; set; } - public string Uom { get; set; } + public string? PriceCode { get; set; } + public string? Uom { get; set; } public decimal? QtyOrderedReleased { get; set; } public decimal? PriceReleased { get; set; } - public string CustomerOrderCustomerNumber { get; set; } + public string? CustomerOrderCustomerNumber { get; set; } public byte? Packed { get; set; } public byte? Bol { get; set; } public decimal? QtyBco { get; set; } - public string BcoCode { get; set; } - public string ExternalRef { get; set; } - public string CustomerPoNumber { get; set; } - public string NonApplyData { get; set; } + public string? BcoCode { get; set; } + public string? ExternalRef { get; set; } + public string? CustomerPoNumber { get; set; } + public string? NonApplyData { get; set; } public byte NoteExistsFlag { get; set; } public DateTime RecordDate { get; set; } public Guid RowPointer { get; set; } - public string Description { get; set; } - public string CreatedBy { get; set; } - public string UpdatedBy { get; set; } + public string? Description { get; set; } + public string? CreatedBy { get; set; } + public string? UpdatedBy { get; set; } public DateTime CreateDate { get; set; } public byte InWorkflow { get; set; } - public string TransNatTwo { get; set; } + public string? TransNatTwo { get; set; } public decimal SupplyQtyConvFactor { get; set; } - public string UfFkrEdiAddIntDest { get; set; } - public string UfFkrEdiCustPoLineNum { get; set; } - public string UfFkrEdiPlaceOrPortDischarge { get; set; } + public string? UfFkrEdiAddIntDest { get; set; } + public string? UfFkrEdiCustPoLineNum { get; set; } + public string? UfFkrEdiPlaceOrPortDischarge { get; set; } public string? RoutingCode { get; set; } public string? DeliveryCallNumber { get; set; } public string? UnloadingPoint { get; set; } public string? DestinationPoint { get; set; } - public string NewStatus { get; set; } - public string PalletCode { get; set; } + public string? NewStatus { get; set; } + public string? PalletCode { get; set; } public string? PalletNumber { get; set; } - public string DocumentType { get; set; } + public string? DocumentType { get; set; } public string TranslatedStatus => TranslateStatus(Status); } } diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderTranslateDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderTranslateDto.cs index f78ccca..15e6cbe 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderTranslateDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderTranslateDto.cs @@ -12,16 +12,16 @@ namespace SytelineSaAppEfDataModel.Dtos public int Id { get; set; } public byte CoEdiOrder { get; set; } public Guid CoRowPointer { get; set; } - public string CoCoNum { get; set; } - public string CoType { get; set; } - public string CoTakenBy { get; set; } - public string EdiCoCoNum { get; set; } + public string? CoCoNum { get; set; } + public string? CoType { get; set; } + public string? CoTakenBy { get; set; } + public string? EdiCoCoNum { get; set; } public int OrdersCount { get; set; } public bool OrderFound { get; set; } public DateTime CreatedDate { get; set; } - public string FoundNumbers { get; set; } + public string? FoundNumbers { get; set; } public int ScheduleOrderId { get; set; } - [Ignore] public string PoNumber { get; set; } + [Ignore] public string? PoNumber { get; set; } } } diff --git a/SytelineSaAppEfDataModel/Entities/EdiCustomerOrder.cs b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrder.cs index 76723c1..edfa5c6 100644 --- a/SytelineSaAppEfDataModel/Entities/EdiCustomerOrder.cs +++ b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrder.cs @@ -8,8 +8,8 @@ namespace SytelineSaAppEfDataModel.Entities { public class EdiCustomerOrder : EntityBase { - public string TransactionCode { get; set; } - public string TpCode { get; set; } + public string? TransactionCode { get; set; } + public string? TpCode { get; set; } public DateTime? RecivedDate { get; set; } public byte? Posted { get; set; } public DateTime? PostedDate { get; set; } @@ -17,24 +17,24 @@ namespace SytelineSaAppEfDataModel.Entities public short? ErrorMessage { get; set; } public byte? Override { get; set; } public byte? Ack { get; set; } - public string AckNumber { get; set; } + public string? AckNumber { get; set; } public int? AckSequence { get; set; } - public string AckType { get; set; } + public string? AckType { get; set; } public DateTime? AckDate { get; set; } - public string SymbolicCustomerOrderNumber { get; set; } + public string? SymbolicCustomerOrderNumber { get; set; } public decimal? BlanketDollar { get; set; } - public string Type { get; set; } - public string CustomerOrderNumber { get; set; } - public string EstimatedNumber { get; set; } - public string CustomerNumber { get; set; } + public string? Type { get; set; } + public string? CustomerOrderNumber { get; set; } + public string? EstimatedNumber { get; set; } + public string? CustomerNumber { get; set; } public int? CustomerSequence { get; set; } - public string Contact { get; set; } - public string Phone { get; set; } - public string CustomerPoNumber { get; set; } + public string? Contact { get; set; } + public string? Phone { get; set; } + public string? CustomerPoNumber { get; set; } public DateTime? OrderDate { get; set; } - public string TakenBy { get; set; } - public string TermsCode { get; set; } - public string ShipCode { get; set; } + public string? TakenBy { get; set; } + public string? TermsCode { get; set; } + public string? ShipCode { get; set; } public decimal? Price { get; set; } public decimal? Weight { get; set; } public short? QtyPackages { get; set; } @@ -42,64 +42,64 @@ namespace SytelineSaAppEfDataModel.Entities public decimal? MiscCharges { get; set; } public decimal? PrepaidAmount { get; set; } public decimal? SalesTax { get; set; } - public string Status { get; set; } + public string? Status { get; set; } public decimal? Cost { get; set; } public DateTime? CloseDate { get; set; } public decimal? FreightT { get; set; } public decimal? MchargesT { get; set; } public decimal? PrepaidT { get; set; } public decimal? SalesTaxT { get; set; } - public string Salesman { get; set; } + public string? Salesman { get; set; } public DateTime? EffectiveDate { get; set; } public DateTime? ExpirationDate { get; set; } - public string Warehouse { get; set; } + public string? Warehouse { get; set; } public decimal? SalesTaxTwo { get; set; } public decimal? SalesTaxTwoT { get; set; } - public string CharFieldOne { get; set; } - public string CharFieldTwo { get; set; } - public string CharFieldThree { get; set; } + public string? CharFieldOne { get; set; } + public string? CharFieldTwo { get; set; } + public string? CharFieldThree { get; set; } public DateTime? DateField { get; set; } public decimal? DecimalFieldOne { get; set; } public decimal? DecimalFieldTwo { get; set; } public decimal? DecimalFieldThree { get; set; } public byte? LogiField { get; set; } public byte? EdiOrder { get; set; } - public string TransactionNat { get; set; } - public string ProcessInd { get; set; } - public string DelTerm { get; set; } + public string? TransactionNat { get; set; } + public string? ProcessInd { get; set; } + public string? DelTerm { get; set; } public byte? UseExchangeRate { get; set; } - public string TaxCodeOne { get; set; } - public string TaxCodeTwo { get; set; } - public string FreightTaxCodeOne { get; set; } - public string FreightTaxCodeTwo { get; set; } - public string MscTaxCodeOne { get; set; } - public string MscTaxCodeTwo { get; set; } + public string? TaxCodeOne { get; set; } + public string? TaxCodeTwo { get; set; } + public string? FreightTaxCodeOne { get; set; } + public string? FreightTaxCodeTwo { get; set; } + public string? MscTaxCodeOne { get; set; } + public string? MscTaxCodeTwo { get; set; } public decimal? Discount { get; set; } - public string PriceCode { get; set; } + public string? PriceCode { get; set; } public byte? ShipPartial { get; set; } public byte? ShipEarly { get; set; } - public string NonApplyData { get; set; } + public string? NonApplyData { get; set; } public byte NoteExistsFlag { get; set; } public DateTime RecordDate { get; set; } public Guid RowPointer { get; set; } - public string CreatedBy { get; set; } - public string UpdatedBy { get; set; } + public string? CreatedBy { get; set; } + public string? UpdatedBy { get; set; } public DateTime CreateDate { get; set; } public byte InWorkflow { get; set; } - public string DiscountType { get; set; } + public string? DiscountType { get; set; } public decimal? DiscountAmount { get; set; } - public string TransNatTwo { get; set; } - public string UfFkrEdiMessageRefNum { get; set; } - public string UfFkrEdiConsigneeAddress { get; set; } - public string UfFkrEdiConsigneeName { get; set; } - public string UfFkrEdiFileName { get; set; } - public string UfFkrEdiBuyerDunsNumber { get; set; } - public string Gate { get; set; } - public string CustomerName { get; set; } - public string RecipientCode { get; set; } - public string SenderCode { get; set; } - public string SellerCode { get; set; } - public string DocType { get; set; } - public string BuyerCode { get; set; } + public string? TransNatTwo { get; set; } + public string? UfFkrEdiMessageRefNum { get; set; } + public string? UfFkrEdiConsigneeAddress { get; set; } + public string? UfFkrEdiConsigneeName { get; set; } + public string? UfFkrEdiFileName { get; set; } + public string? UfFkrEdiBuyerDunsNumber { get; set; } + public string? Gate { get; set; } + public string? CustomerName { get; set; } + public string? RecipientCode { get; set; } + public string? SenderCode { get; set; } + public string? SellerCode { get; set; } + public string? DocType { get; set; } + public string? BuyerCode { get; set; } } } diff --git a/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderLine.cs b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderLine.cs index def2f18..366d5f9 100644 --- a/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderLine.cs +++ b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderLine.cs @@ -8,35 +8,35 @@ namespace SytelineSaAppEfDataModel.Entities { public class EdiCustomerOrderLine { - public string CustomerOrderNumber { get; set; } + public string? CustomerOrderNumber { get; set; } public int CustomerOrderLine { get; set; } - public string Item { get; set; } - public string CustomerItemNumber { get; set; } - public string FeatStr { get; set; } + public string? Item { get; set; } + public string? CustomerItemNumber { get; set; } + public string? FeatStr { get; set; } public decimal? BlanketQty { get; set; } public DateTime? EffectiveDate { get; set; } public DateTime? ExpirationDate { get; set; } public decimal? ContPrice { get; set; } - public string Status { get; set; } + public string? Status { get; set; } public DateTime? PromiseDate { get; set; } - public string PriceCode { get; set; } - public string Uom { get; set; } + public string? PriceCode { get; set; } + public string? Uom { get; set; } public decimal? BlanketQtyReleased { get; set; } public decimal? ContPriceReleased { get; set; } public decimal? QtySent { get; set; } - public string SentCode { get; set; } - public string NonAppliedData { get; set; } + public string? SentCode { get; set; } + public string? NonAppliedData { get; set; } public byte NoteExistsFlag { get; set; } public DateTime RecordDate { get; set; } public Guid RowPointer { get; set; } - public string Description { get; set; } - public string CreatedBy { get; set; } - public string UpdatedBy { get; set; } - public DateTime CreateDate { get; set; } + public string? Description { get; set; } + public string? CreatedBy { get; set; } + public string? UpdatedBy { get; set; } + public DateTime? CreateDate { get; set; } public byte InWorkflow { get; set; } - public string BoxType { get; set; } - public string Address { get; set; } - public string FinalDestination { get; set; } + public string? BoxType { get; set; } + public string? Address { get; set; } + public string? FinalDestination { get; set; } public int? QtyPerBox { get; set; } } } diff --git a/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderLineItem.cs b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderLineItem.cs index 86c2a9e..530d491 100644 --- a/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderLineItem.cs +++ b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderLineItem.cs @@ -8,7 +8,7 @@ namespace SytelineSaAppEfDataModel.Entities { public class EdiCustomerOrderLineItem { - public string TransactionCode { get; set; } + public string? TransactionCode { get; set; } public DateTime? ReceivedDate { get; set; } public byte? Posted { get; set; } public DateTime? PostedDate { get; set; } @@ -17,17 +17,17 @@ namespace SytelineSaAppEfDataModel.Entities public byte? Override { get; set; } public byte? Edi { get; set; } public byte? Ack { get; set; } - public string AckNumber { get; set; } - public string AckType { get; set; } + public string? AckNumber { get; set; } + public string? AckType { get; set; } public DateTime? AckDate { get; set; } - public string SymCustomerOrderNumber { get; set; } + public string? SymCustomerOrderNumber { get; set; } public byte? QtyChanged { get; set; } public byte? DateChanged { get; set; } public byte? PriceChanged { get; set; } - public string CustomerOrderNumber { get; set; } + public string? CustomerOrderNumber { get; set; } public int CustomerOrderLine { get; set; } public int CustomerOrderRelease { get; set; } - public string Item { get; set; } + public string? Item { get; set; } public decimal? QtyOrdered { get; set; } public decimal? QtyReady { get; set; } public decimal? QtyShipped { get; set; } @@ -35,8 +35,8 @@ namespace SytelineSaAppEfDataModel.Entities public decimal? Discount { get; set; } public decimal? Cost { get; set; } public decimal? Price { get; set; } - public string RefType { get; set; } - public string RefNumber { get; set; } + public string? RefType { get; set; } + public string? RefNumber { get; set; } public short? RefLineSuf { get; set; } public short? RefRelease { get; set; } public DateTime? DueDate { get; set; } @@ -47,67 +47,67 @@ namespace SytelineSaAppEfDataModel.Entities public decimal? BrkQtyFour { get; set; } public decimal? BrkQtyFive { get; set; } public byte? Reprice { get; set; } - public string CustomerItem { get; set; } + public string? CustomerItem { get; set; } public decimal? QtyInvoiced { get; set; } public decimal? QtyReturned { get; set; } public decimal? CgsTotal { get; set; } - public string FeatStr { get; set; } - public string Status { get; set; } - public string CustomerNumber { get; set; } + public string? FeatStr { get; set; } + public string? Status { get; set; } + public string? CustomerNumber { get; set; } public int? CustomerSequence { get; set; } public decimal? PrgBillTot { get; set; } public decimal? PrgBillApp { get; set; } public DateTime? ReleaseDate { get; set; } public DateTime? PromiseDate { get; set; } - public string Warehouse { get; set; } - public string WksBasis { get; set; } + public string? Warehouse { get; set; } + public string? WksBasis { get; set; } public decimal? WksValue { get; set; } - public string CommCode { get; set; } - public string TransNat { get; set; } - public string ProcessInd { get; set; } - public string DelTerm { get; set; } + public string? CommCode { get; set; } + public string? TransNat { get; set; } + public string? ProcessInd { get; set; } + public string? DelTerm { get; set; } public decimal? UnitWeight { get; set; } - public string Origin { get; set; } + public string? Origin { get; set; } public int? ConsNumber { get; set; } - public string TaxCodeOne { get; set; } - public string TaxCodeTwo { get; set; } + public string? TaxCodeOne { get; set; } + public string? TaxCodeTwo { get; set; } public decimal? ExportValue { get; set; } - public string EcCode { get; set; } - public string Transport { get; set; } + public string? EcCode { get; set; } + public string? Transport { get; set; } public DateTime? PickupDate { get; set; } - public string PriceCode { get; set; } - public string Uom { get; set; } + public string? PriceCode { get; set; } + public string? Uom { get; set; } public decimal? QtyOrderedReleased { get; set; } public decimal? PriceReleased { get; set; } - public string CustomerOrderCustomerNumber { get; set; } + public string? CustomerOrderCustomerNumber { get; set; } public byte? Packed { get; set; } public byte? Bol { get; set; } public decimal? QtyBco { get; set; } - public string BcoCode { get; set; } - public string ExternalRef { get; set; } - public string CustomerPoNumber { get; set; } - public string NonApplyData { get; set; } + public string? BcoCode { get; set; } + public string? ExternalRef { get; set; } + public string? CustomerPoNumber { get; set; } + public string? NonApplyData { get; set; } public byte NoteExistsFlag { get; set; } public DateTime RecordDate { get; set; } public Guid RowPointer { get; set; } - public string Description { get; set; } - public string CreatedBy { get; set; } - public string UpdatedBy { get; set; } + public string? Description { get; set; } + public string? CreatedBy { get; set; } + public string? UpdatedBy { get; set; } public DateTime CreateDate { get; set; } public byte InWorkflow { get; set; } - public string TransNatTwo { get; set; } + public string? TransNatTwo { get; set; } public decimal SupplyQtyConvFactor { get; set; } - public string UfFkrEdiAddIntDest { get; set; } - public string UfFkrEdiCustPoLineNum { get; set; } - public string UfFkrEdiPlaceOrPortDischarge { get; set; } - public string RoutingCode { get; set; } - public string DeliveryCallNumber { get; set; } - public string UnloadingPoint { get; set; } - public string DestinationPoint { get; set; } - public string NewStatus { get; set; } - public string PalletCode { get; set; } - public string PalletNumber { get; set; } + public string? UfFkrEdiAddIntDest { get; set; } + public string? UfFkrEdiCustPoLineNum { get; set; } + public string? UfFkrEdiPlaceOrPortDischarge { get; set; } + public string? RoutingCode { get; set; } + public string? DeliveryCallNumber { get; set; } + public string? UnloadingPoint { get; set; } + public string? DestinationPoint { get; set; } + public string? NewStatus { get; set; } + public string? PalletCode { get; set; } + public string? PalletNumber { get; set; } - public string DocumentType { get; set; } + public string? DocumentType { get; set; } } } diff --git a/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderTranslate.cs b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderTranslate.cs index 81aa9db..881e55a 100644 --- a/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderTranslate.cs +++ b/SytelineSaAppEfDataModel/Entities/EdiCustomerOrderTranslate.cs @@ -11,14 +11,14 @@ namespace SytelineSaAppEfDataModel.Entities public int Id { get; set; } public byte CoEdiOrder { get; set; } public Guid CoRowPointer { get; set; } - public string CoCoNum { get; set; } - public string CoType { get; set; } - public string CoTakenBy { get; set; } - public string EdiCoCoNum { get; set; } + public string? CoCoNum { get; set; } + public string? CoType { get; set; } + public string? CoTakenBy { get; set; } + public string? EdiCoCoNum { get; set; } public int OrdersCount { get; set; } public bool OrderFound { get; set; } public DateTime CreatedDate { get; set; } - public string FoundNumbers { get; set; } + public string? FoundNumbers { get; set; } public int ScheduleOrderId { get; set; } } } diff --git a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs index 9cf2726..d2836be 100644 --- a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs @@ -17,7 +17,7 @@ namespace SytelineSaAppEfDataModel.Services return int.Parse(lastOrderNumber); } - + public async Task> GetAll() { IList ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel.Services { if (!ediTranslatesByCoNumber.TryGetValue(ediCustomerOrder.CustomerOrderNumber, out List? customerOrderTranslates)) continue; - + customerOrderTranslates = customerOrderTranslates.OrderByDescending(x => x.CreatedDate).ToList(); ediCustomerOrder.EdiCustomerOrderTranslates = customerOrderTranslates; } @@ -65,7 +65,7 @@ namespace SytelineSaAppEfDataModel.Services { return null; } - + IList ediCustomerOrderLines = await context.EdiCustomerOrderLines .Where(x => x.CustomerOrderNumber == ediCustomerOrder.CustomerOrderNumber) .Select(x => mapper.Map(x)).ToListAsync(); @@ -87,7 +87,7 @@ namespace SytelineSaAppEfDataModel.Services return ediCustomerOrder; } - + public async Task> FindMissingOrders(DateTime startDate) { IList ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates @@ -109,14 +109,19 @@ namespace SytelineSaAppEfDataModel.Services public async Task SendOrderToSyteline(Guid customerOrderNumber) { - EdiCustomerOrder? ediCustomerOrder = await context.EdiCustomerOrders.FirstOrDefaultAsync(x => x.RowPointer == customerOrderNumber); - + EdiCustomerOrder? ediCustomerOrder = + await context.EdiCustomerOrders.FirstOrDefaultAsync(x => x.RowPointer == customerOrderNumber); + if (ediCustomerOrder == null) return 0; - var ediCoNum = new SqlParameter("@PEdiCoNum", SqlDbType.NVarChar, 50) { Value = ediCustomerOrder.CustomerOrderNumber }; - var ediCoCount = new SqlParameter("@PEdiCoCount", SqlDbType.Int) { Value = 0, Direction = ParameterDirection.Output }; - var postedCount = new SqlParameter("@PPostedCount", SqlDbType.Int) { Value = 0, Direction = ParameterDirection.Output }; - var infoBar = new SqlParameter("@Infobar", SqlDbType.NVarChar, 2800) { Value = "", Direction = ParameterDirection.Output }; + var ediCoNum = new SqlParameter("@PEdiCoNum", SqlDbType.NVarChar, 50) + { Value = ediCustomerOrder.CustomerOrderNumber }; + var ediCoCount = new SqlParameter("@PEdiCoCount", SqlDbType.Int) + { Value = 0, Direction = ParameterDirection.Output }; + var postedCount = new SqlParameter("@PPostedCount", SqlDbType.Int) + { Value = 0, Direction = ParameterDirection.Output }; + var infoBar = new SqlParameter("@Infobar", SqlDbType.NVarChar, 2800) + { Value = "", Direction = ParameterDirection.Output }; var autoPost = new SqlParameter("@AutoPost", SqlDbType.Int) { Value = 0 }; var processId = new SqlParameter("@ProcessId", SqlDbType.Int) { Value = 423456 }; @@ -134,5 +139,33 @@ namespace SytelineSaAppEfDataModel.Services return postedCountResult; } + + public async Task<(bool, string)> SaveOrdersWithDetails(List ediCustomerOrders) + { + if (ediCustomerOrders.Count == 0) + { + return (false, string.Empty); + } + + try + { + await context.EdiCustomerOrders.AddRangeAsync(ediCustomerOrders.Select(mapper.Map)); + await context.EdiCustomerOrderLines.AddRangeAsync(ediCustomerOrders + .SelectMany(x => x.EdiCustomerOrderLines) + .Select(mapper.Map)); + await context.EdiCustomerOrderLineItems.AddRangeAsync(ediCustomerOrders + .SelectMany(x => x.EdiCustomerOrderLines) + .SelectMany(y => y.EdiCustomerOrderLineItems).Select(mapper.Map)); + await context.EdiCustomerOrderTranslates.AddRangeAsync(ediCustomerOrders + .SelectMany(x => x.EdiCustomerOrderTranslates) + .Select(mapper.Map)); + await context.SaveChangesAsync(); + return (true, string.Empty); + } + catch (Exception ex) + { + return (false, ex.Message); + } + } } } diff --git a/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderService.cs index 72dff5a..472b5ab 100644 --- a/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderService.cs @@ -14,6 +14,7 @@ namespace SytelineSaAppEfDataModel.Services Task> GetByDate(DateTime date); Task GetByOrderNumber(Guid orderNumber); Task> FindMissingOrders(DateTime startDate); + Task<(bool, string)> SaveOrdersWithDetails(List ediCustomerOrders); Task SendOrderToSyteline(Guid customerOrderNumber); } } From 0199467f72b61f672d76b62b8d9abf08e38d96a7 Mon Sep 17 00:00:00 2001 From: trencik91 Date: Wed, 3 Sep 2025 15:04:22 +0200 Subject: [PATCH 049/149] * Extended of Dtos * Added new Services and Controllers --- .../EdiCustomerOrderImportController.cs | 19 ++++++++++ .../EdiCustomerOrdersController.cs | 2 +- FaKrosnoApi/Controllers/EdiLogController.cs | 19 ++++++++++ FaKrosnoApi/Program.cs | 29 +++++++------- FaKrosnoApi/appsettings.json | 2 +- .../Dtos/EdiCustomerOrderDto.cs | 3 ++ SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs | 11 ++++++ SytelineSaAppEfDataModel/Entities/EdiLog.cs | 11 ++++++ SytelineSaAppEfDataModel/MappingProfile.cs | 1 + .../Services/EdiCustomerOrderImportService.cs | 16 ++++++++ .../Services/EdiCustomerOrderService.cs | 17 +++++---- .../Services/EdiLogService.cs | 15 ++++++++ .../IEdiCustomerOrderImportService.cs | 4 ++ .../Services/IEdiLogService.cs | 8 ++++ .../SytelineSaAppDbContext.cs | 38 +++++++++++++++++++ 15 files changed, 172 insertions(+), 23 deletions(-) create mode 100644 FaKrosnoApi/Controllers/EdiLogController.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/EdiLog.cs create mode 100644 SytelineSaAppEfDataModel/Services/EdiLogService.cs create mode 100644 SytelineSaAppEfDataModel/Services/IEdiLogService.cs diff --git a/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs b/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs index 1f59aee..a73553f 100644 --- a/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs +++ b/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; using SytelineSaAppEfDataModel.Services; namespace FaKrosnoApi.Controllers; @@ -13,4 +14,22 @@ public class EdiCustomerOrderImportController(IEdiCustomerOrderImportService ser DateTime lastUpdateDate = await service.GetLastUpdateDate(); return Ok(lastUpdateDate); } + + [HttpPost] + public async Task Add([FromBody] EdiCustomerOrderImportDto ediCustomerOrderImport) + { + var result = await service.AddEdiCustomerOrderImport(ediCustomerOrderImport); + return result + ? Ok("Utworzono rekord w tabeli EdiCustomerOrderImport.") + : BadRequest($"Nie mogę utworzyć rekordu w tabeli EdiCustomerOrderImport."); + } + + [HttpPost("add-bulk")] + public async Task Add([FromBody] IList ediCustomerOrderImports) + { + var result = await service.AddEdiCustomerOrderImports(ediCustomerOrderImports); + return result + ? Ok("Utworzono rekordy w tabeli EdiCustomerOrderImport.") + : BadRequest($"Nie mogę utworzyć rekordów w tabeli EdiCustomerOrderImport."); + } } \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs b/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs index d11a1b5..b690cc6 100644 --- a/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs +++ b/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs @@ -55,7 +55,7 @@ namespace FaKrosnoApi.Controllers var result = await service.SaveOrdersWithDetails(ediCustomerOrders); return result.Item1 - ? Ok("Orders saved successfully.") + ? Ok(result) : BadRequest($"Failed to save orders. Error: {result.Item2}"); } } diff --git a/FaKrosnoApi/Controllers/EdiLogController.cs b/FaKrosnoApi/Controllers/EdiLogController.cs new file mode 100644 index 0000000..5af8a40 --- /dev/null +++ b/FaKrosnoApi/Controllers/EdiLogController.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class EdiLogController(IEdiLogService service) : Controller +{ + [HttpPost] + public async Task Add([FromBody] EdiLogDto ediLog) + { + var result = await service.AddEdiLog(ediLog); + return result + ? Ok("Utworzono rekord w tabeli EdiLog.") + : BadRequest($"Nie mogę utworzyć rekordu w tabeli EdiLog."); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index 476fa0e..b5efa89 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -66,19 +66,19 @@ builder.Services.AddOpenApiDocument(config => config.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer")); }); -// builder.Services.AddHangfire(config => config -// .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) -// .UseSimpleAssemblyNameTypeSerializer() -// .UseRecommendedSerializerSettings() -// .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions -// { -// CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), -// SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), -// QueuePollInterval = TimeSpan.Zero, -// UseRecommendedIsolationLevel = true, -// DisableGlobalLocks = true -// })); -// builder.Services.AddHangfireServer(); +builder.Services.AddHangfire(config => config + .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) + .UseSimpleAssemblyNameTypeSerializer() + .UseRecommendedSerializerSettings() + .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions + { + CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), + SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), + QueuePollInterval = TimeSpan.Zero, + UseRecommendedIsolationLevel = true, + DisableGlobalLocks = true + })); +builder.Services.AddHangfireServer(); builder.Services.AddAutoMapper(typeof(FaKrosnoMappingProfile), typeof(SytelineSaAppMappingProfile), typeof(OrdersManagementMappingProfile)); @@ -108,6 +108,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); @@ -125,6 +126,6 @@ app.UseAuthorization(); app.MapControllers(); -//app.UseHangfireDashboard(); +app.UseHangfireDashboard(); app.Run(); diff --git a/FaKrosnoApi/appsettings.json b/FaKrosnoApi/appsettings.json index a907f3a..afce1d8 100644 --- a/FaKrosnoApi/appsettings.json +++ b/FaKrosnoApi/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { "FaKrosnoConnection": "Server=192.168.0.7;Database=fakrosno;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true", - "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PROD_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true", + "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PRODTEST_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true", "OrdersManagementConnection": "Server=192.168.0.7;Database=OrdersManagement;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true" }, "Logging": { diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs index 0986ca9..ed84d72 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using AutoMapper.Configuration.Annotations; namespace SytelineSaAppEfDataModel.Dtos { @@ -105,6 +106,8 @@ namespace SytelineSaAppEfDataModel.Dtos public string TranslatedStatus => TranslateStatus(Status ?? string.Empty); public string? SlOrderNumber => EdiCustomerOrderTranslates.MaxBy(x => x.CreatedDate)?.CoCoNum; public string SentToSl => Posted == 1 ? "TAK" : "NIE"; + [Ignore] public int ScheduleOrderId { get; set; } + [Ignore] public DateTime LastUpdateDate { get; set; } public IEnumerable EdiCustomerOrderLines { get; set; } = new List(); public IEnumerable EdiCustomerOrderTranslates { get; set; } = new List(); diff --git a/SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs new file mode 100644 index 0000000..9953e01 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs @@ -0,0 +1,11 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class EdiLogDto +{ + public int Id { get; set; } + public string ProcessName { get; set; } + public string ConfigurationName { get; set; } + public int Status { get; set; } + public string LogText { get; set; } + public DateTime Date { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/EdiLog.cs b/SytelineSaAppEfDataModel/Entities/EdiLog.cs new file mode 100644 index 0000000..602b935 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/EdiLog.cs @@ -0,0 +1,11 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class EdiLog +{ + public int Id { get; set; } + public string ProcessName { get; set; } + public string ConfigurationName { get; set; } + public int Status { get; set; } + public string LogText { get; set; } + public DateTime Date { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 9a27cfa..f7dbb77 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -31,6 +31,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs index edf9e36..9118519 100644 --- a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs +++ b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs @@ -1,5 +1,7 @@ using AutoMapper; using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Entities; namespace SytelineSaAppEfDataModel.Services; @@ -10,4 +12,18 @@ public class EdiCustomerOrderImportService(SytelineSaAppDbContext context, IMapp return (await context.EdiCustomerOrderImports.OrderByDescending(x => x.LastUpdateDate) .FirstOrDefaultAsync())?.LastUpdateDate ?? DateTime.Now.Date; } + + public async Task AddEdiCustomerOrderImport(EdiCustomerOrderImportDto ediCustomerOrderImport) + { + var entity = mapper.Map(ediCustomerOrderImport); + await context.EdiCustomerOrderImports.AddAsync(entity); + return await context.SaveChangesAsync() > 0; + } + + public async Task AddEdiCustomerOrderImports(IList ediCustomerOrderImports) + { + var entities = mapper.Map>(ediCustomerOrderImports); + context.EdiCustomerOrderImports.AddRange(entities); + return await context.SaveChangesAsync() > 0; + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs index d2836be..1876637 100644 --- a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs @@ -149,13 +149,16 @@ namespace SytelineSaAppEfDataModel.Services try { - await context.EdiCustomerOrders.AddRangeAsync(ediCustomerOrders.Select(mapper.Map)); - await context.EdiCustomerOrderLines.AddRangeAsync(ediCustomerOrders - .SelectMany(x => x.EdiCustomerOrderLines) - .Select(mapper.Map)); - await context.EdiCustomerOrderLineItems.AddRangeAsync(ediCustomerOrders - .SelectMany(x => x.EdiCustomerOrderLines) - .SelectMany(y => y.EdiCustomerOrderLineItems).Select(mapper.Map)); + IList customerOrders = ediCustomerOrders.Select(mapper.Map).ToList(); + IList ediCustomerOrderLines = ediCustomerOrders + .SelectMany(x => x.EdiCustomerOrderLines).Select(mapper.Map).ToList(); + IList ediCustomerOrderLineItems = ediCustomerOrders + .SelectMany(x => x.EdiCustomerOrderLines).SelectMany(y => y.EdiCustomerOrderLineItems) + .Select(mapper.Map).ToList(); + + await context.EdiCustomerOrders.AddRangeAsync(customerOrders); + await context.EdiCustomerOrderLines.AddRangeAsync(ediCustomerOrderLines); + await context.EdiCustomerOrderLineItems.AddRangeAsync(ediCustomerOrderLineItems); await context.EdiCustomerOrderTranslates.AddRangeAsync(ediCustomerOrders .SelectMany(x => x.EdiCustomerOrderTranslates) .Select(mapper.Map)); diff --git a/SytelineSaAppEfDataModel/Services/EdiLogService.cs b/SytelineSaAppEfDataModel/Services/EdiLogService.cs new file mode 100644 index 0000000..2672925 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/EdiLogService.cs @@ -0,0 +1,15 @@ +using AutoMapper; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Entities; + +namespace SytelineSaAppEfDataModel.Services; + +public class EdiLogService(SytelineSaAppDbContext context, IMapper mapper) : IEdiLogService +{ + public async Task AddEdiLog(EdiLogDto ediLog) + { + var entity = mapper.Map(ediLog); + await context.EdiLogs.AddAsync(entity); + return await context.SaveChangesAsync() > 0; + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs index 12c0cb8..b621444 100644 --- a/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs +++ b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs @@ -1,6 +1,10 @@ +using SytelineSaAppEfDataModel.Dtos; + namespace SytelineSaAppEfDataModel.Services; public interface IEdiCustomerOrderImportService { Task GetLastUpdateDate(); + Task AddEdiCustomerOrderImport(EdiCustomerOrderImportDto ediCustomerOrderImport); + Task AddEdiCustomerOrderImports(IList ediCustomerOrderImports); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IEdiLogService.cs b/SytelineSaAppEfDataModel/Services/IEdiLogService.cs new file mode 100644 index 0000000..bdb653c --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IEdiLogService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IEdiLogService +{ + Task AddEdiLog(EdiLogDto ediLog); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 8495b6f..41c790a 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -30,6 +30,7 @@ namespace SytelineSaAppEfDataModel public DbSet Items { get; set; } public DbSet VatCodeAssociations { get; set; } public DbSet ItemCustPriceAlls { get; set; } + public DbSet EdiLogs { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { @@ -2468,6 +2469,43 @@ namespace SytelineSaAppEfDataModel .HasDatabaseName("IX_itemcustprice_all_RowPointer") .IsUnique(); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("edi_logs"); + + entity.HasKey(e => e.Id); + + entity.Property(e => e.Id) + .HasColumnName("Id") + .HasColumnType("int") + .IsRequired(); + + entity.Property(e => e.ProcessName) + .HasColumnName("ProcessName") + .HasMaxLength(200) + .IsRequired(); + + entity.Property(e => e.ConfigurationName) + .HasColumnName("ConfigurationName") + .HasMaxLength(200) + .IsRequired(); + + entity.Property(e => e.Status) + .HasColumnName("Status") + .HasColumnType("int") + .IsRequired(); + + entity.Property(e => e.LogText) + .HasColumnName("LogText") + .HasColumnType("varchar(max)") + .IsRequired(); + + entity.Property(e => e.Date) + .HasColumnName("Date") + .HasColumnType("datetime") + .IsRequired(); + }); } } } From d3694ad0c4233f5f47e0402f8b7f9bd91c532784 Mon Sep 17 00:00:00 2001 From: trencik91 Date: Wed, 3 Sep 2025 15:04:51 +0200 Subject: [PATCH 050/149] * Changed database name --- FaKrosnoApi/appsettings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FaKrosnoApi/appsettings.json b/FaKrosnoApi/appsettings.json index afce1d8..a907f3a 100644 --- a/FaKrosnoApi/appsettings.json +++ b/FaKrosnoApi/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { "FaKrosnoConnection": "Server=192.168.0.7;Database=fakrosno;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true", - "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PRODTEST_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true", + "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PROD_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true", "OrdersManagementConnection": "Server=192.168.0.7;Database=OrdersManagement;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true" }, "Logging": { From bfe325df82d48141cb7ef7977ecbd1df4e56c541 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 4 Sep 2025 06:00:54 +0200 Subject: [PATCH 051/149] * Added Simple view to PackingList --- .../Pages/WarehousePacklistSimple.razor | 413 ++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 OrdersManagement/Components/Pages/WarehousePacklistSimple.razor diff --git a/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor b/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor new file mode 100644 index 0000000..d88359b --- /dev/null +++ b/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor @@ -0,0 +1,413 @@ +@page "/Warehouse/PackList/{WzHeader:guid}/Simple" +@using OrdersManagement.Models +@using Syncfusion.Blazor.Cards +@using Syncfusion.Blazor.Grids +@using SytelineSaAppEfDataModel.Dtos +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Popups +@using Syncfusion.Blazor.Inputs +@using FilterType = Syncfusion.Blazor.Grids.FilterType + +@inject WarehouseService WarehouseService + +
+ + +

Packing List

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @if (_isValid) + { +

Packing List został wygenerowany i wysłany!

+ } + 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!

+ } +
+
+ + + +
+ + + + +

Błąd skanowania! Wystąpił jeden z wyjątków (Zeskanowana wartość '@ScannedValue'):

+
    +
  • Zeskanowano niepoprawny Numer Partii SL (nieistniejący w tabeli)

  • +
  • Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od + @($"{DateTime.Now.Year - 2000}X"))

  • +
  • Numer Palety nie jest większy niż 0 (aktualnie wybrany numer palety: + '@PalletNumber')

  • +
+
+
+ + + +
+ + + + +

Błąd skanowania! Wybierz NUMER PALETY większy niż 0 (Aktualnie '@PalletNumber'):

+
+
+ + + +
+ + + FA Krosno Manager © @(DateTime.Now.Year) + +
+
+ +@code { + [Parameter] public Guid WzHeader { get; set; } + + private List WzRowsMeyle { get; set; } = new(); + private IDictionary> TransactionModelsByPartNumber { get; set; } = new Dictionary>(); + private List ChangedRecords = new(); + private WzHeaderDto _wzHeader; + private SfTextBox _scanner; + + private string ItemNumber { get; set; } = string.Empty; + private string Qty { get; set; } = "0"; + private string PalletNumberOutput { get; set; } = "0"; + private string PartNumberSl { get; set; } = string.Empty; + private string PartNumberMeyle { get; set; } = string.Empty; + + private string WzNumber { get; set; } = string.Empty; + + private WzRowMeyleDto? SelectedRow { get; set; } + private List SelectedRows { get; set; } = new(); + + private bool _isValid; + + private bool Visibility { get; set; } + private bool VisibilityValidation { get; set; } + private bool VisibilityLineSplitter { get; set; } + public bool VisibilityPalletNumber { get; set; } + + private string? EmailAddresses { get; set; } = string.Empty; + private string PalletNumber { get; set; } = "0"; + + private string LastScannedValue { get; set; } = string.Empty; + private string ScannedValue { get; set; } = string.Empty; + + private void HideModal() + { + Visibility = false; + VisibilityValidation = false; + VisibilityLineSplitter = false; + VisibilityPalletNumber = false; + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); + WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + + TransactionModelsByPartNumber = await GetTransactionModels(); + + EmailAddresses = _wzHeader.EmailAddresses; + + WzNumber = _wzHeader.WzNumbers ?? string.Empty; + + await _scanner.FocusAsync(); + StateHasChanged(); + } + } + + private async Task SaveChanges() + { + if (!string.IsNullOrWhiteSpace(EmailAddresses)) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + } + + if (ChangedRecords.Any()) + { + await UpdateRows(ChangedRecords); + } + } + + private async Task OnBatchSave(BeforeBatchSaveArgs obj) + { + var changes = obj.BatchChanges; + List changedRecords = changes.ChangedRecords; + + if (!changedRecords.Any()) return; + + await UpdateRows(changedRecords); + } + + private async Task ExportXls() + { + int count = WzRowsMeyle.Count(x => x.PalletNumber == null); + + _isValid = count == 0; + _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); + + if (_isValid) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + await WarehouseService.GenerateXlsForMeyleAsync(WzHeader); + } + + Visibility = true; + } + + private void ScanValue(ChangedEventArgs obj) + { + if (string.IsNullOrWhiteSpace(obj.Value)) return; + if (int.Parse(PalletNumber) <= 0) + { + VisibilityPalletNumber = true; + return; + } + + ScannedValue = obj.Value.Trim(); + + StateHasChanged(); + + TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); + TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); + + if (materialTransactionByPartNumber == null && IsValidScannedValue(obj.Value)) + { + FillMeylePartNumber(ScannedValue); + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + return; + } + + if (materialTransactionByPartNumber != null) + { + FillFaPartNumberAndPalletNumber(materialTransactionByPartNumber, obj.Value.Trim()); + } + + if (materialTransactionByPartNumber == null) + { + ShowValidationMessage(); + return; + } + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + private bool IsValidScannedValue(string scannedValue) + { + int year = DateTime.Now.Year - 2000; + + string format = $"{year}X"; + + return scannedValue.StartsWith(format); + } + + private async Task FillMeylePartNumber(string scannedValue) + { + if (SelectedRow != null && !SelectedRows.Any()) + { + SelectedRow.PartNumber = scannedValue; + ChangedRecords.Add(SelectedRow); + + PartNumberMeyle = scannedValue; + } + + foreach (WzRowMeyleDto wzRowMeyleDto in SelectedRows) + { + wzRowMeyleDto.PartNumber = scannedValue; + ChangedRecords.Add(wzRowMeyleDto); + } + + await SaveChanges(); + + ChangedRecords.Clear(); + SelectedRows.Clear(); + + await _scanner.FocusAsync(); + } + + private async Task FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) + { + await InvokeAsync(StateHasChanged); + + int palletNumber = int.Parse(PalletNumber); + int rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + + switch (rowIndex) + { + case -1: + { + SelectedRows = WzRowsMeyle.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList(); + + if (SelectedRows.Count == 0) + { + ShowValidationMessage(); + return; + } + + var validCombinations = FindCombinations(SelectedRows, (int?)materialTransactionByPartNumber.Quantity ?? 0); + + foreach (var combination in validCombinations) + { + foreach (var record in combination) + { + record.PartNumberSl = scannedValue; + record.PalletNumber = palletNumber; + ChangedRecords.Add(record); + } + } + + SelectedRows.Clear(); + SelectedRows.AddRange(ChangedRecords); + + SelectedRow = SelectedRows.FirstOrDefault(); + + break; + } + default: + { + SelectedRow = WzRowsMeyle[rowIndex]; + + SelectedRow.PartNumberSl = scannedValue; + SelectedRow.PalletNumber = palletNumber; + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + break; + } + } + + PartNumberSl = SelectedRow?.PartNumberSl ?? string.Empty; + PalletNumberOutput = SelectedRow?.PalletNumber.ToString() ?? "0"; + ItemNumber = SelectedRow?.FaIndex ?? string.Empty; + Qty = SelectedRow?.Quantity.ToString() ?? "0"; + + await SaveChanges(); + ChangedRecords.Clear(); + await _scanner.FocusAsync(); + } + + private void ShowValidationMessage() + { + VisibilityValidation = true; + + ChangedRecords.Clear(); + _scanner.FocusAsync(); + } + + private async Task>> GetTransactionModels() + { + return await WarehouseService.GetTransactionsModels(); + } + + private async Task UpdateRows(IList changedRecords) + { + await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); + + WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + await InvokeAsync(StateHasChanged); + } + + private List> FindCombinations(List records, int targetSum) + { + var result = new List>(); + var currentCombination = new List(); + + void Backtrack(int start, int currentSum) + { + if (currentSum == targetSum) + { + result.Add(new List(currentCombination)); + return; + } + + for (int i = start; i < records.Count; i++) + { + if (currentSum + records[i].Quantity <= targetSum) + { + currentCombination.Add(records[i]); + Backtrack(i + 1, currentSum + records[i].Quantity ?? 0); + currentCombination.RemoveAt(currentCombination.Count - 1); + } + } + } + + Backtrack(0, 0); + return result; + } +} \ No newline at end of file From 85d571ed7f5825a0d22f13596ab729e2a282e834 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 4 Sep 2025 06:14:39 +0200 Subject: [PATCH 052/149] * Added button to change view --- .../Components/Pages/WarehousePackList.razor | 19 +++++++++---- .../Pages/WarehousePacklistSimple.razor | 28 +++++++++++++------ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 8e11b74..75aa5b1 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -1,17 +1,16 @@ @page "/Warehouse/PackList/{WzHeader:guid}" -@using System.Diagnostics @using OrdersManagement.Models -@using Syncfusion.Blazor @using Syncfusion.Blazor.Cards -@using Syncfusion.Blazor.Data @using Syncfusion.Blazor.Grids @using SytelineSaAppEfDataModel.Dtos @using Syncfusion.Blazor.Navigations @using Syncfusion.Blazor.Popups @using Syncfusion.Blazor.Inputs -@using Action = System.Action @using FilterType = Syncfusion.Blazor.Grids.FilterType +@using Syncfusion.Blazor.Buttons +@using SelectionType = Syncfusion.Blazor.Grids.SelectionType +@inject NavigationManager NavigationManager @inject WarehouseService WarehouseService
@@ -20,6 +19,11 @@

Packing List

+ + + Zmień widok + + @@ -33,7 +37,7 @@ - + @@ -16,6 +16,11 @@

Packing List

+ + + Zmień widok + + @@ -29,7 +34,7 @@ - + - + SelectedRows { get; set; } = new(); @@ -291,7 +296,7 @@ } await SaveChanges(); - + ChangedRecords.Clear(); SelectedRows.Clear(); @@ -333,7 +338,7 @@ SelectedRows.AddRange(ChangedRecords); SelectedRow = SelectedRows.FirstOrDefault(); - + break; } default: @@ -351,7 +356,7 @@ break; } } - + PartNumberSl = SelectedRow?.PartNumberSl ?? string.Empty; PalletNumberOutput = SelectedRow?.PalletNumber.ToString() ?? "0"; ItemNumber = SelectedRow?.FaIndex ?? string.Empty; @@ -410,4 +415,9 @@ Backtrack(0, 0); return result; } + + private void ChangeView() + { + NavigationManager.NavigateTo($"/Warehouse/PackList/{WzHeader}"); + } } \ No newline at end of file From f45baa31a5c45ac8ab10d4030c104bc4256fe777 Mon Sep 17 00:00:00 2001 From: trencik91 Date: Thu, 4 Sep 2025 10:01:43 +0200 Subject: [PATCH 053/149] * Added button to generate XLS --- .../Components/Pages/WarehousePacklistSimple.razor | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor b/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor index 270403a..dea363d 100644 --- a/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor +++ b/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor @@ -16,9 +16,10 @@

Packing List

- + Zmień widok + Generuj XLS i Wyślij From 89792d3d2868a189cdb5fec948b5591cb0dc6f15 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 8 Sep 2025 21:19:17 +0200 Subject: [PATCH 054/149] * Introduced new WzRowMareli service to handle new client --- .../Controllers/WzRowMareliController.cs | 62 +++++++++++++++++++ FaKrosnoApi/Program.cs | 1 + .../Dtos/WzRowMareliDto.cs | 14 +++++ .../Entities/WzRowMareli.cs | 17 +++++ SytelineSaAppEfDataModel/MappingProfile.cs | 1 + .../Services/IWzRowMareliService.cs | 11 ++++ .../Services/WzRowMareliService.cs | 36 +++++++++++ .../SytelineSaAppDbContext.cs | 59 ++++++++++++++++++ 8 files changed, 201 insertions(+) create mode 100644 FaKrosnoApi/Controllers/WzRowMareliController.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/WzRowMareliDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/WzRowMareli.cs create mode 100644 SytelineSaAppEfDataModel/Services/IWzRowMareliService.cs create mode 100644 SytelineSaAppEfDataModel/Services/WzRowMareliService.cs diff --git a/FaKrosnoApi/Controllers/WzRowMareliController.cs b/FaKrosnoApi/Controllers/WzRowMareliController.cs new file mode 100644 index 0000000..d9879a1 --- /dev/null +++ b/FaKrosnoApi/Controllers/WzRowMareliController.cs @@ -0,0 +1,62 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class WzRowMareliController(IWzRowMareliService service, IMaterialTransactionService materialTransactionService) : Controller +{ + [HttpGet] + public async Task>> GetAll() + { + IEnumerable wzRows = await service.GetAll(); + return Ok(wzRows); + } + + [HttpPost] + public async Task CreateRows([FromBody] IEnumerable rows) + { + if (rows == null || !rows.Any()) + { + return BadRequest("No rows provided."); + } + + await service.CreateRows(rows); + return CreatedAtAction(nameof(GetAll), new { count = rows.Count() }, rows); + } + + [HttpGet("by-wz-header-id")] + public async Task>> GetByWzHeaderId(Guid wzHeaderId) + { + IEnumerable wzRows = await service.GetByWzHeaderId(wzHeaderId); + return Ok(wzRows); + } + + [HttpGet("by-part-number")] + public async Task> GetByPartNumber([FromQuery] string partNumber) + { + MaterialTransactionDto materialTransaction = await materialTransactionService.GetByPartNumber(partNumber); + return Ok(materialTransaction); + } + + [HttpGet("transactions-with-part-number")] + public async Task> GetTransactionsWithPartNumber() + { + IEnumerable materialTransactions = await materialTransactionService.GetWithPartNumber(); + return Ok(materialTransactions); + } + + [HttpPut] + public async Task UpdateRows([FromBody] IEnumerable rows) + { + if (rows == null || !rows.Any()) + { + return BadRequest("No rows provided."); + } + + await service.UpdateRows(rows); + return NoContent(); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index b5efa89..e32d345 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -109,6 +109,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); diff --git a/SytelineSaAppEfDataModel/Dtos/WzRowMareliDto.cs b/SytelineSaAppEfDataModel/Dtos/WzRowMareliDto.cs new file mode 100644 index 0000000..1fb112c --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/WzRowMareliDto.cs @@ -0,0 +1,14 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class WzRowMareliDto +{ + public Guid ID { get; set; } + public Guid? FKHeader { get; set; } + public string Type { get; set; } + public int? PalletNumber { get; set; } + public string ItemNumber { get; set; } + public string EngineerNumber { get; set; } + public int? Quantity { get; set; } + public string OrderNumber { get; set; } + public string WzNumber { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzRowMareli.cs b/SytelineSaAppEfDataModel/Entities/WzRowMareli.cs new file mode 100644 index 0000000..3b13bdc --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/WzRowMareli.cs @@ -0,0 +1,17 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class WzRowMareli +{ + public Guid ID { get; set; } + public Guid? FKHeader { get; set; } + public string Type { get; set; } + public int? PalletNumber { get; set; } + public string ItemNumber { get; set; } + public string EngineerNumber { get; set; } + public int? Quantity { get; set; } + public string OrderNumber { get; set; } + public string WzNumber { get; set; } + + // Navigation property + public WzHeader Header { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index f7dbb77..cc28cee 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -32,6 +32,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/IWzRowMareliService.cs b/SytelineSaAppEfDataModel/Services/IWzRowMareliService.cs new file mode 100644 index 0000000..91fb853 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IWzRowMareliService.cs @@ -0,0 +1,11 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IWzRowMareliService +{ + Task> GetAll(); + Task CreateRows(IEnumerable rows); + Task> GetByWzHeaderId(Guid wzHeaderId); + Task UpdateRows(IEnumerable rows); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzRowMareliService.cs b/SytelineSaAppEfDataModel/Services/WzRowMareliService.cs new file mode 100644 index 0000000..3e3cd36 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/WzRowMareliService.cs @@ -0,0 +1,36 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Entities; + +namespace SytelineSaAppEfDataModel.Services; + +public class WzRowMareliService(SytelineSaAppDbContext context, IMapper mapper) : IWzRowMareliService +{ + public async Task> GetAll() + { + return await context.WzRowsMeyle.Select(x => mapper.Map(x)).ToListAsync(); + } + + public async Task CreateRows(IEnumerable rows) + { + var entities = mapper.Map>(rows); + await context.WzRowsMareli.AddRangeAsync(entities); + await context.SaveChangesAsync(); + } + + public async Task> GetByWzHeaderId(Guid wzHeaderId) + { + return await context.WzRowsMareli + .Where(x => x.FKHeader == wzHeaderId) + .Select(x => mapper.Map(x)) + .ToListAsync(); + } + + public async Task UpdateRows(IEnumerable rows) + { + var entities = mapper.Map>(rows); + context.WzRowsMareli.UpdateRange(entities); + await context.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 41c790a..41abf7c 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -22,6 +22,7 @@ namespace SytelineSaAppEfDataModel public DbSet WzClients { get; set; } public DbSet WzHeaders { get; set; } public DbSet WzRowsMeyle { get; set; } + public DbSet WzRowsMareli { get; set; } public DbSet ItemCusts { get; set; } public DbSet Lots { get; set; } public DbSet EdiCustomerOrderImports { get; set; } @@ -2506,6 +2507,64 @@ namespace SytelineSaAppEfDataModel .HasColumnType("datetime") .IsRequired(); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("wz_row_mareli"); + + entity.HasKey(e => e.ID); + + entity.Property(e => e.ID) + .HasColumnName("ID") + .HasColumnType("uniqueidentifier") + .IsRequired(); + + entity.Property(e => e.FKHeader) + .HasColumnName("FK_Header") + .HasColumnType("uniqueidentifier") + .IsRequired(false); + + entity.Property(e => e.Type) + .HasColumnName("type") + .HasMaxLength(30) + .IsRequired(false); + + entity.Property(e => e.PalletNumber) + .HasColumnName("pallet_number") + .HasColumnType("int") + .IsRequired(false); + + entity.Property(e => e.ItemNumber) + .HasColumnName("item_number") + .HasMaxLength(50) + .IsRequired(false); + + entity.Property(e => e.EngineerNumber) + .HasColumnName("engineer_number") + .HasMaxLength(50) + .IsRequired(false); + + entity.Property(e => e.Quantity) + .HasColumnName("quantity") + .HasColumnType("int") + .IsRequired(false); + + entity.Property(e => e.OrderNumber) + .HasColumnName("order_number") + .HasMaxLength(50) + .IsRequired(false); + + entity.Property(e => e.WzNumber) + .HasColumnName("wz_number") + .HasMaxLength(50) + .IsRequired(false); + + // Foreign Key + entity.HasOne(e => e.Header) + .WithMany() + .HasForeignKey(e => e.FKHeader) + .HasConstraintName("wz_row_mareli_wz_header_ID_fk"); + }); } } } From 50a25ff9960732055681d24c85e49baf423b9ce9 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 9 Sep 2025 07:00:05 +0200 Subject: [PATCH 055/149] * Introduced Marelli packing list --- .../Controllers/WzRowMareliController.cs | 12 +- .../Marelli/MarelliPackList.razor | 419 ++++++++++++++++++ .../Meyle/MeylePackList.razor} | 5 +- .../Meyle/MeylePacklistSimple.razor} | 2 +- .../Components/Pages/Warehouse.razor | 9 +- OrdersManagement/Services/WarehouseService.cs | 12 +- .../{WzRowMareliDto.cs => WzRowMarelliDto.cs} | 4 +- .../{WzRowMareli.cs => WzRowMarelli.cs} | 4 +- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- .../Services/IWzRowMareliService.cs | 8 +- .../Services/WzRowMareliService.cs | 16 +- .../SytelineSaAppDbContext.cs | 14 +- 12 files changed, 477 insertions(+), 30 deletions(-) create mode 100644 OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor rename OrdersManagement/Components/Pages/{WarehousePackList.razor => PackingLists/Meyle/MeylePackList.razor} (99%) rename OrdersManagement/Components/Pages/{WarehousePacklistSimple.razor => PackingLists/Meyle/MeylePacklistSimple.razor} (99%) rename SytelineSaAppEfDataModel/Dtos/{WzRowMareliDto.cs => WzRowMarelliDto.cs} (77%) rename SytelineSaAppEfDataModel/Entities/{WzRowMareli.cs => WzRowMarelli.cs} (80%) diff --git a/FaKrosnoApi/Controllers/WzRowMareliController.cs b/FaKrosnoApi/Controllers/WzRowMareliController.cs index d9879a1..3569631 100644 --- a/FaKrosnoApi/Controllers/WzRowMareliController.cs +++ b/FaKrosnoApi/Controllers/WzRowMareliController.cs @@ -9,14 +9,14 @@ namespace FaKrosnoApi.Controllers; public class WzRowMareliController(IWzRowMareliService service, IMaterialTransactionService materialTransactionService) : Controller { [HttpGet] - public async Task>> GetAll() + public async Task>> GetAll() { - IEnumerable wzRows = await service.GetAll(); + IEnumerable wzRows = await service.GetAll(); return Ok(wzRows); } [HttpPost] - public async Task CreateRows([FromBody] IEnumerable rows) + public async Task CreateRows([FromBody] IEnumerable rows) { if (rows == null || !rows.Any()) { @@ -28,9 +28,9 @@ public class WzRowMareliController(IWzRowMareliService service, IMaterialTransac } [HttpGet("by-wz-header-id")] - public async Task>> GetByWzHeaderId(Guid wzHeaderId) + public async Task>> GetByWzHeaderId(Guid wzHeaderId) { - IEnumerable wzRows = await service.GetByWzHeaderId(wzHeaderId); + IEnumerable wzRows = await service.GetByWzHeaderId(wzHeaderId); return Ok(wzRows); } @@ -49,7 +49,7 @@ public class WzRowMareliController(IWzRowMareliService service, IMaterialTransac } [HttpPut] - public async Task UpdateRows([FromBody] IEnumerable rows) + public async Task UpdateRows([FromBody] IEnumerable rows) { if (rows == null || !rows.Any()) { diff --git a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor new file mode 100644 index 0000000..d4b68ef --- /dev/null +++ b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor @@ -0,0 +1,419 @@ +@page "/Warehouse/Marelli/PackList/{WzHeader:guid}" + +@using OrdersManagement.Models +@using Syncfusion.Blazor.Cards +@using Syncfusion.Blazor.Grids +@using SytelineSaAppEfDataModel.Dtos +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Popups +@using Syncfusion.Blazor.Inputs +@using FilterType = Syncfusion.Blazor.Grids.FilterType +@using Syncfusion.Blazor.Buttons +@using SelectionType = Syncfusion.Blazor.Grids.SelectionType + +@inject NavigationManager NavigationManager +@inject WarehouseService WarehouseService + +
+ + +

Packing List

+
+ + + + Zmień widok + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @if (_isValid) + { +

Packing List został wygenerowany i wysłany!

+ } + 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!

+ } +
+
+ + + +
+ + + + +

Błąd skanowania! Wybierz NUMER PALETY większy niż 0 (Aktualnie '@PalletNumber'):

+
+
+ + + +
+ + FA Krosno Manager © @(DateTime.Now.Year) + +
+
+ +@code { + [Parameter] public Guid WzHeader { get; set; } + + private SfGrid _grid; + private List WzRowsMarelli { get; set; } = new(); + private IDictionary> TransactionModelsByPartNumber { get; set; } = new Dictionary>(); + private List ChangedRecords = new(); + private WzHeaderDto _wzHeader; + private SfTextBox _scanner; + + private WzRowMarelliDto? SelectedRow { get; set; } + private List SelectedRows { get; set; } = new(); + + private string WzNumber { get; set; } = string.Empty; + + private bool _isValid; + + private bool Visibility { get; set; } + public bool VisibilityPalletNumber { get; set; } + + private string? EmailAddresses { get; set; } = string.Empty; + private string PalletNumber { get; set; } = "0"; + + private string LastScannedValue { get; set; } = string.Empty; + private string ScannedValue { get; set; } = string.Empty; + + private bool IsDisabled => SelectedRow == null; + + private void HideModal() + { + Visibility = false; + VisibilityPalletNumber = false; + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); + WzRowsMarelli = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + + TransactionModelsByPartNumber = await GetTransactionModels(); + + EmailAddresses = _wzHeader.EmailAddresses; + + WzNumber = _wzHeader.WzNumbers ?? string.Empty; + + await _scanner.FocusAsync(); + StateHasChanged(); + } + } + + private async Task SaveChanges() + { + if (!string.IsNullOrWhiteSpace(EmailAddresses)) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + } + + if (ChangedRecords.Any()) + { + await UpdateRows(ChangedRecords); + } + + await _grid.EndEditAsync(); + } + + private async Task OnBatchSave(BeforeBatchSaveArgs obj) + { + var changes = obj.BatchChanges; + List changedRecords = changes.ChangedRecords; + + if (!changedRecords.Any()) return; + + await UpdateRows(changedRecords); + } + + private async Task ExportXls() + { + int count = WzRowsMarelli.Count(x => x.PalletNumber == null); + + _isValid = count == 0; + _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); + + if (_isValid) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + await WarehouseService.GenerateXlsForMarelliAsync(WzHeader); + } + + Visibility = true; + } + + private void ScanValue(ChangedEventArgs obj) + { + if (string.IsNullOrWhiteSpace(obj.Value)) return; + if (int.Parse(PalletNumber) <= 0) + { + VisibilityPalletNumber = true; + return; + } + + ScannedValue = obj.Value.Trim(); + + StateHasChanged(); + + TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); + TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); + + _grid.Query = null; + _grid.ClearFilteringAsync(); + + if (materialTransactionByPartNumber != null) + { + SelectedRows.Clear(); + FillFaPartNumberAndPalletNumber(materialTransactionByPartNumber, obj.Value.Trim()); + } + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + private async Task FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) + { + await _grid.ClearSelectionAsync(); + await _grid.Refresh(); + await InvokeAsync(StateHasChanged); + + List selectedIndices = new List(); + int palletNumber = int.Parse(PalletNumber); + int rowIndex = WzRowsMarelli.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + + switch (rowIndex) + { + case -1: + { + SelectedRows = WzRowsMarelli.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList(); + + rowIndex = WzRowsMarelli.FindIndex(x => x.FaIndex == SelectedRows.First().FaIndex && x.Quantity == SelectedRows.First().Quantity); + + var validCombinations = FindCombinations(SelectedRows, (int?)materialTransactionByPartNumber.Quantity ?? 0); + + foreach (var combination in validCombinations) + { + foreach (var record in combination) + { + record.PalletNumber = palletNumber; + ChangedRecords.Add(record); + + int index = WzRowsMarelli.IndexOf(record); + + if (index >= 0) + { + selectedIndices.Add(index); + } + } + } + + SelectedRows.Clear(); + SelectedRows.AddRange(ChangedRecords); + + SelectedRow = SelectedRows.FirstOrDefault(); + + await ApplyFilter(ChangedRecords); + + break; + } + default: + { + SelectedRow = WzRowsMarelli[rowIndex]; + selectedIndices.Add(rowIndex); + + SelectedRow.PalletNumber = palletNumber; + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + break; + } + } + + await SaveChanges(); + ChangedRecords.Clear(); + + if (selectedIndices.Any()) + { + await _grid.SelectRowsAsync(selectedIndices.ToArray()); + } + + await _grid.Refresh(); + await InvokeAsync(StateHasChanged); + + FocusGridRow(rowIndex); + await _scanner.FocusAsync(); + } + + private void FocusGridRow(int rowIndex) + { + if (_grid.AllowPaging) + { + int pageSize = _grid.PageSettings.PageSize; + int targetPage = (rowIndex / pageSize) + 1; + _grid.GoToPageAsync(targetPage); + + rowIndex %= pageSize; + } + + _grid.SelectRowAsync(rowIndex); + _grid.ScrollIntoViewAsync(rowIndex: rowIndex); + _grid.FocusAsync(); + } + + private async Task>> GetTransactionModels() + { + return await WarehouseService.GetTransactionsModels(); + } + + private async Task UpdateRows(IList changedRecords) + { + await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); + + WzRowsMarelli = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + await InvokeAsync(StateHasChanged); + await _grid.Refresh(); + } + + private void OnRowSelected(RowSelectEventArgs obj) + { + SelectedRow = obj.Data; + } + + private List> FindCombinations(List records, int targetSum) + { + var result = new List>(); + var currentCombination = new List(); + + void Backtrack(int start, int currentSum) + { + if (currentSum == targetSum) + { + result.Add(new List(currentCombination)); + return; + } + + for (int i = start; i < records.Count; i++) + { + if (currentSum + records[i].Quantity <= targetSum) + { + currentCombination.Add(records[i]); + Backtrack(i + 1, currentSum + records[i].Quantity ?? 0); + currentCombination.RemoveAt(currentCombination.Count - 1); + } + } + } + + Backtrack(0, 0); + return result; + } + + private async Task ApplyFilter(IList selectedRecords) + { + await _grid.FilterByColumnAsync(nameof(WzRowMarelliDto.FaIndex), "equal", selectedRecords.First().FaIndex); + } + + private void ChangeView() + { + NavigationManager.NavigateTo($"/Warehouse/Marelli/PackList/{WzHeader}/Simple"); + } +} \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor similarity index 99% rename from OrdersManagement/Components/Pages/WarehousePackList.razor rename to OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor index 75aa5b1..37594ce 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor @@ -1,4 +1,5 @@ -@page "/Warehouse/PackList/{WzHeader:guid}" +@page "/Warehouse/Meyle/PackList/{WzHeader:guid}" + @using OrdersManagement.Models @using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Grids @@ -562,6 +563,6 @@ private void ChangeView() { - NavigationManager.NavigateTo($"/Warehouse/PackList/{WzHeader}/Simple"); + NavigationManager.NavigateTo($"/Warehouse/Meyle/PackList/{WzHeader}/Simple"); } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor similarity index 99% rename from OrdersManagement/Components/Pages/WarehousePacklistSimple.razor rename to OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor index dea363d..e900381 100644 --- a/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor @@ -1,4 +1,4 @@ -@page "/Warehouse/PackList/{WzHeader:guid}/Simple" +@page "/Warehouse/Meyle/PackList/{WzHeader:guid}/Simple" @using OrdersManagement.Models @using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Grids diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index eac9d5e..bbf81ab 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -175,9 +175,11 @@ private void OnRowDoubleClick(RecordDoubleClickEventArgs obj) { + if (_selectedClient is null) return; + Guid headerId = obj.RowData.ID; - NavigationManager.NavigateTo("/Warehouse/PackList/" + headerId); + NavigationManager.NavigateTo($"/Warehouse/{_selectedClient.Name}/PackList/" + headerId); } private async Task CreatePackingList() @@ -234,10 +236,11 @@ } await WarehouseService.CreateWzRowsMeyleAsync(rows); + + NavigationManager.NavigateTo("/Warehouse/Meyle/PackList/" + wzHeader.ID); + break; } - - NavigationManager.NavigateTo("/Warehouse/PackList/" + wzHeader.ID); } private void HideModal() diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index c05c99f..824a7ec 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -128,11 +128,21 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) { var response = await _httpClient.GetAsync($"api/ExcelGenerator/generate-meyle?packListId={wzHeaderId}"); response.EnsureSuccessStatusCode(); - if (response.StatusCode != System.Net.HttpStatusCode.OK) + if (response.StatusCode != HttpStatusCode.OK) { throw new Exception("Failed to generate XLS for Mayle"); } } + + public async Task GenerateXlsForMarelliAsync(Guid wzHeaderId) + { + var response = await _httpClient.GetAsync($"api/ExcelGenerator/generate-marelli?packListId={wzHeaderId}"); + response.EnsureSuccessStatusCode(); + if (response.StatusCode != HttpStatusCode.OK) + { + throw new Exception("Failed to generate XLS for Marelli"); + } + } public async Task AddEmailsToWzHeaderAsync(Guid wzHeaderId, string? emailAddresses) { diff --git a/SytelineSaAppEfDataModel/Dtos/WzRowMareliDto.cs b/SytelineSaAppEfDataModel/Dtos/WzRowMarelliDto.cs similarity index 77% rename from SytelineSaAppEfDataModel/Dtos/WzRowMareliDto.cs rename to SytelineSaAppEfDataModel/Dtos/WzRowMarelliDto.cs index 1fb112c..5bb1507 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzRowMareliDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzRowMarelliDto.cs @@ -1,6 +1,6 @@ namespace SytelineSaAppEfDataModel.Dtos; -public class WzRowMareliDto +public class WzRowMarelliDto { public Guid ID { get; set; } public Guid? FKHeader { get; set; } @@ -11,4 +11,6 @@ public class WzRowMareliDto public int? Quantity { get; set; } public string OrderNumber { get; set; } public string WzNumber { get; set; } + public string FaIndex { get; set; } + public int? TransactionNumber { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzRowMareli.cs b/SytelineSaAppEfDataModel/Entities/WzRowMarelli.cs similarity index 80% rename from SytelineSaAppEfDataModel/Entities/WzRowMareli.cs rename to SytelineSaAppEfDataModel/Entities/WzRowMarelli.cs index 3b13bdc..1a5dab2 100644 --- a/SytelineSaAppEfDataModel/Entities/WzRowMareli.cs +++ b/SytelineSaAppEfDataModel/Entities/WzRowMarelli.cs @@ -1,6 +1,6 @@ namespace SytelineSaAppEfDataModel.Entities; -public class WzRowMareli +public class WzRowMarelli { public Guid ID { get; set; } public Guid? FKHeader { get; set; } @@ -11,6 +11,8 @@ public class WzRowMareli public int? Quantity { get; set; } public string OrderNumber { get; set; } public string WzNumber { get; set; } + public string FaIndex { get; set; } + public int? TransactionNumber { get; set; } // Navigation property public WzHeader Header { get; set; } diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index cc28cee..6b24589 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -32,7 +32,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/IWzRowMareliService.cs b/SytelineSaAppEfDataModel/Services/IWzRowMareliService.cs index 91fb853..5817563 100644 --- a/SytelineSaAppEfDataModel/Services/IWzRowMareliService.cs +++ b/SytelineSaAppEfDataModel/Services/IWzRowMareliService.cs @@ -4,8 +4,8 @@ namespace SytelineSaAppEfDataModel.Services; public interface IWzRowMareliService { - Task> GetAll(); - Task CreateRows(IEnumerable rows); - Task> GetByWzHeaderId(Guid wzHeaderId); - Task UpdateRows(IEnumerable rows); + Task> GetAll(); + Task CreateRows(IEnumerable rows); + Task> GetByWzHeaderId(Guid wzHeaderId); + Task UpdateRows(IEnumerable rows); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzRowMareliService.cs b/SytelineSaAppEfDataModel/Services/WzRowMareliService.cs index 3e3cd36..93f4c05 100644 --- a/SytelineSaAppEfDataModel/Services/WzRowMareliService.cs +++ b/SytelineSaAppEfDataModel/Services/WzRowMareliService.cs @@ -7,29 +7,29 @@ namespace SytelineSaAppEfDataModel.Services; public class WzRowMareliService(SytelineSaAppDbContext context, IMapper mapper) : IWzRowMareliService { - public async Task> GetAll() + public async Task> GetAll() { - return await context.WzRowsMeyle.Select(x => mapper.Map(x)).ToListAsync(); + return await context.WzRowsMeyle.Select(x => mapper.Map(x)).ToListAsync(); } - public async Task CreateRows(IEnumerable rows) + public async Task CreateRows(IEnumerable rows) { - var entities = mapper.Map>(rows); + var entities = mapper.Map>(rows); await context.WzRowsMareli.AddRangeAsync(entities); await context.SaveChangesAsync(); } - public async Task> GetByWzHeaderId(Guid wzHeaderId) + public async Task> GetByWzHeaderId(Guid wzHeaderId) { return await context.WzRowsMareli .Where(x => x.FKHeader == wzHeaderId) - .Select(x => mapper.Map(x)) + .Select(x => mapper.Map(x)) .ToListAsync(); } - public async Task UpdateRows(IEnumerable rows) + public async Task UpdateRows(IEnumerable rows) { - var entities = mapper.Map>(rows); + var entities = mapper.Map>(rows); context.WzRowsMareli.UpdateRange(entities); await context.SaveChangesAsync(); } diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 41abf7c..1d9ee84 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -22,7 +22,7 @@ namespace SytelineSaAppEfDataModel public DbSet WzClients { get; set; } public DbSet WzHeaders { get; set; } public DbSet WzRowsMeyle { get; set; } - public DbSet WzRowsMareli { get; set; } + public DbSet WzRowsMareli { get; set; } public DbSet ItemCusts { get; set; } public DbSet Lots { get; set; } public DbSet EdiCustomerOrderImports { get; set; } @@ -2508,7 +2508,7 @@ namespace SytelineSaAppEfDataModel .IsRequired(); }); - modelBuilder.Entity(entity => + modelBuilder.Entity(entity => { entity.ToTable("wz_row_mareli"); @@ -2558,6 +2558,16 @@ namespace SytelineSaAppEfDataModel .HasColumnName("wz_number") .HasMaxLength(50) .IsRequired(false); + + entity.Property(e => e.WzNumber) + .HasColumnName("fa_index") + .HasMaxLength(30) + .IsRequired(false); + + entity.Property(e => e.TransactionNumber) + .HasColumnName("trans_num") + .HasColumnType("int") + .IsRequired(false); // Foreign Key entity.HasOne(e => e.Header) From 01350f0146d11b0c1623156009482e7592eee5e2 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 11 Sep 2025 21:08:31 +0200 Subject: [PATCH 056/149] * Further improvements for Marelli PackingList --- ...ontroller.cs => WzRowMarelliController.cs} | 2 +- .../Marelli/MarelliPackList.razor | 37 +- .../Marelli/MarelliPacklistSimple.razor | 316 ++++++++++++++++++ .../PackingLists/Meyle/MeylePackList.razor | 4 +- .../Meyle/MeylePacklistSimple.razor | 6 +- .../Components/Pages/Warehouse.razor | 45 ++- OrdersManagement/Services/WarehouseService.cs | 40 ++- SytelineSaAppEfDataModel/Dtos/WzClientDto.cs | 1 + SytelineSaAppEfDataModel/Entities/WzClient.cs | 1 + .../SytelineSaAppDbContext.cs | 7 +- 10 files changed, 420 insertions(+), 39 deletions(-) rename FaKrosnoApi/Controllers/{WzRowMareliController.cs => WzRowMarelliController.cs} (93%) create mode 100644 OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPacklistSimple.razor diff --git a/FaKrosnoApi/Controllers/WzRowMareliController.cs b/FaKrosnoApi/Controllers/WzRowMarelliController.cs similarity index 93% rename from FaKrosnoApi/Controllers/WzRowMareliController.cs rename to FaKrosnoApi/Controllers/WzRowMarelliController.cs index 3569631..e3f18fb 100644 --- a/FaKrosnoApi/Controllers/WzRowMareliController.cs +++ b/FaKrosnoApi/Controllers/WzRowMarelliController.cs @@ -6,7 +6,7 @@ namespace FaKrosnoApi.Controllers; [ApiController] [Route("api/[controller]")] -public class WzRowMareliController(IWzRowMareliService service, IMaterialTransactionService materialTransactionService) : Controller +public class WzRowMarelliController(IWzRowMareliService service, IMaterialTransactionService materialTransactionService) : Controller { [HttpGet] public async Task>> GetAll() diff --git a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor index d4b68ef..accd200 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor @@ -67,22 +67,19 @@ - - - - - - + + + + + changedRecords) { - await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); + await WarehouseService.UpdateWzRowsMarelliAsync(changedRecords); - WzRowsMarelli = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMarelli = (await WarehouseService.GetWzRowsMarelliByWzHeaderId(WzHeader)).ToList(); await InvokeAsync(StateHasChanged); await _grid.Refresh(); } @@ -388,7 +385,7 @@ { if (currentSum == targetSum) { - result.Add(new List(currentCombination)); + result.Add([..currentCombination]); return; } diff --git a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPacklistSimple.razor b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPacklistSimple.razor new file mode 100644 index 0000000..d210f66 --- /dev/null +++ b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPacklistSimple.razor @@ -0,0 +1,316 @@ +@page "/Warehouse/Marelli/PackList/{WzHeader:guid}/Simple" +@using OrdersManagement.Models +@using Syncfusion.Blazor.Cards +@using SytelineSaAppEfDataModel.Dtos +@using Syncfusion.Blazor.Popups +@using Syncfusion.Blazor.Inputs +@using Syncfusion.Blazor.Buttons + +@inject NavigationManager NavigationManager +@inject WarehouseService WarehouseService + +
+ + +

Packing List

+
+ + + + Zmień widok + Generuj XLS i Wyślij + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @if (_isValid) + { +

Packing List został wygenerowany i wysłany!

+ } + 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!

+ } +
+
+ + + +
+ + + + +

Błąd skanowania! Wybierz NUMER PALETY większy niż 0 (Aktualnie '@PalletNumber'):

+
+
+ + + +
+ + + FA Krosno Manager © @(DateTime.Now.Year) + +
+
+ +@code { + [Parameter] public Guid WzHeader { get; set; } + + private List WzRowsMarelli { get; set; } = new(); + private IDictionary> TransactionModelsByPartNumber { get; set; } = new Dictionary>(); + private List ChangedRecords = new(); + private WzHeaderDto _wzHeader; + private SfTextBox _scanner; + + private string ItemNumber { get; set; } = string.Empty; + private string Qty { get; set; } = "0"; + private string PalletNumberOutput { get; set; } = "0"; + + private string WzNumber { get; set; } = string.Empty; + + private WzRowMarelliDto? SelectedRow { get; set; } + private List SelectedRows { get; set; } = new(); + + private bool _isValid; + + public bool Visibility { get; set; } + public bool VisibilityPalletNumber { get; set; } + + private string? EmailAddresses { get; set; } = string.Empty; + private string PalletNumber { get; set; } = "0"; + + private string LastScannedValue { get; set; } = string.Empty; + private string ScannedValue { get; set; } = string.Empty; + + private void HideModal() + { + VisibilityPalletNumber = false; + Visibility = false; + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); + WzRowsMarelli = (await WarehouseService.GetWzRowsMarelliByWzHeaderId(WzHeader)).ToList(); + + TransactionModelsByPartNumber = await GetTransactionModels(); + + EmailAddresses = _wzHeader.EmailAddresses; + + WzNumber = _wzHeader.WzNumbers ?? string.Empty; + + await _scanner.FocusAsync(); + StateHasChanged(); + } + } + + private async Task SaveChanges() + { + if (!string.IsNullOrWhiteSpace(EmailAddresses)) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + } + + if (ChangedRecords.Any()) + { + await UpdateRows(ChangedRecords); + } + } + + private async Task ExportXls() + { + int count = WzRowsMarelli.Count(x => x.PalletNumber == null); + + _isValid = count == 0; + _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); + + if (_isValid) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + await WarehouseService.GenerateXlsForMarelliAsync(WzHeader); + } + + Visibility = true; + } + + private void ScanValue(ChangedEventArgs obj) + { + if (string.IsNullOrWhiteSpace(obj.Value)) return; + if (int.Parse(PalletNumber) <= 0) + { + VisibilityPalletNumber = true; + return; + } + + ScannedValue = obj.Value.Trim(); + + StateHasChanged(); + + TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); + TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); + + if (materialTransactionByPartNumber != null) + { + FillPalletNumber(materialTransactionByPartNumber, obj.Value.Trim()); + } + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + private async Task FillPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) + { + await InvokeAsync(StateHasChanged); + + int palletNumber = int.Parse(PalletNumber); + int rowIndex = WzRowsMarelli.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + + switch (rowIndex) + { + case -1: + { + SelectedRows = WzRowsMarelli.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList(); + + var validCombinations = FindCombinations(SelectedRows, (int?)materialTransactionByPartNumber.Quantity ?? 0); + + foreach (var combination in validCombinations) + { + foreach (var record in combination) + { + record.PalletNumber = palletNumber; + ChangedRecords.Add(record); + } + } + + SelectedRows.Clear(); + SelectedRows.AddRange(ChangedRecords); + + SelectedRow = SelectedRows.FirstOrDefault(); + + break; + } + default: + { + SelectedRow = WzRowsMarelli[rowIndex]; + + SelectedRow.PalletNumber = palletNumber; + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + break; + } + } + + await SaveChanges(); + ChangedRecords.Clear(); + + await InvokeAsync(StateHasChanged); + + await _scanner.FocusAsync(); + } + + private async Task>> GetTransactionModels() + { + return await WarehouseService.GetTransactionsModels(); + } + + private async Task UpdateRows(IList changedRecords) + { + await WarehouseService.UpdateWzRowsMarelliAsync(changedRecords); + + WzRowsMarelli = (await WarehouseService.GetWzRowsMarelliByWzHeaderId(WzHeader)).ToList(); + await InvokeAsync(StateHasChanged); + } + + private List> FindCombinations(List records, int targetSum) + { + var result = new List>(); + var currentCombination = new List(); + + void Backtrack(int start, int currentSum) + { + if (currentSum == targetSum) + { + result.Add(new List(currentCombination)); + return; + } + + for (int i = start; i < records.Count; i++) + { + if (currentSum + records[i].Quantity <= targetSum) + { + currentCombination.Add(records[i]); + Backtrack(i + 1, currentSum + records[i].Quantity ?? 0); + currentCombination.RemoveAt(currentCombination.Count - 1); + } + } + } + + Backtrack(0, 0); + return result; + } + + private void ChangeView() + { + NavigationManager.NavigateTo($"/Warehouse/Marelli/PackList/{WzHeader}"); + } +} \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor index 37594ce..65be4b2 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor @@ -227,7 +227,7 @@ if (firstRender) { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); - WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMeyle = (await WarehouseService.GetWzRowsMeyleByWzHeaderId(WzHeader)).ToList(); TransactionModelsByPartNumber = await GetTransactionModels(); @@ -479,7 +479,7 @@ { await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); - WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMeyle = (await WarehouseService.GetWzRowsMeyleByWzHeaderId(WzHeader)).ToList(); await InvokeAsync(StateHasChanged); await _grid.Refresh(); } diff --git a/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor index e900381..855edbe 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor @@ -176,7 +176,7 @@ if (firstRender) { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); - WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMeyle = (await WarehouseService.GetWzRowsMeyleByWzHeaderId(WzHeader)).ToList(); TransactionModelsByPartNumber = await GetTransactionModels(); @@ -385,7 +385,7 @@ { await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); - WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMeyle = (await WarehouseService.GetWzRowsMeyleByWzHeaderId(WzHeader)).ToList(); await InvokeAsync(StateHasChanged); } @@ -419,6 +419,6 @@ private void ChangeView() { - NavigationManager.NavigateTo($"/Warehouse/PackList/{WzHeader}"); + NavigationManager.NavigateTo($"/Warehouse/Meyle/PackList/{WzHeader}"); } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index bbf81ab..0214ac5 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -133,7 +133,7 @@ if (firstRender) { _clients = await WarehouseService.GetAllClientsAsync(); - _clients = _clients.Where(x => x.Name.Equals("MEYLE", StringComparison.OrdinalIgnoreCase)); + _clients = _clients.Where(x => new[] { "MAGNETI MARELLI", "MEYLE" }.Any(y => y.Equals(x.Name, StringComparison.OrdinalIgnoreCase))).ToList(); StateHasChanged(); @@ -179,7 +179,7 @@ Guid headerId = obj.RowData.ID; - NavigationManager.NavigateTo($"/Warehouse/{_selectedClient.Name}/PackList/" + headerId); + NavigationManager.NavigateTo($"/Warehouse/{_selectedClient.ShortName}/PackList/" + headerId); } private async Task CreatePackingList() @@ -210,18 +210,18 @@ await WarehouseService.CreateWzHeaderAsync(wzHeader); - switch (_selectedClient?.Name.ToUpper()) + switch (_selectedClient?.ShortName.ToUpper()) { case "MEYLE": - IList rows = new List(); - IList materialTransactions = _materialTransactions.Where(x => selectedRecords.Any(y => y.MTGroupNum == x.MTGroupNum)).ToList(); + IList meyleRows = new List(); + IList meyleMaterialTransactions = _materialTransactions.Where(x => selectedRecords.Any(y => y.MTGroupNum == x.MTGroupNum)).ToList(); - foreach (MaterialTransactionDto materialTransactionDto in materialTransactions) + foreach (MaterialTransactionDto materialTransactionDto in meyleMaterialTransactions) { CustomerOrderDto customerOrder = await WarehouseService.GetCustomerOrder(materialTransactionDto.RefNum ?? string.Empty); ItemCustDto item = await WarehouseService.GetItem(materialTransactionDto.Item ?? string.Empty, customerOrder.CustNum); - rows.Add(new WzRowMeyleDto + meyleRows.Add(new WzRowMeyleDto { ID = Guid.NewGuid(), Quantity = Math.Abs((int?)materialTransactionDto.Qty ?? 0), @@ -235,10 +235,39 @@ }); } - await WarehouseService.CreateWzRowsMeyleAsync(rows); + await WarehouseService.CreateWzRowsMeyleAsync(meyleRows); NavigationManager.NavigateTo("/Warehouse/Meyle/PackList/" + wzHeader.ID); + break; + case "MARELLI": + IList marelliRows = new List(); + IList marelliMaterialTransactions = _materialTransactions.Where(x => selectedRecords.Any(y => y.MTGroupNum == x.MTGroupNum)).ToList(); + + foreach (MaterialTransactionDto materialTransactionDto in marelliMaterialTransactions) + { + CustomerOrderDto customerOrder = await WarehouseService.GetCustomerOrder(materialTransactionDto.RefNum ?? string.Empty); + ItemCustDto item = await WarehouseService.GetItem(materialTransactionDto.Item ?? string.Empty, customerOrder.CustNum); + + marelliRows.Add(new WzRowMarelliDto + { + ID = Guid.NewGuid(), + Quantity = Math.Abs((int?)materialTransactionDto.Qty ?? 0), + ItemNumber = item.CustItem, + OrderNumber = customerOrder.CustPo, + WzNumber = materialTransactionDto.MTGroupNum ?? string.Empty, + FKHeader = wzHeader.ID, + TransactionNumber = (int?)materialTransactionDto.TransNum ?? 0, + Type = "MIX", + FaIndex = item.Item, + EngineerNumber = item.Uf_FKR_CustItem2 + }); + } + + await WarehouseService.CreateWzRowsMarelliAsync(marelliRows); + + NavigationManager.NavigateTo("/Warehouse/Marelli/PackList/" + wzHeader.ID); + break; } } diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index 824a7ec..e82fd52 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -63,20 +63,34 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) } } - public async Task CreateWzRowsMeyleAsync(IEnumerable wzRowMeyles) + public async Task CreateWzRowsMeyleAsync(IEnumerable wzRowsMeyle) { - if (wzRowMeyles == null || !wzRowMeyles.Any()) + if (wzRowsMeyle == null || !wzRowsMeyle.Any()) { throw new ArgumentException("No rows provided to create."); } - var response = await _httpClient.PostAsJsonAsync("api/WzRowMeyle", wzRowMeyles); + var response = await _httpClient.PostAsJsonAsync("api/WzRowMeyle", wzRowsMeyle); if (!response.IsSuccessStatusCode) { var errorContent = await response.Content.ReadAsStringAsync(); throw new HttpRequestException($"Failed to create WzRowMeyle: {response.StatusCode}, Content: {errorContent}"); } + } + + public async Task CreateWzRowsMarelliAsync(IEnumerable wzRowsMarelli) + { + if (wzRowsMarelli == null || !wzRowsMarelli.Any()) + { + throw new ArgumentException("No rows provided to create."); + } + var response = await _httpClient.PostAsJsonAsync("api/WzRowMarelli", wzRowsMarelli); + if (!response.IsSuccessStatusCode) + { + var errorContent = await response.Content.ReadAsStringAsync(); + throw new HttpRequestException($"Failed to create WzRowMarelli: {response.StatusCode}, Content: {errorContent}"); + } } public async Task GetCustomerOrder(string customerOrderNumber) @@ -95,12 +109,19 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) return await response.Content.ReadFromJsonAsync(); } - public async Task> GetWzRowsByWzHeaderId(Guid wzHeaderId) + public async Task> GetWzRowsMeyleByWzHeaderId(Guid wzHeaderId) { var response = await _httpClient.GetAsync($"api/WzRowMeyle/by-wz-header-id?wzHeaderId={wzHeaderId}"); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync>(); } + + public async Task> GetWzRowsMarelliByWzHeaderId(Guid wzHeaderId) + { + var response = await _httpClient.GetAsync($"api/WzRowMarelli/by-wz-header-id?wzHeaderId={wzHeaderId}"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync>(); + } public async Task>> GetTransactionsModels() { @@ -124,6 +145,17 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) response.EnsureSuccessStatusCode(); } + public async Task UpdateWzRowsMarelliAsync(IEnumerable wzRowsMarelli) + { + if (wzRowsMarelli == null || !wzRowsMarelli.Any()) + { + throw new ArgumentException("No rows provided to update."); + } + + var response = await _httpClient.PutAsJsonAsync("api/WzRowMarelli", wzRowsMarelli); + response.EnsureSuccessStatusCode(); + } + public async Task GenerateXlsForMeyleAsync(Guid wzHeaderId) { var response = await _httpClient.GetAsync($"api/ExcelGenerator/generate-meyle?packListId={wzHeaderId}"); diff --git a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs index 05950ce..1d2d974 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs @@ -7,4 +7,5 @@ public class WzClientDto public int? CustomerSequence { get; set; } public DateTime CreatedDate { get; set; } public string Name { get; set; } + public string ShortName { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzClient.cs b/SytelineSaAppEfDataModel/Entities/WzClient.cs index d9af197..b83bc51 100644 --- a/SytelineSaAppEfDataModel/Entities/WzClient.cs +++ b/SytelineSaAppEfDataModel/Entities/WzClient.cs @@ -7,4 +7,5 @@ public class WzClient public int? CustomerSequence { get; set; } public DateTime CreatedDate { get; set; } public string Name { get; set; } + public string ShortName { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 1d9ee84..66ff00f 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -954,6 +954,11 @@ namespace SytelineSaAppEfDataModel .HasColumnName("Name") .HasMaxLength(255) .IsRequired(false); + + entity.Property(e => e.ShortName) + .HasColumnName("ShortName") + .HasMaxLength(30) + .IsRequired(false); }); modelBuilder.Entity(entity => @@ -2559,7 +2564,7 @@ namespace SytelineSaAppEfDataModel .HasMaxLength(50) .IsRequired(false); - entity.Property(e => e.WzNumber) + entity.Property(e => e.FaIndex) .HasColumnName("fa_index") .HasMaxLength(30) .IsRequired(false); From e2c5de40b5ea7c1b2e228f90e66b9ebfe0fc4ea1 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 11 Sep 2025 21:12:46 +0200 Subject: [PATCH 057/149] * Added ID to ScheduleOrder view --- OrdersManagement/Components/Pages/ScheduleOrder.razor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OrdersManagement/Components/Pages/ScheduleOrder.razor b/OrdersManagement/Components/Pages/ScheduleOrder.razor index 0488fc9..b037b11 100644 --- a/OrdersManagement/Components/Pages/ScheduleOrder.razor +++ b/OrdersManagement/Components/Pages/ScheduleOrder.razor @@ -12,7 +12,7 @@
-

Zamówienie DELFOR nr @(ScheduleOrderDto?.PONum ?? "Brak numeru")

+

Zamówienie DELFOR nr @(ScheduleOrderDto?.PONum ?? "Brak numeru") (ID: @ScheduleOrderDto?.ID)

? scheduleOrderDetailMiscs = (@context as ScheduleOrderDetailDto)?.ScheduleOrderDetailMiscs; IList? scheduleOrderDetailDetails = (@context as ScheduleOrderDetailDto)?.ScheduleOrderDetailDetails; - + Date: Mon, 29 Sep 2025 11:11:37 +0200 Subject: [PATCH 058/149] * Fixed issue with not correctly filtering grid * Added validation --- .../Marelli/MarelliPackList.razor | 59 ++++++++++++++++++- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor index accd200..c934687 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor @@ -130,6 +130,32 @@ + + + + +

Nie znaleziono indeksu z ilością sztuk ('@IndexWithQty') odpowiadającemu skanowanym wartościom!

+

Znaleziono indeks, który ma ilość sztuk: '@IndexQty'!

+

Uzupełnij numer palety ręcznie i kliknij 'Zapisz'!

+
+
+ + + +
+ + + + +

Na liście nie znaleziono skanowanego numeru partii '@NotFoundItem'!

+
+
+ + + +
FA Krosno Manager © @(DateTime.Now.Year) @@ -154,7 +180,9 @@ private bool _isValid; private bool Visibility { get; set; } - public bool VisibilityPalletNumber { get; set; } + private bool VisibilityPalletNumber { get; set; } + private bool VisibilityIndexQty { get; set; } + private bool VisibilityNotFound { get; set; } private string? EmailAddresses { get; set; } = string.Empty; private string PalletNumber { get; set; } = "0"; @@ -164,13 +192,22 @@ private bool IsDisabled => SelectedRow == null; + private string IndexWithQty { get; set; } = string.Empty; + private string IndexQty { get; set; } = string.Empty; + private string NotFoundItem { get; set; } = string.Empty; + private void HideModal() { Visibility = false; VisibilityPalletNumber = false; - + VisibilityIndexQty = false; + VisibilityNotFound = false; + LastScannedValue = ScannedValue; ScannedValue = string.Empty; + IndexQty = string.Empty; + IndexWithQty = string.Empty; + NotFoundItem = string.Empty; _scanner.FocusAsync(); } @@ -206,6 +243,7 @@ } await _grid.EndEditAsync(); + await _grid.ClearSelectionAsync(); } private async Task OnBatchSave(BeforeBatchSaveArgs obj) @@ -258,6 +296,11 @@ SelectedRows.Clear(); FillPalletNumber(materialTransactionByPartNumber, obj.Value.Trim()); } + else + { + NotFoundItem = ScannedValue; + VisibilityNotFound = true; + } LastScannedValue = ScannedValue; ScannedValue = string.Empty; @@ -285,6 +328,16 @@ var validCombinations = FindCombinations(SelectedRows, (int?)materialTransactionByPartNumber.Quantity ?? 0); + if (!validCombinations.Any() && SelectedRows.Count > 0) + { + IndexWithQty = $"{materialTransactionByPartNumber.ItemNumber}, Qty = {materialTransactionByPartNumber.Quantity}"; + IndexQty = SelectedRows.First().Quantity.ToString() ?? "0"; + VisibilityIndexQty = true; + + await ApplyFilter(SelectedRows); + break; + } + foreach (var combination in validCombinations) { foreach (var record in combination) @@ -406,7 +459,7 @@ private async Task ApplyFilter(IList selectedRecords) { - await _grid.FilterByColumnAsync(nameof(WzRowMarelliDto.FaIndex), "equal", selectedRecords.First().FaIndex); + await _grid.FilterByColumnAsync(nameof(WzRowMarelliDto.ItemNumber), "equal", selectedRecords.First().ItemNumber); } private void ChangeView() From f6cc62d6c8a85c39b2b04188b570a56dc68f7008 Mon Sep 17 00:00:00 2001 From: trencik91 Date: Mon, 29 Sep 2025 13:41:09 +0200 Subject: [PATCH 059/149] * Initialized PackingList generation for Marelli --- .../Controllers/ExcelGeneratorController.cs | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs index c53be87..38be5b4 100644 --- a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs +++ b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs @@ -92,6 +92,86 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria SendEmail(stream, wzHeader); } + [HttpGet("generate-marelli")] + public async Task GeneratePackListForMarelli(Guid packListId) + { + WzHeaderDto wzHeader = await wzHeaderService.GetById(packListId); + MaterialTransactionDto? materialTransaction = await materialTransactionService.GetByWzNumber(wzHeader.WzRowsMeyle.First().WzNumber); + + using ExcelEngine excelEngine = new ExcelEngine(); + IApplication application = excelEngine.Excel; + application.DefaultVersion = ExcelVersion.Xlsx; + + IWorkbook workbook = application.Workbooks.Create(1); + IWorksheet worksheet = workbook.Worksheets[0]; + + IStyle boldFontStyle = workbook.Styles.Add("BoldFontStyle"); + boldFontStyle.Font.Bold = true; + + var mainHeaders = new List + { "Numer zamówienia Meyle", "Meyle Numer", "Ilość w dostawie", "Numer Palety", "Nr Wz", "Nr Partii" }; + + worksheet["B1"].Value = "Packing List"; + worksheet["B1"].CellStyle = boldFontStyle; + + worksheet["B3"].Value = "Supplier Name"; + worksheet["B3"].CellStyle = boldFontStyle; + + worksheet["D3"].Value = "FA KROSNO"; + worksheet["D3"].CellStyle = boldFontStyle; + + worksheet["B4"].Value = "Packing List nr"; + worksheet["B4"].CellStyle = boldFontStyle; + + worksheet["B6"].Value = "Related delivery note"; + worksheet["B6"].CellStyle = boldFontStyle; + + worksheet["D6"].Value = string.Join(", ", wzHeader.WzRowsMeyle.Select(x => x.WzNumber).Distinct()); + worksheet["D6"].CellStyle = boldFontStyle; + + worksheet["B9"].Value = "Forwarder"; + worksheet["B9"].CellStyle = boldFontStyle; + + worksheet["B10"].Value = "Date"; + worksheet["B10"].CellStyle = boldFontStyle; + + worksheet["D10"].DateTime = materialTransaction?.CreateDate ?? DateTime.Now; + + int currentRow = 12; + + for (int i = 0; i < mainHeaders.Count; i++) + { + string columnLetter = GetColumnLetter(i); + worksheet.Range[$"{columnLetter}{currentRow}"].Text = mainHeaders[i]; + worksheet.Range[$"{columnLetter}{currentRow}"].CellStyle = boldFontStyle; + } + + currentRow++; + + foreach (var wzRow in wzHeader.WzRowsMeyle) + { + worksheet.Range[$"A{currentRow}"].Text = wzRow.OrderNumber; + worksheet.Range[$"B{currentRow}"].Text = wzRow.ItemNumber; + worksheet.Range[$"C{currentRow}"].Number = (double)wzRow.Quantity!; + worksheet.Range[$"D{currentRow}"].Number = (double)wzRow.PalletNumber!; + worksheet.Range[$"E{currentRow}"].Text = wzRow.WzNumber; + worksheet.Range[$"F{currentRow}"].Text = wzRow.PartNumber; + + currentRow++; + } + + for (int i = 0; i < 6; i++) + { + worksheet.AutofitColumn(i + 1); + } + + using MemoryStream stream = new MemoryStream(); + workbook.SaveAs(stream); + stream.Position = 0; + + SendEmail(stream, wzHeader); + } + private static string GetColumnLetter(int columnIndex) { string columnName = string.Empty; From 8cfded48ae989c0655529927f4160134eb5e049e Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Sep 2025 21:18:34 +0200 Subject: [PATCH 060/149] * Added Excel generation for Marelli * Added Logo --- .../Controllers/ExcelGeneratorController.cs | 68 +++++++++---------- .../Marelli/MarelliPackList.razor | 2 +- SytelineSaAppEfDataModel/Dtos/WzClientDto.cs | 1 + SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs | 1 + SytelineSaAppEfDataModel/Entities/WzClient.cs | 1 + SytelineSaAppEfDataModel/MappingProfile.cs | 3 +- .../Services/IWzHeaderService.cs | 1 + .../Services/WzHeaderService.cs | 12 ++++ .../SytelineSaAppDbContext.cs | 4 ++ 9 files changed, 55 insertions(+), 38 deletions(-) diff --git a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs index 38be5b4..d8c1979 100644 --- a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs +++ b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs @@ -89,14 +89,14 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria workbook.SaveAs(stream); stream.Position = 0; - SendEmail(stream, wzHeader); + SendEmail(stream, wzHeader, "Meyle"); } [HttpGet("generate-marelli")] public async Task GeneratePackListForMarelli(Guid packListId) { - WzHeaderDto wzHeader = await wzHeaderService.GetById(packListId); - MaterialTransactionDto? materialTransaction = await materialTransactionService.GetByWzNumber(wzHeader.WzRowsMeyle.First().WzNumber); + WzHeaderDto wzHeader = await wzHeaderService.GetByIdMarelli(packListId); + MaterialTransactionDto? materialTransaction = await materialTransactionService.GetByWzNumber(wzHeader.WzRowsMarelli.First().WzNumber); using ExcelEngine excelEngine = new ExcelEngine(); IApplication application = excelEngine.Excel; @@ -109,33 +109,28 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria boldFontStyle.Font.Bold = true; var mainHeaders = new List - { "Numer zamówienia Meyle", "Meyle Numer", "Ilość w dostawie", "Numer Palety", "Nr Wz", "Nr Partii" }; - - worksheet["B1"].Value = "Packing List"; - worksheet["B1"].CellStyle = boldFontStyle; + { "", "ColliNr", "Magneti Marelli Sales nr", "Engineer number", "Quantity", "Order nr", "Supplier Comments" }; - worksheet["B3"].Value = "Supplier Name"; + worksheet.Range["A1:B1"].Merge(); + worksheet.Range["A1"].Text = "PACKING LIST"; + worksheet.Range["A1"].CellStyle = boldFontStyle; + + worksheet["A3"].Value = "Supplier Name"; + worksheet["A3"].CellStyle = boldFontStyle; + + worksheet["B3"].Value = "FA KROSNO"; worksheet["B3"].CellStyle = boldFontStyle; - worksheet["D3"].Value = "FA KROSNO"; - worksheet["D3"].CellStyle = boldFontStyle; - - worksheet["B4"].Value = "Packing List nr"; + worksheet["A4"].Value = "Packing List nr"; + worksheet["A4"].CellStyle = boldFontStyle; + + worksheet["B4"].Value = string.Join(", ", wzHeader.WzRowsMeyle.Select(x => x.WzNumber).Distinct()); worksheet["B4"].CellStyle = boldFontStyle; - worksheet["B6"].Value = "Related delivery note"; - worksheet["B6"].CellStyle = boldFontStyle; + worksheet["A6"].Value = "Date"; + worksheet["A6"].CellStyle = boldFontStyle; - worksheet["D6"].Value = string.Join(", ", wzHeader.WzRowsMeyle.Select(x => x.WzNumber).Distinct()); - worksheet["D6"].CellStyle = boldFontStyle; - - worksheet["B9"].Value = "Forwarder"; - worksheet["B9"].CellStyle = boldFontStyle; - - worksheet["B10"].Value = "Date"; - worksheet["B10"].CellStyle = boldFontStyle; - - worksheet["D10"].DateTime = materialTransaction?.CreateDate ?? DateTime.Now; + worksheet["B6"].DateTime = materialTransaction?.CreateDate ?? DateTime.Now; int currentRow = 12; @@ -148,14 +143,15 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria currentRow++; - foreach (var wzRow in wzHeader.WzRowsMeyle) + foreach (var wzRow in wzHeader.WzRowsMarelli.Where(x => x.PalletNumber != null)) { - worksheet.Range[$"A{currentRow}"].Text = wzRow.OrderNumber; - worksheet.Range[$"B{currentRow}"].Text = wzRow.ItemNumber; - worksheet.Range[$"C{currentRow}"].Number = (double)wzRow.Quantity!; - worksheet.Range[$"D{currentRow}"].Number = (double)wzRow.PalletNumber!; - worksheet.Range[$"E{currentRow}"].Text = wzRow.WzNumber; - worksheet.Range[$"F{currentRow}"].Text = wzRow.PartNumber; + worksheet.Range[$"A{currentRow}"].Text = "MIX"; + worksheet.Range[$"B{currentRow}"].Number = (double)wzRow.PalletNumber!; + worksheet.Range[$"C{currentRow}"].Text = wzRow.ItemNumber; + worksheet.Range[$"D{currentRow}"].Text = wzRow.EngineerNumber; + worksheet.Range[$"E{currentRow}"].Number = (double)wzRow.Quantity!; + worksheet.Range[$"F{currentRow}"].Text = wzRow.OrderNumber; + worksheet.Range[$"G{currentRow}"].Text = wzRow.WzNumber; currentRow++; } @@ -169,7 +165,7 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria workbook.SaveAs(stream); stream.Position = 0; - SendEmail(stream, wzHeader); + SendEmail(stream, wzHeader, "Marelli Magneti"); } private static string GetColumnLetter(int columnIndex) @@ -184,7 +180,7 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria return columnName; } - private void SendEmail(MemoryStream stream, WzHeaderDto wzHeader) + private void SendEmail(MemoryStream stream, WzHeaderDto wzHeader, string client) { IConfigurationSection smtpSettings = configuration.GetSection("EmailSettings"); string smtpHost = smtpSettings["SmtpServer"] ?? string.Empty; @@ -194,9 +190,9 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria string fromEmail = smtpSettings["SenderEmail"] ?? string.Empty; List toEmail = wzHeader.EmailAddresses?.Split(',')?.ToList() ?? (smtpSettings["RecipientEmail"] ?? string.Empty).Split(',').ToList(); - string subject = "MEYLE: Packing List"; + string subject = $"{client}: Packing List"; string body = - $"W załączeniu znajduje się Packing List dla klienta MEYLE wygenerowany {DateTime.Now:dd.MM.yyyy HH:mm:ss}"; + $"W załączeniu znajduje się Packing List dla klienta ${client} wygenerowany {DateTime.Now:dd.MM.yyyy HH:mm:ss}"; using var mailMessage = new MailMessage(); mailMessage.From = new MailAddress(fromEmail); @@ -204,7 +200,7 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria mailMessage.Body = body; mailMessage.IsBodyHtml = false; - mailMessage.Attachments.Add(new Attachment(stream, $"PackingList_Meyle_{DateTime.Now:yyyyMMddHHmmss}.xlsx", + mailMessage.Attachments.Add(new Attachment(stream, $"PackingList_{client}_{DateTime.Now:yyyyMMddHHmmss}.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); toEmail.ForEach(x => mailMessage.To.Add(x)); diff --git a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor index c934687..fe1b92e 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor @@ -259,7 +259,7 @@ private async Task ExportXls() { int count = WzRowsMarelli.Count(x => x.PalletNumber == null); - + _isValid = true; _isValid = count == 0; _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); diff --git a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs index 1d2d974..75af10f 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs @@ -8,4 +8,5 @@ public class WzClientDto public DateTime CreatedDate { get; set; } public string Name { get; set; } public string ShortName { get; set; } + public string? LogoBase64 { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs b/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs index c618a0e..dd45e0f 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzHeaderDto.cs @@ -8,4 +8,5 @@ public class WzHeaderDto public string? EmailAddresses { get; set; } public string? WzNumbers { get; set; } public IEnumerable WzRowsMeyle { get; set; } = new List(); + public IEnumerable WzRowsMarelli { get; set; } = new List(); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzClient.cs b/SytelineSaAppEfDataModel/Entities/WzClient.cs index b83bc51..13db712 100644 --- a/SytelineSaAppEfDataModel/Entities/WzClient.cs +++ b/SytelineSaAppEfDataModel/Entities/WzClient.cs @@ -8,4 +8,5 @@ public class WzClient public DateTime CreatedDate { get; set; } public string Name { get; set; } public string ShortName { get; set; } + public byte[]? Logo { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 6b24589..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -20,7 +20,8 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap().ForMember(dest => dest.LogoBase64, + opt => opt.MapFrom(src => src.Logo != null ? Convert.ToBase64String(src.Logo) : null)).ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); diff --git a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs index 53b59b8..d25e8a5 100644 --- a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs @@ -8,5 +8,6 @@ public interface IWzHeaderService Task> GetByCustomerNumber(string customerNumber, int customerSequence); Task CreateHeader(WzHeaderDto wzHeader); Task GetById(Guid id); + Task GetByIdMarelli(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 5779d2e..a14bb07 100644 --- a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs @@ -38,6 +38,18 @@ public class WzHeaderService(SytelineSaAppDbContext context, IMapper mapper) : I return wzHeader; } + public async Task GetByIdMarelli(Guid id) + { + var entity = await context.WzHeaders.FindAsync(id); + var items = await context.WzRowsMareli.Where(x => x.FKHeader == id).Select(x => mapper.Map(x)) + .ToListAsync(); + + WzHeaderDto wzHeader = mapper.Map(entity); + wzHeader.WzRowsMarelli = items; + + return wzHeader; + } + public async Task AddEmailsToWzHeader(Guid id, string emailAddresses) { var entity = await context.WzHeaders.FindAsync(id); diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 66ff00f..adc3804 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -959,6 +959,10 @@ namespace SytelineSaAppEfDataModel .HasColumnName("ShortName") .HasMaxLength(30) .IsRequired(false); + + entity.Property(e => e.Logo) + .HasColumnType("VARBINARY(MAX)") + .IsRequired(false); }); modelBuilder.Entity(entity => From 9163f330aa8fd1192ab346cc0cd7d82a3b124b4c Mon Sep 17 00:00:00 2001 From: trencik91 Date: Wed, 1 Oct 2025 14:42:58 +0200 Subject: [PATCH 061/149] * Added Logo to the output file --- .../Controllers/ExcelGeneratorController.cs | 17 ++++++++++++++--- FaKrosnoApi/Controllers/WzClientController.cs | 7 +++++++ .../PackingLists/Marelli/MarelliPackList.razor | 4 ++-- .../Services/IWzClientService.cs | 1 + .../Services/WzClientService.cs | 6 ++++++ 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs index d8c1979..152b014 100644 --- a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs +++ b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs @@ -10,7 +10,7 @@ namespace FaKrosnoApi.Controllers; [ApiController] [Route("api/[controller]")] -public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMaterialTransactionService materialTransactionService, IConfiguration configuration) : Controller +public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IWzClientService wzClientService, IMaterialTransactionService materialTransactionService, IConfiguration configuration) : Controller { [HttpGet("generate-meyle")] public async Task GeneratePackListForMeyle(Guid packListId) @@ -96,6 +96,7 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria public async Task GeneratePackListForMarelli(Guid packListId) { WzHeaderDto wzHeader = await wzHeaderService.GetByIdMarelli(packListId); + WzClientDto? wzClient = await wzClientService.GetById(wzHeader.FK_Client ?? Guid.NewGuid()); MaterialTransactionDto? materialTransaction = await materialTransactionService.GetByWzNumber(wzHeader.WzRowsMarelli.First().WzNumber); using ExcelEngine excelEngine = new ExcelEngine(); @@ -124,14 +125,24 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IMateria worksheet["A4"].Value = "Packing List nr"; worksheet["A4"].CellStyle = boldFontStyle; - worksheet["B4"].Value = string.Join(", ", wzHeader.WzRowsMeyle.Select(x => x.WzNumber).Distinct()); + worksheet["B4"].Value = string.Join(", ", wzHeader.WzRowsMarelli.Select(x => x.WzNumber).Distinct()); worksheet["B4"].CellStyle = boldFontStyle; worksheet["A6"].Value = "Date"; worksheet["A6"].CellStyle = boldFontStyle; worksheet["B6"].DateTime = materialTransaction?.CreateDate ?? DateTime.Now; - + + if (!string.IsNullOrEmpty(wzClient?.LogoBase64)) + { + byte[] logoBytes = Convert.FromBase64String(wzClient.LogoBase64); + + worksheet.Range["D1:F6"].Merge(); + + using MemoryStream imageStream = new MemoryStream(logoBytes); + worksheet.Pictures.AddPicture(1, 4, imageStream); + } + int currentRow = 12; for (int i = 0; i < mainHeaders.Count; i++) diff --git a/FaKrosnoApi/Controllers/WzClientController.cs b/FaKrosnoApi/Controllers/WzClientController.cs index 2e0e653..89c84d7 100644 --- a/FaKrosnoApi/Controllers/WzClientController.cs +++ b/FaKrosnoApi/Controllers/WzClientController.cs @@ -14,4 +14,11 @@ public class WzClientController(IWzClientService service) : Controller IEnumerable wzClients = await service.GetAll(); return Ok(wzClients); } + + [HttpGet("by-id")] + public async Task> GetById(Guid id) + { + WzClientDto? wzClient = await service.GetById(id); + return Ok(wzClient); + } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor index fe1b92e..b4cc034 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor @@ -260,8 +260,8 @@ { int count = WzRowsMarelli.Count(x => x.PalletNumber == null); _isValid = true; - _isValid = count == 0; - _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); + // _isValid = count == 0; + // _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); if (_isValid) { diff --git a/SytelineSaAppEfDataModel/Services/IWzClientService.cs b/SytelineSaAppEfDataModel/Services/IWzClientService.cs index 09e91dc..0c3ac86 100644 --- a/SytelineSaAppEfDataModel/Services/IWzClientService.cs +++ b/SytelineSaAppEfDataModel/Services/IWzClientService.cs @@ -5,4 +5,5 @@ namespace SytelineSaAppEfDataModel.Services; public interface IWzClientService { Task> GetAll(); + Task GetById(Guid id); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzClientService.cs b/SytelineSaAppEfDataModel/Services/WzClientService.cs index 1b7086e..9cfe4df 100644 --- a/SytelineSaAppEfDataModel/Services/WzClientService.cs +++ b/SytelineSaAppEfDataModel/Services/WzClientService.cs @@ -10,4 +10,10 @@ public class WzClientService(SytelineSaAppDbContext context, IMapper mapper) : I { return await context.WzClients.Select(x => mapper.Map(x)).ToListAsync(); } + + public async Task GetById(Guid id) + { + var entity = await context.WzClients.FirstOrDefaultAsync(x => x.ID == id); + return entity == null ? null : mapper.Map(entity); + } } \ No newline at end of file From 309044cb0c679d1731554ea1619e1baf9104e6fb Mon Sep 17 00:00:00 2001 From: trencik91 Date: Wed, 1 Oct 2025 14:44:34 +0200 Subject: [PATCH 062/149] * Fixed some hardcoded code --- .../Controllers/ExcelGeneratorController.cs | 2 +- .../PackingLists/Marelli/MarelliPackList.razor | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs index 152b014..5c24e09 100644 --- a/FaKrosnoApi/Controllers/ExcelGeneratorController.cs +++ b/FaKrosnoApi/Controllers/ExcelGeneratorController.cs @@ -154,7 +154,7 @@ public class ExcelGeneratorController(IWzHeaderService wzHeaderService, IWzClien currentRow++; - foreach (var wzRow in wzHeader.WzRowsMarelli.Where(x => x.PalletNumber != null)) + foreach (var wzRow in wzHeader.WzRowsMarelli) { worksheet.Range[$"A{currentRow}"].Text = "MIX"; worksheet.Range[$"B{currentRow}"].Number = (double)wzRow.PalletNumber!; diff --git a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor index b4cc034..4b9fab1 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor @@ -20,11 +20,11 @@

Packing List

- - - Zmień widok - - + @* *@ + @* *@ + @* Zmień widok *@ + @* *@ + @* *@ @@ -259,9 +259,8 @@ private async Task ExportXls() { int count = WzRowsMarelli.Count(x => x.PalletNumber == null); - _isValid = true; - // _isValid = count == 0; - // _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); + _isValid = count == 0; + _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); if (_isValid) { From da71596fadf367d6cbfc36bae73ac4f59ae4e03e Mon Sep 17 00:00:00 2001 From: trencik91 Date: Sat, 13 Dec 2025 13:14:22 +0100 Subject: [PATCH 063/149] * Introduced MaterialTransactionsController --- .../MaterialTransactionsController.cs | 42 +++++++++++++++++++ .../Services/IMaterialTransactionService.cs | 1 + .../Services/MaterialTransactionService.cs | 7 ++++ 3 files changed, 50 insertions(+) create mode 100644 FaKrosnoApi/Controllers/MaterialTransactionsController.cs diff --git a/FaKrosnoApi/Controllers/MaterialTransactionsController.cs b/FaKrosnoApi/Controllers/MaterialTransactionsController.cs new file mode 100644 index 0000000..abbb60b --- /dev/null +++ b/FaKrosnoApi/Controllers/MaterialTransactionsController.cs @@ -0,0 +1,42 @@ +using AutoMapper; +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class MaterialTransactionsController(IMaterialTransactionService service) : Controller +{ + [HttpGet] + public async Task> GetAll() + { + return await service.GetAll(); + } + + [HttpGet("by-wz-number")] + public Task GetByWzNumber([FromQuery] string wzNumber) + { + return service.GetByWzNumber(wzNumber); + } + + [HttpGet("list-by-wz-numbers")] + public Task> GetListByWzNumber([FromBody] ISet wzNumbers) + { + return service.GetOrderNumbersByWz(wzNumbers); + } + + [HttpGet("by-order-number")] + public Task> GetByOrderNumber([FromQuery] string orderNumber) + { + return service.GetByOrderNumber(orderNumber); + } + + // public Task> GetOrderNumbersByWz(ISet wzNumbers); + // public Task> GetByCustomerNumber(string customerNumber, int customerSequence); + // public Task GetByPartNumber(string partNumber); + // public Task> GetWithPartNumber(); + + +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs index b7709ce..c7ba459 100644 --- a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs @@ -6,6 +6,7 @@ public interface IMaterialTransactionService { Task> GetAll(); Task GetByWzNumber(string wzNumber); + Task> GetListByWzNumber(string wzNumber); Task> GetByWzNumbers(ISet wzNumbers); Task> GetByOrderNumber(string orderNumber); Task> GetOrderNumbersByWz(ISet wzNumbers); diff --git a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs index 2ff8933..015427b 100644 --- a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs @@ -18,6 +18,13 @@ public class MaterialTransactionService(SytelineSaAppDbContext context, IMapper .Where(x => x.MTGroupNum == wzNumber) .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); } + + public async Task> GetListByWzNumber(string wzNumber) + { + return await context.MaterialTransactions + .Where(x => x.MTGroupNum == wzNumber) + .Select(x => mapper.Map(x)).ToListAsync(); + } public async Task> GetByWzNumbers(ISet wzNumbers) { From 166eec918107ebebd6d64f7a20c238438ae2f0df Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 22 Dec 2025 12:52:55 +0100 Subject: [PATCH 064/149] * Added MinVer --- FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj b/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj index c238b1a..a46a629 100644 --- a/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj +++ b/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj @@ -1,9 +1,14 @@ + FaKrosnoEfDataModel + Piotr Kus + FaKrosno Entity Framework Data Model net8.0 enable enable + patch + 1.0 From e57713fabc49916b843e6df3d5886abcf669ad8e Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 22 Dec 2025 12:54:00 +0100 Subject: [PATCH 065/149] * Added MinVer --- .../SytelineSaAppEfDataModel.csproj | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj index f12e45b..9be3cfa 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj +++ b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj @@ -6,14 +6,12 @@ enable SytelineSaAppEfDataModel - 1.1.2 - PK - Data Manager for SYTELINE_SA_APP database - MIT - true - $(MSBuildThisFileDirectory)bin\NuGet + Piotr Kus + Syteline Entity Framework Data Model + patch + 1.0 - + From be26bf9b6edf500e48b7bb27cdd46aa2fe142075 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 22 Dec 2025 12:58:09 +0100 Subject: [PATCH 066/149] * Database change --- SytelineSaAppEfDataModel/appsettings_FA.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/appsettings_FA.json b/SytelineSaAppEfDataModel/appsettings_FA.json index 298eb62..18e8485 100644 --- a/SytelineSaAppEfDataModel/appsettings_FA.json +++ b/SytelineSaAppEfDataModel/appsettings_FA.json @@ -1,5 +1,5 @@ { "ConnectionStrings": { - "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PRODTEST_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true" + "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PROD_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true" } } \ No newline at end of file From 6f477ee1747f3ea74ebf2318622826ca97d62871 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 22 Dec 2025 13:03:50 +0100 Subject: [PATCH 067/149] * Added MinVer package --- FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj | 4 ++++ SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj b/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj index a46a629..c68a1fe 100644 --- a/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj +++ b/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj @@ -25,6 +25,10 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + diff --git a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj index 9be3cfa..adee2a9 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj +++ b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj @@ -26,6 +26,10 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + From c4b1561cbc5e0c1ab917ce5ec5be41f4ccd4c1d9 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Mon, 22 Dec 2025 13:06:16 +0100 Subject: [PATCH 068/149] * Changed Database --- SytelineSaAppEfDataModel/appsettings_FA.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/appsettings_FA.json b/SytelineSaAppEfDataModel/appsettings_FA.json index 18e8485..298eb62 100644 --- a/SytelineSaAppEfDataModel/appsettings_FA.json +++ b/SytelineSaAppEfDataModel/appsettings_FA.json @@ -1,5 +1,5 @@ { "ConnectionStrings": { - "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PROD_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true" + "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PRODTEST_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true" } } \ No newline at end of file From e9a3e91082118fe1d4d991064385b3ae013ab772 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 23 Dec 2025 12:00:28 +0100 Subject: [PATCH 069/149] * Extended CustomerOrdersController and CustomerOrderService --- FaKrosnoApi/Controllers/CustomerOrdersController.cs | 7 +++++++ SytelineSaAppEfDataModel/Services/CustomerOrderService.cs | 7 +++++++ SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs | 1 + 3 files changed, 15 insertions(+) diff --git a/FaKrosnoApi/Controllers/CustomerOrdersController.cs b/FaKrosnoApi/Controllers/CustomerOrdersController.cs index ebf620c..72dfa81 100644 --- a/FaKrosnoApi/Controllers/CustomerOrdersController.cs +++ b/FaKrosnoApi/Controllers/CustomerOrdersController.cs @@ -55,6 +55,13 @@ namespace FaKrosnoApi.Controllers await service.GetByCustomerAndPo(customerNumber, customerSequence, poNumber); return customerOrder != null ? Ok(customerOrder) : NotFound(); } + + [HttpGet("by-po")] + public async Task> GetByPo([FromQuery] string poNumber) + { + CustomerOrderDto? customerOrder = await service.GetByPo(poNumber); + return customerOrder != null ? Ok(customerOrder) : NotFound(); + } [HttpGet("list-by-customer-and-po")] public async Task>> GetListByCustomerAndPo( diff --git a/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs index 0d0b09c..912bfea 100644 --- a/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/CustomerOrderService.cs @@ -72,6 +72,13 @@ namespace SytelineSaAppEfDataModel.Services .Where(x => x.CustNum == customerNumber && x.CustSeq == customerSequence && x.CustPo == poNumber) .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); } + + public async Task GetByPo(string poNumber) + { + return await context.CustomerOrders.Where(x => x.CustPo == poNumber && x.Stat == "O") + .OrderByDescending(x => x.CreateDate).Select(x => mapper.Map(x)) + .FirstOrDefaultAsync(); + } public async Task> GetListByCustomerAndPo(string customerNumber, int customerSequence, string poNumber) diff --git a/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs index b30d3fc..784e881 100644 --- a/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/ICustomerOrderService.cs @@ -17,6 +17,7 @@ namespace SytelineSaAppEfDataModel.Services Task> GetListByCustomerAndPo(string customerNumber, int customerSequence, string poNumber); + Task GetByPo(string poNumber); Task> GetListByCustomer(string customerNumber, int customerSequence); Task?> GetLinesByCoNumber(string customerOrderNumber); Task?> GetItemsByCoNumber(string customerOrderNumber); From 1e889f6e9aa69d5a7bfa15df7289ac8529f38522 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 20:59:55 +0100 Subject: [PATCH 070/149] * Removed ReverseMap from one mapping profile --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From c35060f4d3f885c6f1947ae809ab23910d793476 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:10:04 +0100 Subject: [PATCH 071/149] * Removed ReverseMap for testing --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..704e10f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -32,7 +32,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); CreateMap(); } } From 96a61f306fe9338abf9a76b34e61135b1c0e6d76 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:11:59 +0100 Subject: [PATCH 072/149] * Another testing removal --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 704e10f..f9e2bd8 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -31,7 +31,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); CreateMap(); CreateMap(); } From df9ec74142b48004bd365bfd69f4cb7f0d575566 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:14:09 +0100 Subject: [PATCH 073/149] * Revert changes --- SytelineSaAppEfDataModel/MappingProfile.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index f9e2bd8..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -31,9 +31,9 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); - CreateMap(); - CreateMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } From d62212d3ed655b6ca7f36717fd8d3ff327dd5155 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:24:16 +0100 Subject: [PATCH 074/149] * Test change --- FaKrosnoApi/FaKrosnoApi.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FaKrosnoApi/FaKrosnoApi.csproj b/FaKrosnoApi/FaKrosnoApi.csproj index 736fd0f..91d2aa6 100644 --- a/FaKrosnoApi/FaKrosnoApi.csproj +++ b/FaKrosnoApi/FaKrosnoApi.csproj @@ -8,6 +8,7 @@ + @@ -20,12 +21,11 @@ + - - From 1d8c7099104fd2c1307c707c48c101829890eabd Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:32:07 +0100 Subject: [PATCH 075/149] * Test commit --- FaKrosnoEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FaKrosnoEfDataModel/MappingProfile.cs b/FaKrosnoEfDataModel/MappingProfile.cs index aecabae..27983b9 100644 --- a/FaKrosnoEfDataModel/MappingProfile.cs +++ b/FaKrosnoEfDataModel/MappingProfile.cs @@ -20,7 +20,7 @@ namespace FaKrosnoEfDataModel CreateMap().IncludeBase() .ReverseMap(); CreateMap().IncludeBase().ReverseMap(); - CreateMap().IncludeBase().ReverseMap(); + CreateMap().IncludeBase(); } } } From 8d8099f9e2e67c6a8fcf58f5c85b6b2252909633 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:33:29 +0100 Subject: [PATCH 076/149] * Test commit --- FaKrosnoEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FaKrosnoEfDataModel/MappingProfile.cs b/FaKrosnoEfDataModel/MappingProfile.cs index 27983b9..aecabae 100644 --- a/FaKrosnoEfDataModel/MappingProfile.cs +++ b/FaKrosnoEfDataModel/MappingProfile.cs @@ -20,7 +20,7 @@ namespace FaKrosnoEfDataModel CreateMap().IncludeBase() .ReverseMap(); CreateMap().IncludeBase().ReverseMap(); - CreateMap().IncludeBase(); + CreateMap().IncludeBase().ReverseMap(); } } } From 9cc874322ae852812dc8b750e6851032639d9797 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:44:24 +0100 Subject: [PATCH 077/149] * Test commit --- FaKrosnoEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FaKrosnoEfDataModel/MappingProfile.cs b/FaKrosnoEfDataModel/MappingProfile.cs index aecabae..27983b9 100644 --- a/FaKrosnoEfDataModel/MappingProfile.cs +++ b/FaKrosnoEfDataModel/MappingProfile.cs @@ -20,7 +20,7 @@ namespace FaKrosnoEfDataModel CreateMap().IncludeBase() .ReverseMap(); CreateMap().IncludeBase().ReverseMap(); - CreateMap().IncludeBase().ReverseMap(); + CreateMap().IncludeBase(); } } } From a50e2027869c5abba44469d4b2ba1e75b19d475e Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:45:47 +0100 Subject: [PATCH 078/149] * Test commit --- FaKrosnoEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FaKrosnoEfDataModel/MappingProfile.cs b/FaKrosnoEfDataModel/MappingProfile.cs index 27983b9..aecabae 100644 --- a/FaKrosnoEfDataModel/MappingProfile.cs +++ b/FaKrosnoEfDataModel/MappingProfile.cs @@ -20,7 +20,7 @@ namespace FaKrosnoEfDataModel CreateMap().IncludeBase() .ReverseMap(); CreateMap().IncludeBase().ReverseMap(); - CreateMap().IncludeBase(); + CreateMap().IncludeBase().ReverseMap(); } } } From 890ab7a67f0456f59c896d0f1d76df2948a0c353 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:52:58 +0100 Subject: [PATCH 079/149] * Test Commit --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From d40caafce22a6a7ecd51fd0c3c92d9d2fb6a5698 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 30 Dec 2025 21:57:41 +0100 Subject: [PATCH 080/149] * Revert changes --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); + CreateMap().ReverseMap(); } } } From e844cbfb029bbe31d2db53339a7008cb04ce2224 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Wed, 31 Dec 2025 11:33:00 +0100 Subject: [PATCH 081/149] * Test change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From 9294b538dad1d5dcbbf8214eff92b679366bddaf Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Wed, 31 Dec 2025 11:35:22 +0100 Subject: [PATCH 082/149] * Test change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..704e10f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -32,7 +32,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); CreateMap(); } } From 9a4fb30d07b697c100febecdd082336fe9ec87f5 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 1 Jan 2026 21:52:41 +0100 Subject: [PATCH 083/149] Add .woodpecker.yml --- .woodpecker.yml | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .woodpecker.yml diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..5e3e097 --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,50 @@ +steps: + restore: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet restore --no-cache --force + + build: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet build --no-restore -c Release + depends_on: + - restore + + test: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results + depends_on: + - build + + pack-nuget: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - | + for proj in $(find . -name "*DataModel.csproj"); do + echo "Packaging $proj" + dotnet pack "$proj" --no-build -c Release -o ./nuget-packages + done + when: + branch: ${CI_REPO_DEFAULT_BRANCH} + event: push + path: + include: + - "**/*DataModel.csproj" + + publish-api: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - | + for proj in $(find . -name "*API.csproj"); do + proj_name=$(basename "$proj" .csproj) + echo "Publishing $proj" + dotnet publish "$$ proj" --no-build -c Release -o ./publish/ $${proj_name} + done + when: + branch: ${CI_REPO_DEFAULT_BRANCH} + event: push + path: + include: + - "**/*API.csproj" \ No newline at end of file From c17387acde25cf1e7ed9d5f002c4d4747b73f711 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 1 Jan 2026 21:53:04 +0100 Subject: [PATCH 084/149] * Test change --- SytelineSaAppEfDataModel/MappingProfile.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 704e10f..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -32,8 +32,8 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); - CreateMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } From 4e94cccc889a643b9b38ccf82546c1999ca5b41c Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 13:20:39 +0100 Subject: [PATCH 085/149] Update .woodpecker.yml --- .woodpecker.yml | 147 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 107 insertions(+), 40 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 5e3e097..4bcf387 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,50 +1,117 @@ +kind: template +name: dotnet-build-publish + +variables: + - DOTNET_VERSION: "8.0" + steps: - restore: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet restore --no-cache --force - build: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet build --no-restore -c Release - depends_on: - - restore - - test: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results - depends_on: - - build - - pack-nuget: - image: mcr.microsoft.com/dotnet/sdk:8.0 + # Krok 1: Detekcja, które projekty zmieniły się w tym commicie + detect-changed-projects: + image: alpine/git:latest commands: + - echo "Pobieram listę zmienionych plików..." + - git fetch origin $CI_COMMIT_BEFORE $CI_COMMIT_SHA - | - for proj in $(find . -name "*DataModel.csproj"); do - echo "Packaging $proj" - dotnet pack "$proj" --no-build -c Release -o ./nuget-packages - done + CHANGED_FILES=$(git diff --name-only $CI_COMMIT_BEFORE $CI_COMMIT_SHA || echo "") + echo "Zmienione pliki:" + echo "$CHANGED_FILES" + + # Resetujemy env + > $CI_WORKSPACE/.env + + # Sprawdzamy po folderach / konwencjach + if echo "$CHANGED_FILES" | grep -Eq "^(DataModel|src/DataModel|Models)/"; then + echo "BUILD_DATAMODEL=true" >> $CI_WORKSPACE/.env + echo "Zmieniono projekt DataModel" + fi + + if echo "$CHANGED_FILES" | grep -Eq "^(Api|src/Api|Backend)/"; then + echo "BUILD_API=true" >> $CI_WORKSPACE/.env + echo "Zmieniono projekt API" + fi + + if echo "$CHANGED_FILES" | grep -Eq "^(Web|Blazor|Frontend|src/Blazor)/"; then + echo "BUILD_BLAZOR=true" >> $CI_WORKSPACE/.env + echo "Zmieniono projekt Blazor/Web" + fi + + # Jeśli nic nie zmieniono w projektach – kończymy szybko + if ! grep -q "BUILD_" $CI_WORKSPACE/.env; then + echo "Brak zmian w projektach .NET – pomijam build." + exit 0 + fi + + cat $CI_WORKSPACE/.env + + # Krok 2: Restore (wspólny) + restore: + image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} + commands: + - dotnet nuget add source "http://srv51.mikr.us:20120/v3/index.json" --name baget || true + - dotnet restore --locked-mode + + # Krok 3: Testy (zawsze jeśli coś się zmieniło) + test: + image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} + commands: + - dotnet test --no-restore -c Release when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*DataModel.csproj" + event: [push, pull_request, tag] + + # Krok 4: Build & Publish – osobne kroki dla każdego typu + publish-datamodel: + image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} + commands: + - source $CI_WORKSPACE/.env + - | + if [ "$BUILD_DATAMODEL" != "true" ]; then + echo "Pomijam publikację DataModel – brak zmian" + exit 0 + fi + - | + VERSION=${CI_COMMIT_TAG:-$(git rev-parse --short HEAD)} + # Zakładam, że projekt DataModel ma .csproj w folderze DataModel/ + dotnet pack DataModel/*.csproj --no-restore --no-build -c Release -o /workspace/nupkg /p:Version=$VERSION + for pkg in /workspace/nupkg/*.nupkg; do + dotnet nuget push "$pkg" --source baget --api-key ${BAGET_API_KEY} --skip-duplicate + done + secrets: [baget_api_key] + when: + event: [push, tag] + branch: main publish-api: - image: mcr.microsoft.com/dotnet/sdk:8.0 + image: docker:latest commands: + - source $CI_WORKSPACE/.env - | - for proj in $(find . -name "*API.csproj"); do - proj_name=$(basename "$proj" .csproj) - echo "Publishing $proj" - dotnet publish "$$ proj" --no-build -c Release -o ./publish/ $${proj_name} - done + if [ "$BUILD_API" != "true" ]; then + echo "Pomijam budowanie API – brak zmian" + exit 0 + fi + - | + cd Api # lub ścieżka do Dockerfile + docker build -t myregistry/${CI_REPO_OWNER}/${CI_REPO_NAME}-api:${CI_COMMIT_TAG:-latest} . + echo ${DOCKER_PASSWORD} | docker login myregistry -u ${DOCKER_USERNAME} --password-stdin + docker push myregistry/${CI_REPO_OWNER}/${CI_REPO_NAME}-api:${CI_COMMIT_TAG:-latest} + secrets: [docker_username, docker_password] when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*API.csproj" \ No newline at end of file + event: [push, tag] + branch: main + + publish-blazor: + image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} + commands: + - source $CI_WORKSPACE/.env + - | + if [ "$BUILD_BLAZOR" != "true" ]; then + echo "Pomijam publikację Blazor – brak zmian" + exit 0 + fi + - dotnet publish Web/*.csproj --no-restore -c Release -o /workspace/publish + - echo "Pliki Blazor gotowe do deployu w /workspace/publish" + # Tu później możesz dodać rsync, az copy, itp. + when: + event: [push, tag] + branch: main \ No newline at end of file From b336dfe483c5f23983f2964b46adbf234c504a61 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:07:09 +0100 Subject: [PATCH 086/149] Update .woodpecker.yml --- .woodpecker.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index 4bcf387..3670a56 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -3,9 +3,19 @@ name: dotnet-build-publish variables: - DOTNET_VERSION: "8.0" +clone: + disable: true steps: + clone-manual: + image: woodpeckerci/plugin-git + settings: + remote: http://gitea:3000/FA/FA_WEB.git # wewnętrzny URL, agent widzi gitea po nazwie serwisu! + branch: master + depth: 1 + + # Krok 1: Detekcja, które projekty zmieniły się w tym commicie detect-changed-projects: image: alpine/git:latest From 04a43d6f04c213c5dffb09d5c763778d8c245f22 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 2 Jan 2026 14:08:43 +0100 Subject: [PATCH 087/149] trigger pipeline test From 6770e41a6ee7b6b13238d7a4eab97c2f0e40fd56 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:11:52 +0100 Subject: [PATCH 088/149] Update .woodpecker.yml --- .woodpecker.yml | 175 ++++++++++++++---------------------------------- 1 file changed, 49 insertions(+), 126 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 3670a56..755159b 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,127 +1,50 @@ -kind: template -name: dotnet-build-publish - -variables: - - DOTNET_VERSION: "8.0" -clone: - disable: true - steps: - - clone-manual: - image: woodpeckerci/plugin-git - settings: - remote: http://gitea:3000/FA/FA_WEB.git # wewnętrzny URL, agent widzi gitea po nazwie serwisu! - branch: master - depth: 1 - - - # Krok 1: Detekcja, które projekty zmieniły się w tym commicie - detect-changed-projects: - image: alpine/git:latest - commands: - - echo "Pobieram listę zmienionych plików..." - - git fetch origin $CI_COMMIT_BEFORE $CI_COMMIT_SHA - - | - CHANGED_FILES=$(git diff --name-only $CI_COMMIT_BEFORE $CI_COMMIT_SHA || echo "") - echo "Zmienione pliki:" - echo "$CHANGED_FILES" - - # Resetujemy env - > $CI_WORKSPACE/.env - - # Sprawdzamy po folderach / konwencjach - if echo "$CHANGED_FILES" | grep -Eq "^(DataModel|src/DataModel|Models)/"; then - echo "BUILD_DATAMODEL=true" >> $CI_WORKSPACE/.env - echo "Zmieniono projekt DataModel" - fi - - if echo "$CHANGED_FILES" | grep -Eq "^(Api|src/Api|Backend)/"; then - echo "BUILD_API=true" >> $CI_WORKSPACE/.env - echo "Zmieniono projekt API" - fi - - if echo "$CHANGED_FILES" | grep -Eq "^(Web|Blazor|Frontend|src/Blazor)/"; then - echo "BUILD_BLAZOR=true" >> $CI_WORKSPACE/.env - echo "Zmieniono projekt Blazor/Web" - fi - - # Jeśli nic nie zmieniono w projektach – kończymy szybko - if ! grep -q "BUILD_" $CI_WORKSPACE/.env; then - echo "Brak zmian w projektach .NET – pomijam build." - exit 0 - fi - - cat $CI_WORKSPACE/.env - - # Krok 2: Restore (wspólny) - restore: - image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} - commands: - - dotnet nuget add source "http://srv51.mikr.us:20120/v3/index.json" --name baget || true - - dotnet restore --locked-mode - - # Krok 3: Testy (zawsze jeśli coś się zmieniło) - test: - image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} - commands: - - dotnet test --no-restore -c Release - when: - event: [push, pull_request, tag] - - # Krok 4: Build & Publish – osobne kroki dla każdego typu - publish-datamodel: - image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} - commands: - - source $CI_WORKSPACE/.env - - | - if [ "$BUILD_DATAMODEL" != "true" ]; then - echo "Pomijam publikację DataModel – brak zmian" - exit 0 - fi - - | - VERSION=${CI_COMMIT_TAG:-$(git rev-parse --short HEAD)} - # Zakładam, że projekt DataModel ma .csproj w folderze DataModel/ - dotnet pack DataModel/*.csproj --no-restore --no-build -c Release -o /workspace/nupkg /p:Version=$VERSION - for pkg in /workspace/nupkg/*.nupkg; do - dotnet nuget push "$pkg" --source baget --api-key ${BAGET_API_KEY} --skip-duplicate - done - secrets: [baget_api_key] - when: - event: [push, tag] - branch: main - - publish-api: - image: docker:latest - commands: - - source $CI_WORKSPACE/.env - - | - if [ "$BUILD_API" != "true" ]; then - echo "Pomijam budowanie API – brak zmian" - exit 0 - fi - - | - cd Api # lub ścieżka do Dockerfile - docker build -t myregistry/${CI_REPO_OWNER}/${CI_REPO_NAME}-api:${CI_COMMIT_TAG:-latest} . - echo ${DOCKER_PASSWORD} | docker login myregistry -u ${DOCKER_USERNAME} --password-stdin - docker push myregistry/${CI_REPO_OWNER}/${CI_REPO_NAME}-api:${CI_COMMIT_TAG:-latest} - secrets: [docker_username, docker_password] - when: - event: [push, tag] - branch: main - - publish-blazor: - image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} - commands: - - source $CI_WORKSPACE/.env - - | - if [ "$BUILD_BLAZOR" != "true" ]; then - echo "Pomijam publikację Blazor – brak zmian" - exit 0 - fi - - dotnet publish Web/*.csproj --no-restore -c Release -o /workspace/publish - - echo "Pliki Blazor gotowe do deployu w /workspace/publish" - # Tu później możesz dodać rsync, az copy, itp. - when: - event: [push, tag] - branch: main \ No newline at end of file + restore: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet restore --no-cache --force + + build: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet build --no-restore -c Release + depends_on: + - restore + + test: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results + depends_on: + - build + + pack-nuget: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - | + for proj in $(find . -name "*DataModel.csproj"); do + echo "Packaging $proj" + dotnet pack "$proj" --no-build -c Release -o ./nuget-packages + done + when: + branch: ${CI_REPO_DEFAULT_BRANCH} + event: push + path: + include: + - "**/*DataModel.csproj" + + publish-api: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - | + for proj in $(find . -name "*API.csproj"); do + proj_name=$(basename "$proj" .csproj) + echo "Publishing $proj" + dotnet publish "$$ proj" --no-build -c Release -o ./publish/ $${proj_name} + done + when: + branch: ${CI_REPO_DEFAULT_BRANCH} + event: push + path: + include: + - "**/*API.csproj" \ No newline at end of file From e04f133b49ee63e5318a423af234384f4ae118b3 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:13:40 +0100 Subject: [PATCH 089/149] Update .woodpecker.yml --- .woodpecker.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 755159b..d3f908a 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,4 +1,14 @@ -steps: + clone: + disable: true + + steps: + clone-manual: + image: woodpeckerci/plugin-git + settings: + remote: http://gitea:3000/FA/FA_WEB.git # wewnętrzny URL, agent widzi gitea po nazwie serwisu! + branch: master + depth: 1 + restore: image: mcr.microsoft.com/dotnet/sdk:8.0 commands: From f3977428ef1ff2db784b16fede1c03693e90c069 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:14:57 +0100 Subject: [PATCH 090/149] Update .woodpecker.yml --- .woodpecker.yml | 108 ++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 53 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index d3f908a..1b2883b 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,60 +1,62 @@ - clone: +# Wyłącz domyślne clone wykonywane przez Woodpecker +clone: disable: true - steps: - clone-manual: +# Główna pipeline – wszystko co chcesz wykonać +pipeline: + clone-manual: image: woodpeckerci/plugin-git settings: - remote: http://gitea:3000/FA/FA_WEB.git # wewnętrzny URL, agent widzi gitea po nazwie serwisu! + remote: http://gitea:3000/FA/FA_WEB.git branch: master depth: 1 - restore: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet restore --no-cache --force - - build: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet build --no-restore -c Release - depends_on: - - restore - - test: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results - depends_on: - - build - - pack-nuget: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - | - for proj in $(find . -name "*DataModel.csproj"); do - echo "Packaging $proj" - dotnet pack "$proj" --no-build -c Release -o ./nuget-packages - done - when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*DataModel.csproj" - - publish-api: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - | - for proj in $(find . -name "*API.csproj"); do - proj_name=$(basename "$proj" .csproj) - echo "Publishing $proj" - dotnet publish "$$ proj" --no-build -c Release -o ./publish/ $${proj_name} - done - when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*API.csproj" \ No newline at end of file + restore: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet restore --no-cache --force + + build: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet build --no-restore -c Release + depends_on: + - restore + + test: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results + depends_on: + - build + + pack-nuget: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - | + for proj in $(find . -name "*DataModel.csproj"); do + echo "Packaging $proj" + dotnet pack "$proj" --no-build -c Release -o ./nuget-packages + done + when: + branch: ${CI_REPO_DEFAULT_BRANCH} + event: push + path: + include: + - "**/*DataModel.csproj" + + publish-api: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - | + for proj in $(find . -name "*API.csproj"); do + proj_name=$(basename "$proj" .csproj) + echo "Publishing $proj" + dotnet publish "$proj" --no-build -c Release -o ./publish/$proj_name + done + when: + branch: ${CI_REPO_DEFAULT_BRANCH} + event: push + path: + include: + - "**/*API.csproj" \ No newline at end of file From 4c3397f5c51a2b314f89341cf3db322ca96e18d9 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:15:55 +0100 Subject: [PATCH 091/149] Update .woodpecker.yml --- .woodpecker.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 1b2883b..a00d865 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,8 +1,7 @@ -# Wyłącz domyślne clone wykonywane przez Woodpecker clone: - disable: true + git: + disable: true -# Główna pipeline – wszystko co chcesz wykonać pipeline: clone-manual: image: woodpeckerci/plugin-git From a301ca1eccfe68cd61095db7cf57a9d0038e2cf6 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:16:54 +0100 Subject: [PATCH 092/149] Update .woodpecker.yml --- .woodpecker.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index a00d865..0f18096 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,8 +1,6 @@ -clone: - git: - disable: true +skip_clone: true -pipeline: +steps: clone-manual: image: woodpeckerci/plugin-git settings: @@ -14,6 +12,8 @@ pipeline: image: mcr.microsoft.com/dotnet/sdk:8.0 commands: - dotnet restore --no-cache --force + depends_on: + - clone-manual build: image: mcr.microsoft.com/dotnet/sdk:8.0 @@ -43,6 +43,8 @@ pipeline: path: include: - "**/*DataModel.csproj" + depends_on: + - test # opcjonalnie, dodaj jeśli chcesz zależności publish-api: image: mcr.microsoft.com/dotnet/sdk:8.0 @@ -58,4 +60,6 @@ pipeline: event: push path: include: - - "**/*API.csproj" \ No newline at end of file + - "**/*API.csproj" + depends_on: + - test # opcjonalnie \ No newline at end of file From 568d2d3918d85e70420bbffb93d6137b65149855 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:26:40 +0100 Subject: [PATCH 093/149] Update .woodpecker.yml --- .woodpecker.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index 0f18096..13625a0 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,6 +1,11 @@ skip_clone: true steps: + add-local-nuget-source: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet nuget add source http://srv51.mikr.us:20120/nuget/index.json --name local-baget + clone-manual: image: woodpeckerci/plugin-git settings: @@ -14,6 +19,7 @@ steps: - dotnet restore --no-cache --force depends_on: - clone-manual + - add-local-nuget-source build: image: mcr.microsoft.com/dotnet/sdk:8.0 From e7e5e7fbb081340633b652d5a89f43b39c3db3dc Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:13:19 +0100 Subject: [PATCH 094/149] Update .woodpecker.yml --- .woodpecker.yml | 148 ++++++++++++++++++++++++++++-------------------- 1 file changed, 88 insertions(+), 60 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 13625a0..aba41e9 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,71 +1,99 @@ -skip_clone: true +# .woodpecker.yml – uniwersalny dla dowolnej wersji .NET (6.0+) + +when: + event: [push, tag] + branch: [main] steps: - add-local-nuget-source: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet nuget add source http://srv51.mikr.us:20120/nuget/index.json --name local-baget - - clone-manual: - image: woodpeckerci/plugin-git - settings: - remote: http://gitea:3000/FA/FA_WEB.git - branch: master - depth: 1 - restore: - image: mcr.microsoft.com/dotnet/sdk:8.0 + image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet restore --no-cache --force - depends_on: - - clone-manual - - add-local-nuget-source - - build: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet build --no-restore -c Release - depends_on: - - restore + - dotnet restore + volumes: + - nuget-cache:/root/.nuget/packages test: - image: mcr.microsoft.com/dotnet/sdk:8.0 + image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results - depends_on: - - build + - dotnet test --no-restore --configuration Release --logger "trx" --results-directory /tmp/test-results - pack-nuget: - image: mcr.microsoft.com/dotnet/sdk:8.0 + build: + image: mcr.microsoft.com/dotnet/sdk:latest + commands: + - dotnet build --no-restore --configuration Release + + deploy: + image: mcr.microsoft.com/dotnet/sdk:latest + secrets: [baget_api_key, baget_url] + volumes: + - /opt/deployment:/deploy-host + - nuget-cache:/root/.nuget/packages commands: - | - for proj in $(find . -name "*DataModel.csproj"); do - echo "Packaging $proj" - dotnet pack "$proj" --no-build -c Release -o ./nuget-packages - done - when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*DataModel.csproj" - depends_on: - - test # opcjonalnie, dodaj jeśli chcesz zależności + set -euo pipefail - publish-api: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - | - for proj in $(find . -name "*API.csproj"); do - proj_name=$(basename "$proj" .csproj) - echo "Publishing $proj" - dotnet publish "$proj" --no-build -c Release -o ./publish/$proj_name - done - when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*API.csproj" - depends_on: - - test # opcjonalnie \ No newline at end of file + echo "=== Informacje o projekcie ===" + echo "Repo: ${CI_REPO_NAME}" + echo "Commit: ${CI_COMMIT_SHA:0:8}" + echo "Branch/Tag: ${CI_COMMIT_REF}" + echo "SDK version: $(dotnet --version)" + + # Odczytujemy tylko metadane typu projektu + PROJECT_TYPE=$(dotnet msbuild -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") + DEPLOY_TO_CENTRAL=$(dotnet msbuild -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") + + echo "ProjectType: $PROJECT_TYPE" + echo "DeployToCentral: $DEPLOY_TO_CENTRAL" + + case "$PROJECT_TYPE" in + DataModel) + echo "→ Pakowanie i publikacja do BaGet" + dotnet pack --no-build --configuration Release -o /tmp/nupkg + + for pkg in /tmp/nupkg/*.nupkg; do + dotnet nuget push "$pkg" \ + --api-key "${BAGET_API_KEY}" \ + --source "${BAGET_URL}" \ + --skip-duplicate + done + echo "Publikacja NuGet zakończona." + ;; + + ConsoleApp|Api|Blazor) + if [[ "$DEPLOY_TO_CENTRAL" != "true" ]]; then + echo "DeployToCentral=false – pomijam deploy." + exit 0 + fi + + echo "→ Publikacja $PROJECT_TYPE" + + PUBLISH_ARGS="--no-build -c Release -o /tmp/publish" + + if [[ "$PROJECT_TYPE" == "ConsoleApp" ]]; then + RID=$(dotnet msbuild -getProperty:RuntimeIdentifier -noLogo 2>/dev/null || echo "linux-x64") + SELF_CONTAINED=$(dotnet msbuild -getProperty:SelfContained -noLogo 2>/dev/null || echo "true") + SINGLE_FILE=$(dotnet msbuild -getProperty:PublishSingleFile -noLogo 2>/dev/null || echo "true") + PUBLISH_ARGS="$PUBLISH_ARGS --self-contained $SELF_CONTAINED -r $RID -p:PublishSingleFile=$SINGLE_FILE" + else + TRIMMED=$(dotnet msbuild -getProperty:PublishTrimmed -noLogo 2>/dev/null || echo "true") + PUBLISH_ARGS="$PUBLISH_ARGS -p:PublishTrimmed=$TRIMMED" + fi + + dotnet publish $PUBLISH_ARGS + + TARGET_DIR="/deploy-host/$PROJECT_TYPE/${CI_REPO_NAME}" + mkdir -p "$TARGET_DIR" + cp -r /tmp/publish/* "$TARGET_DIR/" + find "$TARGET_DIR" -type f \( -name "*.dll" -o -name "*.exe" -o -perm /111 \) -exec chmod +x {} \; 2>/dev/null || true + + echo "Deploy zakończony → $TARGET_DIR" + ;; + + *) + echo "Nieznany ProjectType – brak akcji." + ;; + esac + +volumes: + - name: nuget-cache + temp: {} \ No newline at end of file From c9217867dfc3d903ca0acc3dcd646314168f2422 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 2 Jan 2026 21:14:33 +0100 Subject: [PATCH 095/149] * Updated ProjectType --- SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj index adee2a9..9fcc074 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj +++ b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj @@ -2,6 +2,7 @@ net8.0 + DataModel enable enable From be8102c77739e86f2c59f8889d292df0a6c87287 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 2 Jan 2026 14:08:43 +0100 Subject: [PATCH 096/149] trigger pipeline test From ae982f59e3caf750c3df8c20dd7df7beea96e309 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 2 Jan 2026 21:14:33 +0100 Subject: [PATCH 097/149] * Updated ProjectType --- SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj index adee2a9..9fcc074 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj +++ b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj @@ -2,6 +2,7 @@ net8.0 + DataModel enable enable From dfeecd59d89cd287ae09eacf745cd94b8a0dfbc0 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 2 Jan 2026 21:26:07 +0100 Subject: [PATCH 098/149] * Changed .csproj --- SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj index 9fcc074..1e23ae8 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj +++ b/SytelineSaAppEfDataModel/SytelineSaAppEfDataModel.csproj @@ -6,6 +6,7 @@ enable enable + SytelineSaAppEfDataModel Piotr Kus Syteline Entity Framework Data Model From bc968a1a0fca2e145b92db7306bf20681273f38f Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:30:13 +0100 Subject: [PATCH 099/149] Update .woodpecker.yml --- .woodpecker.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index aba41e9..2d0c1cc 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,4 +1,4 @@ -# .woodpecker.yml – uniwersalny dla dowolnej wersji .NET (6.0+) +# .woodpecker.yml – aktualna wersja dla Woodpecker 3.x (2026) when: event: [push, tag] @@ -9,8 +9,6 @@ steps: image: mcr.microsoft.com/dotnet/sdk:latest commands: - dotnet restore - volumes: - - nuget-cache:/root/.nuget/packages test: image: mcr.microsoft.com/dotnet/sdk:latest @@ -24,10 +22,13 @@ steps: deploy: image: mcr.microsoft.com/dotnet/sdk:latest - secrets: [baget_api_key, baget_url] volumes: - - /opt/deployment:/deploy-host - - nuget-cache:/root/.nuget/packages + - /opt/deployment:/deploy-host # Host mount – wymaga "Trusted" repo! + environment: + BAGET_API_KEY: + from_secret: baget_api_key # Nowa składnia secrets + BAGET_URL: + from_secret: baget_url commands: - | set -euo pipefail @@ -38,7 +39,6 @@ steps: echo "Branch/Tag: ${CI_COMMIT_REF}" echo "SDK version: $(dotnet --version)" - # Odczytujemy tylko metadane typu projektu PROJECT_TYPE=$(dotnet msbuild -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") DEPLOY_TO_CENTRAL=$(dotnet msbuild -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") @@ -92,8 +92,4 @@ steps: *) echo "Nieznany ProjectType – brak akcji." ;; - esac - -volumes: - - name: nuget-cache - temp: {} \ No newline at end of file + esac \ No newline at end of file From b290ff47f2f198be009fb7886f933b020e8b9ae4 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:42:50 +0100 Subject: [PATCH 100/149] Update .woodpecker.yml --- .woodpecker.yml | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 2d0c1cc..24e3932 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,4 +1,4 @@ -# .woodpecker.yml – aktualna wersja dla Woodpecker 3.x (2026) +# .woodpecker.yml – deploy via SSH (bez volumes i bez Trusted) when: event: [push, tag] @@ -22,13 +22,13 @@ steps: deploy: image: mcr.microsoft.com/dotnet/sdk:latest - volumes: - - /opt/deployment:/deploy-host # Host mount – wymaga "Trusted" repo! environment: BAGET_API_KEY: - from_secret: baget_api_key # Nowa składnia secrets + from_secret: baget_api_key BAGET_URL: from_secret: baget_url + DEPLOY_SSH_KEY: + from_secret: deploy_ssh_key commands: - | set -euo pipefail @@ -81,12 +81,20 @@ steps: dotnet publish $PUBLISH_ARGS - TARGET_DIR="/deploy-host/$PROJECT_TYPE/${CI_REPO_NAME}" - mkdir -p "$TARGET_DIR" - cp -r /tmp/publish/* "$TARGET_DIR/" - find "$TARGET_DIR" -type f \( -name "*.dll" -o -name "*.exe" -o -perm /111 \) -exec chmod +x {} \; 2>/dev/null || true + echo "Przygotowanie SSH do deployu na localhost" + mkdir -p ~/.ssh + echo "$DEPLOY_SSH_KEY" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + ssh-keyscan -H localhost >> ~/.ssh/known_hosts 2>/dev/null - echo "Deploy zakończony → $TARGET_DIR" + TARGET_DIR="/opt/deployment/$PROJECT_TYPE/${CI_REPO_NAME}" + echo "Deploy via rsync do $TARGET_DIR" + + rsync -avz --delete /tmp/publish/ "$(whoami)@localhost:$TARGET_DIR/" + + ssh "$(whoami)@localhost" "find '$TARGET_DIR' -type f \\( -name '*.dll' -o -name '*.exe' -o -perm /111 \\) -exec chmod +x {} \\; 2>/dev/null || true" + + echo "Deploy $PROJECT_TYPE zakończony pomyślnie → $TARGET_DIR" ;; *) From ac8213ff04ad0cd913c8ada887cd6b5d28f6f3c1 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:44:51 +0100 Subject: [PATCH 101/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 24e3932..f7e367a 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,7 +1,7 @@ # .woodpecker.yml – deploy via SSH (bez volumes i bez Trusted) when: - event: [push, tag] + event: [push, tag, manual] branch: [main] steps: From cfbaaf85ace783f11d0e6a0f390184fb537847fd Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:47:38 +0100 Subject: [PATCH 102/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index f7e367a..ab6d052 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -2,7 +2,7 @@ when: event: [push, tag, manual] - branch: [main] + branch: [master] steps: restore: From b87b574b7d6f2876972e4ac829d69626fc906533 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:50:12 +0100 Subject: [PATCH 103/149] Update .woodpecker.yml --- .woodpecker.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index ab6d052..fd40dc4 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,10 +1,19 @@ # .woodpecker.yml – deploy via SSH (bez volumes i bez Trusted) +skip_clone: true + when: event: [push, tag, manual] branch: [master] steps: + clone-manual: + image: woodpeckerci/plugin-git + settings: + remote: http://gitea:3000/FA/FA_WEB.git + branch: master + depth: 1 + restore: image: mcr.microsoft.com/dotnet/sdk:latest commands: From 21336e8dc672b877477c5328f752bb39aa9377a3 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:56:52 +0100 Subject: [PATCH 104/149] Update .woodpecker.yml --- .woodpecker.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index fd40dc4..c71017a 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -19,6 +19,23 @@ steps: commands: - dotnet restore + restore: + image: mcr.microsoft.com/dotnet/sdk:latest + environment: + BAGET_URL: + from_secret: http://srv51.mikr.us:20120/v3/index.json # np. https://twoj-serwer.pl/baget/v3/index.json + BAGET_API_KEY: # opcjonalnie, jeśli BaGet wymaga klucza do pobierania + from_secret: hfsa853nc9vfap53285ybndfahi58325hie242dsafa954 + commands: + - | + # Dodaj BaGet jako dodatkowe źródło NuGet + dotnet nuget add source "$BAGET_URL" --name internal-baget + + # Jeśli BaGet wymaga autentykacji do pobierania (rzadkie, ale możliwe) + # dotnet nuget update source internal-baget --username anything --password "$BAGET_API_KEY" --store-password-in-clear-text + + dotnet restore + test: image: mcr.microsoft.com/dotnet/sdk:latest commands: From 21d6c76f37f64f97020a8c2cd1bd095813889b53 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:58:07 +0100 Subject: [PATCH 105/149] Update .woodpecker.yml --- .woodpecker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index c71017a..62c2002 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -23,9 +23,9 @@ steps: image: mcr.microsoft.com/dotnet/sdk:latest environment: BAGET_URL: - from_secret: http://srv51.mikr.us:20120/v3/index.json # np. https://twoj-serwer.pl/baget/v3/index.json + from_secret: baget_url # np. https://twoj-serwer.pl/baget/v3/index.json BAGET_API_KEY: # opcjonalnie, jeśli BaGet wymaga klucza do pobierania - from_secret: hfsa853nc9vfap53285ybndfahi58325hie242dsafa954 + from_secret: baget_api_key commands: - | # Dodaj BaGet jako dodatkowe źródło NuGet From 398e0d57969911ebe12dc0bcf2f188094396af0f Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 22:02:39 +0100 Subject: [PATCH 106/149] Update .woodpecker.yml --- .woodpecker.yml | 164 +++++++++++++++++++++++++----------------------- 1 file changed, 84 insertions(+), 80 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 62c2002..c0a25f6 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,50 +1,52 @@ -# .woodpecker.yml – deploy via SSH (bez volumes i bez Trusted) - -skip_clone: true +# .woodpecker.yml – monorepo .NET z poprawną kolejnością budowania when: event: [push, tag, manual] branch: [master] steps: - clone-manual: - image: woodpeckerci/plugin-git - settings: - remote: http://gitea:3000/FA/FA_WEB.git - branch: master - depth: 1 - restore: image: mcr.microsoft.com/dotnet/sdk:latest commands: - dotnet restore - restore: - image: mcr.microsoft.com/dotnet/sdk:latest - environment: - BAGET_URL: - from_secret: baget_url # np. https://twoj-serwer.pl/baget/v3/index.json - BAGET_API_KEY: # opcjonalnie, jeśli BaGet wymaga klucza do pobierania - from_secret: baget_api_key - commands: - - | - # Dodaj BaGet jako dodatkowe źródło NuGet - dotnet nuget add source "$BAGET_URL" --name internal-baget - - # Jeśli BaGet wymaga autentykacji do pobierania (rzadkie, ale możliwe) - # dotnet nuget update source internal-baget --username anything --password "$BAGET_API_KEY" --store-password-in-clear-text - - dotnet restore - test: image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet test --no-restore --configuration Release --logger "trx" --results-directory /tmp/test-results + - dotnet test --no-restore --configuration Release --logger "trx" - build: + build-and-pack-datamodels: image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet build --no-restore --configuration Release + - | + set -euo pipefail + + # Odczytujemy typy projektów w solution (zakładamy, że każdy ma w csproj) + echo "=== Wykrywanie projektów DataModel ===" + + LOCAL_NUGET="/tmp/local-nuget" + mkdir -p "$LOCAL_NUGET" + + for csproj in *.csproj; do + [ -f "$csproj" ] || continue + + PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") + + if [[ "$PROJECT_TYPE" == "DataModel" ]]; then + PROJECT_NAME=$(basename "$csproj" .csproj) + echo "→ Pakuję DataModel: $PROJECT_NAME" + + dotnet pack "$csproj" --no-build --configuration Release -o "$LOCAL_NUGET" + + echo " Pakiet zapisany w $LOCAL_NUGET" + fi + done + + # Dodajemy lokalny folder jako źródło NuGet dla kolejnych kroków + dotnet nuget add source "$LOCAL_NUGET" --name local-temp-nuget + + echo "Lokalne źródło NuGet dodane: $LOCAL_NUGET" + ls -la "$LOCAL_NUGET" deploy: image: mcr.microsoft.com/dotnet/sdk:latest @@ -59,71 +61,73 @@ steps: - | set -euo pipefail - echo "=== Informacje o projekcie ===" + echo "=== Informacje o projekcie (monorepo) ===" echo "Repo: ${CI_REPO_NAME}" echo "Commit: ${CI_COMMIT_SHA:0:8}" echo "Branch/Tag: ${CI_COMMIT_REF}" - echo "SDK version: $(dotnet --version)" - PROJECT_TYPE=$(dotnet msbuild -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") - DEPLOY_TO_CENTRAL=$(dotnet msbuild -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") + # Publikujemy wszystkie projekty (oprócz DataModel – one już spakowane) + LOCAL_NUGET="/tmp/local-nuget" - echo "ProjectType: $PROJECT_TYPE" - echo "DeployToCentral: $DEPLOY_TO_CENTRAL" + for csproj in *.csproj; do + [ -f "$csproj" ] || continue - case "$PROJECT_TYPE" in - DataModel) - echo "→ Pakowanie i publikacja do BaGet" - dotnet pack --no-build --configuration Release -o /tmp/nupkg + PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") + DEPLOY_TO_CENTRAL=$(dotnet msbuild "$csproj" -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") - for pkg in /tmp/nupkg/*.nupkg; do - dotnet nuget push "$pkg" \ - --api-key "${BAGET_API_KEY}" \ - --source "${BAGET_URL}" \ - --skip-duplicate - done - echo "Publikacja NuGet zakończona." - ;; + case "$PROJECT_TYPE" in + DataModel) + # Opcjonalnie: publikuj do BaGet na koniec (po udanym buildzie całego solution) + if [[ -n "${BAGET_URL:-}" ]]; then + echo "→ Publikacja $PROJECT_TYPE do BaGet" + for pkg in "$LOCAL_NUGET"/*.nupkg; do + if [[ "$pkg" == *$(basename "$csproj" .csproj)* ]]; then + dotnet nuget push "$pkg" --api-key "$BAGET_API_KEY" --source "$BAGET_URL" --skip-duplicate + fi + done + fi + ;; - ConsoleApp|Api|Blazor) - if [[ "$DEPLOY_TO_CENTRAL" != "true" ]]; then - echo "DeployToCentral=false – pomijam deploy." - exit 0 - fi + ConsoleApp|Api|Blazor) + if [[ "$DEPLOY_TO_CENTRAL" != "true" ]]; then + echo "Projekt $PROJECT_TYPE: DeployToCentral=false – pomijam" + continue + fi - echo "→ Publikacja $PROJECT_TYPE" + echo "→ Publikacja $PROJECT_TYPE" - PUBLISH_ARGS="--no-build -c Release -o /tmp/publish" + PUBLISH_ARGS="-c Release -o /tmp/publish-$(basename "$csproj" .csproj)" - if [[ "$PROJECT_TYPE" == "ConsoleApp" ]]; then - RID=$(dotnet msbuild -getProperty:RuntimeIdentifier -noLogo 2>/dev/null || echo "linux-x64") - SELF_CONTAINED=$(dotnet msbuild -getProperty:SelfContained -noLogo 2>/dev/null || echo "true") - SINGLE_FILE=$(dotnet msbuild -getProperty:PublishSingleFile -noLogo 2>/dev/null || echo "true") - PUBLISH_ARGS="$PUBLISH_ARGS --self-contained $SELF_CONTAINED -r $RID -p:PublishSingleFile=$SINGLE_FILE" - else - TRIMMED=$(dotnet msbuild -getProperty:PublishTrimmed -noLogo 2>/dev/null || echo "true") - PUBLISH_ARGS="$PUBLISH_ARGS -p:PublishTrimmed=$TRIMMED" - fi + if [[ "$PROJECT_TYPE" == "ConsoleApp" ]]; then + RID=$(dotnet msbuild "$csproj" -getProperty:RuntimeIdentifier -noLogo || echo "linux-x64") + SELF_CONTAINED=$(dotnet msbuild "$csproj" -getProperty:SelfContained -noLogo || echo "true") + SINGLE_FILE=$(dotnet msbuild "$csproj" -getProperty:PublishSingleFile -noLogo || echo "true") + PUBLISH_ARGS="$PUBLISH_ARGS --self-contained $SELF_CONTAINED -r $RID -p:PublishSingleFile=$SINGLE_FILE" + else + TRIMMED=$(dotnet msbuild "$csproj" -getProperty:PublishTrimmed -noLogo || echo "true") + PUBLISH_ARGS="$PUBLISH_ARGS -p:PublishTrimmed=$TRIMMED" + fi - dotnet publish $PUBLISH_ARGS + dotnet publish "$csproj" --no-restore $PUBLISH_ARGS - echo "Przygotowanie SSH do deployu na localhost" - mkdir -p ~/.ssh - echo "$DEPLOY_SSH_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan -H localhost >> ~/.ssh/known_hosts 2>/dev/null + # Deploy via SSH + mkdir -p ~/.ssh + echo "$DEPLOY_SSH_KEY" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + ssh-keyscan -H localhost >> ~/.ssh/known_hosts 2>/dev/null - TARGET_DIR="/opt/deployment/$PROJECT_TYPE/${CI_REPO_NAME}" - echo "Deploy via rsync do $TARGET_DIR" + TARGET_DIR="/opt/deployment/$PROJECT_TYPE/${CI_REPO_NAME}-$(basename "$csproj" .csproj)" + rsync -avz --delete "/tmp/publish-$(basename "$csproj" .csproj)/" " $(whoami)@localhost:$TARGET_DIR/" - rsync -avz --delete /tmp/publish/ "$(whoami)@localhost:$TARGET_DIR/" + ssh "$(whoami)@localhost" "find '$TARGET_DIR' -type f \\( -name '*.dll' -o -name '*.exe' -o -perm /111 \\) -exec chmod +x {} \\; || true" - ssh "$(whoami)@localhost" "find '$TARGET_DIR' -type f \\( -name '*.dll' -o -name '*.exe' -o -perm /111 \\) -exec chmod +x {} \\; 2>/dev/null || true" + echo "Deploy $PROJECT_TYPE zakończony → $TARGET_DIR" + ;; - echo "Deploy $PROJECT_TYPE zakończony pomyślnie → $TARGET_DIR" - ;; + *) + echo "Projekt $(basename "$csproj") – nieznany typ ($PROJECT_TYPE), pomijam" + ;; + esac + done - *) - echo "Nieznany ProjectType – brak akcji." - ;; - esac \ No newline at end of file + echo "Cały pipeline monorepo zakończony pomyślnie." \ No newline at end of file From aa1bd5167eaf49e31812491c3e674ea366dccc31 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 2 Jan 2026 22:04:39 +0100 Subject: [PATCH 107/149] * Added project types --- FaKrosnoApi/FaKrosnoApi.csproj | 1 + FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj | 1 + OrdersManagement/OrdersManagement.csproj | 1 + OrdersManagementDataModel/OrdersManagementDataModel.csproj | 1 + 4 files changed, 4 insertions(+) diff --git a/FaKrosnoApi/FaKrosnoApi.csproj b/FaKrosnoApi/FaKrosnoApi.csproj index 91d2aa6..05268b0 100644 --- a/FaKrosnoApi/FaKrosnoApi.csproj +++ b/FaKrosnoApi/FaKrosnoApi.csproj @@ -2,6 +2,7 @@ net8.0 + Api enable enable diff --git a/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj b/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj index c68a1fe..ab4a415 100644 --- a/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj +++ b/FaKrosnoEfDataModel/FaKrosnoEfDataModel.csproj @@ -5,6 +5,7 @@ Piotr Kus FaKrosno Entity Framework Data Model net8.0 + DataModel enable enable patch diff --git a/OrdersManagement/OrdersManagement.csproj b/OrdersManagement/OrdersManagement.csproj index 8256497..436b81a 100644 --- a/OrdersManagement/OrdersManagement.csproj +++ b/OrdersManagement/OrdersManagement.csproj @@ -2,6 +2,7 @@ net8.0 + Blazor enable enable diff --git a/OrdersManagementDataModel/OrdersManagementDataModel.csproj b/OrdersManagementDataModel/OrdersManagementDataModel.csproj index 8e0703a..a159008 100644 --- a/OrdersManagementDataModel/OrdersManagementDataModel.csproj +++ b/OrdersManagementDataModel/OrdersManagementDataModel.csproj @@ -2,6 +2,7 @@ net8.0 + DataModel enable enable From 107f5b173c7671ac589c49807541307565396f67 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 2 Jan 2026 23:07:45 +0100 Subject: [PATCH 108/149] * Changed references to nuggets --- OrdersManagement/OrdersManagement.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OrdersManagement/OrdersManagement.csproj b/OrdersManagement/OrdersManagement.csproj index 436b81a..d90a0da 100644 --- a/OrdersManagement/OrdersManagement.csproj +++ b/OrdersManagement/OrdersManagement.csproj @@ -21,12 +21,11 @@ + - - From e354881309e37ad3499608d77ee955a00dcac077 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 2 Jan 2026 23:07:45 +0100 Subject: [PATCH 109/149] * Changed references to nuggets --- OrdersManagement/OrdersManagement.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OrdersManagement/OrdersManagement.csproj b/OrdersManagement/OrdersManagement.csproj index 436b81a..d90a0da 100644 --- a/OrdersManagement/OrdersManagement.csproj +++ b/OrdersManagement/OrdersManagement.csproj @@ -21,12 +21,11 @@ + - - From 653ab748e7e4467511c767da9a82ab0a58bcb64e Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 12:29:09 +0000 Subject: [PATCH 110/149] Add .woodpecker.yml --- .woodpecker.yml | 134 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 .woodpecker.yml diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..2b5c959 --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,134 @@ +skip_clone: true + +when: + event: [push, tag, manual] + branch: [master] + +steps: + clone-manual: + image: woodpeckerci/plugin-git + settings: + remote: http://gitea:3000/FA/FA_WEB.git + branch: master + depth: 1 + + restore: + image: mcr.microsoft.com/dotnet/sdk:latest + commands: + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Restore wszystkich projektów ===" + find . -name "*.csproj" -type f -exec dotnet restore "{}" \; + + test: + image: mcr.microsoft.com/dotnet/sdk:latest + commands: + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Uruchamianie testów ===" + dotnet test --no-restore --configuration Release --logger "trx" + depends_on: [restore] + + pack-datamodels: + image: mcr.microsoft.com/dotnet/sdk:latest + commands: + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Diagnostyka projektów ===" + find . -name "*.csproj" -type f | sort + mkdir -p nupkg + echo "=== Pakowanie projektów DataModel (wykrywane po obecności ) ===" + find . -name "*.csproj" -type f | while read csproj; do + if grep -q '' "$csproj"; then + PROJECT_NAME=$(basename "$csproj" .csproj) + echo "→ Pakuję $PROJECT_NAME ($csproj)" + dotnet pack "$csproj" --configuration Release -o "$CODE_DIR/nupkg" + else + PROJECT_NAME=$(basename "$csproj" .csproj) + echo "→ Pomijam $PROJECT_NAME – brak (nie jest to biblioteka NuGet)" + fi + done + echo "=== Spakowane pakiety (.nupkg) ===" + ls -la nupkg/ || echo "Brak spakowanych pakietów!" + depends_on: [test] + + publish-datamodels-to-baget: + image: mcr.microsoft.com/dotnet/sdk:latest + environment: + BAGETTER_API_KEY: + from_secret: baget_api_key + commands: + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + + echo "=== Test połączenia z BaGetter ===" + curl -f http://baget:80/v3/index.json || echo "Nie można połączyć się z BaGetter!" + + # Tworzymy minimalny NuGet.Config tylko po to, żeby odblokować HTTP dla nazwanego źródła + cat < NuGet.Config + + + + + + + + + EOF + + echo "=== Użyty NuGet.Config (tylko do odblokowania HTTP) ===" + cat NuGet.Config + + echo "=== Publikacja pakietów do BaGetter ===" + find ./nupkg -name "*.nupkg" -type f | while read pkg; do + echo "→ Push $(basename "$pkg")" + dotnet nuget push "$pkg" \ + --source "BaGet" \ + --api-key "hfsa853nc9vfap53285ybndfahi58325hie242dsafa954" \ + --skip-duplicate + done + + echo "Wszystkie pakiety DataModel opublikowane w BaGetter!" + depends_on: [pack-datamodels] + + build-and-publish-apps: + image: mcr.microsoft.com/dotnet/sdk:latest + environment: + DEPLOY_SSH_KEY: + from_secret: deploy_ssh_key + commands: + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Ponowny restore aplikacji (z najnowszymi pakietami z BaGetter) ===" + find . -name "*.csproj" -type f -exec dotnet restore "{}" \; + echo "=== Publish aplikacji ===" + find . -name "*.csproj" -type f | while read csproj; do + PROJECT_NAME=$(basename "$csproj" .csproj) + PROJECT_DIR=$(dirname "$csproj") + if [[ "$PROJECT_NAME" == *"Api"* ]] || [[ "$PROJECT_NAME" == *"Blazor"* ]] || [[ "$PROJECT_DIR" == *"/Api/"* ]] || [[ "$PROJECT_DIR" == *"/Blazor/"* ]]; then + DEPLOY_TO_CENTRAL=$(dotnet msbuild "$csproj" -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") + if [ "$DEPLOY_TO_CENTRAL" != "true" ]; then + echo "Pomijam $PROJECT_NAME (DeployToCentral ≠ true)" + continue + fi + echo "→ Publish $PROJECT_NAME ($csproj)" + dotnet publish "$csproj" --no-restore -c Release -o "$CODE_DIR/publish-$PROJECT_NAME" + # ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← + # Tu wstaw swój kod deployu (rsync/ssh itp.) + # ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← + else + echo "Pomijam $PROJECT_NAME (nie jest to Api ani Blazor)" + fi + done + echo "Pipeline zakończony pomyślnie!" + depends_on: [publish-datamodels-to-baget] \ No newline at end of file From c8b300336e930a59cca45282940cb2f12f3da910 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 13:32:31 +0100 Subject: [PATCH 111/149] * Test change to check pipeline --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From 0407205b5d138a876725ac3dde63ba39b4cca006 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 12:35:46 +0000 Subject: [PATCH 112/149] Update .woodpecker.yml --- .woodpecker.yml | 209 ++++++++++++++++++++++++------------------------ 1 file changed, 105 insertions(+), 104 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index c0a25f6..2b5c959 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,133 +1,134 @@ -# .woodpecker.yml – monorepo .NET z poprawną kolejnością budowania +skip_clone: true when: event: [push, tag, manual] branch: [master] steps: + clone-manual: + image: woodpeckerci/plugin-git + settings: + remote: http://gitea:3000/FA/FA_WEB.git + branch: master + depth: 1 + restore: image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet restore + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Restore wszystkich projektów ===" + find . -name "*.csproj" -type f -exec dotnet restore "{}" \; test: image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet test --no-restore --configuration Release --logger "trx" + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Uruchamianie testów ===" + dotnet test --no-restore --configuration Release --logger "trx" + depends_on: [restore] - build-and-pack-datamodels: + pack-datamodels: image: mcr.microsoft.com/dotnet/sdk:latest commands: - | - set -euo pipefail - - # Odczytujemy typy projektów w solution (zakładamy, że każdy ma w csproj) - echo "=== Wykrywanie projektów DataModel ===" - - LOCAL_NUGET="/tmp/local-nuget" - mkdir -p "$LOCAL_NUGET" - - for csproj in *.csproj; do - [ -f "$csproj" ] || continue - - PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") - - if [[ "$PROJECT_TYPE" == "DataModel" ]]; then + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Diagnostyka projektów ===" + find . -name "*.csproj" -type f | sort + mkdir -p nupkg + echo "=== Pakowanie projektów DataModel (wykrywane po obecności ) ===" + find . -name "*.csproj" -type f | while read csproj; do + if grep -q '' "$csproj"; then PROJECT_NAME=$(basename "$csproj" .csproj) - echo "→ Pakuję DataModel: $PROJECT_NAME" - - dotnet pack "$csproj" --no-build --configuration Release -o "$LOCAL_NUGET" - - echo " Pakiet zapisany w $LOCAL_NUGET" + echo "→ Pakuję $PROJECT_NAME ($csproj)" + dotnet pack "$csproj" --configuration Release -o "$CODE_DIR/nupkg" + else + PROJECT_NAME=$(basename "$csproj" .csproj) + echo "→ Pomijam $PROJECT_NAME – brak (nie jest to biblioteka NuGet)" fi done + echo "=== Spakowane pakiety (.nupkg) ===" + ls -la nupkg/ || echo "Brak spakowanych pakietów!" + depends_on: [test] - # Dodajemy lokalny folder jako źródło NuGet dla kolejnych kroków - dotnet nuget add source "$LOCAL_NUGET" --name local-temp-nuget - - echo "Lokalne źródło NuGet dodane: $LOCAL_NUGET" - ls -la "$LOCAL_NUGET" - - deploy: + publish-datamodels-to-baget: image: mcr.microsoft.com/dotnet/sdk:latest environment: - BAGET_API_KEY: + BAGETTER_API_KEY: from_secret: baget_api_key - BAGET_URL: - from_secret: baget_url + commands: + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + + echo "=== Test połączenia z BaGetter ===" + curl -f http://baget:80/v3/index.json || echo "Nie można połączyć się z BaGetter!" + + # Tworzymy minimalny NuGet.Config tylko po to, żeby odblokować HTTP dla nazwanego źródła + cat < NuGet.Config + + + + + + + + + EOF + + echo "=== Użyty NuGet.Config (tylko do odblokowania HTTP) ===" + cat NuGet.Config + + echo "=== Publikacja pakietów do BaGetter ===" + find ./nupkg -name "*.nupkg" -type f | while read pkg; do + echo "→ Push $(basename "$pkg")" + dotnet nuget push "$pkg" \ + --source "BaGet" \ + --api-key "hfsa853nc9vfap53285ybndfahi58325hie242dsafa954" \ + --skip-duplicate + done + + echo "Wszystkie pakiety DataModel opublikowane w BaGetter!" + depends_on: [pack-datamodels] + + build-and-publish-apps: + image: mcr.microsoft.com/dotnet/sdk:latest + environment: DEPLOY_SSH_KEY: from_secret: deploy_ssh_key commands: - | - set -euo pipefail - - echo "=== Informacje o projekcie (monorepo) ===" - echo "Repo: ${CI_REPO_NAME}" - echo "Commit: ${CI_COMMIT_SHA:0:8}" - echo "Branch/Tag: ${CI_COMMIT_REF}" - - # Publikujemy wszystkie projekty (oprócz DataModel – one już spakowane) - LOCAL_NUGET="/tmp/local-nuget" - - for csproj in *.csproj; do - [ -f "$csproj" ] || continue - - PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") - DEPLOY_TO_CENTRAL=$(dotnet msbuild "$csproj" -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") - - case "$PROJECT_TYPE" in - DataModel) - # Opcjonalnie: publikuj do BaGet na koniec (po udanym buildzie całego solution) - if [[ -n "${BAGET_URL:-}" ]]; then - echo "→ Publikacja $PROJECT_TYPE do BaGet" - for pkg in "$LOCAL_NUGET"/*.nupkg; do - if [[ "$pkg" == *$(basename "$csproj" .csproj)* ]]; then - dotnet nuget push "$pkg" --api-key "$BAGET_API_KEY" --source "$BAGET_URL" --skip-duplicate - fi - done - fi - ;; - - ConsoleApp|Api|Blazor) - if [[ "$DEPLOY_TO_CENTRAL" != "true" ]]; then - echo "Projekt $PROJECT_TYPE: DeployToCentral=false – pomijam" - continue - fi - - echo "→ Publikacja $PROJECT_TYPE" - - PUBLISH_ARGS="-c Release -o /tmp/publish-$(basename "$csproj" .csproj)" - - if [[ "$PROJECT_TYPE" == "ConsoleApp" ]]; then - RID=$(dotnet msbuild "$csproj" -getProperty:RuntimeIdentifier -noLogo || echo "linux-x64") - SELF_CONTAINED=$(dotnet msbuild "$csproj" -getProperty:SelfContained -noLogo || echo "true") - SINGLE_FILE=$(dotnet msbuild "$csproj" -getProperty:PublishSingleFile -noLogo || echo "true") - PUBLISH_ARGS="$PUBLISH_ARGS --self-contained $SELF_CONTAINED -r $RID -p:PublishSingleFile=$SINGLE_FILE" - else - TRIMMED=$(dotnet msbuild "$csproj" -getProperty:PublishTrimmed -noLogo || echo "true") - PUBLISH_ARGS="$PUBLISH_ARGS -p:PublishTrimmed=$TRIMMED" - fi - - dotnet publish "$csproj" --no-restore $PUBLISH_ARGS - - # Deploy via SSH - mkdir -p ~/.ssh - echo "$DEPLOY_SSH_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan -H localhost >> ~/.ssh/known_hosts 2>/dev/null - - TARGET_DIR="/opt/deployment/$PROJECT_TYPE/${CI_REPO_NAME}-$(basename "$csproj" .csproj)" - rsync -avz --delete "/tmp/publish-$(basename "$csproj" .csproj)/" " $(whoami)@localhost:$TARGET_DIR/" - - ssh "$(whoami)@localhost" "find '$TARGET_DIR' -type f \\( -name '*.dll' -o -name '*.exe' -o -perm /111 \\) -exec chmod +x {} \\; || true" - - echo "Deploy $PROJECT_TYPE zakończony → $TARGET_DIR" - ;; - - *) - echo "Projekt $(basename "$csproj") – nieznany typ ($PROJECT_TYPE), pomijam" - ;; - esac + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Ponowny restore aplikacji (z najnowszymi pakietami z BaGetter) ===" + find . -name "*.csproj" -type f -exec dotnet restore "{}" \; + echo "=== Publish aplikacji ===" + find . -name "*.csproj" -type f | while read csproj; do + PROJECT_NAME=$(basename "$csproj" .csproj) + PROJECT_DIR=$(dirname "$csproj") + if [[ "$PROJECT_NAME" == *"Api"* ]] || [[ "$PROJECT_NAME" == *"Blazor"* ]] || [[ "$PROJECT_DIR" == *"/Api/"* ]] || [[ "$PROJECT_DIR" == *"/Blazor/"* ]]; then + DEPLOY_TO_CENTRAL=$(dotnet msbuild "$csproj" -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") + if [ "$DEPLOY_TO_CENTRAL" != "true" ]; then + echo "Pomijam $PROJECT_NAME (DeployToCentral ≠ true)" + continue + fi + echo "→ Publish $PROJECT_NAME ($csproj)" + dotnet publish "$csproj" --no-restore -c Release -o "$CODE_DIR/publish-$PROJECT_NAME" + # ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← + # Tu wstaw swój kod deployu (rsync/ssh itp.) + # ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← + else + echo "Pomijam $PROJECT_NAME (nie jest to Api ani Blazor)" + fi done - - echo "Cały pipeline monorepo zakończony pomyślnie." \ No newline at end of file + echo "Pipeline zakończony pomyślnie!" + depends_on: [publish-datamodels-to-baget] \ No newline at end of file From ac565e7703b4dc2db9d3a7acd5efb8a574e4c761 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 12:37:04 +0000 Subject: [PATCH 113/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 2b5c959..bd67f67 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -92,7 +92,7 @@ steps: echo "→ Push $(basename "$pkg")" dotnet nuget push "$pkg" \ --source "BaGet" \ - --api-key "hfsa853nc9vfap53285ybndfahi58325hie242dsafa954" \ + --api-key "$BAGETTER_API_KEY" \ --skip-duplicate done From 397e13d86575cd25fc4fccd4d350c4c4f791c898 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 12:40:22 +0000 Subject: [PATCH 114/149] Update .woodpecker.yml --- .woodpecker.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index bd67f67..b101e19 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -101,9 +101,9 @@ steps: build-and-publish-apps: image: mcr.microsoft.com/dotnet/sdk:latest - environment: - DEPLOY_SSH_KEY: - from_secret: deploy_ssh_key + # environment: + # DEPLOY_SSH_KEY: + # from_secret: deploy_ssh_key commands: - | set -euf From 9aa427aef852e9c531de4649eb1fba5178bc3fe1 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 12:49:58 +0000 Subject: [PATCH 115/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index b101e19..7c15816 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -8,7 +8,7 @@ steps: clone-manual: image: woodpeckerci/plugin-git settings: - remote: http://gitea:3000/FA/FA_WEB.git + remote: http://172.0.0.1:3000/FA/FA_WEB.git branch: master depth: 1 From 09d131b89b82622652d53348f31df894c6f95fc7 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 12:51:10 +0000 Subject: [PATCH 116/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 7c15816..74f569d 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -8,7 +8,7 @@ steps: clone-manual: image: woodpeckerci/plugin-git settings: - remote: http://172.0.0.1:3000/FA/FA_WEB.git + remote: http://127.0.0.1:3000/FA/FA_WEB.git branch: master depth: 1 From e8f087123025e4eaef5c91a5429dfeb22442cf2f Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 12:51:37 +0000 Subject: [PATCH 117/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 74f569d..b101e19 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -8,7 +8,7 @@ steps: clone-manual: image: woodpeckerci/plugin-git settings: - remote: http://127.0.0.1:3000/FA/FA_WEB.git + remote: http://gitea:3000/FA/FA_WEB.git branch: master depth: 1 From bb4be4885d307b8c4ae3a953d3ca0e2d20a4710c Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 12:53:08 +0000 Subject: [PATCH 118/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index b101e19..74f569d 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -8,7 +8,7 @@ steps: clone-manual: image: woodpeckerci/plugin-git settings: - remote: http://gitea:3000/FA/FA_WEB.git + remote: http://127.0.0.1:3000/FA/FA_WEB.git branch: master depth: 1 From 41bd905bd2edec0063a10e4d945d1e79bcb96ffa Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 12:59:32 +0000 Subject: [PATCH 119/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 74f569d..b101e19 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -8,7 +8,7 @@ steps: clone-manual: image: woodpeckerci/plugin-git settings: - remote: http://127.0.0.1:3000/FA/FA_WEB.git + remote: http://gitea:3000/FA/FA_WEB.git branch: master depth: 1 From 606de33d41c1f8dafdec635741a30bdd8fe583ea Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 13:04:29 +0000 Subject: [PATCH 120/149] Update .woodpecker.yml --- .woodpecker.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index b101e19..5d8df6d 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -5,6 +5,17 @@ when: branch: [master] steps: + debug-workspace: + image: alpine:latest + commands: + - echo "=== Aktualny katalog roboczy (pwd) ===" + - pwd + - echo "=== Zawartość /woodpecker/src ===" + - ls -la /woodpecker/src + - echo "=== Pełna struktura src (do głębokości 4) ===" + - find /woodpecker/src -type d -maxdepth 4 | sort + - echo "=== Szukam katalogu z kodem (.git lub .csproj) ===" + - find /woodpecker -name ".git" -o -name "*.csproj" | head -20 clone-manual: image: woodpeckerci/plugin-git settings: From 55edcd2a2d572ff2e490d08afa7d45508947d563 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 13:05:39 +0000 Subject: [PATCH 121/149] Update .woodpecker.yml --- .woodpecker.yml | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 5d8df6d..c616d2c 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -5,17 +5,6 @@ when: branch: [master] steps: - debug-workspace: - image: alpine:latest - commands: - - echo "=== Aktualny katalog roboczy (pwd) ===" - - pwd - - echo "=== Zawartość /woodpecker/src ===" - - ls -la /woodpecker/src - - echo "=== Pełna struktura src (do głębokości 4) ===" - - find /woodpecker/src -type d -maxdepth 4 | sort - - echo "=== Szukam katalogu z kodem (.git lub .csproj) ===" - - find /woodpecker -name ".git" -o -name "*.csproj" | head -20 clone-manual: image: woodpeckerci/plugin-git settings: @@ -28,7 +17,7 @@ steps: commands: - | set -euf - CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + CODE_DIR="/woodpecker/src/localhost/git/FA/FA_WEB" cd "$CODE_DIR" echo "=== Restore wszystkich projektów ===" find . -name "*.csproj" -type f -exec dotnet restore "{}" \; @@ -38,7 +27,7 @@ steps: commands: - | set -euf - CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + CODE_DIR="/woodpecker/src/localhost/git/FA/FA_WEB" cd "$CODE_DIR" echo "=== Uruchamianie testów ===" dotnet test --no-restore --configuration Release --logger "trx" @@ -49,7 +38,7 @@ steps: commands: - | set -euf - CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + CODE_DIR="/woodpecker/src/localhost/git/FA/FA_WEB" cd "$CODE_DIR" echo "=== Diagnostyka projektów ===" find . -name "*.csproj" -type f | sort @@ -77,7 +66,7 @@ steps: commands: - | set -euf - CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + CODE_DIR="/woodpecker/src/localhost/git/FA/FA_WEB" cd "$CODE_DIR" echo "=== Test połączenia z BaGetter ===" From e96d6fc2f9a762af4843bc19b864acf80660c900 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 16:10:24 +0000 Subject: [PATCH 122/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index c616d2c..e119760 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -107,7 +107,7 @@ steps: commands: - | set -euf - CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + CODE_DIR="/woodpecker/src/localhost/srv51.mikr.us/git/FA/FA_WEB" cd "$CODE_DIR" echo "=== Ponowny restore aplikacji (z najnowszymi pakietami z BaGetter) ===" find . -name "*.csproj" -type f -exec dotnet restore "{}" \; From 22779715b986e331ca50ce8235dc1ef7579cf600 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 16:16:52 +0000 Subject: [PATCH 123/149] Update .woodpecker.yml --- .woodpecker.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index e119760..2892e85 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -38,8 +38,17 @@ steps: commands: - | set -euf + echo "=== Instalacja MinVer CLI ===" + dotnet tool install --tool-path /tmp/minver minver-cli CODE_DIR="/woodpecker/src/localhost/git/FA/FA_WEB" cd "$CODE_DIR" + + echo "=== Obliczona wersja przez MinVer ===" + MINVER_VERSION=$(/tmp/minver/minver -m 2 -t 2.0 -d alpha) # dopasuj opcje + echo "Wersja: $MINVER_VERSION" + + mkdir -p nupkg + echo "=== Diagnostyka projektów ===" find . -name "*.csproj" -type f | sort mkdir -p nupkg From df6b0d56b75e9ac25d9cac271a9bfafdbf1b665c Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 16:24:44 +0000 Subject: [PATCH 124/149] Update .woodpecker.yml --- .woodpecker.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 2892e85..dffac05 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -57,7 +57,12 @@ steps: if grep -q '' "$csproj"; then PROJECT_NAME=$(basename "$csproj" .csproj) echo "→ Pakuję $PROJECT_NAME ($csproj)" - dotnet pack "$csproj" --configuration Release -o "$CODE_DIR/nupkg" + #dotnet pack "$csproj" --configuration Release -o "$CODE_DIR/nupkg" /p:PackageVersion=$MINVER_VERSION + dotnet pack "$csproj" \ + --configuration Release \ + --no-restore \ + -o "./nupkg" \ + /p:PackageVersion=$MINVER_VERSION else PROJECT_NAME=$(basename "$csproj" .csproj) echo "→ Pomijam $PROJECT_NAME – brak (nie jest to biblioteka NuGet)" From 61ba728f353021cf76e0202e788f779f35fc84e1 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 16:25:23 +0000 Subject: [PATCH 125/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index dffac05..ae05d24 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -121,7 +121,7 @@ steps: commands: - | set -euf - CODE_DIR="/woodpecker/src/localhost/srv51.mikr.us/git/FA/FA_WEB" + CODE_DIR="/woodpecker/src/localhost/git/FA/FA_WEB" cd "$CODE_DIR" echo "=== Ponowny restore aplikacji (z najnowszymi pakietami z BaGetter) ===" find . -name "*.csproj" -type f -exec dotnet restore "{}" \; From 6fe66258921b062c4707717b75ca8800c37f0673 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 16:27:31 +0000 Subject: [PATCH 126/149] Update .woodpecker.yml --- .woodpecker.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index ae05d24..67b2fec 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -60,7 +60,6 @@ steps: #dotnet pack "$csproj" --configuration Release -o "$CODE_DIR/nupkg" /p:PackageVersion=$MINVER_VERSION dotnet pack "$csproj" \ --configuration Release \ - --no-restore \ -o "./nupkg" \ /p:PackageVersion=$MINVER_VERSION else From f1d2ec2083dcbec44bf156c0927ddacb5ecde6ec Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 20:23:50 +0000 Subject: [PATCH 127/149] Update .woodpecker.yml --- .woodpecker.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index 67b2fec..c60da31 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -49,6 +49,16 @@ steps: mkdir -p nupkg + echo "=== Pełniejsze fetch git (unshallow + tags) ===" + git fetch --prune --unshallow || echo "Już full clone – OK" + git fetch --tags + + # Diagnostyka – sprawdź czy tag jest widoczny + echo "=== Dostępne tagi ===" + git tag -l + echo "=== Aktualny commit i opis ===" + git describe --tags --always --dirty + echo "=== Diagnostyka projektów ===" find . -name "*.csproj" -type f | sort mkdir -p nupkg From bb44162bd646f20799816818e407ad532f6cf326 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 20:25:53 +0000 Subject: [PATCH 128/149] Update .woodpecker.yml --- .woodpecker.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index c60da31..35115b3 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -44,7 +44,12 @@ steps: cd "$CODE_DIR" echo "=== Obliczona wersja przez MinVer ===" - MINVER_VERSION=$(/tmp/minver/minver -m 2 -t 2.0 -d alpha) # dopasuj opcje + MINVER_VERSION=$(/tmp/minver/minver \ + --auto-increment patch \ + --minimum-major-minor 2.0 \ + --default-pre-release-identifiers alpha.0 \ + --verbosity normal) + echo "Wersja: $MINVER_VERSION" mkdir -p nupkg From 724fba41778468ebc70f63ed6d095e14ce92ac9b Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 8 Jan 2026 20:30:39 +0000 Subject: [PATCH 129/149] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 35115b3..3ba5af3 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -48,7 +48,7 @@ steps: --auto-increment patch \ --minimum-major-minor 2.0 \ --default-pre-release-identifiers alpha.0 \ - --verbosity normal) + --verbosity info) echo "Wersja: $MINVER_VERSION" From 0649c85e76f87e850cff35ff6cf3b8bba9dcd0a3 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 21:39:26 +0100 Subject: [PATCH 130/149] * Bring back change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); + CreateMap().ReverseMap(); } } } From c0fdf241eb7497ff9487d46c74dd9ae76cf858d1 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 21:56:42 +0100 Subject: [PATCH 131/149] * Test change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From 3a26eaa33553a7eca1ebc748cb4f8eab45803a6a Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 21:39:26 +0100 Subject: [PATCH 132/149] * Bring back change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); + CreateMap().ReverseMap(); } } } From e4f62fff86f2a836b6309bf6cb94da634193204d Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 22:08:06 +0100 Subject: [PATCH 133/149] * Test change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From a674a7300e9f9e8cbc5b5b0763fe4fb857c71750 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 22:15:37 +0100 Subject: [PATCH 134/149] * Bring back change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); + CreateMap().ReverseMap(); } } } From d33f68f0cd8fde8b2125f8a58b4353a2760b33e1 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 22:23:44 +0100 Subject: [PATCH 135/149] * Another test --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From b4a9d52fcd2e6a643011095dc64cc047bbae5d0e Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 22:26:57 +0100 Subject: [PATCH 136/149] * Another change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); + CreateMap().ReverseMap(); } } } From 00ba9700e95d1b8b33293c322a419bc179fcf014 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 22:29:05 +0100 Subject: [PATCH 137/149] * Another test --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From b29ff1f1a1b5b26f2483a62bd4db102d1d4aa614 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 22:32:10 +0100 Subject: [PATCH 138/149] * Change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); + CreateMap().ReverseMap(); } } } From c6468122fd4d84bb4cf902ce74e3ff8bad48ac19 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 22:33:10 +0100 Subject: [PATCH 139/149] * Change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From 2b3e36f9b92934b41965fb0be845e76d00bc7140 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 8 Jan 2026 22:41:19 +0100 Subject: [PATCH 140/149] * Test --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); + CreateMap().ReverseMap(); } } } From 794e30154bc5192b9801470d313dd8b88d47dedd Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 9 Jan 2026 12:04:04 +0100 Subject: [PATCH 141/149] * Test change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From 64390c543040e951ed9dbe0857601a41c3ec52f4 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 9 Jan 2026 12:12:22 +0100 Subject: [PATCH 142/149] * Test change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index da80dc5..630102f 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap(); + CreateMap().ReverseMap(); } } } From dfc5c52003dd6e4a2a8213b0be8e5abae876097c Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 9 Jan 2026 12:17:04 +0100 Subject: [PATCH 143/149] * Test change --- SytelineSaAppEfDataModel/MappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 630102f..da80dc5 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -33,7 +33,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap(); } } } From 30b3eb64500c5999335d74237cb93ef741aa9bbd Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 9 Jan 2026 12:50:12 +0100 Subject: [PATCH 144/149] Add Gitea Actions workflow for build & publish --- .gitea/workflows/build-and-publish.yml | 188 +++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 .gitea/workflows/build-and-publish.yml diff --git a/.gitea/workflows/build-and-publish.yml b/.gitea/workflows/build-and-publish.yml new file mode 100644 index 0000000..d97cba3 --- /dev/null +++ b/.gitea/workflows/build-and-publish.yml @@ -0,0 +1,188 @@ +name: Build, Test & Publish DataModels + Apps + +on: + push: + branches: + - master + create: # nowe tagi + tags: + - 'v*' + pull_request: + types: [opened, synchronize, reopened, closed] + workflow_dispatch: # ręczne uruchomienie + +jobs: + restore-and-test: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 # potrzebne do MinVer i git describe + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' # zmień na swoją wersję jeśli inna + + - name: Restore all projects + run: | + echo "=== Restore wszystkich projektów ===" + find . -name "*.csproj" -type f -exec dotnet restore "{}" \; + + - name: Run tests + run: | + echo "=== Uruchamianie testów ===" + dotnet test --no-restore --configuration Release --logger "trx" + + pack-datamodels: + runs-on: ubuntu-latest + needs: restore-and-test + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Install MinVer CLI + run: dotnet tool install --global minver-cli + + - name: Pack DataModel projects + env: + MINVER_AUTO_INCREMENT: patch + MINVER_MINIMUM_MAJOR_MINOR: 2.0 + MINVER_DEFAULT_PRE_RELEASE_IDENTIFIERS: alpha.0 + run: | + echo "=== Obliczona wersja przez MinVer ===" + MINVER_VERSION=$(minver --verbosity detailed) + echo "Wersja: $MINVER_VERSION" + + mkdir -p nupkg + + echo "=== Pełniejsze fetch git (tags) ===" + git fetch --prune --tags --force + + echo "=== Dostępne tagi ===" + git tag -l + + echo "=== Aktualny opis commitu ===" + git describe --tags --always --dirty || echo "Brak tagów" + + echo "=== Pakowanie projektów z PackageId ===" + find . -name "*.csproj" -type f | while read -r csproj; do + if grep -q '' "$csproj"; then + PROJECT_NAME=$(basename "$csproj" .csproj) + echo "→ Pakuję $PROJECT_NAME" + dotnet pack "$csproj" \ + --no-restore \ + --configuration Release \ + -o "./nupkg" \ + /p:PackageVersion="$MINVER_VERSION" + else + echo "→ Pomijam $(basename "$csproj" .csproj) – brak PackageId" + fi + done + + ls -la nupkg/ || echo "Brak wygenerowanych pakietów" + + - name: Upload NuGet packages as artifact + uses: actions/upload-artifact@v4 + with: + name: nuget-packages + path: nupkg/*.nupkg + retention-days: 3 + + publish-to-baget: + runs-on: ubuntu-latest + needs: pack-datamodels + steps: + - uses: actions/checkout@v4 # potrzebne tylko jeśli chcesz logować coś z repo + + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Download built packages + uses: actions/download-artifact@v4 + with: + name: nuget-packages + path: nupkg/ + + - name: Create custom NuGet.config (allow HTTP) + run: | + cat > NuGet.Config < + + + + + + + + EOF + + - name: Publish packages to BaGet + env: + BAGET_API_KEY: ${{ secrets.BAGET_API_KEY }} + run: | + echo "=== Publikacja do BaGet ===" + find nupkg -name "*.nupkg" -type f | while read -r pkg; do + echo "→ Push $(basename "$pkg")" + dotnet nuget push "$pkg" \ + --source "BaGet" \ + --api-key "$BAGET_API_KEY" \ + --skip-duplicate + done + + build-and-publish-apps: + runs-on: ubuntu-latest + needs: publish-to-baget + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Restore (with latest DataModels) + run: | + echo "=== Restore z najnowszymi pakietami z BaGet ===" + dotnet restore + + - name: Publish selected applications + run: | + echo "=== Publish aplikacji z DeployToCentral ===" + find . -name "*.csproj" -type f | while read -r csproj; do + PROJECT_NAME=$(basename "$csproj" .csproj) + PROJECT_DIR=$(dirname "$csproj") + + if [[ "$PROJECT_NAME" == *"Api"* ]] || [[ "$PROJECT_NAME" == *"Blazor"* ]] || \ + [[ "$PROJECT_DIR" == *"/Api/"* ]] || [[ "$PROJECT_DIR" == *"/Blazor/"* ]]; then + + DEPLOY_TO_CENTRAL=$(dotnet msbuild "$csproj" -getProperty:DeployToCentral -nologo 2>/dev/null || echo "false") + + if [ "$DEPLOY_TO_CENTRAL" != "true" ]; then + echo "Pomijam $PROJECT_NAME (DeployToCentral ≠ true)" + continue + fi + + echo "→ Publishing $PROJECT_NAME" + dotnet publish "$csproj" \ + --no-restore \ + --configuration Release \ + -o "./publish-$PROJECT_NAME" + + # Tutaj możesz dodać deployment (np. rsync, scp, docker build+push itp.) + # Przykład (zakomentowany): + # rsync -avz --delete ./publish-$PROJECT_NAME/ user@server:/path/to/app/ + else + echo "Pomijam $PROJECT_NAME (nie Api/Blazor)" + fi + done + + echo "Pipeline zakończony" From fffbd811ce4b7a78cbf610bae4abbcc93de6abd9 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 9 Jan 2026 12:01:48 +0000 Subject: [PATCH 145/149] Update .gitea/workflows/build-and-publish.yml --- .gitea/workflows/build-and-publish.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitea/workflows/build-and-publish.yml b/.gitea/workflows/build-and-publish.yml index d97cba3..0ebad99 100644 --- a/.gitea/workflows/build-and-publish.yml +++ b/.gitea/workflows/build-and-publish.yml @@ -19,6 +19,10 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 # potrzebne do MinVer i git describe + repository: FA/FA_WEB # ← nazwa repozytorium (organizacja/repo) + ref: ${{ github.ref }} # lub ${{ gitea.ref }} – w Gitea obie działają + # Najważniejsze – nadpisz domyślny URL + url: http://srv51.mikr.us:20120/git/FA/FA_WEB.git - name: Setup .NET uses: actions/setup-dotnet@v4 From 55f2c1b8628a536b9047ff34282f838d27243332 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 9 Jan 2026 22:30:41 +0100 Subject: [PATCH 146/149] test webhook From 2da07b6da96d5a8e8bfffc86e6048f3941c1e4d6 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 9 Jan 2026 22:37:45 +0100 Subject: [PATCH 147/149] test webhook From cf0428dd53999b4fcf5e785284159ad15436c3a4 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 9 Jan 2026 22:44:47 +0100 Subject: [PATCH 148/149] test webhook From c50560566ca9b9f4eece909e19a98af1f42b2671 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 9 Jan 2026 22:49:35 +0100 Subject: [PATCH 149/149] test webhook