diff --git a/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor b/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor
new file mode 100644
index 0000000..d88359b
--- /dev/null
+++ b/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor
@@ -0,0 +1,413 @@
+@page "/Warehouse/PackList/{WzHeader:guid}/Simple"
+@using OrdersManagement.Models
+@using Syncfusion.Blazor.Cards
+@using Syncfusion.Blazor.Grids
+@using SytelineSaAppEfDataModel.Dtos
+@using Syncfusion.Blazor.Navigations
+@using Syncfusion.Blazor.Popups
+@using Syncfusion.Blazor.Inputs
+@using FilterType = Syncfusion.Blazor.Grids.FilterType
+
+@inject WarehouseService WarehouseService
+
+
+
+
+ Packing List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @if (_isValid)
+ {
+ Packing List został wygenerowany i wysłany!
+ }
+ else if (string.IsNullOrWhiteSpace(EmailAddresses))
+ {
+ Błąd: Proszę wprowadzić przynajmniej jeden ADRES EMAIL do wysyłki raportu!
+ }
+ else if (!_isValid)
+ {
+ Błąd: Nie Wszystkie linie mają wypełniony NUMER PALETY.
Packing List nie zostanie
+ wygenerowany!
+ }
+
+
+
+
+
+
+
+
+
+
+ Błąd skanowania! Wystąpił jeden z wyjątków (Zeskanowana wartość '@ScannedValue'):
+
+ Zeskanowano niepoprawny Numer Partii SL (nieistniejący w tabeli)
+ Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od
+ @($"{DateTime.Now.Year - 2000}X"))
+ Numer Palety nie jest większy niż 0 (aktualnie wybrany numer palety:
+ '@PalletNumber')
+
+
+
+
+
+
+
+
+
+
+
+ Błąd skanowania! Wybierz NUMER PALETY większy niż 0 (Aktualnie '@PalletNumber'):
+
+
+
+
+
+
+
+
+ FA Krosno Manager © @(DateTime.Now.Year)
+
+
+
+
+@code {
+ [Parameter] public Guid WzHeader { get; set; }
+
+ private List WzRowsMeyle { get; set; } = new();
+ private IDictionary> TransactionModelsByPartNumber { get; set; } = new Dictionary>();
+ private List ChangedRecords = new();
+ private WzHeaderDto _wzHeader;
+ private SfTextBox _scanner;
+
+ private string ItemNumber { get; set; } = string.Empty;
+ private string Qty { get; set; } = "0";
+ private string PalletNumberOutput { get; set; } = "0";
+ private string PartNumberSl { get; set; } = string.Empty;
+ private string PartNumberMeyle { get; set; } = string.Empty;
+
+ private string WzNumber { get; set; } = string.Empty;
+
+ private WzRowMeyleDto? SelectedRow { get; set; }
+ private List SelectedRows { get; set; } = new();
+
+ private bool _isValid;
+
+ private bool Visibility { get; set; }
+ private bool VisibilityValidation { get; set; }
+ private bool VisibilityLineSplitter { get; set; }
+ public bool VisibilityPalletNumber { get; set; }
+
+ private string? EmailAddresses { get; set; } = string.Empty;
+ private string PalletNumber { get; set; } = "0";
+
+ private string LastScannedValue { get; set; } = string.Empty;
+ private string ScannedValue { get; set; } = string.Empty;
+
+ private void HideModal()
+ {
+ Visibility = false;
+ VisibilityValidation = false;
+ VisibilityLineSplitter = false;
+ VisibilityPalletNumber = false;
+
+ LastScannedValue = ScannedValue;
+ ScannedValue = string.Empty;
+
+ _scanner.FocusAsync();
+ }
+
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ if (firstRender)
+ {
+ _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader);
+ WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList();
+
+ TransactionModelsByPartNumber = await GetTransactionModels();
+
+ EmailAddresses = _wzHeader.EmailAddresses;
+
+ WzNumber = _wzHeader.WzNumbers ?? string.Empty;
+
+ await _scanner.FocusAsync();
+ StateHasChanged();
+ }
+ }
+
+ private async Task SaveChanges()
+ {
+ if (!string.IsNullOrWhiteSpace(EmailAddresses))
+ {
+ await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses);
+ }
+
+ if (ChangedRecords.Any())
+ {
+ await UpdateRows(ChangedRecords);
+ }
+ }
+
+ private async Task OnBatchSave(BeforeBatchSaveArgs obj)
+ {
+ var changes = obj.BatchChanges;
+ List changedRecords = changes.ChangedRecords;
+
+ if (!changedRecords.Any()) return;
+
+ await UpdateRows(changedRecords);
+ }
+
+ private async Task ExportXls()
+ {
+ int count = WzRowsMeyle.Count(x => x.PalletNumber == null);
+
+ _isValid = count == 0;
+ _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses);
+
+ if (_isValid)
+ {
+ await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses);
+ await WarehouseService.GenerateXlsForMeyleAsync(WzHeader);
+ }
+
+ Visibility = true;
+ }
+
+ private void ScanValue(ChangedEventArgs obj)
+ {
+ if (string.IsNullOrWhiteSpace(obj.Value)) return;
+ if (int.Parse(PalletNumber) <= 0)
+ {
+ VisibilityPalletNumber = true;
+ return;
+ }
+
+ ScannedValue = obj.Value.Trim();
+
+ StateHasChanged();
+
+ TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber);
+ TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault();
+
+ if (materialTransactionByPartNumber == null && IsValidScannedValue(obj.Value))
+ {
+ FillMeylePartNumber(ScannedValue);
+
+ LastScannedValue = ScannedValue;
+ ScannedValue = string.Empty;
+
+ return;
+ }
+
+ if (materialTransactionByPartNumber != null)
+ {
+ FillFaPartNumberAndPalletNumber(materialTransactionByPartNumber, obj.Value.Trim());
+ }
+
+ if (materialTransactionByPartNumber == null)
+ {
+ ShowValidationMessage();
+ return;
+ }
+
+ LastScannedValue = ScannedValue;
+ ScannedValue = string.Empty;
+
+ _scanner.FocusAsync();
+ }
+
+ private bool IsValidScannedValue(string scannedValue)
+ {
+ int year = DateTime.Now.Year - 2000;
+
+ string format = $"{year}X";
+
+ return scannedValue.StartsWith(format);
+ }
+
+ private async Task FillMeylePartNumber(string scannedValue)
+ {
+ if (SelectedRow != null && !SelectedRows.Any())
+ {
+ SelectedRow.PartNumber = scannedValue;
+ ChangedRecords.Add(SelectedRow);
+
+ PartNumberMeyle = scannedValue;
+ }
+
+ foreach (WzRowMeyleDto wzRowMeyleDto in SelectedRows)
+ {
+ wzRowMeyleDto.PartNumber = scannedValue;
+ ChangedRecords.Add(wzRowMeyleDto);
+ }
+
+ await SaveChanges();
+
+ ChangedRecords.Clear();
+ SelectedRows.Clear();
+
+ await _scanner.FocusAsync();
+ }
+
+ private async Task FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue)
+ {
+ await InvokeAsync(StateHasChanged);
+
+ int palletNumber = int.Parse(PalletNumber);
+ int rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity);
+
+ switch (rowIndex)
+ {
+ case -1:
+ {
+ SelectedRows = WzRowsMeyle.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList();
+
+ if (SelectedRows.Count == 0)
+ {
+ ShowValidationMessage();
+ return;
+ }
+
+ var validCombinations = FindCombinations(SelectedRows, (int?)materialTransactionByPartNumber.Quantity ?? 0);
+
+ foreach (var combination in validCombinations)
+ {
+ foreach (var record in combination)
+ {
+ record.PartNumberSl = scannedValue;
+ record.PalletNumber = palletNumber;
+ ChangedRecords.Add(record);
+ }
+ }
+
+ SelectedRows.Clear();
+ SelectedRows.AddRange(ChangedRecords);
+
+ SelectedRow = SelectedRows.FirstOrDefault();
+
+ break;
+ }
+ default:
+ {
+ SelectedRow = WzRowsMeyle[rowIndex];
+
+ SelectedRow.PartNumberSl = scannedValue;
+ SelectedRow.PalletNumber = palletNumber;
+
+ if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber))
+ {
+ ChangedRecords.Add(SelectedRow);
+ }
+
+ break;
+ }
+ }
+
+ PartNumberSl = SelectedRow?.PartNumberSl ?? string.Empty;
+ PalletNumberOutput = SelectedRow?.PalletNumber.ToString() ?? "0";
+ ItemNumber = SelectedRow?.FaIndex ?? string.Empty;
+ Qty = SelectedRow?.Quantity.ToString() ?? "0";
+
+ await SaveChanges();
+ ChangedRecords.Clear();
+ await _scanner.FocusAsync();
+ }
+
+ private void ShowValidationMessage()
+ {
+ VisibilityValidation = true;
+
+ ChangedRecords.Clear();
+ _scanner.FocusAsync();
+ }
+
+ private async Task>> GetTransactionModels()
+ {
+ return await WarehouseService.GetTransactionsModels();
+ }
+
+ private async Task UpdateRows(IList changedRecords)
+ {
+ await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords);
+
+ WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList();
+ await InvokeAsync(StateHasChanged);
+ }
+
+ private List> FindCombinations(List records, int targetSum)
+ {
+ var result = new List>();
+ var currentCombination = new List();
+
+ void Backtrack(int start, int currentSum)
+ {
+ if (currentSum == targetSum)
+ {
+ result.Add(new List(currentCombination));
+ return;
+ }
+
+ for (int i = start; i < records.Count; i++)
+ {
+ if (currentSum + records[i].Quantity <= targetSum)
+ {
+ currentCombination.Add(records[i]);
+ Backtrack(i + 1, currentSum + records[i].Quantity ?? 0);
+ currentCombination.RemoveAt(currentCombination.Count - 1);
+ }
+ }
+ }
+
+ Backtrack(0, 0);
+ return result;
+ }
+}
\ No newline at end of file