Compare commits

...

6 Commits

Author SHA1 Message Date
Loretta 328f906a30 Add FileSubPath to Files; improve PDF rendering logic
Added FileSubPath property to Files entity and IFiles interface for sub-path storage. Updated IFiles to include FileHash and IsCompressed. Refactored GridShippingDocumentInfoPanel.razor to select and render PDFs only when associated files exist, with improved type checks and null handling. Performed minor code cleanup.
2026-01-24 10:19:36 +01:00
Loretta d918ffaae4 Merge branch 'main' of https://git.aycode.com/Adam/FruitBankHybridApp 2026-01-20 14:50:17 +01:00
Loretta 650a6f3773 Update PalletItemComponent to use 'Editable' parameter
Replaced 'IsEditable' with 'Editable' in PalletItemComponent usage within StockTakingTemplate.razor and MeasuringOut.razor to align with updated component API. Editability logic remains unchanged.
2026-01-12 07:20:50 +01:00
Loretta 0368f0809a Add stock taking close functionality and UI improvements
- Added CloseStockTaking method to IStockSignalREndpointCommon and implemented it in FruitBankSignalRClient.
- Renamed IsEditable to Editable in PalletItemComponent.razor and updated all usages.
- Updated StockTakingTemplate.razor: "Módosít" button is now always disabled, "Lezárás" button is enabled only when appropriate, and form layouts are disabled when stock taking is closed.
- Improved async UI updates by using InvokeAsync(StateHasChanged).
- Enhanced order note display and added warning state for invalid average weight in MeasuringOut.razor.
2026-01-09 11:10:15 +01:00
Loretta bba26c42da Merge branch 'main' of https://git.aycode.com/Adam/FruitBankHybridApp 2026-01-06 15:13:47 +01:00
Loretta eaa104659d Set default ShippingDate, refactor data reload logic
Set default ShippingDate to DateTime.Now in Shipping and ShippingDocument entities. Refactored data reload logic in GridDetailOrderDto.razor to use semaphore only for master grid and moved grid reload accordingly. Updated GridProductDtoTemplate.razor to load order data on tab change instead of detail row expansion.
2026-01-06 10:41:27 +01:00
10 changed files with 74 additions and 48 deletions

View File

@ -9,6 +9,7 @@ namespace FruitBank.Common.Entities;
public class Files : MgEntityBase, IFiles public class Files : MgEntityBase, IFiles
{ {
public string FileName { get; set; } public string FileName { get; set; }
public string FileSubPath { get; set; }
public string FileExtension { get; set; } public string FileExtension { get; set; }
public string RawText { get; set; } public string RawText { get; set; }
public string FileHash { get; set; } public string FileHash { get; set; }

View File

@ -6,6 +6,9 @@ namespace FruitBank.Common.Interfaces;
public interface IFiles: IEntityInt, ITimeStampInfo public interface IFiles: IEntityInt, ITimeStampInfo
{ {
public string FileName { get; set; } public string FileName { get; set; }
public string FileSubPath { get; set; }
public string FileExtension { get; set; } public string FileExtension { get; set; }
public string RawText { get; set; } public string RawText { get; set; }
public string FileHash { get; set; }
public bool IsCompressed { get; set; }
} }

View File

@ -19,6 +19,7 @@ public interface IStockSignalREndpointCommon
public Task<List<StockTakingItemPallet>?> GetStockTakingItemPallets(); public Task<List<StockTakingItemPallet>?> GetStockTakingItemPallets();
public Task<List<StockTakingItemPallet>?> GetStockTakingItemPalletsByProductId(int productId); public Task<List<StockTakingItemPallet>?> GetStockTakingItemPalletsByProductId(int productId);
public Task<StockTaking?> CloseStockTaking(int stockTakingId);
public Task<StockTakingItemPallet?> AddStockTakingItemPallet(StockTakingItemPallet stockTakingItemPallet); public Task<StockTakingItemPallet?> AddStockTakingItemPallet(StockTakingItemPallet stockTakingItemPallet);
public Task<StockTakingItemPallet?> UpdateStockTakingItemPallet(StockTakingItemPallet stockTakingItemPallet); public Task<StockTakingItemPallet?> UpdateStockTakingItemPallet(StockTakingItemPallet stockTakingItemPallet);
} }

