productCompany

Bonjour à tous,

Nous voulons lier nos produits à une ou plusieurs entités mais via importation car nous avons bien trop de codes pour les faire un par un.

Qui sait comment créer le lien productCompany?

Merci de votre aide,

com.axelor.apps.base.db.Product
Colonne : productCompanyList

à lier avec

com.axelor.apps.base.db.ProductCompany
Colonne : productCompanyList

Pour le moment je ne suis pas plus utilise que ca.
Je ne maitrise pas
J’ai juste récupérer la structure d’Axelor en version 6.1.8 avec les API
(j’ai tout récupe en CSV - Et en comparant les CSV, ca me semble ces élements là à lier)

C’est utile pour vous ou vous aviez déjà cette information ?

Le problème initial venait du fait que nous n’arrivons pas à faire un import en utilisant la table com.axelor.apps.base.db.ProductCompany comme cible. En analysant les tables réelles dans pgAdmin nous avons remarqué qu’il n’y a pas de table base_product_company mais que la table base_product possède une collonne dtype dont les valeures peuvent être « Product » ou « ProductCompany ». Le lien entre les produits et les sociétés est fait sur les lignes de la base base_product qui ont pour dtype « ProductCompany », la plupart des champs de ces lignes ont une valeure par défaut (beaucoup de [null]), elles n’ont que 2 colonnes importantes : « company » et « product » qui sont les id de la société et du produit concernés par ce lien. Je vais essayer de faire un import avec la table com.axelor.apps.base.db.Product comme cible en précisant dtype = « ProductCompany » et en utilisant les id.

Bon, rien ne marche. Je vais poster ici ce que j’ai essayé :

  • D’abord l’échantillon des produits importés :
code;name;productTypeSelect;productSubTypeSelect;procurementMethodSelect;productFamily.code;productCategory.code;mrpFamily.code;description;internalDescription;sellable;purchasable;unit.name;salesUnit.name;purchasesUnit.name
4002;1/2 RAC SYM GUIL 25/DC30 ALU  ;storable;2;produce;MON;PROD;PSF/PMT;1/2 raccord sym. Guillemin DN25 à verrou/douille crantée de 30. Aluminium;1/2 raccord sym. Guillemin DN25 à verrou/douille crantée de 30. Aluminium;True;True;Unité;Unité;Unité
4003;1/2 RAC SYM GUIL 32/DC35 ALU  ;storable;2;produce;MON;PROD;PSF/PMT;1/2 raccord sym. Guillemin DN32 à verrou/douille crantée de 35. Aluminium;1/2 raccord sym. Guillemin DN32 à verrou/douille crantée de 35. Aluminium;True;True;Unité;Unité;Unité
4004;1/2 RAC SYM GUIL 40/DC45 ALU  ;storable;1;produce;RBJ;PROD;PF/RBJ;1/2 raccord sym. Guillemin DN40 à verrou/douille crantée de 45. Aluminium;1/2 raccord sym. Guillemin DN40 à verrou/douille crantée de 45. Aluminium;True;True;Unité;Unité;Unité
4005;1/2 RAC SYM GUIL 50/DC55 ALU  ;storable;1;produce;RBJ;PROD;PF/RBJ;1/2 raccord sym. Guillemin DN50 à verrou/douille crantée de 55. Aluminium;1/2 raccord sym. Guillemin DN50 à verrou/douille crantée de 55. Aluminium;True;True;Unité;Unité;Unité
4006;1/2 RAC SYM GUIL 65/DC70 ALU  ;storable;2;produce;MON;PROD;PSF/PMT;1/2 RACCORD SYM GUILLEMIN DN65 A VERROU/DOUILLE CRANTÉE DE 70 - ALU;1/2 RACCORD SYM GUILLEMIN DN65 A VERROU/DOUILLE CRANTÉE DE 70 - ALU;True;True;Unité;Unité;Unité
4007;1/2 RAC SYM GUIL 80/DC90 ALU  ;storable;1;produce;RBJ;PROD;PF/RBJ;1/2 raccord sym. Guillemin DN80 à verrou/douille crantée de 90. Aluminium;1/2 raccord sym. Guillemin DN80 à verrou/douille crantée de 90. Aluminium;True;True;Unité;Unité;Unité
4008;1/2 RAC SYM GUIL 100/DC110 ALU;storable;2;produce;MON;PROD;PSF/PMT;1/2 raccord Guillemin DN100 à verrouA douille crantée de 110Construction en alliage d'aluminium;1/2 raccord Guillemin DN100 à verrouA douille crantée de 110Construction en alliage d'aluminium;True;True;Unité;Unité;Unité
4009;1/2 RAC SYM GUIL 150/DC152 ALU;storable;1;produce;RBJ;PROD;PF/RBJ;1/2 raccord sym. Guillemin DN150 à verrou/douille crantée de 152. Aluminium;1/2 raccord sym. Guillemin DN150 à verrou/douille crantée de 152. Aluminium;True;True;Unité;Unité;Unité
  • Et son xml :
