Files
jdescopingtool/openspec/changes/archive/2026-01-01-implement-domain-models/tasks.md
T
Joseph Doherty 26ff8d9b4f Initial commit: JDE Scoping Tool migration project
Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
2026-01-02 07:43:29 -05:00

12 KiB

Tasks: Implement Domain Models

Phase 1: Foundation (Enums, Interfaces, Helpers)

  • Create JdeDateConverter helper class

    • Location: JdeScoping.Core/Helpers/JdeDateConverter.cs
    • Implements: CYYDDD date format conversion, HHMMSS time conversion
    • Validation: Unit tests for valid dates, zero dates, invalid formats all pass
  • Create SearchStatus enum

    • Location: JdeScoping.Core/Models/Enums/SearchStatus.cs
    • Values: New (0), Submitted (1), Started (2), Ended (3), Error (4)
    • Validation: Has [JsonConverter(typeof(JsonStringEnumConverter))] attribute
  • Create UpdateTypes enum

    • Location: JdeScoping.Core/Models/Enums/UpdateTypes.cs
    • Values: Hourly (1), Daily (2), Mass (3)
    • Validation: Has [JsonConverter(typeof(JsonStringEnumConverter))] attribute
  • Create IBusinessUnit interface

    • Location: JdeScoping.Core/Interfaces/IBusinessUnit.cs
    • Properties: Code, Description, LastUpdateDT
    • Validation: Compiles, used by WorkCenter and ProfitCenter
  • Replace Search entity

    • Location: JdeScoping.Core/Models/Search.cs
    • Properties: ID, UserName, Name, Status, SubmitDT, StartDT, EndDT, CriteriaJSON, Criteria, Results
    • Validation: Matches spec requirement, Results is byte[]?
  • Create SearchCriteria entity

    • Location: JdeScoping.Core/Models/SearchCriteria.cs
    • Properties: MinimumDT, MaximumDT, WorkOrderNumbers, ItemNumbers, ProfitCenters, WorkCenters, OperatorIDs, ComponentLotNumbers, ExtractMisData, PartOperations
    • Validation: All list properties initialized to empty lists
  • Create SearchUpdate entity

    • Location: JdeScoping.Core/Models/SearchUpdate.cs
    • Properties: ID, UserName, Name, Status, SubmitDT, StartDT, EndDT, Timestamp
    • Validation: Constructor accepts Search, sets Timestamp to DateTime.UtcNow
  • Create StatusUpdate entity

    • Location: JdeScoping.Core/Models/StatusUpdate.cs
    • Properties: Message, Timestamp
    • Validation: Compiles, simple message DTO

Phase 3: Work Order Entities

  • Replace WorkOrder entity

    • Location: JdeScoping.Core/Models/WorkOrder.cs
    • Properties: WorkOrderNumber, BranchCode, LotNumber?, ItemNumber, ShortItemNumber, ParentWorkOrderNumber?, OrderQuantity, HeldQuantity, ShippedQuantity, StatusCode, StatusCodeUpdateDT, IssueDate, StartDate, RoutingType, LastUpdateDT
    • Validation: Private JDE date fields, computed LastUpdateDT, nullable annotations
  • Create WorkOrderStep entity

    • Location: JdeScoping.Core/Models/WorkOrderStep.cs
    • Properties: WorkOrderNumber, BranchCode, WorkCenterCode, StepNumber, StepDescription?, FunctionOperationDescription?, StepTypeCode, StartDT, EndDT, FunctionCode, ScrappedQuantity, LastUpdateDT
    • Validation: Nullable annotations on optional fields
  • Create WorkOrderTime entity

    • Location: JdeScoping.Core/Models/WorkOrderTime.cs
    • Properties: UniqueID, WorkOrderNumber, BranchCode, WorkCenterCode, StepNumber, AddressNumber, GlDate, LastUpdateDT
    • Validation: Matches F31122 table structure
  • Create WorkOrderComponent entity

    • Location: JdeScoping.Core/Models/WorkOrderComponent.cs
    • Properties: UniqueID, WorkOrderNumber, LotNumber?, BranchCode, ShortItemNumber?, Quantity, LastUpdateDT
    • Validation: ShortItemNumber and LotNumber are nullable
  • Create WorkOrderRouting entity

    • Location: JdeScoping.Core/Models/WorkOrderRouting.cs
    • Properties: UserID, BatchNumber, TransactionNumber, LineNumber, StepNumber, WorkCenterCode, WorkOrderNumber, RoutingType, BranchCode, StepDescription?, FunctionCode, TransactionDate, LastUpdateDT
    • Validation: Compiles, nullable StepDescription

