Modification en masse de référence produits

Bonjour, suite à un inventaire et à une réorganisation interne je cherche à modifier toutes les références produits de mon Dolibarr afin d’uniformiser avec un autre logiciel de gestion de location matériel (Robert2 <3).

L’idée est de passer d’une référence style : « Midas_M32_R » à un code « 1030025 »

A part exporter la table product la modifier et la ré-importer je ne vois pas de solutions simple, le problème c’est que je ne sais pas le bordel que ça risque de créer dans d’autres tables…

Quelqu’un à une idée ?

Merci bien !

bonjour,
Je pense que c’est possible de le faire avec un script PHP, en se servant de la class product.
Normalement, les produits sont liés aux commandes/factures/… par l’id de produit et non par la référence, donc je pense qu’il n’y aura aucun soucis particulier sur les autres tables.
Malgré tout, j’ai toujours préféré utiliser la class de l’objet plutôt que de taper directement dans la table.
J’ai moi même changé toutes mes références il y a plusieurs mois en passant par l’API Rest, et je n’ai noté aucun soucis particulier.

Merci pour ta réponse !
En effet je pensait également à utiliser l’API, tu l’as attaqué via PHP ?

Je l’avais fait via l’API parce que c’étais plus pratique pour moi, étant donné que j’ai un script qui tourne en permanence pour mettre à jour les produits sur Prestashop. Dolibarr n’a que les produits nécessaires pour gérer les expéditions et les commandes fournisseurs. J’avais juste à modifier la façon de générer une référence, et de mettre à jour le produit sur Dolibarr si nécessaire. Ça s’est fait tranquillement sur plusieurs heures.

Si tu n’as que Dolibarr à modifier, je te suggère de faire un script PHP de la même manière qu’une tâche cron. Mais si tu te sens plus à l’aise avec l’API, c’est faisable aussi.

Alors je déterre totalement ce sujet, puisque retombé dessus ce matin en essayant encore de faire des recherches pour modifier en masse les références de mon Dolibarr.

Mais dans cette nouvelle époque et avec l’aide d’un compagnon neuronale voilà un notebook Python pour réaliser ça via l’API !

Test connection API

import requests
import pandas as pd

# Dolibarr API Configuration
DOLIBARR_API_URL = "https://doli.xxx.fr"
API_KEY = "CLEF API"
HEADERS = {
    "Accept": "application/json",
    "DOLAPIKEY": API_KEY
}
def test_api_connection():
    """Test the connection to Dolibarr API."""
    response = requests.get(f"{DOLIBARR_API_URL}/api/index.php/products", headers=HEADERS)
    if response.status_code == 200:
        print(f"Connection successful! {response.text}")
    else:
        print(f"Failed to connect: {response.status_code} - {response.text}")

if __name__ == "__main__":
    test_api_connection()

Fonctions GET and POST

def get_product_by_ref(old_ref):
    params = {
        "sqlfilters": f"(ref:=:'{old_ref}')",  # Modify this filter as per your needs
        "sortfield": "t.ref",
        "sortorder": "ASC",
        "limit": 100
    }
    try:
        response = requests.get(f"{DOLIBARR_API_URL}/api/index.php/products", headers=HEADERS, params=params)
        response.raise_for_status()  # Raise an error for bad responses
    except requests.exceptions.RequestException as e:
        print(f"Error while fetching product {old_ref}: {e}")
        return None

    if response.status_code == 200:
        try:
            json_response = response.json()
            if json_response:  # Check if the list is not empty
                return json_response[0]  # Return the first product if it exists
            else:
                print(f"No product found for {old_ref}.")
                return None
        except requests.exceptions.JSONDecodeError as e:
            print(f"Error: Invalid JSON response for {old_ref}: {e}")
            return None
    else:
        print(f"Error: {response.status_code} - {response.text} for {old_ref}")
        return None

def update_product_ref(product_id, new_ref):
    data = {"ref": new_ref}
    try:
        response = requests.put(f"{DOLIBARR_API_URL}/api/index.php/products/{product_id}", headers=HEADERS, json=data)
        response.raise_for_status()  # Raise an error for bad responses
    except requests.exceptions.RequestException as e:
        print(f"Error while updating product {product_id} to {new_ref}: {e}")
        return False

    if response.status_code == 200:
        print(f"Success : {product_id} -> {new_ref}")
        return True
    else:
        print(f"[FAILED] : {product_id} -> {new_ref}")
        return False

def update_products_from_excel(excel_file):
    """Read the Excel file and update products."""
    # Load the Excel file
    df = pd.read_excel(excel_file)

    for index, row in df.iterrows():
        old_ref = row['oldRef']
        new_ref = row['newRef']

        print(f"Processing {old_ref} -> {new_ref}")

        # Search for the product by old_ref
        product = get_product_by_ref(old_ref)

        if product:
            product_id = product["id"]
            # Update the reference
            update_product_ref(product_id, new_ref)
        else:
            print(f"Product {old_ref} not found.")

Utilisation
Créer un fichier Excel avec deux colonnes « oldRef » et « newRef » et indiquer son chemin au script suivant :

excel_file = "productsRef.xlsx"  # Ensure this is the correct path to your file
update_products_from_excel(excel_file)

Voilà, si jamais ça peux servir à quelqu’un tant mieux sinon peut-être retomberais je sur ce post dans quelques années ! :wink: