Files
rma/crm_claim_rma/models/crm_claim.py
2016-01-18 17:33:10 +01:00

204 lines
8.3 KiB
Python

# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Eezee-It, MONK Software, Vauxoo
# Copyright 2013 Camptocamp
# Copyright 2009-2013 Akretion,
# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau,
# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli,
# Osval Reyes, Yanina Aular
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import _, api, exceptions, fields, models
from .invoice_no_date import InvoiceNoDate
from .product_no_supplier import ProductNoSupplier
class CrmClaim(models.Model):
_inherit = 'crm.claim'
def _get_default_warehouse(self):
company_id = self.env.user.company_id.id
wh_obj = self.env['stock.warehouse']
wh = wh_obj.search([('company_id', '=', company_id)], limit=1)
if not wh:
raise exceptions.Warning(
_('There is no warehouse for the current user\'s company.'))
return wh
@api.model
def _get_company_default(self):
company_env = self.env['res.company']
default_company_id = company_env._company_default_get(
'claim.line')
return company_env.browse(default_company_id)
@api.multi
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
company_id = fields.Many2one(change_default=True,
default=_get_company_default)
claim_line_ids = fields.One2many('claim.line', 'claim_id',
string='Return lines')
planned_revenue = fields.Float('Expected revenue')
planned_cost = fields.Float('Expected cost')
real_revenue = fields.Float()
real_cost = fields.Float()
invoice_ids = fields.One2many('account.invoice', 'claim_id', 'Refunds',
copy=False)
picking_ids = fields.One2many('stock.picking', 'claim_id', 'RMA',
copy=False)
invoice_id = fields.Many2one('account.invoice', string='Invoice',
help='Related original Cusotmer invoice')
pick = fields.Boolean('Pick the product in the store')
delivery_address_id = fields.Many2one('res.partner',
string='Partner delivery address',
help="This address will be used to "
"deliver repaired or replacement "
"products.")
sequence = fields.Integer(default=lambda *args: 1)
warehouse_id = fields.Many2one('stock.warehouse', string='Warehouse',
required=True,
default=_get_default_warehouse)
rma_number = fields.Char(size=128, help='RMA Number provided by supplier')
@api.model
def _get_claim_type_default(self):
claim_type = self.env['crm.claim.type'].search([])
return claim_type[0] if claim_type else self.env['crm.claim.type']
claim_type = \
fields.Many2one(default=_get_claim_type_default,
help="Claim classification",
required=True)
@api.onchange('invoice_id', 'warehouse_id', 'claim_type', 'date')
def _onchange_invoice_warehouse_type_date(self):
context = self.env.context
claim_line = self.env['claim.line']
invoice_lines = self.invoice_id.invoice_line
if not self.warehouse_id:
self.warehouse_id = self._get_default_warehouse()
claim_type = self.claim_type
claim_date = self.date
warehouse = self.warehouse_id
company = self.company_id
create_lines = context.get('create_lines')
def warranty_values(invoice, product):
values = {}
try:
warranty = claim_line._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
# computed and we don't want to block the user
values.update({'guarantee_limit': False, 'warning': False})
else:
values.update(warranty)
warranty_address = claim_line._warranty_return_address_values(
product, company, warehouse)
values.update(warranty_address)
return values
if create_lines: # happens when the invoice is changed
claim_lines = []
for invoice_line in invoice_lines:
location_dest = claim_line.get_destination_location(
invoice_line.product_id, warehouse)
line = {
'name': invoice_line.name,
'claim_origin': "none",
'invoice_line_id': invoice_line.id,
'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',
}
line.update(warranty_values(invoice_line.invoice_id,
invoice_line.product_id))
claim_lines.append((0, 0, line))
value = self._convert_to_cache(
{'claim_line_ids': claim_lines}, validate=False)
self.update(value)
if self.invoice_id:
self.delivery_address_id = self.invoice_id.partner_id.id
@api.model
def message_get_reply_to(self):
""" Override to get the reply_to of the parent project. """
return [claim.section_id.message_get_reply_to()[0]
if claim.section_id else False
for claim in self.sudo()]
@api.multi
def message_get_suggested_recipients(self):
recipients = super(CrmClaim, self).message_get_suggested_recipients()
try:
for claim in self:
if claim.partner_id:
self._message_add_suggested_recipient(
recipients, claim,
partner=claim.partner_id, reason=_('Customer'))
elif claim.email_from:
self._message_add_suggested_recipient(
recipients, claim,
email=claim.email_from, reason=_('Customer Email'))
except exceptions.AccessError:
# no read access rights -> just ignore suggested recipients
# because this imply modifying followers
pass
return recipients
def _get_sequence_number(self, code_id):
claim_type_code = self.env['crm.claim.type'].\
browse(code_id).ir_sequence_id.code
sequence = self.env['ir.sequence']
return claim_type_code and sequence.get(claim_type_code) or '/'
@api.model
def create(self, values):
values = values or {}
if 'code' not in values or not values.get('code') \
or values.get('code') == '/':
values['code'] = self._get_sequence_number(values['claim_type'])
return super(CrmClaim, self).create(values)
@api.multi
def copy(self, default=None):
self.ensure_one()
default = default or {}
std_default = {
'code': '/'
}
std_default.update(default)
return super(CrmClaim, self).copy(default=std_default)