View File

@ -107,19 +107,22 @@
private async Task ReloadDataFromDb(bool forceReload = false) private async Task ReloadDataFromDb(bool forceReload = false)
{ {
LoadingPanelVisibility.Visible = true; LoadingPanelVisibility.Visible = true;
using (await ObjectLock.GetSemaphore<OrderDto>().UseWaitAsync())
if (IsMasterGrid)
{ {
if (OrderDtos == null) OrderDtos = await FruitBankSignalRClient.GetAllOrderDtos() ?? []; using (await ObjectLock.GetSemaphore<OrderDto>().UseWaitAsync())
else if (OrderDtos.Count == 0 || forceReload)
{ {
OrderDtos.Clear(); if (OrderDtos == null) OrderDtos = await FruitBankSignalRClient.GetAllOrderDtos() ?? [];
OrderDtos.AddRange(await FruitBankSignalRClient.GetAllOrderDtos() ?? []); else if (OrderDtos.Count == 0 || forceReload)
{
OrderDtos.Clear();
OrderDtos.AddRange(await FruitBankSignalRClient.GetAllOrderDtos() ?? []);
}
} }
//if (forceReload)
Grid?.Reload();
} }
//if (forceReload)
Grid?.Reload();
LoadingPanelVisibility.Visible = false; LoadingPanelVisibility.Visible = false;
} }

View File

