Skip to content

Repository files navigation

UBW Integration

Integration middleware connecting Kofax KTM document capture with Unit4 UBW ERP system, built with Apache Camel.

Technology Stack: Apache Camel 2.22.1 | Groovy | Gradle


Overview

UBW Integration provides two core capabilities:

  1. SQL Bridge Emulation - REST API that emulates SQL Server's SQLBridge component, enabling vendor lookups and invoice validation queries against UBW ERP
  2. Document Conversion - Monitors folders for Kofax-exported invoices and converts them to OIOUBL format (Danish e-invoice standard)

The application supports multi-company deployments with separate preprod and production environments.


Features

  • REST endpoint for vendor/invoice queries (SQLBridge compatible)
  • File system monitoring with scheduled polling
  • XML to OIOUBL transformation via XSLT
  • PDF embedding as Base64 in output documents
  • Multi-tenant configuration (environment + company)
  • Automatic cleanup of processed files
  • Metrics collection for monitoring

Quick Start

Prerequisites

  • Java 8 or higher
  • Gradle 4.6+
  • Access to UBW ERP endpoints

Installation

# Clone the repository
git clone git@bitbucket.org:bpa-solutions-a-s/ubwintegration.git
cd ubwintegration
# Build the distribution
./gradlew distZip

Configuration

  1. Copy the environment template:

    cp .env.example .env
  2. Edit .env with your UBW credentials:

    UBW_PREPROD_USERNAME=your_preprod_username
    UBW_PREPROD_PASSWORD=your_preprod_password
    UBW_PROD_USERNAME=your_prod_username
    UBW_PROD_PASSWORD=your_prod_password
  3. Configure camel.properties for your environment (endpoints, folders, schedules)

Running

# Development
./gradlew run
# Production (from distribution)
./bin/ubwintegration

REST API

The SQL Bridge endpoint emulates database queries for Kofax integration.

Base URL:http://localhost:8088/sqlbridge/dataconnect/selectAction

Query Parameters

ParameterDescriptionExample
configEnvironment and companypreprod.A1, prod.A1
keyQuery typecvrpicklist, vendorinvoiceno
searchforSearch criteriaOden, 12345678
debugEnable debug outputtrue

Available Queries

KeyDescriptionTemplate ID
cvrpicklistSearch vendors by VAT ID/name1118
cvrvalidateValidate vendor VAT ID1119
picklistvendornoValidate vendor number1119
vendorinvoicenoGet last invoice for vendor1121
vendorinvoicenoexistCheck if invoice exists1120
picklistordernoSearch work orders1122
workorderpicklistGet work order details1122

Example Request

curl "http://localhost:8088/sqlbridge/dataconnect/selectAction?key=cvrpicklist&config=preprod.A1&searchfor=Oden"

Response Format

RESULTSET|apar_id|vat_reg_no|ou1|apar_name||place|currency|apar_gr_id|FIK|bank_account|
NULL

Apache Camel Routes

SqlBridgeRoute

HTTP endpoint that processes vendor/invoice queries:

HTTP Request → Validate → Load Config → Render SOAP Template → POST to UBW → Parse Response → Format Output
  • Endpoint:jetty:http://0.0.0.0:8088/sqlbridge/dataconnect/selectAction
  • Route ID:SqlBridge
  • Templates: Velocity templates in vm/ directory

KofaxFileToOioUblRoute

File watcher that converts Kofax exports to OIOUBL:

Poll fromFolder → Read XML → Extract PDF → Base64 Encode → XSLT Transform → Write to toFolder → Backup
  • Route ID:FromFolder
  • Schedule: Every 5 seconds, 6 AM - 6 PM, Monday-Friday
  • XSLT:config/XML2OIOUBL.xsl

Cleanup Route

Scheduled cleanup of old processed files:

  • Route ID:cleanupFolder
  • Schedule: 6 PM daily on weekdays
  • Retention: 30 days (configurable)

Configuration

camel.properties

