Change Document: v2.3.5.0 — Dimension Table Permission (ISSUE-12 Final Fix)
| Field | Value |
|---|---|
| Version | 2.3.5.0 |
| Date | 2026-03-09 |
| Extension | BC Dialing Application (Cambay Solutions) |
| Severity | Critical — eliminates remaining HTTP 403 NavPermissionException on new customer creation |
| Status | Compiled — ready for deployment |
Background
v2.3.4.0 deployed to Production on 2026-03-09 and added all 13 remaining standard Customer Templ. field tables, bringing the inline Permissions list to 33 tables. Post-deployment telemetry at 22:06, 22:10, 22:16, and 22:17 UTC confirms the NavPermissionException is still occurring at 100% of new customer creation attempts. All 403 calls show extensionVersion: 2.3.4.0, confirming the new version was active.
Root Cause of v2.3.4.0's Failure to Close the Issue
The v2.3.4.0 analysis was correct in identifying that INVCSalesHandler.OnAfterInsertCustomer fires during Customer.Insert(true) and calls CustTemplateMgmt.ApplyCustomerTemplate. However, it did not account for one additional table accessed inside ApplyCustomerTemplate.
The standard BC ApplyCustomerTemplate (Codeunit Customer Templ. Mgt.) performs two operations:
-
Field application — iterates over each field on the template record and calls
Customer.Validate(field, value). All 22 standardCustomer Templ.field table relations were covered in v2.3.4.0. -
Dimension copy — calls
CopyDefaultDimensionsFromTemplate, which reads the template'sDefault Dimensionrows and inserts correspondingDefault Dimensionrows for the new customer. Each insert callsDefaultDimension.Insert(true), which fires theDefault Dimensiontable'sOnInserttrigger. That trigger validatesDimension Codeagainst theDimensiontable (table 348) to confirm the dimension exists.
The Dimension table (348) — the dimension header table — was not in the inline Permissions list. Default Dimension (RIM) and Dimension Value (R) were both covered, but the parent Dimension table was not.
Why This Was Missed in Previous Versions
The permission gap analysis in v2.2.1.0, v2.3.3.0, and v2.3.4.0 all traced permissions by walking the field-level validate triggers. Dimension Code on the Default Dimension table validates against the Dimension table, but this lookup happens inside BC's standard ORM infrastructure (the field's TableRelation enforcement during Validate), not in a visible AL GET or FINDSET call. It does not appear in the AL source of the event subscribers or template management codeunit — it is enforced by the BC runtime when Insert(true) fires the OnInsert trigger with trigger validation enabled.
Supporting Evidence
Post-v2.3.4.0 RT0008 events (22:06–22:17 UTC):
| Timestamp | Page | Status | sqlExecutes | sqlRowsRead | totalTime |
|---|---|---|---|---|---|
| 22:05:31 | 80000 | 201 (existing) | 7 | 17 | 0.041s |
| 22:06:09 | 80000 | 403 (new) | 12 | 20 | 0.092s |
| 22:06:09 | 80000 | 403 (new) | 10 | 18 | 0.079s |
| 22:10:28 | 80000 | 403 (new) | 12 | 20 | 0.095s |
| 22:10:29 | 80000 | 403 (new) | 11 | 18 | 0.058s |
| 22:16:06 | 80000 | 403 (new) | 10 | 18 | 11.05s |
| 22:17:11 | 80003 | 403 (new) | 12 | 20 | 0.077s |
| 22:17:12 | 80003 | 403 (new) | 10 | 18 | 0.086s |
The 403 calls consistently execute 3–5 more SQL statements and read 1–3 more rows than the 201 (existing customer) calls. The additional SQL is the new customer creation path up to and including the first DefaultDimension.Insert(true) attempt, which fails when the BC runtime tries to validate Dimension Code against the Dimension table.
The 11-second failure at 22:16:06 is consistent with a SQL lock wait timeout on a prior failed transaction, not a behavioral difference — the permission failure occurs at the same point in execution.
BCDIALER-0020 breadcrumb data (all post-deployment): zero step 6 (ApplyCustomerTemplate) events fired. All attempts halt between step 5 (Insert(true) called) and step 6, confirming the failure is inside Customer.Insert(true).
BCDIALER-4001 (new customer created): zero events since deployment across all versions.
The INVCCustomerAreaDimension Subscriber
INVCMiscIIntegrationHandler.INVCCustomerAreaDimension (Codeunit 50006, line 73) also calls DefaultDim.Validate("Dimension Code", GeneralLedgerSetup."Shortcut Dimension 3 Code") at line 111. This fires when Rec.County <> ''. For the ECOMMERCE template, if the template sets a County value, the INVCSalesHandler.OnAfterInsertCustomer call to ApplyCustomerTemplate may write County to the Customer record via Customer.Modify(true), which then fires INVCUpdateSalesOrderAreaDimension (OnAfterModifyEvent, line 8) — which also calls DefaultDim.Validate("Dimension Code", ...) when County changes. All three code paths require Dimension = R.
Neither INVCMiscIIntegrationHandler (Codeunit 50006) nor INVCSalesHandler (Codeunit 50005) define inline Permissions properties — they have none. These codeunits run entirely within Page 80000's inline permission context when called from the BC Dialing Application's API execution chain.
Summary of Changes
| # | Severity | Category | Description |
|---|---|---|---|
| 1 | Critical | Fixed | Added Dimension = R to Pages 80000, 80003, and CU-60000 inline Permissions — covers Dimension table (348) access during DefaultDimension.Insert(true) inside ApplyCustomerTemplate and INVCCustomerAreaDimension |
Detailed Changes
1. Dimension Table Permission — Pages 80000, 80003, and CU-60000
Files modified:
src/Page/Pag-80000.ReceivePhoneNumber.alsrc/Page/Pag-80003.ReceiveEmail.alsrc/Codeunit/CU-60000.PhoneIntegration.al
Table added:
| Table | BC Table No. | Permission | Accessed By |
|---|---|---|---|
Dimension | 348 | R | DefaultDimension.Insert(true) OnInsert trigger validates Dimension Code via TableRelation enforcement; also DefaultDim.Validate("Dimension Code", ...) in INVCCustomerAreaDimension and INVCUpdateSalesOrderAreaDimension |
Updated Permissions property (34 tables, up from 33):
Permissions = tabledata CustomerPhoneLog = RIM,
tabledata Customer = RIM,
tabledata "NextivaConfig" = R,
tabledata "Customer Templ." = R,
tabledata "No. Series" = R,
tabledata "No. Series Line" = RM,
tabledata "Sales & Receivables Setup" = R,
tabledata "Marketing Setup" = R,
tabledata Contact = RIM,
tabledata "Contact Business Relation" = RIM,
tabledata "Business Relation" = R,
tabledata "Default Dimension" = RIM,
tabledata Dimension = R,
tabledata "Dimension Value" = R,
tabledata "Customer Posting Group" = R,
tabledata "Gen. Business Posting Group" = R,
tabledata "VAT Business Posting Group" = R,
tabledata "Salesperson/Purchaser" = R,
tabledata "Payment Terms" = R,
tabledata "Currency" = R,
tabledata "Country/Region" = R,
tabledata "General Ledger Setup" = R,
tabledata "Customer Price Group" = R,
tabledata "Tax Area" = R,
tabledata "Payment Method" = R,
tabledata "Shipment Method" = R,
tabledata Language = R,
tabledata "Finance Charge Terms" = R,
tabledata Territory = R,
tabledata "Customer Discount Group" = R,
tabledata "Shipping Agent" = R,
tabledata "Reminder Terms" = R,
tabledata "Responsibility Center" = R,
tabledata Location = R,
tabledata "Post Code" = R;
Permission History
| Version | Tables | Change |
|---|---|---|
| 2.0.0.12 | 2 | CustomerPhoneLog, Customer |
| 2.2.1.0 | 15 | +13 standard BC tables for Insert(true) and ApplyCustomerTemplate base flow |
| 2.3.3.0 | 20 | +5 tables for ECOMMERCE template field validation and BestwayUSA event subscribers |
| 2.3.4.0 | 33 | +13 tables — all remaining standard Customer Templ. field tables |
| 2.3.5.0 | 34 | +1 table — Dimension (348), accessed by DefaultDimension.Insert(true) during CopyDefaultDimensionsFromTemplate inside ApplyCustomerTemplate |
Why This Is the Final Missing Table
The v2.3.5.0 analysis arrives at Dimension (348) through a different lens than prior versions: tracing the BC ORM infrastructure, not just the visible AL code. Prior analyses walked the AL Validate and GET calls. The Dimension table access is not a visible AL statement — it is enforced by the BC runtime during Insert(true) when the Default Dimension table's OnInsert trigger fires and validates the Dimension Code field's TableRelation. This class of permission requirement is invisible to static code analysis and can only be confirmed by observing that the failure occurs at the dimension-copy step of ApplyCustomerTemplate.
With Dimension = R added, the complete set of tables accessed by the new customer creation path is covered:
- The Customer creation fields ✓ (all standard Customer Templ. field table relations — v2.3.4.0)
- The Customer Insert(true) infrastructure (No. Series, Contact, Business Relation, Marketing Setup, Default Dimension, Dimension) ✓
- The BestwayUSA event subscriber tables (General Ledger Setup, Customer Posting Group, Dimension) ✓
- The ECOMMERCE template field validation tables ✓
No further missing tables are expected.
Impact on Related Issues
| Issue | Impact |
|---|---|
| ISSUE-12 (403 permissions — CRITICAL) | Final fix. Dimension table access during CopyDefaultDimensionsFromTemplate is the last unresolved permission gap. |
| ISSUE-14 (Job Queue 91% error rate) | Self-resolves. New customer creation will succeed. |
| ISSUE-13 (stale page error) | Partial mitigation. If Insert(true) failures were contributing to partial writes, this fix eliminates that trigger. |
| ISSUE-15 (email log backlog) | No direct impact. |
Object Inventory
No new objects. Modified objects only:
| Object | ID | Type | Status | Description |
|---|---|---|---|---|
| ReceivePhoneNumber | 80000 | Page | Modified | Added Dimension = R (34 tables total) |
| ReceiveEmail | 80003 | Page | Modified | Added Dimension = R (34 tables total) |
| PhoneIntegration | 60000 | Codeunit | Modified | Added Dimension = R (34 tables total) |
Deployment Notes
- No data migration required — permission declaration only, no behavioral changes
- No configuration changes required
- Backwards compatible — additive permission, no logic changes
- Supersedes v2.3.4.0 — deploy this version directly
- Verification: After deployment, trigger an inbound call to a phone number not in BC (new customer creation path). The call should return HTTP 201. Breadcrumb steps 6 and 7 (
ApplyCustomerTemplateandModify) should appear in Application Insights within 5–10 minutes. BCDIALER-4001 ("new customer created") should fire for the first time. - Post-deployment monitoring: The
tools/monitor_v2340.pyscript monitors BCDIALER-4001, breadcrumb steps 6/7, and the RT0008 403/201 ratio. UpdateDEPLOY_TIMEto the v2.3.5.0 deployment timestamp before running.
Known Limitations
- BestwayUSA extension changes — if Innovia modifies the BestwayUSA extension to add new event subscribers that access tables outside this permission list, this list would need updating.
- Non-standard templates — if
Customer Template Namein NextivaConfig is changed to a template with custom dimensions or extension-defined fields, additional tables may be needed. - Orphaned phone logs from ISSUE-14 — records that errored before this fix can be reprocessed via the Manual Sync page (80009) after deployment.