
Hi there,
I have created an API endpoint for posting a $batch on api.businesscentral.dynamics.com/.../$batch
When I call it with the payload below, the Journal Header and lines create with no issue, but the postBatch call always fails when its part of the $batch.
But when I call it in a separate $batch entirely it works and posts the Journal Batch (assuming no errors).
{
"requests": [
{
"method": "POST",
"id": "r1",
"url": "journalBatches?companyName=CBP",
"headers": {
"Content-Type": "application/json"
},
"body": {
"JournalTemplate": "GENERAL",
"JournalBatchName": "QWERTY19",
"Description": "Default Journal Batch",
"CopyVAT": false
}
},
{
"method": "POST",
"id": "r2",
"url": "journalLines?companyName=CBP",
"headers": {
"Content-Type": "application/json"
},
"body": {
"JournalTemplate": "GENERAL",
"LineNo": 1,
"JournalBatchName": "QWERTY19",
"PostingDate": "2023-04-13",
"AccountType": "G/L Account",
"AccountNo": "9100",
"DocumentNo": "1",
"ExternalDocumentNo": "5",
"DocumentType": "Invoice",
"Amount": 5,
"Description": "Default Journal Batch",
"Comment": "comment",
"ShortcutDimension1Code": "115",
"ShortcutDimension2Code": "210"
}
},
{
"method": "POST",
"id": "r3",
"url": "journalLines?companyName=CBP",
"headers": {
"Content-Type": "application/json"
},
"body": {
"JournalTemplate": "GENERAL",
"LineNo": 2,
"JournalBatchName": "QWERTY19",
"PostingDate": "2023-04-13",
"AccountType": "G/L Account",
"AccountNo": "9100",
"DocumentNo": "2",
"ExternalDocumentNo": "6",
"DocumentType": "Invoice",
"Amount": -5,
"Description": "Default Journal Batch",
"Comment": "comment",
"ShortcutDimension1Code": "115",
"ShortcutDimension2Code": "210"
}
},
{
"method": "POST",
"id": "r4",
"url": "journalBatches(JournalTemplate='GENERAL',JournalBatchName='QWERTY19')/Microsoft.NAV.postBatch?companyName=CBP",
"headers": {
"Content-Type": "application/json"
}
}
]
}
Below is the code response when I call the above in Postman
{
"responses": [
{
"id": "r1",
"status": 201,
"headers": {
"location": "https://api.businesscentral.dynamics.com/v2.0/f519b312-7578-4094-a321-3615690bed23/sandbox/api/Thyme/JournalBatchGroup/v2.0/journalBatches(JournalTemplate='GENERAL',JournalBatchName='QWERTY19')",
"content-type": "application/json; odata.metadata=minimal; odata.streaming=true",
"odata-version": "4.0"
},
"body": {
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/f519b312-7578-4094-a321-3615690bed23/sandbox/api/Thyme/JournalBatchGroup/v2.0/$metadata#journalBatches/$entity",
"@odata.etag": "W/\"JzIwOzE0NTM3ODEzOTQwMjAwNjExNzMwMTswMDsn\"",
"JournalTemplate": "GENERAL",
"JournalBatchName": "QWERTY19",
"Description": "Default Journal Batch",
"CopyVAT": false
}
},
{
"id": "r2",
"status": 201,
"headers": {
"location": "https://api.businesscentral.dynamics.com/v2.0/f519b312-7578-4094-a321-3615690bed23/sandbox/api/Thyme/JournalBatchGroup/v2.0/journalLines(JournalTemplate='GENERAL',JournalBatchName='QWERTY19',LineNo=1)",
"content-type": "application/json; odata.metadata=minimal; odata.streaming=true",
"odata-version": "4.0"
},
"body": {
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/f519b312-7578-4094-a321-3615690bed23/sandbox/api/Thyme/JournalBatchGroup/v2.0/$metadata#journalLines/$entity",
"@odata.etag": "W/\"JzE5OzU0NjE2NzkyNTMzODkyMjkxNzYxOzAwOyc=\"",
"JournalTemplate": "GENERAL",
"JournalBatchName": "QWERTY19",
"LineNo": 1,
"PostingDate": "2023-04-13",
"AccountType": "G/L Account",
"AccountNo": "9100",
"DocumentNo": "1",
"ExternalDocumentNo": "5",
"DocumentType": "Invoice",
"Amount": 5.00,
"Description": "Default Journal Batch",
"Comment": "comment",
"ShortcutDimension1Code": "115",
"ShortcutDimension2Code": "210"
}
},
{
"id": "r3",
"status": 201,
"headers": {
"location": "https://api.businesscentral.dynamics.com/v2.0/f519b312-7578-4094-a321-3615690bed23/sandbox/api/Thyme/JournalBatchGroup/v2.0/journalLines(JournalTemplate='GENERAL',JournalBatchName='QWERTY19',LineNo=2)",
"content-type": "application/json; odata.metadata=minimal; odata.streaming=true",
"odata-version": "4.0"
},
"body": {
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/f519b312-7578-4094-a321-3615690bed23/sandbox/api/Thyme/JournalBatchGroup/v2.0/$metadata#journalLines/$entity",
"@odata.etag": "W/\"JzE5OzE4Njg3MTYzNzM4NzE4MjA4NzIxOzAwOyc=\"",
"JournalTemplate": "GENERAL",
"JournalBatchName": "QWERTY19",
"LineNo": 2,
"PostingDate": "2023-04-13",
"AccountType": "G/L Account",
"AccountNo": "9100",
"DocumentNo": "2",
"ExternalDocumentNo": "6",
"DocumentType": "Invoice",
"Amount": -5.00,
"Description": "Default Journal Batch",
"Comment": "comment",
"ShortcutDimension1Code": "115",
"ShortcutDimension2Code": "210"
}
},
{
"id": "r4",
"status": 400,
"headers": {
"content-type": "application/json",
"content-length": "220"
},
"body": {
"error": {
"code": "Internal_ServerError",
"message": "An error occurred and the transaction is stopped. Contact your administrator or partner for further assistance. CorrelationId: 7d7aae9a-604d-4a21-95da-9038ab73fe5f."
}
}
}
]
}
Below is my AL code relevant to this project
page 60100 JournalBatchAPI
{
PageType = API;
Caption = 'JournalBatch';
APIPublisher = 'Thyme';
APIGroup = 'JournalBatchGroup';
APIVersion = 'v2.0';
EntityName = 'JournalBatch';
EntitySetName = 'JournalBatches';
SourceTable = "Gen. Journal Batch";
DelayedInsert = true;
SourceTableView = where("Journal Template Name" = const('GENERAL'));
layout
{
area(Content)
{
repeater(GroupName)
{
field(JournalTemplate; rec."Journal Template Name")
{
ApplicationArea = All;
Caption = 'JournalTemplate';
}
field(JournalBatchName; rec.Name)
{
ApplicationArea = All;
Caption = 'JournalBatchName';
}
field(Description; Rec.Description)
{
ApplicationArea = All;
Caption = 'Description';
}
field(CopyVAT; Rec."Copy VAT Setup to Jnl. Lines")
{
ApplicationArea = All;
Caption = 'CopyVAT';
}
}
}
}
[ServiceEnabled]
procedure PostBatch(var ActionContext: WebServiceActionContext)
var
GenJournalPostBatch: Codeunit "Gen. Jnl.-B.Post";
begin
GenJournalPostBatch.Run(Rec);
ActionContext.SetObjectType(ObjectType::Page);
ActionContext.SetObjectId(Page::JournalBatchAPI);
ActionContext.AddEntityKey(rec.FieldNo(Name), Rec.Name);
ActionContext.SetResultCode(WebServiceActionResultCode::Created);
end;
}
page 60101 JournalLineAPI
{
PageType = API;
Caption = 'JournalLine';
APIPublisher = 'Thyme';
APIGroup = 'JournalBatchGroup';
APIVersion = 'v2.0';
EntityName = 'JournalLine';
EntitySetName = 'JournalLines';
SourceTable = "Gen. Journal Line";
DelayedInsert = true;
layout
{
area(Content)
{
repeater(GroupName)
{
field(JournalTemplate; rec."Journal Template Name")
{
Caption = 'JournalTemplate';
}
field(JournalBatchName; rec."Journal Batch Name")
{
Caption = 'JournalBatchName';
}
field(LineNo; rec."Line No.")
{
Caption = 'LineNo';
}
field(PostingDate; rec."Posting Date")
{
Caption = 'PostingDate';
}
field(AccountType; rec."Account Type")
{
Caption = 'AccountType';
}
field(AccountNo; rec."Account No.")
{
Caption = 'AccountNo';
}
field(DocumentNo; rec."Document No.")
{
Caption = 'DocumentNo';
}
field(ExternalDocumentNo; rec."External Document No.")
{
Caption = 'ExternalDocumentNo';
}
field(DocumentType; rec."Document Type")
{
Caption = 'DocumentType';
}
field(Amount; rec.Amount)
{
Caption = 'Amount';
}
field(Description; rec.Description)
{
Caption = 'Description';
}
field(Comment; rec.Comment)
{
Caption = 'Comment';
}
field("ShortcutDimension1Code"; Rec."Shortcut Dimension 1 Code")
{
Caption = '"ShortcutDimension1Code";Rec."Shortcut Dimension 1 Code"';
}
field("ShortcutDimension2Code"; Rec."Shortcut Dimension 2 Code")
{
Caption = '"ShortcutDimension2Code";Rec."Shortcut Dimension 1 Code"';
}
}
}
}
}