# Applicationapplication.name=UBW Integration Multicompany
# Scheduling (Quartz cron format)schedule=0/5+*+06-18+?+*+MON-FRI
cleanupschedule=0+0+18+?+*+MON-FRI
cleanupdays=30
# FoldersfromFolder=fromFolder
toFolder=toFolder
toBackupFolder=toBackupFolder
toOioStylesheet=config/XML2OIOUBL.xsl
# Environment configuration (preprod/prod)preprod.A1.username=${UBW_PREPROD_USERNAME}
preprod.A1.password=${UBW_PREPROD_PASSWORD}
preprod.A1.client=A1
preprod.A1.ubwendpoint=https://mth-preprod.unit4cloud.com/dk_mth_preprod_webservices/service.svc
prod.A1.username=${UBW_PROD_USERNAME}
prod.A1.password=${UBW_PROD_PASSWORD}
prod.A1.client=A1
prod.A1.ubwendpoint=https://mth.unit4cloud.com/dk_mth_live_webservices/service.svc

Directory Structure

The application monitors a hierarchical folder structure:

fromFolder/
├── preprod/
│ └── A1/
│ ├── invoice1.xml
│ └── invoice1.pdf
└── prod/
└── A1/
├── invoice2.xml
└── invoice2.pdf

Build & Development

Gradle Commands

CommandDescription
./gradlew buildCompile and package
./gradlew runRun the application
./gradlew distZipCreate distribution ZIP
./gradlew distTarCreate distribution TAR
./gradlew cleanClean build artifacts

Project Structure

ubwintegration/
├── src/
│ ├── main/groovy/
│ │ ├── Start.groovy # Entry point
│ │ └── dk/bpas/mth/ubwintegration/
│ │ ├── routes/
│ │ │ ├── SqlBridgeRoute.groovy
│ │ │ └── KofaxFileToOioUblRoute.groovy
│ │ ├── dataformat/
│ │ │ └── AgressoXmlDataFormat.groovy
│ │ └── utilities/
│ │ ├── GetProperties.groovy
│ │ ├── HttpClientProcessor.groovy
│ │ ├── PdfUtilities.groovy
│ │ └── CleanFolders.groovy
│ ├── main/resources/
│ │ └── logback.xml
│ └── dist/
│ ├── camel.properties
│ ├── config/XML2OIOUBL.xsl
│ └── vm/*.vm # Velocity templates
├── build.gradle
├── .env.example
└── README.md

Key Components

ComponentPurpose
Start.groovyBootstraps Camel context and routes
SqlBridgeRouteREST endpoint for UBW queries
KofaxFileToOioUblRouteFile monitoring and OIOUBL conversion
AgressoXmlDataFormatParses UBW SOAP responses
HttpClientProcessorSends SOAP requests to UBW
GetPropertiesLoads multi-tenant configuration

Deployment

Distribution Package

./gradlew distZip
# Output: build/distributions/UbwIntegration-1.0.20.zip

Windows Service

The distribution includes NSSM for Windows service installation:

nssm install UbwIntegration "C:\path\to\bin\ubwintegration.bat"
nssm start UbwIntegration

Production Checklist

  • Configure environment variables for credentials
  • Update camel.properties with production endpoints
  • Verify folder permissions for fromFolder/toFolder
  • Configure log rotation if needed
  • Set up monitoring for the REST endpoint

Logging

Logs are written to the logs/ directory:

FileContent
info.logAll DEBUG and above messages
warning.logWARN and ERROR messages only

Logs rotate daily with 30-day retention. Configuration: src/main/resources/logback.xml


Architecture

┌─────────────┐ ┌──────────────────┐ ┌─────────────┐
│ Kofax KTM │────▶│ UBW Integration │────▶│ UBW ERP │
│ (XML+PDF) │ │ (Apache Camel) │ │ (Unit4) │
└─────────────┘ └──────────────────┘ └─────────────┘
│
▼
┌──────────────────┐
│ OIOUBL Files │
│ (toFolder) │
└──────────────────┘
┌─────────────┐ ┌──────────────────┐ ┌─────────────┐
│ WWWSearch │────▶│ SQL Bridge API │────▶│ UBW ERP │
│ (HTTP) │ │ (REST/Jetty) │ │ (SOAP) │
└─────────────┘ └──────────────────┘ └─────────────┘

License

This software is proprietary and confidential. Unauthorized copying, distribution, or use is strictly prohibited.

Copyright (c) BPA Solutions A/S. All rights reserved.

About

Integration middleware connecting Kofax KTM document capture with Unit4 UBW ERP system. Built with Apache Camel, provides REST API for vendor queries and OIOUBL document conversion.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages