Merge pull request #39 from vauxoo-dev/8.0-squash_crm_rma_advance_warranty_module_between_oca_vauxoo

[ADD] Module to To calculate the warranty using supplier that generat…
This commit is contained in:
Nhomar Hernández [Vauxoo]
2016-01-19 02:50:07 -06:00
12 changed files with 523 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
========================
CRM RMA Advance Warranty
========================
This module makes improvements for warranty return address and warranty limit calculations method from **CRM Claim RMA** module using stored supplier information
Installation
============
To install this module, you need to select it from available modules
Configuration
=============
No configuration is needed by this module
Usage
=====
This module will compute return address and warranty limit automatically when
adding/editing claim lines
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/145/8.0
For further information, please visit:
* https://www.odoo.com/forum/help-1
Known issues / Roadmap
======================
No issues are known yet
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/rma/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback
`here <https://github.com/OCA/rma/issues/new?body=module:%20crm_rma_advance_warranty%0Aversion:%208.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Credits
=======
Contributors
------------
* Yanina Aular <yanina.aular@vauxoo.com>
* Osval Reyes <osval@vauxoo.com>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit http://odoo-community.org.

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Vauxoo
# Author: 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 . import models

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Vauxoo
# Author: 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/>.
#
##############################################################################
{
'name': 'CRM RMA Advance Warranty',
'version': '8.0.1.0.0',
'author': 'Vauxoo,Odoo Community Association (OCA)',
'website': 'http://www.vauxoo.com/',
'license': 'AGPL-3',
'category': 'Generic Modules/CRM & SRM',
'depends': [
'crm_claim_rma',
'crm_claim_product_supplier',
],
'installable': True,
}

View File

@@ -0,0 +1,40 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * crm_rma_advance_warranty
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-21 03:06+0000\n"
"PO-Revision-Date: 2015-07-21 03:06+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: crm_rma_advance_warranty
#: code:addons/crm_rma_advance_warranty/models/claim_line.py:41
#, python-format
msgid "Cannot find any date for invoice. Must be a validated invoice."
msgstr ""
#. module: crm_rma_advance_warranty
#: code:addons/crm_rma_advance_warranty/models/claim_line.py:40
#: code:addons/crm_rma_advance_warranty/models/claim_line.py:57
#, python-format
msgid "Error"
msgstr ""
#. module: crm_rma_advance_warranty
#: model:ir.model,name:crm_rma_advance_warranty.model_claim_line
msgid "List of product to return"
msgstr ""
#. module: crm_rma_advance_warranty
#: code:addons/crm_rma_advance_warranty/models/claim_line.py:58
#, python-format
msgid "The product has no supplier configured for %s."
msgstr ""

View File

@@ -0,0 +1,40 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * crm_rma_advance_warranty
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-21 03:06+0000\n"
"PO-Revision-Date: 2015-07-21 03:06+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: crm_rma_advance_warranty
#: code:addons/crm_rma_advance_warranty/model/crm_claim_rma.py:41
#, python-format
msgid "Cannot find any date for invoice. Must be a validated invoice."
msgstr "No se puede encontrar ninguna fecha para la factura. Debe ser una factura validada."
#. module: crm_rma_advance_warranty
#: code:addons/crm_rma_advance_warranty/model/crm_claim_rma.py:40
#: code:addons/crm_rma_advance_warranty/model/crm_claim_rma.py:57
#, python-format
msgid "Error"
msgstr "Error"
#. module: crm_rma_advance_warranty
#: model:ir.model,name:crm_rma_advance_warranty.model_claim_line
msgid "List of product to return"
msgstr "Lista de productos a retornar"
#. module: crm_rma_advance_warranty
#: code:addons/crm_rma_advance_warranty/model/crm_claim_rma.py:58
#, python-format
msgid "The product has no supplier configured for %s."
msgstr "El producto no tiene un proveedor configurado para %s"

View File

@@ -0,0 +1,16 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * crm_rma_advance_warranty
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-17 19:38+0000\n"
"PO-Revision-Date: 2015-07-17 19:38+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"

View File

@@ -0,0 +1,16 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * crm_rma_advance_warranty
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-17 19:38+0000\n"
"PO-Revision-Date: 2015-07-17 19:38+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"

View File

@@ -0,0 +1,16 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * crm_rma_advance_warranty
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-17 19:38+0000\n"
"PO-Revision-Date: 2015-07-17 19:38+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Vauxoo
# Author: 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 . import claim_line

View File

@@ -0,0 +1,119 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Vauxoo
# Author: 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, models
from datetime import datetime
from openerp.tools import (DEFAULT_SERVER_DATE_FORMAT,
DEFAULT_SERVER_DATETIME_FORMAT)
class ClaimLine(models.Model):
_inherit = 'claim.line'
@api.model
def set_warranty_limit(self):
"""
Calculate warranty limit
"""
if not self.invoice_date:
raise exceptions.Warning(
_('Error'),
_('Cannot find any date for invoice. '
'Must be a validated invoice.'))
warning = 'not_define'
date_inv_at_server = datetime.strptime(self.invoice_date,
DEFAULT_SERVER_DATETIME_FORMAT)
if self.warranty_type == 'supplier':
if self.prodlot_id:
supplier = self.prodlot_id.supplier_id
if supplier not in self.product_id.mapped('seller_ids.name'):
raise exceptions.Warning(
_('Error'),
_('The product has no supplier'
' configured for %s.' % supplier.name))
psi_obj = self.env['product.supplierinfo']
domain = [('name', '=', supplier.id),
('product_tmpl_id', '=',
self.product_id.product_tmpl_id.id)]
seller = psi_obj.search(domain)
warranty_duration = seller.warranty_duration
else:
warranty_duration = self.product_id.warranty
limit = self.warranty_limit(date_inv_at_server, warranty_duration)
# If waranty period was defined
if warranty_duration > 0:
claim_date = datetime.strptime(self.claim_id.date,
DEFAULT_SERVER_DATETIME_FORMAT)
if limit < claim_date:
warning = 'expired'
else:
warning = 'valid'
self.write({
'guarantee_limit': limit.strftime(DEFAULT_SERVER_DATE_FORMAT),
'warning': warning
})
@api.model
def set_warranty_return_address(self):
"""
Set the partner to be used as return destination and
the destination stock location of the line in case of Return.
We can have various case here:
- company or other: return to company partner or
crm_return_address_id if specified
- supplier: return to the supplier address
"""
return_address = None
psi_obj = self.env['product.supplierinfo']
supplier = self.prodlot_id.supplier_id if self.prodlot_id else False
if supplier and supplier in self.product_id.mapped('seller_ids.name'):
domain = [('name', '=', supplier.id),
('product_tmpl_id', '=',
self.product_id.product_tmpl_id.id)]
supplier = psi_obj.search(domain)
return_address_id = \
supplier.warranty_return_address.id
return_type = \
supplier.warranty_return_partner
else:
# when no supplier is configured, returns to the company
company = self.claim_id.company_id
return_address = (company.crm_return_address_id or
company.partner_id)
return_address_id = return_address.id
return_type = 'company'
location_dest_id = self.get_destination_location(
self.product_id,
self.claim_id.warehouse_id).id
self.write({
'warranty_return_partner': return_address_id,
'warranty_type': return_type,
'location_dest_id': location_dest_id
})

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Vauxoo
# Author: Osval Reyes
#
# 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 . import test_crm_rma_advance_warranty

View File

@@ -0,0 +1,105 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Vauxoo
# Author: 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 versionself.
#
# 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.tests.common import TransactionCase
class TestCrmRmaAdvanceWarranty(TransactionCase):
def setUp(self):
super(TestCrmRmaAdvanceWarranty, self).setUp()
self.claim = self.env['crm.claim']
self.claim_line = self.env['claim.line']
res_partner = self.env['res.partner']
self.sale_order = self.env['sale.order']
self.claim_type = self.ref('crm_claim_type.crm_claim_type_customer')
self.supplier_id = res_partner.browse(self.ref('base.res_partner_1'))
def get_customer_sale_order_and_invoice(self, set_supplier=False):
sale_order_id = self.sale_order.browse(
self.ref('sale.sale_order_7'))[0].copy()
# remove first order line just to simplify things up
sale_order_id.write({
'order_line': [(3, sale_order_id.order_line[0].id)]
})
if set_supplier:
sale_order_id.write({
'order_line': [(1, sale_order_id.order_line[0].id, {
'supplier_id': self.supplier_id.id
}), (1, sale_order_id.order_line[1].id, {
'supplier_id': self.supplier_id.id
}), (1, sale_order_id.order_line[2].id, {
'supplier_id': self.supplier_id.id
}), ]
})
sale_order_id.action_button_confirm()
sale_order_id.action_invoice_create()
self.assertTrue(sale_order_id.invoice_ids)
invoice_id = sale_order_id.invoice_ids[0]
invoice_id.signal_workflow('invoice_open')
return invoice_id
def create_customer_claim(self, invoice_id):
"""
Create a customer claim with or without claim lines based
on include_lines parameter
"""
customer_id = invoice_id.partner_id
claim_id = self.claim.create({
'name': 'Test Claim for %s' % (customer_id.name),
'claim_type': self.claim_type,
'partner_id': customer_id.id,
'pick': True,
'code': '/',
'invoice_id': invoice_id.id,
})
claim_id.with_context(
{'create_lines': True})._onchange_invoice_warehouse_type_date()
return claim_id
def test_01_warranty_company_limit(self):
invoice_id = self.get_customer_sale_order_and_invoice()
claim_id = self.create_customer_claim(invoice_id)
# check if it has the same line count
self.assertEquals(len(invoice_id.invoice_line),
len(claim_id.claim_line_ids))
claim_id.claim_line_ids.set_warranty()
# check if warranty set is company for all of them
wtypes = claim_id.mapped('claim_line_ids.warranty_type')
self.assertFalse([w for w in wtypes if w != 'company'])
for line_id in claim_id.claim_line_ids:
# warranty return address values
self.assertTrue(line_id.warranty_return_partner
and line_id.warranty_type
and line_id.location_dest_id)
# warranty limit values
self.assertTrue(line_id.guarantee_limit
and line_id.set_warranty_limit)