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; }
}
}