Skip to content

Remove CLEAN27 tags for Wave2 2026 - #10525

Open
Alexander Yakunin (Alexander-Ya) wants to merge 8 commits into
mainfrom
bugs/Remove-CLEAN27-tags-for-Wave2-2026
Open

Remove CLEAN27 tags for Wave2 2026#10525
Alexander Yakunin (Alexander-Ya) wants to merge 8 commits into
mainfrom
bugs/Remove-CLEAN27-tags-for-Wave2-2026

Conversation

@Alexander-Ya

@Alexander-Ya Alexander Yakunin (Alexander-Ya) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

What & why

Linked work

Fixes AB#647784

How I validated this

  • I read the full diff and it contains only changes I intended.
  • I built the affected app(s) locally with no new analyzer warnings.
  • I ran the change in Business Central and confirmed it behaves as expected.
  • I added or updated tests for the new behavior, or explained below why none are needed.

What I tested and the outcome (required — be specific: scenarios, commands, screenshots for UI changes)

Risk & compatibility

@github-actions github-actions Bot added Build: scripts & configs Build scripts and configuration files AL: Apps (W1) Add-on apps for W1 Team: Other GitHub request for other area than SCM, Finance or Integration Ownership: Needs Review Ownership is Other, low confidence, or needs manual correction labels Aug 21, 2026
Comment thread src/Layers/GB/BaseApp/Purchases/Document/PurchaseLine.Table.al
Comment thread src/Layers/ES/Tests/SCM-Service/ServiceStatistics.Codeunit.al
Comment thread src/Layers/ES/Tests/SCM-Service/ServiceStatistics.Codeunit.al
Comment thread src/Layers/ES/Tests/SCM-Service/ServiceStatistics.Codeunit.al
@github-actions

This comment was marked as resolved.

@github-actions github-actions Bot added this to the Version 29.0 milestone Aug 26, 2026
}
#if not CLEAN27

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟡\ Medium\ Severity\ —\ Data\ Modeling}$

The CLEAN27 cleanup deletes field 12182 "WIP Qty at Subc.Loc. (Base)" outright from table "Purchase Line" instead of keeping the field definition in source with ObsoleteState = Removed until the announced removal version. That is a schema-level breaking change that can jeopardize upgrade compatibility and persisted data; restore the field as an obsolete-removed stub rather than deleting it now.

Agent judgement — not directly backed by a BCQuality knowledge article.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

#if not CLEAN27
#pragma warning disable AA0232
/// <summary>
/// Contains the total number of errors encountered during this automation run.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟡\ Medium\ Severity\ —\ Data\ Modeling}$

The CLEAN27 cleanup removes field 15 "Number of Errors" outright from table "Reminder Action Group Log" even though the field was previously kept as an obsolete member. Deleting the field definition is a breaking schema change with possible upgrade/data-loss consequences; keep the field in source and mark it obsolete-removed instead of deleting it.

Agent judgement — not directly backed by a BCQuality knowledge article.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

@@ -6171,18 +6114,6 @@ codeunit 22 "Item Jnl.-Post Line"
begin
end;

#if not CLEAN27

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟠\ High\ Severity\ —\ Events}$

This cleanup removes shipped [IntegrationEvent] publishers from Codeunit 22 "Item Jnl.-Post Line" instead of keeping a compatibility shim (verified: dozens of [IntegrationEvent(...)] attribute lines removed in the diff). The same pattern repeats in the APAC/CH/ES/IT/RU layer copies. Even though these hooks were obsolete and moved to "Mfg. Item Jnl.-Post Line", subscribers bind to the original publisher object and will stop firing after this PR unless every dependent extension migrates in lockstep.

Knowledge:

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4


#if not CLEAN27
[Obsolete('Replaced by procedure in codeunit MfgCarryOutAction', '27.0')]
procedure TransferRouting(RequisitionLine: Record "Requisition Line"; ProductionOrder: Record Microsoft.Manufacturing.Document."Production Order"; RoutingNo: Code[20]; RoutingRefNo: Integer): Boolean

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟠\ High\ Severity\ —\ Events}$

This cleanup removes shipped [IntegrationEvent] publishers from "Carry Out Action" rather than preserving the old publisher contract while manufacturing/assembly hooks move elsewhere (42 removed publishers counted in the W1 file, with the same contract change also present in the NA copy). External subscribers that still target the old events will break immediately.

Knowledge:

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

