Odoo-fab
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
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
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()