<?xml version="1.0" encoding="UTF-8"?>
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://axelor.com/xml/ns/data-import http://axelor.com/xml/ns/data-import/data-import_5.4.xsd">

  <input file="products.csv" separator=";" type="com.axelor.apps.base.db.Product"/>

</csv-inputs>

(Ce csv a été importé sans problème)

Ensuite le premier essai d’import de lien product-company :

  • Le csv :
code;company.id;company.code;company.name
4002;2;POK;POK SAS
4003;2;POK;POK SAS
4004;2;POK;POK SAS
4005;2;POK;POK SAS
4006;2;POK;POK SAS
4007;2;POK;POK SAS
4008;2;POK;POK SAS
4009;2;POK;POK SAS
  • Le xml :
<?xml version="1.0" encoding="UTF-8"?>
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://axelor.com/xml/ns/data-import http://axelor.com/xml/ns/data-import/data-import_5.4.xsd">

  <input file="prod_comp.csv" separator=";" type="com.axelor.apps.base.db.ProductCompany"/>

</csv-inputs>

La tentative d’import d’aujourd’hui basée sur l’analyse des tables réelles dont voici un extrait :
image
Résultat de la requête SQL :
SELECT dtype, name, code, company, product FROM base_product WHERE dtype='ProductCompany'

  • Le csv :
dtype;product;company
ProductCompany;109;2
ProductCompany;110;2
ProductCompany;111;2
ProductCompany;112;2
ProductCompany;113;2
ProductCompany;114;2
ProductCompany;115;2
ProductCompany;116;2
  • Le xml :
<?xml version="1.0" encoding="UTF-8"?>
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://axelor.com/xml/ns/data-import http://axelor.com/xml/ns/data-import/data-import_5.4.xsd">

  <input file="prod_comp.csv" separator=";" type="com.axelor.apps.base.db.Product"/>

</csv-inputs>

Je précise que tous ces imports sont faits avec l’option « import » et pas « import avancés » car je n’ai trouvé aucune documentation sur comment remplir les champs du formulaire d’import avancé.

J’essayerai de faire des tests via API en fin d’aprem. je pense que je peux le faire sur ma plateforme n8n.
je vous tiens au courant

Dans votre CSV il vous faut la clé du produit ( id ) je pense , sinon je vois pas comment on peut mettre à jour . Pour les imports je vous suggère d utiliser les clés d’imports , ca rend le travail plus facile et permet une meilleure intégrité dans votre base axelor . Je teste cet import ( je n utilise pas les productCompagny dans mon environnement ) des que j ai un moment .

Les clés d’imports dont vous parlez sont les valeures de l’attribut « import_id » c’est bien ça? Pourriez vous expliquer leur utilité car je ne comprends pas à quoi ils peuvent servir.
Si j’ai bien compris, j’ai déjà essayé ce que vous décrivez dans la 2e tentative d’import : la colonne « product » est l’id du produit et « company » est l’id de la société, j’ai juste mis les noms des colonnes que j’ai vu dans pgAdmin. Pour être certain que ça ne marche pas je viens d’essayer cet import :

dtype;id;company.id
ProductCompany;109;2
ProductCompany;110;2
ProductCompany;111;2
ProductCompany;112;2
ProductCompany;113;2
ProductCompany;114;2
ProductCompany;115;2
ProductCompany;116;2

avec cet xml :

<?xml version="1.0" encoding="UTF-8"?>
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://axelor.com/xml/ns/data-import http://axelor.com/xml/ns/data-import/data-import_5.4.xsd">

  <input file="prod_comp.csv" separator=";" type="com.axelor.apps.base.db.Product"/>

</csv-inputs>