ReportInbox.Init();
ReportInbox."User ID" := JobQueueEntry."User ID";
ReportInbox."Job Queue Log Entry ID" := JobQueueEntry.ID;
ReportInbox."Report ID" := ReportID;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟠\ High\ Severity\ —\ Events}$

"Job Queue Start Report" drops the obsolete publisher OnBeforeRunReport entirely in this cleanup (verified: the bridging [EventSubscriber] procedures that forwarded the old publisher's events were deleted). That is still a shipped [IntegrationEvent] contract: extensions subscribing to Codeunit 487's old event will lose the hook, even though the behavior has been split across "Job Queue Start Report Base"/"Runner".

Knowledge:

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

@@ -1172,22 +1159,6 @@ codeunit 90 "Purch.-Post"
if not IsHandled then begin
PurchInvLine.InitFromPurchLine(PurchInvHeader, xPurchLine);
ItemJnlPostLine.CollectValueEntryRelation(TempValueEntryRelation, CopyStr(PurchInvLine.RowID1(), 1, 100));
#if not CLEAN27

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟡\ Medium\ Severity\ —\ Telemetry}$

This cleanup deletes the shipped Reverse Charge GB purchase usage event ID '0000OJN' from Purch.-Post, but the feature remains active in ReverseChargeVATSubscribers and now emits the same scenario under '0000PBB'. Any dashboards or alerts still keyed to '0000OJN' will silently lose coverage after this PR. Preserve the original ID for the migrated emitter, or emit a compatibility bridge event until telemetry consumers are updated.

Agent judgement — not directly backed by a BCQuality knowledge article.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

#if not CLEAN27
end;
#endif
if SalesLine.Quantity <> 0 then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟡\ Medium\ Severity\ —\ Telemetry}$

This cleanup deletes the shipped Reverse Charge GB sales usage event ID '0000OJO' from Sales-Post, while the still-active Reverse Charge VAT app emits the same scenario under new ID '0000PBC'. That breaks continuity for telemetry queries and alerts that filter on '0000OJO'. Keep the original event ID on the surviving emitter, or add a compatibility emission during the migration window.

Agent judgement — not directly backed by a BCQuality knowledge article.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

@github-actions

Copy link
Copy Markdown
Contributor

$\textbf{🟡\ Medium\ Severity\ —\ Testing}$

src/Layers/ES/Tests/SCM-Service/ServiceStatistics.Codeunit.al now contains a second, duplicate copy of ChangeDiscountAmountCreditMemoNM and the following ...NM test/helper procedures (verified: 'procedure ChangeDiscountAmountCreditMemoNM' appears at both line 481 and line 2167). AL does not allow duplicate procedure names in one codeunit, so this test codeunit will fail to compile as of this PR unless the duplicated block is removed.

Agent judgement — not directly backed by a BCQuality knowledge article.

Line mapping was unavailable, so this was posted as an issue comment.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

using Microsoft.Sales.Setup;
using System.Upgrade;

codeunit 10554 "Upgrade Reverse Charge VAT"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟠\ High\ Severity\ —\ Upgrade}$

The PR deletes codeunit "Upgrade Reverse Charge VAT" and its upgrade-tag helper; src/Apps/GB/ReverseChargeVAT/app/src no longer contains any Subtype = Upgrade/Install or upgrade-tag plumbing. That removes the only version-upgrade path that was still copying legacy Reverse Charge VAT data in OnUpgradePerCompany() for AppVersion().Major() >= 30, so tenants upgrading straight to this build can miss the migration entirely.

Knowledge:

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

@@ -14,17 +14,7 @@ using Microsoft.Inventory.Tracking;

codeunit 99000809 "Planning Line Management"
{
#if not CLEAN28

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟠\ High\ Severity\ —\ Upgrade}$

This BC28 cleanup also removes live #if not CLEAN28 branches from base inventory/manufacturing objects such as "Planning Line Management" (verified: the #if not CLEAN28 ... #else ... #endif Permissions block was collapsed to just the #else branch), "Requisition Line", "Item Jnl.-Post Line" (APAC/CH/ES/IT/W1), and "Post Inventory Cost to G/L". Those guards are outside this PR's CLEAN27 scope. The app version is 29.0.0.0, so a CLEAN28 flag is only one major version past its introduction — physically removing it now is one release earlier than BC's staged obsoletion policy typically allows, and can break 28.x tenants/extensions still relying on the pre-CLEAN28 surface.

