From 2930e50b08739d2aa4a97e210ecf008d7093d003 Mon Sep 17 00:00:00 2001 From: jke-openerp Date: Mon, 7 Oct 2013 15:41:23 +0200 Subject: [PATCH 1/7] remove stock warning on mto product bzr revid: jke@openerp.com-20131007134123-mu4h0sw7oc5o1d4i --- addons/sale_stock/sale_stock.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index 9f45bf0be59..0230fbfef2c 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -336,10 +336,21 @@ class sale_order_line(osv.osv): if not product: res['value'].update({'product_packaging': False}) return res - + + #update of result obtained in super function product_obj = product_obj.browse(cr, uid, product, context=context) res['value']['delay'] = (product_obj.sale_delay or 0.0) + + isMto = False + for one_route in product_obj.route_ids: + if one_route.name == u'MTO': + isMto = True + break; + + print("********** Is MTO ", isMto) + + #check if product is available, and if not: raise an error uom2 = False @@ -355,7 +366,7 @@ class sale_order_line(osv.osv): res['value'].update(res_packing.get('value', {})) warning_msgs = res_packing.get('warning') and res_packing['warning']['message'] or '' compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding) - if (product_obj.type=='product') and int(compare_qty) == -1: + if (product_obj.type=='product') and int(compare_qty) == -1 and isMto == False: #and (product_obj.procure_method=='make_to_stock'): --> need to find alternative for procure_method warn_msg = _('You plan to sell %.2f %s but you only have %.2f %s available !\nThe real stock is %.2f %s. (without reservations)') % \ (qty, uom2 and uom2.name or product_obj.uom_id.name, From 6d1fba275440acec42efbc501c0c42afac01b81e Mon Sep 17 00:00:00 2001 From: jke-openerp Date: Mon, 7 Oct 2013 15:41:23 +0200 Subject: [PATCH 2/7] remove stock warning on mto product bzr revid: jke@openerp.com-20131007134123-ukaif43i2dj7ms8a --- addons/sale_stock/sale_stock.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index 9f45bf0be59..0230fbfef2c 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -336,10 +336,21 @@ class sale_order_line(osv.osv): if not product: res['value'].update({'product_packaging': False}) return res - + + #update of result obtained in super function product_obj = product_obj.browse(cr, uid, product, context=context) res['value']['delay'] = (product_obj.sale_delay or 0.0) + + isMto = False + for one_route in product_obj.route_ids: + if one_route.name == u'MTO': + isMto = True + break; + + print("********** Is MTO ", isMto) + + #check if product is available, and if not: raise an error uom2 = False @@ -355,7 +366,7 @@ class sale_order_line(osv.osv): res['value'].update(res_packing.get('value', {})) warning_msgs = res_packing.get('warning') and res_packing['warning']['message'] or '' compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding) - if (product_obj.type=='product') and int(compare_qty) == -1: + if (product_obj.type=='product') and int(compare_qty) == -1 and isMto == False: #and (product_obj.procure_method=='make_to_stock'): --> need to find alternative for procure_method warn_msg = _('You plan to sell %.2f %s but you only have %.2f %s available !\nThe real stock is %.2f %s. (without reservations)') % \ (qty, uom2 and uom2.name or product_obj.uom_id.name, From 7589873b35bbcb27af981b25ad18dd872a834bc4 Mon Sep 17 00:00:00 2001 From: jke-openerp Date: Mon, 7 Oct 2013 15:48:31 +0200 Subject: [PATCH 3/7] optimize - no float_compare if mto true bzr revid: jke@openerp.com-20131007134831-ne0w1h9xnv4n6pmw --- addons/sale_stock/sale_stock.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index 0230fbfef2c..c08d29a30e1 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -342,16 +342,8 @@ class sale_order_line(osv.osv): product_obj = product_obj.browse(cr, uid, product, context=context) res['value']['delay'] = (product_obj.sale_delay or 0.0) - isMto = False - for one_route in product_obj.route_ids: - if one_route.name == u'MTO': - isMto = True - break; - - print("********** Is MTO ", isMto) - #check if product is available, and if not: raise an error uom2 = False if uom: @@ -365,14 +357,22 @@ class sale_order_line(osv.osv): res_packing = self.product_packaging_change(cr, uid, ids, pricelist, product, qty, uom, partner_id, packaging, context=context) res['value'].update(res_packing.get('value', {})) warning_msgs = res_packing.get('warning') and res_packing['warning']['message'] or '' - compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding) - if (product_obj.type=='product') and int(compare_qty) == -1 and isMto == False: - #and (product_obj.procure_method=='make_to_stock'): --> need to find alternative for procure_method - warn_msg = _('You plan to sell %.2f %s but you only have %.2f %s available !\nThe real stock is %.2f %s. (without reservations)') % \ - (qty, uom2 and uom2.name or product_obj.uom_id.name, - max(0,product_obj.virtual_available), product_obj.uom_id.name, - max(0,product_obj.qty_available), product_obj.uom_id.name) - warning_msgs += _("Not enough stock ! : ") + warn_msg + "\n\n" + + isMto = False + for one_route in product_obj.route_ids: + if one_route.name == u'MTO': + isMto = True + break; + + if isMto == False: + compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding) + if (product_obj.type=='product') and int(compare_qty) == -1: + #and (product_obj.procure_method=='make_to_stock'): --> need to find alternative for procure_method + warn_msg = _('You plan to sell %.2f %s but you only have %.2f %s available !\nThe real stock is %.2f %s. (without reservations)') % \ + (qty, uom2 and uom2.name or product_obj.uom_id.name, + max(0,product_obj.virtual_available), product_obj.uom_id.name, + max(0,product_obj.qty_available), product_obj.uom_id.name) + warning_msgs += _("Not enough stock ! : ") + warn_msg + "\n\n" #update of warning messages if warning_msgs: From a178177f45f4d0b36f335e3ee8b0698cde2a75f2 Mon Sep 17 00:00:00 2001 From: jke-openerp Date: Mon, 7 Oct 2013 15:48:31 +0200 Subject: [PATCH 4/7] optimize - no float_compare if mto true bzr revid: jke@openerp.com-20131007134831-oc2p68rxol49l7eb --- addons/sale_stock/sale_stock.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index 0230fbfef2c..c08d29a30e1 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -342,16 +342,8 @@ class sale_order_line(osv.osv): product_obj = product_obj.browse(cr, uid, product, context=context) res['value']['delay'] = (product_obj.sale_delay or 0.0) - isMto = False - for one_route in product_obj.route_ids: - if one_route.name == u'MTO': - isMto = True - break; - - print("********** Is MTO ", isMto) - #check if product is available, and if not: raise an error uom2 = False if uom: @@ -365,14 +357,22 @@ class sale_order_line(osv.osv): res_packing = self.product_packaging_change(cr, uid, ids, pricelist, product, qty, uom, partner_id, packaging, context=context) res['value'].update(res_packing.get('value', {})) warning_msgs = res_packing.get('warning') and res_packing['warning']['message'] or '' - compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding) - if (product_obj.type=='product') and int(compare_qty) == -1 and isMto == False: - #and (product_obj.procure_method=='make_to_stock'): --> need to find alternative for procure_method - warn_msg = _('You plan to sell %.2f %s but you only have %.2f %s available !\nThe real stock is %.2f %s. (without reservations)') % \ - (qty, uom2 and uom2.name or product_obj.uom_id.name, - max(0,product_obj.virtual_available), product_obj.uom_id.name, - max(0,product_obj.qty_available), product_obj.uom_id.name) - warning_msgs += _("Not enough stock ! : ") + warn_msg + "\n\n" + + isMto = False + for one_route in product_obj.route_ids: + if one_route.name == u'MTO': + isMto = True + break; + + if isMto == False: + compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding) + if (product_obj.type=='product') and int(compare_qty) == -1: + #and (product_obj.procure_method=='make_to_stock'): --> need to find alternative for procure_method + warn_msg = _('You plan to sell %.2f %s but you only have %.2f %s available !\nThe real stock is %.2f %s. (without reservations)') % \ + (qty, uom2 and uom2.name or product_obj.uom_id.name, + max(0,product_obj.virtual_available), product_obj.uom_id.name, + max(0,product_obj.qty_available), product_obj.uom_id.name) + warning_msgs += _("Not enough stock ! : ") + warn_msg + "\n\n" #update of warning messages if warning_msgs: From 9473209b7db936d00776c87c818ea95d1c477943 Mon Sep 17 00:00:00 2001 From: jke-openerp Date: Wed, 9 Oct 2013 16:07:28 +0200 Subject: [PATCH 5/7] fixed - v1 bzr revid: jke@openerp.com-20131009140728-zavf5amo5xjbpim4 --- addons/sale_stock/sale_stock.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index c08d29a30e1..ec1cb4ab190 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -359,10 +359,11 @@ class sale_order_line(osv.osv): warning_msgs = res_packing.get('warning') and res_packing['warning']['message'] or '' isMto = False + wh0_mto_id = self.pool.get('ir.model.data').get_object(cr, uid, 'stock', 'route_warehouse0_mto').id for one_route in product_obj.route_ids: - if one_route.name == u'MTO': + if one_route.id == wh0_mto_id: isMto = True - break; + break; if isMto == False: compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding) From b3f1ce57be256537059f80a63a47a09d3cf482bd Mon Sep 17 00:00:00 2001 From: jke-openerp Date: Wed, 9 Oct 2013 17:31:20 +0200 Subject: [PATCH 6/7] try catch added bzr revid: jke@openerp.com-20131009153120-pr721kyv1y7zcv56 --- addons/sale_stock/sale_stock.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index d0524825d70..0f2ec9735d4 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -359,11 +359,21 @@ class sale_order_line(osv.osv): warning_msgs = res_packing.get('warning') and res_packing['warning']['message'] or '' isMto = False - wh0_mto_id = self.pool.get('ir.model.data').get_object(cr, uid, 'stock', 'route_warehouse0_mto').id - for one_route in product_obj.route_ids: - if one_route.id == wh0_mto_id: - isMto = True - break; + + try: + wh0_mto_id = self.pool.get('ir.model.data').get_object(cr, uid, 'stock', 'route_warehouse0_mto').id + + for one_route in product_obj.route_ids: + if one_route.id == wh0_mto_id: + isMto = True + break; + except: + # if route MTO not found in ir_model_data by searching route_warehouse0_mto from stock_data.xml + isMto = False # Force MTS --> maybe a fake warning ! + pass + + + if isMto == False: From d06b99370cafda13cfe1ae6789fc514d885e8617 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Thu, 10 Oct 2013 10:14:42 +0200 Subject: [PATCH 7/7] [FIX] sale_stock: fix onchange product to raise a warning more precisely + fixed inheritancy of views that wasn't taken into account bzr revid: qdp-launchpad@openerp.com-20131010081442-belp4gu1w75ml3fs --- addons/sale_stock/sale_stock.py | 65 +++++++++++++-------------- addons/sale_stock/sale_stock_view.xml | 14 +++--- 2 files changed, 38 insertions(+), 41 deletions(-) diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index 0f2ec9735d4..c7f0684d38e 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -323,10 +323,9 @@ class sale_order_line(osv.osv): def product_id_change(self, cr, uid, ids, pricelist, product, qty=0, uom=False, qty_uos=0, uos=False, name='', partner_id=False, - lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False, context=None): + lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False, warehouse_id=False, context=None): context = context or {} product_uom_obj = self.pool.get('product.uom') - partner_obj = self.pool.get('res.partner') product_obj = self.pool.get('product.product') warning = {} res = super(sale_order_line, self).product_id_change(cr, uid, ids, pricelist, product, qty=qty, @@ -336,47 +335,45 @@ class sale_order_line(osv.osv): if not product: res['value'].update({'product_packaging': False}) return res - - + #update of result obtained in super function product_obj = product_obj.browse(cr, uid, product, context=context) res['value']['delay'] = (product_obj.sale_delay or 0.0) - - - - #check if product is available, and if not: raise an error - uom2 = False - if uom: - uom2 = product_uom_obj.browse(cr, uid, uom) - if product_obj.uom_id.category_id.id != uom2.category_id.id: - uom = False - if not uom2: - uom2 = product_obj.uom_id # Calling product_packaging_change function after updating UoM res_packing = self.product_packaging_change(cr, uid, ids, pricelist, product, qty, uom, partner_id, packaging, context=context) res['value'].update(res_packing.get('value', {})) warning_msgs = res_packing.get('warning') and res_packing['warning']['message'] or '' - - isMto = False - - try: - wh0_mto_id = self.pool.get('ir.model.data').get_object(cr, uid, 'stock', 'route_warehouse0_mto').id - - for one_route in product_obj.route_ids: - if one_route.id == wh0_mto_id: - isMto = True - break; - except: - # if route MTO not found in ir_model_data by searching route_warehouse0_mto from stock_data.xml - isMto = False # Force MTS --> maybe a fake warning ! - pass - - - - - if isMto == False: + #determine if the product is MTO or not (for a further check) + isMto = False + if warehouse_id: + warehouse = self.pool.get('stock.warehouse').browse(cr, uid, warehouse_id, context=context) + for product_route in product_obj.route_ids: + if warehouse.mto_pull_id and warehouse.mto_pull_id.route_id and warehouse.mto_pull_id.route_id.id == product_route.id: + isMto = True + break + else: + try: + mto_route_id = self.pool.get('ir.model.data').get_object(cr, uid, 'stock', 'route_warehouse0_mto').id + except: + # if route MTO not found in ir_model_data, we treat the product as in MTS + mto_route_id = False + if mto_route_id: + for product_route in product_obj.route_ids: + if product_route.id == mto_route_id: + isMto = True + break + + #check if product is available, and if not: raise a warning, but do this only for products that aren't processed in MTO + if not isMto: + uom2 = False + if uom: + uom2 = product_uom_obj.browse(cr, uid, uom) + if product_obj.uom_id.category_id.id != uom2.category_id.id: + uom = False + if not uom2: + uom2 = product_obj.uom_id compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding) if (product_obj.type=='product') and int(compare_qty) == -1: #and (product_obj.procure_method=='make_to_stock'): --> need to find alternative for procure_method diff --git a/addons/sale_stock/sale_stock_view.xml b/addons/sale_stock/sale_stock_view.xml index e786f32e583..efc3d40adde 100644 --- a/addons/sale_stock/sale_stock_view.xml +++ b/addons/sale_stock/sale_stock_view.xml @@ -29,17 +29,17 @@ - + - - + on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, True, parent.date_order, product_packaging, parent.fiscal_position, False, parent.warehouse_id, context)"/> + + - + name="product_uom_qty" + on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, product_packaging, parent.fiscal_position, True, parent.warehouse_id, context)"/> +