No description
Find a file
VIAL-GOUTEYRON Quentin 2d44fdf49c
CLOSE #29244 Feature to merge contacts (#39512)
Add the ability to merge two contacts, the same way third parties and members
can already be merged. The merged contact is absorbed by the current one, all
its satellite data is moved, then it is deleted.

Contact::mergeContact() orchestrates everything in a single transaction, using
the new CommonObject::commonReplaceContact() helper and the replaceContact()
static methods of Contact, ActionComm and User. A replaceContact hook lets the
external modules move their own data. No schema change, no migration.

Three specific traps of this table are handled:
- llx_element_contact.fk_socpeople references llx_socpeople only when
  c_type_contact.source is 'external', and llx_user when it is 'internal', so
  both queries filter on it. Without that filter the internal assignments of
  the users would silently be moved to the merged contact.
- Contact::updateRoles(), called by update(), deletes then reinserts every
  societe_contacts row of the contact from $this->roles. It is neutralised by
  setting roles to null, and update() is called before the links are moved.
- Every table having a unique index on the contact id is deduplicated before
  its update, so the update cannot violate it. $ignoreerrors is never used:
  the FIXME of commonReplaceThirdparty() documents the links it loses.

The files are moved after the commit and not before, unlike mergeCompany() and
mergeMembers(): a failure after the move leaves them with the database rolled
back but the files already gone. A name collision renames the file instead of
losing it, and a failure is reported to the user instead of being ignored.

Access guards live in the class and not in the page, so the REST API, the
scheduled jobs and the modules benefit from them too. They cover both contacts,
fetch() by rowid applying neither an entity nor a permission filter: entity,
private contact of another user, external user, sales representative perimeter,
absorbing a shared contact into a private one, and a contact linked to a user
account (moving llx_user.fk_socpeople would let the email of that user be
rewritten from the contact card, so it requires the permission to create users).

Form::select_contact() gets a one line fix on the way: it accepts a $filter
parameter, documents it, forwards it to the ajax branch, but dropped it when
building the combo, so the merge popup could not exclude the current contact.

