---
id: object/codeunit/4587
type: object
title: Codeunit 4587 "SOA Impl"
summary: Codeunit 4587 "SOA Impl" in SalesOrderAgent (Microsoft.Agent.SalesOrderAgent). 7 public procedures. Introduced in BC29, still in BC30.
tier: official
language: en
tags:
  - codeunit
  - salesorderagent
versions:
  introduced: "29"
  last_changed: null
  deprecated: null
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-11T00:31:51.816Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: e583d9c16b2016b93d71ab78b3d0100a8e704a99dd1fac442ec47a3f4f63528c
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAImpl.Codeunit.al
    title: src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAImpl.Codeunit.al (releases/29.x)
    date: null
    commit: ea08af5ef2d6a9b5c5af4a029288abbe2c883220
    t: null
    quote: null
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
  changes:
    - change/bcapps/10308
object_type: codeunit
object_id: 4587
name: SOA Impl
namespace: Microsoft.Agent.SalesOrderAgent
app: SalesOrderAgent
extends: null
first_version: "29"
last_version: "30"
present_in:
  - "29"
  - "30"
changed_in: []
source_major: "29"
obsolete: null
countries: []
ms_search_form_ids: []
counts:
  fields: 0
  procedures: 14
  events: 0
  subscribers: 0
relations:
  out: 0
  referenced_by: 0
  pages: 0
  extended_by: 0
  event_subscribers: 0
  calls: 4
  called_by: 9
  implements: 0
---

# Codeunit 4587 "SOA Impl"

> Codeunit 4587 "SOA Impl" in SalesOrderAgent (Microsoft.Agent.SalesOrderAgent). 7 public procedures. Introduced in BC29, still in BC30.

SalesOrderAgent · Microsoft.Agent.SalesOrderAgent · BC29-30 · [source at ea08af5e](https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Apps/W1/SalesOrderAgent/app/src/Integration/SOAImpl.Codeunit.al) · facts from BC29

## Properties

| Property | Value |
|---|---|
| Access | Internal |
| Permissions | tabledata "Email Inbox" = rd, tabledata User = R |

## Procedures

- `ScheduleSOAgent(var SOASetup: Record "SOA Setup")` (internal)
- `ActiveAgentExistInCurrentCompany(): Boolean`: Checks if the agent is active in the current company. Method must work even for users that have no access to Agent, thus we need to use User table to check if the agent is enabled.
- `RemoveScheduledTasksIfAgentNotActive(var SOASetup: Record "SOA Setup"): Boolean` (internal): Cancels the scheduled tasks of an agent that is no longer live, either deactivated or archived, and clears them from the setup record. Deactivation already removes the tasks when it goes through the agent setup, so this covers tasks that survived, for example when the agent was deactivated from the ...
- `RemoveScheduledTask(var SOASetup: Record "SOA Setup")` (internal)
- `GetProcessLimitPerDay(var SOASetup: Record "SOA Setup"): Integer` (internal)
- `RemoveTaskLogsOlderThan24hrs()`
- `RegisterCapability()`

Plus 7 local procedures.

## Calls

From the extracted call graph of BC29 (graphify-al on the snapshot checkout): calls whose target is known from a declared type or an `Object::"Name"` argument. Interface dispatch and calls through events are not counted, so the list is not complete.

- [Codeunit 4400 "SOA Setup"](../codeunit/4400.md) (7 calls: `GetInstanceOffset → CountNonArchivedSetups`, `RemoveScheduledTask → GetFeatureName`, `RemoveScheduledTasksIfAgentNotActive → GetFeatureName`, …)
- [Codeunit 8703 "Feature Telemetry"](../codeunit/8703.md) (5 calls: `RemoveScheduledTask → LogUsage`, `RemoveScheduledTasksIfAgentNotActive → LogError`, `RemoveScheduledTasksIfAgentNotActive → LogUsage`, …)
- [Codeunit 7773 "Copilot Capability"](../codeunit/7773.md) (3 calls: `RegisterCapability → IsCapabilityRegistered`, `RegisterCapability → ModifyCapability`, `RegisterCapability → RegisterCapability`)
- [Codeunit 457 "Environment Information"](../codeunit/457.md) (1 call: `RegisterCapability → IsSaaSInfrastructure`)

## Called by

- [Codeunit 4400 "SOA Setup"](../codeunit/4400.md) (3 calls: `CreateAgent → ScheduleSOAgent`, `UpdateAgent → RemoveScheduledTask`, `UpdateAgent → ScheduleSOAgent`)
- [Codeunit 4586 "SOA Dispatcher"](../codeunit/4586.md) (3 calls: `RunSOAgent → RemoveScheduledTasksIfAgentNotActive`, `RunSOAgent → RemoveTaskLogsOlderThan24hrs`, `RunSOAgent → ScheduleSOAgent`)
- [Codeunit 4584 "SOA Recovery"](../codeunit/4584.md) (2 calls: `RunSOARecovery → RemoveScheduledTasksIfAgentNotActive`, `RunSOARecovery → ScheduleSOAgent`)
- [Codeunit 4588 "SOA Install"](../codeunit/4588.md) (2 calls: `OnInstallAppPerDatabase → RegisterCapability`, `OnRegisterCopilotCapability → RegisterCapability`)
- [Codeunit 4399 "SOA Annotation"](../codeunit/4399.md) (1 call: `ShouldAddOverProcessLimitAnnotation → GetProcessLimitPerDay`)
- [Codeunit 4582 "SOA Retrieve Emails"](../codeunit/4582.md) (1 call: `RetrieveEmails → GetProcessLimitPerDay`)
- [Codeunit 4585 "SOA Error Handler"](../codeunit/4585.md) (1 call: `RunSOAErrorHandler → ScheduleSOAgent`)
- [Codeunit 4589 "SOA Upgrade"](../codeunit/4589.md) (1 call: `RegisterCapability → RegisterCapability`)
- [Codeunit 4595 "SOA - KPI Track All"](../codeunit/4595.md) (1 call: `TrackChanges → ActiveAgentExistInCurrentCompany`)

## Recent changes

- 2026-08-19 [#10308 Uptake agent archiving in Sales Order Agent (AB#644549)](../../changes/bcapps/10308.md) (main, BC30, feature)

## Across versions

- Present in: BC29-30
- Changed (declaration) in: none

Source: AL metadata extracted from the code (names, ids, signatures, properties); no code bodies (D10).

## Ask your agent

Procedure bodies are not stored here (D10). The call sections above are our own, per object, from the BC29 call graph. For a procedure body or the calls of one procedure, ask bc-code-atlas (external, by Stefan Maron, MIT; default corpus w1-28), which the bc-observatory plugin connects: `bcatlas_resolve_node(object_type: "codeunit", object_name: "SOA Impl")`, then `bcatlas_get_procedure_body` or `bcatlas_get_neighbors` on the returned id.
