feat: add source-dynamics-365-business-central manifest-only connector#74070
Conversation
Adds a new manifest-only (low-code) connector for Microsoft Dynamics 365 Business Central using the OData v4 REST API (v2.0). Streams (8): - companies (full refresh) - general_ledger_entries (incremental) - accounts (incremental) - customers (incremental) - vendors (incremental) - sales_invoices (incremental) - purchase_invoices (incremental) - journals (incremental) Features: - OAuth 2.0 client credentials via Azure AD / Entra ID - OData server-driven pagination (@odata.nextLink / $skiptoken) - Company-scoped sub-streams via SubstreamPartitionRouter - Server-side incremental filtering via OData $filter on lastModifiedDateTime - Optional company_id config to scope sync to a single company Resolves: #14405 Co-Authored-By: Ilja Herdt <ilja.herdt@airbyte.io>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
|
Note 📝 PR Converted to Draft More info...Thank you for creating this PR. As a policy to protect our engineers' time, Airbyte requires all PRs to be created first in draft status. Your PR has been automatically converted to draft status in respect for this policy. As soon as your PR is ready for formal review, you can proceed to convert the PR to "ready for review" status by clicking the "Ready for review" button at the bottom of the PR page. To skip draft status in future PRs, please include |
👋 Greetings, Airbyte Team Member!Here are some helpful tips and reminders for your convenience. 💡 Show Tips and TricksPR Slash CommandsAirbyte Maintainers (that's you!) can execute the following slash commands on your PR:
📚 Show Repo GuidanceHelpful Resources
|
|
…central Co-Authored-By: Ilja Herdt <ilja.herdt@airbyte.io>
|
Deploy preview for airbyte-docs ready! ✅ Preview Built with commit 63f945b. |
What
Adds a new manifest-only (low-code) connector for Microsoft Dynamics 365 Business Central using the OData v4 REST API (v2.0).
Resolves #14405 (community request, revived for a customer).
How
Single
manifest.yamldeclarative connector with 8 streams:companiesGET /companiesgeneral_ledger_entrieslastModifiedDateTimeGET /companies({id})/generalLedgerEntriesaccountslastModifiedDateTimeGET /companies({id})/accountscustomerslastModifiedDateTimeGET /companies({id})/customersvendorslastModifiedDateTimeGET /companies({id})/vendorssales_invoiceslastModifiedDateTimeGET /companies({id})/salesInvoicespurchase_invoiceslastModifiedDateTimeGET /companies({id})/purchaseInvoicesjournalslastModifiedDateTimeGET /companies({id})/journalsKey design decisions:
source-microsoft-entra-id)$skiptokenfrom@odata.nextLink(pattern fromsource-microsoft-entra-id)SubstreamPartitionRouterwithcompaniesas parent stream; optionalcompany_idconfig filters client-side viaRecordFilterDatetimeBasedCursorwithis_data_feed: true+ server-side$filter=lastModifiedDateTime ge ...+$orderby=lastModifiedDateTime ascadditionalProperties: trueFiles added:
airbyte-integrations/connectors/source-dynamics-365-business-central/manifest.yaml— connector definitionairbyte-integrations/connectors/source-dynamics-365-business-central/metadata.yaml— registry metadataairbyte-integrations/connectors/source-dynamics-365-business-central/icon.svg— connector icondocs/integrations/sources/dynamics-365-business-central.md— user-facing documentation (setup guide, configuration, streams, changelog)Review guide
manifest.yaml— Incremental$filterlogic (lines 60-61, 112-113, etc.):stream_interval.start_timeis populated whenis_data_feed: true(single slice mode)$filter=parameter doesn't break BC OData API (fallback whenstream_intervalis falsy)manifest.yaml—$orderbysupport (lines 59, 111, etc.):$orderby=lastModifiedDateTime asc— not all BC API endpoints may support$orderbyonlastModifiedDateTime(not documented explicitly for every entity)manifest.yaml— OData pagination regex (lines 548-551):@odata.nextLinkformat matches this regex (borrowed fromsource-microsoft-entra-id/ Microsoft Graph)manifest.yaml—company_idfilter (lines 35-37):metadata.yaml—definitionId(line 20):definitionId: b5c21b91-1eab-46a3-ba01-910caaf3f567— verify UUID doesn't collide with existing connectorSchemas (lines 600-1375 in
manifest.yaml):additionalProperties: trueprovide sufficient defensive coverageDocumentation (
docs/integrations/sources/dynamics-365-business-central.md):User Impact
Positive:
Negative / Risks:
$filteror$orderbyparameters are rejected by BC APIstream_interval.start_timeis not populated inis_data_feed: truemodeCan this PR be safely reverted and rolled back?
New connector, no dependencies, OSS-only (
cloud: enabled: false).Link to Devin run: https://app.devin.ai/sessions/3cbb99948104440c8cb9722cd48d08c3
Requested by: Ilja Herdt (Airbyte) (@iherdt-airbyte)