Odoo-fab
(→Les types de produits) |
|||
| Ligne 30 : | Ligne 30 : | ||
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 | ||
| + | |||
| + | |||
| + | = script = | ||
| + | <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 du 31 mai 2018 à 07:31
Sommaire |
Mise en place
Installation du module "Manufacturing"
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.
Préférer les produits stockable pour imposer la gestion de la fabrication AVANT la possibilité de faire le bon de livraison
- Produits Consommables sont toujours supposés être en quantité suffisante dans votre stock, dès lors leurs quantités disponibles ne sont pas suivies
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 !
- Les services sont des produits immatériels fournis par une société ou un individu
Il faut qu'un produit soit "stockable" pour qu'il puisse bénéficier d'un approvisionnement.
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
#!/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()