Odoo-fab
(→Les types de produits) |
(→gestion des dates) |
||
| (31 révisions intermédiaires par un utilisateur sont masquées) | |||
| Ligne 1 : | Ligne 1 : | ||
= Mise en place = | = Mise en place = | ||
| − | Installation du module "Manufacturing" | + | |
| + | ==== Installation du module "Manufacturing" ==== | ||
| + | Impose l'installation du module "Inventory" | ||
| + | |||
| + | ==== Installer simplement le module "Inventory Management" qui permet de gérer les stocks.==== | ||
| + | Attention dans ce cas on ne crée pas les produits de la même manière !! : | ||
| + | - Les routes sont différentes ('route_ids':[[6,"false",[1]]], # Appro a la commande, pas de route de fabrication) | ||
| + | - on ne gère pas de BOM (Bill Of Material) | ||
| + | |||
== Produits == | == Produits == | ||
| Ligne 6 : | Ligne 14 : | ||
- '''Produits stockables''' sont sujets au système de gestion d'inventaire complet : règles de stockage minimum, approvisionnement automatique, etc. | - '''Produits stockables''' sont sujets au système de gestion d'inventaire complet : règles de stockage minimum, approvisionnement automatique, etc. | ||
| − | |||
- Produits Consommables sont toujours supposés être en quantité suffisante dans votre stock, dès lors leurs quantités disponibles ne sont pas suivies | - Produits Consommables sont toujours supposés être en quantité suffisante dans votre stock, dès lors leurs quantités disponibles ne sont pas suivies | ||
| − | |||
- Les services sont des produits immatériels fournis par une société ou un individu | - Les services sont des produits immatériels fournis par une société ou un individu | ||
| − | + | ==== Fabrication installée ==== | |
| + | Lorsqu'on gère la fabrication, préférer les '''produits stockable''' pour imposer la gestion de la fabrication AVANT de pouvoir éditer le bon de livraison. | ||
| + | S'ils sont consommables, on peut forcer l'inventaire et faire un bon de livraison sans se préoccuper de la partie fabrication. Attention à l'impact futur ! | ||
| − | + | - il faudra dans un second temps annulé les ordres de ré-assemblage puis les supprimer. | |
| + | Les produits crées ne peuvent pas avoir la route "produire" et donc s'ils sont créer AVANT que le module ne soit installé ils ne passent pas par l'étape production. | ||
| + | - c'est une option que je ne préconise pas pour les objectif futur ou je veux avoir la possibilité de gérer la fabrication. | ||
| + | |||
| + | ==== uniquement inventaire ==== | ||
| + | - Avec des produits consommables, on peut laisser les ''approvisionnements en exception'' et éditer tout de même le bon de livraison. Il est possible d'annuler les approvisionnements. | ||
| + | - Avec des produits stockables, on peut aussi forcer les disponibilités, annulé les approvisionnements et éditer le bon de livraison. | ||
| + | |||
| + | === Chaine Logistique === | ||
- '''Fabrication''' : le produit est fabriqué en interne ou le service est fourni par dse ressources internes | - '''Fabrication''' : le produit est fabriqué en interne ou le service est fourni par dse ressources internes | ||
| Ligne 30 : | Ligne 46 : | ||
TODO c'est là qu'il faudra mettre les pièces nécessaires à la fabrication pour la gestion du stock | TODO c'est là qu'il faudra mettre les pièces nécessaires à la fabrication pour la gestion du stock | ||
| + | |||
| + | = gestion des dates = | ||
| + | https://doc.odoo.com/book/5/5_14_Stock/5_14_Stock_delivery_date/ | ||
| + | |||
| + | Dans la base de données il y a le champ "customer_lead" | ||
| + | - "Nombre de jours entre la confirmation de la commande et l'expédition des articles au client." | ||
| + | |||
| + | == délai de fabrication == | ||
| + | L'ajout d'un délais de fabrication de façon globale dans la configuration à pour effet de créer un ordre de fabrication N jours avant la date de la commande. | ||
| + | - il faut fouiller ailleurs. | ||
| + | |||
| + | On doit mettre des délais de livraison et de fabrication par '''produits'''. Il faut que ceux-ci soit '''Peut être vendu''' pour qu'on puisse leur mettre des délais !!!! | ||
| + | |||
| + | - l'ajout d'un délais de livraison mets par défaut la date de livraison a date de validation +N | ||
| + | - l'ajout d'un délais de fabrication mets par défaut la date de fab attendu à validation +N | ||
| + | - '''il faut que le délais de livraison soit supérieur au delais de fabrication. Odoo n'additionne pas les 2.''' | ||
| + | |||
| + | Odoo ayant dissocier les 2 informations de date (pour une raison que je ne comprends pas pour l'instant) et la gestion des jours non travaillés n'étant pas encore acquise, je préconise de mettre 7 jours en délais de livraison et 5 jours en délais de fabrication. Ceci pour permettre : | ||
| + | - de ne pas créer des demandes dans la passé la date de début de fabrication étant date d'engagement - délais de livraison - délais de fabrication | ||
| + | - de ne pas faire des demandes de fabrication attendu dans le WE (non géré pour l'instant) | ||
| + | |||
| + | Date de validation du BC le 23 => date de livraison le 30 (délai de livraison 7 jours). Avec un délais de fabrication de 3 jours, la date de début de fabrication est au 27. | ||
| + | |||
| + | |||
| + | fabrication => configuration => "délais de fabrication" | ||
| + | |||
| + | = Le processus = | ||
| + | Une fois le produit correctement créer cf ci-dessus (stockable, BOM, produire, ...) | ||
| + | |||
| + | '''Penser à ajuster le stock ou a créer un nouveau produit''' | ||
| + | |||
| + | - Création et validation d'un devis contenant le produit | ||
| + | - des objets livraison et fabrication sont crées | ||
| + | - une fois la fabrication effectuée, la livraison devient possible | ||
| + | |||
| + | |||
| + | = script = | ||
| + | Le faire fonctionner sur windows. (testé avec camduct 2017 et 2019 sur windows7 et windows10) | ||
| + | - Installer Python 2.x | ||
| + | - Il faut paramétrer les PATH de stockage des exports camduct. | ||
| + | - Ensuite créer une tâche planifiée (il faut la faire tourner avec un user spécifique pour ne pas être pollué par la fenêtre de commmand) | ||
| + | |||
| + | |||
| + | [[Fichier:Tache-plannifiee-user.png]] | ||
| + | |||
| + | |||
| + | Le script n'est plus maintenu à jour ici mais dans gitlab => [http://gitlab.umbo.fr/damien/camduct2odoo] | ||
| + | |||
| + | |||
| + | |||
| + | <nowiki> | ||
| + | #!/usr/bin/python | ||
| + | import sys, getopt, xmlrpclib, datetime, os | ||
| + | |||
| + | url = 'http://erp-10.umbo.fr' | ||
| + | #db = 'FAC-Prod-10-05' | ||
| + | db = 'FAC-prod' | ||
| + | username = 'damien@talevas.com' | ||
| + | password = '*******' | ||
| + | #order_id=4564 | ||
| + | |||
| + | common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(url)) | ||
| + | #version = common.version() | ||
| + | #print version | ||
| + | uid = common.authenticate(db, username, password, {}) | ||
| + | #print uid | ||
| + | models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(url)) | ||
| + | |||
| + | def main(): | ||
| + | inputfile = '' | ||
| + | outputfile = '' | ||
| + | |||
| + | |||
| + | # folder for source files | ||
| + | path = '/root/api-odoo/exports' | ||
| + | # path for proceed file store | ||
| + | destpath = '/root/api-odoo/exports-done' | ||
| + | |||
| + | # folder for source files | ||
| + | # path = './work/' | ||
| + | # path for proceed file store | ||
| + | # destpath = './done' | ||
| + | |||
| + | |||
| + | # list files from dir and run insert on each of them. | ||
| + | for path,dirs,files in os.walk(path): | ||
| + | for filename in files: | ||
| + | # print os.path.join(path,filename) | ||
| + | # print os.path.join(filename) | ||
| + | order_id = filename.replace(".txt", "") | ||
| + | # order_id = filename.replace(".TXT", "") | ||
| + | order_id = order_id.replace("\ ", "") | ||
| + | # convert the string into integer | ||
| + | print type(order_id) | ||
| + | order_id = int(order_id) | ||
| + | print "--",order_id,"--" | ||
| + | |||
| + | inputfile = os.path.join(path,filename) | ||
| + | print 'Input file is "', inputfile | ||
| + | |||
| + | # open file | ||
| + | file = open(inputfile, "r") | ||
| + | # remove first line used for field description | ||
| + | definition = file.readline() | ||
| + | print "definition =", definition | ||
| + | definition = definition.split(";") | ||
| + | |||
| + | i=1 | ||
| + | for line in file: | ||
| + | # print "line :", line | ||
| + | # print line.split(";") | ||
| + | product = line.split(";") | ||
| + | print "produit", i | ||
| + | print definition[0],":",product[0] | ||
| + | print definition[1],":",product[1] | ||
| + | print definition[2],":",product[2] | ||
| + | print definition[3],":",product[3] | ||
| + | print definition[4],":",product[4] | ||
| + | # print "" | ||
| + | i=i+1 | ||
| + | |||
| + | # search if product exist | ||
| + | product_name = product[3].replace("\"", "") | ||
| + | print "product name", product_name | ||
| + | product_id = models.execute_kw( | ||
| + | db, uid, password, 'product.product', 'search', | ||
| + | [[["name","like", product_name]]] | ||
| + | ) | ||
| + | # print "" | ||
| + | |||
| + | # if product not then create it | ||
| + | if not product_id : | ||
| + | print "product add" | ||
| + | print product_name | ||
| + | product_id = models.execute_kw(db, uid, password, | ||
| + | 'product.product', 'create', | ||
| + | [{ | ||
| + | 'name':product_name, | ||
| + | 'list_price':"1", | ||
| + | 'sale_ok':"", | ||
| + | 'purchase_ok':"", | ||
| + | 'type':"product", # product ou consu si Product alors il faut qu'il soit produit !! | ||
| + | 'route_ids':[[6,"false",[5,1]]], | ||
| + | }] | ||
| + | ) | ||
| + | print product_id | ||
| + | # create BOM associated to product | ||
| + | bom_id = models.execute_kw(db, uid, password, | ||
| + | 'mrp.bom', 'create', | ||
| + | [{ | ||
| + | 'product_tmpl_id':product_id, | ||
| + | }] | ||
| + | ) | ||
| + | |||
| + | # print pid | ||
| + | print "" | ||
| + | else: | ||
| + | print "allready exists" | ||
| + | product_id = product_id[0] | ||
| + | print product_id | ||
| + | print "" | ||
| + | |||
| + | # needed products exists | ||
| + | # create order | ||
| + | product_qty = product[2].replace("\"", "") | ||
| + | product_qty = product_qty.replace(" (m)", "") | ||
| + | product_qty = product_qty.replace(",", ".") | ||
| + | print "product_qty = ", product_qty | ||
| + | print "" | ||
| + | |||
| + | # Update order ! | ||
| + | |||
| + | # create product description | ||
| + | |||
| + | product_desc = product_name+" "+product[4]+" "+product[5]+" "+product[6]+" "+product[7]+" "+product[8] | ||
| + | print product_desc | ||
| + | # add line for each product | ||
| + | models.execute_kw(db, uid, password,'sale.order.line', 'create',[ | ||
| + | {'order_id' :order_id,'product_id':product_id,'name':product_desc, 'product_uom_qty':product_qty,'price_unit':0} | ||
| + | ]) | ||
| + | salesorder = models.execute_kw(db,uid,password, 'sale.order','search',[[['id','=',order_id]]]) | ||
| + | print models.execute_kw(db,uid,password,'sale.order','read',[salesorder],{'fields': | ||
| + | ['name', | ||
| + | 'id', | ||
| + | 'order_line']}) | ||
| + | |||
| + | file.close() | ||
| + | |||
| + | # move file once push is OK | ||
| + | srcfile = os.path.join(path,filename) | ||
| + | print srcfile | ||
| + | destfile = os.path.join(destpath,filename) | ||
| + | print destfile | ||
| + | os.rename(srcfile, destfile) | ||
| + | |||
| + | main() | ||
| + | |||
| + | </nowiki> | ||
Version actuelle en date du 16 mai 2019 à 13:05
Sommaire |
Mise en place
Installation du module "Manufacturing"
Impose l'installation du module "Inventory"
Installer simplement le module "Inventory Management" qui permet de gérer les stocks.
Attention dans ce cas on ne crée pas les produits de la même manière !! :
- Les routes sont différentes ('route_ids':[[6,"false",[1]]], # Appro a la commande, pas de route de fabrication)
- on ne gère pas de BOM (Bill Of Material)
Produits
Les types de produits
- Produits stockables sont sujets au système de gestion d'inventaire complet : règles de stockage minimum, approvisionnement automatique, etc. - Produits Consommables sont toujours supposés être en quantité suffisante dans votre stock, dès lors leurs quantités disponibles ne sont pas suivies - Les services sont des produits immatériels fournis par une société ou un individu
Fabrication installée
Lorsqu'on gère la fabrication, préférer les produits stockable pour imposer la gestion de la fabrication AVANT de pouvoir éditer le bon de livraison. S'ils sont consommables, on peut forcer l'inventaire et faire un bon de livraison sans se préoccuper de la partie fabrication. Attention à l'impact futur !
- il faudra dans un second temps annulé les ordres de ré-assemblage puis les supprimer.
Les produits crées ne peuvent pas avoir la route "produire" et donc s'ils sont créer AVANT que le module ne soit installé ils ne passent pas par l'étape production.
- c'est une option que je ne préconise pas pour les objectif futur ou je veux avoir la possibilité de gérer la fabrication.
uniquement inventaire
- Avec des produits consommables, on peut laisser les approvisionnements en exception et éditer tout de même le bon de livraison. Il est possible d'annuler les approvisionnements. - Avec des produits stockables, on peut aussi forcer les disponibilités, annulé les approvisionnements et éditer le bon de livraison.
Chaine Logistique
- Fabrication : le produit est fabriqué en interne ou le service est fourni par dse ressources internes - Acheter: le produit est acheté à un fournisseur grâce à un Ordre d'Achat.
- Sur Stock: vos clients sont fournis depuis les stocks disponibles. Si les quantités en stock sont trop faibles pour satisfaire la commande, les règles de stock minimum peuvent déclencher des propositions de bons de commandes fournisseurs. - A la commande : cet article est acquis uniquement lorsqu'une demande est faite, chaque fois qu'un bon de commande est confirmé. Ceci ne modifie pas votre niveau d'inventaire à moyen terme car vous vous réapprovisionnez avec la même quantité que ce qui a été commandé
il faut créer des nomenclatures pour chaque prodruit
- Bill of material / Nomenclature
"La nomenclature liste tous les éléments utilisés pour fabriquer le produit."
C'est la liste des pièces nécessaires à un produit.
TODO c'est là qu'il faudra mettre les pièces nécessaires à la fabrication pour la gestion du stock
gestion des dates
https://doc.odoo.com/book/5/5_14_Stock/5_14_Stock_delivery_date/
Dans la base de données il y a le champ "customer_lead"
- "Nombre de jours entre la confirmation de la commande et l'expédition des articles au client."
délai de fabrication
L'ajout d'un délais de fabrication de façon globale dans la configuration à pour effet de créer un ordre de fabrication N jours avant la date de la commande.
- il faut fouiller ailleurs.
On doit mettre des délais de livraison et de fabrication par produits. Il faut que ceux-ci soit Peut être vendu pour qu'on puisse leur mettre des délais !!!!
- l'ajout d'un délais de livraison mets par défaut la date de livraison a date de validation +N - l'ajout d'un délais de fabrication mets par défaut la date de fab attendu à validation +N - il faut que le délais de livraison soit supérieur au delais de fabrication. Odoo n'additionne pas les 2.
Odoo ayant dissocier les 2 informations de date (pour une raison que je ne comprends pas pour l'instant) et la gestion des jours non travaillés n'étant pas encore acquise, je préconise de mettre 7 jours en délais de livraison et 5 jours en délais de fabrication. Ceci pour permettre :
- de ne pas créer des demandes dans la passé la date de début de fabrication étant date d'engagement - délais de livraison - délais de fabrication - de ne pas faire des demandes de fabrication attendu dans le WE (non géré pour l'instant)
Date de validation du BC le 23 => date de livraison le 30 (délai de livraison 7 jours). Avec un délais de fabrication de 3 jours, la date de début de fabrication est au 27.
fabrication => configuration => "délais de fabrication"
Le processus
Une fois le produit correctement créer cf ci-dessus (stockable, BOM, produire, ...)
Penser à ajuster le stock ou a créer un nouveau produit
- Création et validation d'un devis contenant le produit - des objets livraison et fabrication sont crées - une fois la fabrication effectuée, la livraison devient possible
script
Le faire fonctionner sur windows. (testé avec camduct 2017 et 2019 sur windows7 et windows10)
- Installer Python 2.x - Il faut paramétrer les PATH de stockage des exports camduct. - Ensuite créer une tâche planifiée (il faut la faire tourner avec un user spécifique pour ne pas être pollué par la fenêtre de commmand)
Le script n'est plus maintenu à jour ici mais dans gitlab => [1]
#!/usr/bin/python import sys, getopt, xmlrpclib, datetime, os url = 'http://erp-10.umbo.fr' #db = 'FAC-Prod-10-05' db = 'FAC-prod' username = 'damien@talevas.com' password = '*******' #order_id=4564 common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(url)) #version = common.version() #print version uid = common.authenticate(db, username, password, {}) #print uid models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(url)) def main(): inputfile = '' outputfile = '' # folder for source files path = '/root/api-odoo/exports' # path for proceed file store destpath = '/root/api-odoo/exports-done' # folder for source files # path = './work/' # path for proceed file store # destpath = './done' # list files from dir and run insert on each of them. for path,dirs,files in os.walk(path): for filename in files: # print os.path.join(path,filename) # print os.path.join(filename) order_id = filename.replace(".txt", "") # order_id = filename.replace(".TXT", "") order_id = order_id.replace("\ ", "") # convert the string into integer print type(order_id) order_id = int(order_id) print "--",order_id,"--" inputfile = os.path.join(path,filename) print 'Input file is "', inputfile # open file file = open(inputfile, "r") # remove first line used for field description definition = file.readline() print "definition =", definition definition = definition.split(";") i=1 for line in file: # print "line :", line # print line.split(";") product = line.split(";") print "produit", i print definition[0],":",product[0] print definition[1],":",product[1] print definition[2],":",product[2] print definition[3],":",product[3] print definition[4],":",product[4] # print "" i=i+1 # search if product exist product_name = product[3].replace("\"", "") print "product name", product_name product_id = models.execute_kw( db, uid, password, 'product.product', 'search', [[["name","like", product_name]]] ) # print "" # if product not then create it if not product_id : print "product add" print product_name product_id = models.execute_kw(db, uid, password, 'product.product', 'create', [{ 'name':product_name, 'list_price':"1", 'sale_ok':"", 'purchase_ok':"", 'type':"product", # product ou consu si Product alors il faut qu'il soit produit !! 'route_ids':[[6,"false",[5,1]]], }] ) print product_id # create BOM associated to product bom_id = models.execute_kw(db, uid, password, 'mrp.bom', 'create', [{ 'product_tmpl_id':product_id, }] ) # print pid print "" else: print "allready exists" product_id = product_id[0] print product_id print "" # needed products exists # create order product_qty = product[2].replace("\"", "") product_qty = product_qty.replace(" (m)", "") product_qty = product_qty.replace(",", ".") print "product_qty = ", product_qty print "" # Update order ! # create product description product_desc = product_name+" "+product[4]+" "+product[5]+" "+product[6]+" "+product[7]+" "+product[8] print product_desc # add line for each product models.execute_kw(db, uid, password,'sale.order.line', 'create',[ {'order_id' :order_id,'product_id':product_id,'name':product_desc, 'product_uom_qty':product_qty,'price_unit':0} ]) salesorder = models.execute_kw(db,uid,password, 'sale.order','search',[[['id','=',order_id]]]) print models.execute_kw(db,uid,password,'sale.order','read',[salesorder],{'fields': ['name', 'id', 'order_line']}) file.close() # move file once push is OK srcfile = os.path.join(path,filename) print srcfile destfile = os.path.join(destpath,filename) print destfile os.rename(srcfile, destfile) main()
