ERP migration
Field-level mapping, validation, and rollback between Flectra and Dolibarr ERP. We move data and schema; workflows are rebuilt natively in Dolibarr ERP.
Flectra
Source
Dolibarr ERP
Destination
Compatibility
12 of 15
objects map 1:1 between Flectra and Dolibarr ERP.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Flectra to Dolibarr is a schema-reconciliation migration that spans two different open-source traditions: the Odoo ORM lineage (Flectra) and the Dolibarr REST tradition. Flectra exposes all business objects through XML-RPC execute_kw calls with a unified res.partner model for contacts and companies; Dolibarr uses a separate llx_societe (third-party/company) and llx_socpeople (contact) structure accessible via REST. We build an XML-RPC extraction adapter to read Flectra data, reconcile the partner split during transformation, and load into Dolibarr's REST API with rate-limit handling. We preserve fiscal positions, multi-currency rates, analytic tags, and historical timestamps. Workflows, automations, and PDF template configurations do not migrate; we deliver a written inventory of these for the customer to rebuild in Dolibarr.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Flectra object lands in Dolibarr ERP, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Flectra
res.partner (company subtype)
Dolibarr ERP
llx_societe
1:1Flectra res.partner records with is_company=True map to Dolibarr llx_societe (third-party/company). We extract name, email, phone, website, vat, and address fields (street, street2, zip, town, fk_state, fk_country) and write them to the llx_societe table. The supplier and customer flags (supplier, client) map from Flectra's supplier and customer boolean fields. Parent-company relationships in Flectra (parent_id pointing to another is_company partner) map to Dolibarr's fk_societe_parent field.
Flectra
res.partner (contact subtype)
Dolibarr ERP
llx_socpeople
1:manyFlectra res.partner records with is_company=False are individual contacts and map to Dolibarr llx_socpeople entries. Each contact is linked to its parent company (llx_societe) via fk_soc. We extract firstname, lastname, email, phone, mobile, function (job title), and address fields. Flectra's child_ids relation (multiple contacts under one company) becomes individual llx_socpeople rows in Dolibarr, each pointing to the same llx_societe.
Flectra
sale.order
Dolibarr ERP
llx_commande
1:1Flectra sale.order maps to Dolibarr llx_commande (customer order). We transfer ref (order reference), date_creation (order date), date_valid (validation date), fk_soc (customer link), fk_user_author (salesperson), and the total amounts (total_ht, total_tva, total_ttc). Order status (state field: draft, sent, sale, done, cancel) maps to Dolibarr's fk_statut and statut fields with the appropriate integer code mapping.
Flectra
sale.order.line
Dolibarr ERP
llx_commandedet
1:1Flectra sale.order.line records map to Dolibarr llx_commandedet order lines. We resolve the product reference to Dolibarr fk_product, copy qty and UnitPrice, and calculate the total (total_ht, total_tva) for each line. If Flectra uses a free-text line without a linked product, we write a Dolibarr desc (description) line with no fk_product link.
Flectra
product.template
Dolibarr ERP
product + product_attribute + product_attribute_value
1:manyFlectra's two-level product model (product.template as the master, product.product as variants) requires expansion into Dolibarr's flatter product structure. Each Flectra product.template with active variants becomes a Dolibarr product with attribute rows created for each variant dimension (size, color, etc.). Variant-level pricing in Flectra (product.product UnitPrice overrides) becomes Dolibarr extra prices on the product record. Templates with no variants migrate as a single product record.
Flectra
product.product (variant)
Dolibarr ERP
product extra price
1:1Flectra product.product records with a non-zero qty_available or non-default UnitPrice map to Dolibarr price_extra rows linked to the parent product. The variant's attribute_value_ids become Dolibarr product_attribute_value links. Stock levels from Flectra's stock.quant table map to Dolibarr's llx_product_stock entries per warehouse (fk_entrepot).
Flectra
account.move (out_invoice)
Dolibarr ERP
llx_facture
1:1Flectra account.move with move_type='out_invoice' maps to Dolibarr llx_facture. We transfer move_id (external reference), ref (invoice number), invoice_date, date_valid, fk_soc (customer), fk_user_author, and financial amounts (total_ht, total_tva, total_ttc). The payment state (paid, unpaid, partial) maps to Dolibarr's fk_paiement and paye (0=unpaid, 1=paid) fields. Historical payment records from account.payment migrate as llx_paiement with line links to the invoice.
Flectra
account.move.line
Dolibarr ERP
llx_facturedet
1:1Flectra invoice line items map to Dolibarr llx_facturedet. We resolve fk_product (or write a free-text description line), copy qty and UnitPrice, and compute line totals (total_ht, tva_tx for VAT rate). Tax codes from Flectra's account.tax map to Dolibarr's fk_tva rate lookup. Flectra analytic account tags (analytic_distribution) map to Dolibarr llx_facture_fourn_det where applicable.
Flectra
purchase.order
Dolibarr ERP
llx_commande_fournisseur
1:1Flectra purchase.order maps to Dolibarr llx_commande_fournisseur (supplier order). We transfer the order reference, date, supplier link (fk_soc), salesperson, and amounts (total_ht, total_tva, total_ttc). Order status maps to Dolibarr's fk_statut. Flectra's picking_ids relation for receipt tracking maps to Dolibarr's llx_reception if the receiving warehouse module is active.
Flectra
purchase.order.line
Dolibarr ERP
llx_commande_fournisseurdet
1:1Flectra purchase.order.line records map to Dolibarr llx_commande_fournisseurdet supplier order lines. We resolve the supplier product reference to Dolibarr fk_product, copy qty and UnitPrice, and calculate line totals. Discounts (% discount field) migrate to Dolibarr's remise_percent field.
Flectra
project.project
Dolibarr ERP
llx_projet
1:1Flectra project.project maps to Dolibarr llx_projet. We transfer ref (project code), title (project name), description, date_start, date_end, fk_user_resp (project manager), and the fk_soc link if the project is associated with a customer. Project status (state: open, pending, close) maps to Dolibarr's fk_statut.
Flectra
project.task
Dolibarr ERP
llx_projet_task
1:1Flectra project.task records map to Dolibarr llx_projet_task. We transfer ref, title, description, planned_hours, effective_hours, date_start, date_end, user_id (assignee), stage_id (task stage), and fk_projet (parent project). Flectra's child_ids sub-task hierarchy becomes a flat task list in Dolibarr with fk_task_parent links for nesting. Task priority (1-5) maps to Dolibarr's priority field.
Flectra
hr.employee
Dolibarr ERP
llx_societe (type=contact) + llx_resource
1:1Flectra hr.employee records map to Dolibarr llx_societe entries with type='contact' plus llx_resource records for resource management. Employee name, work_email, mobile, department_id (fk_department), and job_id map to the contact record. Dolibarr's llx_resource table holds the resource definition (resource_type, fk_user) for project allocation and attendance tracking if the HR module is active. Note that Flectra payroll and salary history resides in external payroll modules and is not part of the standard migration scope.
Flectra
ir.attachment
Dolibarr ERP
documents directory
1:1Flectra ir.attachment binary files export as base64-encoded content and are written to Dolibarr's documents directory using the object's module path convention (e.g., commercant/projet/task_123.pdf). We preserve the original filename and create a Dolibarr llx_extrafields record with a reference back to the owning object (fk_object and object_type). The res_model and res_id from Flectra determine the Dolibarr object type and ID for the attachment link.
Flectra
x_custom_field (ir.model.fields state=manual)
Dolibarr ERP
llx_extrafields
lossyFlectra custom fields (x_ prefixed fields defined in ir.model.fields with state='manual') are enumerated during discovery and mapped to Dolibarr llx_extrafields table rows for the corresponding object. We create the extrafield definition (column name, label, type, and SQL column addition) before data load. The custom field value data migrates as part of the parent object write. If a custom field references another Flectra record via a many2one relation, we resolve the target ID through the migration's ID cross-reference map before writing.
| Flectra | Dolibarr ERP | Compatibility | |
|---|---|---|---|
| res.partner (company subtype) | llx_societe1:1 | Fully supported | |
| res.partner (contact subtype) | llx_socpeople1:many | Fully supported | |
| sale.order | llx_commande1:1 | Fully supported | |
| sale.order.line | llx_commandedet1:1 | Fully supported | |
| product.template | product + product_attribute + product_attribute_value1:many | Fully supported | |
| product.product (variant) | product extra price1:1 | Fully supported | |
| account.move (out_invoice) | llx_facture1:1 | Fully supported | |
| account.move.line | llx_facturedet1:1 | Fully supported | |
| purchase.order | llx_commande_fournisseur1:1 | Fully supported | |
| purchase.order.line | llx_commande_fournisseurdet1:1 | Fully supported | |
| project.project | llx_projet1:1 | Fully supported | |
| project.task | llx_projet_task1:1 | Fully supported | |
| hr.employee | llx_societe (type=contact) + llx_resource1:1 | Fully supported | |
| ir.attachment | documents directory1:1 | Fully supported | |
| x_custom_field (ir.model.fields state=manual) | llx_extrafieldslossy | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Flectra gotchas
XML-RPC API format requires non-standard serialization
No official migration utility or dedicated export tooling
Community edition lacks functional support and hosting
Large imports can trigger timeouts without batching
Dolibarr ERP gotchas
Foreign key constraint errors on cross-distribution database restore
SQL injection vulnerabilities in version 9.0.1
Custom fields stored as JSON in extraoptions require field-by-field deserialization
Decimal precision and rounding configuration affects price fields
No native iOS/Android app forces reliance on browser
Pair-specific challenges
Migration approach
Discovery and Flectra API accessibility check
We audit the source Flectra instance via XML-RPC: authenticate with db/uid/password, enumerate installed modules via ir.module.module, introspect ir.model.fields for all active business objects, and count records per model. We identify any Professional-tier modules present, flag any 403 responses on restricted API calls, and generate a discovery report covering record counts, custom field list (x_ prefixed fields), address completeness, and product variant count. This report defines the migration scope and informs the product expansion calculation for Dolibarr.
Dolibarr module selection and schema preparation
We work with the customer to select the active Dolibarr modules matching their Flectra usage: CRM (third parties and contacts), Commercial (quotations and orders), Products, Purchases, Invoicing, Projects, HR, and Inventory. We enable these modules in a fresh or sandbox Dolibarr instance, create the llx_extrafields definitions for every migrating custom field, configure the company information (country, currency, VAT rules), and set up any required extra price rows for product variants. The schema is validated via Dolibarr's database consistency check before data load begins.
Flectra XML-RPC extraction with batch chunking
We implement the XML-RPC client adapter to read Flectra data in batches of 100-200 records per execute_kw call using the search_read method with domain filters and offset/limit. Large object sets (partners with 50k+ rows, invoices with 100k+ rows) are chunked to avoid HTTP timeout. Each batch is written to a staging JSON-Lines file with the original Flectra record ID preserved as a reference key. We run a row-count reconciliation against the XML-RPC count response before proceeding to transform.
Schema reconciliation and transform pipeline
We run the transform pipeline against the staged data: split res.partner into llx_societe (companies) and llx_socpeople (contacts) using is_company flag and parent_id; expand product.template variants into product + attribute_value rows; map sale.order and account.move statuses to Dolibarr integer codes; resolve Flectra partner IDs to the new Dolibarr llx_societe IDs via the cross-reference map for all foreign key fields (fk_soc, partner_id, user_id). We apply any multi-currency rate adjustments and fiscal position mappings. The output is a set of Dolibarr-compatible JSON payloads per object type.
Dolibarr REST API load with dependency ordering
We load data into Dolibarr in strict dependency order: llx_societe first (companies), then llx_socpeople (contacts linked to companies), then llx_product and llx_product_attribute, then llx_commande and llx_commandedet, then llx_facture and llx_facturedet, then llx_projet, llx_projet_task, llx_commande_fournisseur, llx_paiement, and finally llx_resource and llx_extrafields. Each phase emits a success/failure count. We use Dolibarr REST API POST requests with rate-limit handling and retry logic. Any record with a missing required field (e.g., fk_soc not resolved) is held in a deferred queue and retried after the parent record is confirmed.
Cutover, validation, and workflow inventory handoff
We freeze Flectra writes during a defined cutover window, run a final delta migration of records modified since the last batch, and validate the Dolibarr load by reconciling record counts against the discovery report. We spot-check 20-30 records per object type against the Flectra source for field-level accuracy. We deliver a written inventory of all Flectra automated actions, workflow rules, and PDF template configurations (ir.actions.report, ir.mail_server, ir.config_parameter settings) that do not migrate as code. The customer's admin uses this inventory to rebuild automations in Dolibarr's built-in workflow module and document template editor.
Platform deep dives
Flectra
Source
Strengths
Weaknesses
Dolibarr ERP
Destination
Strengths
Weaknesses
Complexity grading
Standard ERP migration. All 8 core objects map 1:1 between Flectra and Dolibarr ERP.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Flectra and Dolibarr ERP.
Object compatibility
All 8 core objects map 1:1 between Flectra and Dolibarr ERP.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
Flectra: Not publicly documented.
Data volume sensitivity
Flectra doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Flectra to Dolibarr ERP migration scoping. Not seeing yours? Book a call.
Walk through your Flectra to Dolibarr ERP migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Flectra
Other ways to arrive at Dolibarr ERP
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.