Skip to content

Grocery retail

Groupe Kaderim — Coco Market

A dozen companies, as many stores, one central warehouse — and a stock transfer that crosses the group's legal boundaries without being retyped.

Sector
Grocery retail
Scope
27 custom modules · 20 users
Duration
Over 6 months, then ongoing maintenance and support
Role
Custom module development — point of sale, stock and integrations
Odoo version
Odoo 17 Enterprise

The problem

A retail group that grows eventually runs into its own structure. Each store is a separate company, with its own accounts, its own stock, its own users. Sending a pallet from the central warehouse to a store ought to be one operation; it was two, entered by two different people, in two systems that did not speak to each other. Nothing in Odoo natively moves stock from one company to another.

Replenishment suffered from the same gap: stores asked, the central warehouse delivered, but between the two there was neither a document nor a trace.

At the till, the problems were of a different order but just as routine. Products arrived with no usable barcode. Receipts were reprinted with no way of knowing whether it was a duplicate. Orders got duplicated. And any cashier could grant a discount.

Finally, invoicing had to be filed electronically with the Ivorian tax administration — a regulatory constraint, not a negotiable one.

The approach

The first instinct was to look for what already existed. Odoo Enterprise can already synchronise one company's sales order with another's purchase order: that mechanism was taken as-is, and the replenishment module hooks into its intended extension point rather than rewriting it. Likewise, the electronic wallet builds on the standard loyalty engine instead of reconstructing a customer balance system.

Custom work begins where the standard genuinely stops. Inter-company transfer is one such place: a user in company A had to cause a document to be created in company B, which Odoo's isolation rules forbid — rightly so. The deliberate choice was to elevate privileges on that one precise operation, rather than loosening multi-company rules globally. The scope of the bypass is one operation, traced and idempotent.

Every need got its own module. Twenty-seven small modules that install separately, rather than one block nobody dares touch any more.

The solution

Twenty-seven custom modules on Odoo 17 Enterprise.

Inter-company transfer is configured on the operation type. When an outgoing transfer marked this way is validated, the matching receipt is created automatically in the destination company — with its lines, its scheduled date, the source document as origin, and a message naming whoever made the transfer. The destination company is resolved through its partner record, never by its name. A check confirms an equivalent transfer does not already exist before creating a second one.

Replenishment starts at the store: an approved request spawns an order in the company holding the central warehouse, valued at the product's standard cost rather than its commercial price. The standard inter-company mechanism then takes over on the store side.

At the till, the scope covers the electronic wallet with its top-up product, cashier login by badge — the barcode reader switching to exclusive control during identification — a DUPLICATE marking on any reprint, regularisation of duplicated orders, restriction of discounts and sales lookups to managers, and background synchronisation of orders to the back office.

Around it, a barcode generator for products that have none, label templates with their print wizard, physical inventory campaigns comparing theoretical against counted stock, a stock coverage report, the FNE tax integration, and a company switcher that becomes searchable beyond nine companies — because past that, a dropdown stops being useful.

The result

A stock move between two companies in the group is entered once and exists on both sides, with its trail. Store replenishment follows a documented circuit instead of a phone call. At the till, a product without a barcode no longer stops the queue, a duplicate announces itself as one, and a discount involves a manager. Invoices go out certified to the tax administration.

Stack

Odoo
Odoo 17 Enterprise
Modules
InventoryPoint of SalePurchaseSalesAccountingWebsiteHR
Tech
PythonOWLJavaScriptPostgreSQL
Protocoles
REST