namespace QMSDAL.DTO
{
// ─────────────────────────────────────────────────────────────────────────
// TMATRIXOUTPUT — Traceability Output Lines (SET / FGSerial / MixOutputLot)
//
// SQL columns (QMS.sql Section 3):
// MATRIXOUTPUTID, MATRIXID, SLNO,
// OUTPUTLEVEL, ITEMID, SKUID,
// LOTID, LOTQUANTITY, TENANTID
//
// New FK columns to be added via ALTER:
// BOMLINEID → MBOMDETAIL.BOMLINEID (for QtyPer and BOM traceability)
// LOTDETAILID → TLOTDETAIL.LOTDETAILID (populated after output posting)
//
// SetNumber rule:
// The set number for each output row is stored in TLOT (new column SETNUMBER
// on TLOT), NOT in TMATRIXOUTPUT. Read via TLOT join on LOTID.
// ─────────────────────────────────────────────────────────────────────────
public class MatrixOutputDTO
{
// ====================================================================
// PRIMARY / LINKING KEYS
// ====================================================================
public int MatrixOutputId { get; set; }
/// FK → TMATRIX.MATRIXID
public int MatrixId { get; set; }
public short SlNo { get; set; }
// ====================================================================
// OUTPUT CLASSIFICATION (TMATRIXOUTPUT.OUTPUTLEVEL)
// ====================================================================
/// 0=Set | 1=FGSerial | 2=MixOutputLot
public byte OutputLevel { get; set; }
public string? OutputLevelName { get; set; }
// ====================================================================
// ITEM / SKU (TMATRIXOUTPUT.ITEMID / SKUID)
// ====================================================================
/// FK → MITEM.ITEMID
public int ItemId { get; set; }
public string? ItemCode { get; set; }
public string? ItemName { get; set; }
/// FK → MSKU.SKUID
public int SkuId { get; set; }
public string? SkuCode { get; set; }
public string? SkuName { get; set; }
// ====================================================================
// BOM DETAIL LINK — new column BOMLINEID added to TMATRIXOUTPUT
// ====================================================================
/// FK → MBOMDETAIL.BOMLINEID; -1 when not BOM-linked
public int BomLineId { get; set; } = -1;
// Display fields joined from MBOMDETAIL / MBOM
/// FK → MBOM.BOMID — parent BOM header
public int BomId { get; set; } = -1;
public string? BomCode { get; set; }
public string? BomName { get; set; }
///
/// Quantity per production unit — MBOMDETAIL.QUANTITY
/// Used to derive the planned output qty for each SET
///
public decimal QtyPer { get; set; }
/// MBOMDETAIL.WASTEPERCENTAGE
public decimal WastePercentage { get; set; }
/// FK → MUOM.UOMID — from MBOMDETAIL.UOMID
public int UomId { get; set; } = -1;
public string? UomName { get; set; }
// ====================================================================
// LOT (TMATRIXOUTPUT.LOTID → TLOT)
// Represents SET lot / FGSerial lot / MixOutputLot
// ====================================================================
/// FK → TLOT.LOTID
public int LotId { get; set; } = -1;
// Display fields joined from TLOT
public string? LotNumber { get; set; }
/// TLOT.LOTDATE
public DateTime? LotDate { get; set; }
/// TLOT.LOTEXPIRYDATE
public DateTime? LotExpiryDate { get; set; }
/// TLOT.LOTTYPEID
public int LotTypeId { get; set; } = -1;
/// TLOT.STATUS
public byte LotStatus { get; set; }
/// TLOT.MRPRATE
public decimal MrpRate { get; set; }
/// TLOT.ITEMPOSTEDCOST
public decimal ItemPostedCost { get; set; }
///
/// Set number stored in TLOT.SETNUMBER (new column on TLOT).
/// Sequential within the matrix (SETFROM … SETTO range).
/// 0 for FGSerial and MixOutputLot rows.
///
public int SetNumber { get; set; }
// ====================================================================
// QUANTITY (TMATRIXOUTPUT.LOTQUANTITY)
// ====================================================================
/// 1 for FGSerial | N for Set | actual qty for MixOutputLot
public decimal LotQuantity { get; set; } = 1;
/// Total required output quantity for the set range — same as LotQuantity × SetCount
public decimal RequiredQty { get; set; }
/// Quantity per production unit — MBOMDETAIL.QUANTITY
public decimal QuantityPer { get; set; }
/// Unit of measure code — MUOM.UOMCODE via MITEM.STOCKUOMID
public string? UomCode { get; set; }
// ====================================================================
// LOT DETAIL LINK — new column LOTDETAILID added to TMATRIXOUTPUT
// Populated after the output lot is posted to TLOTDETAIL
// ====================================================================
/// FK → TLOTDETAIL.LOTDETAILID; -1 before output is posted
public int LotDetailId { get; set; } = -1;
// Display fields joined from TLOTDETAIL
/// TLOTDETAIL.OUID
public int OuId { get; set; } = -1;
/// TLOTDETAIL.STOREID
public int StoreId { get; set; } = -1;
public string? StoreName { get; set; }
/// TLOTDETAIL.BINID
public int BinId { get; set; } = -1;
public string? BinName { get; set; }
/// TLOTDETAIL.LOCATIONTYPE
public byte? LocationType { get; set; }
/// TLOTDETAIL.PARTYBRANCHID
public int PartyBranchId { get; set; } = -1;
/// TLOTDETAIL.GOODQUANTITY
public decimal GoodQuantity { get; set; }
/// TLOTDETAIL.REJECTEDQUANTITY
public decimal RejectedQuantity { get; set; }
/// TLOTDETAIL.REWORKQUANTITY
public decimal ReworkQuantity { get; set; }
/// TLOTDETAIL.OTHERQUANTITY
public decimal OtherQuantity { get; set; }
/// TLOTDETAIL.PLANNEDQUANTITY
public decimal PlannedQuantity { get; set; }
/// TLOTDETAIL.REFERENCENUMBER
public string? ReferenceNumber { get; set; }
/// TLOTDETAIL.REFERENCEDATE
public DateTime? ReferenceDate { get; set; }
/// TLOTDETAIL.STOCKLEDGERNUMBER
public string? StockLedgerNumber { get; set; }
/// TLOTDETAIL.STOCKLEDGERDATE
public DateTime? StockLedgerDate { get; set; }
/// TLOTDETAIL.STOCKPOSTTYPE
public byte? StockPostType { get; set; }
// ====================================================================
// STANDARD FIELDS
// ====================================================================
public int TenantId { get; set; }
public DateTime? CreatedOn { get; set; }
public DateTime? ModifiedOn { get; set; }
}
}