From e2ca971cf42944e8628838c0e9b8269646cafb8b Mon Sep 17 00:00:00 2001 From: Loretta Date: Wed, 26 Jun 2024 18:17:46 +0200 Subject: [PATCH] implement TransferDestinationToProduct crud signalRTest; --- TIAM.Database.Test/TestHelper.cs | 14 +++ TIAM.Database/DataLayers/Admins/AdminDal.cs | 6 +- .../Transfers/TransferDbSetExtensions.cs | 11 +- TIAM.Services/SignalRTags.cs | 7 +- .../Pages/User/SysAdmins/ManageProducts.razor | 2 +- .../User/SysAdmins/ProductGridComponent.razor | 6 +- ...tinationToProductDetailGridComponent.razor | 100 ++++-------------- .../Shared/Components/Grids/ProductGrid.cs | 2 +- .../Controllers/TransferDataAPIController.cs | 93 ++++++++++++++++ .../SignalRClientTest.cs | 52 +++++---- 10 files changed, 181 insertions(+), 112 deletions(-) diff --git a/TIAM.Database.Test/TestHelper.cs b/TIAM.Database.Test/TestHelper.cs index b5f82bd1..dc47c2cb 100644 --- a/TIAM.Database.Test/TestHelper.cs +++ b/TIAM.Database.Test/TestHelper.cs @@ -5,6 +5,20 @@ namespace TIAM.Database.Test; public static class TestHelper { + public static TransferDestinationToProduct CreateTransferDestinationToProduct(Guid transferDestinationToProductId, Guid transferDestId, Guid productId) + { + var transferDestinationToProduct = new TransferDestinationToProduct(); + transferDestinationToProduct.Id = transferDestinationToProductId; + transferDestinationToProduct.ProductId = productId; + transferDestinationToProduct.TransferDestinationId = transferDestId; + transferDestinationToProduct.Price = 5000; + transferDestinationToProduct.Price2 = 6000; + transferDestinationToProduct.Price3 = 8000; + transferDestinationToProduct.ProductCommis = 0.1d; + + return transferDestinationToProduct; + } + public static TransferDestination CreateTransferDestination(Guid transferDestId, Guid addressId) { var name = "Liszt Ferenc repülÅ‘tér"; diff --git a/TIAM.Database/DataLayers/Admins/AdminDal.cs b/TIAM.Database/DataLayers/Admins/AdminDal.cs index 6fd06ba4..d2a517b2 100644 --- a/TIAM.Database/DataLayers/Admins/AdminDal.cs +++ b/TIAM.Database/DataLayers/Admins/AdminDal.cs @@ -70,7 +70,7 @@ namespace TIAM.Database.DataLayers.Admins #endregion Transfer #region TransferDestination - public List? GetTransferDestinations() => Session(ctx=>ctx.GetTransferDestinations().ToList()); + public List GetTransferDestinations() => Session(ctx=>ctx.GetTransferDestinations().ToList()); public TransferDestination? GetTransferDestinationById(Guid transferDestinationId) => Session(ctx=>ctx.GetTransferDestinationById(transferDestinationId)); public Task GetTransferDestinationByIdAsync(Guid transferDestinationId) => SessionAsync(ctx=>ctx.GetTransferDestinationById(transferDestinationId)); public string? GetTransferDestinationJsonById(Guid transferDestinationId) => Session(ctx => ctx.GetTransferDestinationById(transferDestinationId)?.ToJson()); @@ -92,9 +92,13 @@ namespace TIAM.Database.DataLayers.Admins #region TransferDestinationToProduct public TransferDestinationToProduct? GetTransferDestinationToProductById(Guid transferDestinationToProductId) => Session(ctx=>ctx.GetTransferDestinationToProductById(transferDestinationToProductId)); + public Task GetTransferDestinationToProductByIdAsync(Guid transferDestinationToProductId) => SessionAsync(ctx=>ctx.GetTransferDestinationToProductById(transferDestinationToProductId)); public string? GetTransferDestinationToProductJsonById(Guid transferDestinationToProductId) => Session(ctx => ctx.GetTransferDestinationToProductById(transferDestinationToProductId)?.ToJson()); public TransferDestinationToProduct? GetTransferDestinationToProduct(Guid productId, Guid transferDestinationId) => Session(ctx=>ctx.GetTransferDestinationToProduct(productId, transferDestinationId)); + public Task> GetTransferDestinationToProducts() => SessionAsync(ctx=>ctx.GetTransferDestinationToProducts().ToList()); + public Task> GetTransferDestinationToProductsByProductId(Guid productId) => SessionAsync(ctx=>ctx.GetTransferDestinationToProductsByProductId(productId).ToList()); + public Task> GetTransferDestinationToProductsByTransferDestinationId(Guid transferDestinationId) => SessionAsync(ctx=>ctx.GetTransferDestinationToProductsByTransferDestinationId(transferDestinationId).ToList()); public string? GetTransferDestinationToProductJson(Guid productId, Guid transferDestinationId) => Session(ctx => ctx.GetTransferDestinationToProduct(productId, transferDestinationId)?.ToJson()); public Task AddTransferDestinationToProductAsync(TransferDestinationToProduct transferDestinationToProduct) => TransactionAsync(ctx => ctx.AddTransferDestinationToProduct(transferDestinationToProduct)); diff --git a/TIAM.Database/DbSets/Transfers/TransferDbSetExtensions.cs b/TIAM.Database/DbSets/Transfers/TransferDbSetExtensions.cs index 408ce2fc..0d396706 100644 --- a/TIAM.Database/DbSets/Transfers/TransferDbSetExtensions.cs +++ b/TIAM.Database/DbSets/Transfers/TransferDbSetExtensions.cs @@ -63,7 +63,16 @@ public static class TransferDbSetExtensions => ctx.TransferDestinationToProducts.FirstOrDefault(x => x.Id == transferDestinationToProductId); public static TransferDestinationToProduct? GetTransferDestinationToProduct(this ITransferDestinationToProductDbSet ctx, Guid productId, Guid transferDestinationId) - => ctx.TransferDestinationToProducts.FirstOrDefault(x => x.ProductId == productId && x.TransferDestinationId == transferDestinationId); + => ctx.TransferDestinationToProducts.FirstOrDefault(x => x.ProductId == productId && x.TransferDestinationId == transferDestinationId); + + public static IQueryable GetTransferDestinationToProducts(this ITransferDestinationToProductDbSet ctx) + => ctx.TransferDestinationToProducts; + + public static IQueryable GetTransferDestinationToProductsByProductId(this ITransferDestinationToProductDbSet ctx, Guid productId) + => ctx.TransferDestinationToProducts.Where(x => x.ProductId == productId); + + public static IQueryable GetTransferDestinationToProductsByTransferDestinationId(this ITransferDestinationToProductDbSet ctx, Guid transferDestinationId) + => ctx.TransferDestinationToProducts.Where(x => x.TransferDestinationId == transferDestinationId); public static bool AddTransferDestinationToProduct(this ITransferDestinationToProductDbSet ctx, TransferDestinationToProduct transferDestinationToProduct) => ctx.TransferDestinationToProducts.Add(transferDestinationToProduct).State == EntityState.Added; diff --git a/TIAM.Services/SignalRTags.cs b/TIAM.Services/SignalRTags.cs index 6bea0067..ce41ce85 100644 --- a/TIAM.Services/SignalRTags.cs +++ b/TIAM.Services/SignalRTags.cs @@ -86,8 +86,9 @@ public class SignalRTags : AcSignalRTags public const int CreateTransferDestinationToProduct = 90; public const int UpdateTransferDestinationToProduct = 91; public const int RemoveTransferDestinationToProduct = 92; //set permissions to 0 - public const int GetAllTransferDestinationToProducts = 93; - public const int GetTransferDestinationToProductByProductId = 94; - public const int GetTransferDestinationToProductByTransferDestinationId = 95; + public const int GetTransferDestinationToProductById = 93; + public const int GetAllTransferDestinationToProducts = 94; + public const int GetTransferDestinationToProductsByProductId = 95; + public const int GetTransferDestinationToProductsByTransferDestinationId = 96; } diff --git a/TIAMSharedUI/Pages/User/SysAdmins/ManageProducts.razor b/TIAMSharedUI/Pages/User/SysAdmins/ManageProducts.razor index 2d8d9c5d..1b13e0c7 100644 --- a/TIAMSharedUI/Pages/User/SysAdmins/ManageProducts.razor +++ b/TIAMSharedUI/Pages/User/SysAdmins/ManageProducts.razor @@ -31,7 +31,7 @@ IconCssClass="btn-column-chooser" Click="ColumnChooserButton_Click" /> - + diff --git a/TIAMSharedUI/Pages/User/SysAdmins/ProductGridComponent.razor b/TIAMSharedUI/Pages/User/SysAdmins/ProductGridComponent.razor index 7b0f929d..4ef79978 100644 --- a/TIAMSharedUI/Pages/User/SysAdmins/ProductGridComponent.razor +++ b/TIAMSharedUI/Pages/User/SysAdmins/ProductGridComponent.razor @@ -23,8 +23,6 @@ - + @@ -89,9 +87,7 @@ @code { [Parameter] public bool KeyboardNavigationEnabled { get; set; } - [Parameter] public IProductsRelation? ParentData { get; set; } = null!; [Parameter] public EventCallback OnGridEditModelSaving { get; set; } - [Parameter] public int GetAllTag { get; set; } = SignalRTags.GetProductsByContextId; [Parameter] public GridDetailExpandButtonDisplayMode DetailExpandButtonDisplayMode { get; set; } = GridDetailExpandButtonDisplayMode.Never; private ProductGrid _productGrid = null!; diff --git a/TIAMSharedUI/Pages/User/SysAdmins/TransferDestinationToProductDetailGridComponent.razor b/TIAMSharedUI/Pages/User/SysAdmins/TransferDestinationToProductDetailGridComponent.razor index a618c137..ffc18cbc 100644 --- a/TIAMSharedUI/Pages/User/SysAdmins/TransferDestinationToProductDetailGridComponent.razor +++ b/TIAMSharedUI/Pages/User/SysAdmins/TransferDestinationToProductDetailGridComponent.razor @@ -10,26 +10,27 @@ @using AyCode.Services.Loggers @using TIAM.Core.Loggers @using AyCode.Core +@using TIAM.Services @using TIAMSharedUI.Shared.Components.Grids @inject IServiceProviderDataService ServiceProviderDataService @inject IEnumerable LogWriters @inject AdminSignalRClient AdminSignalRClient; + Logger="_logger" + SignalRClient="AdminSignalRClient" + ContextIds="ContextIds" + GetAllMessageTag="GetAllTag" + PageSize="10" + KeyboardNavigationEnabled="KeyboardNavigationEnabled" + KeyFieldName="Id" + ValidationEnabled="false" + EditMode="GridEditMode.EditForm" + ColumnResizeMode="GridColumnResizeMode.NextColumn"> + - + @@ -48,23 +49,23 @@ - + @{ - var serviceProvider = (Company)EditFormContext.EditModel; + var serviceProvider = (Company)editFormContext.EditModel; } - @EditFormContext.GetEditor("Price") + @editFormContext.GetEditor("Price") - @EditFormContext.GetEditor("Price2") + @editFormContext.GetEditor("Price2") - @EditFormContext.GetEditor("Price3") + @editFormContext.GetEditor("Price3") - @EditFormContext.GetEditor("ProductCommis") + @editFormContext.GetEditor("ProductCommis") @@ -77,70 +78,15 @@ @code { [Parameter] public bool KeyboardNavigationEnabled { get; set; } [Parameter] public GridDetailExpandButtonDisplayMode DetailExpandButtonDisplayMode { get; set; } = GridDetailExpandButtonDisplayMode.Never; - [Parameter] public Guid? ContextId { get; set; } - [Parameter] public Guid[]? ContextIds { get; set; } = new Guid[0]; - [Parameter] public int GetAllTag { get; set; } + [Parameter] public Guid[]? ContextIds { get; set; } = null!; + [Parameter] public int GetAllTag { get; set; } = SignalRTags.GetAllTransferDestinationToProducts; private LoggerClient _logger = null!; - protected override async Task OnInitializedAsync() + protected override void OnInitialized() { _logger = new LoggerClient(LogWriters.ToArray()); - // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract - //_detailGridData = UserModelDtoDetail.ServiceProviders ?? []; - //_availableServices = await ServiceProviderDataService.GetServiceProvidersAsync(); - - //_logger.Info($"DetailGridData: {_detailGridData.Count}"); + base.OnInitialized(); } - - protected override void OnParametersSet() - { - if(ContextId.HasValue) - { - ContextIds = new Guid[1]; - ContextIds[0] = (Guid)ContextId!; - - } - base.OnParametersSet(); - } - - // void CustomizeEditModel(GridCustomizeEditModelEventArgs e) - // { - // if (!e.IsNew) return; - - // var newProductMapping = new UserProductMapping - // { - // ProductId = Guid.NewGuid(), - // UserId = UserModelDtoDetail.Id, - // Permissions = 1 - // }; - - // e.EditModel = newProductMapping; - // } - - // async Task EditModelSaving(GridEditModelSavingEventArgs e) - // { - // if (e.IsNew) - // //add new orderData to orderData array - // _logger.Info("New orderData added"); - // else - // _logger.Info("orderData updated"); - - // await UpdateDataAsync(); - // } - - // async Task DataItemDeleting(GridDataItemDeletingEventArgs e) - // { - // //remove orderData from orderData array - // _logger.Info("orderData deleted"); - // //await UpdateDataAsync(); - // } - - // async Task UpdateDataAsync() - // { - // //refresh grid - // _logger.Info("orderData grid refreshed"); - // } - } \ No newline at end of file diff --git a/TIAMSharedUI/Shared/Components/Grids/ProductGrid.cs b/TIAMSharedUI/Shared/Components/Grids/ProductGrid.cs index 9bdb43b4..9c132cbc 100644 --- a/TIAMSharedUI/Shared/Components/Grids/ProductGrid.cs +++ b/TIAMSharedUI/Shared/Components/Grids/ProductGrid.cs @@ -8,7 +8,7 @@ public class ProductGrid : TiamGrid { public ProductGrid() : base() { - GetAllMessageTag = SignalRTags.GetProductsByContextId; + GetAllMessageTag = SignalRTags.GetAllProducts; AddMessageTag = SignalRTags.AddProduct; UpdateMessageTag = SignalRTags.UpdateProduct; RemoveMessageTag = SignalRTags.RemoveProduct; diff --git a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs index 88363119..c185b406 100644 --- a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs +++ b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs @@ -258,6 +258,99 @@ namespace TIAMWebApp.Server.Controllers //} + //[AllowAnonymous] + //[HttpGet] + //[Route(APIUrls.GetTransferDestinationsRouteName)] + [SignalR(SignalRTags.GetAllTransferDestinationToProducts)] + public async Task> GetAllTransferDestinationToProducts() + { + return await _adminDal.GetTransferDestinationToProducts(); + } + + //[AllowAnonymous] + //[HttpGet] + //[Route(APIUrls.GetTransferDestinationsRouteName)] + [SignalR(SignalRTags.GetTransferDestinationToProductsByProductId)] + public async Task> GetTransferDestinationToProductsByProductId(Guid productId) + { + return await _adminDal.GetTransferDestinationToProductsByProductId(productId); + } + + //[AllowAnonymous] + //[HttpGet] + //[Route(APIUrls.GetTransferDestinationsRouteName)] + [SignalR(SignalRTags.GetTransferDestinationToProductsByTransferDestinationId)] + public async Task> GetTransferDestinationToProductsByTransferDestinationId(Guid transferDestinationId) + { + return await _adminDal.GetTransferDestinationToProductsByTransferDestinationId(transferDestinationId); + } + + //[Authorize] + //[HttpGet] + //[Route(APIUrls.GetTransferDriversByTransferIdRouteName)] + [SignalR(SignalRTags.GetTransferDestinationToProductById)] + public async Task GetTransferDestinationToProductById(Guid transferDestinationToProductId) + { + var transferDestination = await _adminDal.GetTransferDestinationToProductByIdAsync(transferDestinationToProductId); + return transferDestination; + } + + [AllowAnonymous] + [HttpPost] + [Route(APIUrls.CreateTransferDestinationRouteName)] + [SignalR(SignalRTags.CreateTransferDestinationToProduct)] + public async Task CreateTransferDestinationToProduct([FromBody] TransferDestinationToProduct transferDestinationToProduct) + { + _logger.Info(@"CreateTransferDestination called!"); + + var isSuccess = false; + + if (transferDestinationToProduct.ProductId.IsNullOrEmpty() || transferDestinationToProduct.TransferDestinationId.IsNullOrEmpty()) + { + var logText = $"transferDestinationToProduct.ProductId.IsNullOrEmpty() || transferDestinationToProduct.TransferDestinationId.IsNullOrEmpty(); ProductId: {transferDestinationToProduct.ProductId}; TransferDestinationId: {transferDestinationToProduct.TransferDestinationId}"; + + _logger.Error(logText); + } + else + { + if (transferDestinationToProduct.Id.IsNullOrEmpty()) transferDestinationToProduct.Id = Guid.NewGuid(); + isSuccess = await _adminDal.AddTransferDestinationToProductAsync(transferDestinationToProduct); + } + + return isSuccess ? transferDestinationToProduct : null; + } + + //[AllowAnonymous] + //[HttpPost] + //[Route(APIUrls.UpdateTransferDestinationRouteName)] + [SignalR(SignalRTags.UpdateTransferDestinationToProduct)] + public async Task UpdateTransferDestinationToProduct([FromBody] TransferDestinationToProduct transferDestinationToProduct) + { + _logger.Info(@"UpdateTransferDestination called!"); + + var isSuccess = false; + if (transferDestinationToProduct.Id.IsNullOrEmpty() || transferDestinationToProduct.ProductId.IsNullOrEmpty() || transferDestinationToProduct.TransferDestinationId.IsNullOrEmpty()) + { + var logText = $"transferDestinationToProduct.Id.IsNullOrEmpty() || transferDestinationToProduct.ProductId.IsNullOrEmpty() || transferDestinationToProduct.TransferDestinationId.IsNullOrEmpty(); Id: {transferDestinationToProduct.Id}; ProductId: {transferDestinationToProduct.ProductId}; TransferDestinationId: {transferDestinationToProduct.TransferDestinationId}"; + + _logger.Error(logText); + } + else isSuccess = await _adminDal.UpdateTransferDestinationToProductAsync(transferDestinationToProduct); + + return isSuccess ? transferDestinationToProduct : null; + + } + + //[Authorize] + //[HttpGet] + //[Route(APIUrls.GetTransferDriversByTransferIdRouteName)] + [SignalR(SignalRTags.RemoveTransferDestinationToProduct)] + public async Task RemoveTransferDestinationToProduct([FromBody] TransferDestinationToProduct transferDestinationToProduct) + { + var result = await _adminDal.RemoveTransferDestinationToProductAsync(transferDestinationToProduct); + return result ? transferDestinationToProduct : null; + } + [AllowAnonymous] [HttpPost] [Route(APIUrls.CreateTransferRouteName)] diff --git a/Tiam.Services.Client.Tests/SignalRClientTest.cs b/Tiam.Services.Client.Tests/SignalRClientTest.cs index be68a922..803a1890 100644 --- a/Tiam.Services.Client.Tests/SignalRClientTest.cs +++ b/Tiam.Services.Client.Tests/SignalRClientTest.cs @@ -141,42 +141,48 @@ namespace Tiam.Services.Client.Tests } [DataTestMethod] - [DataRow(["cfb27fc2-54c2-4f07-8471-587d6b79b019", "7385c4e3-3c1e-4c5e-9926-8c0ea60dcb38"])] - public async Task TransferDestinationToProductCrudTest(string[] transferDestIdAddressIdStrings) + [DataRow(["e7528722-355a-4f8b-8571-7d7abf7ee109", "273EFE3C-D19F-4C2A-BF19-7397DC835C60", "05C147F8-8A87-47DD-BE1D-64EDA7A6A612"])] + public async Task TransferDestinationToProductCrudTest(string[] transferDestinationToProductIdTransferDestIdProductIdStrings) { - var transferDestId = Guid.Parse(transferDestIdAddressIdStrings[0]); - var addressId = Guid.Parse(transferDestIdAddressIdStrings[1]); + var transferDestinationToProductId = Guid.Parse(transferDestinationToProductIdTransferDestIdProductIdStrings[0]); + var transferDestId = Guid.Parse(transferDestinationToProductIdTransferDestIdProductIdStrings[1]); + var productId = Guid.Parse(transferDestinationToProductIdTransferDestIdProductIdStrings[2]); - var transferDest = TestHelper.CreateTransferDestination(transferDestId, addressId); + var transferDestinationToProduct = TestHelper.CreateTransferDestinationToProduct(transferDestinationToProductId, transferDestId, productId); - await _signalRClient.PostDataAsync(SignalRTags.RemoveTransferDestinationToProduct, transferDest); + await _signalRClient.PostDataAsync(SignalRTags.RemoveTransferDestinationToProduct, transferDestinationToProduct); - transferDest = await _signalRClient.PostDataAsync(SignalRTags.CreateTransferDestination, transferDest); - Assert.IsNotNull(transferDest); + transferDestinationToProduct = await _signalRClient.PostDataAsync(SignalRTags.CreateTransferDestinationToProduct, transferDestinationToProduct); + Assert.IsNotNull(transferDestinationToProduct); - transferDest = await _signalRClient.GetByIdAsync(SignalRTags.GetTransferDestinationById, transferDestId); + transferDestinationToProduct = await _signalRClient.GetByIdAsync(SignalRTags.GetTransferDestinationToProductById, transferDestinationToProductId); - Assert.IsNotNull(transferDest); - Assert.IsNotNull(transferDest.Address); + Assert.IsNotNull(transferDestinationToProduct); + Assert.IsNotNull(transferDestinationToProduct.TransferDestination); - var modifiedAddress = "modified; " + transferDest.Address.AddressText; + transferDestinationToProduct.Price = 20000; + transferDestinationToProduct = await _signalRClient.PostDataAsync(SignalRTags.UpdateTransferDestinationToProduct, transferDestinationToProduct); - transferDest.Price = 20000; - transferDest.Address.AddressText = modifiedAddress; + Assert.IsNotNull(transferDestinationToProduct); + Assert.IsNotNull(transferDestinationToProduct.TransferDestination); - transferDest = await _signalRClient.PostDataAsync(SignalRTags.UpdateTransferDestination, transferDest); + Assert.IsTrue((int)transferDestinationToProduct.Price == 20000); + Assert.IsTrue(transferDestinationToProduct.Id == transferDestinationToProductId, "transferDestinationToProduct.Id != transferDestinationToProductId"); - Assert.IsNotNull(transferDest); - Assert.IsNotNull(transferDest.Address); + var transferDestinationToProducts = await _signalRClient.GetByIdAsync>(SignalRTags.GetTransferDestinationToProductsByTransferDestinationId, transferDestId); + Assert.IsNotNull(transferDestinationToProducts); + Assert.IsTrue(transferDestinationToProducts.Count > 0); + Assert.IsTrue(transferDestinationToProducts.All(x=>x.TransferDestinationId == transferDestId)); - Assert.IsTrue((int)transferDest.Price == 20000); - Assert.IsTrue(transferDest.Address.AddressText == modifiedAddress); - Assert.IsTrue(transferDest.Id == transferDestId, "transferDest.Id != transferDestId"); + transferDestinationToProducts = await _signalRClient.GetByIdAsync>(SignalRTags.GetTransferDestinationToProductsByProductId, productId); + Assert.IsNotNull(transferDestinationToProducts); + Assert.IsTrue(transferDestinationToProducts.Count > 0); + Assert.IsTrue(transferDestinationToProducts.All(x=>x.ProductId == productId)); - await _signalRClient.PostDataAsync(SignalRTags.RemoveTransferDestination, transferDest); //mielõbb kitöröljük, h ne maradjon szemét a db-ben - J. + await _signalRClient.PostDataAsync(SignalRTags.RemoveTransferDestinationToProduct, transferDestinationToProduct); //mielõbb kitöröljük, h ne maradjon szemét a db-ben - J. - transferDest = await _signalRClient.GetByIdAsync(SignalRTags.GetTransferDestinationById, transferDestId); - Assert.IsNull(transferDest); //a korábbi törlés miatt NULL kell legyen - J. + transferDestinationToProduct = await _signalRClient.GetByIdAsync(SignalRTags.GetTransferDestinationToProductById, transferDestinationToProductId); + Assert.IsNull(transferDestinationToProduct); //a korábbi törlés miatt NULL kell legyen - J. } } } \ No newline at end of file