diff --git a/crm_claim_rma/__openerp__.py b/crm_claim_rma/__openerp__.py index 4f922f03..735e87ae 100644 --- a/crm_claim_rma/__openerp__.py +++ b/crm_claim_rma/__openerp__.py @@ -71,10 +71,10 @@ Contributors: * Javier Carrasco """, - 'author': "Akretion, Camptocamp, Eezee-it, " + 'author': "Akretion, Camptocamp, Eezee-it, MONK Software" "Odoo Community Association (OCA)", 'website': 'http://www.akretion.com, http://www.camptocamp.com, ' - 'http://www.eezee-it.com', + 'http://www.eezee-it.com, http://www.wearemonk.com', 'license': 'AGPL-3', 'depends': [ 'sale', diff --git a/crm_claim_rma/models/account_invoice.py b/crm_claim_rma/models/account_invoice.py index c52bd674..1255ab46 100644 --- a/crm_claim_rma/models/account_invoice.py +++ b/crm_claim_rma/models/account_invoice.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- ############################################################################## # -# Copyright 2015 Eezee-It +# Copyright 2015 Eezee-It, MONK Software # Copyright 2013 Camptocamp # Copyright 2009-2013 Akretion, # Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, -# Benoît Guillot, Joel Grand-Guillaume +# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -37,20 +37,20 @@ class AccountInvoice(models.Model): Override when from claim to update the quantity and link to the claim line. """ - new_lines = [] - inv_line_obj = self.env['account.invoice.line'] - claim_line_obj = self.env['claim.line'] - # check if is an invoice_line and we are from a claim if not (self.env.context.get('claim_line_ids') and lines and lines[0]._name == 'account.invoice.line'): return super(AccountInvoice, self)._refund_cleanup_lines(lines) - for __, claim_line_id, __ in self.env.context.get('claim_line_ids'): - line = claim_line_obj.browse(claim_line_id) - if not line.refund_line_id: + # start by browsing all the lines so that Odoo will correctly prefetch + line_ids = [l[1] for l in self.env.context['claim_line_ids']] + claim_lines = self.env['claim.line'].browse(line_ids) + + new_lines = [] + for claim_line in claim_lines: + if not claim_line.refund_line_id: # For each lines replace quantity and add claim_line_id - inv_line = inv_line_obj.browse(line.invoice_line_id.id) + inv_line = claim_line.invoice_line_id clean_line = {} for field_name, field in inv_line._all_columns.iteritems(): column_type = field.column._type @@ -59,12 +59,10 @@ class AccountInvoice(models.Model): elif column_type not in ('many2many', 'one2many'): clean_line[field_name] = inv_line[field_name] elif field_name == 'invoice_line_tax_id': - tax_list = [] - for tax in inv_line[field_name]: - tax_list.append(tax.id) - clean_line[field_name] = [(6, 0, tax_list)] - clean_line['quantity'] = line['product_returned_quantity'] - clean_line['claim_line_id'] = [claim_line_id] + tax_ids = inv_line[field_name].ids + clean_line[field_name] = [(6, 0, tax_ids)] + clean_line['quantity'] = claim_line['product_returned_quantity'] + clean_line['claim_line_id'] = [claim_line.id] new_lines.append(clean_line) if not new_lines: # TODO use custom states to show button of this wizard or @@ -91,14 +89,13 @@ class AccountInvoiceLine(models.Model): @api.model def create(self, vals): - claim_line_id = False - if vals.get('claim_line_id'): - claim_line_id = vals['claim_line_id'] + claim_line_id = vals.get('claim_line_id') + if claim_line_id: del vals['claim_line_id'] - line_id = super(AccountInvoiceLine, self).create(vals) + line = super(AccountInvoiceLine, self).create(vals) if claim_line_id: claim_line = self.env['claim.line'].browse(claim_line_id) - claim_line.write({'refund_line_id': line_id.id}) + claim_line.refund_line_id = line.id - return line_id + return line diff --git a/crm_claim_rma/models/crm_claim_rma.py b/crm_claim_rma/models/crm_claim_rma.py index 29542272..d3cbcbe4 100644 --- a/crm_claim_rma/models/crm_claim_rma.py +++ b/crm_claim_rma/models/crm_claim_rma.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- ############################################################################## # -# Copyright 2015 Eezee-It +# Copyright 2015 Eezee-It, MONK Software # Copyright 2013 Camptocamp # Copyright 2009-2013 Akretion, # Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, -# Benoît Guillot, Joel Grand-Guillaume +# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -26,18 +26,18 @@ import calendar from datetime import datetime from dateutil.relativedelta import relativedelta -from openerp.models import models, fields, api, exceptions +from openerp import models, fields, api, exceptions from openerp.tools.misc import (DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT) from openerp.tools.translate import _ -class InvoiceNoDate(exceptions.Exception): +class InvoiceNoDate(Exception): """ Raised when a warranty cannot be computed for a claim line because the invoice has no date. """ -class ProductNoSupplier(exceptions.Exception): +class ProductNoSupplier(Exception): """ Raised when a warranty cannot be computed for a claim line because the product has no supplier. """ @@ -86,9 +86,7 @@ class ClaimLine(models.Model): return super(ClaimLine, self).copy_data(default=std_default) def get_warranty_return_partner(self): - seller = self.env['product.supplierinfo'] - result = seller.get_warranty_return_partner() - return result + return self.env['product.supplierinfo'].get_warranty_return_partner() name = fields.Char(string='Description', required=True, default=None) claim_origine = fields.Selection( @@ -226,11 +224,10 @@ class ClaimLine(models.Model): date_invoice = datetime.strptime(date_invoice, DEFAULT_SERVER_DATE_FORMAT) if claim_type == 'supplier': - suppliers = product.seller_ids - if not suppliers: + try: + warranty_duration = product.seller_ids[0].warranty_duration + except IndexError: raise ProductNoSupplier - supplier = suppliers[0] - warranty_duration = supplier.warranty_duration else: warranty_duration = product.warranty @@ -248,13 +245,9 @@ class ClaimLine(models.Model): def set_warranty_limit(self): claim = self.claim_id - invoice = claim.invoice_id - claim_type = claim.claim_type - claim_date = claim.date - product = self.product_id try: - values = self._warranty_limit_values(invoice, claim_type, product, - claim_date) + values = self._warranty_limit_values( + claim.invoice_id, claim.claim_type, self.product_id, claim.date) except InvoiceNoDate: raise exceptions.Warning( _('Error'), _('Cannot find any date for invoice. ' @@ -276,19 +269,20 @@ class ClaimLine(models.Model): line.set_warranty() return True + @api.returns('stock.location') def get_destination_location(self, product, warehouse): - """Compute and return the destination location ID to take + """ + Compute and return the destination location to take for a return. Always take 'Supplier' one when return type different - from company.""" - location_dest_id = warehouse.lot_stock_id.id - if product: - sellers = product.seller_ids - if sellers: - seller = sellers[0] - return_type = seller.warranty_return_partner - if return_type != 'company': - location_dest_id = seller.name.property_stock_supplier.id - return location_dest_id + from company. + """ + location_dest_id = warehouse.lot_stock_id + try: + seller = product.seller_ids[0] + if seller.warranty_return_partner != 'company': + location_dest_id = seller.name.property_stock_supplier + finally: + return location_dest_id @api.onchange('product_id', 'invoice_line_id') def _onchange_product_invoice_line(self): @@ -312,7 +306,7 @@ class ClaimLine(models.Model): return False invoice = invoice_line.invoice_id - claim_line_obj = self.env['claim.line'] + claim_line_model = self.env['claim.line'] if claim: claim = self.env['crm.claim'].browse(claim) @@ -328,7 +322,7 @@ class ClaimLine(models.Model): values = {} try: - warranty = claim_line_obj._warranty_limit_values( + warranty = claim_line_model._warranty_limit_values( invoice, claim_type, product, claim_date) except (InvoiceNoDate, ProductNoSupplier): # we don't mind at this point if the warranty can't be @@ -336,11 +330,9 @@ class ClaimLine(models.Model): values.update({'guarantee_limit': False, 'warning': False}) else: values.update(warranty) - - warranty_address = claim_line_obj._warranty_return_address_values( + warranty_address = claim_line_model._warranty_return_address_values( product, company, warehouse) values.update(warranty_address) - self.update(values) def _warranty_return_address_values(self, product, company, warehouse): @@ -368,10 +360,10 @@ class ClaimLine(models.Model): company.partner_id) return_address_id = return_address.id return_type = 'company' - location_dest_id = self.get_destination_location(product, warehouse) + location_dest = self.get_destination_location(product, warehouse) return {'warranty_return_partner': return_address_id, 'warranty_type': return_type, - 'location_dest_id': location_dest_id} + 'location_dest_id': location_dest.id} def set_warranty_return_address(self): claim = self.claim_id @@ -383,15 +375,14 @@ class ClaimLine(models.Model): self.write(values) return True - @api.multi + @api.one def set_warranty(self): """ Calculate warranty limit and address """ - for claim_line in self: - if not (claim_line.product_id and claim_line.invoice_line_id): - raise exceptions.Warning( - _('Error'), _('Please set product and invoice.')) - claim_line.set_warranty_limit() - claim_line.set_warranty_return_address() + if not (self.product_id and self.invoice_line_id): + raise exceptions.Warning( + _('Error'), _('Please set product and invoice.')) + self.set_warranty_limit() + self.set_warranty_return_address() # TODO add the option to split the claim_line in order to manage the same @@ -408,15 +399,12 @@ class CrmClaim(models.Model): _('There is no warehouse for the current user\'s company.')) return wh - @api.multi + @api.one def name_get(self): - res = [] - for claim in self: - code = claim.code and str(claim.code) or '' - res.append((claim.id, '[' + code + '] ' + claim.name)) - return res + return (self.id, '[{}] {}'.format(self.code or '', self.name)) - def copy_data(self, cr, uid, id, default=None, context=None): + @api.model + def copy_data(self, default=None): if default is None: default = {} std_default = { @@ -425,8 +413,7 @@ class CrmClaim(models.Model): 'code': self.env['ir.sequence'].get('crm.claim'), } std_default.update(default) - return super(CrmClaim, self).copy_data(cr, uid, id, std_default, - context=context) + return super(CrmClaim, self).copy_data(std_default) claim_type = fields.Selection( [('customer', 'Customer'), @@ -495,7 +482,7 @@ class CrmClaim(models.Model): if create_lines: # happens when the invoice is changed for invoice_line in invoice_lines: - location_dest_id = claim_line_obj.get_destination_location( + location_dest = claim_line_obj.get_destination_location( invoice_line.product_id, warehouse) line = { 'name': invoice_line.name, @@ -504,7 +491,7 @@ class CrmClaim(models.Model): 'product_id': invoice_line.product_id.id, 'product_returned_quantity': invoice_line.quantity, 'unit_sale_price': invoice_line.price_unit, - 'location_dest_id': location_dest_id, + 'location_dest_id': location_dest.id, 'state': 'draft', } line.update(warranty_values(invoice_line.invoice_id, diff --git a/crm_claim_rma/models/stock.py b/crm_claim_rma/models/stock.py index 4f87dd10..282013b4 100644 --- a/crm_claim_rma/models/stock.py +++ b/crm_claim_rma/models/stock.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- ############################################################################## # -# Copyright 2015 Eezee-It +# Copyright 2015 Eezee-It, MONK Software # Copyright 2013 Camptocamp # Copyright 2009-2013 Akretion, # Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, -# Benoît Guillot, Joel Grand-Guillaume +# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -33,12 +33,8 @@ class StockPicking(models.Model): @api.model def create(self, vals): if ('name' not in vals) or (vals.get('name') == '/'): - sequence_obj = self.env['ir.sequence'] - seq_obj_name = self._name - vals['name'] = sequence_obj.get(seq_obj_name) - - picking = super(StockPicking, self).create(vals) - return picking + vals['name'] = self.env['ir.sequence'].get(self._name) + return super(StockPicking, self).create(vals) class StockMove(models.Model): @@ -54,9 +50,7 @@ class StockMove(models.Model): """ move = super(StockMove, self).create(vals) if vals.get('picking_id'): - picking_obj = self.env['stock.picking'] - picking = picking_obj.browse(vals['picking_id']) + picking = self.env['stock.picking'].browse(vals['picking_id']) if picking.claim_id and picking.picking_type_id.code == 'incoming': move.write({'state': 'confirmed'}) - return move diff --git a/crm_claim_rma/wizards/account_invoice_refund.py b/crm_claim_rma/wizards/account_invoice_refund.py index a512f451..729525bb 100644 --- a/crm_claim_rma/wizards/account_invoice_refund.py +++ b/crm_claim_rma/wizards/account_invoice_refund.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- ############################################################################## # -# Copyright 2015 Eezee-It +# Copyright 2015 Eezee-It, MONK Software # Copyright 2013 Camptocamp # Copyright 2009-2013 Akretion, # Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, -# Benoît Guillot, Joel Grand-Guillaume +# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -28,24 +28,14 @@ from openerp import models, fields, api class AccountInvoiceRefund(models.TransientModel): _inherit = "account.invoice.refund" - def _get_description(self): - context = self.env.context - if context is None: - context = {} + def _default_description(self): + return self.env.context.get('description', '') - description = context.get('description') or '' - return description - - description = fields.Char(default=_get_description) + description = fields.Char(default=_default_description) @api.one def compute_refund(self, mode='refund'): - context = self.env.context.copy() - if context is None: - context = {} - - if context.get('invoice_ids'): - context['active_ids'] = context.get('invoice_ids') - - self = self.with_context(context) + invoice_ids = self.env.context.get('invoice_ids', []) + if invoice_ids: + self = self.with_context(active_ids=invoice_ids) return super(AccountInvoiceRefund, self).compute_refund(mode=mode) diff --git a/crm_claim_rma/wizards/claim_make_picking.py b/crm_claim_rma/wizards/claim_make_picking.py index b8a3fedc..e28a5b65 100644 --- a/crm_claim_rma/wizards/claim_make_picking.py +++ b/crm_claim_rma/wizards/claim_make_picking.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- ############################################################################## # -# Copyright 2015 Eezee-It +# Copyright 2015 Eezee-It, MONK Software # Copyright 2013 Camptocamp # Copyright 2009-2013 Akretion, # Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, -# Benoît Guillot, Joel Grand-Guillaume +# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -24,183 +24,166 @@ import time from openerp import models, fields, exceptions, api, workflow, _ -from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT +from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT as DT_FORMAT class ClaimMakePicking(models.TransientModel): _name = 'claim_make_picking.wizard' _description = 'Wizard to create pickings from claim lines' - def _get_source_loc(self): - """Get default source location""" - loc_id = False - context = self.env.context - if context is None: - context = {} - - warehouse_obj = self.env['stock.warehouse'] - warehouse_id = context.get('warehouse_id') - picking_type = context.get('picking_type') - partner_id = context.get('partner_id') - if picking_type == 'out': - loc_id = warehouse_obj.browse( - warehouse_id).lot_stock_id.id - elif partner_id: - loc_id = self.env['res.partner'].browse( - partner_id).property_stock_customer.id - - return loc_id - - def _get_common_dest_location_from_line(self, line_ids): + def _get_common_field_from_lines(self, lines, field): """ - Return the ID of the common location between all lines. If no common - destination was found, return False + Read the supplied field from all the lines. + Lines that do not have the supplied field set are ignored. + If all the remaining lines have the same value for the field, + that value is returned, else False is returned """ - loc_id = False - line_obj = self.env['claim.line'] - line_location = [] + field_values = lines.mapped(field) + return field_values[0] if len(field_values) == 1 else False - for line in line_obj.browse(line_ids): - if line.location_dest_id.id not in line_location: - line_location.append(line.location_dest_id.id) + def _get_common_dest_location_from_line(self, lines): + return self._get_common_field_from_lines( + lines, 'location_dest_id.id') - if len(line_location) == 1: - loc_id = line_location[0] + def _get_common_partner_from_line(self, lines): + return self._get_common_field_from_lines( + lines, 'warranty_return_partner.id') - return loc_id + def _default_claim_line_source_location_id(self): + picking_type = self.env.context.get('picking_type') + partner_id = self.env.context.get('partner_id') + warehouse_id = self.env.context.get('warehouse_id') - # Get default destination location - def _get_dest_loc(self): + if picking_type == 'out' and warehouse_id: + return self.env['stock.warehouse'].browse(warehouse_id).lot_stock_id + + if partner_id: + partner = self.env['res.partner'].browse(partner_id) + return partner.property_stock_customer + + return False + + def _default_claim_line_dest_location_id(self): """Return the location_id to use as destination. - If it's an outoing shippment: take the customer stock property - If it's an incoming shippment take the location_dest_id common to all + If it's an outoing shipment: take the customer stock property + If it's an incoming shipment take the location_dest_id common to all lines, or if different, return None. """ - context = self.env.context - if context is None: - context = {} - loc_id = False - picking_type = context.get('picking_type') - partner_id = context.get('partner_id') + picking_type = self.env.context.get('picking_type') + partner_id = self.env.context.get('partner_id') + if picking_type == 'out' and partner_id: - loc_id = self.env['res.partner'].browse( - partner_id).property_stock_customer.id - elif picking_type == 'in' and partner_id: + return self.env['res.partner'].browse( + partner_id).property_stock_customer + + if picking_type == 'in' and partner_id: # Add the case of return to supplier ! - line_ids = self._get_claim_lines() - loc_id = self._get_common_dest_location_from_line(line_ids) + lines = self._default_claim_line_ids() + return self._get_common_dest_location_from_line(lines) - return loc_id + return False - def _get_claim_lines(self): + @api.returns('claim.line') + def _default_claim_line_ids(self): # TODO use custom states to show buttons of this wizard or not instead # of raise an error - context = self.env.context - if context is None: - context = {} - - line_obj = self.env['claim.line'] - if context.get('picking_type') == 'out': - move_field = 'move_out_id' - else: - move_field = 'move_in_id' - - good_lines = [] - lines = line_obj.search( - [('claim_id', '=', context['active_id'])]) - for line in lines: - if not line[move_field] or line[move_field].state == 'cancel': - good_lines.append(line.id) - - if not good_lines: + move_field = ('move_out_id' + if self.env.context.get('picking_type') == 'out' + else 'move_in_id') + domain = [ + ('claim_id', '=', self.env.context['active_id']), + '|', (move_field, '=', False), (move_field+'.state', '=', 'cancel') + ] + lines = self.env['claim.line'].search(domain) + if not lines: raise exceptions.Warning( _('Error'), _('A picking has already been created for this claim.')) + return lines - return good_lines - - claim_line_source_location = fields.Many2one( + claim_line_source_location_id = fields.Many2one( 'stock.location', string='Source Location', required=True, - default=_get_source_loc, + default=_default_claim_line_source_location_id, help="Location where the returned products are from.") - claim_line_dest_location = fields.Many2one( + claim_line_dest_location_id = fields.Many2one( 'stock.location', string='Dest. Location', required=True, - default=_get_dest_loc, + default=_default_claim_line_dest_location_id, help="Location where the system will stock the returned products.") claim_line_ids = fields.Many2many( 'claim.line', 'claim_line_picking', 'claim_picking_id', 'claim_line_id', - string='Claim lines', default=_get_claim_lines) + string='Claim lines', default=_default_claim_line_ids) - def _get_common_partner_from_line(self, line_ids): - """ - Return the ID of the common partner between all lines. If no common - partner was found, return False - """ - partner_id = False - line_obj = self.env['claim.line'] - line_partner = [] - for line in line_obj.browse(line_ids): - if (line.warranty_return_partner - and line.warranty_return_partner.id - not in line_partner): - line_partner.append(line.warranty_return_partner.id) + def _get_picking_name(self): + return 'RMA picking {}'.format( + self.env.context.get('picking_type', 'in')) - if len(line_partner) == 1: - partner_id = line_partner[0] + def _get_picking_note(self): + return self._get_picking_name() - return partner_id + def _get_picking_data(self, claim, picking_type, partner_id): + return { + 'origin': claim.code, + 'picking_type_id': picking_type.id, + 'move_type': 'one', # direct + 'state': 'draft', + 'date': time.strftime(DT_FORMAT), + 'partner_id': partner_id, + 'invoice_state': "none", + 'company_id': claim.company_id.id, + 'location_id': self.claim_line_source_location.id, + 'location_dest_id': self.claim_line_dest_location.id, + 'note': self._get_picking_note(), + 'claim_id': claim.id, + } - @api.multi - def action_cancel(self): - return {'type': 'ir.actions.act_window_close'} + def _get_picking_line_data(self, claim, picking, line): + return { + 'name': line.product_id.name_template, + 'priority': '0', + 'date': time.strftime(DT_FORMAT), + 'date_expected': time.strftime(DT_FORMAT), + 'product_id': line.product_id.id, + 'product_uom_qty': line.product_returned_quantity, + 'product_uom': line.product_id.product_tmpl_id.uom_id.id, + 'partner_id': claim.delivery_address_id.id, + 'picking_id': picking.id, + 'state': 'draft', + 'price_unit': line.unit_sale_price, + 'company_id': claim.company_id.id, + 'location_id': self.claim_line_source_location.id, + 'location_dest_id': self.claim_line_dest_location.id, + 'note': self._get_picking_note(), + } @api.multi def action_create_picking(self): - picking_obj = self.env['stock.picking'] - picking_type_obj = self.env['stock.picking.type'] - context = self.env.context - if context is None: - context = {} - view_obj = self.env['ir.ui.view'] - name = 'RMA picking out' - if context.get('picking_type') == 'out': + picking_type_code = 'incoming' + write_field = 'move_out_id' + if self.env.context.get('picking_type') == 'out': picking_type_code = 'outgoing' - write_field = 'move_out_id' - note = 'RMA picking out' - else: - picking_type_code = 'incoming' write_field = 'move_in_id' - - if context.get('picking_type'): - note = 'RMA picking ' + str(context.get('picking_type')) - name = note - - picking_type_id = picking_type_obj.search([ + destination_id = self.claim_line_dest_location_id.id + picking_type = self.env['stock.picking.type'].search([ ('code', '=', picking_type_code), - ('default_location_dest_id', '=', - self.claim_line_dest_location.id)], limit=1).id + ('default_location_dest_id', '=', destination_id) + ], limit=1) - model = 'stock.picking' - view_id = view_obj.search([ - ('model', '=', model), - ('type', '=', 'form')], limit=1).id - - claim = self.env['crm.claim'].browse(context['active_id']) + claim = self.env['crm.claim'].browse(self.env.context['active_id']) partner_id = claim.delivery_address_id.id claim_lines = self.claim_line_ids # In case of product return, we don't allow one picking for various # product if location are different # or if partner address is different - if context.get('product_return'): + if self.env.context.get('product_return'): common_dest_loc_id = self._get_common_dest_location_from_line( - claim_lines.ids) + claim_lines) if not common_dest_loc_id: raise Warning( _('Error'), @@ -209,54 +192,25 @@ class ClaimMakePicking(models.TransientModel): 'same destination location.')) claim_lines.auto_set_warranty() - common_dest_partner_id = self._get_common_partner_from_line( - claim_lines.ids) + common_dest_partner_id = self._get_common_partner_from_line( + claim_lines) if not common_dest_partner_id: raise exceptions.Warning( _('Error'), _('A product return cannot be created for various ' 'destination addresses, please choose line with a ' 'same address.')) - partner_id = common_dest_partner_id # create picking - picking = picking_obj.create({ - 'origin': claim.code, - 'picking_type_id': picking_type_id, - 'move_type': 'one', # direct - 'state': 'draft', - 'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT), - 'partner_id': partner_id, - 'invoice_state': "none", - 'company_id': claim.company_id.id, - 'location_id': self.claim_line_source_location.id, - 'location_dest_id': self.claim_line_dest_location.id, - 'note': note, - 'claim_id': claim.id, - }) + picking = self.env['stock.picking'].create( + self._get_picking_data(claim, picking_type, partner_id)) # Create picking lines - fmt = DEFAULT_SERVER_DATETIME_FORMAT for line in self.claim_line_ids: - move_id = self.env['stock.move'].create({ - 'name': line.product_id.name_template, - 'priority': '0', - 'date': time.strftime(fmt), - 'date_expected': time.strftime(fmt), - 'product_id': line.product_id.id, - 'product_uom_qty': line.product_returned_quantity, - 'product_uom': line.product_id.product_tmpl_id.uom_id.id, - 'partner_id': partner_id, - 'picking_id': picking.id, - 'state': 'draft', - 'price_unit': line.unit_sale_price, - 'company_id': claim.company_id.id, - 'location_id': self.claim_line_source_location.id, - 'location_dest_id': self.claim_line_dest_location.id, - 'note': note}).id - + move_id = self.env['stock.move'].create( + self._get_picking_line_data(claim, picking, line)) line.write({write_field: move_id}) wf_service = workflow @@ -265,16 +219,17 @@ class ClaimMakePicking(models.TransientModel): wf_service.trg_validate(uid, 'stock.picking', picking.id, 'button_confirm', cr) picking.action_assign() - domain = ("[('picking_type_id.code', '=', '%s'), " - "('partner_id', '=', %s)]" % (picking_type_code, partner_id)) + domain = [ + ('picking_type_id.code', '=', picking_type_code), + ('partner_id', '=', partner_id) + ] return { - 'name': '%s' % name, + 'name': self._get_picking_name(), 'view_type': 'form', 'view_mode': 'form', - 'view_id': view_id, 'domain': domain, - 'res_model': model, + 'res_model': 'stock.picking', 'res_id': picking.id, 'type': 'ir.actions.act_window', } diff --git a/crm_claim_rma/wizards/claim_make_picking.xml b/crm_claim_rma/wizards/claim_make_picking.xml index a7f931e4..2ea698f9 100644 --- a/crm_claim_rma/wizards/claim_make_picking.xml +++ b/crm_claim_rma/wizards/claim_make_picking.xml @@ -14,8 +14,8 @@
- - + +