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…
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.
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 !