namespace QMSDAL.DTO { // ───────────────────────────────────────────────────────────────────────── // TMATRIX — Traceability Matrix Planning Header // // SQL columns (QMS.sql Section 2): // MATRIXID, MATRIXCODE, MATRIXMODE, BATCHASSIGNMODE, // ALLOCATIONID, MMDETAILID, ALLOCATIONSLNO, // SETFROM, SETTO, FGITEMID, FGSKUID, PROCESSID, PROCESSGROUPID, // OUTPUTLOTID, PROCESSLOTQTY, MATRIXSTATUS, SUPERSEDEDBYID, // ACTIVATEDON, REMARKS, VERSION, STATUS, SORTORDER, // CREATEDBYID, CREATEDON, MODIFIEDBYID, MODIFIEDON, // SOURCETYPE, TENANTID // // New FK columns to be added via ALTER: // BOMID → MBOM.BOMID // ───────────────────────────────────────────────────────────────────────── public class MatrixDTO { // ==================================================================== // PRIMARY KEY // ==================================================================== public int MatrixId { get; set; } // ==================================================================== // BUSINESS COLUMNS (TMATRIX) // ==================================================================== public string MatrixCode { get; set; } = string.Empty; /// 0=Product | 1=FGItem | 2=OpenMix public byte MatrixMode { get; set; } public string? MatrixModeName { get; set; } /// 0=Item | 1=Stage | 2=SKU public byte BatchAssignMode { get; set; } public string? BatchAssignModeName { get; set; } /// FK → MALLOCATION.ALLOCATIONID public int AllocationId { get; set; } public string? AllocationName { get; set; } /// /// FK → TMMDETAIL.DOCUMENTDETAILID /// -1 when forecast-based (no SO yet) /// public int MmDetailId { get; set; } = -1; public string? SoNumber { get; set; } /// Sequential matrix number per allocation — UNIQUE (ALLOCATIONID, ALLOCATIONSLNO) public short AllocationSlNo { get; set; } = 1; /// First set number in range (0 for OpenMix mode) public short SetFrom { get; set; } = 1; /// Last set number in range (0 for OpenMix mode) public short SetTo { get; set; } = 1; /// FK → MITEM.ITEMID — FGItem mode only; -1 otherwise public int FgItemId { get; set; } = -1; public string? FgItemCode { get; set; } public string? FgItemName { get; set; } /// FK → MSKU.SKUID — FGItem mode only; -1 otherwise public int FgSkuId { get; set; } = -1; public string? FgSkuCode { get; set; } public string? FgSkuName { get; set; } /// FK → MPROCESS.PROCESSID public int ProcessId { get; set; } = -1; public string? ProcessCode { get; set; } public string? ProcessName { get; set; } /// FK → MPROCESSGROUP.PROCESSGROUPID — OpenMix mode only; -1 otherwise public int ProcessGroupId { get; set; } = -1; public string? ProcessGroupCode { get; set; } public string? ProcessGroupName { get; set; } /// /// FK → TLOT.LOTID — OpenMix output lot /// -1 until post-production /// public int OutputLotId { get; set; } = -1; public string? OutputLotNumber { get; set; } /// Planned output quantity for OpenMix mode public decimal ProcessLotQty { get; set; } /// 0=Draft | 1=Active | 2=Superseded | 3=Deleted public byte MatrixStatus { get; set; } public string? MatrixStatusName { get; set; } /// FK → TMATRIX.MATRIXID (self-ref); -1 when not superseded public int SupersededById { get; set; } = -1; public string? SupersededByMatrixCode { get; set; } /// Set when MatrixStatus transitions to Active public DateTime? ActivatedOn { get; set; } public string? Remarks { get; set; } // ==================================================================== // VOUCHER NUMBER // ==================================================================== /// /// FK → MBIZTRANSACTIONTYPE.BIZTRANSACTIONTYPEID /// Drives MatrixCode auto-generation via VoucherNumberService. /// Pass 0 to use a manually supplied MatrixCode. /// public int BizTransactionTypeId { get; set; } // ==================================================================== // BOM LINK — new column BOMID added to TMATRIX via ALTER // ==================================================================== /// FK → MBOM.BOMID — BOM used to explode this matrix; -1 when not linked public int BomId { get; set; } = -1; // Display fields joined from MBOM public string? BomCode { get; set; } public string? BomName { get; set; } /// MBOM.BOMTYPE public byte? BomType { get; set; } /// MBOM.VERSIONNAME public string? BomVersionName { get; set; } /// MBOM.ISDEFAULTVERSION public bool? BomIsDefaultVersion { get; set; } /// Reference production qty — MBOM.PRODUCTIONQTY public decimal BomProductionQty { get; set; } /// FK → MROUTING.ROUTINGID — from MBOM.ROUTINGID public int RoutingId { get; set; } = -1; /// MBOM.FROMDATE public DateTime? BomFromDate { get; set; } /// MBOM.TODATE public DateTime? BomToDate { get; set; } // ==================================================================== // STANDARD FIELDS // ==================================================================== public short Version { get; set; } = 1; public byte Status { get; set; } = 1; public short SortOrder { get; set; } = 9999; public byte SourceType { get; set; } = 5; public int TenantId { get; set; } // ==================================================================== // AUDIT FIELDS // ==================================================================== public int CreatedById { get; set; } public string? CreatedByName { get; set; } public DateTime CreatedOn { get; set; } public int ModifiedById { get; set; } public string? ModifiedByName { get; set; } public DateTime ModifiedOn { get; set; } // ==================================================================== // CHILD COLLECTIONS // ==================================================================== /// TMATRIXINPUT child rows public List Inputs { get; set; } = new(); /// TMATRIXOUTPUT child rows public List Outputs { get; set; } = new(); // ==================================================================== // COMPUTED / VIEW FIELDS // ==================================================================== /// Total generated SET lots public int SetsCount { get; set; } /// Total generated FG serial lots public int SerialsCount { get; set; } } public class MatrixPicklistDTO { public int MatrixId { get; set; } public string MatrixCode { get; set; } = string.Empty; /// 0=Product | 1=FGItem | 2=OpenMix public byte MatrixMode { get; set; } /// 0=Item | 1=Stage | 2=SKU public byte BatchAssignMode { get; set; } /// 0=Draft | 1=Active | 2=Superseded | 3=Deleted public byte MatrixStatus { get; set; } public string? Remarks { get; set; } } }