using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; namespace MMDAL.Query.Allocation { /// /// Query Builder — Allocation module. /// Contains all SQL constants required by . /// /// GB4 Source : Unisoft.MMDAL.Query.MM.AllocationQueryBuilder /// /// GB5 SQL conventions (matching the existing GET_ALLOCATION pattern): /// • @param Dapper-style bound parameters (not :param). /// • LEFT JOIN instead of LEFT OUTER JOIN. /// • JOIN (implicit INNER JOIN) instead of comma-list implicit joins. /// • UPPERCASE SQL keywords throughout. /// • Aligned AS aliases for readability. /// /// String-replace tokens — NOT Dapper params. /// AllocationDAL calls string.Replace() on these before handing SQL to the executor: /// :replacestring item-wise SELECT expansion or empty string /// :loadfrombiztype "JOIN MBIZTRANSACTIONTYPE Loadtotype ON ..." or empty /// :showonlyavailbletowork literal 0 or 1 /// :HeaderReplacePart SELECT column list injected at runtime /// :HeaderTablePart additional JOIN/FROM tables injected at runtime /// :objectheadertypeid literal int replaced via ReplaceNamedParams helper /// :objecttypeid literal int replaced via ReplaceNamedParams helper /// public static class AllocationQB { // ───────────────────────────────────────────────────────────────────────── // GET_ALLOCATION // Fetches a single allocation record with all related lookup data. // Used by : AllocationDAL.GetAllocation // Param : @allocationid (Dapper) // GB4 : New in GB5 — no direct equivalent existed in GB4 QB. // ───────────────────────────────────────────────────────────────────────── public const string GET_ALLOCATION = @"SELECT A.ALLOCATIONID AS AllocationId, A.BIZTRANSACTIONTYPEID AS BizTransactionTypeId, BTT.BIZTRANSACTIONTYPECODE AS BizTransactionTypeCode, BTT.BIZTRANSACTIONTYPENAME AS BizTransactionTypeName, A.OBJECTHEADERTYPEID AS ObjectHeaderTypeId, OHT.ENTITYCODE AS ObjectHeaderTypeCode, OHT.ENTITYNAME AS ObjectHeaderTypeName, A.OBJECTHEADERID AS AllocationObjectHeaderId, A.OBJECTTYPEID AS ObjectTypeId, OT.ENTITYCODE AS ObjectTypeCode, OT.ENTITYNAME AS ObjectTypeName, A.OBJECTID AS AllocationObjectId, A.ALLOCATIONTYPE AS AllocationType, A.ALLOCATIONNATURE AS AllocationNature, AA.BIZTRANSACTIONTYPEID AS AllotedBizTransactionTypeId, ABTT.BIZTRANSACTIONTYPECODE AS AllotedBizTransactionTypeCode, ABTT.BIZTRANSACTIONTYPENAME AS AllotedBizTransactionTypeName, AA.OBJECTHEADERTYPEID AS AllotedHeaderTypeId, AHT.ENTITYCODE AS AllotedHeaderTypeCode, AHT.ENTITYNAME AS AllotedHeaderTypeName, AA.OBJECTHEADERID AS AllocationAllotedHeaderId, AA.OBJECTTYPEID AS AllotedObjectTypeId, AOT.ENTITYCODE AS AllotedObjectTypeCode, AOT.ENTITYNAME AS AllotedObjectTypeName, AA.OBJECTID AS AllocationAllotedObjectId, A.QUANTITY AS AllocationQuantity, A.REJECTEDQUANTITY AS AllocationRejectedQuantity, A.REWORKQUANTITY AS AllocationReworkQuantity, A.OTHERQUANTITY AS AllocationOtherQuantity, A.EXCESSQUANTITY AS AllocationExcessQuantity, A.FREEQUANTITY AS AllocationFreeQuantity, A.PROCESSID AS ProcessId, P.PROCESSCODE AS ProcessCode, P.PROCESSNAME AS ProcessName, A.ALLOTEDALLOCATIONID AS AllotedAllocationId, MAL.ALLOCATIONNAME AS AllotedAllocationName, A.MODIFIEDON AS ModifiedOn FROM TALLOCATION A LEFT JOIN MBIZTRANSACTIONTYPE BTT ON A.BIZTRANSACTIONTYPEID = BTT.BIZTRANSACTIONTYPEID LEFT JOIN MENTITY OHT ON A.OBJECTHEADERTYPEID = OHT.ENTITYID LEFT JOIN MENTITY OT ON A.OBJECTTYPEID = OT.ENTITYID LEFT JOIN TALLOCATION AA ON A.ALLOTEDALLOCATIONID = AA.ALLOCATIONID LEFT JOIN MBIZTRANSACTIONTYPE ABTT ON AA.BIZTRANSACTIONTYPEID = ABTT.BIZTRANSACTIONTYPEID LEFT JOIN MENTITY AHT ON AA.OBJECTHEADERTYPEID = AHT.ENTITYID LEFT JOIN MENTITY AOT ON AA.OBJECTTYPEID = AOT.ENTITYID LEFT JOIN MPROCESS P ON A.PROCESSID = P.PROCESSID LEFT JOIN MALLOCATION MAL ON A.ALLOTEDALLOCATIONID = MAL.ALLOCATIONID WHERE A.ALLOCATIONID = @allocationid;"; // ───────────────────────────────────────────────────────────────────────── // GET_NEWALLOCATION_BASED_DOCNO // Paginated SQL Server picklist inner query. // The DAL closes this with ") x" and appends a GROUPBY constant. // Used by : AllocationDAL.LoadFromAllocationPicklist (SQL Server path) // // String-replace tokens (applied by DAL before execution): // :replacestring item columns when ItemWiseTag=0, else empty // :loadfrombiztype "JOIN MBIZTRANSACTIONTYPE Loadtotype ON ..." or empty // :showonlyavailbletowork literal 0 or 1 // // GB4 Source : AllocationQueryBuilder.GET_NEWALLOCATION_BASED_DOCNO // ───────────────────────────────────────────────────────────────────────── public const string GET_NEWALLOCATION_BASED_DOCNO = @"SELECT HeaderName, AllocationObjectHeaderId, HeaderDate, DocumentAllocationId, DocumentAllocationName, ISNULL(RefNumber, '') AS RefNumber, RefDate, SUM(AllocationTotalQuantity) AS AllocationTotalQuantity, PartyId, PartyName, PartyBranchId, PartyBranchName, ModifiedBy :replacestring FROM ( SELECT A.DOCUMENTNUMBER AS HeaderName, A.OBJECTHEADERID AS AllocationObjectHeaderId, A.DOCUMENTDATE AS HeaderDate, A.HEADERALLOCATIONID AS DocumentAllocationId, MAL.ALLOCATIONNAME AS DocumentAllocationName, A.PARTYREFERENCENUMBER AS RefNumber, A.PARTYREFERENCEDATE AS RefDate, A.QUANTITY AS AllocationTotalQuantity, PARTY.PARTYID AS PartyId, PARTY.PARTYNAME AS PartyName, PARTYBRANCH.PARTYBRANCHID AS PartyBranchId, PARTYBRANCH.PARTYBRANCHNAME AS PartyBranchName, MOD.USERNAME AS ModifiedBy, A.ITEMID AS ItemId, ITEM.ITEMCODE AS ItemCode, ITEM.ITEMNAME AS ItemName, A.SKUID AS SKUId, SKU.SKUCODE AS SKUCode, SKU.SKUNAME AS SKUName FROM TPENDINGALLOCATION A -- Revised by Vikash (26-Aug-2023, Bug #35796): -- Resolved via IndentId instead of ObjectId because PendingAllocation rows -- may exist before output is posted to TPOSTEDINDENTDETAIL. OUTER APPLY ( SELECT TOP (1) PDTL.* FROM TPOSTEDINDENTDETAIL PDTL JOIN TINDENTDETAIL INDDTL ON PDTL.INDENTID = INDDTL.INDENTID WHERE PDTL.INDENTID = A.OBJECTHEADERID AND A.OBJECTHEADERTYPEID = -1899997569 AND INDDTL.RELEASESTATUS <> 5 ) PDTL OUTER APPLY ( SELECT MIN(PDTLMIN.ROUTINGDETAILSLNO) AS ROUTINGDETAILSLNO FROM TPOSTEDINDENTDETAIL PDTLMIN WHERE PDTLMIN.COMBINEINDENTID = PDTL.COMBINEINDENTID ) PDTLMIN JOIN MBIZTRANSACTIONTYPE C ON A.BIZTRANSACTIONTYPEID = C.BIZTRANSACTIONTYPEID JOIN MBIZTRANSACTIONCLASS D ON C.BIZTRANSACTIONCLASSID = D.BIZTRANSACTIONCLASSID JOIN MBIZTRANSACTION BIZ ON C.BIZTRANSACTIONID = BIZ.BIZTRANSACTIONID JOIN MPARTYBRANCH PARTYBRANCH ON A.PARTYBRANCHID = PARTYBRANCH.PARTYBRANCHID JOIN MPARTY PARTY ON PARTYBRANCH.PARTYID = PARTY.PARTYID JOIN MITEM ITEM ON A.ITEMID = ITEM.ITEMID JOIN MSKU SKU ON A.SKUID = SKU.SKUID JOIN MALLOCATION MAL ON A.HEADERALLOCATIONID = MAL.ALLOCATIONID JOIN MUSER MOD ON A.CREATEDBYID = MOD.USERID :loadfrombiztype WHERE 1 = 1 -- Available-to-work filter (Bug #35796). -- :showonlyavailbletowork = 1 bypasses the check entirely. AND ( (D.BIZTRANSACTIONCLASSID <> -1399999908) OR ( D.BIZTRANSACTIONCLASSID = -1399999908 AND ( (PDTL.INDENTID = PDTL.COMBINEINDENTID) OR (ISNULL(PDTL.AVAILABLETOWORK, 0) > 0) OR :showonlyavailbletowork = 1 OR ISNULL(PDTLMIN.ROUTINGDETAILSLNO, 1) = PDTL.ROUTINGDETAILSLNO ) ) OR (PDTL.AVAILABLETOWORK IS NULL) ) -- Bug #37274: exclude closed work-orders. AND -1 <> CASE WHEN D.BIZTRANSACTIONCLASSID <> -1399999908 THEN -2100000000 ELSE ISNULL(PDTL.INDENTID, -1) END "; // ───────────────────────────────────────────────────────────────────────── // GROUPBY_NEWALLOCATION_BASED_DOCNO // Appended after ") x" closing of GET_NEWALLOCATION_BASED_DOCNO. // Used when ItemWiseTag = 1 → document-level grouping, no item columns. // Used by : AllocationDAL.LoadFromAllocationPicklist // GB4 Source : AllocationQueryBuilder.GROUPBY_NEWALLOCATION_BASED_DOCNO // ───────────────────────────────────────────────────────────────────────── public const string GROUPBY_NEWALLOCATION_BASED_DOCNO = @"GROUP BY HeaderName, AllocationObjectHeaderId, HeaderDate, DocumentAllocationId, DocumentAllocationName, RefNumber, RefDate, PartyId, PartyName, PartyBranchId, PartyBranchName, ModifiedBy ORDER BY x.HeaderName"; // ───────────────────────────────────────────────────────────────────────── // GROUPBY_NEWALLOCATION_BASED_DOCNO_ITEM // Appended after ") x" closing of GET_NEWALLOCATION_BASED_DOCNO. // Used when ItemWiseTag = 0 → item-level grouping, includes item/SKU columns. // Used by : AllocationDAL.LoadFromAllocationPicklist // GB4 Source : AllocationQueryBuilder.GROUPBY_NEWALLOCATION_BASED_DOCNO_ITEM // ───────────────────────────────────────────────────────────────────────── public const string GROUPBY_NEWALLOCATION_BASED_DOCNO_ITEM = @"GROUP BY HeaderName, AllocationObjectHeaderId, HeaderDate, DocumentAllocationId, DocumentAllocationName, RefNumber, RefDate, PartyId, PartyName, PartyBranchId, PartyBranchName, ModifiedBy, ItemId, ItemCode, ItemName, SKUId, SKUCode, SKUName, AllocationTotalQuantity ORDER BY x.HeaderName"; // ───────────────────────────────────────────────────────────────────────── // GET_PENDING_ALLOCATION_DOCUMENT_NEW // Oracle path — MM Document head-type, compact mode (NeedAllTag = 0). // Used by : AllocationDAL.BuildMMHeadQuery (NeedAllTag = 0 branch) // // String-replace tokens (applied by DAL before execution): // :HeaderReplacePart SELECT column list (compact or item-wise variant) // :loadfrombiztype "JOIN MBIZTRANSACTIONTYPE Loadtotype ON ..." or empty // // Changes vs GB4 GET_PENDING_ALLOCATION_DOCUMENT (legacy): // • Added LEFT JOIN MPARTY, MITEM, MUOM (needed for item-wise select). // • Added OUTER APPLY TPACKDETAIL for pack quantity (Bug #38762, Apr-2023). // • :loadfrombiztype token replaces the hardcoded join in the old version. // // GB4 Source : AllocationQueryBuilder.GET_PENDING_ALLOCATION_DOCUMENT_NEW // ───────────────────────────────────────────────────────────────────────── public const string GET_PENDING_ALLOCATION_DOCUMENT_NEW = @"SELECT :HeaderReplacePart FROM TPENDINGALLOCATION A LEFT JOIN TMMHEAD B ON A.OBJECTHEADERID = B.DOCUMENTID AND A.OBJECTHEADERTYPEID = -1899997952 AND A.OBJECTTYPEID = -1899997854 LEFT JOIN TMMDETAIL DTL ON B.DOCUMENTID = DTL.DOCUMENTID LEFT JOIN MPARTY PARTY ON B.PARTYID = PARTY.PARTYID LEFT JOIN MITEM ITEM ON DTL.ITEMID = ITEM.ITEMID LEFT JOIN MUOM UOM ON ITEM.STOCKUOMID = UOM.UOMID -- Pack quantity sub-total per detail line (Bug #38762, 28-Apr-2023). OUTER APPLY ( SELECT SUM(PACKDTL.GOODQUANTITY) AS GOODQUANTITY FROM TPACKDETAIL PACKDTL WHERE PACKDTL.DOCUMENTDETAILID = DTL.DOCUMENTDETAILID ) PACKDTL LEFT JOIN TINDENT IND ON A.OBJECTHEADERID = IND.INDENTID AND A.OBJECTHEADERTYPEID = -1899997952 AND A.OBJECTTYPEID = -1899997854 JOIN MBIZTRANSACTIONTYPE C ON A.BIZTRANSACTIONTYPEID = C.BIZTRANSACTIONTYPEID JOIN MBIZTRANSACTIONCLASS D ON C.BIZTRANSACTIONCLASSID = D.BIZTRANSACTIONCLASSID JOIN MBIZTRANSACTION BIZ ON C.BIZTRANSACTIONID = BIZ.BIZTRANSACTIONID JOIN MPARTYBRANCH PARTYBRANCH ON A.PARTYBRANCHID = PARTYBRANCH.PARTYBRANCHID JOIN MALLOCATION MAL ON B.ALLOCATIONID = MAL.ALLOCATIONID JOIN MUSER MOD ON B.CREATEDBYID = MOD.USERID :loadfrombiztype WHERE 1 = 1 AND A.BIZTRANSACTIONTYPEID = C.BIZTRANSACTIONTYPEID AND C.BIZTRANSACTIONCLASSID = D.BIZTRANSACTIONCLASSID AND C.BIZTRANSACTIONID = BIZ.BIZTRANSACTIONID AND PARTYBRANCH.PARTYBRANCHID = A.PARTYBRANCHID AND MAL.ALLOCATIONID = B.ALLOCATIONID AND MOD.USERID = B.CREATEDBYID AND A.ALLOCATIONNATURE IN (1) AND A.OBJECTID = DTL.DOCUMENTDETAILID "; // ───────────────────────────────────────────────────────────────────────── // GET_PENDING_ALLOCATION_FORALL // Oracle path — MM Document full mode (NeedAllTag = 1) and base template // for all Indent head-type branches. // Used by : AllocationDAL.BuildMMHeadQuery (NeedAllTag = 1 branch) // AllocationDAL.BuildIndentQuery (all IsMultiple modes) // // String-replace tokens (applied by DAL before execution): // :HeaderReplacePart SELECT column list built at runtime // :HeaderTablePart additional JOIN tables built at runtime // :objectheadertypeid literal int via ReplaceNamedParams // :objecttypeid literal int via ReplaceNamedParams // // Notable details: // • Uses TPENDINGALLOCATION (Oracle trigger table, not the view). // • PRE sub-query MM Head source traceability (AllocationType 0 -> 1). // • INDPRE sub-query Indent source traceability. // • ISNULL(B.AMENDMENTSLNO, 0) for amendment tracking. // • CASE on SELECTIONCLASSID collapses three manufacturing classes into // one expression (GB4 used nested CASE WHEN ... ELSE CASE WHEN ...). // // GB4 Source : AllocationQueryBuilder.GET_PENDING_ALLOCATION_FORALL // ───────────────────────────────────────────────────────────────────────── public const string GET_PENDING_ALLOCATION_FORALL = @"SELECT DISTINCT A.ALLOCATIONID AS AllocationId, A.ALLOCATIONNATURE AS AllocationNature, A.BIZTRANSACTIONTYPEID AS BizTransactionTypeId, A.OBJECTHEADERID AS AllocationObjectHeaderId, A.OBJECTHEADERTYPEID AS ObjectHeaderTypeId, A.OBJECTID AS AllocationObjectId, A.OBJECTTYPEID AS ObjectTypeId, A.ALLOTEDALLOCATIONID AS AllotedAllocationId, A.OTHERQUANTITY AS AllocationOtherQuantity, A.PROCESSID AS ProcessId, E.PENDINGQUANTITY AS AllocationQuantity, E.PENDINGREJECTEDQUANTITY AS AllocationRejectedQuantity, E.PENDINGREWORKQUANTITY AS AllocationReworkQuantity, E.PENDINGOTHERQUANTITY AS AllocationOtherQuantity, A.ALLOCATIONTYPE AS AllocationType, ISNULL(B.AMENDMENTSLNO, 0) AS AmendmentSlNo, -- Pre-document number: manufacturing biz classes resolve from INDPRE (Indent), -- all other classes resolve from PRE (MM Head source). CASE WHEN C.SELECTIONCLASSID IN (-1399999916, -1399999908, -1499999995) THEN ISNULL(INDPRE.DOCUMENTNUMBER, '') ELSE ISNULL(PRE.DOCUMENTNUMBER, '') END AS PreDocumentNumber, CASE WHEN C.SELECTIONCLASSID IN (-1399999916, -1399999908, -1499999995) THEN ISNULL(INDPRE.DOCUMENTMODIFIEDBY, '') ELSE ISNULL(PRE.DOCUMENTMODIFIEDBY, '') END AS PreDocumentModifiedBy :HeaderReplacePart FROM TALLOCATION A LEFT JOIN TMMHEAD B ON A.OBJECTHEADERID = B.DOCUMENTID AND A.OBJECTHEADERTYPEID = :objectheadertypeid AND A.OBJECTTYPEID = :objecttypeid LEFT JOIN TMMDETAIL DTL ON B.DOCUMENTID = DTL.DOCUMENTID -- Pre-document traceability: MM Head source (AllocationType 0 allotted to 1). LEFT JOIN ( SELECT MMHEAD.DOCUMENTID AS DocumentId, MMHEAD.DOCUMENTNUMBER AS DocumentNumber, MMHEAD.DOCUMENTDATE AS DocumentDate, MMHEAD.REFERENCENUMBER AS DocumentReferenceNumber, MMHEAD.REFERENCEDATE AS DocumentReferenceDate, MMHEAD.PARTYREFERENCENUMBER AS DocumentPartyReferenceNumber, MMHEAD.PARTYREFERENCEDATE AS DocumentPartyReferenceDate, ALLOC1.OBJECTHEADERID AS ObjectHeaderId, ALLOC1.OBJECTID AS ObjectId, USR.USERNAME AS DocumentModifiedBy FROM TMMHEAD MMHEAD JOIN TALLOCATION ALLOC ON MMHEAD.BIZTRANSACTIONTYPEID = ALLOC.BIZTRANSACTIONTYPEID AND MMHEAD.DOCUMENTID = ALLOC.OBJECTHEADERID AND ALLOC.ALLOCATIONTYPE = 0 JOIN TMMDETAIL TMMD ON MMHEAD.DOCUMENTID = TMMD.DOCUMENTID AND TMMD.DOCUMENTDETAILID = ALLOC.OBJECTID JOIN TALLOCATION ALLOC1 ON ALLOC.ALLOCATIONID = ALLOC1.ALLOTEDALLOCATIONID AND ALLOC1.OBJECTHEADERTYPEID = -1899997952 AND ALLOC1.OBJECTTYPEID = -1899997854 AND ALLOC1.ALLOCATIONTYPE = 1 JOIN MUSER USR ON MMHEAD.MODIFIEDBYID = USR.USERID ) PRE ON PRE.OBJECTHEADERID = DTL.DOCUMENTID AND PRE.OBJECTID = DTL.DOCUMENTDETAILID -- Pre-document traceability: Indent source. LEFT JOIN ( SELECT IND.INDENTID AS DocumentId, IND.INDENTNUMBER AS DocumentNumber, IND.INDENTDATE AS DocumentDate, IND.REFERENCENUMBER AS DocumentReferenceNumber, IND.REFERENCEDATE AS DocumentReferenceDate, ALLOC1.OBJECTHEADERID AS ObjectHeaderId, ALLOC1.OBJECTID AS ObjectId, USR.USERNAME AS DocumentModifiedBy FROM TINDENT IND JOIN TALLOCATION ALLOC ON IND.BIZTRANSACTIONTYPEID = ALLOC.BIZTRANSACTIONTYPEID AND IND.INDENTID = ALLOC.OBJECTHEADERID AND ALLOC.ALLOCATIONTYPE = 0 JOIN TALLOCATION ALLOC1 ON ALLOC.ALLOCATIONID = ALLOC1.ALLOTEDALLOCATIONID AND ALLOC1.OBJECTHEADERTYPEID = -1899997952 AND ALLOC1.OBJECTTYPEID = -1899997854 AND ALLOC1.ALLOCATIONTYPE = 1 JOIN MUSER USR ON IND.MODIFIEDBYID = USR.USERID ) INDPRE ON INDPRE.OBJECTHEADERID = DTL.DOCUMENTID AND INDPRE.OBJECTID = DTL.DOCUMENTDETAILID LEFT JOIN TINDENT IND ON A.OBJECTHEADERID = IND.INDENTID AND A.OBJECTHEADERTYPEID = :objectheadertypeid AND A.OBJECTTYPEID = :objecttypeid LEFT JOIN TINDENTDETAIL INDDTL ON IND.INDENTID = INDDTL.INDENTID LEFT JOIN TINDENTMATERIAL INDMTL ON INDDTL.INDENTDETAILID = INDMTL.INDENTDETAILID JOIN MBIZTRANSACTIONTYPE C ON A.BIZTRANSACTIONTYPEID = C.BIZTRANSACTIONTYPEID JOIN MBIZTRANSACTIONCLASS D ON C.BIZTRANSACTIONCLASSID = D.BIZTRANSACTIONCLASSID JOIN MBIZTRANSACTION BIZ ON C.BIZTRANSACTIONID = BIZ.BIZTRANSACTIONID JOIN TPENDINGALLOCATION E ON E.ALLOTEDALLOCATIONID = A.ALLOCATIONID -- :HeaderTablePart is replaced at runtime with additional JOINs such as: -- MPARTY, MPARTYBRANCH, MSKU, MITEM, MALLOCATION, MUSER, MUOM, -- and optionally MBIZTRANSACTIONTYPE Loadtotype. :HeaderTablePart WHERE 1 = 1 AND E.PENDINGQUANTITY > 0 "; // ───────────────────────────────────────────────────────────────────────── // GET_PENDING_ALLOCATION_FORINDENT // Oracle path — Indent head-type, single-line mode (IsMultiple = 0). // Used by : AllocationDAL.BuildIndentQuery (IsMultiple = 0 branch) // // String-replace tokens: // :HeaderReplacePart SELECT column list // :HeaderTablePart additional JOIN tables (must include MPARTYBRANCH) // :objectheadertypeid literal int via ReplaceNamedParams // // GB4 Source : AllocationQueryBuilder.GET_PENDING_ALLOCATION_FORINDENT // ───────────────────────────────────────────────────────────────────────── public const string GET_PENDING_ALLOCATION_FORINDENT = @"SELECT DISTINCT A.ALLOCATIONID AS AllocationId, A.ALLOCATIONNATURE AS AllocationNature, A.BIZTRANSACTIONTYPEID AS BizTransactionTypeId, A.OBJECTHEADERID AS AllocationObjectHeaderId, A.OBJECTHEADERTYPEID AS ObjectHeaderTypeId, A.OBJECTID AS AllocationObjectId, A.OBJECTTYPEID AS ObjectTypeId, A.ALLOTEDALLOCATIONID AS AllotedAllocationId, A.OTHERQUANTITY AS AllocationOtherQuantity, A.PROCESSID AS ProcessId, E.PENDINGQUANTITY AS AllocationQuantity, A.REJECTEDQUANTITY AS AllocationRejectedQuantity, A.REWORKQUANTITY AS AllocationReworkQuantity, A.ALLOCATIONTYPE AS AllocationType :HeaderReplacePart FROM TALLOCATION A LEFT JOIN TINDENT IND ON A.OBJECTHEADERID = IND.INDENTID AND A.OBJECTHEADERTYPEID = :objectheadertypeid AND IND.STATUS = 1 LEFT JOIN TINDENTDETAIL INDDTL ON IND.INDENTID = INDDTL.INDENTID LEFT JOIN TINDENTMATERIAL INDMTL ON INDDTL.INDENTDETAILID = INDMTL.INDENTDETAILID JOIN MBIZTRANSACTIONTYPE C ON A.BIZTRANSACTIONTYPEID = C.BIZTRANSACTIONTYPEID JOIN MBIZTRANSACTIONCLASS D ON C.BIZTRANSACTIONCLASSID = D.BIZTRANSACTIONCLASSID JOIN MBIZTRANSACTION BIZ ON C.BIZTRANSACTIONID = BIZ.BIZTRANSACTIONID JOIN VPENDINGALLOCATION E ON E.ALLOTEDALLOCATIONID = A.ALLOCATIONID :HeaderTablePart WHERE 1 = 1 AND E.PENDINGQUANTITY > 0 "; // ───────────────────────────────────────────────────────────────────────── // GET_PENDING_ALLOCATION_FORINDENT_NEW // Oracle path — Indent head-type, multi-BOM mode (IsMultiple = 1). // Used by : AllocationDAL.BuildIndentQuery (IsMultiple = 1 branch) // // Extends GET_PENDING_ALLOCATION_FORINDENT with: // • OUTER APPLY BOMITEMSECTION — BOM item count per routing slot // (Redmine CR #31009, 22-Jan-2021). DAL appends an extra AND clause // for BizClass -1399999916 after selecting this constant. // • LEFT JOIN TPOSTEDINDENTDETAIL POSTEDDTL — routing slot data. // • CROSS APPLY VV — produced good quantity from TPRODUCTIONDETAIL. // • Release status filter : Planned(0) / Released(3) / Processing(6). // • Remaining planned quantity check (planned - produced > 0). // // String-replace tokens: // :HeaderReplacePart SELECT column list // :HeaderTablePart additional JOIN tables // :objectheadertypeid literal int via ReplaceNamedParams // // GB4 Source : AllocationQueryBuilder.GET_PENDING_ALLOCATION_FORINDENT_NEW // ───────────────────────────────────────────────────────────────────────── public const string GET_PENDING_ALLOCATION_FORINDENT_NEW = @"SELECT DISTINCT A.BIZTRANSACTIONTYPEID AS BizTransactionTypeId, A.OBJECTHEADERID AS AllocationObjectHeaderId, A.OBJECTHEADERTYPEID AS ObjectHeaderTypeId :HeaderReplacePart FROM TALLOCATION A LEFT JOIN TINDENT IND ON A.OBJECTHEADERID = IND.INDENTID AND A.OBJECTHEADERTYPEID = :objectheadertypeid AND IND.STATUS = 1 -- BOM item count per routing slot (Redmine CR #31009, 22-Jan-2021). OUTER APPLY ( SELECT COUNT(INDMAT.INDENTDETAILID) AS Indmatcount FROM TPOSTEDINDENTDETAIL PDTL JOIN TINDENTMATERIAL INDMAT ON PDTL.INDENTDETAILID = INDMAT.INDENTDETAILID WHERE INDMAT.TYPEOFDATA = 0 AND PDTL.INDENTID = IND.INDENTID ) BOMITEMSECTION LEFT JOIN TPOSTEDINDENTDETAIL POSTEDDTL ON IND.INDENTID = POSTEDDTL.INDENTID LEFT JOIN TINDENTDETAIL INDDTL ON IND.INDENTID = INDDTL.INDENTID LEFT JOIN TINDENTMATERIAL INDMTL ON INDDTL.INDENTDETAILID = INDMTL.INDENTDETAILID -- Produced good quantity per indent detail line. CROSS APPLY ( SELECT SUM(GOODQUANTITY) AS Goodquantity FROM TPRODUCTIONDETAIL WHERE INDENTDETAILID = INDDTL.INDENTDETAILID ) VV JOIN MBIZTRANSACTIONTYPE C ON A.BIZTRANSACTIONTYPEID = C.BIZTRANSACTIONTYPEID JOIN MBIZTRANSACTIONCLASS D ON C.BIZTRANSACTIONCLASSID = D.BIZTRANSACTIONCLASSID JOIN MBIZTRANSACTION BIZ ON C.BIZTRANSACTIONID = BIZ.BIZTRANSACTIONID JOIN VPENDINGALLOCATION E ON E.ALLOTEDALLOCATIONID = A.ALLOCATIONID :HeaderTablePart WHERE 1 = 1 AND E.PENDINGQUANTITY > 0 -- Only active line statuses: Planned(0), Released(3), Processing(6). AND INDDTL.RELEASESTATUS IN (0, 3, 6) -- Exclude lines where production is already complete. AND ISNULL(INDDTL.PLANNEDQUANTITY, 0) - ISNULL(VV.GOODQUANTITY, 0) > 0 "; // ───────────────────────────────────────────────────────────────────────── // GET_PENDING_ALLOCATION_FORINDENT_BASED_ON_COMBINE_INDENT_BASED // Oracle path — Indent head-type, combine-indent mode (CombineIndent = 0). // Groups picklist rows by the parent combine-indent (COMBIND) rather than // the child indent, surfacing the combine indent's number, date, and party. // Used by : AllocationDAL.BuildIndentQuery (CombineIndent = 0 branch) // // String-replace tokens: // :HeaderTablePart additional JOIN tables (must include MPARTYBRANCH) // :objectheadertypeid literal int via ReplaceNamedParams // // GB4 Source : AllocationQueryBuilder.GET_PENDING_ALLOCATION_FORINDENT_BASED_ON_COMBINE_INDENT_BASED // ───────────────────────────────────────────────────────────────────────── public const string GET_PENDING_ALLOCATION_FORINDENT_BASED_ON_COMBINE_INDENT_BASED = @"SELECT DISTINCT COMBIND.INDENTID AS AllocationObjectHeaderId, COMBIND.INDENTNUMBER AS HeaderName, COMBIND.INDENTDATE AS HeaderDate, COMBIND.REFERENCENUMBER AS RefNumber, COMBIND.REFERENCEDATE AS RefDate, COMBIND.PARTYBRANCHID AS PartyBranchId, PARTYBRANCH.PARTYBRANCHNAME AS PartyBranchName FROM TALLOCATION A LEFT JOIN TINDENT IND ON A.OBJECTHEADERID = IND.INDENTID AND A.OBJECTHEADERTYPEID = :objectheadertypeid AND IND.STATUS = 1 -- Resolve each child indent to its parent combine-indent. LEFT JOIN TINDENT COMBIND ON IND.COMBINEINDENTID = COMBIND.INDENTID LEFT JOIN TINDENTDETAIL INDDTL ON IND.INDENTID = INDDTL.INDENTID LEFT JOIN TINDENTMATERIAL INDMTL ON INDDTL.INDENTDETAILID = INDMTL.INDENTDETAILID JOIN MBIZTRANSACTIONTYPE C ON A.BIZTRANSACTIONTYPEID = C.BIZTRANSACTIONTYPEID JOIN MBIZTRANSACTIONCLASS D ON C.BIZTRANSACTIONCLASSID = D.BIZTRANSACTIONCLASSID JOIN MBIZTRANSACTION BIZ ON C.BIZTRANSACTIONID = BIZ.BIZTRANSACTIONID JOIN VPENDINGALLOCATION E ON E.ALLOTEDALLOCATIONID = A.ALLOCATIONID :HeaderTablePart WHERE 1 = 1 AND E.PENDINGQUANTITY > 0 "; // ───────────────────────────────────────────────────────────────────────── // GET_PENDING_ALLOCATION_DOCUMENT_PRODUCTIONPLAN // MM Document head-type, compact mode (NeedAllTag = 0), production-plan // variant — adds warp-type/label (fabric design) columns that // GET_PENDING_ALLOCATION_DOCUMENT_NEW does not carry. // Used by : AllocationDAL.GetPendingNewListForProductionPlan // (HeadTypeId == OBJECTMMHEAD && NeedAllTag == 0 branch) // // String-replace tokens (applied by DAL before execution): // :HeaderReplacePart SELECT column list // :HeaderTablePart additional JOIN tables (party/partybranch/address/city) // :objectheadertypeid literal int via ReplaceNamedParams // :objecttypeid literal int via ReplaceNamedParams // // Preserved GB4 quirk: LABEL.LABELID = ITEM.ITEMID (not LABEL.ITEMID). // This looks like a mismatched join key, but it is GB4's actual deployed // behaviour (AllocationQueryBuilder.GET_PENDING_ALLOCATION_DOCUMENT_PRODUCTIONPLAN) — // kept exactly as-is rather than "fixed" during migration. // // GB4 Source : AllocationQueryBuilder.GET_PENDING_ALLOCATION_DOCUMENT_PRODUCTIONPLAN // ───────────────────────────────────────────────────────────────────────── public const string GET_PENDING_ALLOCATION_DOCUMENT_PRODUCTIONPLAN = @"SELECT :HeaderReplacePart FROM TALLOCATION A LEFT JOIN TMMHEAD B ON A.OBJECTHEADERID = B.DOCUMENTID AND A.OBJECTHEADERTYPEID = :objectheadertypeid AND A.OBJECTTYPEID = :objecttypeid LEFT JOIN TMMDETAIL DTL ON B.DOCUMENTID = DTL.DOCUMENTID LEFT JOIN TINDENT IND ON A.OBJECTHEADERID = IND.INDENTID AND A.OBJECTHEADERTYPEID = :objectheadertypeid AND A.OBJECTTYPEID = :objecttypeid JOIN MBIZTRANSACTIONTYPE C ON A.BIZTRANSACTIONTYPEID = C.BIZTRANSACTIONTYPEID JOIN MBIZTRANSACTIONCLASS D ON C.BIZTRANSACTIONCLASSID = D.BIZTRANSACTIONCLASSID JOIN MBIZTRANSACTION BIZ ON C.BIZTRANSACTIONID = BIZ.BIZTRANSACTIONID JOIN MITEM ITEM ON DTL.ITEMID = ITEM.ITEMID JOIN MSKU MSKU ON DTL.SKUID = MSKU.SKUID JOIN MLABEL LABEL ON LABEL.LABELID = ITEM.ITEMID JOIN MGCM GCM ON LABEL.WARPTYPEID = GCM.GCMID JOIN VPENDINGALLOCATION E ON E.ALLOTEDALLOCATIONID = A.ALLOCATIONID :HeaderTablePart WHERE 1 = 1 AND E.PENDINGQUANTITY > 0 "; // ───────────────────────────────────────────────────────────────────────── // ApplyCriteria // Maps UI CriteriaDTO fields to SQL WHERE clauses via the provided // field-to-column dictionary. // // GB4 equivalent : CommonFunctionFrameDAL.ApplyCriteria (used string[,] map) // GB5 change : Map is now Dictionary for type safety. // // TODO: Replace the throw with the actual GB5 shared criteria engine call. // Inject ICommonQueryHelper or the equivalent from GB5Shared. // ───────────────────────────────────────────────────────────────────────── public static string ApplyCriteria( string Sql, Dictionary CriteriaFieldMap, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { throw new NotImplementedException( "ApplyCriteria must be wired to the GB5 shared criteria engine. " + "Inject ICommonQueryHelper or the equivalent from GB5Shared."); } // GET_SELECTLIST_TPENDINGALLOCATION moved to PendingAllocationQB.BuildPendingAllocationSelectList // — it now runs through the typed List-Query pipeline (IQueryBuilder + QueryContext + // SqlClauses) instead of a raw CriteriaBuilder-driven string constant here. } }