@ -179,11 +179,11 @@
var productDto = (ProductDto)e.DataItem; var productDto = (ProductDto)e.DataItem;
if (e.Grid.IsDetailRowExpanded(e.VisibleIndex)) // if (e.Grid.IsDetailRowExpanded(e.VisibleIndex))
{ // {
_currentOrderDtos = null; // _currentOrderDtos = null;
_currentOrderDtos = productDto != null ? await GetOrderDtosFromDbAsync(productDto.Id) : []; // _currentOrderDtos = productDto != null ? await GetOrderDtosFromDbAsync(productDto.Id) : [];
} // }
} }
protected async Task OnActiveTabChanged(int activeTabIndex, int productId) protected async Task OnActiveTabChanged(int activeTabIndex, int productId)
@ -192,11 +192,11 @@
switch (_activeTabIndex) switch (_activeTabIndex)
{ {
case 0: case 1:
//_currentOrderDtos = null; _currentOrderDtos = null;
_currentOrderDtos = await GetOrderDtosFromDbAsync(productId); _currentOrderDtos = await GetOrderDtosFromDbAsync(productId);
break; break;
case 1: case 2:
_currentOrderItemDtos = null; _currentOrderItemDtos = null;
_currentOrderItemDtos = await GetOrderItemDtosFromDbAsync(productId); _currentOrderItemDtos = await GetOrderItemDtosFromDbAsync(productId);
break; break;

View File

@ -94,7 +94,7 @@
{ {
private readonly string[] _pdfFiles = private readonly string[] _pdfFiles =
[ [
"1_Albaran_AH25007715.pdf", "1_Albaran_AH25007715.pdf",
"2_BANK FRA.pdf", "2_BANK FRA.pdf",
"3_BP-30M35_20251113_163816.pdf" "3_BP-30M35_20251113_163816.pdf"
]; ];
@ -110,16 +110,26 @@
private async Task OnDataItemChangedAsync(object? dataItem) private async Task OnDataItemChangedAsync(object? dataItem)
{ {
@if (dataItem is not ShippingDocument && dataItem is not ShippingItem) return; if (dataItem is not ShippingDocument && dataItem is not ShippingItem) return;
// Store the PDF to render ShippingDocument? shippingDocument = null;
_randomPdf = _pdfFiles[Random.Shared.Next(_pdfFiles.Length)];
_currentPdfToRender = $"_content/FruitBankHybrid.Shared/uploads/{_randomPdf}";
// If MgLazyLoadContent is already visible, render the PDF immediately if (dataItem is ShippingItem shippingItem) shippingDocument = shippingItem.ShippingDocument;
if (_lazyContentRef is { IsVisible: true }) else shippingDocument = dataItem as ShippingDocument;
if (shippingDocument == null) return;
if (shippingDocument.ShippingDocumentToFiles?.Count > 0)
{ {
await _lazyContentRef.TriggerContentVisibleAsync(); // Store the PDF to render
_randomPdf = _pdfFiles[Random.Shared.Next(_pdfFiles.Length)];
_currentPdfToRender = $"_content/FruitBankHybrid.Shared/uploads/{_randomPdf}";
// If MgLazyLoadContent is already visible, render the PDF immediately
if (_lazyContentRef is { IsVisible: true })
{
await _lazyContentRef.TriggerContentVisibleAsync();
}
} }
} }

View File

@ -12,7 +12,7 @@
@typeparam TPalletItem where TPalletItem : class, IMeasuringItemPalletBase @typeparam TPalletItem where TPalletItem : class, IMeasuringItemPalletBase
<DxFormLayout Context="ctxFromLayoutPallet" Data="@PalletItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100 measuring-form-layout" <DxFormLayout Context="ctxFromLayoutPallet" Data="@PalletItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100 measuring-form-layout"
ItemUpdating="@((pair) => OnItemUpdating(pair.Key, pair.Value, PalletItem))" Enabled="IsEditable"> ItemUpdating="@((pair) => OnItemUpdating(pair.Key, pair.Value, PalletItem))" Enabled="Editable">
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1" BeginRow="true"> <DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1" BeginRow="true">
<b>@(MeasuringIndex). MÉRÉS</b> <b>@(MeasuringIndex). MÉRÉS</b>
@ -21,24 +21,24 @@
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.PalletWeight)))" <DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.PalletWeight)))"
Field="@nameof(ShippingItemPallet.PalletWeight)" Field="@nameof(ShippingItemPallet.PalletWeight)"
Enabled="@(IsEditable && IsMeasurable && ProductId > 0)" Visible="@(IsMeasurable)" Enabled="@(Editable && IsMeasurable && ProductId > 0)" Visible="@(IsMeasurable)"
Caption="Rakl.súly(kg)" ColSpanMd="2" /> Caption="Rakl.súly(kg)" ColSpanMd="2" />
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.TareWeight)))" <DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.TareWeight)))"
Field="@nameof(ShippingItemPallet.TareWeight)" Field="@nameof(ShippingItemPallet.TareWeight)"
Enabled="@(IsEditable && IsMeasurable && ProductId > 0)" Visible="@(IsMeasurable)" Enabled="@(Editable && IsMeasurable && ProductId > 0)" Visible="@(IsMeasurable)"
Caption="Tára(kg)" ColSpanMd="2" /> Caption="Tára(kg)" ColSpanMd="2" />
@* <DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1" /> *@ @* <DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1" /> *@
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.TrayQuantity)))" <DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.TrayQuantity)))"
Field="@nameof(ShippingItemPallet.TrayQuantity)" Field="@nameof(ShippingItemPallet.TrayQuantity)"
Enabled="@(IsEditable && ProductId > 0)" Enabled="@(Editable && ProductId > 0)"
Caption="Rekesz/csomag" ColSpanMd="2" /> Caption="Rekesz/csomag" ColSpanMd="2" />
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.GrossWeight)))" <DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.GrossWeight)))"
Field="@nameof(ShippingItemPallet.GrossWeight)" Field="@nameof(ShippingItemPallet.GrossWeight)"
Enabled="@(IsEditable && IsMeasurable && ProductId > 0)" Visible="@(IsMeasurable)" Enabled="@(Editable && IsMeasurable && ProductId > 0)" Visible="@(IsMeasurable)"
Caption="Br.súly(kg)" ColSpanMd="2"> Caption="Br.súly(kg)" ColSpanMd="2">
</DxFormLayoutItem> </DxFormLayoutItem>
@ -48,13 +48,13 @@
</DxFormLayoutItem> </DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="@(HasAuditButton ? 1 : 2)"> <DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="@(HasAuditButton ? 1 : 2)">
<DxButton Enabled="@(IsEditable && BtnSaveEnabled)" Text="@(PalletItem.Id == 0 ? "Mentés" : "Módosít")" Click="() => PalletItemSaveClick()" CssClass="w-100" /> <DxButton Enabled="@(Editable && BtnSaveEnabled)" Text="@(PalletItem.Id == 0 ? "Mentés" : "Módosít")" Click="() => PalletItemSaveClick()" CssClass="w-100" />
</DxFormLayoutItem> </DxFormLayoutItem>
@if (HasAuditButton) @if (HasAuditButton)
{ {
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1"> <DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1">
<DxButton Enabled="@(IsEditable && OrderItemPallet!.IsMeasuredAndValid(IsMeasurable) && !OrderItemPallet.IsAudited && IsMaxTrayQuantityValid)" <DxButton Enabled="@(Editable && OrderItemPallet!.IsMeasuredAndValid(IsMeasurable) && !OrderItemPallet.IsAudited && IsMaxTrayQuantityValid)"
Text="@(OrderItemPallet!.IsAudited ? "Jóváhagyva" : "Jóváhagy")" Click="() => PalletItemAuditedClick()" CssClass="w-100" /> Text="@(OrderItemPallet!.IsAudited ? "Jóváhagyva" : "Jóváhagy")" Click="() => PalletItemAuditedClick()" CssClass="w-100" />
</DxFormLayoutItem> </DxFormLayoutItem>
} }
@ -73,7 +73,7 @@
[Parameter] public int? AddOrUpdateSignalRTag { get; set; } = null; [Parameter] public int? AddOrUpdateSignalRTag { get; set; } = null;
[Parameter] public int? MaxTrayQuantity { get; set; } = null; [Parameter] public int? MaxTrayQuantity { get; set; } = null;
[Parameter] public bool IsEditable { get; set; } = true; [Parameter] public bool Editable { get; set; } = true;
//[Parameter] public EventCallback OnPalletItemSaveClick { get; set; } //[Parameter] public EventCallback OnPalletItemSaveClick { get; set; }
[Parameter] public Func<TPalletItem?, Task>? OnPalletItemSaved { get; set; } [Parameter] public Func<TPalletItem?, Task>? OnPalletItemSaved { get; set; }
@ -81,7 +81,7 @@
[Parameter] public Func<TPalletItem?, Task>? OnPalletItemAuditedClick { get; set; } [Parameter] public Func<TPalletItem?, Task>? OnPalletItemAuditedClick { get; set; }
//public bool LoadingPanelVisible { get; set; } = false; //public bool LoadingPanelVisible { get; set; } = false;
//public bool IsEditable => !HasAuditButton || (OrderItemPallet.IsAudited); //public bool Editable => !HasAuditButton || (OrderItemPallet.IsAudited);
public bool BtnSaveEnabled { get; set; } public bool BtnSaveEnabled { get; set; }
@ -93,7 +93,7 @@
private bool GetBtnSaveEnabled() private bool GetBtnSaveEnabled()
{ {
return IsEditable && PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured && IsMaxTrayQuantityValid; return Editable && PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured && IsMaxTrayQuantityValid;
} }
private bool IsMaxTrayQuantityValid => (!MaxTrayQuantity.HasValue || PalletItem.TrayQuantity <= MaxTrayQuantity.Value); private bool IsMaxTrayQuantityValid => (!MaxTrayQuantity.HasValue || PalletItem.TrayQuantity <= MaxTrayQuantity.Value);

