Belgium (BE) Implementation Examples
Complete Belgium-compliant examples using the canonical GETS structure. Includes both the final GETS JSON format and Java SDK payload examples. All examples provide 100% field coverage for Belgium requirements with EU compliance (EN 16931-1:2017, Peppol BIS Billing 3.0) and multi-language support (French/Dutch).
Belgium-Specific Features
Compliance Standards
- EU Standard: EN 16931-1:2017
- Peppol Network: Peppol BIS Billing 3.0
- VAT Format: BE + 10 digits (e.g., BE0123456789)
- CBE Registration: Belgian Crossroads Bank for Enterprises format (e.g., 0123.456.789)
- Multi-language: French/Dutch support
Required Fields
- VAT numbers (BE + 10 digits)
- CBE registration numbers
- Peppol IDs (9925:BEXXXXXXXXXX)
- IBAN for payment information
- BIC codes for bank transfers
- EU compliance flags (isIntraEU, isExport, isReverseCharge)
Java SDK Examples
Complete B2B Tax Invoice Example
Complete working example from BelgiumTaxInvoiceTest.java demonstrating Belgium-specific TAX_INVOICE functionality with Peppol network support.
package io.complyance.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.complyance.sdk.Country;
import io.complyance.sdk.Environment;
import io.complyance.sdk.GETSUnifySDK;
import io.complyance.sdk.LogicalDocType;
import io.complyance.sdk.Mode;
import io.complyance.sdk.Operation;
import io.complyance.sdk.Purpose;
import io.complyance.sdk.SDKConfig;
import io.complyance.sdk.SDKException;
import io.complyance.sdk.Source;
import io.complyance.sdk.SourceType;
import io.complyance.sdk.UnifyResponse;
/**
* Belgium Tax Invoice Test - Demonstrates Belgium-specific TAX_INVOICE functionality
*
* This test class demonstrates:
* - Belgium (BE) country-specific compliance
* - TAX_INVOICE logical document type mapping
* - B2B transaction processing with Peppol network
* - Belgium-specific field mappings (VAT, CBE, Peppol IDs)
* - Comprehensive payload with Belgian invoice data
* - Multi-language support (French/Dutch)
* - EU compliance (EN 16931-1:2017, Peppol BIS Billing 3.0)
*/
public class BelgiumTaxInvoiceTest {
public static void main(String[] args) {
System.out.println("=== ๐ง๐ช Belgium Tax Invoice Test ===");
System.out.println("Testing Belgium-specific TAX_INVOICE functionality");
System.out.println("Demonstrates B2B mapping, BE compliance, Peppol network, and comprehensive payload");
try {
// Configure SDK
configureSDK();
// Create comprehensive Belgium test payload
Map<String, Object> payload = createBelgiumTestPayload();
System.out.println("โ
Belgium test payload created");
System.out.println(" ๐ Expected GETS fields coverage: 37/37 (100%)");
System.out.println(" ๐ง๐ช Expected BE country fields coverage: 9/9 (100%)");
System.out.println(" ๐ฐ Expected BE compliance fields coverage: 4/4 (100%)");
// Test Belgium TAX_INVOICE flow
testBelgiumTaxInvoiceFlow(payload);
System.out.println("\n๐ Belgium Tax Invoice test completed successfully!");
} catch (Exception e) {
System.err.println("โ Unexpected error: " + e.getMessage());
e.printStackTrace();
}
}
/**
* Configure the SDK for Belgium testing
*/
private static void configureSDK() {
Source source = new Source("belgium-source-system", "1.0", SourceType.FIRST_PARTY);
SDKConfig config = new SDKConfig("ak_368d073d3de1f19041612fe6cdcf",
Environment.SANDBOX, Arrays.asList(source));
GETSUnifySDK.configure(config);
System.out.println("โ
SDK Configured for Belgium Testing");
}
/**
* Creates Belgium test payload with generalized field names matching GETS structure
*/
private static Map<String, Object> createBelgiumTestPayload() {
Map<String, Object> payload = new HashMap<>();
// Invoice Data - Maps to GETS header fields
Map<String, Object> invoiceData = new HashMap<>();
invoiceData.put("document_number", "BE-INV-2024-001");
invoiceData.put("document_type", "tax_invoice");
invoiceData.put("invoice_date", "2024-01-15");
invoiceData.put("invoice_time", "14:30:00Z");
invoiceData.put("currency_code", "EUR");
invoiceData.put("tax_currency_code", "EUR");
invoiceData.put("due_date", "2024-02-14");
invoiceData.put("period_start_date", "2024-01-01");
invoiceData.put("period_end_date", "2024-01-31");
invoiceData.put("order_reference", "PO-2024-4567");
invoiceData.put("exchange_rate", 1.0);
invoiceData.put("line_extension_amount", 1900.00);
invoiceData.put("tax_exclusive_amount", 1850.00);
invoiceData.put("total_tax_amount", 388.50);
invoiceData.put("total_amount", 2238.50);
invoiceData.put("total_allowances", 100.00);
invoiceData.put("total_charges", 50.00);
invoiceData.put("prepaid_amount", 500.00);
invoiceData.put("amount_due", 1738.50);
invoiceData.put("rounding_amount", 0.50);
payload.put("invoice_data", invoiceData);
// Seller Info - Maps to GETS seller party fields with Belgium-specific data
Map<String, Object> sellerInfo = new HashMap<>();
sellerInfo.put("seller_name", "Sociรฉtรฉ Belge SPRL");
sellerInfo.put("seller_trade_name", "Belgian Trading Co");
sellerInfo.put("seller_party_id", "SELLER-12345");
sellerInfo.put("vat_number_type", "VAT");
sellerInfo.put("vat_number", "BE0123456789"); // BE + 10 digits
sellerInfo.put("registration_number", "0123.456.789"); // CBE format
sellerInfo.put("registration_type", "BE:CBE");
sellerInfo.put("legal_form", "SPRL");
sellerInfo.put("peppol_id", "9925:BE0123456789");
sellerInfo.put("seller_email", "contact@company.be");
sellerInfo.put("seller_phone", "+32 2 123 45 67");
sellerInfo.put("street_name", "Avenue Louise");
sellerInfo.put("additional_address", "Boรฎte 12");
sellerInfo.put("building_number", "123");
sellerInfo.put("city_name", "Bruxelles");
sellerInfo.put("state_province", "Rรฉgion de Bruxelles-Capitale");
sellerInfo.put("postal_code", "1050");
sellerInfo.put("country_code", "BE");
payload.put("seller_info", sellerInfo);
// Buyer Info - Maps to GETS buyer party fields with Belgium-specific data
Map<String, Object> buyerInfo = new HashMap<>();
buyerInfo.put("buyer_name", "Entreprise Belge SA");
buyerInfo.put("buyer_party_id", "BUYER-67890");
buyerInfo.put("buyer_vat_type", "VAT");
buyerInfo.put("buyer_vat_number", "BE0987654321"); // BE + 10 digits
buyerInfo.put("buyer_registration_number", "0987.654.321"); // CBE format
buyerInfo.put("buyer_registration_type", "BE:CBE");
buyerInfo.put("buyer_peppol_id", "9925:BE0987654321");
buyerInfo.put("buyer_email", "achat@entreprise.be");
buyerInfo.put("buyer_phone", "+32 3 987 65 43");
buyerInfo.put("buyer_street_name", "Rue de la Loi");
buyerInfo.put("buyer_additional_address", "รtage 5");
buyerInfo.put("buyer_building_number", "16");
buyerInfo.put("buyer_city", "Bruxelles");
buyerInfo.put("buyer_state_province", "Rรฉgion de Bruxelles-Capitale");
buyerInfo.put("buyer_postal_code", "1000");
buyerInfo.put("buyer_country", "BE");
payload.put("buyer_info", buyerInfo);
// Line Items - Maps to GETS line items fields
List<Map<String, Object>> lineItems = new ArrayList<>();
Map<String, Object> item1 = new HashMap<>();
item1.put("line_id", "1");
item1.put("item_name", "Service conseil");
item1.put("item_description", "Services de conseil en informatique");
item1.put("quantity", 10.00);
item1.put("unit_code", "HUR"); // UN/ECE Recommendation 20
item1.put("unit_price", 100.00);
item1.put("net_price", 95.00);
item1.put("discount_amount", 5.00);
item1.put("discount_reason_code", "95");
item1.put("taxable_amount", 950.00);
item1.put("tax_category", "S"); // Belgian VAT category
item1.put("tax_rate", 21.0); // Belgian standard VAT rate
item1.put("tax_amount", 199.50);
item1.put("line_total", 1149.50);
item1.put("standard_item_code", "1234567890123");
item1.put("standard_code_scheme", "GTIN");
item1.put("classification_code", "09348023");
item1.put("classification_scheme", "CPV");
item1.put("country_of_origin", "BE");
item1.put("seller_item_code", "SELLER-123");
item1.put("buyer_item_code", "BUYER-456");
lineItems.add(item1);
payload.put("line_items", lineItems);
// Tax Totals - Maps to GETS tax breakdown
List<Map<String, Object>> taxTotals = new ArrayList<>();
Map<String, Object> taxTotal1 = new HashMap<>();
taxTotal1.put("tax_category", "S");
taxTotal1.put("tax_rate", 21.0);
taxTotal1.put("taxable_amount", 1000.00);
taxTotal1.put("tax_amount", 210.00);
taxTotals.add(taxTotal1);
payload.put("tax_totals", taxTotals);
// Belgium Compliance - Maps to meta.config flags
Map<String, Object> belgiumCompliance = new HashMap<>();
belgiumCompliance.put("is_b2b", true);
belgiumCompliance.put("is_b2c", false);
belgiumCompliance.put("is_b2g", false);
belgiumCompliance.put("is_intra_eu", false);
belgiumCompliance.put("is_export", false);
belgiumCompliance.put("is_reverse_charge", false);
belgiumCompliance.put("is_triangulation", false);
belgiumCompliance.put("is_peppol_compliant", true);
belgiumCompliance.put("is_self_billed", false);
payload.put("belgium_compliance", belgiumCompliance);
// Payment Information - Maps to GETS payment fields
Map<String, Object> paymentInfo = new HashMap<>();
paymentInfo.put("payment_means_code", "30"); // UN/ECE 4461
paymentInfo.put("payment_id", "+++123/4567/89012+++");
paymentInfo.put("payment_terms", "Net 30 jours / Netto 30 dagen");
paymentInfo.put("payee_iban", "BE68 5390 0754 7034");
paymentInfo.put("payee_account_name", "Sociรฉtรฉ Belge SPRL");
paymentInfo.put("bic_code", "KREDBEBB");
paymentInfo.put("payment_instruction", "Payment by bank transfer");
paymentInfo.put("settlement_discount_percent", 2.0);
paymentInfo.put("penalty_surcharge_percent", 1.5);
payload.put("payment_info", paymentInfo);
// Belgium VAT Extensions - Maps to extensions.be_vat
Map<String, Object> belgiumVatExtensions = new HashMap<>();
belgiumVatExtensions.put("co_contractor_vat_number", "FR12345678901");
belgiumVatExtensions.put("reverse_charge_indicator", false);
belgiumVatExtensions.put("intra_eu_indicator", false);
belgiumVatExtensions.put("export_indicator", false);
belgiumVatExtensions.put("vat_declaration_period", "2024-Q1");
payload.put("belgium_vat_extensions", belgiumVatExtensions);
// Belgium Digital Signature Extensions - Maps to extensions.be_digital
Map<String, Object> belgiumDigitalExtensions = new HashMap<>();
belgiumDigitalExtensions.put("signature_method", "RSA-SHA256");
belgiumDigitalExtensions.put("certificate_info", "CN=Company,O=Org,C=BE");
belgiumDigitalExtensions.put("timestamp_info", "TSA-BE-001");
belgiumDigitalExtensions.put("signature_value", "MEQCIDg5OTVl...");
payload.put("belgium_digital_extensions", belgiumDigitalExtensions);
// Document Destinations - Maps to destinations array
List<Map<String, Object>> destinations = new ArrayList<>();
// Tax Authority Destination
Map<String, Object> taxAuthorityDestination = new HashMap<>();
taxAuthorityDestination.put("type", "tax_authority");
Map<String, Object> destinationDetails = new HashMap<>();
destinationDetails.put("country", "BE");
destinationDetails.put("authority", "SPF_FINANCES");
destinationDetails.put("document_type", "tax_invoice");
taxAuthorityDestination.put("details", destinationDetails);
destinations.add(taxAuthorityDestination);
// Peppol Network Destination
Map<String, Object> peppolDestination = new HashMap<>();
peppolDestination.put("type", "peppol_network");
Map<String, Object> peppolDetails = new HashMap<>();
peppolDetails.put("endpoint_id", "9925:BE0987654321");
peppolDetails.put("document_type_id", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2");
peppolDetails.put("process_id", "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0");
peppolDestination.put("details", peppolDetails);
destinations.add(peppolDestination);
payload.put("destinations", destinations);
// Additional Data
Map<String, Object> additionalData = new HashMap<>();
additionalData.put("order_reference", "PO-2024-4567");
additionalData.put("delivery_date", "2024-01-20");
additionalData.put("source_system", "belgium-source-system");
payload.put("additional_data", additionalData);
return payload;
}
/**
* Test Belgium TAX_INVOICE flow
*/
private static void testBelgiumTaxInvoiceFlow(Map<String, Object> payload) {
try {
System.out.println("\n=== ๐ Testing Belgium Tax Invoice Flow ===");
System.out.println(" ๐ฏ Testing: TAX_INVOICE with Belgium");
System.out.println(" ๐ Logical Type: TAX_INVOICE");
System.out.println(" ๐ง๐ช Country: BE");
System.out.println(" ๐ Expected: B2B tax invoice processing with Belgium compliance");
System.out.println(" ๐ Peppol Network: Enabled");
System.out.println(" ๐ Standard: EN 16931-1:2017, Peppol BIS Billing 3.0");
// Test with logical document type
UnifyResponse response = GETSUnifySDK.pushToUnify(
"belgium-source-system", // Source name
"1.0", // Source version
LogicalDocType.TAX_INVOICE, // Logical document type
Country.BE, // Country
Operation.SINGLE, // Operation
Mode.DOCUMENTS, // Mode
Purpose.MAPPING, // Purpose
payload // Belgium test data payload
);
printUnifyResponse(response, "Belgium Tax Invoice Flow");
System.out.println(" โ
VAT numbers validated (BE + 10 digits format)");
System.out.println(" โ
CBE registration numbers included");
System.out.println(" โ
Peppol network compliance");
System.out.println(" โ
Multi-language support (French/Dutch)");
} catch (SDKException e) {
System.err.println("โ Belgium Tax Invoice Flow failed: " + e.getMessage());
if (e.getErrorDetail() != null) {
System.err.println(" Error Code: " + e.getErrorDetail().getCode());
System.err.println(" Message: " + e.getErrorDetail().getMessage());
if (e.getErrorDetail().getSuggestion() != null) {
System.err.println(" Suggestion: " + e.getErrorDetail().getSuggestion());
}
}
}
}
/**
* Print UnifyResponse in a formatted way
*/
private static void printUnifyResponse(UnifyResponse response, String context) {
if (response == null) {
System.err.println("โ " + context + " failed: Response is null");
return;
}
if ("error".equalsIgnoreCase(response.getStatus())) {
System.err.println("โ " + context + " failed:");
if (response.getError() != null) {
System.err.println(" Error Code: " + response.getError().getCode());
System.err.println(" Message: " + response.getError().getMessage());
if (response.getError().getSuggestion() != null) {
System.err.println(" Suggestion: " + response.getError().getSuggestion());
}
} else {
System.err.println(" Message: " + response.getMessage());
}
} else {
System.out.println("โ
" + context + " Response: " + response.getStatus());
if (response.getMessage() != null) {
System.out.println(" ๐ฌ Message: " + response.getMessage());
}
}
}
}Key Belgium-Specific Features
VAT Number Format
Belgium VAT numbers follow the format: BE + 10 digits
sellerInfo.put("vat_number", "BE0123456789");
buyerInfo.put("buyer_vat_number", "BE0987654321");CBE Registration Number
Belgian Crossroads Bank for Enterprises (CBE) format: 0123.456.789
sellerInfo.put("registration_number", "0123.456.789");
sellerInfo.put("registration_type", "BE:CBE");Peppol Network Integration
Belgium supports Peppol network for B2B invoicing:
sellerInfo.put("peppol_id", "9925:BE0123456789");
buyerInfo.put("buyer_peppol_id", "9925:BE0987654321");Payment Information
Belgium requires IBAN and BIC codes:
paymentInfo.put("payee_iban", "BE68 5390 0754 7034");
paymentInfo.put("bic_code", "KREDBEBB");Multi-language Support
Belgium supports both French and Dutch:
item1.put("item_name", "Service conseil"); // French
paymentInfo.put("payment_terms", "Net 30 jours / Netto 30 dagen"); // French/DutchImplementation Guide
1. Choose the Right LogicalDocType
// B2B Tax Invoices
LogicalDocType.TAX_INVOICE // Standard B2B invoice
LogicalDocType.TAX_INVOICE_CREDIT_NOTE // B2B credit note
LogicalDocType.TAX_INVOICE_DEBIT_NOTE // B2B debit note2. Submit via Java SDK
// Configure SDK
SDKConfig config = new SDKConfig.Builder()
.apiKey("your-api-key")
.environment(Environment.SANDBOX)
.build();
GETSUnifySDK.configure(config);
// Create payload (use examples above)
Map<String, Object> payload = createBelgiumTestPayload();
// Submit to GETS
UnifyResponse response = GETSUnifySDK.pushToUnify(
"belgium-source-system", // Source name
"1.0", // Source version
LogicalDocType.TAX_INVOICE, // Document type
Country.BE, // Belgium
Operation.SINGLE, // Single document
Mode.DOCUMENTS, // Document mode
Purpose.INVOICING, // Full invoicing flow
payload // Business data
);Belgium Compliance Checklist
- VAT numbers in BE + 10 digits format
- CBE registration numbers included
- Peppol IDs configured for B2B transactions
- IBAN and BIC codes for payment information
- EU compliance flags set correctly
- Multi-language support (French/Dutch)
- EN 16931-1:2017 standard compliance
- Peppol BIS Billing 3.0 compliance
Next Steps
- API Reference - Detailed API endpoint documentation
- GETS Schema - Understanding the core GETS schema
- Country Extensions - Belgium-specific extensions
- Java SDK Guide - Complete Java SDK documentation