diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index 787178723ab..e45651a30a2 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -267,7 +267,7 @@ class procurement_order(osv.osv): # # Scheduler # - def run_scheduler(self, cr, uid, use_new_cursor=False, context=None): + def run_scheduler(self, cr, uid, use_new_cursor=False, company_id = False, context=None): ''' Call the scheduler to check the procurement order. This is intented to be done for all existing companies at the same time, so we're running all the methods as SUPERUSER to avoid intercompany and access rights issues. @@ -288,8 +288,11 @@ class procurement_order(osv.osv): cr = openerp.registry(cr.dbname).cursor() # Run confirmed procurements + dom = [('state', '=', 'confirmed')] + if company_id: + dom += [('company_id', '=', company_id)] while True: - ids = self.search(cr, SUPERUSER_ID, [('state', '=', 'confirmed')], context=context) + ids = self.search(cr, SUPERUSER_ID, dom, context=context) if not ids: break self.run(cr, SUPERUSER_ID, ids, context=context) @@ -298,8 +301,11 @@ class procurement_order(osv.osv): # Check if running procurements are done offset = 0 + dom = [('state', '=', 'running')] + if company_id: + dom += [('company_id', '=', company_id)] while True: - ids = self.search(cr, SUPERUSER_ID, [('state', '=', 'running')], offset=offset, context=context) + ids = self.search(cr, SUPERUSER_ID, dom, offset=offset, context=context) if not ids: break done = self.check(cr, SUPERUSER_ID, ids, context=context) diff --git a/addons/procurement/wizard/schedulers_all.py b/addons/procurement/wizard/schedulers_all.py index 5c712b3af38..34d4758c5d5 100644 --- a/addons/procurement/wizard/schedulers_all.py +++ b/addons/procurement/wizard/schedulers_all.py @@ -37,8 +37,12 @@ class procurement_compute_all(osv.osv_memory): """ proc_obj = self.pool.get('procurement.order') #As this function is in a new thread, i need to open a new cursor, because the old one may be closed + new_cr = self.pool.cursor() - proc_obj.run_scheduler(new_cr, uid, use_new_cursor=new_cr.dbname, context=context) + user = self.pool.get('res.users').browse(new_cr, uid, uid, context=context) + comps = [x.id for x in user.company_ids] + for comp in comps: + proc_obj.run_scheduler(new_cr, uid, use_new_cursor=new_cr.dbname, company_id = comp, context=context) #close the new cursor new_cr.close() return {} diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 2f86d674d75..f12e7026332 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -1299,6 +1299,7 @@ class procurement_order(osv.osv): res[procurement.id] = False else: schedule_date = self._get_purchase_schedule_date(cr, uid, procurement, company, context=context) + purchase_date = self._get_purchase_order_date(cr, uid, procurement, company, schedule_date, context=context) line_vals = self._get_po_line_values_from_proc(cr, uid, procurement, partner, company, schedule_date, context=context) #look for any other draft PO for the same supplier, to attach the new line on instead of creating a new draft one available_draft_po_ids = po_obj.search(cr, uid, [ @@ -1306,6 +1307,9 @@ class procurement_order(osv.osv): ('location_id', '=', procurement.location_id.id), ('company_id', '=', procurement.company_id.id), ('dest_address_id', '=', procurement.partner_dest_id.id)], context=context) if available_draft_po_ids: po_id = available_draft_po_ids[0] + po_rec = po_obj.browse(cr, uid, po_id, context=context) + if datetime.strptime(po_rec.date_order, DEFAULT_SERVER_DATE_FORMAT) > purchase_date: + po_obj.write(cr, uid, [po_id], {'date_order': purchase_date}, context=context) #look for any other PO line in the selected PO with same product and UoM to sum quantities instead of creating a new po line available_po_line_ids = po_line_obj.search(cr, uid, [('order_id', '=', po_id), ('product_id', '=', line_vals['product_id']), ('product_uom', '=', line_vals['product_uom'])], context=context) if available_po_line_ids: @@ -1318,7 +1322,6 @@ class procurement_order(osv.osv): po_line_id = po_line_obj.create(cr, SUPERUSER_ID, line_vals, context=context) linked_po_ids.append(procurement.id) else: - purchase_date = self._get_purchase_order_date(cr, uid, procurement, company, schedule_date, context=context) name = seq_obj.get(cr, uid, 'purchase.order') or _('PO: %s') % procurement.name po_vals = { 'name': name, diff --git a/addons/stock/procurement.py b/addons/stock/procurement.py index f53776d4b9a..04564bda56f 100644 --- a/addons/stock/procurement.py +++ b/addons/stock/procurement.py @@ -261,7 +261,7 @@ class procurement_order(osv.osv): result['domain'] = "[('group_id','in',[" + ','.join(map(str, list(group_ids))) + "])]" return result - def run_scheduler(self, cr, uid, use_new_cursor=False, context=None): + def run_scheduler(self, cr, uid, use_new_cursor=False, company_id=False, context=None): ''' Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so @@ -286,8 +286,7 @@ class procurement_order(osv.osv): move_obj = self.pool.get('stock.move') #Minimum stock rules - company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id - self._procure_orderpoint_confirm(cr, SUPERUSER_ID, use_new_cursor=False, company_id=company.id, context=context) + self._procure_orderpoint_confirm(cr, SUPERUSER_ID, use_new_cursor=False, company_id=company_id, context=context) #Search all confirmed stock_moves and try to assign them confirmed_ids = move_obj.search(cr, uid, [('state', '=', 'confirmed')], limit=None, order='priority desc, date_expected asc', context=context) @@ -331,7 +330,7 @@ class procurement_order(osv.osv): [order_point.product_id.id], context={'location': order_point.location_id.id})[order_point.product_id.id]['virtual_available'] - def _procure_orderpoint_confirm(self, cr, uid, use_new_cursor=False, company_id=False, context=None): + def _procure_orderpoint_confirm(self, cr, uid, use_new_cursor=False, company_id = False, context=None): ''' Create procurement based on Orderpoint @@ -341,14 +340,18 @@ class procurement_order(osv.osv): if context is None: context = {} if use_new_cursor: - cr = openerp.registry(cr.dbname).db.cursor() + cr = openerp.registry(cr.dbname).cursor() orderpoint_obj = self.pool.get('stock.warehouse.orderpoint') procurement_obj = self.pool.get('procurement.order') offset = 0 ids = [1] + if company_id: + dom = [('company_id', '=', company_id)] + else: + dom = [] while ids: - ids = orderpoint_obj.search(cr, uid, [('company_id', '=', company_id)], offset=offset, limit=100) + ids = orderpoint_obj.search(cr, uid, dom, offset=offset, limit=100) for op in orderpoint_obj.browse(cr, uid, ids, context=context): prods = self._product_virtual_get(cr, uid, op) if prods is None: diff --git a/addons/stock/wizard/orderpoint_procurement.py b/addons/stock/wizard/orderpoint_procurement.py index 2cbc794cde3..f898dac4305 100644 --- a/addons/stock/wizard/orderpoint_procurement.py +++ b/addons/stock/wizard/orderpoint_procurement.py @@ -43,8 +43,10 @@ class procurement_compute(osv.osv_memory): proc_obj = self.pool.get('procurement.order') #As this function is in a new thread, I need to open a new cursor, because the old one may be closed new_cr = self.pool.cursor() - for proc in self.browse(new_cr, uid, ids, context=context): - proc_obj._procure_orderpoint_confirm(new_cr, uid, use_new_cursor=new_cr.dbname, context=context) + user_obj = self.pool.get('res.users') + user = user_obj.browse(new_cr, uid, uid, context=context) + for comp in user.company_ids: + proc_obj._procure_orderpoint_confirm(new_cr, uid, use_new_cursor=new_cr.dbname, company_id = comp.id, context=context) #close the new cursor new_cr.close() return {}