Phase 4: Lot Entities

  • Replace Lot entity

    • Location: JdeScoping.Core/Models/Lot.cs
    • Properties: LotNumber, BranchCode, ShortItemNumber, ItemNumber, SupplierCode, StatusCode (char), Memo1?, Memo2?, Memo3?, LastUpdateDT
    • Validation: StatusCode is char type, nullable memo fields
  • Replace LotUsage entity

    • Location: JdeScoping.Core/Models/LotUsage.cs
    • Properties: UniqueID, WorkOrderNumber, LotNumber, BranchCode, ShortItemNumber, Quantity, LastUpdateDT
    • Validation: Cardex entry structure matches spec
  • Create LotLocation entity

    • Location: JdeScoping.Core/Models/LotLocation.cs
    • Properties: LotNumber, ShortItemNumber, BranchCode, Location, LastUpdateDT
    • Validation: Compiles with all properties

Phase 5: Reference Entities

  • Replace Item entity

    • Location: JdeScoping.Core/Models/Item.cs
    • Properties: ShortItemNumber, ItemNumber, Description, PlanningFamily?, StockingType?, LastUpdateDT
    • Validation: Dual identifier pattern (ShortItemNumber + ItemNumber)
  • Replace WorkCenter entity

    • Location: JdeScoping.Core/Models/WorkCenter.cs
    • Properties: Code, Description, LastUpdateDT
    • Validation: Implements IBusinessUnit interface
  • Create ProfitCenter entity

    • Location: JdeScoping.Core/Models/ProfitCenter.cs
    • Properties: Code, Description, LastUpdateDT
    • Validation: Implements IBusinessUnit interface
  • Create Branch entity

    • Location: JdeScoping.Core/Models/Branch.cs
    • Properties: Code, Description, LastUpdateDT
    • Validation: Compiles, matches spec
  • Replace JdeUser entity

    • Location: JdeScoping.Core/Models/JdeUser.cs
    • Properties: AddressNumber, UserID, FullName, LastUpdateDT
    • Validation: AddressNumber is long, matches spec
  • Create StatusCode entity

    • Location: JdeScoping.Core/Models/StatusCode.cs
    • Properties: Code, Description, LastUpdateDT
    • Validation: JDE work order status lookup
  • Create FunctionCode entity

    • Location: JdeScoping.Core/Models/FunctionCode.cs
    • Properties: Code, Description, LastUpdateDT
    • Validation: JDE function code lookup

Phase 6: Config and Mapping Entities

  • Create DataUpdate entity

    • Location: JdeScoping.Core/Models/DataUpdate.cs
    • Properties: ID, SourceSystem, SourceData, TableName, StartDT, EndDT, UpdateType, WasSuccessful, NumberRecords
    • Validation: UpdateType uses UpdateTypes enum
  • Create OrgHierarchy entity

    • Location: JdeScoping.Core/Models/OrgHierarchy.cs
    • Properties: WorkCenterCode, BranchCode, ProfitCenterCode, LastUpdateDT
    • Validation: Profit center to work center mapping
  • Create RouteMaster entity

    • Location: JdeScoping.Core/Models/RouteMaster.cs
    • Properties: BranchCode, ItemNumber, RoutingType, SequenceNumber, FunctionCode, WorkCenterCode, StartDate, EndDate?, LastUpdateDT
    • Validation: EndDate is nullable

Phase 7: CMS and External Entities

  • Create MisData entity

    • Location: JdeScoping.Core/Models/MisData.cs
    • Properties: ItemNumber, BranchCode, SequenceNumber, MisNumber, RevID?, CharNumber, TestDescription?, SamplingType?, SamplingValue?, ToolsGauges?, WorkInstructions?, Status, ReleaseDate?
    • Validation: Many nullable string fields per spec
  • Create POReceiver entity

    • Location: JdeScoping.Core/Models/POReceiver.cs
    • Properties: OrderNumber, OrderCompany, OrderSuffix, LineNumber, NumberOfLines, InvoiceNumber, BranchCode, LotNumber?, ShortItemNumber (string!), DateReceived, Subledger?, QtyReceived, LastUpdateDT
    • Validation: ShortItemNumber is string (intentional legacy quirk)
  • Create POInspect entity

    • Location: JdeScoping.Core/Models/POInspect.cs
    • Properties: UniqueID, OrderNumber, OrderCompany, LineNumber, InvoiceNumber, LotNumber?, ShortItemNumber, LastUpdateDT
    • Validation: Compiles with nullable LotNumber
  • Create DcsLot entity

    • Location: JdeScoping.Core/Models/DcsLot.cs
    • Properties: ItemNumber, LotNumber, LotSuffix?, LastUpdateDT
    • Validation: Simple DCS lot record
  • Create CamstarMO entity

    • Location: JdeScoping.Core/Models/CamstarMO.cs
    • Properties: MONumber, LastUpdateDT
    • Validation: Simple Camstar manufacturing order

