Merge branch 'main' into FruitBank_v0.0.8.0

This commit is contained in:
Loretta 2026-03-28 16:23:29 +01:00
commit d1c254d5d1
16 changed files with 698 additions and 462 deletions

View File

@ -8,6 +8,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="MessagePack" Version="3.1.4" /> <PackageReference Include="MessagePack" Version="3.1.4" />
<PackageReference Include="MessagePack.Annotations" Version="3.1.4" /> <PackageReference Include="MessagePack.Annotations" Version="3.1.4" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.11" /> <PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.11" />
@ -15,7 +17,6 @@
<PackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="9.0.11" /> <PackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="9.0.11" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="9.0.11" /> <PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="9.0.11" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="9.0.11" /> <PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="9.0.11" />
<!--<PackageReference Include="Microsoft.AspNetCore.SignalR.Core" Version="1.2.0" />-->
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.11" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup> </ItemGroup>
@ -26,25 +27,22 @@
<ItemGroup> <ItemGroup>
<Reference Include="AyCode.Core"> <Reference Include="AyCode.Core">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Interfaces"> <Reference Include="AyCode.Interfaces">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Models.Server"> <Reference Include="AyCode.Models.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services"> <Reference Include="AyCode.Services">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services.Server"> <Reference Include="AyCode.Services.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.Server.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AspNetCore.SignalR.Core">
<HintPath>C:\Program Files\dotnet\packs\Microsoft.AspNetCore.App.Ref\9.0.13\ref\net9.0\Microsoft.AspNetCore.SignalR.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="Mango.Nop.Core"> <Reference Include="Mango.Nop.Core">
<HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath> <HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\$(Configuration)\net9.0\Mango.Nop.Core.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>

View File

@ -18,25 +18,25 @@
<ItemGroup> <ItemGroup>
<Reference Include="AyCode.Core"> <Reference Include="AyCode.Core">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Entities"> <Reference Include="AyCode.Entities">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Interfaces"> <Reference Include="AyCode.Interfaces">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Models"> <Reference Include="AyCode.Models">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services"> <Reference Include="AyCode.Services">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Utils"> <Reference Include="AyCode.Utils">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Utils.dll</HintPath>
</Reference> </Reference>
<Reference Include="Mango.Nop.Core"> <Reference Include="Mango.Nop.Core">
<HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath> <HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\$(Configuration)\net9.0\Mango.Nop.Core.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>

View File

@ -43,6 +43,7 @@
</DxComboBoxSettings> </DxComboBoxSettings>
</EditSettings> </EditSettings>
</DxGridDataColumn> </DxGridDataColumn>
<DxGridDataColumn FieldName="Shipping.ShippingDate" Caption="Beérkezés" ReadOnly="true" />
<DxGridDataColumn FieldName="ShippingId" Caption="Shipping" Visible="@(!ParentDataItemIsShipping)" ReadOnly="@ParentDataItemIsShipping"> <DxGridDataColumn FieldName="ShippingId" Caption="Shipping" Visible="@(!ParentDataItemIsShipping)" ReadOnly="@ParentDataItemIsShipping">
<EditSettings> <EditSettings>
<DxComboBoxSettings Data="Shippings" <DxComboBoxSettings Data="Shippings"

View File

@ -17,22 +17,20 @@
<GridContent> <GridContent>
<GridStockTakingItemBase @ref="Grid" AutoSaveLayoutName="GridStockTakingItem" SignalRClient="FruitBankSignalRClient" Logger="_logger" <GridStockTakingItemBase @ref="Grid" AutoSaveLayoutName="GridStockTakingItem" SignalRClient="FruitBankSignalRClient" Logger="_logger"
CssClass="@GridCss" ValidationEnabled="false" OnGridFocusedRowChanged="Grid_FocusedRowChanged"> CssClass="@GridCss" ValidationEnabled="false" OnGridFocusedRowChanged="Grid_FocusedRowChanged">
@* CustomizeGroupValueDisplayText="Grid_CustomizeGroupValueDisplayText"> *@
<Columns> <Columns>
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.Id)" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.StockTakingId)" TextAlignment="GridTextAlignment.Left" Caption="Leltár időpontja"> <DxGridDataColumn FieldName="@nameof(StockTakingItem.StockTakingId)" TextAlignment="GridTextAlignment.Left" Caption="Leltár Id"/>
<CellDisplayTemplate> <DxGridDataColumn FieldName="@($"{nameof(StockTakingItem.StockTaking)}.{nameof(StockTaking.StartDateTime)}")" Visible="true" DisplayFormat="g" Caption="Leltár időpontja" />
<span>@(((StockTakingItem)context.DataItem)?.StockTaking?.StartDateTime.ToString("g") ?? "")</span> <DxGridDataColumn FieldName="@($"{nameof(StockTakingItem.Product)}.{nameof(ProductDto.Name)}")" Caption="ProductName" />
</CellDisplayTemplate> <DxGridDataColumn FieldName="@nameof(StockTakingItem.OriginalStockQuantity)" />
</DxGridDataColumn>
<DxGridDataColumn FieldName="Product.Name" />
<DxGridDataColumn FieldName="OriginalStockQuantity" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.InProcessOrdersQuantity)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.InProcessOrdersQuantity)" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.TotalOriginalQuantity)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.TotalOriginalQuantity)" />
<DxGridDataColumn FieldName="MeasuredStockQuantity" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.MeasuredStockQuantity)" />
<DxGridDataColumn FieldName="OriginalNetWeight" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.OriginalNetWeight)" />
<DxGridDataColumn FieldName="MeasuredNetWeight" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.MeasuredNetWeight)" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.QuantityDiff)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.QuantityDiff)" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.NetWeightDiff)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.NetWeightDiff)" />
@ -41,8 +39,8 @@
<DxGridDataColumn FieldName="@nameof(StockTakingItem.IsMeasured)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.IsMeasured)" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.IsInvalid)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.IsInvalid)" />
<DxGridDataColumn FieldName="Created" ReadOnly="true" Visible="false" DisplayFormat="g" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.Created)" ReadOnly="true" Visible="false" DisplayFormat="g" />
<DxGridDataColumn FieldName="Modified" ReadOnly="true" DisplayFormat="g" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.Modified)" ReadOnly="true" DisplayFormat="g" />
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn> <DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
</Columns> </Columns>
<ToolbarTemplate> <ToolbarTemplate>
@ -103,22 +101,14 @@
EditItemsEnabled = true; EditItemsEnabled = true;
} }
// void Grid_CustomGroup(GridCustomGroupEventArgs e) // static void Grid_CustomizeGroupValueDisplayText(GridCustomizeGroupValueDisplayTextEventArgs e)
// { // {
// if (e.FieldName != "StockTaking.StartDateTime") return; // if (e.FieldName != nameof(StockTakingItem.StockTakingId)) return;
// e.SameGroup = ((StockTakingItem)e.DataItem1).StockTakingId == ((StockTakingItem)e.DataItem2).StockTakingId; // if (e.GetRowValue("StockTaking.StartDateTime") is DateTime startDateTime)
// e.Handled = true; // {
// e.DisplayText = startDateTime.ToString("g");
// } // }
// void Grid_CustomizeGroupValueDisplayText(GridCustomizeGroupValueDisplayTextEventArgs e)
// {
// return;
// if (e.FieldName != "StockTaking.StartDateTime") return;
// var startDate = (DateTime)e.Value;
// e.DisplayText = startDate.ToString("g");
// } // }
} }

View File

@ -29,25 +29,25 @@
<ItemGroup> <ItemGroup>
<Reference Include="AyCode.Core"> <Reference Include="AyCode.Core">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Entities"> <Reference Include="AyCode.Entities">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Interfaces"> <Reference Include="AyCode.Interfaces">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Models"> <Reference Include="AyCode.Models">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services"> <Reference Include="AyCode.Services">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services.Server"> <Reference Include="AyCode.Services.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Utils"> <Reference Include="AyCode.Utils">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Utils.dll</HintPath>
</Reference> </Reference>
<Reference Include="DevExpress.Blazor.Resources.v25.1"> <Reference Include="DevExpress.Blazor.Resources.v25.1">
@ -65,7 +65,7 @@
</Reference> </Reference>
<Reference Include="Mango.Nop.Core"> <Reference Include="Mango.Nop.Core">
<HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath> <HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\$(Configuration)\net9.0\Mango.Nop.Core.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>

View File

@ -3,14 +3,16 @@
@using DevExpress.Blazor @using DevExpress.Blazor
@using DevExpress.Blazor.Internal @using DevExpress.Blazor.Internal
@using FruitBank.Common.Entities @using FruitBank.Common.Entities
@using FruitBank.Common.Enums
@using FruitBank.Common.SignalRs @using FruitBank.Common.SignalRs
@using FruitBankHybrid.Shared.Components @using FruitBankHybrid.Shared.Components
@using FruitBankHybrid.Shared.Services @using FruitBankHybrid.Shared.Services
@using AyCode.Blazor.Components.Components.CardViews
@using Mango.Nop.Core.Dtos @using Mango.Nop.Core.Dtos
<h3>Áru bevételezés</h3> <h3>Áru bevételezés</h3>
<div style="margin-top: 50px;"> <div style="margin-top: 30px;">
<DxLoadingPanel @bind-Visible="LoadingPanelVisible" <DxLoadingPanel @bind-Visible="LoadingPanelVisible"
IsContentBlocked="true" IsContentBlocked="true"
ApplyBackgroundShading="true" ApplyBackgroundShading="true"
@ -19,8 +21,9 @@
IndicatorAnimationType="WaitIndicatorAnimationType.Spin" IndicatorAnimationType="WaitIndicatorAnimationType.Spin"
Text="Adatok szinkronizálása folyamatban..."> Text="Adatok szinkronizálása folyamatban...">
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100"> <DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100 measuring-form-layout">
<DxFormLayoutItem Caption="Dátum" ColSpanMd="2" CaptionCssClass="@(SelectedShipping != null && _measuringDates.Where(x => MeasurementService.DaysEqual(x.DateTime, SelectedShipping.ShippingDate)).All(x => x.IsMeasured) ? "text-success" : "")"> <DxFormLayoutItem Caption="Dátum" ColSpanXs="8" ColSpanSm="8" ColSpanMd="2"
CaptionCssClass="@(SelectedShipping != null && _measuringDates.Where(x => MeasurementService.DaysEqual(x.DateTime, SelectedShipping.ShippingDate)).All(x => x.IsMeasured) ? "text-success" : "")">
<DxDateEdit CssClass="cw-320" <DxDateEdit CssClass="cw-320"
DisplayFormat="m" DisplayFormat="m"
Format="m" Format="m"
@ -46,7 +49,63 @@
</DayCellTemplate> </DayCellTemplate>
</DxDateEdit> </DxDateEdit>
</DxFormLayoutItem> </DxFormLayoutItem>
</DxFormLayout>
<DxTabs ActiveTabIndex="(int)_activeTab" ActiveTabIndexChanged="i => _activeTab = (MeasuringTab)i" RenderMode="TabsRenderMode.OnDemand" CssClass="measuring-tabs">
<DxTabPage Text="Napi feladatok">
<div class="p-3">
<MgCardView TItem="Shipping" Data="@FilteredShippings"
ShowFilterPanel="true"
OnCardClick="NavigateToMeasuringTab"
ScrollToItem="@SelectedShipping"
ItemKeySelector="s => s.Id"
Height="calc(100vh - 220px)">
<FilterPanel>
<DxTagBox Data="@(new[] { MeasuringStatus.NotStarted, MeasuringStatus.Started, MeasuringStatus.Finnished })"
NullText="Összes státusz"
@bind-Values="_statusFilter"
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
CssClass="cw-480" />
</FilterPanel>
<CardTemplate>
<div class="d-flex justify-content-between align-items-start mb-2">
<h6 class="mb-0">@context.LicencePlate</h6>
<span class="badge @(MeasurementService.GetMeasuringStatusBadgeCssClass(MeasurementService.GetShippingMeasuringStatus(context), hasAuditedStage: false))">@(MeasurementService.GetMeasuringStatusText(MeasurementService.GetShippingMeasuringStatus(context)))</span>
</div>
<div class="text-muted small mb-2">
<strong>@context.ShippingDate.ToString("yyyy.MM.dd")</strong>
@if (!string.IsNullOrWhiteSpace(context.CargoCompany))
{
<span> — @context.CargoCompany</span>
}
</div>
@{
var allItems = context.ShippingDocuments?
.Where(sd => sd.ShippingItems is not null)
.SelectMany(sd => sd.ShippingItems!);
}
@if (allItems is not null)
{
@foreach (var item in allItems)
{
<div class="@(MeasurementService.GetMeasuringStatusCssClass(item.MeasuringStatus, hasAuditedStage: false)) small">
@item.ProductName — @item.MeasuredQuantity/@item.QuantityOnDocument rekesz
</div>
}
}
@if (!string.IsNullOrWhiteSpace(context.Comment))
{
<div class="text-muted small mt-2 fst-italic">
📝 @context.Comment
</div>
}
</CardTemplate>
</MgCardView>
</div>
</DxTabPage>
<DxTabPage Text="Mérés">
<div class="p-3">
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
<DxFormLayoutItem Caption="Rendszám:" ColSpanMd="2" CaptionCssClass="@(SelectedShipping?.IsAllMeasured == true ? "text-success" : "")"> <DxFormLayoutItem Caption="Rendszám:" ColSpanMd="2" CaptionCssClass="@(SelectedShipping?.IsAllMeasured == true ? "text-success" : "")">
<DxComboBox Data="@NotMeasuredShippings" <DxComboBox Data="@NotMeasuredShippings"
@bind-Value="@SelectedShipping" @bind-Value="@SelectedShipping"
@ -64,7 +123,7 @@
</DxComboBox> </DxComboBox>
</DxFormLayoutItem> </DxFormLayoutItem>
@* <DxFormLayoutItem Caption="Partner:" ColSpanMd="3" CaptionCssClass="@(SelectedShippingDocument?.IsAllMeasured == true ? "text-success" : "")"> @* <DxFormLayoutItem Caption="Partner:" ColSpanMd="3" CaptionCssClass="@(SelectedShippingDocument?.IsAllMeasured == true ? "text-success" : "")">
<DxComboBox Data="@SelectedShipping?.ShippingDocuments" <DxComboBox Data="@SelectedShipping?.ShippingDocuments"
@bind-Value="@SelectedShippingDocument" @bind-Value="@SelectedShippingDocument"
Text="Select partner" Text="Select partner"
@ -79,8 +138,8 @@
<span class="@(ctxShippingDocument.DataItem.IsAllMeasured ? "text-success" : "")">@ctxShippingDocument.DisplayText</span> <span class="@(ctxShippingDocument.DataItem.IsAllMeasured ? "text-success" : "")">@ctxShippingDocument.DisplayText</span>
</ItemDisplayTemplate> </ItemDisplayTemplate>
</DxComboBox> </DxComboBox>
</DxFormLayoutItem> </DxFormLayoutItem> *@
*@
<DxFormLayoutItem Caption="Termék:" ColSpanMd="5" CaptionCssClass="@(SelectedShippingItem?.IsMeasured == true ? "text-success" : "")"> <DxFormLayoutItem Caption="Termék:" ColSpanMd="5" CaptionCssClass="@(SelectedShippingItem?.IsMeasured == true ? "text-success" : "")">
<DxComboBox Data="@_shippingItemsDataSource" <DxComboBox Data="@_shippingItemsDataSource"
@bind-Value="@SelectedShippingItem" @bind-Value="@SelectedShippingItem"
@ -100,21 +159,19 @@
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingItem> args) => OnSelectedShippingItemChanged(args))" SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingItem> args) => OnSelectedShippingItemChanged(args))"
InputId="cbShippingItem"> InputId="cbShippingItem">
<ItemDisplayTemplate> <ItemDisplayTemplate>
@* <div class="combobox-item-template"> @* <div class="combobox-item-template">
<img src="/images/ok_green_lt.jpg" alt="" /> <img src="/images/ok_green_lt.jpg" alt="" />
<span class="icon counter-icon" aria-hidden="true"></span> <span class="icon counter-icon" aria-hidden="true"></span>
<div class="combobox-item-template-text"> <div class="combobox-item-template-text">
<span>@ctxShippingitem.DisplayText</span> <span>@ctxShippingitem.DisplayText</span>
</div> </div>
</div> </div> *@
*@
<span class="@(ctxShippingitem.DataItem.IsMeasured ? "text-success" : "")">@ctxShippingitem.DisplayText)</span> <span class="@(ctxShippingitem.DataItem.IsMeasured ? "text-success" : "")">@ctxShippingitem.DisplayText)</span>
</ItemDisplayTemplate> </ItemDisplayTemplate>
<Buttons> <Buttons>
<DxEditorButton IconCssClass="editor-icon editor-icon-add" Text="R" Tooltip="Adatok frissítése..." <DxEditorButton IconCssClass="editor-icon editor-icon-add" Text="R" Tooltip="Adatok frissítése..."
Click="() => OnOrdersRefreshClick()" /> Click="() => OnOrdersRefreshClick()" />
</Buttons> </Buttons>
</DxComboBox> </DxComboBox>
</DxFormLayoutItem> </DxFormLayoutItem>
@ -130,7 +187,6 @@
</span> </span>
} }
} }
</DxFormLayoutItem> </DxFormLayoutItem>
</DxFormLayout> </DxFormLayout>
@ -185,5 +241,11 @@
</DxFormLayout> </DxFormLayout>
} }
</div> </div>
</div>
</DxTabPage>
</DxTabs>
</DxLoadingPanel> </DxLoadingPanel>
</div> </div>
@code {
}

