using System; using System.Collections.Generic; namespace MMDAL.Query.Production { // Fixed, non-user-supplied SELECT/GROUP BY fragments for each RejectionReport grouping // dimension (GB4's Type parameter). RejectionReportDAL looks these up by the caller's // Type — it never builds these fragments from request input, so substituting them into // RejectionReportQB's {FIELDS} placeholder carries no injection risk. public static class RejectionReportDimensions { public readonly record struct Dimension(string Fields, string GroupBy); // ── SubType 0: Summary — GB4 Type 0,1,2,3,4,9 ──────────────────────── public static readonly Dictionary Summary = new() { [0] = new("B.ITEMID AS Id, C.ITEMCODE AS Code, C.ITEMNAME AS Name", "B.ITEMID, C.ITEMCODE, C.ITEMNAME"), [1] = new("B.SKUID AS Id, D.SKUCODE AS Code, D.SKUNAME AS Name", "B.SKUID, D.SKUCODE, D.SKUNAME"), [2] = new("H.PROCESSID AS Id, F.PROCESSCODE AS Code, F.PROCESSNAME AS Name", "H.PROCESSID, F.PROCESSCODE, F.PROCESSNAME"), [3] = new("A.WORKCENTERID AS Id, I.WORKCENTERCODE AS Code, I.WORKCENTERNAME AS Name", "A.WORKCENTERID, I.WORKCENTERCODE, I.WORKCENTERNAME"), [4] = new("A.INCHARGEID AS Id, J.EMPLOYEECODE AS Code, J.EMPLOYEENAME AS Name", "A.INCHARGEID, J.EMPLOYEECODE, J.EMPLOYEENAME"), // Type 9 (Total): no GROUP BY — GB4 aggregates the whole filtered set. [9] = new("-1 AS Id, 'Total' AS Code, 'Total' AS Name", ""), }; // ── SubType 1: Periodic — GB4 Type 0,1,2,3,4,9,10,11 (each carries the sub-period pair) ─ public static readonly Dictionary Periodic = new() { [0] = new("Q.SUBPERIODNAME AS SubPeriodName, Q.SUBPERIODFROMDATE AS SubPeriodFromDate, B.ITEMID AS Id, C.ITEMCODE AS Code, C.ITEMNAME AS Name", "B.ITEMID, C.ITEMCODE, C.ITEMNAME, Q.SUBPERIODNAME, Q.SUBPERIODFROMDATE"), [1] = new("Q.SUBPERIODNAME AS SubPeriodName, Q.SUBPERIODFROMDATE AS SubPeriodFromDate, B.SKUID AS Id, D.SKUCODE AS Code, D.SKUNAME AS Name", "B.SKUID, D.SKUCODE, D.SKUNAME, Q.SUBPERIODNAME, Q.SUBPERIODFROMDATE"), [2] = new("Q.SUBPERIODNAME AS SubPeriodName, Q.SUBPERIODFROMDATE AS SubPeriodFromDate, H.PROCESSID AS Id, F.PROCESSCODE AS Code, F.PROCESSNAME AS Name", "H.PROCESSID, F.PROCESSCODE, F.PROCESSNAME, Q.SUBPERIODNAME, Q.SUBPERIODFROMDATE"), [3] = new("Q.SUBPERIODNAME AS SubPeriodName, Q.SUBPERIODFROMDATE AS SubPeriodFromDate, A.WORKCENTERID AS Id, I.WORKCENTERCODE AS Code, I.WORKCENTERNAME AS Name", "A.WORKCENTERID, I.WORKCENTERCODE, I.WORKCENTERNAME, Q.SUBPERIODNAME, Q.SUBPERIODFROMDATE"), [4] = new("Q.SUBPERIODNAME AS SubPeriodName, Q.SUBPERIODFROMDATE AS SubPeriodFromDate, A.INCHARGEID AS Id, J.EMPLOYEECODE AS Code, J.EMPLOYEENAME AS Name", "A.INCHARGEID, J.EMPLOYEECODE, J.EMPLOYEENAME, Q.SUBPERIODNAME, Q.SUBPERIODFROMDATE"), [9] = new("Q.SUBPERIODNAME AS SubPeriodName, Q.SUBPERIODFROMDATE AS SubPeriodFromDate, -1 AS Id, 'Total' AS Code, 'Total' AS Name", "Q.SUBPERIODNAME, Q.SUBPERIODFROMDATE"), // Type 10 (Period-wise/Monthly): only the sub-period pair, no dimension. [10] = new("Q.SUBPERIODNAME AS SubPeriodName, Q.SUBPERIODFROMDATE AS SubPeriodFromDate", "Q.SUBPERIODNAME, Q.SUBPERIODFROMDATE"), // Type 11 (WO-wise detail): item + the originating work-order/production document. [11] = new("Q.SUBPERIODNAME AS SubPeriodName, Q.SUBPERIODFROMDATE AS SubPeriodFromDate, B.ITEMID AS Id, C.ITEMCODE AS Code, C.ITEMNAME AS Name, " + "H.INDENTNUMBER AS IndentNumber, H.INDENTDATE AS IndentDate, A.PRODUCTIONNUMBER AS ProductionNumber, A.PRODUCTIONDATE AS ProductionDate", "B.ITEMID, C.ITEMCODE, C.ITEMNAME, Q.SUBPERIODNAME, Q.SUBPERIODFROMDATE, A.PRODUCTIONDATE, A.PRODUCTIONNUMBER, H.INDENTNUMBER, H.INDENTDATE"), }; // SubType 2 (Item-Category) has exactly one supported dimension (GB4 Type 12) and its // SELECT/GROUP BY are fully static in RejectionReportQB.BASE_ITEMCATEGORY — no lookup needed. } }