namespace AccountsDAL.CustomCode.AccountReports { // Maps AccountReportCriteria.GroupType to the SELECT/GROUP BY column list for // AccountOutstandingReportsQB.GET_OUTSTANDING_SUMMARY's {GroupBySelect}/{GroupByColumns} // placeholders. Allow-listed by GroupType value (never string-interpolated from caller input) — // matches AccountReportSortBuilder's allow-list pattern for the same reason. public static class AccountOutstandingGroupByBuilder { // GroupType: Account(0, default)/AccountGroup(1)/ControlAccount(2)/InCharge(3)/PriceCategory(4)/ // Route(5)/OU(6) — matches the dimensions actually joined in GET_OUTSTANDING_SUMMARY. "Area" // (legacy GroupType=7) deferred — needs City/Address joins not validated this phase. public static (string select, string groupBy) Build(int groupType, bool isList) { if (isList) { return ( "VBILL.INCHARGEID AS Id, EMP.EMPLOYEECODE AS Code, EMP.EMPLOYEENAME AS Name, VBILL.INCHARGEID AS InChargeId, EMP.EMPLOYEECODE AS InChargeCode, EMP.EMPLOYEENAME AS InChargeName, ACC.ACCOUNTID AS AccountId, ACC.ACCOUNTCODE AS AccountCode, ACC.ACCOUNTNAME AS AccountName", "VBILL.INCHARGEID, EMP.EMPLOYEECODE, EMP.EMPLOYEENAME, ACC.ACCOUNTID, ACC.ACCOUNTCODE, ACC.ACCOUNTNAME" ); } return groupType switch { 1 => ( "ACC.ACCOUNTGROUPID AS AccountGroupId, AG.ACCOUNTGROUPCODE AS AccountGroupCode, AG.ACCOUNTGROUPNAME AS AccountGroupName", "ACC.ACCOUNTGROUPID, AG.ACCOUNTGROUPCODE, AG.ACCOUNTGROUPNAME" ), 2 => ( "ACC.CONTROLACCOUNTID AS ControlAccountId, CTRL.ACCOUNTCODE AS ControlAccountCode, CTRL.ACCOUNTNAME AS ControlAccountName", "ACC.CONTROLACCOUNTID, CTRL.ACCOUNTCODE, CTRL.ACCOUNTNAME" ), 3 => ( "VBILL.INCHARGEID AS Id, EMP.EMPLOYEECODE AS Code, EMP.EMPLOYEENAME AS Name, VBILL.INCHARGEID AS InChargeId, EMP.EMPLOYEECODE AS InChargeCode, EMP.EMPLOYEENAME AS InChargeName", "VBILL.INCHARGEID, EMP.EMPLOYEECODE, EMP.EMPLOYEENAME" ), 4 => ( "VBILL.PRICECATEGORYID AS Id, PC.PRICECATEGORYCODE AS Code, PC.PRICECATEGORYNAME AS Name, VBILL.PRICECATEGORYID AS PriceCategoryId, PC.PRICECATEGORYCODE AS PriceCategoryCode, PC.PRICECATEGORYNAME AS PriceCategoryName", "VBILL.PRICECATEGORYID, PC.PRICECATEGORYCODE, PC.PRICECATEGORYNAME" ), 5 => ( "VBILL.ROUTEID AS RouteId, RT.ROUTENAME AS RouteName", "VBILL.ROUTEID, RT.ROUTENAME" ), 6 => ( "V.OUID AS Id, OU.ORGANIZATIONUNITCODE AS Code, OU.ORGANIZATIONUNITNAME AS Name, V.OUID AS OUId, OU.ORGANIZATIONUNITCODE AS OUCode, OU.ORGANIZATIONUNITNAME AS OUName", "V.OUID, OU.ORGANIZATIONUNITCODE, OU.ORGANIZATIONUNITNAME" ), _ => ( "ACC.ACCOUNTID AS Id, ACC.ACCOUNTCODE AS Code, ACC.ACCOUNTNAME AS Name, ACC.ACCOUNTID AS AccountId, ACC.ACCOUNTCODE AS AccountCode, ACC.ACCOUNTNAME AS AccountName", "ACC.ACCOUNTID, ACC.ACCOUNTCODE, ACC.ACCOUNTNAME" ) }; } } }