# GSoC 2025: Integrate OpenELIS with Odoo - Final Presentation

**URL:** <https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633>\
**Category:** GSOC\
**Tags:** gsoc2025\
**Created:** [August 30, 2025, 10:00am UTC](https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633 "2025-08-30T10:00:52Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Vickabire](https://avatars.discourse-cdn.com/v4/letter/v/47e85d/32.png) [@Vickabire](https://talk.openelis-global.org/u/Vickabire)\
**Post date:** [August 30, 2025, 10:00am UTC](https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633/1 "2025-08-30T10:00:52Z")

</div>

# Integrate OpenELIS with Odoo: My GSOC 2025 Journey with OpenELIS and Odoo

## 🚀 Introduction

This summer, I had the opportunity to work on an exciting project as part of **Google Summer of Code (GSOC) 2025**. My project focused on bridging two powerful open-source systems **OpenELIS Global** , a Laboratory Information Management System (LIMS), and **Odoo**.

- Mentor: @reagan
- Backup Mentor: @Moses_Mutesasira
- 💻 Explore the [code commits](https://github.com/DIGI-UW/OpenELIS-Global-2/commits?author=vickabire)
- Project Report: [GitHub - vickabire/GSoC-2025---Vickabire](https://github.com/vickabire/GSoC-2025---Vickabire?tab=readme-ov-file#integrate-openelis-with-odooco-my-gsoc-2025-journey-with-openelis-and-odoo)

The mission?  
👉 To automate billing workflows, so that invoices are seamlessly generated in Odoo whenever lab orders are placed in OpenELIS.

* * *

## ❌ The Problem: Manual Billing

For many laboratories, billing is still a manual and error-prone process.

⚠ Problems with the old workflow:

- Repetitive data entry 📝
- Increased errors ❌
- Slower turnaround ⏳
- Poor financial visibility 💸

* * *

## 🏗 Designing the Integration

To solve this, I designed a **Service-Oriented Architecture (SOA)** with a clear separation of concerns:

```auto
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ OpenELIS │───▶│ Integration │───▶│ Odoo │
│ (LIMS) │ │ Service │ │ (ERP) │
└─────────────────┘ └──────────────────┘ └─────────────────┘

```

- **OpenELIS** → manages lab tests & workflows
- **Integration Service** → event-driven bridge between systems
- **Odoo** → handles billing & financial records

* * *

## 🧩 Core Components

1. **OdooClient** – Handles XML-RPC communication (auth, CRUD, invoices)
2. **OdooIntegrationService** – Business logic for invoice creation
3. **TestProductMapping** – CSV-based test-to-product mapping
4. **Event Handling** – Uses Spring events for asynchronous processing

* * *

## ⚙ Building the Odoo Client Layer

✨ Key capabilities:

- 🔑 **Authentication** with Odoo’s XML-RPC endpoint
- 👤 **Automatic patient creation** in Odoo if they don’t exist
- 🔍 **Duplicate prevention** using national IDs or names
- 🛡 **Error resilience** – failures in Odoo don’t stop OpenELIS operations

* * *

## 📊 Mapping Tests to Products

At the heart of the integration is a simple **CSV configuration file** :

```csv
loinc_code,product_name,quantity,price_unit
12345-6,Complete Blood Count,1,25.00
78901-2,Basic Metabolic Panel,1,35.00

```

✅ Laboratories can update test pricing or product mappings anytime without touching code.

* * *

## 🔄 Event-Driven Workflow

Here’s how it works step by step:

```auto
Sample Created in OpenELIS  
           │  
           ▼  
[Event Fired: SamplePatientUpdateDataCreated]  
           │  
           ▼  
OdooIntegrationService → Finds/creates patient in Odoo  
           │  
           ▼  
Maps lab tests → Odoo products  
           │  
           ▼  
💰 Invoice automatically created in Odoo  

```

* * *

## 🖥 Deployment & Monitoring

Configuration is externalized via environment variables: Look at this example of a repository that i created to run the integration, all i need to do is build openELIS with the Odoo changes and then copy the [.war](https://github.com/vickabire/odoo-openelis-connector/blob/2c6978efb6ed7b75c555e27527fb29adc9e56326/docker-compose.yml#L68) to `config/openelis/tomcat/war`. We are using [odoo-initializer](https://github.com/mekomsolutions/odoo-initializer) developed by Mekom Solutions to initialize our odoo instance with configurations [containing products and product categories](https://github.com/DIGI-UW/odoo-openelis-connector/tree/master/configs/odoo/initializer_config) that eventually OpenELIS will map to.

See more of the configuration in the repository below.

> **[GitHub - DIGI-UW/odoo-openelis-connector](https://github.com/DIGI-UW/odoo-openelis-connector)**
>
> Contribute to DIGI-UW/odoo-openelis-connector development by creating an account on GitHub.

🔎 Health check endpoint `/health/odoo` returns:

```json
{
  "status": "UP",
  "odoo": "Available"
}

```

* * *

## 🌟 The Benefits

With this integration in place, laboratories now enjoy:

- ⚡ **Automated Billing** – invoices created instantly
- ✅ **Data Consistency** – no mismatched records
- ⏱ **Operational Efficiency** – less admin work
- 📈 **Real-Time Financial Visibility** – track revenue seamlessly
- 🔮 **Scalability** – flexible SOA design for future features

* * *

## 🙌 Reflections

Working on this project was both technically challenging and deeply rewarding. I had the privilege of being mentored by @reagan , @Moses_Mutesasira , @mherman22 whose guidance made this journey smoother and more impactful.

## 📹 Demo

[![](https://canada1.discourse-cdn.com/flex030/uploads/openelisci/original/1X/b5d0779bd50e33f07f59ce1afc4477284b527d3e.jpeg "From Vision to Reality: Odoo Integration Progress in OpenELIS Global") ](https://www.youtube.com/watch?v=Tf-BQ3L93kM)

## 🚀 Final Thoughts

My GSOC 2025 journey has been an incredible learning experience. More importantly, it’s a step toward making healthcare systems more **efficient, reliable, and sustainable** through automation and integration.

---

<div class="post-metadata">

**Author:** ![tasksolver](https://yyz2.discourse-cdn.com/flex030/user_avatar/talk.openelis-global.org/tasksolver/32/1067_2.png) [@tasksolver](https://talk.openelis-global.org/u/tasksolver)\
**Post date:** [August 30, 2025, 6:58pm UTC](https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633/2 "2025-08-30T18:58:38Z")

</div>

this is great work @Vickabire , well done

---

<div class="post-metadata">

**Author:** ![Moses\_Mutesasira](https://yyz2.discourse-cdn.com/flex030/user_avatar/talk.openelis-global.org/moses_mutesasira/32/72_2.png) [@Moses\_Mutesasira](https://talk.openelis-global.org/u/Moses_Mutesasira)\
**Post date:** [August 31, 2025, 5:41pm UTC](https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633/3 "2025-08-31T17:41:38Z")

</div>

Great Job @Vickabire .

> [@Vickabire](#):
>
> Look at this example of a repository that i created to run the integration, all i need to do is build openELIS with the Odoo changes and then copy the [.war](https://github.com/vickabire/odoo-openelis-connector/blob/2c6978efb6ed7b75c555e27527fb29adc9e56326/docker-compose.yml#L68) to `config/openelis/tomcat/war`

No more need to build and copy the war file as the changes are now published in the latest docker images

---

<div class="post-metadata">

**Author:** ![interrupt](https://avatars.discourse-cdn.com/v4/letter/i/278dde/32.png) [@interrupt](https://talk.openelis-global.org/u/interrupt)\
**Post date:** [April 9, 2026, 7:03pm UTC](https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633/4 "2026-04-09T19:03:04Z")

</div>

Magnificent work. I have a build using docker approach. I would like to intergrate odoo into the system and I am unsure if I have to rebuild from scratch or can I add odoo into the environment to have a complete setup? Secondly, if so, are there any steps that I can follow to integrate the odoo module into the existing openelis system? BTW the current build is online but not in production, but, will be at some point. I’m a little lost with the integration of odoo into the overall objective of having billing and other functions associated with the odoo module into the finished product which is a complete lab environment?

---

<div class="post-metadata">

**Author:** ![Agaba\_Derrick\_Junior](https://yyz2.discourse-cdn.com/flex030/user_avatar/talk.openelis-global.org/agaba_derrick_junior/32/503_2.png) [@Agaba\_Derrick\_Junior](https://talk.openelis-global.org/u/Agaba_Derrick_Junior)\
**Post date:** [April 9, 2026, 7:41pm UTC](https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633/5 "2026-04-09T19:41:25Z")

</div>

have you gone through, [https://uwdigi.atlassian.net/wiki/spaces/oeg/pages/1082490941/OpenELIS+-+Odoo+Integration](https://uwdigi.atlassian.net/wiki/spaces/oeg/pages/1082490941/OpenELIS+-+Odoo+Integration) ?

---

<div class="post-metadata">

**Author:** ![sagar.khandagre998](https://yyz2.discourse-cdn.com/flex030/user_avatar/talk.openelis-global.org/sagar.khandagre998/32/1018_2.png) [@sagar.khandagre998](https://talk.openelis-global.org/u/sagar.khandagre998)\
**Post date:** [April 10, 2026, 10:45am UTC](https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633/6 "2026-04-10T10:45:44Z")

</div>

@Vickabire Great work.

Now we have also retry mechanism if in case odoo is not available.

Pr - [feat: implement Odoo queue-based retry with exponential backoff (odoo\_sync\_queue) by sagarkhandagre998 · Pull Request #3108 · DIGI-UW/OpenELIS-Global-2 · GitHub](https://github.com/DIGI-UW/OpenELIS-Global-2/pull/3108)

---

<div class="post-metadata">

**Author:** ![interrupt](https://avatars.discourse-cdn.com/v4/letter/i/278dde/32.png) [@interrupt](https://talk.openelis-global.org/u/interrupt)\
**Post date:** [April 10, 2026, 7:27pm UTC](https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633/7 "2026-04-10T19:27:40Z")

</div>

Thanks for the pointer. I will check it out directly!

---

<div class="post-metadata">

**Author:** ![ouiserv](https://yyz2.discourse-cdn.com/flex030/user_avatar/talk.openelis-global.org/ouiserv/32/1108_2.png) [@ouiserv](https://talk.openelis-global.org/u/ouiserv)\
**Post date:** [April 16, 2026, 12:41am UTC](https://talk.openelis-global.org/t/gsoc-2025-integrate-openelis-with-odoo-final-presentation/1633/8 "2026-04-16T00:41:39Z")

</div>

i decided to use the DIGI-UW script for easy installation. I have some problems at this point. I can’t connect / login to openelis. I got the following error after running the command.

ERROR: invalid pool request: Pool overlaps with other one on this address space

administrator@openelis:~$ git clone [GitHub - DIGI-UW/odoo-openelis-connector · GitHub](https://github.com/DIGI-UW/odoo-openelis-connector) && cd odoo-openelis-connector && chmod +x setup.sh && ./setup.sh  
Cloning into ‘odoo-openelis-connector’…  
remote: Enumerating objects: 416, done.  
remote: Counting objects: 100% (416/416), done.  
remote: Compressing objects: 100% (215/215), done.  
remote: Total 416 (delta 173), reused 396 (delta 160), pack-reused 0 (from 0)  
Receiving objects: 100% (416/416), 9.38 MiB | 16.09 MiB/s, done.  
Resolving deltas: 100% (173/173), done.  
🚀 Setting up Odoo OpenELIS Connector…  
Creating addons directory…  
Extracting odoo\_initializer addon…  
Archive: odoo\_initializer.zip  
creating: odoo\_initializer/  
inflating: odoo\_initializer/activator.py  
inflating: odoo\_initializer/ **init**.py  
creating: odoo\_initializer/utils/  
inflating: odoo\_initializer/utils/data\_files\_utils.py  
inflating: odoo\_initializer/utils/config.py  
inflating: odoo\_initializer/utils/registry.py  
inflating: odoo\_initializer/utils/ **init**.py  
creating: odoo\_initializer/utils/ **pycache** /  
inflating: odoo\_initializer/utils/ **pycache** /data\_files\_utils.cpython-310.pyc  
inflating: odoo\_initializer/utils/ **pycache** /config.cpython-310.pyc  
inflating: odoo\_initializer/utils/ **pycache** /models\_import.cpython-310.pyc  
inflating: odoo\_initializer/utils/ **pycache** /registry.cpython-310.pyc  
inflating: odoo\_initializer/utils/ **pycache** / **init**.cpython-310.pyc  
inflating: odoo\_initializer/utils/models\_import.py  
creating: odoo\_initializer/models/  
inflating: odoo\_initializer/models/product\_loader.py  
inflating: odoo\_initializer/models/stock\_location\_loader.py  
inflating: odoo\_initializer/models/product\_variant\_loader.py  
inflating: odoo\_initializer/models/decimal\_precision\_loader.py  
inflating: odoo\_initializer/models/journal\_loader.py  
inflating: odoo\_initializer/models/company\_property\_loader.py  
inflating: odoo\_initializer/models/bom\_loader.py  
inflating: odoo\_initializer/models/ **init**.py  
creating: odoo\_initializer/models/ **pycache** /  
inflating: odoo\_initializer/models/ **pycache** /product\_variant\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /language\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /journal\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /setting\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /currency\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /company\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /product\_category\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /payment\_term\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /bom\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /stock\_location\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /country\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /partner\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /account\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /company\_property\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /system\_parameter\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /decimal\_precision\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /base\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /fiscal\_position\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /uom\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /default\_value\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /tax\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /cash\_rounding.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /price\_list\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /product\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** /warehouse\_loader.cpython-310.pyc  
inflating: odoo\_initializer/models/ **pycache** / **init**.cpython-310.pyc  
inflating: odoo\_initializer/models/language\_loader.py  
inflating: odoo\_initializer/models/country\_loader.py  
inflating: odoo\_initializer/models/default\_value\_loader.py  
inflating: odoo\_initializer/models/partner\_loader.py  
inflating: odoo\_initializer/models/product\_category\_loader.py  
inflating: odoo\_initializer/models/base\_loader.py  
inflating: odoo\_initializer/models/price\_list\_loader.py  
inflating: odoo\_initializer/models/system\_parameter\_loader.py  
inflating: odoo\_initializer/models/setting\_loader.py  
inflating: odoo\_initializer/models/payment\_term\_loader.py  
inflating: odoo\_initializer/models/tax\_loader.py  
inflating: odoo\_initializer/models/currency\_loader.py  
inflating: odoo\_initializer/models/company\_loader.py  
inflating: odoo\_initializer/models/warehouse\_loader.py  
inflating: odoo\_initializer/models/account\_loader.py  
inflating: odoo\_initializer/models/fiscal\_position\_loader.py  
inflating: odoo\_initializer/models/cash\_rounding.py  
inflating: odoo\_initializer/models/uom\_loader.py  
creating: odoo\_initializer/ **pycache** /  
inflating: odoo\_initializer/ **pycache** /activator.cpython-310.pyc  
inflating: odoo\_initializer/ **pycache** / **init**.cpython-310.pyc  
inflating: odoo\_initializer/ **manifest**.py  
creating: odoo\_initializer/static/  
creating: odoo\_initializer/static/description/  
inflating: odoo\_initializer/static/description/icon.png  
Setup completed successfully!

Starting Docker services…  
Creating network “odoo-openelis-connector\_hie” with driver “bridge”  
ERROR: invalid pool request: Pool overlaps with other one on this address space  
administrator@openelis:~/odoo-openelis-connector$

It appears it completed the build, however, i now can’t login to either the react ui or the legacy @ 8443. I am running this on a vps and using a domain.

Can anyone give me a pointer to get back to functionality?  
Thanks!
