Complyance Logo

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/Dutch

Implementation 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 note

2. 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