Knowledge:

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

{
}
#if not CLEAN27
field(withoutContractDeferrals; Rec."Without Contract Deferrals")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟠\ High\ Severity\ —\ Web\ Services}$

This change removes the published "withoutContractDeferrals" field from the existing Customer Contracts API page while it still serves APIVersion = 'v1.0'. That mutates the live v1.0 contract in place and breaks clients that still read or bind that field. Keep the v1.0 page shape unchanged and introduce a new API page/version for the contract without this field.

Knowledge:

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

{
}
#if not CLEAN27
field(withoutContractDeferrals; Rec."Without Contract Deferrals")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟠\ High\ Severity\ —\ Web\ Services}$

This change removes the published "withoutContractDeferrals" field from the existing Vendor Contracts API page while it still serves APIVersion = 'v1.0'. That mutates the live v1.0 contract in place and breaks clients that still read or bind that field. Keep the v1.0 page shape unchanged and introduce a new API page/version for the contract without this field.

Knowledge:

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4


using Microsoft.Inventory.Ledger;

query 37000 "Value Entries - Purch."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟡\ Medium\ Severity\ —\ Web\ Services}$

Deleting query 37000 "Value Entries - Purch." removes the published /api/microsoft/analytics/v0.5/purchaseValueEntries route entirely. Even though a v1.0 replacement exists, existing integrations pinned to v0.5 will break; keep the deprecated route available until consumers can migrate through an explicit compatibility/versioning plan.

Agent judgement — not directly backed by a BCQuality knowledge article.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4


using Microsoft.Sales.Document;

query 37019 "Sales Line - PBI API"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟡\ Medium\ Severity\ —\ Web\ Services}$

Deleting query 37019 "Sales Line - PBI API" removes the published /api/microsoft/analytics/v0.5/salesLines route entirely. Even though a v1.0 replacement exists, existing integrations pinned to v0.5 will break; keep the deprecated route available until consumers can migrate through an explicit compatibility/versioning plan.

Agent judgement — not directly backed by a BCQuality knowledge article.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4


using Microsoft.Inventory.Ledger;

query 37005 "Value Entries - Sales"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟡\ Medium\ Severity\ —\ Web\ Services}$

Deleting query 37005 "Value Entries - Sales" removes the published /api/microsoft/analytics/v0.5/salesValueEntries route entirely. Even though a v1.0 replacement exists, existing integrations pinned to v0.5 will break; keep the deprecated route available until consumers can migrate through an explicit compatibility/versioning plan.

Agent judgement — not directly backed by a BCQuality knowledge article.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

@github-actions github-actions Bot modified the milestones: Version 29.0, Version 30.0 Aug 26, 2026
@@ -1,26 +1,2 @@
#pragma warning disable AS0029
#if not CLEAN27

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\textbf{🟠\ High\ Severity\ —\ Upgrade}$

This CLEAN27 sweep deletes pageextension 10580 "Report Layouts GB" outright, even though on origin/main it was still marked ObsoleteState = Pending with ObsoleteTag = '28.0' (verified: the entire object body, including the ObsoleteTag = '28.0' property, sat inside a now-removed #if not CLEAN27 ... #endif block, with no #if CLEAN27 replacement left in the file). Removing an object whose ObsoleteTag targets a later wave (28.0) during the 27.0 graduation shortens its deprecation window and can break extensions still compiled against the pending symbol.

Knowledge:

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

@github-actions

Copy link
Copy Markdown
Contributor

$\textbf{🟠\ High\ Severity\ —\ Upgrade}$

The CLEAN27 removal in ManufacturingSetup.Page.al deletes the whole #if not CLEAN27 "Subcontracting" group, which includes the "Legacy Subcontracting" field (verified in the diff: the field carries ObsoleteReason = 'Preparation for replacement by Subcontracting app', ObsoleteState = Pending, ObsoleteTag = '28.0', nested inside a group tagged '27.0'). Deleting a field tagged for the 28.0 obsoletion wave as part of the 27.0 cleanup skips its remaining staged-obsoletion period.

Knowledge:

Line mapping was unavailable, so this was posted as an issue comment.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why · AL review agent v1.35.4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AL: Apps (W1) Add-on apps for W1 Build: scripts & configs Build scripts and configuration files Ownership: Needs Review Ownership is Other, low confidence, or needs manual correction Team: Other GitHub request for other area than SCM, Finance or Integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant