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:
@@ -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,7 +34,37 @@ $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
|
||||||
@@ -46,6 +76,11 @@ $documentEntities = @{
|
|||||||
"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]
|
||||||
|
|||||||
Reference in New Issue
Block a user