View File

@ -40,10 +40,10 @@
<DxButton Text="Új" Enabled="@(_stockTakings.All(x => x.IsClosed))" Click="() => NewStockTakingClick()"></DxButton> <DxButton Text="Új" Enabled="@(_stockTakings.All(x => x.IsClosed))" Click="() => NewStockTakingClick()"></DxButton>
</DxFormLayoutItem> </DxFormLayoutItem>
<DxFormLayoutItem ColSpanMd="1"> <DxFormLayoutItem ColSpanMd="1">
<DxButton Text="Módosít" Enabled="@(SelectedStockTaking?.IsClosed ?? false)" Click="() => UpdateStockTakingClick()"></DxButton> <DxButton Text="Módosít" Enabled="@((SelectedStockTaking?.IsClosed ?? false) && false)" Click="() => UpdateStockTakingClick()"></DxButton>
</DxFormLayoutItem> </DxFormLayoutItem>
<DxFormLayoutItem ColSpanMd="1"> <DxFormLayoutItem ColSpanMd="1">
<DxButton Text="Lezárás" Enabled="@(SelectedStockTaking?.IsReadyForClose() ?? false)" Click="() => StockTakingCloseClick()"></DxButton> <DxButton Text="Lezárás" Enabled="@((!SelectedStockTaking?.IsClosed ?? false) && (SelectedStockTaking?.IsReadyForClose() ?? false))" Click="() => StockTakingCloseClick(SelectedStockTaking!.Id)"></DxButton>
</DxFormLayoutItem> </DxFormLayoutItem>
</DxFormLayout> </DxFormLayout>
@ -61,7 +61,7 @@
<span>@a</span> <span>@a</span>
} }
</div> </div>
<DxFormLayout Data="@SelectedStockTakingItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100"> <DxFormLayout Data="@SelectedStockTakingItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100" Enabled="@((!SelectedStockTaking?.IsClosed ?? false))">
<DxFormLayoutItem Context="ctxShippingItemFromLayoutItem" ColSpanMd="12"> <DxFormLayoutItem Context="ctxShippingItemFromLayoutItem" ColSpanMd="12">
@for (var index = 0; index < (SelectedStockTakingItem?.StockTakingItemPallets?.Count ?? 0); index++) @for (var index = 0; index < (SelectedStockTakingItem?.StockTakingItemPallets?.Count ?? 0); index++)
{ {
@ -70,6 +70,7 @@
<PalletItemComponent IsMeasurable="@SelectedStockTakingItem!.IsMeasurable" <PalletItemComponent IsMeasurable="@SelectedStockTakingItem!.IsMeasurable"
MeasuringIndex="@localI" MeasuringIndex="@localI"
Editable="@(!SelectedStockTaking?.IsClosed ?? false)"
PalletItem="@currentShippingItemPallet" PalletItem="@currentShippingItemPallet"
ProductId="@SelectedStockTakingItem.Product!.Id" ProductId="@SelectedStockTakingItem.Product!.Id"
AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredStockTakingItemPallet" AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredStockTakingItemPallet"
@ -142,16 +143,18 @@
// if (resultStockTaking == null) return; // if (resultStockTaking == null) return;
// _stockTakings.Add(resultStockTaking); // _stockTakings.Add(resultStockTaking);
StateHasChanged(); await InvokeAsync(StateHasChanged);
} }
private async Task StockTakingCloseClick() private async Task StockTakingCloseClick(int stockTakingId)
{ {
// var resultStockTaking = await FruitBankSignalRClient.AddStockTaking(stockTaking); var resultStockTaking = await FruitBankSignalRClient.CloseStockTaking(stockTakingId);
// if (resultStockTaking == null) return; if (resultStockTaking == null) return;
// _stockTakings.Add(resultStockTaking); _stockTakings.UpdateCollection(resultStockTaking, false);
StateHasChanged(); await StockTakingComboValueChanged(_stockTakings.FirstOrDefault(x => x.Id == resultStockTaking.Id));
await InvokeAsync(StateHasChanged);
} }
private async Task StockTakingComboValueChanged(StockTaking? newValue) private async Task StockTakingComboValueChanged(StockTaking? newValue)
@ -163,7 +166,7 @@
SelectedStockTakingItem = _stockTakingItems.FirstOrDefault(); SelectedStockTakingItem = _stockTakingItems.FirstOrDefault();
StateHasChanged(); await InvokeAsync(StateHasChanged);
} }
private void PrepareStockTakingItems(StockTaking? stockTaking) private void PrepareStockTakingItems(StockTaking? stockTaking)

View File

@ -127,7 +127,7 @@
else else
{ {
string? orderNote; string? orderNote;
if (!(orderNote = SelectedOrder?.OrderNotes.LastOrDefault(x=>x.Note.StartsWith('*'))?.Note).IsNullOrWhiteSpace()) if (!(orderNote = SelectedOrder?.OrderNotes.LastOrDefault(x => x.Note.StartsWith('*'))?.Note).IsNullOrWhiteSpace())
{ {
<div class="container-fluid p-0" style="margin-top: 20px"> <div class="container-fluid p-0" style="margin-top: 20px">
<b> Megjegyzés: </b><span>@(orderNote) </span> <b> Megjegyzés: </b><span>@(orderNote) </span>
@ -159,7 +159,8 @@
var isValid = selectedOrderItemDto.IsValidMeasuringValues(); var isValid = selectedOrderItemDto.IsValidMeasuringValues();
var isValidAndMeasured = isValid && selectedOrderItemDto.IsMeasuredAndValid(); // && selectedOrderItemDto.; var isValidAndMeasured = isValid && selectedOrderItemDto.IsMeasuredAndValid(); // && selectedOrderItemDto.;
if (isValidAndMeasured) cssClass = "text-success"; if (isValid && !selectedOrderItemDto.AverageWeightIsValid) cssClass = "text-warning";
else if (isValidAndMeasured) cssClass = "text-success";
else if (isValid) cssClass = string.Empty; else if (isValid) cssClass = string.Empty;
var displayText = $"{selectedOrderItemDto.ProductName} - [{trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net.súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}]"; var displayText = $"{selectedOrderItemDto.ProductName} - [{trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net.súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}]";
@ -184,7 +185,7 @@
<PalletItemComponent IsMeasurable="@selectedOrderItem.IsMeasurable" <PalletItemComponent IsMeasurable="@selectedOrderItem.IsMeasurable"
MeasuringIndex="@localI" MeasuringIndex="@localI"
IsEditable="@(!currentOrderItemPallet.IsAudited && !(SelectedOrder?.IsComplete ?? false))" Editable="@(!currentOrderItemPallet.IsAudited && !(SelectedOrder?.IsComplete ?? false))"
PalletItem="@currentOrderItemPallet" PalletItem="@currentOrderItemPallet"
ProductId="@selectedOrderItem.ProductId" ProductId="@selectedOrderItem.ProductId"
MaxTrayQuantity="@selectedOrderItem.Quantity" MaxTrayQuantity="@selectedOrderItem.Quantity"

View File

@ -326,6 +326,10 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
throw new NotImplementedException(); throw new NotImplementedException();
} }
public Task<StockTaking?> CloseStockTaking(int stockTakingId)
=> PostDataAsync<int, StockTaking?>(SignalRTags.CloseStockTaking, stockTakingId);
public async Task<StockTakingItemPallet?> AddStockTakingItemPallet(StockTakingItemPallet stockTakingItemPallet) public async Task<StockTakingItemPallet?> AddStockTakingItemPallet(StockTakingItemPallet stockTakingItemPallet)
{ {
throw new NotImplementedException(); throw new NotImplementedException();