diff --git a/addons/point_of_sale/test/point_of_sale_test.yml b/addons/point_of_sale/test/point_of_sale_test.yml index 2fcfbaaf5eb..02ec88834fd 100644 --- a/addons/point_of_sale/test/point_of_sale_test.yml +++ b/addons/point_of_sale/test/point_of_sale_test.yml @@ -374,7 +374,9 @@ I click on Return Picking button. - !record {model: pos.return, id: pos_return_0}: - {} + pos_moves_ids: + - product_id: product_product_hppaviliondesktoppcs0 + quantity: 5.0 - I Return the product. - diff --git a/addons/point_of_sale/wizard/pos_return.py b/addons/point_of_sale/wizard/pos_return.py index 810ef86ec7b..e45e6984a9a 100644 --- a/addons/point_of_sale/wizard/pos_return.py +++ b/addons/point_of_sale/wizard/pos_return.py @@ -24,9 +24,25 @@ from osv import osv,fields from tools.translate import _ import time +class pos_return_memory(osv.osv_memory): + _name = "pos.return.memory" + _rec_name = 'product_id' + _columns = { + 'product_id' : fields.many2one('product.product', string="Product", required=True), + 'quantity' : fields.float("Quantity", required=True), + 'pos_moves_id' : fields.many2one('pos.return', string="Move"), + 'line_id': fields.integer('Line Id'), + } + +pos_return_memory() + + class pos_return(osv.osv_memory): _name = 'pos.return' _description = 'Point of sale return' + _columns = { + 'pos_moves_ids' : fields.one2many('pos.return.memory', 'pos_moves_id', 'Moves'), + } def default_get(self, cr, uid, fields, context=None): """ @@ -41,98 +57,22 @@ class pos_return(osv.osv_memory): @return: A dictionary which of fields with values. """ - res = super(pos_return, self).default_get(cr, uid, fields, context=context) order_obj = self.pool.get('pos.order') if context is None: context={} active_ids = context.get('active_ids') + result=[] for order in order_obj.browse(cr, uid, active_ids, context=context): for line in order.lines: - if 'return%s'%(line.id) in fields: - res['return%s'%(line.id)] = line.qty + result.append({ + 'product_id' : line.product_id.id, + 'quantity' : line.qty, + 'line_id':line.id + }) + res.update({'pos_moves_ids': result}) return res - def view_init(self, cr, uid, fields_list, context=None): - """ - Creates view dynamically and adding fields at runtime. - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param context: A standard dictionary - @return: New arch of view with new columns. - """ - res = super(pos_return, self).view_init(cr, uid, fields_list, context=context) - order_obj=self.pool.get('pos.order') - if context is None: - context={} - - active_ids=context.get('active_ids') - for order in order_obj.browse(cr, uid, active_ids, context=context): - for line in order.lines: - if 'return%s'%(line.id) not in self._columns: - self._columns['return%s'%(line.id)] = fields.float("Quantity") - - return res - - def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False,submenu=False): - - """ - Changes the view dynamically - - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param context: A standard dictionary - - @return: New arch of view. - - """ - result = super(pos_return, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar,submenu) - if context is None: - context={} - active_model = context.get('active_model') - if not active_model and active_model != 'pos.order': - return result - order_obj = self.pool.get('pos.order') - active_id = context.get('active_id', False) - if active_id: - _moves_arch_lst=""" -
""" - - result['arch'] = _moves_arch_lst - result['fields'] = _line_fields - return result - - def create_returns(self, cr, uid, data, context=None): """ @param self: The object pointer. @@ -145,23 +85,15 @@ class pos_return(osv.osv_memory): """ if context is None: context = {} - current_rec = self.read(cr, uid, data[0], context=context) + current_rec = self.browse(cr, uid, data, context=context)[0] order_obj =self.pool.get('pos.order') line_obj = self.pool.get('pos.order.line') pos_current = order_obj.browse(cr, uid, context.get('active_id'), context=context) - pos_line_ids = pos_current.lines - if pos_line_ids: - for pos_line in pos_line_ids: - line_field = "return"+str(pos_line.id) - pos_list = current_rec.keys() - newline_vals = {} - if line_field in pos_list : - less_qty = current_rec.get(line_field) - pos_cur_line = line_obj.browse(cr, uid, pos_line.id, context=context) - qty = pos_cur_line.qty - qty = qty - less_qty - newline_vals.update({'qty':qty}) - line_obj.write(cr, uid, pos_line.id, newline_vals, context=context) + for pos_line in pos_current.lines: + for record in current_rec.pos_moves_ids: + if pos_line.id == record.line_id: + less_qty = record.quantity + line_obj.write(cr, uid, pos_line.id, {'qty':pos_line.qty - less_qty}, context=context) return { 'name': _('Add Product'), 'view_type': 'form', @@ -174,6 +106,7 @@ class pos_return(osv.osv_memory): 'type': 'ir.actions.act_window', } def create_returns2(self, cr, uid, ids, context=None): + if context is None: context = {} active_id = context.get('active_id', False) @@ -187,18 +120,16 @@ class pos_return(osv.osv_memory): wf_service = netsvc.LocalService("workflow") #Todo :Need to clean the code if active_id: - data = self.read(cr, uid, ids)[0] + data = self.browse(cr, uid, ids, context=context)[0] date_cur = time.strftime('%Y-%m-%d %H:%M:%S') for order_id in order_obj.browse(cr, uid, [active_id], context=context): - prop_ids = property_obj.search(cr, uid,[('name', '=', 'property_stock_customer')]) - val = property_obj.browse(cr, uid, prop_ids[0], context=context).value_reference + stock_dest_id = property_obj.get(cr, uid, 'property_stock_customer', 'res.partner', context=context).id cr.execute("SELECT s.id FROM stock_location s, stock_warehouse w " "WHERE w.lot_stock_id=s.id AND w.id=%s ", (order_id.shop_id.warehouse_id.id,)) res = cr.fetchone() location_id = res and res[0] or None - stock_dest_id = val.id new_picking = picking_obj.copy(cr, uid, order_id.picking_id.id, {'name':'%s (return)' % order_id.name, 'move_lines': [], 'state':'draft', @@ -212,25 +143,23 @@ class pos_return(osv.osv_memory): account_def = property_obj.get(cr, uid, 'property_account_payable', 'res.partner', context=context) amount = 0.0 for line in order_id.lines: - if line.id: - try: - qty = data['return%s' %line.id] + for record in data.pos_moves_ids: + if line.id == record.line_id: + qty = record.quantity amount += qty * line.price_unit - except : - qty = line.qty - stock_move_obj.create(cr, uid, { - 'product_qty': qty , - 'product_uos_qty': uom_obj._compute_qty(cr, uid, qty ,line.product_id.uom_id.id), - 'picking_id': new_picking, - 'product_uom': line.product_id.uom_id.id, - 'location_id': location_id, - 'product_id': line.product_id.id, - 'location_dest_id': stock_dest_id, - 'name': '%s (return)' %order_id.name, - 'date': date_cur - }) - if qty != 0.0: - line_obj.copy(cr, uid, line.id, {'qty': -qty, 'order_id': new_order}) + stock_move_obj.create(cr, uid, { + 'product_qty': qty , + 'product_uos_qty': uom_obj._compute_qty(cr, uid, qty ,line.product_id.uom_id.id), + 'picking_id': new_picking, + 'product_uom': line.product_id.uom_id.id, + 'location_id': location_id, + 'product_id': line.product_id.id, + 'location_dest_id': stock_dest_id, + 'name': '%s (return)' %order_id.name, + 'date': date_cur + }) + if qty != 0.0: + line_obj.copy(cr, uid, line.id, {'qty': -qty, 'order_id': new_order}) statementl_obj.create(cr, uid, { 'name': 'Refund %s'%order_id.name, 'statement_id': order_id.statement_ids[0].statement_id.id, @@ -290,15 +219,12 @@ class add_product(osv.osv_memory): for order_id in order_obj.browse(cr, uid, [active_id], context=context): prod=data['product_id'] qty=data['quantity'] - prop_ids = property_obj.search(cr, uid, [('name', '=', 'property_stock_customer')]) - val = property_obj.browse(cr, uid, prop_ids[0]).value_reference + stock_dest_id = property_obj.get(cr, uid, 'property_stock_customer', 'res.partner', context=context).id cr.execute("SELECT s.id FROM stock_location s, stock_warehouse w " "WHERE w.lot_stock_id=s.id AND w.id=%s ", (order_id.shop_id.warehouse_id.id,)) res=cr.fetchone() location_id=res and res[0] or None - stock_dest_id = val.id - prod_id=prod_obj.browse(cr, uid, prod, context=context) new_picking=picking_obj.create(cr, uid, { 'name':'%s (Added)' %order_id.name, @@ -357,14 +283,12 @@ class add_product(osv.osv_memory): order_obj.add_product(cr, uid, active_ids[0], self_data['product_id'], self_data['quantity'], context=context) for order_id in order_obj.browse(cr, uid, active_ids, context=context): - prop_ids =property_obj.search(cr, uid, [('name', '=', 'property_stock_customer')]) - val = property_obj.browse(cr, uid, prop_ids[0]).value_reference + stock_dest_id = property_obj.get(cr, uid, 'property_stock_customer', 'res.partner', context=context).id cr.execute("SELECT s.id FROM stock_location s, stock_warehouse w " " WHERE w.lot_stock_id=s.id AND w.id=%s ", (order_id.shop_id.warehouse_id.id,)) res=cr.fetchone() location_id=res and res[0] or None - stock_dest_id = val.id order_obj.write(cr,uid,[order_id.id],{'type_rec':'Exchange'}) if order_id.invoice_id: diff --git a/addons/point_of_sale/wizard/pos_return_view.xml b/addons/point_of_sale/wizard/pos_return_view.xml index 0d01b3c6666..7509b55b5d8 100644 --- a/addons/point_of_sale/wizard/pos_return_view.xml +++ b/addons/point_of_sale/wizard/pos_return_view.xml @@ -1,13 +1,58 @@