diff --git a/NEW/src/JdeScoping.Client/Extensions/ViewModelMappingExtensions.cs b/NEW/src/JdeScoping.Client/Extensions/ViewModelMappingExtensions.cs
new file mode 100644
index 0000000..d8c1bd1
--- /dev/null
+++ b/NEW/src/JdeScoping.Client/Extensions/ViewModelMappingExtensions.cs
@@ -0,0 +1,140 @@
+using JdeScoping.Client.Models;
+using JdeScoping.Core.Models.Enums;
+using JdeScoping.Core.Models.Search;
+using CoreSearch = JdeScoping.Core.ViewModels.SearchViewModel;
+using CoreItem = JdeScoping.Core.ViewModels.ItemViewModel;
+using CoreWorkOrder = JdeScoping.Core.ViewModels.WorkOrderViewModel;
+using CoreProfitCenter = JdeScoping.Core.ViewModels.ProfitCenterViewModel;
+using CoreWorkCenter = JdeScoping.Core.ViewModels.WorkCenterViewModel;
+using CoreLot = JdeScoping.Core.ViewModels.LotViewModel;
+using CorePartOp = JdeScoping.Core.ViewModels.PartOperationViewModel;
+using CoreJdeUser = JdeScoping.Core.ViewModels.JdeUserViewModel;
+
+namespace JdeScoping.Client.Extensions;
+
+///
+/// Extension methods for mapping between Core and Client view models.
+///
+public static class ViewModelMappingExtensions
+{
+ ///
+ /// Maps Core SearchViewModel to Client SearchViewModel.
+ ///
+ public static SearchViewModel ToClient(this CoreSearch vm) => new()
+ {
+ Id = vm.Id,
+ Name = vm.Name,
+ UserName = vm.UserName,
+ Status = vm.Status.ToString(),
+ SubmitDt = vm.SubmitDt,
+ StartDt = vm.StartDt,
+ EndDt = vm.EndDt,
+ Criteria = vm.Criteria?.ToClientCriteria() ?? new()
+ };
+
+ ///
+ /// Maps Client SearchViewModel to Core SearchViewModel.
+ ///
+ public static CoreSearch ToCore(this SearchViewModel vm) => new()
+ {
+ Id = vm.Id,
+ Name = vm.Name,
+ UserName = vm.UserName,
+ Status = Enum.TryParse(vm.Status, out var status) ? status : SearchStatus.New,
+ SubmitDt = vm.SubmitDt,
+ StartDt = vm.StartDt,
+ EndDt = vm.EndDt,
+ Criteria = vm.Criteria.ToCoreCriteria()
+ };
+
+ ///
+ /// Maps Core SearchCriteria to Client SearchCriteriaViewModel.
+ /// Core uses primitive lists; Client uses full view model objects.
+ ///
+ public static SearchCriteriaViewModel ToClientCriteria(this SearchCriteria criteria)
+ {
+ var client = new SearchCriteriaViewModel
+ {
+ MinimumDt = criteria.MinimumDt,
+ MaximumDt = criteria.MaximumDt,
+ ExtractMisData = criteria.ExtractMisData
+ };
+
+ // Map work orders (Core has just numbers, Client has full WorkOrderViewModel)
+ client.WorkOrders = criteria.WorkOrderNumbers
+ .Select(n => new CoreWorkOrder { WorkOrderNumber = n })
+ .ToList();
+
+ // Map items (Core has just item number strings, Client has full ItemViewModel)
+ client.Items = criteria.ItemNumbers
+ .Select(n => new CoreItem { ItemNumber = n })
+ .ToList();
+
+ // Map profit centers (Core has just code strings, Client has full ProfitCenterViewModel)
+ client.ProfitCenters = criteria.ProfitCenters
+ .Select(pc => new CoreProfitCenter { Code = pc })
+ .ToList();
+
+ // Map work centers (Core has just code strings, Client has full WorkCenterViewModel)
+ client.WorkCenters = criteria.WorkCenters
+ .Select(wc => new CoreWorkCenter { Code = wc })
+ .ToList();
+
+ // Map operators (Core has just user ID strings, Client has full OperatorViewModel)
+ client.Operators = criteria.OperatorIDs
+ .Select(id => new OperatorViewModel { UserId = id })
+ .ToList();
+
+ // Map component lots (Core uses LotViewModel, Client uses ComponentLotViewModel)
+ client.ComponentLots = criteria.ComponentLotNumbers
+ .Select(l => new ComponentLotViewModel { LotNumber = l.LotNumber, ItemNumber = l.ItemNumber })
+ .ToList();
+
+ // Map part operations (both use PartOperationViewModel from Core)
+ client.PartOperations = criteria.PartOperations.ToList();
+
+ return client;
+ }
+
+ ///
+ /// Maps Client SearchCriteriaViewModel to Core SearchCriteria.
+ /// Client uses full view model objects; Core uses primitive lists.
+ ///
+ public static SearchCriteria ToCoreCriteria(this SearchCriteriaViewModel criteria) => new()
+ {
+ MinimumDt = criteria.MinimumDt,
+ MaximumDt = criteria.MaximumDt,
+ ExtractMisData = criteria.ExtractMisData,
+ WorkOrderNumbers = criteria.WorkOrders.Select(wo => wo.WorkOrderNumber).ToList(),
+ ItemNumbers = criteria.Items.Select(i => i.ItemNumber).ToList(),
+ ProfitCenters = criteria.ProfitCenters.Select(pc => pc.Code).ToList(),
+ WorkCenters = criteria.WorkCenters.Select(wc => wc.Code).ToList(),
+ OperatorIDs = criteria.Operators.Select(o => o.UserId).ToList(),
+ ComponentLotNumbers = criteria.ComponentLots
+ .Select(l => new CoreLot { LotNumber = l.LotNumber, ItemNumber = l.ItemNumber })
+ .ToList(),
+ PartOperations = criteria.PartOperations.ToList()
+ };
+
+ ///
+ /// Maps Core JdeUserViewModel to Client OperatorViewModel.
+ ///
+ public static OperatorViewModel ToClientOperator(this CoreJdeUser vm) => new()
+ {
+ AddressNumber = (int)vm.AddressNumber,
+ UserId = vm.UserId,
+ FullName = vm.FullName
+ };
+
+ ///
+ /// Maps a collection of Core SearchViewModels to Client SearchViewModels.
+ ///
+ public static List ToClientList(this IEnumerable list) =>
+ list.Select(s => s.ToClient()).ToList();
+
+ ///
+ /// Maps a collection of Core JdeUserViewModels to Client OperatorViewModels.
+ ///
+ public static List ToClientOperatorList(this IEnumerable list) =>
+ list.Select(u => u.ToClientOperator()).ToList();
+}