Compare commits
4 Commits
a73b72f831
...
fcd7866d09
| Author | SHA1 | Date |
|---|---|---|
|
|
fcd7866d09 | |
|
|
e22b6f304e | |
|
|
84f4990ff4 | |
|
|
ff1a5b63c1 |
|
|
@ -41,7 +41,7 @@
|
||||||
<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\Debug\net9.0\AyCode.Services.Server.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.AspNetCore.SignalR.Core">
|
<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>
|
<HintPath>C:\Program Files\dotnet\packs\Microsoft.AspNetCore.App.Ref\9.0.14\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\Debug\net9.0\Mango.Nop.Core.dll</HintPath>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -16,23 +16,21 @@
|
||||||
<MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
|
<MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
|
||||||
<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");
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,144 +49,203 @@
|
||||||
</DayCellTemplate>
|
</DayCellTemplate>
|
||||||
</DxDateEdit>
|
</DxDateEdit>
|
||||||
</DxFormLayoutItem>
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
<DxFormLayoutItem Caption="Rendszám:" ColSpanMd="2" CaptionCssClass="@(SelectedShipping?.IsAllMeasured == true ? "text-success" : "")">
|
|
||||||
<DxComboBox Data="@NotMeasuredShippings"
|
|
||||||
@bind-Value="@SelectedShipping"
|
|
||||||
Text="Select licence plate"
|
|
||||||
ValueFieldName="@nameof(Shipping.Id)"
|
|
||||||
TextFieldName="@nameof(Shipping.LicencePlate)"
|
|
||||||
CssClass="cw-480"
|
|
||||||
DropDownBodyCssClass="dd-body-class"
|
|
||||||
Context="ctxShipping"
|
|
||||||
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<Shipping> args) => OnSelectedShippingChanged(args))"
|
|
||||||
InputId="cbNotMeasuredShippings">
|
|
||||||
<ItemDisplayTemplate>
|
|
||||||
<span class="@(ctxShipping.DataItem.IsAllMeasured ? "text-success" : "")">@ctxShipping.DisplayText</span>
|
|
||||||
</ItemDisplayTemplate>
|
|
||||||
</DxComboBox>
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
|
|
||||||
@* <DxFormLayoutItem Caption="Partner:" ColSpanMd="3" CaptionCssClass="@(SelectedShippingDocument?.IsAllMeasured == true ? "text-success" : "")">
|
|
||||||
<DxComboBox Data="@SelectedShipping?.ShippingDocuments"
|
|
||||||
@bind-Value="@SelectedShippingDocument"
|
|
||||||
Text="Select partner"
|
|
||||||
ValueFieldName="@nameof(ShippingDocument.Id)"
|
|
||||||
TextFieldName="@(nameof(ShippingDocument.Partner) + '.' + nameof(Partner.Name))"
|
|
||||||
CssClass="cw-480"
|
|
||||||
DropDownBodyCssClass="dd-body-class"
|
|
||||||
Context="ctxShippingDocument"
|
|
||||||
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingDocument> args) => OnSelectedShippingDocumentChanged(args))"
|
|
||||||
InputId="cbShippingDocument">
|
|
||||||
<ItemDisplayTemplate>
|
|
||||||
<span class="@(ctxShippingDocument.DataItem.IsAllMeasured ? "text-success" : "")">@ctxShippingDocument.DisplayText</span>
|
|
||||||
</ItemDisplayTemplate>
|
|
||||||
</DxComboBox>
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
*@
|
|
||||||
<DxFormLayoutItem Caption="Termék:" ColSpanMd="5" CaptionCssClass="@(SelectedShippingItem?.IsMeasured == true ? "text-success" : "")">
|
|
||||||
<DxComboBox Data="@_shippingItemsDataSource"
|
|
||||||
@bind-Value="@SelectedShippingItem"
|
|
||||||
Text="Select item"
|
|
||||||
ValueFieldName="@nameof(ShippingItem.Id)"
|
|
||||||
TextFieldName="@(nameof(ShippingItem.ProductName))"
|
|
||||||
CssClass="cw-480"
|
|
||||||
SearchMode="ListSearchMode.AutoSearch"
|
|
||||||
SearchFilterCondition="ListSearchFilterCondition.Contains"
|
|
||||||
SearchTextParseMode="ListSearchTextParseMode.GroupWordsByAnd"
|
|
||||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
|
||||||
DropDownTriggerMode="DropDownTriggerMode.Click"
|
|
||||||
ListRenderMode="ListRenderMode.Entire"
|
|
||||||
ShowDropDownButton="false"
|
|
||||||
DropDownBodyCssClass="dd-body-class"
|
|
||||||
Context="ctxShippingitem"
|
|
||||||
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingItem> args) => OnSelectedShippingItemChanged(args))"
|
|
||||||
InputId="cbShippingItem">
|
|
||||||
<ItemDisplayTemplate>
|
|
||||||
@* <div class="combobox-item-template">
|
|
||||||
<img src="/images/ok_green_lt.jpg" alt="" />
|
|
||||||
<span class="icon counter-icon" aria-hidden="true"></span>
|
|
||||||
<div class="combobox-item-template-text">
|
|
||||||
<span>@ctxShippingitem.DisplayText</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
*@
|
|
||||||
<span class="@(ctxShippingitem.DataItem.IsMeasured ? "text-success" : "")">@ctxShippingitem.DisplayText)</span>
|
|
||||||
</ItemDisplayTemplate>
|
|
||||||
<Buttons>
|
|
||||||
<DxEditorButton IconCssClass="editor-icon editor-icon-add" Text="R" Tooltip="Adatok frissítése..."
|
|
||||||
Click="() => OnOrdersRefreshClick()" />
|
|
||||||
</Buttons>
|
|
||||||
|
|
||||||
</DxComboBox>
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
|
|
||||||
<DxFormLayoutItem Caption="Partner:" ColSpanMd="3" CaptionCssClass="@(SelectedShippingItem?.ShippingDocument?.IsAllMeasured == true ? "text-success" : "")">
|
|
||||||
@{
|
|
||||||
var sd = SelectedShippingItem?.ShippingDocument;
|
|
||||||
if (sd != null)
|
|
||||||
{
|
|
||||||
var partnerName = sd.Partner?.Name;
|
|
||||||
|
|
||||||
<span class="@(sd.IsAllMeasured == true ? " text-success" : "")">
|
|
||||||
@($"{partnerName}, {sd.ShippingItems?.Count(si => si.IsMeasured) ?? 0}/{sd.ShippingItems?.Count ?? 0} kész.")
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
</DxFormLayout>
|
</DxFormLayout>
|
||||||
|
|
||||||
<div style="margin-top: 50px;">
|
<DxTabs ActiveTabIndex="(int)_activeTab" ActiveTabIndexChanged="i => _activeTab = (MeasuringTab)i" RenderMode="TabsRenderMode.OnDemand" CssClass="measuring-tabs">
|
||||||
@if (SelectedShippingItem is { ProductId: > 0 })
|
<DxTabPage Text="Napi feladatok">
|
||||||
{
|
<div class="p-3">
|
||||||
<h3 style="margin-bottom: 30px;" class="@(SelectedShippingItem.IsMeasured && SelectedShippingItem.ShippingItemPallets!.All(x => x.IsMeasuredAndValid(SelectedShippingItem.IsMeasurable)) ? "text-success" : "")">
|
<MgCardView TItem="Shipping" Data="@FilteredShippings"
|
||||||
#@(SelectedShippingItem.ProductId). @(SelectedShippingItem.ProductName)
|
ShowFilterPanel="true"
|
||||||
</h3>
|
OnCardClick="NavigateToMeasuringTab"
|
||||||
|
ScrollToItem="@SelectedShipping"
|
||||||
<DxFormLayout Data="@SelectedShippingItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
|
ItemKeySelector="s => s.Id"
|
||||||
<DxFormLayoutItem Context="ctxShippingItemFromLayoutItem" ColSpanMd="12">
|
Height="calc(100vh - 220px)">
|
||||||
@for (var index = 0; index < (SelectedShippingItem?.ShippingItemPallets?.Count ?? 0); index++)
|
<FilterPanel>
|
||||||
{
|
<DxTagBox Data="@(new[] { MeasuringStatus.NotStarted, MeasuringStatus.Started, MeasuringStatus.Finnished })"
|
||||||
var localI = index + 1;
|
NullText="Összes státusz"
|
||||||
var currentShippingItemPallet = SelectedShippingItem!.ShippingItemPallets![index];
|
@bind-Values="_statusFilter"
|
||||||
|
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||||
<PalletItemComponent IsMeasurable="@SelectedShippingItem.IsMeasurable"
|
CssClass="cw-480" />
|
||||||
MeasuringIndex="@localI"
|
</FilterPanel>
|
||||||
PalletItem="@currentShippingItemPallet"
|
<CardTemplate>
|
||||||
ProductId="@SelectedShippingItem.ProductId!.Value"
|
<div class="d-flex justify-content-between align-items-start mb-2">
|
||||||
AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredShippingItemPallet"
|
<h6 class="mb-0">@context.LicencePlate</h6>
|
||||||
OnPalletItemSaved="pallet => OnShippingItemPalletSaved(pallet)"
|
<span class="badge @(MeasurementService.GetMeasuringStatusBadgeCssClass(MeasurementService.GetShippingMeasuringStatus(context), hasAuditedStage: false))">@(MeasurementService.GetMeasuringStatusText(MeasurementService.GetShippingMeasuringStatus(context)))</span>
|
||||||
OnPalletItemValueChanged="pallet => OnShippingItemPalletValueChanged(pallet, SelectedShippingItem)">
|
</div>
|
||||||
</PalletItemComponent>
|
<div class="text-muted small mb-2">
|
||||||
}
|
<strong>@context.ShippingDate.ToString("yyyy.MM.dd")</strong>
|
||||||
</DxFormLayoutItem>
|
@if (!string.IsNullOrWhiteSpace(context.CargoCompany))
|
||||||
|
{
|
||||||
<DxFormLayoutItem Context="vfdfgfd" ColSpanMd="12" BeginRow="true">
|
<span> — @context.CargoCompany</span>
|
||||||
<DxFormLayout CssClass="w-100">
|
}
|
||||||
<DxFormLayoutItem ColSpanMd="1" BeginRow="false"><strong>TOTAL:</strong></DxFormLayoutItem>
|
</div>
|
||||||
<DxFormLayoutItem ColSpanMd="2" BeginRow="false" Visible="@(SelectedShippingItem.IsMeasurable)" />
|
@{
|
||||||
<DxFormLayoutItem ColSpanMd="2" BeginRow="false" Visible="@(SelectedShippingItem.IsMeasurable)" />
|
var allItems = context.ShippingDocuments?
|
||||||
<DxFormLayoutItem ColSpanMd="2" BeginRow="false"><strong>Rekesz: @(SelectedShippingItem.MeasuredQuantity) db</strong></DxFormLayoutItem>
|
.Where(sd => sd.ShippingItems is not null)
|
||||||
<DxFormLayoutItem ColSpanMd="2" BeginRow="false" Visible="@(SelectedShippingItem.IsMeasurable)"><strong>Br: @(SelectedShippingItem.MeasuredGrossWeight) kg</strong></DxFormLayoutItem>
|
.SelectMany(sd => sd.ShippingItems!);
|
||||||
<DxFormLayoutItem ColSpanMd="1" BeginRow="false" Visible="@(SelectedShippingItem.IsMeasurable)"><strong>Net: @(SelectedShippingItem.MeasuredNetWeight) kg</strong></DxFormLayoutItem>
|
}
|
||||||
<DxFormLayoutItem ColSpanMd="1" BeginRow="false" />
|
@if (allItems is not null)
|
||||||
</DxFormLayout>
|
{
|
||||||
</DxFormLayoutItem>
|
@foreach (var item in allItems)
|
||||||
|
{
|
||||||
@* <DxFormLayoutItem ColSpanMd="12" BeginRow="true">
|
<div class="@(MeasurementService.GetMeasuringStatusCssClass(item.MeasuringStatus, hasAuditedStage: false)) small">
|
||||||
<ValidationSummary/>
|
@item.ProductName — @item.MeasuredQuantity/@item.QuantityOnDocument rekesz
|
||||||
</DxFormLayoutItem> *@
|
</div>
|
||||||
|
}
|
||||||
@if (!_errorText.IsNullOrWhiteSpace())
|
}
|
||||||
{
|
@if (!string.IsNullOrWhiteSpace(context.Comment))
|
||||||
<DxFormLayoutItem ColSpanMd="12" BeginRow="true">
|
{
|
||||||
<text>HIBA! @_errorText</text>
|
<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" : "")">
|
||||||
|
<DxComboBox Data="@NotMeasuredShippings"
|
||||||
|
@bind-Value="@SelectedShipping"
|
||||||
|
Text="Select licence plate"
|
||||||
|
ValueFieldName="@nameof(Shipping.Id)"
|
||||||
|
TextFieldName="@nameof(Shipping.LicencePlate)"
|
||||||
|
CssClass="cw-480"
|
||||||
|
DropDownBodyCssClass="dd-body-class"
|
||||||
|
Context="ctxShipping"
|
||||||
|
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<Shipping> args) => OnSelectedShippingChanged(args))"
|
||||||
|
InputId="cbNotMeasuredShippings">
|
||||||
|
<ItemDisplayTemplate>
|
||||||
|
<span class="@(ctxShipping.DataItem.IsAllMeasured ? "text-success" : "")">@ctxShipping.DisplayText</span>
|
||||||
|
</ItemDisplayTemplate>
|
||||||
|
</DxComboBox>
|
||||||
</DxFormLayoutItem>
|
</DxFormLayoutItem>
|
||||||
//_errorText = string.Empty;
|
|
||||||
}
|
@* <DxFormLayoutItem Caption="Partner:" ColSpanMd="3" CaptionCssClass="@(SelectedShippingDocument?.IsAllMeasured == true ? "text-success" : "")">
|
||||||
</DxFormLayout>
|
<DxComboBox Data="@SelectedShipping?.ShippingDocuments"
|
||||||
}
|
@bind-Value="@SelectedShippingDocument"
|
||||||
</div>
|
Text="Select partner"
|
||||||
|
ValueFieldName="@nameof(ShippingDocument.Id)"
|
||||||
|
TextFieldName="@(nameof(ShippingDocument.Partner) + '.' + nameof(Partner.Name))"
|
||||||
|
CssClass="cw-480"
|
||||||
|
DropDownBodyCssClass="dd-body-class"
|
||||||
|
Context="ctxShippingDocument"
|
||||||
|
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingDocument> args) => OnSelectedShippingDocumentChanged(args))"
|
||||||
|
InputId="cbShippingDocument">
|
||||||
|
<ItemDisplayTemplate>
|
||||||
|
<span class="@(ctxShippingDocument.DataItem.IsAllMeasured ? "text-success" : "")">@ctxShippingDocument.DisplayText</span>
|
||||||
|
</ItemDisplayTemplate>
|
||||||
|
</DxComboBox>
|
||||||
|
</DxFormLayoutItem> *@
|
||||||
|
|
||||||
|
<DxFormLayoutItem Caption="Termék:" ColSpanMd="5" CaptionCssClass="@(SelectedShippingItem?.IsMeasured == true ? "text-success" : "")">
|
||||||
|
<DxComboBox Data="@_shippingItemsDataSource"
|
||||||
|
@bind-Value="@SelectedShippingItem"
|
||||||
|
Text="Select item"
|
||||||
|
ValueFieldName="@nameof(ShippingItem.Id)"
|
||||||
|
TextFieldName="@(nameof(ShippingItem.ProductName))"
|
||||||
|
CssClass="cw-480"
|
||||||
|
SearchMode="ListSearchMode.AutoSearch"
|
||||||
|
SearchFilterCondition="ListSearchFilterCondition.Contains"
|
||||||
|
SearchTextParseMode="ListSearchTextParseMode.GroupWordsByAnd"
|
||||||
|
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||||
|
DropDownTriggerMode="DropDownTriggerMode.Click"
|
||||||
|
ListRenderMode="ListRenderMode.Entire"
|
||||||
|
ShowDropDownButton="false"
|
||||||
|
DropDownBodyCssClass="dd-body-class"
|
||||||
|
Context="ctxShippingitem"
|
||||||
|
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingItem> args) => OnSelectedShippingItemChanged(args))"
|
||||||
|
InputId="cbShippingItem">
|
||||||
|
<ItemDisplayTemplate>
|
||||||
|
@* <div class="combobox-item-template">
|
||||||
|
<img src="/images/ok_green_lt.jpg" alt="" />
|
||||||
|
<span class="icon counter-icon" aria-hidden="true"></span>
|
||||||
|
<div class="combobox-item-template-text">
|
||||||
|
<span>@ctxShippingitem.DisplayText</span>
|
||||||
|
</div>
|
||||||
|
</div> *@
|
||||||
|
<span class="@(ctxShippingitem.DataItem.IsMeasured ? "text-success" : "")">@ctxShippingitem.DisplayText)</span>
|
||||||
|
</ItemDisplayTemplate>
|
||||||
|
<Buttons>
|
||||||
|
<DxEditorButton IconCssClass="editor-icon editor-icon-add" Text="R" Tooltip="Adatok frissítése..."
|
||||||
|
Click="() => OnOrdersRefreshClick()" />
|
||||||
|
</Buttons>
|
||||||
|
</DxComboBox>
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
|
<DxFormLayoutItem Caption="Partner:" ColSpanMd="3" CaptionCssClass="@(SelectedShippingItem?.ShippingDocument?.IsAllMeasured == true ? "text-success" : "")">
|
||||||
|
@{
|
||||||
|
var sd = SelectedShippingItem?.ShippingDocument;
|
||||||
|
if (sd != null)
|
||||||
|
{
|
||||||
|
var partnerName = sd.Partner?.Name;
|
||||||
|
|
||||||
|
<span class="@(sd.IsAllMeasured == true ? " text-success" : "")">
|
||||||
|
@($"{partnerName}, {sd.ShippingItems?.Count(si => si.IsMeasured) ?? 0}/{sd.ShippingItems?.Count ?? 0} kész.")
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
</DxFormLayout>
|
||||||
|
|
||||||
|
<div style="margin-top: 50px;">
|
||||||
|
@if (SelectedShippingItem is { ProductId: > 0 })
|
||||||
|
{
|
||||||
|
<h3 style="margin-bottom: 30px;" class="@(SelectedShippingItem.IsMeasured && SelectedShippingItem.ShippingItemPallets!.All(x => x.IsMeasuredAndValid(SelectedShippingItem.IsMeasurable)) ? "text-success" : "")">
|
||||||
|
#@(SelectedShippingItem.ProductId). @(SelectedShippingItem.ProductName)
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<DxFormLayout Data="@SelectedShippingItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
|
||||||
|
<DxFormLayoutItem Context="ctxShippingItemFromLayoutItem" ColSpanMd="12">
|
||||||
|
@for (var index = 0; index < (SelectedShippingItem?.ShippingItemPallets?.Count ?? 0); index++)
|
||||||
|
{
|
||||||
|
var localI = index + 1;
|
||||||
|
var currentShippingItemPallet = SelectedShippingItem!.ShippingItemPallets![index];
|
||||||
|
|
||||||
|
<PalletItemComponent IsMeasurable="@SelectedShippingItem.IsMeasurable"
|
||||||
|
MeasuringIndex="@localI"
|
||||||
|
PalletItem="@currentShippingItemPallet"
|
||||||
|
ProductId="@SelectedShippingItem.ProductId!.Value"
|
||||||
|
AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredShippingItemPallet"
|
||||||
|
OnPalletItemSaved="pallet => OnShippingItemPalletSaved(pallet)"
|
||||||
|
OnPalletItemValueChanged="pallet => OnShippingItemPalletValueChanged(pallet, SelectedShippingItem)">
|
||||||
|
</PalletItemComponent>
|
||||||
|
}
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
|
<DxFormLayoutItem Context="vfdfgfd" ColSpanMd="12" BeginRow="true">
|
||||||
|
<DxFormLayout CssClass="w-100">
|
||||||
|
<DxFormLayoutItem ColSpanMd="1" BeginRow="false"><strong>TOTAL:</strong></DxFormLayoutItem>
|
||||||
|
<DxFormLayoutItem ColSpanMd="2" BeginRow="false" Visible="@(SelectedShippingItem.IsMeasurable)" />
|
||||||
|
<DxFormLayoutItem ColSpanMd="2" BeginRow="false" Visible="@(SelectedShippingItem.IsMeasurable)" />
|
||||||
|
<DxFormLayoutItem ColSpanMd="2" BeginRow="false"><strong>Rekesz: @(SelectedShippingItem.MeasuredQuantity) db</strong></DxFormLayoutItem>
|
||||||
|
<DxFormLayoutItem ColSpanMd="2" BeginRow="false" Visible="@(SelectedShippingItem.IsMeasurable)"><strong>Br: @(SelectedShippingItem.MeasuredGrossWeight) kg</strong></DxFormLayoutItem>
|
||||||
|
<DxFormLayoutItem ColSpanMd="1" BeginRow="false" Visible="@(SelectedShippingItem.IsMeasurable)"><strong>Net: @(SelectedShippingItem.MeasuredNetWeight) kg</strong></DxFormLayoutItem>
|
||||||
|
<DxFormLayoutItem ColSpanMd="1" BeginRow="false" />
|
||||||
|
</DxFormLayout>
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
|
@* <DxFormLayoutItem ColSpanMd="12" BeginRow="true">
|
||||||
|
<ValidationSummary/>
|
||||||
|
</DxFormLayoutItem> *@
|
||||||
|
|
||||||
|
@if (!_errorText.IsNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
<DxFormLayoutItem ColSpanMd="12" BeginRow="true">
|
||||||
|
<text>HIBA! @_errorText</text>
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
//_errorText = string.Empty;
|
||||||
|
}
|
||||||
|
</DxFormLayout>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</DxTabPage>
|
||||||
|
</DxTabs>
|
||||||
</DxLoadingPanel>
|
</DxLoadingPanel>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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,224 +22,279 @@
|
||||||
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">
|
<DxDateEdit DisplayFormat="m"
|
||||||
<div class="row">
|
Format="m"
|
||||||
<div class="col-9 p-0">
|
Context="ctxOrderDate"
|
||||||
<DxDateEdit DisplayFormat="m"
|
Date="@(SelectedOrder?.DateOfReceiptOrCreated.Date ?? DateTime.Now.Date)"
|
||||||
Format="m"
|
CustomDisabledDate="@OnCustomDisabledMeasuringDate"
|
||||||
Context="ctxOrderDate"
|
DateChanged="@((DateTime newValue) => OnMeasuringDateChanged(newValue))"
|
||||||
Date="@(SelectedOrder?.DateOfReceiptOrCreated.Date ?? DateTime.Now.Date)"
|
InputId="deDisabledDates"
|
||||||
CustomDisabledDate="@OnCustomDisabledMeasuringDate"
|
PickerDisplayMode="DatePickerDisplayMode.Calendar">
|
||||||
DateChanged="@((DateTime newValue) => OnMeasuringDateChanged(newValue))"
|
<DayCellTemplate>
|
||||||
InputId="deDisabledDates"
|
@{
|
||||||
PickerDisplayMode="DatePickerDisplayMode.Calendar">
|
var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate);
|
||||||
<DayCellTemplate>
|
if (!cssClass.IsNullOrWhiteSpace())
|
||||||
@{
|
{
|
||||||
var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate);
|
<a class="@GetMeasuringDateCssClassNames(ctxOrderDate)">@ctxOrderDate.Day.ToString()</a>
|
||||||
if (!cssClass.IsNullOrWhiteSpace())
|
}
|
||||||
{
|
else
|
||||||
<a class="@GetMeasuringDateCssClassNames(ctxOrderDate)">@ctxOrderDate.Day.ToString()</a>
|
{
|
||||||
}
|
<a>@ctxOrderDate.Day.ToString()</a>
|
||||||
else
|
}
|
||||||
{
|
}
|
||||||
<a>@ctxOrderDate.Day.ToString()</a>
|
</DayCellTemplate>
|
||||||
}
|
</DxDateEdit>
|
||||||
}
|
|
||||||
</DayCellTemplate>
|
|
||||||
</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">
|
||||||
<DxFormLayoutItem Caption="Átvétel időpontja:" ColSpanMd="5" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
|
<DxSpinEdit T="int" Value="1" Increment="1" MinValue="1"
|
||||||
<DxComboBox Data="@SelectedDayOrders"
|
ValueChanged="async i => await RefreshOrdersFromDb(DateTime.Now, i)" />
|
||||||
@bind-Value="@SelectedOrder"
|
|
||||||
Text="Válasszon időpontot..."
|
|
||||||
ValueFieldName="@nameof(OrderDto.Id)"
|
|
||||||
TextFieldName="@nameof(OrderDto.TimeOfReceiptText)"
|
|
||||||
CssClass="cw-480"
|
|
||||||
Context="ctxOrder"
|
|
||||||
DropDownBodyCssClass="dd-body-class"
|
|
||||||
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<OrderDto> args) => OnSelectedOrderChanged(args))"
|
|
||||||
InputId="cbOrders">
|
|
||||||
<ItemDisplayTemplate>
|
|
||||||
<span class="@(ctxOrder.DataItem.IsMeasured ? "text-success" : "")">@ctxOrder.DisplayText</span>
|
|
||||||
</ItemDisplayTemplate>
|
|
||||||
<Buttons>
|
|
||||||
<DxEditorButton IconCssClass="editor-icon editor-icon-add" Text="R" Tooltip="Adatok frissítése..."
|
|
||||||
Click="() => OnOrdersRefreshClick()" />
|
|
||||||
</Buttons>
|
|
||||||
</DxComboBox>
|
|
||||||
</DxFormLayoutItem>
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
@if (SelectedOrder == null)
|
|
||||||
{
|
|
||||||
<DxFormLayoutItem ColSpanMd="2" />
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (SelectedOrder is { MeasurementOwnerId: 0, IsComplete: false } && HasMeasuringAccess)
|
|
||||||
{
|
|
||||||
<DxFormLayoutItem ColSpanMd="2">
|
|
||||||
<DxButton Enabled="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0)" Visible="(SelectedOrder != null)"
|
|
||||||
CssClass="w-100"
|
|
||||||
Text="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0 ? " Indítás" : "Folyamatban...")"
|
|
||||||
Click="() => OnStartMeasuringClick()" />
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<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)" />
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@* <DxFormLayoutItem ColSpanMd="1"></DxFormLayoutItem> *@
|
|
||||||
@if (SelectedOrder != null && LoggedInModel.IsRevisor)
|
|
||||||
{
|
|
||||||
var isCompleteOrder = SelectedOrder.IsComplete;
|
|
||||||
|
|
||||||
<DxFormLayoutItem Caption="Revizor:" ColSpanMd="2" CaptionCssClass="@(isCompleteOrder ? "text-success" : "")">
|
|
||||||
<DxButton Text="@(isCompleteOrder ? "Lezárva" : "Lezárás")"
|
|
||||||
Enabled="@(!isCompleteOrder && IsAllOrderItemPalletAudited)" CssClass="w-100"
|
|
||||||
Click="() => OnMeasuringAuditorClick()" />
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
}
|
|
||||||
</DxFormLayout>
|
</DxFormLayout>
|
||||||
|
|
||||||
@if (SelectedOrder == null || LoadingPanelVisible)
|
<DxTabs ActiveTabIndex="(int)_activeTab" ActiveTabIndexChanged="i => _activeTab = (MeasuringTab)i" RenderMode="TabsRenderMode.OnDemand" CssClass="measuring-tabs">
|
||||||
{
|
<DxTabPage Text="Napi feladatok">
|
||||||
}
|
<div class="p-3">
|
||||||
else if (!HasMeasuringAccess)
|
<MgCardView TItem="OrderDto" Data="@FilteredOrders"
|
||||||
{
|
ShowFilterPanel="true"
|
||||||
<div style="margin-top: 30px;">
|
OnCardClick="NavigateToMeasuringTab"
|
||||||
<H3>Mások végzik a mérést!</H3>
|
ScrollToItem="@SelectedOrder"
|
||||||
</div>
|
ItemKeySelector="o => o.Id"
|
||||||
}
|
Height="calc(100vh - 220px)">
|
||||||
else
|
<FilterPanel>
|
||||||
{
|
<DxTagBox Data="@(Enum.GetValues<MeasuringStatus>())"
|
||||||
string? orderNote;
|
NullText="Összes státusz"
|
||||||
if (!(orderNote = SelectedOrder?.OrderNotes.LastOrDefault(x => x.Note.StartsWith('*'))?.Note).IsNullOrWhiteSpace())
|
@bind-Values="_statusFilter"
|
||||||
{
|
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||||
<div class="container-fluid p-0" style="margin-top: 20px">
|
CssClass="cw-480" />
|
||||||
<b> Megjegyzés: </b><span>@(orderNote) </span>
|
</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>
|
</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" : "")">
|
||||||
|
<DxComboBox Data="@SelectedDayOrders"
|
||||||
|
@bind-Value="@SelectedOrder"
|
||||||
|
Text="Válasszon időpontot..."
|
||||||
|
ValueFieldName="@nameof(OrderDto.Id)"
|
||||||
|
TextFieldName="@nameof(OrderDto.TimeOfReceiptText)"
|
||||||
|
CssClass="cw-480"
|
||||||
|
Context="ctxOrder"
|
||||||
|
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))"
|
||||||
|
InputId="cbOrders">
|
||||||
|
<ItemDisplayTemplate>
|
||||||
|
<span class="@(ctxOrder.DataItem.IsMeasured ? "text-success" : "")">@ctxOrder.DisplayText</span>
|
||||||
|
</ItemDisplayTemplate>
|
||||||
|
<Buttons>
|
||||||
|
<DxEditorButton IconCssClass="editor-icon editor-icon-add" Text="R" Tooltip="Adatok frissítése..."
|
||||||
|
Click="() => OnOrdersRefreshClick()" />
|
||||||
|
</Buttons>
|
||||||
|
</DxComboBox>
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
<div style="margin-top: 30px;">
|
@if (SelectedOrder == null)
|
||||||
<h4 style="margin-bottom: 30px;" class="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
|
{
|
||||||
Rendelés azonosító: #@(SelectedOrder?.CustomOrderNumber)
|
<DxFormLayoutItem ColSpanMd="5">
|
||||||
</h4>
|
<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.
|
||||||
<DxAccordion Data="@SelectedOrder?.OrderItemDtos" Enabled="@((HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId > 0 && (LoggedInModel.IsRevisor || !(SelectedOrder?.IsComplete ?? false))))"
|
</div>
|
||||||
ExpandMode="AccordionExpandMode.SingleOrNone"
|
</DxFormLayoutItem>
|
||||||
ExpandCollapseAction="AccordionExpandCollapseAction.ExpandButtonClick"
|
}
|
||||||
AnimationType="LayoutAnimationType.Slide">
|
else
|
||||||
<DataMappings>
|
{
|
||||||
<DxAccordionDataMapping Text=ProductName></DxAccordionDataMapping>
|
if (SelectedOrder is { MeasurementOwnerId: 0, IsComplete: false } && HasMeasuringAccess)
|
||||||
@* <DxAccordionDataMapping Text="OrderItemId" Level="1"></DxAccordionDataMapping> *@
|
|
||||||
</DataMappings>
|
|
||||||
<ItemHeaderTextTemplate>
|
|
||||||
@{
|
|
||||||
if (context.Level == 0)
|
|
||||||
{
|
{
|
||||||
var cssClass = "text-danger";
|
<DxFormLayoutItem ColSpanMd="2">
|
||||||
|
<DxButton Enabled="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0)" Visible="(SelectedOrder != null)"
|
||||||
var selectedOrderItemDto = (OrderItemDto)(context.DataItem);
|
CssClass="w-100"
|
||||||
var trayQuantity = selectedOrderItemDto.TrayQuantity; //selectedOrderItemDto.OrderItemPallets.Where(x => x.IsMeasured).Sum(x => x.TrayQuantity);
|
Text="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId == 0 ? "Indítás" : "Folyamatban...")"
|
||||||
|
Click="() => OnStartMeasuringClick()" />
|
||||||
var isValid = selectedOrderItemDto.IsValidMeasuringValues();
|
</DxFormLayoutItem>
|
||||||
var isValidAndMeasured = isValid && selectedOrderItemDto.IsMeasuredAndValid(); // && selectedOrderItemDto.;
|
}
|
||||||
|
else
|
||||||
if (isValid && !selectedOrderItemDto.AverageWeightIsValid) cssClass = "text-warning";
|
{
|
||||||
else if (isValidAndMeasured) cssClass = "text-success";
|
<DxFormLayoutItem ColSpanMd="2" Caption="Indította" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
|
||||||
else if (isValid) cssClass = string.Empty;
|
<DxTextBox Enabled="false" Text="@(LoggedInModel.MeasuringUsers.FirstOrDefault(x => x.Id == SelectedOrder?.MeasurementOwnerId)?.LastName)" />
|
||||||
|
</DxFormLayoutItem>
|
||||||
var displayText = $"{selectedOrderItemDto.ProductName} - [{trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net.súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}]";
|
|
||||||
if (selectedOrderItemDto.MeasuringStatus == MeasuringStatus.Audited) displayText = $"[{selectedOrderItemDto.MeasuringStatus}] " + displayText;
|
|
||||||
|
|
||||||
<h5 class="@cssClass">@(displayText)</h5>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</ItemHeaderTextTemplate>
|
|
||||||
<ItemContentTemplate>
|
|
||||||
@{
|
|
||||||
if (context.Level == 0)
|
|
||||||
{
|
|
||||||
var selectedOrderItem = (OrderItemDto)(context.DataItem);
|
|
||||||
|
|
||||||
<DxFormLayout Context="ctxFormLayout" Data="@selectedOrderItem" CaptionPosition="CaptionPosition.Vertical"
|
@if (SelectedOrder != null && LoggedInModel.IsRevisor)
|
||||||
CssClass="w-100">
|
{
|
||||||
<DxFormLayoutItem Context="ctxFormLayoutItem" ColSpanMd="12">
|
var isCompleteOrder = SelectedOrder.IsComplete;
|
||||||
@for (var index = 0; index < (selectedOrderItem?.OrderItemPallets?.Count ?? 0); index++)
|
|
||||||
|
<DxFormLayoutItem Caption="Revizor:" ColSpanMd="2" CaptionCssClass="@(isCompleteOrder ? "text-success" : "")">
|
||||||
|
<DxButton Text="@(isCompleteOrder ? "Lezárva" : "Lezárás")"
|
||||||
|
Enabled="@(!isCompleteOrder && IsAllOrderItemPalletAudited)" CssClass="w-100"
|
||||||
|
Click="() => OnMeasuringAuditorClick()" />
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
}
|
||||||
|
</DxFormLayout>
|
||||||
|
|
||||||
|
@if (SelectedOrder == null || LoadingPanelVisible)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!HasMeasuringAccess)
|
||||||
|
{
|
||||||
|
<div class="alert alert-warning mt-4" role="alert">
|
||||||
|
<strong>⚠ Figyelem!</strong> Jelenleg más felhasználó végzi a mérést ennél a rendelésnél.
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var orderNote = MeasurementService.GetOrderNote(SelectedOrder?.OrderNotes);
|
||||||
|
if (!string.IsNullOrWhiteSpace(orderNote))
|
||||||
|
{
|
||||||
|
<div class="alert alert-info mt-3" role="alert">
|
||||||
|
<strong>📝 Megjegyzés:</strong> @(orderNote)
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
<div class="mt-5">
|
||||||
|
<h4 class="mb-1 @(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
|
||||||
|
Rendelés azonosító: #@(SelectedOrder?.CustomOrderNumber)
|
||||||
|
</h4>
|
||||||
|
|
||||||
|
<DxAccordion Data="@SelectedOrder?.OrderItemDtos" Enabled="@((HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId > 0 && (LoggedInModel.IsRevisor || !(SelectedOrder?.IsComplete ?? false))))"
|
||||||
|
ExpandMode="AccordionExpandMode.SingleOrNone"
|
||||||
|
ExpandCollapseAction="AccordionExpandCollapseAction.ExpandButtonClick"
|
||||||
|
AnimationType="LayoutAnimationType.Slide">
|
||||||
|
<DataMappings>
|
||||||
|
<DxAccordionDataMapping Text=ProductName></DxAccordionDataMapping>
|
||||||
|
</DataMappings>
|
||||||
|
<ItemHeaderTextTemplate>
|
||||||
|
@{
|
||||||
|
if (context.Level == 0)
|
||||||
{
|
{
|
||||||
var localI = index + 1;
|
var cssClass = "text-danger";
|
||||||
var currentOrderItemPallet = selectedOrderItem!.OrderItemPallets![index];
|
|
||||||
|
|
||||||
<PalletItemComponent IsMeasurable="@selectedOrderItem.IsMeasurable"
|
var selectedOrderItemDto = (OrderItemDto)(context.DataItem);
|
||||||
MeasuringIndex="@localI"
|
var trayQuantity = selectedOrderItemDto.TrayQuantity; //selectedOrderItemDto.OrderItemPallets.Where(x => x.IsMeasured).Sum(x => x.TrayQuantity);
|
||||||
Editable="@(_enablePalletItems && !currentOrderItemPallet.IsAudited && !(SelectedOrder?.IsComplete ?? false))"
|
|
||||||
PalletItem="@currentOrderItemPallet"
|
var isValid = selectedOrderItemDto.IsValidMeasuringValues();
|
||||||
ProductId="@selectedOrderItem.ProductId"
|
var isValidAndMeasured = isValid && selectedOrderItemDto.IsMeasuredAndValid(); // && selectedOrderItemDto.;
|
||||||
MaxTrayQuantity="@selectedOrderItem.Quantity"
|
|
||||||
AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredOrderItemPallet"
|
if (isValid && !selectedOrderItemDto.AverageWeightIsValid) cssClass = "text-warning";
|
||||||
OnPalletItemSaveOrAuditClick="pallet => OnOrderItemSaveOrAuditClick(pallet, selectedOrderItem)"
|
else if (isValidAndMeasured) cssClass = "text-success";
|
||||||
OnPalletItemSaved="pallet => OnOrderItemPalletSaved(pallet, selectedOrderItem)"
|
else if (isValid) cssClass = string.Empty;
|
||||||
OnPalletItemValueChanged="pallet => OnOrderItemPalletValueChanged(pallet, selectedOrderItem)"
|
|
||||||
OnPalletItemAudited="pallet => OnOrderItemAudited(pallet, selectedOrderItem)">
|
var displayText = $"{selectedOrderItemDto.ProductName} - [{trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net.súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}]";
|
||||||
</PalletItemComponent>
|
if (selectedOrderItemDto.MeasuringStatus == MeasuringStatus.Audited) displayText = $"[{selectedOrderItemDto.MeasuringStatus}] " + displayText;
|
||||||
|
|
||||||
|
<h5 class="@cssClass">@(displayText)</h5>
|
||||||
}
|
}
|
||||||
</DxFormLayoutItem>
|
|
||||||
|
|
||||||
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="2" BeginRow="true">
|
|
||||||
<DxButton Text="Új sor" Click="() => AddNewPalletItemClick(selectedOrderItem)" CssClass="w-100"
|
|
||||||
Visible="@(!(SelectedOrder?.IsComplete ?? false))"
|
|
||||||
Enabled="@(selectedOrderItem.OrderItemPallets[^1].Id > 0)" />
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="3">
|
|
||||||
<DxButton Text="Utolsó sor törlése" Click="() => LastPalletItemDeleteClick(selectedOrderItem)" CssClass="w-100"
|
|
||||||
Visible="@(!(SelectedOrder?.IsComplete ?? false))"
|
|
||||||
Enabled="@(selectedOrderItem.OrderItemPallets.Count > 1 && selectedOrderItem.OrderItemPallets[^1].Id <= 0)" />
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
|
|
||||||
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="7" />
|
|
||||||
|
|
||||||
<DxFormLayoutItem Context="vfdfgfd" ColSpanMd="12" BeginRow="true">
|
|
||||||
<DxFormLayout CssClass="w-100" Context="dfcadsc">
|
|
||||||
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>TOTAL:</strong></DxFormLayoutItem>
|
|
||||||
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" />
|
|
||||||
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" />
|
|
||||||
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" />
|
|
||||||
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>Rekesz: @(selectedOrderItem.TrayQuantity) db</strong></DxFormLayoutItem>
|
|
||||||
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>Br: @(selectedOrderItem.GrossWeight) kg</strong></DxFormLayoutItem>
|
|
||||||
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>Net: @(selectedOrderItem.NetWeight) kg</strong></DxFormLayoutItem>
|
|
||||||
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" />
|
|
||||||
</DxFormLayout>
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
|
|
||||||
@if (!_errorText.IsNullOrWhiteSpace())
|
|
||||||
{
|
|
||||||
<DxFormLayoutItem Context="ctxFromLayoutItemError" ColSpanMd="12" BeginRow="true">
|
|
||||||
<text>HIBA! @_errorText</text>
|
|
||||||
</DxFormLayoutItem>
|
|
||||||
//_errorText = string.Empty;
|
|
||||||
}
|
}
|
||||||
</DxFormLayout>
|
</ItemHeaderTextTemplate>
|
||||||
<div style="margin-bottom: 20px;"></div>
|
<ItemContentTemplate>
|
||||||
}
|
@{
|
||||||
}
|
if (context.Level == 0)
|
||||||
</ItemContentTemplate>
|
{
|
||||||
</DxAccordion>
|
var selectedOrderItem = (OrderItemDto)(context.DataItem);
|
||||||
</div>
|
|
||||||
}
|
<DxFormLayout Context="ctxFormLayout" Data="@selectedOrderItem" CaptionPosition="CaptionPosition.Vertical"
|
||||||
|
CssClass="w-100">
|
||||||
|
<DxFormLayoutItem Context="ctxFormLayoutItem" ColSpanMd="12">
|
||||||
|
@for (var index = 0; index < (selectedOrderItem?.OrderItemPallets?.Count ?? 0); index++)
|
||||||
|
{
|
||||||
|
var localI = index + 1;
|
||||||
|
var currentOrderItemPallet = selectedOrderItem!.OrderItemPallets![index];
|
||||||
|
|
||||||
|
<PalletItemComponent IsMeasurable="@selectedOrderItem.IsMeasurable"
|
||||||
|
MeasuringIndex="@localI"
|
||||||
|
Editable="@(_enablePalletItems && !currentOrderItemPallet.IsAudited && !(SelectedOrder?.IsComplete ?? false))"
|
||||||
|
PalletItem="@currentOrderItemPallet"
|
||||||
|
ProductId="@selectedOrderItem.ProductId"
|
||||||
|
MaxTrayQuantity="@selectedOrderItem.Quantity"
|
||||||
|
AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredOrderItemPallet"
|
||||||
|
OnPalletItemSaveOrAuditClick="pallet => OnOrderItemSaveOrAuditClick(pallet, selectedOrderItem)"
|
||||||
|
OnPalletItemSaved="pallet => OnOrderItemPalletSaved(pallet, selectedOrderItem)"
|
||||||
|
OnPalletItemValueChanged="pallet => OnOrderItemPalletValueChanged(pallet, selectedOrderItem)"
|
||||||
|
OnPalletItemAudited="pallet => OnOrderItemAudited(pallet, selectedOrderItem)">
|
||||||
|
</PalletItemComponent>
|
||||||
|
}
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
|
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="2" BeginRow="true">
|
||||||
|
<DxButton Text="Új sor" Click="() => AddNewPalletItemClick(selectedOrderItem)" CssClass="w-100"
|
||||||
|
Visible="@(!(SelectedOrder?.IsComplete ?? false))"
|
||||||
|
Enabled="@(selectedOrderItem.OrderItemPallets[^1].Id > 0)" />
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="3">
|
||||||
|
<DxButton Text="Utolsó sor törlése" Click="() => LastPalletItemDeleteClick(selectedOrderItem)" CssClass="w-100"
|
||||||
|
Visible="@(!(SelectedOrder?.IsComplete ?? false))"
|
||||||
|
Enabled="@(selectedOrderItem.OrderItemPallets.Count > 1 && selectedOrderItem.OrderItemPallets[^1].Id <= 0)" />
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
|
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="7" />
|
||||||
|
|
||||||
|
<DxFormLayoutItem Context="vfdfgfd" ColSpanMd="12" BeginRow="true">
|
||||||
|
<DxFormLayout CssClass="w-100" Context="dfcadsc">
|
||||||
|
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>TOTAL:</strong></DxFormLayoutItem>
|
||||||
|
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" />
|
||||||
|
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" />
|
||||||
|
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" />
|
||||||
|
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>Rekesz: @(selectedOrderItem.TrayQuantity) db</strong></DxFormLayoutItem>
|
||||||
|
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>Br: @(selectedOrderItem.GrossWeight) kg</strong></DxFormLayoutItem>
|
||||||
|
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>Net: @(selectedOrderItem.NetWeight) kg</strong></DxFormLayoutItem>
|
||||||
|
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" />
|
||||||
|
</DxFormLayout>
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
|
||||||
|
@if (!_errorText.IsNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
<DxFormLayoutItem Context="ctxFromLayoutItemError" ColSpanMd="12" BeginRow="true">
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
<strong>⚠ Hiba:</strong> @_errorText
|
||||||
|
</div>
|
||||||
|
</DxFormLayoutItem>
|
||||||
|
}
|
||||||
|
</DxFormLayout>
|
||||||
|
<div class="mb-3"></div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</ItemContentTemplate>
|
||||||
|
</DxAccordion>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</DxTabPage>
|
||||||
|
</DxTabs>
|
||||||
</DxLoadingPanel>
|
</DxLoadingPanel>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,9 @@
|
||||||
<div id="app">Loading...</div>
|
<div id="app">Loading...</div>
|
||||||
|
|
||||||
<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/lazyContentObserver.js"></script>
|
<script src="_content/AyCode.Blazor.Components/js/mgCardView.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>
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js';
|
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js';
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue