feat: export all available BC API v2.0 entities

Added 31 missing entities across three categories:

Standalone (16 new): companyInformation, itemCategories,
shipmentMethods, taxAreas, taxGroups, unitsOfMeasure,
timeRegistrationEntries, contacts, generalProductPostingGroups,
inventoryPostingGroups, itemLedgerEntries, opportunities,
locations, projects, journalLines, irs1099

Financial reports (10 new, always full export): agedAccountsPayable,
agedAccountsReceivable, balanceSheet, cashFlowStatement,
incomeStatement, retainedEarningsStatement, trialBalance,
customerFinancialDetails, customerSales, vendorPurchases

Document+lines (5 new): salesQuotes, salesShipments,
purchaseReceipts, customerPaymentJournals, vendorPaymentJournals

Total entities: 19 → 50

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-17 09:18:24 +01:00
parent 1ea3127a1d
commit f40e57f576

View File

@@ -19,7 +19,7 @@ $bcCompanyName = $env:BC_COMPANY_NAME # optional: filter to specific company
$baseUrl = "https://api.businesscentral.dynamics.com/v2.0/$tenantId/$environmentName/api/v2.0" $baseUrl = "https://api.businesscentral.dynamics.com/v2.0/$tenantId/$environmentName/api/v2.0"
# Standalone entities to extract # Standalone entities to extract (support lastModifiedDateTime filter for incremental)
$entities = @( $entities = @(
"accounts", "accounts",
"customers", "customers",
@@ -34,18 +34,53 @@ $entities = @(
"paymentTerms", "paymentTerms",
"paymentMethods", "paymentMethods",
"journals", "journals",
"countriesRegions" "journalLines",
"countriesRegions",
"companyInformation",
"itemCategories",
"shipmentMethods",
"taxAreas",
"taxGroups",
"unitsOfMeasure",
"timeRegistrationEntries",
"contacts",
"generalProductPostingGroups",
"inventoryPostingGroups",
"itemLedgerEntries",
"opportunities",
"locations",
"projects",
"irs1099"
)
# Financial report entities (always full export, no incremental filter support)
$reportEntities = @(
"agedAccountsPayable",
"agedAccountsReceivable",
"balanceSheet",
"cashFlowStatement",
"incomeStatement",
"retainedEarningsStatement",
"trialBalance",
"customerFinancialDetails",
"customerSales",
"vendorPurchases"
) )
# Document entities with line items # Document entities with line items
# Lines cannot be queried standalone at the top level. # Lines cannot be queried standalone at the top level.
# We fetch document headers first, then fetch lines per document. # We fetch document headers first, then fetch lines per document.
$documentEntities = @{ $documentEntities = @{
"salesInvoices" = "salesInvoiceLines" "salesInvoices" = "salesInvoiceLines"
"salesOrders" = "salesOrderLines" "salesOrders" = "salesOrderLines"
"salesCreditMemos" = "salesCreditMemoLines" "salesCreditMemos" = "salesCreditMemoLines"
"purchaseInvoices" = "purchaseInvoiceLines" "purchaseInvoices" = "purchaseInvoiceLines"
"purchaseOrders" = "purchaseOrderLines" "purchaseOrders" = "purchaseOrderLines"
"salesQuotes" = "salesQuoteLines"
"salesShipments" = "salesShipmentLines"
"purchaseReceipts" = "purchaseReceiptLines"
"customerPaymentJournals" = "customerPayments"
"vendorPaymentJournals" = "vendorPayments"
} }
# Token management # Token management
@@ -194,11 +229,12 @@ function Export-EntityData {
[string]$CompanyId, [string]$CompanyId,
[string]$CompanyName, [string]$CompanyName,
[string]$EntityName, [string]$EntityName,
[string]$OutputDir [string]$OutputDir,
[switch]$NoFilter
) )
$entityUrl = "$baseUrl/companies($CompanyId)/$EntityName" $entityUrl = "$baseUrl/companies($CompanyId)/$EntityName"
if ($SinceDateTime) { if ($SinceDateTime -and -not $NoFilter) {
$entityUrl += "?`$filter=lastModifiedDateTime gt $SinceDateTime" $entityUrl += "?`$filter=lastModifiedDateTime gt $SinceDateTime"
} }
$maxEntityRetries = 5 $maxEntityRetries = 5
@@ -362,7 +398,8 @@ try {
Write-Log "Changes since: $SinceDateTime" Write-Log "Changes since: $SinceDateTime"
} }
Write-Log "Output Path: $OutputPath" Write-Log "Output Path: $OutputPath"
Write-Log "Entities to extract: $($entities.Count + $documentEntities.Count) ($($documentEntities.Count) with line items)" $totalEntityCount = $entities.Count + $reportEntities.Count + $documentEntities.Count
Write-Log "Entities to extract: $totalEntityCount ($($entities.Count) standalone, $($reportEntities.Count) reports, $($documentEntities.Count) with line items)"
# Create output directory # Create output directory
$exportDir = $OutputPath $exportDir = $OutputPath
@@ -430,6 +467,23 @@ try {
} }
} }
# Export financial report entities (always full, no incremental filter)
foreach ($entity in $reportEntities) {
$count = Export-EntityData `
-CompanyId $companyId `
-CompanyName $companyName `
-EntityName $entity `
-OutputDir $companyDir `
-NoFilter
$totalRecords += $count
$totalEntities++
if ($count -eq 0) {
$failedEntities += "$companyName/$entity"
}
}
# Export document entities with their line items # Export document entities with their line items
foreach ($docEntity in $documentEntities.Keys) { foreach ($docEntity in $documentEntities.Keys) {
$lineEntity = $documentEntities[$docEntity] $lineEntity = $documentEntities[$docEntity]