diff --git a/crm_claim_rma/__openerp__.py b/crm_claim_rma/__openerp__.py
index 0cd6fbe6..24defb39 100644
--- a/crm_claim_rma/__openerp__.py
+++ b/crm_claim_rma/__openerp__.py
@@ -59,7 +59,6 @@ Using this module make the logistic flow of return this way:
'stock_view.xml',
'res_company_view.xml',
'crm_claim_rma_data.xml',
- 'stock_data.xml',
],
'images': ['images/product_return.png', 'images/claim.png','images/return_line.png','images/exchange.png'],
'installable': True,
diff --git a/crm_claim_rma/account_invoice.py b/crm_claim_rma/account_invoice.py
index fd2c2a54..aeb0c1df 100644
--- a/crm_claim_rma/account_invoice.py
+++ b/crm_claim_rma/account_invoice.py
@@ -19,7 +19,7 @@
# along with this program. If not, see .
#
##############################################################################
-from openerp.osv import fields, orm
+from openerp.osv import fields, orm, osv
from tools.translate import _
@@ -31,17 +31,13 @@ class account_invoice(orm.Model):
'claim_id': fields.many2one('crm.claim', 'Claim'),
}
- def _get_cleanup_fields(self, cr, uid, context=None):
- fields = super(account_invoice, self)._get_cleanup_fields(cr, uid,
- context=context)
- fields = fields + ('claim_line_id',)
- return fields
-
def _refund_cleanup_lines(self, cr, uid, lines, context=None):
+ """Override when from claim to update the quantity and link
+ to the claim line."""
if context is None: context = {}
new_lines = []
- # check if is an invoice_line
- if context.get('claim_line_ids') and lines and 'product_id' in lines[0]:
+ # check if is an invoice_line and we are from a claim
+ if context.get('claim_line_ids') and lines and lines[0]._name =='account.invoice.line' :
for claim_line_id in context.get('claim_line_ids'):
claim_info = self.pool.get('claim.line').read(cr, uid,
claim_line_id[1],
@@ -51,12 +47,13 @@ class account_invoice(orm.Model):
'refund_line_id'],
context=context)
if not claim_info['refund_line_id']:
+ #For each lines replace quantity and add clain_line_id
inv_line_obj = self.pool.get('account.invoice.line')
inv_line = inv_line_obj.browse(cr, uid,
[claim_info['invoice_line_id'][0]],
context=context)[0]
clean_line = {}
- for field in invoice_line_info._all_columns.keys():
+ for field in inv_line._all_columns.keys():
column_type = inv_line._all_columns[field].column._type
if column_type == 'many2one':
clean_line[field] = inv_line[field].id
@@ -75,15 +72,22 @@ class account_invoice(orm.Model):
# not instead of raise an error
raise osv.except_osv(_('Error !'),
_('A refund has already been created for this claim !'))
+ else:
+ return super(account_invoice, self)._refund_cleanup_lines(cr, uid, lines, context=None)
return map(lambda x: (0,0,x), new_lines)
- def _prepare_refund(self, cr, uid, *args, **kwargs):
- result = super(account_invoice, self)._prepare_refund(cr, uid,
- *args, **kwargs)
- if kwargs.get('context') and kwargs['context'].get('claim_id'):
- result['claim_id'] = kwargs['context']['claim_id']
+ def _prepare_refund(self, cr, uid, invoice, date=None, period_id=None,
+ description=None, journal_id=None, context=None):
+ if context is None:
+ context={}
+ result = super(account_invoice, self)._prepare_refund(cr, uid, invoice,
+ date=date, period_id=period_id, description=description,
+ journal_id=journal_id, context=context)
+ if context.get('claim_id'):
+ result['claim_id'] = context.get('claim_id')
return result
+
class account_invoice_line(orm.Model):
_inherit = "account.invoice.line"
diff --git a/crm_claim_rma/crm_claim_rma.py b/crm_claim_rma/crm_claim_rma.py
index ecc7770a..8d2e4f16 100644
--- a/crm_claim_rma/crm_claim_rma.py
+++ b/crm_claim_rma/crm_claim_rma.py
@@ -54,7 +54,7 @@ class claim_line(orm.Model):
# Comment written in a claim.line to know about the warranty status
WARRANT_COMMENT = {
'valid': "Valid",
- 'expired': "Expired"
+ 'expired': "Expired",
'not_define': "Not Defined"}
# Method to calculate total amount of the line : qty*UP
@@ -163,11 +163,6 @@ class claim_line(orm.Model):
'name': lambda *a: 'none',
}
- def write(self, cr, uid, ids, vals, context=None):
- res = super(claim_line, self).write(cr, uid, ids, vals, context=context)
- self.set_warranty(cr, uid, ids, context=context)
- return res
-
# Method to calculate warranty limit
def set_warranty_limit(self, cr, uid, ids, claim_line, context=None):
date_invoice = claim_line.invoice_line_id.invoice_id.date_invoice
@@ -181,7 +176,7 @@ class claim_line(orm.Model):
else:
waranty_duration = int(claim_line.product_id.warranty)
limit = (date_inv_at_server +
- relativedelta(month=waranty_duration).strftime(DEFAULT_SERVER_DATE_FORMAT)
+ relativedelta(month=waranty_duration)).strftime(DEFAULT_SERVER_DATE_FORMAT)
# If waranty period was defined
if waranty_duration > 0:
if limit < claim_line.claim_id.date:
@@ -197,6 +192,24 @@ class claim_line(orm.Model):
_('Cannot find any date for invoice ! Must be a validated invoice !'))
return True
+ def get_destination_location(self, cr, uid, product_id,
+ warehouse_id, context=None):
+ """Compute and return the destination location ID to take
+ for a return."""
+ prod_obj = self.pool.get('product.product')
+ prod = prod_obj.browse(cr, uid, product_id, context=context)
+ wh_obj = self.pool.get('stock.warehouse')
+ wh = wh_obj.browse(cr, uid, warehouse_id, context=context)
+ location_dest_id = wh.lot_stock_id.id
+ return_type = 'company'
+ if prod:
+ seller = prod.seller_info_id
+ if seller:
+ return_type = seller.warranty_return_partner
+ if return_type == 'supplier':
+ location_dest_id = seller.name.property_stock_supplier.id
+ return location_dest_id
+
# Method to calculate warranty return address
def set_warranty_return_address(self, cr, uid, ids,
claim_line, context=None):
@@ -207,7 +220,6 @@ class claim_line(orm.Model):
if specified
- supplier: return to the supplier address"""
return_address = None
- location_dest_id = claim_line.warehouse_id.lot_stock_id.id
return_type = 'company'
seller = claim_line.product_id.seller_info_id
claim_company = claim_line.claim_id.company_id
@@ -219,7 +231,10 @@ class claim_line(orm.Model):
return_type = seller.warranty_return_partner
if return_type == 'supplier':
return_address = seller.warranty_return_address.id
- location_dest_id = seller.property_stock_supplier.id
+ location_dest_id = self.get_destination_location(cr, uid,
+ claim_line.product_id.id,
+ claim_line.claim_id.warehouse_id.id,
+ context=context)
self.write(cr, uid, ids,
{'warranty_return_partner': return_address,
'warranty_type': return_type,
@@ -334,12 +349,20 @@ class crm_claim(orm.Model):
res['value']['partner_phone'] = other_add.phone
return res
- def onchange_invoice_id(self, cr, uid, ids, invoice_id, context=None):
+ def onchange_invoice_id(self, cr, uid, ids, invoice_id,
+ warehouse_id, context=None):
invoice_line_obj = self.pool.get('account.invoice.line')
+ claim_line_obj = self.pool.get('claim.line')
invoice_line_ids = invoice_line_obj.search(cr, uid,
[('invoice_id','=',invoice_id)])
claim_lines = []
+ if not warehouse_id:
+ warehouse_id = self._get_default_warehouse(cr, uid, context=context)
for invoice_line in invoice_line_obj.browse(cr,uid,invoice_line_ids):
+ location_dest_id = claim_line_obj.get_destination_location(cr, uid,
+ invoice_line.product_id.id,
+ warehouse_id,
+ context=context)
claim_lines.append({
'name': invoice_line.name,
'claim_origine' : "none",
@@ -347,6 +370,7 @@ class crm_claim(orm.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,
'state' : 'draft',
})
return {'value' : {'claim_line_ids' : claim_lines}}
diff --git a/crm_claim_rma/crm_claim_rma_view.xml b/crm_claim_rma/crm_claim_rma_view.xml
index f4fa7f31..d6313373 100644
--- a/crm_claim_rma/crm_claim_rma_view.xml
+++ b/crm_claim_rma/crm_claim_rma_view.xml
@@ -58,7 +58,6 @@
-
@@ -147,7 +146,7 @@
-
+
diff --git a/crm_claim_rma/wizard/__init__.py b/crm_claim_rma/wizard/__init__.py
index e524a569..9240d4da 100644
--- a/crm_claim_rma/wizard/__init__.py
+++ b/crm_claim_rma/wizard/__init__.py
@@ -21,4 +21,3 @@
##############################################################################
from . import claim_make_picking
from . import account_invoice_refund
-from . import claim_make_picking_from_picking
diff --git a/crm_claim_rma/wizard/claim_make_picking.py b/crm_claim_rma/wizard/claim_make_picking.py
index d6fa5979..2438ae9e 100644
--- a/crm_claim_rma/wizard/claim_make_picking.py
+++ b/crm_claim_rma/wizard/claim_make_picking.py
@@ -133,11 +133,11 @@ class claim_make_picking(orm.TransientModel):
picking_obj = self.pool.get('stock.picking')
if context is None: context = {}
view_obj = self.pool.get('ir.ui.view')
+ name = 'RMA picking out'
if context.get('picking_type') == 'out':
p_type = 'out'
write_field = 'move_out_id'
note = 'RMA picking out'
- name = 'Customer picking out'
view_xml_id = 'stock_picking_form'
view_name = 'stock.picking.form'
else:
@@ -147,6 +147,7 @@ class claim_make_picking(orm.TransientModel):
write_field = 'move_in_id'
if context.get('picking_type'):
note = 'RMA picking ' + str(context.get('picking_type'))
+ name = note
view_id = view_obj.search(cr, uid, [
('xml_id', '=', view_xml_id),
('model', '=', 'stock.picking'),
@@ -157,13 +158,16 @@ class claim_make_picking(orm.TransientModel):
claim = self.pool.get('crm.claim').browse(cr, uid,
context['active_id'], context=context)
partner_id = claim.partner_id.id
-
- common_dest_loc_id = self._get_common_dest_location_from_line(cr, uid,
- line_ids, context=context)
- if not common_dest_loc_id:
- raise osv.except_osv(_('Error !'),
- _('A picking cannot be created for various destination location, please '
- 'chose line with a same destination location.'))
+ line_ids = [x.id for x in wizard.claim_line_ids]
+ # In case of product return, we don't allow one picking for various
+ # product if location are different
+ if context.get('product_return'):
+ common_dest_loc_id = self._get_common_dest_location_from_line(cr, uid,
+ line_ids, context=context)
+ if not common_dest_loc_id:
+ raise osv.except_osv(_('Error !'),
+ _('A product return cannot be created for various destination location, please '
+ 'chose line with a same destination location.'))
# create picking
picking_id = picking_obj.create(cr, uid, {
'origin': claim.number,
diff --git a/crm_claim_rma/wizard/claim_make_picking_from_picking.py b/crm_claim_rma/wizard/claim_make_picking_from_picking.py
deleted file mode 100644
index 786b5ce4..00000000
--- a/crm_claim_rma/wizard/claim_make_picking_from_picking.py
+++ /dev/null
@@ -1,164 +0,0 @@
-
-# -*- coding: utf-8 -*-
-#########################################################################
-# #
-# #
-#########################################################################
-# #
-# crm_claim_rma for OpenERP #
-# Copyright (C) 2009-2012 Akretion, Emmanuel Samyn, #
-# BenoƮt GUILLOT #
-#This program is free software: you can redistribute it and/or modify #
-#it under the terms of the GNU General Public License as published by #
-#the Free Software Foundation, either version 3 of the License, or #
-#(at your option) any later version. #
-# #
-#This program is distributed in the hope that it will be useful, #
-#but WITHOUT ANY WARRANTY; without even the implied warranty of #
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
-#GNU General Public License for more details. #
-# #
-#You should have received a copy of the GNU General Public License #
-#along with this program. If not, see . #
-#########################################################################
-from openerp.osv import fields, orm
-from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
-from openerp import netsvc
-import time
-
-
-class claim_make_picking_from_picking(orm.TransientModel):
-
- _name = 'claim_make_picking_from_picking.wizard'
- _description = 'Wizard to create pickings from picking lines'
- _columns = {
- 'picking_line_source_location': fields.many2one('stock.location',
- 'Source Location',
- help="Location where the returned products are from.",
- required=True),
- 'picking_line_dest_location': fields.many2one('stock.location',
- 'Dest. Location',
- help="Location where the system will stock the returned products.",
- required=True),
- 'picking_line_ids': fields.many2many('stock.move',
- 'claim_picking_line_picking',
- 'claim_picking_id',
- 'picking_line_id',
- 'Picking lines'),
- }
-
- def _get_picking_lines(self, cr, uid, context):
- return self.pool.get('stock.picking').read(cr, uid,
- context['active_id'], ['move_lines'], context=context)['move_lines']
-
- # Get default source location
- def _get_source_loc(self, cr, uid, context):
- if context is None: context = {}
- warehouse_obj = self.pool.get('stock.warehouse')
- warehouse_id = context.get('warehouse_id')
- return warehouse_obj.read(cr, uid,
- warehouse_id, ['lot_rma_id'], context=context)['lot_rma_id'][0]
-
- # Get default destination location
- def _get_dest_loc(self, cr, uid, context):
- if context is None: context = {}
- warehouse_obj = self.pool.get('stock.warehouse')
- warehouse_id = context.get('warehouse_id')
- print warehouse_id
- if context.get('picking_type'):
- context_loc = context.get('picking_type')[8:]
- loc_field = 'lot_%s_id' %context.get('picking_type')[8:]
- loc_id = warehouse_obj.read(cr, uid,
- [warehouse_id], [loc_field], context=context)[loc_field][0]
- return loc_id
-
- _defaults = {
- 'picking_line_source_location': _get_source_loc,
- 'picking_line_dest_location': _get_dest_loc,
- 'picking_line_ids': _get_picking_lines,
- }
-
- def action_cancel(self,cr,uid,ids,conect=None):
- return {'type': 'ir.actions.act_window_close',}
-
- # If "Create" button pressed
- def action_create_picking_from_picking(self, cr, uid, ids, context=None):
- picking_obj = self.pool.get('stock.picking')
- move_obj = self.pool.get('stock.move')
- view_obj = self.pool.get('ir.ui.view')
- if context is None: context = {}
- p_type = 'internal'
- if context.get('picking_type'):
- context_type = context.get('picking_type')[8:]
- note = 'Internal picking from RMA to %s' %context_type
- name = 'Internal picking to %s' %context_type
- view_id = view_obj.search(cr, uid, [
- ('xml_id', '=', 'view_picking_form'),
- ('model', '=', 'stock.picking'),
- ('type', '=', 'form'),
- ('name', '=', 'stock.picking.form')
- ], context=context)[0]
- wizard = self.browse(cr, uid, ids[0], context=context)
- prev_picking = picking_obj.browse(cr, uid,
- context['active_id'], context=context)
- partner_id = prev_picking.partner_id.id
- # create picking
- picking_id = picking_obj.create(cr, uid, {
- 'origin': prev_picking.origin,
- 'type': p_type,
- 'move_type': 'one', # direct
- 'state': 'draft',
- 'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
- 'partner_id': prev_picking.partner_id.id,
- 'invoice_state': "none",
- 'company_id': prev_picking.company_id.id,
- 'location_id': wizard.picking_line_source_location.id,
- 'location_dest_id': wizard.picking_line_dest_location.id,
- 'note' : note,
- 'claim_id': prev_picking.claim_id.id,
- })
- # Create picking lines
- for wizard_picking_line in wizard.picking_line_ids:
- move_id = move_obj.create(cr, uid, {
- 'name' : wizard_picking_line.product_id.name_template, # Motif : crm id ? stock_picking_id ?
- 'priority': '0',
- #'create_date':
- 'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
- 'date_expected': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
- 'product_id': wizard_picking_line.product_id.id,
- 'product_qty': wizard_picking_line.product_qty,
- 'product_uom': wizard_picking_line.product_uom.id,
- 'partner_id': prev_picking.partner_id.id,
- 'prodlot_id': wizard_picking_line.prodlot_id.id,
- # 'tracking_id':
- 'picking_id': picking_id,
- 'state': 'draft',
- 'price_unit': wizard_picking_line.price_unit,
- # 'price_currency_id': claim_id.company_id.currency_id.id, # from invoice ???
- 'company_id': prev_picking.company_id.id,
- 'location_id': wizard.picking_line_source_location.id,
- 'location_dest_id': wizard.picking_line_dest_location.id,
- 'note': note,
- })
- wizard_move = move_obj.write(cr, uid,
- wizard_picking_line.id,
- {'move_dest_id': move_id},
- context=context)
- wf_service = netsvc.LocalService("workflow")
- if picking_id:
- wf_service.trg_validate(uid,
- 'stock.picking', picking_id,'button_confirm', cr)
- picking_obj.action_assign(cr, uid, [picking_id])
- domain = "[('type','=','%s'),('partner_id','=',%s)]"%(p_type, partner_id)
- return {
- 'name': '%s' % name,
- 'view_type': 'form',
- 'view_mode': 'form',
- 'view_id': view_id,
- 'domain' : domain,
- 'res_model': 'stock.picking',
- 'res_id': picking_id,
- 'type': 'ir.actions.act_window',
- }
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/crm_claim_rma/wizard/claim_make_picking_view.xml b/crm_claim_rma/wizard/claim_make_picking_view.xml
index 05eb0812..9a0c689d 100644
--- a/crm_claim_rma/wizard/claim_make_picking_view.xml
+++ b/crm_claim_rma/wizard/claim_make_picking_view.xml
@@ -34,7 +34,7 @@
form
form
new
- {'picking_type': 'in'}
+ {'picking_type': 'in','product_return': True}