Integration pattern evaluation and decision record.
Last updated: 2026-02-19
Status: DECIDED — Middleware Hub pattern selected (DEC-001, DEC-006)
This document records the integration options that were evaluated for connecting Chart Industries' 11 ERP instances to EDICOM for global e-invoicing, and the decisions that were made.
Decision: All ERP traffic flows through a single custom middleware hub. ERPs push UCF JSON + PDF to the middleware via REST API. The middleware handles validation, state management, routing, and EDICOM communication.
Key constraints applied:
- Snowflake PROPOSED for supplier data (DEC-009) — awaiting CIO approval
- ERP Push model — ERPs push directly, no polling or CDC (DEC-007)
- Single middleware hub — 1 EDICOM connection instead of 11 (DEC-001)
- Custom .NET 9 build on Azure VM (DEC-006)
┌─────────┐
│ JDE (4) │──┐
└─────────┘ │
┌─────────┐ │ ┌─────────────────┐ ┌─────────┐
│ SAP (2) │──┼───→│ MIDDLEWARE │───→│ EDICOM │
└─────────┘ │ │ (.NET 9 / Azure) │←───│ │
┌─────────┐ │ └─────────────────┘ └─────────┘
│ AX (2) │──┤ │
└─────────┘ │ ▼
┌─────────┐ │ ┌─────────────┐
│Epicor(1)│──┘ │ Dashboard │
└─────────┘ │ (Blazor) │
└─────────────┘
Why this was selected:
- Single EDICOM connection (1 vs 11) — simpler onboarding, testing, and support
- Centralised monitoring and dashboard for all 11 sites
- Unified error handling, retry logic (Polly), and dead-letter queue
- Consistent UCF validation before EDICOM submission
- Easier to swap EDICOM for another provider in future
- Clearance callback handling (Malaysia) managed in one place
- AP routing logic centralised (COR360, OpenText, Basware, ERP Direct)
┌─────────┐ ┌─────────┐
│ JDE │───────────────────→│ │
└─────────┘ │ │
┌─────────┐ │ │
│ SAP │───────────────────→│ EDICOM │
└─────────┘ │ │
┌─────────┐ │ │
│ AX │───────────────────→│ │
└─────────┘ │ │
┌─────────┐ │ │
│ Epicor │───────────────────→│ │
└─────────┘ └─────────┘
Why this was rejected:
- 11 separate EDICOM integrations to build, test, and maintain
- No centralised monitoring — each ERP has its own error handling
- Duplicate transformation logic across 4 ERP platforms
- Clearance callbacks would need routing to individual ERPs
- Locked to EDICOM — no supplier portability
- Not feasible given Chart's 5 different ERP platforms (JDE, SAP, IFS, AX, Epicor)
Why this was rejected:
- Mixed patterns create documentation and support overhead
- All flows (AR and AP) benefit from centralised middleware
- AP routing logic (COR360/OpenText/Basware/ERP Direct) is complex enough to justify middleware for both directions
- No clear advantage over full middleware hub
| Platform |
Annual Cost |
ERP Connectors |
Verdict |
| Dell Boomi |
$50K–$150K |
Excellent (all 4 ERPs) |
Considered — not licensed at Chart |
| MuleSoft Anypoint |
$80K–$200K |
Excellent |
Rejected — overkill and expensive |
| IBM App Connect |
$60K–$180K |
Good (SAP strong) |
Rejected — IBM ecosystem preference |
| SAP Integration Suite |
$40K–$120K |
SAP only |
Rejected — only covers 2 of 11 sites |
| Platform |
Annual Cost |
ERP Connectors |
Verdict |
| Azure Integration Services |
$20K–$80K |
Good (Dynamics native) |
Considered — serverless complexity |
| AWS Integration |
$15K–$60K |
Limited |
Rejected — limited ERP connectors |
| Google Cloud Integration |
$15K–$50K |
Minimal |
Rejected — no ERP ecosystem |
| Platform |
Annual Cost |
ERP Connectors |
Verdict |
| Workato |
$20K–$60K |
Partial (JDE limited) |
Rejected — not enterprise-grade enough |
| Make / n8n / Zapier |
$0–$20K |
Very limited |
Rejected — not suitable for enterprise ERP |
| Platform |
Annual Cost |
ERP Connectors |
Verdict |
| Python/FastAPI + Celery |
$30K–$80K |
Build all |
Considered |
| Node.js/NestJS |
$30K–$80K |
Build all |
Considered |
| .NET 9 / C# |
$30K–$80K |
Good library support |
SELECTED (DEC-006) |
Why .NET 9 was selected:
- Enterprise-grade with strong SAP and Dynamics library support
- Microsoft ecosystem aligns with Chart's Azure hosting and AX ERPs
- Mature tooling: Polly (retry/circuit breaker), Hangfire (background jobs), Entity Framework (data access)
- Full control over clearance flow, state machines, and retry logic
- No vendor lock-in — all open-source components
- Team familiarity with .NET stack
| Component |
Technology |
Purpose |
| Runtime |
.NET 9 |
Application framework |
| Database |
SQL Server |
Invoice register, state, audit |
| Hosting |
Azure VM (East US2) |
Application hosting |
| Dashboard |
Blazor Server |
Monitoring, search, retry |
| Retry/Circuit Breaker |
Polly |
Resilience patterns |
| Background Jobs |
Hangfire |
Scheduled tasks, retries |
| API Gateway |
Azure APIM |
Inbound EDICOM traffic |
| EDICOM Connectivity |
IPsec tunnel (AES-256) |
Secure bidirectional |
All flows go through the middleware. There are no direct ERP-to-EDICOM connections.
AR (Outbound) — Non-Clearance (DE, FR, BE):
ERP → POST /api/ar/invoice → Middleware → EDICOM → Government/Customer
↑
EDICOM callback
(delivery status)
AR (Outbound) — Clearance (MY):
Push 1: ERP → POST /api/ar/invoice → Middleware → EDICOM → MyInvois (LHDN)
↑
EDICOM callback
(governmentId + QR)
│
Middleware writes back
to ERP (ID + QR)
│
Push 2: ERP → POST /api/ar/invoice → Middleware → EDICOM → Customer
(with ID+QR+PDF) (same pipeline as non-clearance)
AP (Inbound):
EDICOM → POST /api/ap/invoice → Middleware → Route to AP target:
├── SFTP → COR360 → JDE (MY, GOFA)
├── SFTP → OpenText → SAP (HDE, HTO)
├── Basware → AX (HSV, HBC)
└── REST API → ERP Direct (JDE: FLOW, VCT; IFS: HMP FR, HMP BE; Epicor: CPI FR)
All ERPs push UCF JSON + PDF to the middleware via REST API. The middleware is the single integration point.
| Attribute |
Value |
| AR push method |
JDE Orchestrator REST API → POST /api/ar/invoice |
| PDF generation |
BI Publisher |
| AP delivery |
COR360 (MY, GOFA via SFTP) or ERP Direct (FLOW, VCT via REST) |
| Clearance writeback |
JDE Orchestrator API (CHART_EI_UPDATE_CLEARANCE) |
| Sites |
Chart MY, GOFA, FLOW, VCT |
| Attribute |
Value |
| AR push method |
IFS REST API → POST /api/ar/invoice |
| PDF generation |
IFS Report Designer |
| AP delivery |
ERP Direct (REST API) |
| Sites |
HMP FR, HMP BE |
| Attribute |
Value |
| AR push method |
OData API or Output Management → POST /api/ar/invoice |
| PDF generation |
Adobe Forms |
| AP delivery |
OpenText (via SFTP) |
| Sites |
HDE, HTO (Germany) |
| Attribute |
Value |
| AR push method |
Data Entities (OData) → POST /api/ar/invoice |
| PDF generation |
SSRS Reports |
| AP delivery |
Basware |
| Sites |
HSV, HBC (France) |
| Attribute |
Value |
| AR push method |
REST API → POST /api/ar/invoice |
| PDF generation |
SSRS / BAQ Reports |
| AP delivery |
ERP Direct (REST API) |
| Sites |
CPI FR (France) |
| Interface |
Protocol |
Auth |
Direction |
| ERP → Middleware (AR) |
REST API (HTTPS) |
Internal (bearer token) |
Inbound |
| Middleware → EDICOM (AR) |
REST API (HTTPS) |
Basic Auth (base64) |
Outbound |
| EDICOM → Middleware (callbacks) |
Webhook (HTTPS) |
HMAC-SHA256 + IP whitelist |
Inbound via APIM |
| EDICOM → Middleware (AP) |
REST API (HTTPS) |
HMAC-SHA256 |
Inbound via APIM |
| Middleware → AP tools (COR360/OpenText) |
SFTP |
SSH key (Key Vault) |
Outbound |
| Middleware → ERP (AP direct) |
REST API (HTTPS) |
Bearer token |
Outbound |
| Middleware → ERP (clearance writeback) |
REST API (HTTPS) |
Bearer token |
Outbound |
| Protocol |
Considered For |
Reason Not Selected |
| SOAP/XML |
Legacy ERP integration |
REST preferred for simplicity |
| AS2 |
EDI-compliant B2B exchange |
Over-engineered for this use case |
| Message Queue (Service Bus) |
Internal async processing |
Hangfire + SQL Server sufficient |
| GraphQL |
Flexible queries |
REST endpoints are well-defined, GraphQL adds complexity |
All traffic between Chart and EDICOM flows through an IPsec tunnel. Inbound EDICOM traffic is routed through Azure APIM.
| Layer |
Controls |
| Network |
IPsec tunnel (AES-256, DH20, IKEv2), IP whitelist, APIM |
| Transport |
TLS 1.2+ on all HTTPS connections |
| Authentication |
Basic Auth (outbound AR), HMAC-SHA256 (inbound callbacks/AP), Bearer tokens (ERP) |
| Application |
Rate limiting (APIM), request validation, subscription keys |
| Data |
AES-256 encryption at rest (SQL Server TDE), PII masking in logs |
| Audit |
Full invoice lifecycle logging, dashboard visibility |
| Component |
Year 1 |
Year 2–5 |
5-Year Total |
| Custom .NET development |
$50K |
— |
$50K |
| Azure VM hosting |
$10K |
$10K/yr |
$50K |
| SQL Server licensing |
$5K |
$5K/yr |
$25K |
| Azure APIM |
$5K |
$5K/yr |
$25K |
| Maintenance/support |
— |
$20K/yr |
$80K |
| Total |
$70K |
$40K/yr |
$230K |
| Option |
5-Year TCO |
Reason Rejected |
| Dell Boomi |
$420K |
Not licensed, higher ongoing cost |
| MuleSoft |
$790K |
Overkill, expensive |
| Azure Integration Services |
$210K |
Serverless complexity, less control over state machines |
| Custom .NET 9 (decided) |
$230K |
Selected — full control, enterprise-grade |
| Custom Python |
$290K |
No .NET ecosystem advantages |
| Decision |
Description |
Reference |
| DEC-001 |
Middleware Hub pattern (all traffic through middleware) |
Decisions Log |
| DEC-006 |
Custom .NET 9 on Azure VM (East US2) with SQL Server |
Decisions Log |
| DEC-007 |
ERP Push model — ERPs push UCF+PDF to middleware via REST |
Decisions Log |
| DEC-009 |
Snowflake PROPOSED for supplier lookup — awaiting CIO approval (OQ-001) |
Decisions Log |
| Decision |
Description |
Impact |
| DEC-P01 |
AP routing for non-JDE sites — DECIDED: ALL AP through middleware |
AP flow design |
| DEC-P02 |
Middleware build vs buy (custom confirmed but needs formal CIO sign-off) |
Procurement |
| DEC-P03 |
Hosting platform (Azure VM confirmed but needs formal CIO sign-off) |
Infrastructure |
| Term |
Definition |
| iPaaS |
Integration Platform as a Service |
| UCF |
Universal Chart Format — canonical invoice format |
| APIM |
Azure API Management |
| Polly |
.NET resilience library (retry, circuit breaker) |
| Hangfire |
.NET background job processing |
| HMAC |
Hash-based Message Authentication Code |
| mTLS |
Mutual TLS (two-way certificate authentication) |
| IPsec |
Internet Protocol Security (encrypted tunnel) |
Originally prepared: 2025-12-19 (as options analysis)
Updated: 2026-02-19 (reflects decided architecture)
See Architecture Reference for the canonical source of truth.