Phase 8: Auth and User Entities

  • Create UserInfo entity
    • Location: JdeScoping.Core/Models/UserInfo.cs
    • Properties: Username, FirstName?, LastName?, DisplayName (computed), Title?, EmailAddress?
    • Validation: DisplayName computed property works (fallback to Username)

Phase 9: Query Support Entities

  • Create QueryTypes entity

    • Location: JdeScoping.Core/Models/QueryTypes.cs
    • Properties: Code, Name, OrderIndex, filter flags (TimeSpanFilter, WorkOrderFilter, etc.)
    • Validation: Static dictionary pattern, Identify() method stub
  • Create TableSpec entity

    • Location: JdeScoping.Core/Models/TableSpec.cs
    • Properties: Name, TempTableName (computed), Columns, PrimaryKey
    • Validation: Constructor initializes lists, stub methods exist
  • Create ColumnSpec entity

    • Location: JdeScoping.Core/Models/ColumnSpec.cs
    • Properties: Name, Definition
    • Validation: Simple column specification

Phase 10: ViewModels

  • Create WorkOrderViewModel

    • Location: JdeScoping.Core/ViewModels/WorkOrderViewModel.cs
    • Properties: WorkOrderNumber, ItemNumber
    • Validation: Minimal projection DTO
  • Create LotViewModel

    • Location: JdeScoping.Core/ViewModels/LotViewModel.cs
    • Properties: LotNumber, ItemNumber
    • Validation: Used by SearchCriteria.ComponentLotNumbers
  • Create ItemViewModel

    • Location: JdeScoping.Core/ViewModels/ItemViewModel.cs
    • Properties: ItemNumber, Description
    • Validation: Minimal projection DTO
  • Create WorkCenterViewModel

    • Location: JdeScoping.Core/ViewModels/WorkCenterViewModel.cs
    • Properties: Code, Description
    • Validation: Minimal projection DTO
  • Create ProfitCenterViewModel

    • Location: JdeScoping.Core/ViewModels/ProfitCenterViewModel.cs
    • Properties: Code, Description
    • Validation: Minimal projection DTO
  • Create JdeUserViewModel

    • Location: JdeScoping.Core/ViewModels/JdeUserViewModel.cs
    • Properties: AddressNumber, UserID, FullName
    • Validation: Minimal projection DTO
  • Create PartOperationViewModel

    • Location: JdeScoping.Core/ViewModels/PartOperationViewModel.cs
    • Properties: ItemNumber, OperationNumber, MisNumber, Revision
    • Validation: Used by SearchCriteria.PartOperations

Phase 11: Extension Methods

  • Create WorkOrderExtensions

    • Location: JdeScoping.Core/Extensions/WorkOrderExtensions.cs
    • Method: ToViewModel() -> WorkOrderViewModel
    • Validation: Extension method on WorkOrder compiles and works
  • Create LotExtensions

    • Location: JdeScoping.Core/Extensions/LotExtensions.cs
    • Method: ToViewModel() -> LotViewModel
    • Validation: Extension method on Lot compiles and works
  • Create ItemExtensions

    • Location: JdeScoping.Core/Extensions/ItemExtensions.cs
    • Method: ToViewModel() -> ItemViewModel
    • Validation: Extension method on Item compiles and works
  • Create WorkCenterExtensions

    • Location: JdeScoping.Core/Extensions/WorkCenterExtensions.cs
    • Method: ToViewModel() -> WorkCenterViewModel
    • Validation: Extension method on WorkCenter compiles and works
  • Create ProfitCenterExtensions

    • Location: JdeScoping.Core/Extensions/ProfitCenterExtensions.cs
    • Method: ToViewModel() -> ProfitCenterViewModel
    • Validation: Extension method on ProfitCenter compiles and works
  • Create JdeUserExtensions

    • Location: JdeScoping.Core/Extensions/JdeUserExtensions.cs
    • Method: ToViewModel() -> JdeUserViewModel
    • Validation: Extension method on JdeUser compiles and works

Phase 12: Verification

  • Verify solution builds

    • Command: dotnet build NEW/src/JdeScoping.Core/JdeScoping.Core.csproj
    • Validation: Build succeeds with no errors
  • Verify nullable reference types

    • Validation: All nullable properties use ? annotation, no compiler warnings
  • Verify JSON serialization

    • Validation: SearchStatus and UpdateTypes serialize as strings, not integers
  • Run OpenSpec validation

    • Command: openspec validate implement-domain-models --strict
    • Validation: All requirements marked as covered
  • Cross-reference with spec

    • Validation: All 52 requirements from domain-models/spec.md implemented