qui n’a pas donné d’erreur mais n’a créé aucun objet ProductCompany,

et avec cet xml :

<?xml version="1.0" encoding="UTF-8"?>
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://axelor.com/xml/ns/data-import http://axelor.com/xml/ns/data-import/data-import_5.4.xsd">

  <input file="prod_comp.csv" separator=";" type="com.axelor.apps.base.db.ProductCompany"/>

</csv-inputs>

qui n’a pas fonctionné non-plus mais a soulevé cette erreur :

javax.validation.ConstraintViolationException: Validation failed for classes [com.axelor.apps.base.db.ProductCompany] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
	ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=product, rootBeanClass=class com.axelor.apps.base.db.ProductCompany, messageTemplate='{javax.validation.constraints.NotNull.message}'}
]

ce qui « confirme » (je pense) que les noms des colonnes doivent bien être « product » et « company » comme je les ai vu dans les tables.

Bonjour , oui import_id , permet d’avoir l intégrité de vos données d import dans axelor.
id ne peut pas etre dans les colonnes d import car c est la clé primaire de la table product , et donc initialisé directement ( autoincrement) .

Bonjour,

J’ai pu avancer sur ma plateforme n8n d’import export. Le potentiel est ouf. mais c’est pas le sujet ici.

Je suis sur productCompany depuis 1h là.
Mais c’est quoi en fait ? ^^
Vous avez déjà réussi à faire un enregistrement manuel ?

Ce serai un produit selon une ou plusieurs entreprise ?
Est-ce un produit « normal » qui peut-être ajouté à d’autres entreprises par la suite ?

De mon côté, et je pensais en avoir des produits multi-société, mais en fait non je n’ai pas de ça.
Et au niveau interface, il n’y a pas de quoi selectionner tel ou tel société

(je continue à chercher)

EDIT : je viens d’aller sur la démo en ligne, et je vois où ca se trouve sur la fiche produit.
(je continue à chercher)

Bonjour,

C’est gentil de regarder.
Le ProductCompany permet de lier un produit à plusieurs entités ce qui est notre cas (un produit peut être utilisé pour 3 entités).
On sait en plus que cette fonction sera toujours utilisée dans notre cas.
Manuellement cela fonctionne mais avec 50 000 articles l’import serait préférable.
On continue aussi de creuser et si on trouve on postera.

1 « J'aime »

je le fais pour moi aussi. c’est super intéressant.

avec l’api j’ai des messages d’erreurs, j’ai l’impression que ca m’aide.
Et l’interface graphique de la démo m’a fait comprendre l’imbrication

d’après la structure Axelor, seul « product » de productCompany est « required »
donc j’ai donné juste cet élement.
Et l’erreur java Axelor est-celle ci :