View File

@ -3,6 +3,7 @@ using AyCode.Core.Loggers;
using DevExpress.Blazor; using DevExpress.Blazor;
using FruitBank.Common.Dtos; using FruitBank.Common.Dtos;
using FruitBank.Common.Entities; using FruitBank.Common.Entities;
using FruitBank.Common.Enums;
using FruitBank.Common.Helpers; using FruitBank.Common.Helpers;
using FruitBank.Common.Interfaces; using FruitBank.Common.Interfaces;
using FruitBank.Common.Models; using FruitBank.Common.Models;
@ -26,6 +27,15 @@ namespace FruitBankHybrid.Shared.Pages
private ILogger _logger = null!; private ILogger _logger = null!;
private string _errorText; private string _errorText;
private enum MeasuringTab
{
DailyTasks = 0,
Measuring = 1
}
private MeasuringTab _activeTab = MeasuringTab.DailyTasks;
private IEnumerable<MeasuringStatus> _statusFilter = [];
private List<Shipping> NotMeasuredShippings { get; set; } = null!; private List<Shipping> NotMeasuredShippings { get; set; } = null!;
private Shipping? SelectedShipping { get; set; } private Shipping? SelectedShipping { get; set; }
//private ShippingDocument? SelectedShippingDocument { get; set; } //private ShippingDocument? SelectedShippingDocument { get; set; }
@ -37,6 +47,12 @@ namespace FruitBankHybrid.Shared.Pages
private List<ShippingItem>? _shippingItemsDataSource; private List<ShippingItem>? _shippingItemsDataSource;
private List<MeasuringDateSelectorModel> _measuringDates = null!; private List<MeasuringDateSelectorModel> _measuringDates = null!;
private IReadOnlyList<Shipping> FilteredShippings => NotMeasuredShippings is null
? []
: _statusFilter.Any()
? NotMeasuredShippings.Where(s => _statusFilter.Contains(MeasurementService.GetShippingMeasuringStatus(s))).ToList()
: NotMeasuredShippings;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
LoadingPanelVisible = true; LoadingPanelVisible = true;
@ -181,6 +197,20 @@ namespace FruitBankHybrid.Shared.Pages
//Nem végezhető el a mérés, nincs megadva a ProductId! Jelezze a vezetőségnek... //Nem végezhető el a mérés, nincs megadva a ProductId! Jelezze a vezetőségnek...
} }
/// <summary>
/// Navigates from a card click (Napi feladatok tab) to the Mérés tab with the selected shipping.
/// </summary>
private void NavigateToMeasuringTab(Shipping shipping)
{
SelectedShipping = shipping;
PrepareShippingItems(shipping);
_shippingItemsDataSource = GetShippingItemsDataSource(shipping);
SelectedShippingItem = _shippingItemsDataSource?.FirstOrDefault();
_activeTab = MeasuringTab.Measuring;
}
private void PrepareShippingItems(Shipping? shipping) private void PrepareShippingItems(Shipping? shipping)
{ {
if (shipping?.ShippingDocuments == null) return; if (shipping?.ShippingDocuments == null) return;

View File

@ -7,13 +7,13 @@
@using FruitBank.Common.SignalRs @using FruitBank.Common.SignalRs
@using FruitBankHybrid.Shared.Components @using FruitBankHybrid.Shared.Components
@using FruitBankHybrid.Shared.Services @using FruitBankHybrid.Shared.Services
@using AyCode.Blazor.Components.Components.CardViews
@using Nop.Core.Domain.Orders @using Nop.Core.Domain.Orders
<h3>Áru kiadás</h3> <h3>Áru kiadás</h3>
<DxDialogProvider /> <DxDialogProvider />
<div style="margin-top: 50px;"> <div style="margin-top: 30px;">
<DxLoadingPanel @bind-Visible="LoadingPanelVisible" <DxLoadingPanel @bind-Visible="LoadingPanelVisible"
IsContentBlocked="true" IsContentBlocked="true"
ApplyBackgroundShading="true" ApplyBackgroundShading="true"
@ -22,12 +22,9 @@
IndicatorAnimationType="WaitIndicatorAnimationType.Spin" IndicatorAnimationType="WaitIndicatorAnimationType.Spin"
Text="Adatok szinkronizálása folyamatban..."> Text="Adatok szinkronizálása folyamatban...">
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100"> <DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100 measuring-form-layout">
<DxFormLayoutItem Caption="Dátum" ColSpanMd="3" <DxFormLayoutItem Caption="Dátum" ColSpanXs="8" ColSpanSm="8" ColSpanMd="2"
CaptionCssClass="@(SelectedOrder != null && _measuringDates.Where(x => MeasurementService.DaysEqual(x.DateTime, SelectedOrder.DateOfReceiptOrCreated)).All(x => x.IsMeasured) ? "text-success" : "")"> CaptionCssClass="@(SelectedOrder != null && _measuringDates.Where(x => MeasurementService.DaysEqual(x.DateTime, SelectedOrder.DateOfReceiptOrCreated)).All(x => x.IsMeasured) ? "text-success" : "")">
<div class="container-fluid p-0">
<div class="row">
<div class="col-9 p-0">
<DxDateEdit DisplayFormat="m" <DxDateEdit DisplayFormat="m"
Format="m" Format="m"
Context="ctxOrderDate" Context="ctxOrderDate"
@ -50,14 +47,59 @@
} }
</DayCellTemplate> </DayCellTemplate>
</DxDateEdit> </DxDateEdit>
</div>
<div class="col-3 p-0">
<DxSpinEdit T="int" Value="1" Increment="1" MinValue="1" ValueChanged="async i => await RefreshOrdersFromDb(DateTime.Now, i)"></DxSpinEdit>
</div>
</div>
</div>
</DxFormLayoutItem> </DxFormLayoutItem>
<DxFormLayoutItem Caption="Napok száma" ColSpanXs="4" ColSpanSm="4" ColSpanMd="2">
<DxSpinEdit T="int" Value="1" Increment="1" MinValue="1"
ValueChanged="async i => await RefreshOrdersFromDb(DateTime.Now, i)" />
</DxFormLayoutItem>
</DxFormLayout>
<DxTabs ActiveTabIndex="(int)_activeTab" ActiveTabIndexChanged="i => _activeTab = (MeasuringTab)i" RenderMode="TabsRenderMode.OnDemand" CssClass="measuring-tabs">
<DxTabPage Text="Napi feladatok">
<div class="p-3">
<MgCardView TItem="OrderDto" Data="@FilteredOrders"
ShowFilterPanel="true"
OnCardClick="NavigateToMeasuringTab"
ScrollToItem="@SelectedOrder"
ItemKeySelector="o => o.Id"
Height="calc(100vh - 220px)">
<FilterPanel>
<DxTagBox Data="@(Enum.GetValues<MeasuringStatus>())"
NullText="Összes státusz"
@bind-Values="_statusFilter"
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
CssClass="cw-480" />
</FilterPanel>
<CardTemplate>
<div class="d-flex justify-content-between align-items-start mb-2">
<h6 class="mb-0">#@context.CustomOrderNumber</h6>
<span class="badge @(MeasurementService.GetMeasuringStatusBadgeCssClass(context.MeasuringStatus))">@(MeasurementService.GetMeasuringStatusText(context.MeasuringStatus))</span>
</div>
<div class="text-muted small mb-2">
<strong>@context.DateOfReceiptOrCreated.ToString("HH:mm")</strong> — @context.Customer.Company
</div>
@foreach (var item in context.OrderItemDtos)
{
<div class="@(MeasurementService.GetMeasuringStatusCssClass(item.MeasuringStatus)) small">
@item.ProductName — @item.TrayQuantity/@item.Quantity rekesz
</div>
}
@{
var cardOrderNote = MeasurementService.GetOrderNote(context.OrderNotes);
}
@if (!string.IsNullOrWhiteSpace(cardOrderNote))
{
<div class="text-muted small mt-2 fst-italic">
📝 @cardOrderNote
</div>
}
</CardTemplate>
</MgCardView>
</div>
</DxTabPage>
<DxTabPage Text="Mérés">
<div class="p-3">
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
<DxFormLayoutItem Caption="Átvétel időpontja:" ColSpanMd="5" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")"> <DxFormLayoutItem Caption="Átvétel időpontja:" ColSpanMd="5" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
<DxComboBox Data="@SelectedDayOrders" <DxComboBox Data="@SelectedDayOrders"
@bind-Value="@SelectedOrder" @bind-Value="@SelectedOrder"
@ -67,6 +109,13 @@
CssClass="cw-480" CssClass="cw-480"
Context="ctxOrder" Context="ctxOrder"
DropDownBodyCssClass="dd-body-class" DropDownBodyCssClass="dd-body-class"
SearchMode="ListSearchMode.AutoSearch"
SearchFilterCondition="ListSearchFilterCondition.Contains"
SearchTextParseMode="ListSearchTextParseMode.GroupWordsByAnd"
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
DropDownTriggerMode="DropDownTriggerMode.Click"
ListRenderMode="ListRenderMode.Entire"
ShowDropDownButton="true"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<OrderDto> args) => OnSelectedOrderChanged(args))" SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<OrderDto> args) => OnSelectedOrderChanged(args))"
InputId="cbOrders"> InputId="cbOrders">
<ItemDisplayTemplate> <ItemDisplayTemplate>
@ -81,7 +130,11 @@
@if (SelectedOrder == null) @if (SelectedOrder == null)
{ {
<DxFormLayoutItem ColSpanMd="2" /> <DxFormLayoutItem ColSpanMd="5">
<div class="alert alert-info mt-2" role="alert">
<i class="me-1"></i> Válasszon ki egy rendelést a mérés indításához.
</div>
</DxFormLayoutItem>
} }
else else
{ {
@ -90,19 +143,18 @@
<DxFormLayoutItem ColSpanMd="2"> <DxFormLayoutItem ColSpanMd="2">
<DxButton Enabled="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0)" Visible="(SelectedOrder != null)" <DxButton Enabled="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0)" Visible="(SelectedOrder != null)"
CssClass="w-100" CssClass="w-100"
Text="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0 ? " Indítás" : "Folyamatban...")" Text="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0 ? "Indítás" : "Folyamatban...")"
Click="() => OnStartMeasuringClick()" /> Click="() => OnStartMeasuringClick()" />
</DxFormLayoutItem> </DxFormLayoutItem>
} }
else else
{ {
<DxFormLayoutItem ColSpanMd="2" Caption="Indította" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? " text-success" : "")"> <DxFormLayoutItem ColSpanMd="2" Caption="Indította" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
<DxTextBox Enabled="false" Text="@(LoggedInModel.MeasuringUsers.FirstOrDefault(x => x.Id == SelectedOrder?.MeasurementOwnerId)?.LastName)" /> <DxTextBox Enabled="false" Text="@(LoggedInModel.MeasuringUsers.FirstOrDefault(x => x.Id == SelectedOrder?.MeasurementOwnerId)?.LastName)" />
</DxFormLayoutItem> </DxFormLayoutItem>
} }
} }
@* <DxFormLayoutItem ColSpanMd="1"></DxFormLayoutItem> *@
@if (SelectedOrder != null && LoggedInModel.IsRevisor) @if (SelectedOrder != null && LoggedInModel.IsRevisor)
{ {
var isCompleteOrder = SelectedOrder.IsComplete; var isCompleteOrder = SelectedOrder.IsComplete;
@ -120,22 +172,22 @@
} }
else if (!HasMeasuringAccess) else if (!HasMeasuringAccess)
{ {
<div style="margin-top: 30px;"> <div class="alert alert-warning mt-4" role="alert">
<H3>Mások végzik a mérést!</H3> <strong>⚠ Figyelem!</strong> Jelenleg más felhasználó végzi a mérést ennél a rendelésnél.
</div> </div>
} }
else else
{ {
string? orderNote; var orderNote = MeasurementService.GetOrderNote(SelectedOrder?.OrderNotes);
if (!(orderNote = SelectedOrder?.OrderNotes.LastOrDefault(x => x.Note.StartsWith('*'))?.Note).IsNullOrWhiteSpace()) if (!string.IsNullOrWhiteSpace(orderNote))
{ {
<div class="container-fluid p-0" style="margin-top: 20px"> <div class="alert alert-info mt-3" role="alert">
<b> Megjegyzés: </b><span>@(orderNote) </span> <strong>📝 Megjegyzés:</strong> @(orderNote)
</div> </div>
} }
<div style="margin-top: 30px;"> <div class="mt-5">
<h4 style="margin-bottom: 30px;" class="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")"> <h4 class="mb-1 @(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
Rendelés azonosító: #@(SelectedOrder?.CustomOrderNumber) Rendelés azonosító: #@(SelectedOrder?.CustomOrderNumber)
</h4> </h4>
@ -145,7 +197,6 @@
AnimationType="LayoutAnimationType.Slide"> AnimationType="LayoutAnimationType.Slide">
<DataMappings> <DataMappings>
<DxAccordionDataMapping Text=ProductName></DxAccordionDataMapping> <DxAccordionDataMapping Text=ProductName></DxAccordionDataMapping>
@* <DxAccordionDataMapping Text="OrderItemId" Level="1"></DxAccordionDataMapping> *@
</DataMappings> </DataMappings>
<ItemHeaderTextTemplate> <ItemHeaderTextTemplate>
@{ @{
@ -228,18 +279,22 @@
@if (!_errorText.IsNullOrWhiteSpace()) @if (!_errorText.IsNullOrWhiteSpace())
{ {
<DxFormLayoutItem Context="ctxFromLayoutItemError" ColSpanMd="12" BeginRow="true"> <DxFormLayoutItem Context="ctxFromLayoutItemError" ColSpanMd="12" BeginRow="true">
<text>HIBA! @_errorText</text> <div class="alert alert-danger" role="alert">
<strong>⚠ Hiba:</strong> @_errorText
</div>
</DxFormLayoutItem> </DxFormLayoutItem>
//_errorText = string.Empty;
} }
</DxFormLayout> </DxFormLayout>
<div style="margin-bottom: 20px;"></div> <div class="mb-3"></div>
} }
} }
</ItemContentTemplate> </ItemContentTemplate>
</DxAccordion> </DxAccordion>
</div> </div>
} }
</div>
</DxTabPage>
</DxTabs>
</DxLoadingPanel> </DxLoadingPanel>
</div> </div>

View File

@ -4,6 +4,7 @@ using AyCode.Services.SignalRs;
using DevExpress.Blazor; using DevExpress.Blazor;
using FruitBank.Common.Dtos; using FruitBank.Common.Dtos;
using FruitBank.Common.Entities; using FruitBank.Common.Entities;
using FruitBank.Common.Enums;
using FruitBank.Common.Models; using FruitBank.Common.Models;
using FruitBank.Common.SignalRs; using FruitBank.Common.SignalRs;
using FruitBankHybrid.Shared.Extensions; using FruitBankHybrid.Shared.Extensions;
@ -30,8 +31,16 @@ namespace FruitBankHybrid.Shared.Pages
private LoggerClient _logger = null!; private LoggerClient _logger = null!;
private string _errorText; private string _errorText;
private enum MeasuringTab
{
DailyTasks = 0,
Measuring = 1
}
private bool _enablePalletItems = true; private bool _enablePalletItems = true;
private int _lastDaysCount = 1; private int _lastDaysCount = 1;
private MeasuringTab _activeTab = MeasuringTab.DailyTasks;
private IEnumerable<MeasuringStatus> _statusFilter = [MeasuringStatus.NotStarted, MeasuringStatus.Started, MeasuringStatus.Finnished];
public bool HasMeasuringAccess; public bool HasMeasuringAccess;
public bool LoadingPanelVisible { get; set; } = true; public bool LoadingPanelVisible { get; set; } = true;
public bool IsAllOrderItemPalletAudited => SelectedOrder?.IsAllOrderItemAudited ?? false; public bool IsAllOrderItemPalletAudited => SelectedOrder?.IsAllOrderItemAudited ?? false;
@ -42,6 +51,12 @@ namespace FruitBankHybrid.Shared.Pages
private List<MeasuringDateSelectorModel> _measuringDates = null!; private List<MeasuringDateSelectorModel> _measuringDates = null!;
private IReadOnlyList<OrderDto> FilteredOrders => SelectedDayOrders is null
? []
: _statusFilter.Any()
? SelectedDayOrders.Where(o => _statusFilter.Contains(o.MeasuringStatus)).ToList()
: SelectedDayOrders;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
LoadingPanelVisible = true; LoadingPanelVisible = true;
@ -187,7 +202,7 @@ namespace FruitBankHybrid.Shared.Pages
SelectedOrder ??= SelectedDayOrders.FirstOrDefault(); SelectedOrder ??= SelectedDayOrders.FirstOrDefault();
} }
LoadingPanelVisible = SelectedOrder != null; //Lefut a change és ott lesz false! - J. LoadingPanelVisible = false;
} }
private async Task OnMeasuringDateChanged(DateTime selectedDateTime) => await RefreshOrdersFromDb(selectedDateTime, _lastDaysCount); private async Task OnMeasuringDateChanged(DateTime selectedDateTime) => await RefreshOrdersFromDb(selectedDateTime, _lastDaysCount);
@ -206,42 +221,11 @@ namespace FruitBankHybrid.Shared.Pages
private async Task OnSelectedOrderChanged(SelectedDataItemChangedEventArgs<OrderDto> eventArgs) private async Task OnSelectedOrderChanged(SelectedDataItemChangedEventArgs<OrderDto> eventArgs)
{ {
//var orderDtosFromDb = await FruitBankSignalRClient.GetPendingOrderDtos();
//if (orderDtosFromDb != null) RefreshOrderGenericAttributes(orderDtosFromDb, SelectedDayOrders);
//else MessageBox.ShowMessageBox("Hiba", "Az adatok letöltése sikertelen!", MessageBoxRenderStyle.Danger);
var orderDto = eventArgs.DataItem; var orderDto = eventArgs.DataItem;
if (orderDto != null && !LoadingPanelVisible) if (orderDto != null && !LoadingPanelVisible)
{ await RefreshOrderStatusFromDbAsync(orderDto);
//LoadingPanelVisible = true;
var orderFromDb = await FruitBankSignalRClient.GetOrderDtoById(orderDto.Id);
if (orderFromDb != null) await ApplyMeasuringAccessAsync(orderDto);
{
orderDto.OrderStatus = orderFromDb.OrderStatus;
orderDto.GenericAttributes.UpdateBaseEntityCollection(orderFromDb.GenericAttributes, false);
//if (LoggedInModel.IsRevisor)
//{
// orderDto.OrderItemDtos.UpdateCollection(orderFromDb.OrderItemDtos, false);
// var orderItemPalletsByOrderId = orderFromDb.OrderItemDtos.Where(o => o.OrderItemPallets.Count > 0).ToDictionary(k => k.Id, v => v.OrderItemPallets);
// foreach (var orderItemDto in orderDto.OrderItemDtos)
// {
// if (orderItemPalletsByOrderId.TryGetValue(orderDto.Id, out var orderItemPallets))
// orderItemDto.OrderItemPallets.UpdateCollection(orderItemPallets, false);
// }
//}
}
}
LoadingPanelVisible = false;
HasMeasuringAccess = orderDto?.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor) ?? false;
StateHasChanged();
if (!HasMeasuringAccess && orderDto != null)
await DialogService.ShowMessageBoxAsync("Információ", "A mérés már folyamatban, válasszon másik rendelést!", MessageBoxRenderStyle.Info);
} }
private Task OnOrderItemPalletValueChanged(OrderItemPallet orderItemPallet, OrderItemDto selectedOrderItemDto) private Task OnOrderItemPalletValueChanged(OrderItemPallet orderItemPallet, OrderItemDto selectedOrderItemDto)
@ -383,6 +367,49 @@ namespace FruitBankHybrid.Shared.Pages
} }
} }
/// <summary>
/// Navigates from a card click (Napi feladatok tab) to the Mérés tab with the selected order.
/// Loads the full order from DB and switches the active tab.
/// </summary>
private async Task NavigateToMeasuringTab(OrderDto order)
{
LoadingPanelVisible = true;
SelectedOrder = order;
await RefreshOrderStatusFromDbAsync(order);
_activeTab = MeasuringTab.Measuring;
await ApplyMeasuringAccessAsync(order);
}
/// <summary>
/// Fetches the latest order data from DB and updates status and generic attributes.
/// </summary>
private async Task RefreshOrderStatusFromDbAsync(OrderDto order)
{
var orderFromDb = await FruitBankSignalRClient.GetOrderDtoById(order.Id);
if (orderFromDb != null)
{
order.OrderStatus = orderFromDb.OrderStatus;
order.GenericAttributes.UpdateBaseEntityCollection(orderFromDb.GenericAttributes, false);
}
}
/// <summary>
/// Sets measuring access, hides loading panel, refreshes UI, and shows info dialog if access is denied.
/// </summary>
private async Task ApplyMeasuringAccessAsync(OrderDto? order)
{
HasMeasuringAccess = order?.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor) ?? false;
LoadingPanelVisible = false;
StateHasChanged();
if (!HasMeasuringAccess && order != null)
await DialogService.ShowMessageBoxAsync("Információ", "A mérés már folyamatban, válasszon másik rendelést!", MessageBoxRenderStyle.Info);
}
public void Dispose() public void Dispose()
{ {
FruitBankSignalRClient.OnMessageReceived -= SignalRClientOnMessageReceived; FruitBankSignalRClient.OnMessageReceived -= SignalRClientOnMessageReceived;

View File

@ -2,12 +2,14 @@
using DevExpress.Blazor; using DevExpress.Blazor;
using FruitBank.Common.Dtos; using FruitBank.Common.Dtos;
using FruitBank.Common.Entities; using FruitBank.Common.Entities;
using FruitBank.Common.Enums;
using FruitBank.Common.Interfaces; using FruitBank.Common.Interfaces;
using FruitBank.Common.Services; using FruitBank.Common.Services;
using FruitBankHybrid.Shared.Models; using FruitBankHybrid.Shared.Models;
using FruitBankHybrid.Shared.Services.Loggers; using FruitBankHybrid.Shared.Services.Loggers;
using Mango.Nop.Core.Dtos; using Mango.Nop.Core.Dtos;
using Mango.Nop.Core.Loggers; using Mango.Nop.Core.Loggers;
using Nop.Core.Domain.Orders;
namespace FruitBankHybrid.Shared.Services; namespace FruitBankHybrid.Shared.Services;
@ -109,4 +111,66 @@ public class MeasurementService(IEnumerable<IAcLogWriterClientBase> logWriters)
public static bool IsCustomItemPalletMeasuredAndValid(IMeasuringItemPalletBase customItemPallet, bool isMeasurable) public static bool IsCustomItemPalletMeasuredAndValid(IMeasuringItemPalletBase customItemPallet, bool isMeasurable)
=> customItemPallet.IsMeasuredAndValid(isMeasurable); => customItemPallet.IsMeasuredAndValid(isMeasurable);
/// <summary>
/// Returns the last order note starting with '*', or null if none exists.
/// </summary>
public static string? GetOrderNote(IEnumerable<OrderNote>? orderNotes)
=> orderNotes?.LastOrDefault(x => x.Note.StartsWith('*'))?.Note;
/// <summary>
/// Returns a Bootstrap badge CSS class for the given measuring status.
/// When <paramref name="hasAuditedStage"/> is false, Finnished is treated as the final state (success/green).
/// </summary>
public static string GetMeasuringStatusBadgeCssClass(MeasuringStatus status, bool hasAuditedStage = true) => status switch
{
MeasuringStatus.Audited => "bg-success",
MeasuringStatus.Finnished => hasAuditedStage ? "bg-primary" : "bg-success",
MeasuringStatus.Started => "bg-warning text-dark",
_ => "bg-secondary"
};
/// <summary>
/// Returns a localized display text for the given measuring status.
/// </summary>
public static string GetMeasuringStatusText(MeasuringStatus status) => status switch
{
MeasuringStatus.Audited => "Lezárva",
MeasuringStatus.Finnished => "Kész",
MeasuringStatus.Started => "Folyamatban",
_ => "Nem kezdett"
};
/// <summary>
/// Returns a text color CSS class for the given measuring status.
/// When <paramref name="hasAuditedStage"/> is false, Finnished is treated as the final state (success/green).
/// </summary>
public static string GetMeasuringStatusCssClass(MeasuringStatus status, bool hasAuditedStage = true) => status switch
{
MeasuringStatus.Audited => "text-success",
MeasuringStatus.Finnished => hasAuditedStage ? "text-primary" : "text-success",
MeasuringStatus.Started => "text-warning",
_ => "text-muted"
};
/// <summary>
/// Computes a shipping-level MeasuringStatus from its items.
/// </summary>
public static MeasuringStatus GetShippingMeasuringStatus(Shipping shipping)
{
var items = shipping.ShippingDocuments?
.Where(sd => sd.ShippingItems is not null)
.SelectMany(sd => sd.ShippingItems!);
if (items is null || !items.Any())
return MeasuringStatus.NotStarted;
if (items.All(si => si.IsMeasured))
return MeasuringStatus.Finnished;
if (items.Any(si => si.MeasuringStatus == MeasuringStatus.Started || si.IsMeasured))
return MeasuringStatus.Started;
return MeasuringStatus.NotStarted;
}
} }