Known limitations, out of the scope of this pull request: merging contacts of
different entities is refused, Contact::update() neither writes url, no_email,
fk_parent nor import_key while its $nosyncuser parameter is declared but never
read, and with CONTACT_USE_SEARCH_TO_SELECT set the current contact is still
offered in the popup, contact/ajax/contact.php overwriting the filter it gets.
2026-08-19 02:26:34 +02:00
.agents Qual: Update Dolibarr Development AI SKILL (#39353) 2026-08-05 10:24:23 +02:00
.github Bump mdeweerd/logToCheckStyle from 2026.7.1 to 2026.8.2 (#39565) 2026-08-19 01:16:46 +02:00
.phan
.tx Update config for tx transifex (#37897) 2026-04-16 13:18:37 +02:00
dev NEW Link manage extrafields and phpunit test for the class (#39514) 2026-08-19 02:18:46 +02:00
doc Clean files 2026-01-07 19:01:54 +01:00
htdocs CLOSE #29244 Feature to merge contacts (#39512) 2026-08-19 02:26:34 +02:00
scripts QUAL add hook printWebsitePageContent (#39576) 2026-08-19 01:01:45 +02:00
test CLOSE #29244 Feature to merge contacts (#39512) 2026-08-19 02:26:34 +02:00
.agentsignore Default ai cli setup 2026-08-09 23:58:19 +02:00
.codeclimate.yml Update files after moving build into dev/ 2025-01-05 14:46:26 +01:00
.editorconfig Qual: Update pre-commit for shell script formatting (#37221) 2026-02-17 22:05:03 +01:00
.gitattributes Update gitattributes 2025-12-22 14:48:46 +01:00
.gitignore chore: ignore .worktrees/ directory used for isolated agent workspaces 2026-08-11 16:31:29 +02:00
.mailmap Fix mailmap file 2026-07-15 00:56:44 +02:00
.pre-commit-config.yaml Test disable consumming task 2026-06-27 17:09:22 +02:00
.travis.yml Add migration to v25 2026-08-13 12:53:10 +02:00
ChangeLog NEW: Finish unifying extrafields admin pages into a single secured page 2026-08-12 04:59:24 +02:00
composer.json.disabled
COPYING
COPYRIGHT Merge branch 'fix_dev_remove_unused_jeditable' of 2026-05-11 01:49:01 +02:00
DCO
phpstan.neon.dist CI 2026-05-22 12:17:17 +02:00
pyproject.toml Qual: Update pre-commit hooks and dependencies (#37313) 2026-02-23 00:41:04 +01:00
README.md Update link for European directives in README (#38115) 2026-05-07 10:05:17 +02:00
robots.txt Clean files 2026-01-07 19:01:54 +01:00
SECURITY.md Update file 2026-08-13 02:59:53 +02:00

DOLIBARR ERP & CRM

Downloads per day Docker hub pulls Minimum PHP Version GitHub release CII Best Practices

Dolibarr ERP & CRM is a modern software package that helps manage your organization's activities (contacts, quotes, invoices, orders, stocks, agenda, human resources, ecm, manufacturing…).

It's an Open-Source Software suite (written in PHP with JavaScript enhancements) designed for small, medium or large companies, foundations and freelancers.

You can freely use, study, modify or distribute it according to its license.

You can use it as a standalone application or as a web application to access it from the Internet or from a LAN.

Dolibarr has a large community ready to help you, free forums and preferred partners ready to offer commercial support should you need it

ScreenShot

LICENSE

Dolibarr is released under the terms of the GNU General Public License as published by the Free Software Foundation; either Version 3 of the License, or (at your option) any later version (GPL-3+).

See the COPYING file for a full copy of the license.

Other licenses apply for some included dependencies. See COPYRIGHT for a full list.

INSTALLING

There is a lot of different solutions to install Dolibarr.

Using packages

If you have low technical skills and you're looking to install Dolibarr ERP/CRM with just few clicks, you can use one of the packaged versions (see next chapter if you have IT knowledge) :

Releases can be downloaded from official website.

You can use any web server supporting PHP (Apache, Nginx, ...) and a supported database (MariaDB, MySQL or PostgreSQL) to install the standard version:

  • Verify that your installed PHP version is supported see PHP support.

  • Uncompress the downloaded .zip archive to copy the dolibarr/htdocs directory and all its files inside your web server root or get the files directly from GitHub (recommended if you know git as it makes it easier if you want to upgrade later):

    git clone https://github.com/dolibarr/dolibarr -b x.y (where x.y is the main version like 9.0, 19.0, ...)

  • Set up your web server to use dolibarr/htdocs as root if your web server does not already define a directory to point to.

  • Create an empty htdocs/conf/conf.php file and set write permissions for your web server user (write permission will be removed once install is finished)

  • From your browser, go to the dolibarr "install/" page

    The URL will depend on how your web configuration directs to your dolibarr installation. It may look like:

    http://localhost/dolibarr/htdocs/install/

    or

    http://localhost/dolibarr/install/

    or

    http://yourdolibarrvirtualhost/install/

  • Follow the installer instructions

Using Docker images

Dolibarr is also available as a Docker image. Installation instructions are available here.

Using ready to use SaaS/Cloud offers

If you lack the time to install it yourself, consider exploring commercial 'ready-to-use' Cloud offerings (refer to https://saas.dolibarr.org). Keep in mind that this third option comes with associated costs.

UPGRADING

Dolibarr supports upgrading, usually without the need for any (commercial) support (depending on if you use any commercial extensions). It supports upgrading all the way from any version after 2.8 without breakage. This is unique in the ERP ecosystem and a benefit our users highly appreciate!

Follow these step-by-step instructions to seamlessly upgrade Dolibarr to the latest version:

  • At first make a backup of your Dolibarr files & then see
  • Verify that your installed PHP version is supported by the new version see PHP support.
  • Overwrite all old files from the 'dolibarr' directory with files provided in the new version's package.
  • At your next access, Dolibarr will redirect you to the "install/" page to follow the upgrade process.  If an install.lock file exists to lock any other upgrade process, the application will ask you to remove the file manually (you should find the install.lock file in the directory used to store generated and uploaded documents, in most cases, it is the directory called "documents").

WHAT'S NEW

See the ChangeLog file.

FEATURES

Main application/modules (all optional)

  • Third-Parties Management: Customers, Prospects (Leads) and/or Suppliers + Contacts
  • Members/Membership/Foundation management

Product Management

  • Products and/or Services catalogue
  • Stock / Warehouse management + Inventory
  • Barcodes
  • Batches / Lots / Serials
  • Product Variants
  • Bill of Materials (BOM)
  • Manufacturing Orders (MO)
  • Workstations / Workplaces

Customer/Sales Management

  • Customers/Prospects + Contacts management
  • Opportunities or Leads management
  • Commercial proposals management (online signing)
  • Customer Orders management
  • Contracts/Subscription management
  • Interventions management
  • Ticket System (+ Knowledge management)
  • Partnership management
  • Shipping management
  • Customer Invoices/Credit notes and payment management
  • Point of Sale (POS)

Supplier/Purchase Management

  • Suppliers/Vendors + Contacts
  • Supplier (pricing) requests
  • Purchase Orders management
  • Delivery/Reception
  • Supplier Invoices/Credit notes and payment management
  • INCOTERMS

Finance/Accounting

  • Invoices/Payments
  • Bank accounts management
  • Direct debit and Credit transfer management (European SEPA)
  • Accounting management
  • Donations management
  • Loan management
  • Margins
  • Reports

Collaboration

  • Shared calendar/agenda (with ical and vcal import/export for third-party tools integration)
  • Projects & Tasks management
  • Event organization
  • Ticket System
  • Surveys

HR - Human Resources Management

  • Employee leave management
  • Expense reports
  • Recruitment management
  • Employee/staff management
  • Timesheets

Other application/modules

  • Electronic Document Management (EDM)
  • Bookmarks
  • Reporting
  • Data export/import
  • Barcodes
  • LDAP connectivity
  • Click-To-Dial integration
  • Mass emailing
  • RSS integration
  • Social platforms linking
  • Payment platforms integration (PayPal, Stripe, Paybox...)
  • Email-Collector
  • AI support via API

(around 100 modules available by default, 1000+ addons at the official marketplace Dolistore.com)

Other general features

  • Multi-Language Support (Localization in most major languages)
  • Multi-users and groups with finely-grained rights
  • Multi-Currency
  • Multi-Company (by adding an external module)
  • Very user-friendly and easy to use
  • Customizable dashboards
  • Highly customizable: enable only the modules you need, add user personalized fields, choose your skin, several menu managers (can be used by internal users as a back-office with a particular menu, or by external users as a front-office with another one)
  • APIs (REST, SOAP)
  • Code that is easy to understand, maintain and develop (PHP with no heavy framework; trigger and hook architecture)
  • Support a lot of country-specific features:
    • Spanish Tax RE and IRPF
    • French NPR VAT rate (VAT called "Non Perçue Récupérable" for DOM-TOM)
    • Canadian double taxes (federal/province) and other countries using cumulative VAT
    • Tunisian tax stamp
    • Argentina invoice numbering using A,B,C...
    • Greece fetch customer vat details from AADE, all invoice types, MyData(external free module)
    • ZATCA e-invoicing QR-Code
    • Compatible with European directives (2006/112/CE ... 2010/45/UE)
    • Compatible with data privacy rules (Europe's GDPR, ...)
    • ...
  • Flexible PDF & ODT generation for invoices, proposals, orders...
  • ...

System Environment / Requirements

  • PHP
  • MariaDB, MySQL or PostgreSQL
  • Compatible with all Cloud solutions that match PHP & MySQL or PostgreSQL prerequisites.

See exact requirements on the Wiki

Extending

Dolibarr can be extended with a lot of other external applications or modules from third-party developers available at the DoliStore.

WHAT DOLIBARR CAN'T DO YET

These are features that Dolibarr does not yet fully support:

  • Tasks dependencies in projects
  • Payroll module
  • Native embedded Webmail, but you can send email to contacts in Dolibarr with e.g. offers, invoices, etc.
  • Dolibarr can't do coffee (yet)

DOCUMENTATION

Administrator, user, developer and translator's documentation are available along with other community resources in the Wiki.

CONTRIBUTING AND RELEASE PROCESS

This project exists thanks to all the people who contribute. Please read the instructions on how to contribute (report a bug/error, a feature request, send code, ...) [Contributing]

A View on Contributors:

Dolibarr

The release process is described into the file dev/build/makepack-howto.md

CREDITS

Dolibarr is the work of many contributors over the years and uses some fine PHP libraries.

See COPYRIGHT file.

NEWS AND SOCIAL NETWORKS

Follow Dolibarr project on:

Sponsors

Support this project by becoming a sponsor. Your logo will show up here. 🙏 [Become a sponsor/backer]