{
« string »: « java.lang.IllegalArgumentException: argument type mismatch »,
« stacktrace »: "java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: argument type mismatch\n\tat com.axelor.db.mapper.Mapper.set(Mapper.java:408)\n\tat com.axelor.db.JPA._edit(JPA.java:411)\n\tat com.axelor.db.JPA.edit(JPA.java:292)\n\tat com.axelor.rpc.Resource.save(Resource.java:1112)\n\tat com.axelor.rpc.ResponseInterceptor.invoke(ResponseInterceptor.java:58)\n\tat com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:64)\n\tat com.axelor.web.service.RestService.save(RestService.java:173)\n\tat

Ma reflexion est que, le « missmatch » doit correspondre à productCompanyList d’un produit.
Donc est-cequ’il faut specifier dans le produit le productCompanyList, pour ensuite préciser au produit d’une société, le produit générique ?

Désolé je partage mes reflexions sans avoir testé.

J’ai pas l’impression d’avoir la bonne version Axelor pour le faire. ma version test est en 6.1.8.
Je ne crois pas qu’il y avait la gestion des produits par société (même s’il y a les tables pour)

essayez de faire un import d’au moins une colone avec :
nom de la colone : product
élement de la colonne (fullName du produit) : [référence] Nom du produit

Je ne sais pas si je vais faire d’autre recherche à ce sujet dans les prochains jours.
Bon courage

Nous avons la version 6.1.4 d’Axelor pour nos tests.
Je ne sais pas où vous avez vu que

Car même en ajoutant un lien produit-société manuellement, c’est impossible de le créer sans remplir le champ « Company » :

Pour être certain que nous parlons tous de la même chose, nous essayons d’importer manuellement les lignes de ce champ :

A propos du mismatch que vous avez obtenu, l’erreur dit que c’est le type « string » qui ne correspond pas au type attendu. Si vous avez mis le nom d’un produit dans le champ product pour l’import, je crois que c’est normal : d’après les tables c’est l’identifiant du produit qui y est stocké. Dommage que l’erreur ne soit pas plus précise.

Cela dit, je viens de faire d’autres tests et je crois avoir trouvé le problème, je rédige un nouveau message.

J’ai ouvert la fiche d’un des produits pour lesquels j’avais tenté d’importer le lien productCompany, j’ai commencé une édition, je n’ai rien modifié, puis j’ai sauvegardé et la ligne du champ « Product per company » que j’avais essayé d’importer plusieurs fois est apparue, ainsi que le full_name généré à partir du code et du nom du produit. Je vais maintenant tenter d’importer des produits avec leur full_name, puis de lier un ProductCompany, puis je ferai part des résultats ici.

L’import a fonctionné !

La Solution :
Il faut importer le champ « fullName » des produits pour qu’il n’ait pas besoin d’être généré, j’ai même l’impression qu’Axelor l’utilise pour remplir les champs « code » et « name » si le fullName est au bon format : [code] name.
Ensuite, il suffit d’importer un fichier csv avec une colonne product.fullName et une colonne avec quelque chose pour identifier la société (j’ai utilisé company.code et ça a fontionné) dans la table productCompany.

csv :

product.fullName;company.code
[04002] 1/2 RAC SYM GUIL 25/DC30 ALU  ;POK
[04003] 1/2 RAC SYM GUIL 32/DC35 ALU  ;POK
[04004] 1/2 RAC SYM GUIL 40/DC45 ALU  ;POK
[04005] 1/2 RAC SYM GUIL 50/DC55 ALU  ;POK
[04006] 1/2 RAC SYM GUIL 65/DC70 ALU  ;POK
[04007] 1/2 RAC SYM GUIL 80/DC90 ALU  ;POK
[04008] 1/2 RAC SYM GUIL 100/DC110 ALU;POK
[04009] 1/2 RAC SYM GUIL 150/DC152 ALU;POK

xml :

<?xml version="1.0" encoding="UTF-8"?>
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://axelor.com/xml/ns/data-import http://axelor.com/xml/ns/data-import/data-import_5.4.xsd">

  <input file="prod_comp.csv" separator=";" type="com.axelor.apps.base.db.ProductCompany"/>

</csv-inputs>
1 « J'aime »

Je n ai pas encore tester mais votre liste de produits doit etre celle depart , avec un import_id , et deux colonnes pour les jointures compagny product . Je ne sais pas pourquoi ils n ont pas fait avec une table de jointure. id ne doit jamais etre un champs de votre fichier d import . Par contre il faut deux colonnes avec les liaisons , product.id et company.id. Je vous conseille d’utiliser import_id et import_origin ( si plusieurs sources d import)

1 « J'aime »

Parfait si vous avez trouvé ce qu’il vous fallait !

Je ne dois pas avoir une configuration qui me permet cet affichage dans la fiche produit (produit par société). Je ferai mes recherches de mon côté.

Je viens de faire un post pour expliquer en quoi n8n m’aide.

Je ne peux pas deposer de .CSV ici. mais je vous l’envoi en MP.
Vous pourrez lire toutes les exigences (required) et mappage de chaque colonne de ce productCompany, c’est interessant.

J’ai du mal à comprendre l’intéret de mapper sur des full_name. Il me semble que l’on va plus facilement modifier des noms et références produits que des ID.
J’ai une comptabilité en PROD qui est pourri par ces mappages sur fullname.
Si l’équipe d’Axelor peut s’expliquer là dessus, je serai vraiment à l’écoute.

Je vais tenter de plus en plus d’import de data sur Axelor via n8n. Si vous avez d’autre expériences à l’avenir je serai ravi d’échanger là dessus.

Excellente journée

si vous mettez l id du product ca marche aussi , mais faut que la colonne s appelle product.id et pas id qui est id de la table product , et qui est auto généré sur l insertion dans la table.
PAr contre sur une nouevlle instace sans données , je ne vois pas ou se trouve l interface pour les produits par société

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.