View File

@ -79,12 +79,19 @@ h1:focus {
.measuring-form-layout { .measuring-form-layout {
margin-top: 15px; margin-top: 15px;
margin-bottom: 25px; margin-bottom: 10px;
padding: 8px; padding: 8px;
background-color: lightgrey; background-color: #e9eff5;
border: 1px solid #d5dde6;
border-radius: 8px; border-radius: 8px;
} }
.measuring-tabs {
border: 1px solid #d5dde6;
border-radius: 8px;
padding: 0;
}
.dd-body-class, .dd-body-class,
.dd-body-class .dxbl-list-box-render-container { .dd-body-class .dxbl-list-box-render-container {
max-height: 600px !important; max-height: 600px !important;

View File

@ -28,37 +28,37 @@
<ItemGroup> <ItemGroup>
<Reference Include="AyCode.Core"> <Reference Include="AyCode.Core">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Core.Server"> <Reference Include="AyCode.Core.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Entities"> <Reference Include="AyCode.Entities">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Entities.Server"> <Reference Include="AyCode.Entities.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Interfaces"> <Reference Include="AyCode.Interfaces">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Interfaces.Server"> <Reference Include="AyCode.Interfaces.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Models"> <Reference Include="AyCode.Models">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Models.Server"> <Reference Include="AyCode.Models.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services"> <Reference Include="AyCode.Services">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services.Server"> <Reference Include="AyCode.Services.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Utils"> <Reference Include="AyCode.Utils">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Utils.dll</HintPath>
</Reference> </Reference>
<Reference Include="DevExpress.Blazor.Resources.v25.1"></Reference> <Reference Include="DevExpress.Blazor.Resources.v25.1"></Reference>
<Reference Include="DevExpress.Blazor.v25.1"></Reference> <Reference Include="DevExpress.Blazor.v25.1"></Reference>
@ -66,7 +66,7 @@
<Reference Include="DevExpress.Data.v25.1"></Reference> <Reference Include="DevExpress.Data.v25.1"></Reference>
<Reference Include="DevExpress.Utils.v25.1"></Reference> <Reference Include="DevExpress.Utils.v25.1"></Reference>
<Reference Include="Mango.Nop.Core"> <Reference Include="Mango.Nop.Core">
<HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath> <HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\$(Configuration)\net9.0\Mango.Nop.Core.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>

View File

@ -26,6 +26,7 @@
<body class="dxbl-theme-fluent"> <body class="dxbl-theme-fluent">
<Routes @rendermode="InteractiveWebAssembly" /> <Routes @rendermode="InteractiveWebAssembly" />
<script src="_content/AyCode.Blazor.Components/js/mgGridInfoPanel.js"></script> <script src="_content/AyCode.Blazor.Components/js/mgGridInfoPanel.js"></script>
<script src="_content/AyCode.Blazor.Components/js/mgCardView.js"></script>
<script src="_content/AyCode.Blazor.Components/js/lazyContentObserver.js"></script> <script src="_content/AyCode.Blazor.Components/js/lazyContentObserver.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
<script> <script>

View File

@ -28,37 +28,37 @@
<ItemGroup> <ItemGroup>
<Reference Include="AyCode.Core"> <Reference Include="AyCode.Core">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Core.Server"> <Reference Include="AyCode.Core.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Entities"> <Reference Include="AyCode.Entities">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Entities.Server"> <Reference Include="AyCode.Entities.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Interfaces"> <Reference Include="AyCode.Interfaces">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Interfaces.Server"> <Reference Include="AyCode.Interfaces.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Models"> <Reference Include="AyCode.Models">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Models.Server"> <Reference Include="AyCode.Models.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services"> <Reference Include="AyCode.Services">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services.Server"> <Reference Include="AyCode.Services.Server">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.Server.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.Server.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Utils"> <Reference Include="AyCode.Utils">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Utils.dll</HintPath>
</Reference> </Reference>
<Reference Include="DevExpress.Blazor.Resources.v25.1"> <Reference Include="DevExpress.Blazor.Resources.v25.1">
@ -76,7 +76,7 @@
</Reference> </Reference>
<Reference Include="Mango.Nop.Core"> <Reference Include="Mango.Nop.Core">
<HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath> <HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\$(Configuration)\net9.0\Mango.Nop.Core.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>

View File

@ -123,13 +123,13 @@
<ItemGroup> <ItemGroup>
<Reference Include="AyCode.Core"> <Reference Include="AyCode.Core">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Services"> <Reference Include="AyCode.Services">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll</HintPath>
</Reference> </Reference>
<Reference Include="AyCode.Entities"> <Reference Include="AyCode.Entities">
<HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll</HintPath> <HintPath>..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.dll</HintPath>
</Reference> </Reference>
<!--<Reference Include="Mango.Nop.Core"> <!--<Reference Include="Mango.Nop.Core">
<HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath> <HintPath>..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll</HintPath>

View File

@ -26,6 +26,7 @@
<script src="_framework/blazor.webview.js" autostart="false"></script> <script src="_framework/blazor.webview.js" autostart="false"></script>
<script src="_content/AyCode.Blazor.Components/js/mgGridInfoPanel.js"></script> <script src="_content/AyCode.Blazor.Components/js/mgGridInfoPanel.js"></script>
<script src="_content/AyCode.Blazor.Components/js/mgCardView.js"></script>
<script src="_content/AyCode.Blazor.Components/js/lazyContentObserver.js"></script> <script src="_content/AyCode.Blazor.Components/js/lazyContentObserver.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
<script> <script>