namespace MarketingDAL.DTO.CustomerProductMatrixCell; /// /// MarketMind AI execution layer — a CustomerProductMatrixCell (MCUSTPRODMATRIXCELL): the "one /// page business model" synthesis table, one row per (ABCDCategory, ProductLabel) intersection. /// and are validated in /// CustomerProductMatrixCellBLL against ICPBLL.ComputeABCDCategory's and /// ProductBLL.ComputeProductLabel's exact derived string sets (not re-declared as byte enums — /// per this task's brief, these must match those two BLLs' output strings verbatim). /// is NOT a stored column — see /// CustomerProductMatrixCellBLL.GetCustomerProductMatrixCell for how it's computed on read from /// the tenant's current BusinessAspirationGoal (null if none exists yet). /// public class CustomerProductMatrixCellDTO { #region CustomerProductMatrixCell public int CustomerProductMatrixCellId { get; set; } public string CellCode { get; set; } = string.Empty; public string CellName { get; set; } = string.Empty; /// Must be one of: Amazing, Breadwinning, Convenience, Dangerous (ICPBLL.ComputeABCDCategory's output set). public string ABCDCategory { get; set; } = string.Empty; /// Must be one of: Easy-to-Buy, Primary, High-Value, Time-Waster (ProductBLL.ComputeProductLabel's output set). public string ProductLabel { get; set; } = string.Empty; public decimal RevenueTargetPercent { get; set; } public string? Remarks { get; set; } /// /// Computed, read-only, NOT persisted — RevenueTargetPercent / 100 * the tenant's current /// BusinessAspirationGoal.AnnualRevenueTarget. Null when no BusinessAspirationGoal row exists /// yet (never throws for that case). Populated only by GetCustomerProductMatrixCell's read /// path — always null immediately after Save/Update since those don't recompute it. /// public decimal? RevenueTargetAmount { get; set; } #endregion #region Base public int CreatedById { get; set; } public DateTime CreatedOn { get; set; } public string? CreatedByName { get; set; } public int ModifiedById { get; set; } public DateTime ModifiedOn { get; set; } public string? ModifiedByName { get; set; } #endregion #region Standard public short SortOrder { get; set; } public byte Status { get; set; } public short Version { get; set; } public int TenantId { get; set; } #endregion }