From e47dd3987fa3b13488f25b562623b96125debae9 Mon Sep 17 00:00:00 2001 From: manu Date: Wed, 12 Oct 2011 15:01:59 +0200 Subject: [PATCH 01/62] [INIT] crm_claim_rma & product_warranty --- product_warranty/__init__.py | 23 +++++ product_warranty/__openerp__.py | 49 +++++++++ product_warranty/i18n/fr.po | 72 +++++++++++++ product_warranty/images/product_warranty.png | Bin 0 -> 85387 bytes product_warranty/product_warranty.py | 72 +++++++++++++ product_warranty/product_warranty_view.xml | 101 +++++++++++++++++++ 6 files changed, 317 insertions(+) create mode 100644 product_warranty/__init__.py create mode 100644 product_warranty/__openerp__.py create mode 100644 product_warranty/i18n/fr.po create mode 100644 product_warranty/images/product_warranty.png create mode 100644 product_warranty/product_warranty.py create mode 100644 product_warranty/product_warranty_view.xml diff --git a/product_warranty/__init__.py b/product_warranty/__init__.py new file mode 100644 index 000000000..85031822c --- /dev/null +++ b/product_warranty/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +######################################################################### +# # +# # +######################################################################### +# # +# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # +# # +#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 . # +######################################################################### + +import product_warranty diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py new file mode 100644 index 000000000..1e45d31e5 --- /dev/null +++ b/product_warranty/__openerp__.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +######################################################################### +# # +# # +######################################################################### +# # +# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # +# # +#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 . # +######################################################################### + + +{ + 'name': 'Product warranty', + 'version': '1.0', + 'category': 'Generic Modules/Product', + 'description': """ +Akretion - Emmanuel Samyn +Extend the product warranty management with warranty details on product / supplier relation +* supplier warranty duration +* return product to company, supplier, brand, other + """, + 'author': 'Akretion', + 'website': 'http://www.akretion.com', + 'depends': ['product'], + 'init_xml': [], + 'update_xml': [ + 'product_warranty_view.xml', + ], + 'demo_xml': [], + 'test': [], + 'installable': True, + 'active': False, + 'certificate' : '', + 'images': ['images/product_warranty.png'], +} + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/product_warranty/i18n/fr.po b/product_warranty/i18n/fr.po new file mode 100644 index 000000000..0fa3b0718 --- /dev/null +++ b/product_warranty/i18n/fr.po @@ -0,0 +1,72 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * product_warranty +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 6.0.2\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2011-10-20 10:07+0000\n" +"PO-Revision-Date: 2011-10-20 10:07+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: product_warranty +#: field:product.supplierinfo,warranty_duration:0 +msgid "Warranty" +msgstr "Garantie" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_duration:0 +msgid "Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field" +msgstr "Garantie en nombre de mois pour ce fournisseur. Uniquement pour la relation entreprise/fournisseur (commandes d'achat) ; La relation entreprise/client (commandes de vente) utilise toujours le champ de garantie de la fiche produit" + +#. module: product_warranty +#: model:ir.module.module,description:product_warranty.module_meta_information +msgid "\n" +"Akretion - Emmanuel Samyn\n" +"Extend the product warranty management with warranty details on product / supplier relation\n" +"* supplier warranty duration\n" +"* return product to company, supplier, brand, other\n" +" " +msgstr "\n" +"Akretion - Emmanuel Samyn\n" +"Extend the product warranty management with warranty details on product / supplier relation\n" +"* supplier warranty duration\n" +"* return product to company, supplier, brand, other\n" +" " + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" +msgstr "Information sur le fournisseur du produit" + +#. module: product_warranty +#: field:product.supplierinfo,active_supplier:0 +msgid "Active supplier" +msgstr "Fournisseur actif" + +#. module: product_warranty +#: constraint:product.supplierinfo:0 +msgid "Error: The default UOM and the Supplier Product UOM must be in the same category." +msgstr "Erreur : l'UdM par défaut et l'UdM du fournisseur doivent appartenir à la même catégorie." + +#. module: product_warranty +#: model:ir.module.module,shortdesc:product_warranty.module_meta_information +msgid "Product warranty" +msgstr "Garantie du produit" + +#. module: product_warranty +#: field:product.supplierinfo,warranty_return_partner:0 +msgid "Warrantee return" +msgstr "Retour garantie" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +msgid "Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty" +msgstr "Indique qui est en charge du traitement du retour garantie envers le client final. L'entreprise utilise l'adresse de livraison, et sinon l'adresse par défaut. Il en va de même pour les options fournisseur ou fabricant. Ce champ n'implique pas forcément que la garantie qui va s'appliquer est celle de celui qui gère le retour." + diff --git a/product_warranty/images/product_warranty.png b/product_warranty/images/product_warranty.png new file mode 100644 index 0000000000000000000000000000000000000000..c2eb36e6080badb69696ff6003d06c72a568c1c4 GIT binary patch literal 85387 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. # +######################################################################### + +from osv import fields, osv + +#===== +class return_instruction(osv.osv): + _name = "return.instruction" + _description = "Instructions for product return" + _columns = { + 'name': fields.char('Title', size=128, required=True), + 'instructions' : fields.text('Instructions', help="Instructions for product return"), + 'is_default' : fields.boolean('Is default', help="If is default, will be use to set the default value in supplier infos. Be careful to have only one default"), + } +return_instruction() + +#===== +class product_supplierinfo(osv.osv): + _inherit = "product.supplierinfo" + + def get_warranty_return_partner(self, cr, uid, context=None): + if self.pool.get('ir.module.module').search(cr, uid, [('name','like','product_brand'),('state','like','installed')]): + return [ + ('company','Company'), + ('supplier','Supplier'), + ('brand','Brand manufacturer'), + ('other','Other'),] + else: + return [ + ('company','Company'), + ('supplier','Supplier'), + ('other','Other'),] + + # Get selected lines to add to exchange + def _get_default_instructions(self, cr, uid,context): + instruction_ids = self.pool.get('return.instruction').search(cr, uid, [('is_default','=','FALSE')]) + if instruction_ids: + return instruction_ids[0] + + _columns = { + "warranty_duration" : fields.float('Warranty', help="Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field"), + "warranty_return_partner" : fields.selection(get_warranty_return_partner, 'Warrantee return', size=128, help="Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty"), + 'return_instructions': fields.many2one('return.instruction', 'Instructions',help="Instructions for product return"), + 'active_supplier' : fields.boolean('Active supplier', help=""), + } + _defaults = { + 'warranty_return_partner': lambda *a: 'company', + 'return_instructions': _get_default_instructions, + } + +product_supplierinfo() + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/product_warranty/product_warranty_view.xml b/product_warranty/product_warranty_view.xml new file mode 100644 index 000000000..80c15889d --- /dev/null +++ b/product_warranty/product_warranty_view.xml @@ -0,0 +1,101 @@ + + + + + + + + + product.return.instructions.tree + return.instruction + tree + + + + + + + + + + + + product.return.instructions.form + return.instruction + form + +
+ + + + + + +
+ + + Products return instructions + ir.actions.act_window + return.instruction + form + tree,form + + + + + + + + product.supplierinfo.warranty.tree + product.supplierinfo + + tree + + + + + + + + + + + + + product.supplierinfo.warranty.form + product.supplierinfo + + form + + + + + + + + + + +
+
From 6d1d0b87f8c154083ebffb87650626438dec9242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulius=20Sladkevi=C4=8Dius?= Date: Thu, 15 Dec 2011 17:10:20 +0200 Subject: [PATCH 02/62] Added security rights for product_warranty --- product_warranty/__openerp__.py | 5 +++-- product_warranty/security/ir.model.access.csv | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 product_warranty/security/ir.model.access.csv diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py index 1e45d31e5..03f092b05 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__openerp__.py @@ -36,10 +36,11 @@ 'depends': ['product'], 'init_xml': [], 'update_xml': [ + 'security/ir.model.access.csv', 'product_warranty_view.xml', ], - 'demo_xml': [], - 'test': [], + 'demo_xml': [], + 'test': [], 'installable': True, 'active': False, 'certificate' : '', diff --git a/product_warranty/security/ir.model.access.csv b/product_warranty/security/ir.model.access.csv new file mode 100644 index 000000000..a90c8a7a2 --- /dev/null +++ b/product_warranty/security/ir.model.access.csv @@ -0,0 +1,3 @@ +"id","name","model_id","group_id","perm_read","perm_write","perm_create","perm_unlink" +"access_return_instruction_user","return.instruction.user","return.instruction","Sales / User","True","True","True", +"access_return_instruction_manager","return.instruction.manager","return.instruction","Sales / Manager","True","True","True","True" From 1e0a3b0ff63b241880248534ba6d761fb54f9b11 Mon Sep 17 00:00:00 2001 From: manu Date: Tue, 3 Jan 2012 16:28:42 +0100 Subject: [PATCH 03/62] [UPDATE] --- product_warranty/product_warranty.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/product_warranty/product_warranty.py b/product_warranty/product_warranty.py index b11858e3a..544c3a821 100644 --- a/product_warranty/product_warranty.py +++ b/product_warranty/product_warranty.py @@ -54,7 +54,9 @@ def get_warranty_return_partner(self, cr, uid, context=None): def _get_default_instructions(self, cr, uid,context): instruction_ids = self.pool.get('return.instruction').search(cr, uid, [('is_default','=','FALSE')]) if instruction_ids: - return instruction_ids[0] + return instruction_ids[0] + # TO DO f(supplier) + other... + return False _columns = { "warranty_duration" : fields.float('Warranty', help="Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field"), From 4148ee6c2b89e1cea5959208a34e9bc57247abb6 Mon Sep 17 00:00:00 2001 From: Benoit Guillot Date: Wed, 12 Sep 2012 11:30:33 +0200 Subject: [PATCH 04/62] [IMP] product_warranty: add waranty_return_address on the product_supplierinfo --- product_warranty/product_warranty.py | 54 +++++++--- product_warranty/product_warranty_view.xml | 120 +++++++++++---------- 2 files changed, 101 insertions(+), 73 deletions(-) diff --git a/product_warranty/product_warranty.py b/product_warranty/product_warranty.py index 544c3a821..16c5e0bfe 100644 --- a/product_warranty/product_warranty.py +++ b/product_warranty/product_warranty.py @@ -4,7 +4,7 @@ # # ######################################################################### # # -# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # +# Copyright (C) 2009-2011 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 # @@ -21,6 +21,7 @@ ######################################################################### from osv import fields, osv +from tools.translate import _ #===== class return_instruction(osv.osv): @@ -38,37 +39,62 @@ class product_supplierinfo(osv.osv): _inherit = "product.supplierinfo" def get_warranty_return_partner(self, cr, uid, context=None): - if self.pool.get('ir.module.module').search(cr, uid, [('name','like','product_brand'),('state','like','installed')]): - return [ - ('company','Company'), - ('supplier','Supplier'), - ('brand','Brand manufacturer'), - ('other','Other'),] - else: - return [ + result = [ ('company','Company'), ('supplier','Supplier'), ('other','Other'),] + if self.pool.get('ir.module.module').search(cr, uid, [('name','like','product_brand'),('state','like','installed')]): + result.append(('brand','Brand manufacturer'),) + return result # Get selected lines to add to exchange def _get_default_instructions(self, cr, uid,context): instruction_ids = self.pool.get('return.instruction').search(cr, uid, [('is_default','=','FALSE')]) if instruction_ids: - return instruction_ids[0] - # TO DO f(supplier) + other... + return instruction_ids[0] + # TO DO f(supplier) + other. return False - + + def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=None): + # Method to return the partner delivery address or if none, the default address + # dedicated_delivery_address stand for the case a new type of address more particularly dedicated to return delivery would be implemented. + result ={} + address_obj = self.pool.get('res.partner.address') + for supplier_info in self.browse(cr, uid, ids, context=context): + result[supplier_info.id] = {} + address_id = False + return_partner = supplier_info.warranty_return_partner + if return_partner: + if return_partner == 'supplier': + partner_id = supplier_info.name.id + elif sreturn_partner == 'brand': + if not supplier_info.product_id.product_brand_id.partner_id: + raise osv.except_osv(_('Error !'), _('You need to define a partner for the brand of the product !')) + partner_id = supplier_info.product_id.product_brand_id.partner_id.id + else: + partner_id = supplier_info.company_id.partner_id.id + address_id = address_obj.search(cr, uid, [('partner_id', '=', partner_id), ('type', 'like', 'dedicated_delivery')], context=context) + if not address_id: + address_id = address_obj.search(cr, uid, [('partner_id','=', partner_id), ('type','like','delivery')], context=context) + if not address_id: + address_id = address_obj.search(cr, uid, [('partner_id', '=', partner_id), ('type', 'like', 'default')], context=context) + if not address_id: + raise osv.except_osv(_('Error !'), _('No address define for the %s!') % return_partner) + result[supplier_info.id] = address_id[0] + return result + _columns = { "warranty_duration" : fields.float('Warranty', help="Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field"), "warranty_return_partner" : fields.selection(get_warranty_return_partner, 'Warrantee return', size=128, help="Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty"), 'return_instructions': fields.many2one('return.instruction', 'Instructions',help="Instructions for product return"), 'active_supplier' : fields.boolean('Active supplier', help=""), + 'warranty_return_address': fields.function(_get_warranty_return_address, type='many2one', relation='res.partner.address', string="Warranty return address"), } _defaults = { 'warranty_return_partner': lambda *a: 'company', 'return_instructions': _get_default_instructions, } - -product_supplierinfo() + +product_supplierinfo() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/product_warranty/product_warranty_view.xml b/product_warranty/product_warranty_view.xml index 80c15889d..6dae3cb93 100644 --- a/product_warranty/product_warranty_view.xml +++ b/product_warranty/product_warranty_view.xml @@ -23,33 +23,33 @@ - - product.return.instructions.tree - return.instruction - tree - - - - - - - - - - - - product.return.instructions.form - return.instruction - form - -
- - - - - - -
+ + product.return.instructions.tree + return.instruction + tree + + + + + + + + + + + + product.return.instructions.form + return.instruction + form + +
+ + + + + + +
Products return instructions @@ -60,42 +60,44 @@ - + parent="product.prod_config_main" sequence="3"/> - - product.supplierinfo.warranty.tree - product.supplierinfo - - tree - - - - - - - - - - - - - product.supplierinfo.warranty.form - product.supplierinfo - - form - - - - - - - - - + + product.supplierinfo.warranty.tree + product.supplierinfo + + tree + + + + + + + + + + + + + + product.supplierinfo.warranty.form + product.supplierinfo + + form + + + + + + + + + +
From a243db3ec78719e0136d5ed70f75155076cf3f41 Mon Sep 17 00:00:00 2001 From: sebastien beau Date: Wed, 12 Sep 2012 18:58:33 +0200 Subject: [PATCH 05/62] [FIX] product_waranty : fix syntax error --- product_warranty/product_warranty.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/product_warranty/product_warranty.py b/product_warranty/product_warranty.py index 16c5e0bfe..7ed9f7eb4 100644 --- a/product_warranty/product_warranty.py +++ b/product_warranty/product_warranty.py @@ -23,13 +23,13 @@ from osv import fields, osv from tools.translate import _ -#===== -class return_instruction(osv.osv): +#===== +class return_instruction(osv.osv): _name = "return.instruction" _description = "Instructions for product return" _columns = { 'name': fields.char('Title', size=128, required=True), - 'instructions' : fields.text('Instructions', help="Instructions for product return"), + 'instructions' : fields.text('Instructions', help="Instructions for product return"), 'is_default' : fields.boolean('Is default', help="If is default, will be use to set the default value in supplier infos. Be careful to have only one default"), } return_instruction() @@ -64,10 +64,10 @@ def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=N result[supplier_info.id] = {} address_id = False return_partner = supplier_info.warranty_return_partner - if return_partner: + if return_partner: if return_partner == 'supplier': partner_id = supplier_info.name.id - elif sreturn_partner == 'brand': + elif return_partner == 'brand': if not supplier_info.product_id.product_brand_id.partner_id: raise osv.except_osv(_('Error !'), _('You need to define a partner for the brand of the product !')) partner_id = supplier_info.product_id.product_brand_id.partner_id.id @@ -88,7 +88,7 @@ def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=N "warranty_return_partner" : fields.selection(get_warranty_return_partner, 'Warrantee return', size=128, help="Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty"), 'return_instructions': fields.many2one('return.instruction', 'Instructions',help="Instructions for product return"), 'active_supplier' : fields.boolean('Active supplier', help=""), - 'warranty_return_address': fields.function(_get_warranty_return_address, type='many2one', relation='res.partner.address', string="Warranty return address"), + 'warranty_return_address': fields.function(_get_warranty_return_address, type='many2one', relation='res.partner.address', string="Warranty return address"), } _defaults = { 'warranty_return_partner': lambda *a: 'company', From 46ba5e016b5f24abb6680b3c53e76cd9ed6a6b61 Mon Sep 17 00:00:00 2001 From: manu Date: Fri, 14 Sep 2012 15:13:17 +0200 Subject: [PATCH 06/62] [UPDATE] website --- product_warranty/__openerp__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py index 03f092b05..b844f9328 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__openerp__.py @@ -31,8 +31,8 @@ * supplier warranty duration * return product to company, supplier, brand, other """, - 'author': 'Akretion', - 'website': 'http://www.akretion.com', + 'author': 'esamyn', + 'website': 'http://www.erp-236.com', 'depends': ['product'], 'init_xml': [], 'update_xml': [ From 9dacc0bb9a438956643c8e2ba161b8484cd58064 Mon Sep 17 00:00:00 2001 From: Angel Moya Date: Thu, 17 Jan 2013 10:38:20 +0100 Subject: [PATCH 07/62] [ADD] Spanish translation for crm_claim_rma and product_warranty --- product_warranty/i18n/es.po | 99 +++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 product_warranty/i18n/es.po diff --git a/product_warranty/i18n/es.po b/product_warranty/i18n/es.po new file mode 100644 index 000000000..09567c732 --- /dev/null +++ b/product_warranty/i18n/es.po @@ -0,0 +1,99 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * product_warranty +# +msgid "" +msgstr "" +"Project-Id-Version: product_warranty.es\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2011-10-20 10:07+0000\n" +"PO-Revision-Date: 2013-01-15 16:31+0100\n" +"Last-Translator: Rafa Soler \n" +"Language-Team: Domatix Technologies\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-SourceCharset: utf-8\n" +"Language: es_ES\n" +"X-Generator: Poedit 1.5.4\n" + +#. module: product_warranty +#: field:product.supplierinfo,warranty_duration:0 +msgid "Warranty" +msgstr "Garantía" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_duration:0 +msgid "" +"Warranty in month for this product/supplier relation. Only for company/" +"supplier relation (purchase order) ; the customer/company relation (sale " +"order) always use the product main warranty field" +msgstr "" +"Garantía en meses para este producto/proveedor. Únicamente para relaciones " +"empresa/proveedor (Orden de compra); la relación cliente/proveedor (Orden de " +"venta) usa siempre el campo garantía de la ficha de producto." + +#. module: product_warranty +#: model:ir.module.module,description:product_warranty.module_meta_information +msgid "" +"\n" +"Akretion - Emmanuel Samyn\n" +"Extend the product warranty management with warranty details on product / " +"supplier relation\n" +"* supplier warranty duration\n" +"* return product to company, supplier, brand, other\n" +" " +msgstr "" +"\n" +"Akretion - Emmanuel Samyn\n" +"Extiende la gestión de la garantía de los productos incorporando los plazos " +"de garantía a los productos (por proveedor)\n" +"* plazo de garntía dle proveedor\n" +"* devolución del producto a la empresa /proveedor/matriz/otro\n" +" " + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" +msgstr "Información sobre un proveedor de producto" + +#. module: product_warranty +#: field:product.supplierinfo,active_supplier:0 +msgid "Active supplier" +msgstr "Proveedor activo" + +#. module: product_warranty +#: constraint:product.supplierinfo:0 +msgid "" +"Error: The default UOM and the Supplier Product UOM must be in the same " +"category." +msgstr "" +"Error: El UOM y el UOM del proveedor del producto debe estar en la misma " +"categoría." + +#. module: product_warranty +#: model:ir.module.module,shortdesc:product_warranty.module_meta_information +msgid "Product warranty" +msgstr "Garantía de producto" + +#. module: product_warranty +#: field:product.supplierinfo,warranty_return_partner:0 +msgid "Warrantee return" +msgstr "Devolución en garantía" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +#, fuzzy +msgid "" +"Who is in charge of the warranty return treatment toward the end customer. " +"Company will use the current compagny delivery or default address and so on " +"for supplier and brand manufacturer. Doesn't necessarly mean that the " +"warranty to be applied is the one of the return partner (ie: can be returned " +"to the company and be under the brand warranty" +msgstr "" +"Indique quien se encarga de la gestión de postventa frente al cliente final. " +"La empresa utilizará la dirección de envío de la empresa o la dirección " +"predeterminadaL'entreprise utilise l'adresse de livraison, et sinon " +"l'adresse par défaut. Il en va de même pour les options fournisseur ou " +"fabricant. Ce champ n'implique pas forcément que la garantie qui va " +"s'appliquer est celle de celui qui gère le retour." From fd9fc073be0a1285fa8e315508e194e87944397c Mon Sep 17 00:00:00 2001 From: davidbeal Date: Mon, 11 Feb 2013 15:26:42 +0100 Subject: [PATCH 08/62] [FIX] fix security rule syntax in crm_claim_rma and product warranty --- product_warranty/security/ir.model.access.csv | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/product_warranty/security/ir.model.access.csv b/product_warranty/security/ir.model.access.csv index a90c8a7a2..b8cc8fffc 100644 --- a/product_warranty/security/ir.model.access.csv +++ b/product_warranty/security/ir.model.access.csv @@ -1,3 +1,4 @@ -"id","name","model_id","group_id","perm_read","perm_write","perm_create","perm_unlink" -"access_return_instruction_user","return.instruction.user","return.instruction","Sales / User","True","True","True", -"access_return_instruction_manager","return.instruction.manager","return.instruction","Sales / Manager","True","True","True","True" +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_return_instruction_user","return.instruction.user","model_return_instruction","base.group_user","True","False","False","False" +"access_return_instruction_manager","return.instruction.manager","model_return_instruction","base.group_sale_manager","True","True","True","True" +"access_return_instruction_salesman","return.instruction.salesman","model_return_instruction","base.group_sale_salesman","True","True","True","True" From d4ae5479c73a9d9674c7234b0a6729a65b81195a Mon Sep 17 00:00:00 2001 From: Joao Alfredo Gama Batista Date: Fri, 22 Feb 2013 17:40:51 -0500 Subject: [PATCH 09/62] [IMP] 7.0 initial version --- product_warranty/product_warranty_view.xml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/product_warranty/product_warranty_view.xml b/product_warranty/product_warranty_view.xml index 6dae3cb93..1ab3e23fa 100644 --- a/product_warranty/product_warranty_view.xml +++ b/product_warranty/product_warranty_view.xml @@ -26,7 +26,6 @@ product.return.instructions.tree return.instruction - tree @@ -40,7 +39,6 @@ product.return.instructions.form return.instruction - form
@@ -53,7 +51,6 @@ Products return instructions - ir.actions.act_window return.instruction form tree,form @@ -61,7 +58,7 @@ @@ -70,7 +67,6 @@ product.supplierinfo.warranty.tree product.supplierinfo - tree @@ -87,7 +83,6 @@ product.supplierinfo.warranty.form product.supplierinfo - form From 8d71621c89b459872794377f43facb1bf74b5073 Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Tue, 6 Aug 2013 16:33:08 -0400 Subject: [PATCH 10/62] [UPD] Remove references to res.partner.address --- product_warranty/product_warranty.py | 37 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/product_warranty/product_warranty.py b/product_warranty/product_warranty.py index 7ed9f7eb4..e63abdbe2 100644 --- a/product_warranty/product_warranty.py +++ b/product_warranty/product_warranty.py @@ -20,11 +20,10 @@ #along with this program. If not, see . # ######################################################################### -from osv import fields, osv +from openerp.osv import orm, fields from tools.translate import _ -#===== -class return_instruction(osv.osv): +class return_instruction(orm.Model): _name = "return.instruction" _description = "Instructions for product return" _columns = { @@ -32,10 +31,8 @@ class return_instruction(osv.osv): 'instructions' : fields.text('Instructions', help="Instructions for product return"), 'is_default' : fields.boolean('Is default', help="If is default, will be use to set the default value in supplier infos. Be careful to have only one default"), } -return_instruction() -#===== -class product_supplierinfo(osv.osv): +class product_supplierinfo(orm.Model): _inherit = "product.supplierinfo" def get_warranty_return_partner(self, cr, uid, context=None): @@ -48,18 +45,18 @@ def get_warranty_return_partner(self, cr, uid, context=None): return result # Get selected lines to add to exchange - def _get_default_instructions(self, cr, uid,context): + def _get_default_instructions(self, cr, uid, context=None): instruction_ids = self.pool.get('return.instruction').search(cr, uid, [('is_default','=','FALSE')]) if instruction_ids: return instruction_ids[0] - # TO DO f(supplier) + other. + # TODO f(supplier) + other. return False def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=None): # Method to return the partner delivery address or if none, the default address # dedicated_delivery_address stand for the case a new type of address more particularly dedicated to return delivery would be implemented. result ={} - address_obj = self.pool.get('res.partner.address') + address_obj = self.pool.get('res.partner') for supplier_info in self.browse(cr, uid, ids, context=context): result[supplier_info.id] = {} address_id = False @@ -73,14 +70,17 @@ def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=N partner_id = supplier_info.product_id.product_brand_id.partner_id.id else: partner_id = supplier_info.company_id.partner_id.id - address_id = address_obj.search(cr, uid, [('partner_id', '=', partner_id), ('type', 'like', 'dedicated_delivery')], context=context) - if not address_id: - address_id = address_obj.search(cr, uid, [('partner_id','=', partner_id), ('type','like','delivery')], context=context) - if not address_id: - address_id = address_obj.search(cr, uid, [('partner_id', '=', partner_id), ('type', 'like', 'default')], context=context) - if not address_id: - raise osv.except_osv(_('Error !'), _('No address define for the %s!') % return_partner) - result[supplier_info.id] = address_id[0] +# TODO : Find the partner with a delivery address, child of the partner +# v6.1 code with res.partner.address : +# address_id = address_obj.search(cr, uid, [('partner_id', '=', partner_id), ('type', 'like', 'dedicated_delivery')], context=context) +# if not address_id: +# address_id = address_obj.search(cr, uid, [('partner_id','=', partner_id), ('type','like','delivery')], context=context) +# if not address_id: +# address_id = address_obj.search(cr, uid, [('partner_id', '=', partner_id), ('type', 'like', 'default')], context=context) +# if not address_id: +# raise osv.except_osv(_('Error !'), _('No address define for the %s!') % return_partner) +# #result[supplier_info.id] = address_id[0] + result[supplier_info.id] = partner_id return result _columns = { @@ -88,13 +88,12 @@ def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=N "warranty_return_partner" : fields.selection(get_warranty_return_partner, 'Warrantee return', size=128, help="Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty"), 'return_instructions': fields.many2one('return.instruction', 'Instructions',help="Instructions for product return"), 'active_supplier' : fields.boolean('Active supplier', help=""), - 'warranty_return_address': fields.function(_get_warranty_return_address, type='many2one', relation='res.partner.address', string="Warranty return address"), + 'warranty_return_address': fields.function(_get_warranty_return_address, type='many2one', relation='res.partner', string="Warranty return address"), } _defaults = { 'warranty_return_partner': lambda *a: 'company', 'return_instructions': _get_default_instructions, } -product_supplierinfo() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From d045b21e23389d326e6ee8f01d7e359345e6fb81 Mon Sep 17 00:00:00 2001 From: Joel Grand-Guillaume Date: Thu, 14 Nov 2013 11:11:07 +0100 Subject: [PATCH 11/62] [IMP] Clean the product waranty module (PEP8) + remove use of brand as it seems to be lost in another module that is not here --- product_warranty/__init__.py | 4 +- product_warranty/__openerp__.py | 24 ++-- product_warranty/i18n/product_warranty.pot | 132 +++++++++++++++++++++ product_warranty/product_warranty.py | 69 ++++++----- product_warranty/product_warranty_view.xml | 24 +++- product_warranty/res_company.py | 38 ++++++ product_warranty/res_company_view.xml | 23 ++++ 7 files changed, 269 insertions(+), 45 deletions(-) create mode 100644 product_warranty/i18n/product_warranty.pot create mode 100644 product_warranty/res_company.py create mode 100644 product_warranty/res_company_view.xml diff --git a/product_warranty/__init__.py b/product_warranty/__init__.py index 85031822c..7c715039b 100644 --- a/product_warranty/__init__.py +++ b/product_warranty/__init__.py @@ -19,5 +19,5 @@ #You should have received a copy of the GNU General Public License # #along with this program. If not, see . # ######################################################################### - -import product_warranty +from . import product_warranty +from . import res_company \ No newline at end of file diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py index b844f9328..6ffdaca7a 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__openerp__.py @@ -26,17 +26,25 @@ 'version': '1.0', 'category': 'Generic Modules/Product', 'description': """ -Akretion - Emmanuel Samyn -Extend the product warranty management with warranty details on product / supplier relation +Product Warranty +================ + +Extend the product warranty management with warranty details on product / supplier relation: + * supplier warranty duration -* return product to company, supplier, brand, other - """, - 'author': 'esamyn', - 'website': 'http://www.erp-236.com', +* Set default return address for company (if different from standard one) +* return product to company, supplier, other + + +Those informations are used in the RMA Claim (Product Return Management) module. + +""", + 'author': 'Akretion', + 'website': 'http://akretion.com', 'depends': ['product'], - 'init_xml': [], - 'update_xml': [ + 'data': [ 'security/ir.model.access.csv', + 'res_company_view.xml', 'product_warranty_view.xml', ], 'demo_xml': [], diff --git a/product_warranty/i18n/product_warranty.pot b/product_warranty/i18n/product_warranty.pot new file mode 100644 index 000000000..7c7fd45b7 --- /dev/null +++ b/product_warranty/i18n/product_warranty.pot @@ -0,0 +1,132 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * product_warranty +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-11-21 15:06+0000\n" +"PO-Revision-Date: 2013-11-21 15: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: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id +#: field:product.supplierinfo,warranty_return_address:0 +#: field:product.supplierinfo,warranty_return_other_address_id:0 +msgid "Return address" +msgstr "" + +#. module: product_warranty +#: view:product.supplierinfo:0 +msgid "Warranty informations" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +msgid "Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_other_address_id:0 +msgid "Where the customer has to send back the product(s) if warranty return is setto 'other'." +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_duration:0 +msgid "Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field" +msgstr "" + +#. module: product_warranty +#: view:res.company:0 +msgid "Crm product return address" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_return_instruction +#: help:product.supplierinfo,return_instructions:0 +#: help:return.instruction,instructions:0 +msgid "Instructions for product return" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration +#: field:product.supplierinfo,warranty_duration:0 +msgid "Period" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name +#: field:return.instruction,name:0 +msgid "Title" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_res_company +msgid "Companies" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier +#: field:product.supplierinfo,active_supplier:0 +msgid "Active supplier" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default +#: field:return.instruction,is_default:0 +msgid "Is default" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_address:0 +msgid "Where the goods should be returned (computed field based on other infos.)" +msgstr "" + +#. module: product_warranty +#: help:return.instruction,is_default:0 +msgid "If is default, will be use to set the default value in supplier infos. Be careful to have only one default" +msgstr "" + +#. module: product_warranty +#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action +#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action +msgid "Products return instructions" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,active_supplier:0 +msgid "Is this supplier still active, only for information" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner +#: field:product.supplierinfo,warranty_return_partner:0 +msgid "Return type" +msgstr "" + +#. module: product_warranty +#: view:return.instruction:0 +msgid "Return instructions" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions +#: field:product.supplierinfo,return_instructions:0 +#: view:return.instruction:0 +#: field:return.instruction,instructions:0 +msgid "Instructions" +msgstr "" + diff --git a/product_warranty/product_warranty.py b/product_warranty/product_warranty.py index e63abdbe2..0c2f8b50e 100644 --- a/product_warranty/product_warranty.py +++ b/product_warranty/product_warranty.py @@ -28,8 +28,11 @@ class return_instruction(orm.Model): _description = "Instructions for product return" _columns = { 'name': fields.char('Title', size=128, required=True), - 'instructions' : fields.text('Instructions', help="Instructions for product return"), - 'is_default' : fields.boolean('Is default', help="If is default, will be use to set the default value in supplier infos. Be careful to have only one default"), + 'instructions' : fields.text('Instructions', + help="Instructions for product return"), + 'is_default' : fields.boolean('Is default', + help="If is default, will be use to set the default value in " + "supplier infos. Be careful to have only one default"), } class product_supplierinfo(orm.Model): @@ -40,13 +43,12 @@ def get_warranty_return_partner(self, cr, uid, context=None): ('company','Company'), ('supplier','Supplier'), ('other','Other'),] - if self.pool.get('ir.module.module').search(cr, uid, [('name','like','product_brand'),('state','like','installed')]): - result.append(('brand','Brand manufacturer'),) return result # Get selected lines to add to exchange def _get_default_instructions(self, cr, uid, context=None): - instruction_ids = self.pool.get('return.instruction').search(cr, uid, [('is_default','=','FALSE')]) + instruction_ids = self.pool.get('return.instruction').search(cr, uid, + [('is_default','=','FALSE')]) if instruction_ids: return instruction_ids[0] # TODO f(supplier) + other. @@ -54,46 +56,55 @@ def _get_default_instructions(self, cr, uid, context=None): def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=None): # Method to return the partner delivery address or if none, the default address - # dedicated_delivery_address stand for the case a new type of address more particularly dedicated to return delivery would be implemented. + # dedicated_delivery_address stand for the case a new type of address more particularly + # dedicated to return delivery would be implemented. result ={} address_obj = self.pool.get('res.partner') for supplier_info in self.browse(cr, uid, ids, context=context): result[supplier_info.id] = {} address_id = False return_partner = supplier_info.warranty_return_partner + partner_id = supplier_info.company_id.partner_id.id if return_partner: if return_partner == 'supplier': partner_id = supplier_info.name.id - elif return_partner == 'brand': - if not supplier_info.product_id.product_brand_id.partner_id: - raise osv.except_osv(_('Error !'), _('You need to define a partner for the brand of the product !')) - partner_id = supplier_info.product_id.product_brand_id.partner_id.id - else: - partner_id = supplier_info.company_id.partner_id.id -# TODO : Find the partner with a delivery address, child of the partner -# v6.1 code with res.partner.address : -# address_id = address_obj.search(cr, uid, [('partner_id', '=', partner_id), ('type', 'like', 'dedicated_delivery')], context=context) -# if not address_id: -# address_id = address_obj.search(cr, uid, [('partner_id','=', partner_id), ('type','like','delivery')], context=context) -# if not address_id: -# address_id = address_obj.search(cr, uid, [('partner_id', '=', partner_id), ('type', 'like', 'default')], context=context) -# if not address_id: -# raise osv.except_osv(_('Error !'), _('No address define for the %s!') % return_partner) -# #result[supplier_info.id] = address_id[0] + elif return_partner == 'company': + if supplier_info.company_id.crm_return_address_id: + partner_id = supplier_info.company_id.crm_return_address_id.id + elif return_partner == 'other': + if supplier_info.warranty_return_other_address_id: + partner_id = supplier_info.warranty_return_other_address_id.id result[supplier_info.id] = partner_id return result _columns = { - "warranty_duration" : fields.float('Warranty', help="Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field"), - "warranty_return_partner" : fields.selection(get_warranty_return_partner, 'Warrantee return', size=128, help="Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty"), - 'return_instructions': fields.many2one('return.instruction', 'Instructions',help="Instructions for product return"), - 'active_supplier' : fields.boolean('Active supplier', help=""), - 'warranty_return_address': fields.function(_get_warranty_return_address, type='many2one', relation='res.partner', string="Warranty return address"), + "warranty_duration": fields.float('Period', + help="Warranty in month for this product/supplier relation. Only for " + "company/supplier relation (purchase order) ; the customer/company " + "relation (sale order) always use the product main warranty field"), + "warranty_return_partner": fields.selection(get_warranty_return_partner, + 'Return type', + required=True, + help="Who is in charge of the warranty return treatment toward the end customer. " + "Company will use the current compagny delivery or default address and so on for " + "supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be " + "applied is the one of the return partner (ie: can be returned to the company and " + "be under the brand warranty"), + 'return_instructions': fields.many2one('return.instruction', + 'Instructions', + help="Instructions for product return"), + 'active_supplier': fields.boolean('Active supplier', + help="Is this supplier still active, only for information"), + 'warranty_return_address': fields.function(_get_warranty_return_address, + type='many2one', relation='res.partner', string="Return address", + help="Where the goods should be returned (computed field based on other infos.)"), + "warranty_return_other_address_id" : fields.many2one('res.partner', + 'Return address', + help="Where the customer has to send back the product(s) if warranty return is set" + "to 'other'."), } _defaults = { 'warranty_return_partner': lambda *a: 'company', 'return_instructions': _get_default_instructions, } - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/product_warranty/product_warranty_view.xml b/product_warranty/product_warranty_view.xml index 1ab3e23fa..bf59e48bb 100644 --- a/product_warranty/product_warranty_view.xml +++ b/product_warranty/product_warranty_view.xml @@ -84,12 +84,24 @@ product.supplierinfo - - - - - - + + + + + + + + + + +
+
+
+
+
diff --git a/product_warranty/res_company.py b/product_warranty/res_company.py new file mode 100644 index 000000000..e0d132fd7 --- /dev/null +++ b/product_warranty/res_company.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright 2013 Camptocamp +# Copyright 2009-2013 Akretion, +# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, Joel Grand-Guillaume +# +# 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 . +# +############################################################################## + +from openerp.osv import fields, orm, osv + + +class res_company(orm.Model): + + _inherit = "res.company" + + _columns = { + 'crm_return_address_id': fields.many2one('res.partner', + 'Return address', + help="Default address where the customers has to send back the " + "returned product. If empty, the address is the " + "company address"), + } + + diff --git a/product_warranty/res_company_view.xml b/product_warranty/res_company_view.xml new file mode 100644 index 000000000..492be6702 --- /dev/null +++ b/product_warranty/res_company_view.xml @@ -0,0 +1,23 @@ + + + + + + + crm_claim_rma.company_form + res.company + + + + + + + + + + + + + + + From 20ecc4140207df2afa648eb9820485ee38ab1d49 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Tue, 3 Dec 2013 11:21:07 +0100 Subject: [PATCH 12/62] [FIX] crm_claim.date is a datetime, error when a product has no supplier, in such case, returns the product to the company's address --- product_warranty/product_warranty.py | 85 ++++++++++++++++------------ product_warranty/res_company.py | 9 ++- 2 files changed, 53 insertions(+), 41 deletions(-) diff --git a/product_warranty/product_warranty.py b/product_warranty/product_warranty.py index 0c2f8b50e..2ad7aabb5 100644 --- a/product_warranty/product_warranty.py +++ b/product_warranty/product_warranty.py @@ -21,48 +21,54 @@ ######################################################################### from openerp.osv import orm, fields -from tools.translate import _ + class return_instruction(orm.Model): _name = "return.instruction" _description = "Instructions for product return" _columns = { - 'name': fields.char('Title', size=128, required=True), - 'instructions' : fields.text('Instructions', + 'name': fields.char('Title', required=True), + 'instructions': fields.text( + 'Instructions', help="Instructions for product return"), - 'is_default' : fields.boolean('Is default', + 'is_default': fields.boolean( + 'Is default', help="If is default, will be use to set the default value in " "supplier infos. Be careful to have only one default"), - } + } + class product_supplierinfo(orm.Model): _inherit = "product.supplierinfo" def get_warranty_return_partner(self, cr, uid, context=None): - result = [ - ('company','Company'), - ('supplier','Supplier'), - ('other','Other'),] + result = [('company', 'Company'), + ('supplier', 'Supplier'), + ('other', 'Other'), + ] return result - # Get selected lines to add to exchange def _get_default_instructions(self, cr, uid, context=None): - instruction_ids = self.pool.get('return.instruction').search(cr, uid, - [('is_default','=','FALSE')]) + """ Get selected lines to add to exchange """ + instr_obj = self.pool.get('return.instruction') + instruction_ids = instr_obj.search(cr, uid, + [('is_default', '=', 'FALSE')], + context=context) if instruction_ids: return instruction_ids[0] - # TODO f(supplier) + other. return False def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=None): - # Method to return the partner delivery address or if none, the default address - # dedicated_delivery_address stand for the case a new type of address more particularly - # dedicated to return delivery would be implemented. - result ={} - address_obj = self.pool.get('res.partner') + """ Method to return the partner delivery address or if none, the default address + + dedicated_delivery_address stand for the case a new type of + address more particularly dedicated to return delivery would be + implemented. + + """ + result = {} for supplier_info in self.browse(cr, uid, ids, context=context): - result[supplier_info.id] = {} - address_id = False + result[supplier_info.id] = False return_partner = supplier_info.warranty_return_partner partner_id = supplier_info.company_id.partner_id.id if return_partner: @@ -78,33 +84,40 @@ def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=N return result _columns = { - "warranty_duration": fields.float('Period', + "warranty_duration": fields.float( + 'Period', help="Warranty in month for this product/supplier relation. Only for " "company/supplier relation (purchase order) ; the customer/company " "relation (sale order) always use the product main warranty field"), - "warranty_return_partner": fields.selection(get_warranty_return_partner, + "warranty_return_partner": fields.selection( + get_warranty_return_partner, 'Return type', required=True, help="Who is in charge of the warranty return treatment toward the end customer. " - "Company will use the current compagny delivery or default address and so on for " - "supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be " - "applied is the one of the return partner (ie: can be returned to the company and " - "be under the brand warranty"), - 'return_instructions': fields.many2one('return.instruction', + "Company will use the current compagny delivery or default address and so on for " + "supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be " + "applied is the one of the return partner (ie: can be returned to the company and " + "be under the brand warranty"), + 'return_instructions': fields.many2one( + 'return.instruction', 'Instructions', help="Instructions for product return"), - 'active_supplier': fields.boolean('Active supplier', + 'active_supplier': fields.boolean( + 'Active supplier', help="Is this supplier still active, only for information"), - 'warranty_return_address': fields.function(_get_warranty_return_address, + 'warranty_return_address': fields.function( + _get_warranty_return_address, type='many2one', relation='res.partner', string="Return address", - help="Where the goods should be returned (computed field based on other infos.)"), - "warranty_return_other_address_id" : fields.many2one('res.partner', + help="Where the goods should be returned " + "(computed field based on other infos.)"), + "warranty_return_other_address_id": fields.many2one( + 'res.partner', 'Return address', - help="Where the customer has to send back the product(s) if warranty return is set" - "to 'other'."), - } + help="Where the customer has to send back the product(s) " + "if warranty return is set to 'other'."), + } + _defaults = { - 'warranty_return_partner': lambda *a: 'company', + 'warranty_return_partner': 'company', 'return_instructions': _get_default_instructions, } - diff --git a/product_warranty/res_company.py b/product_warranty/res_company.py index e0d132fd7..30618813e 100644 --- a/product_warranty/res_company.py +++ b/product_warranty/res_company.py @@ -20,19 +20,18 @@ # ############################################################################## -from openerp.osv import fields, orm, osv +from openerp.osv import fields, orm class res_company(orm.Model): - + _inherit = "res.company" _columns = { - 'crm_return_address_id': fields.many2one('res.partner', + 'crm_return_address_id': fields.many2one( + 'res.partner', 'Return address', help="Default address where the customers has to send back the " "returned product. If empty, the address is the " "company address"), } - - From 7aaf3511101abd2130e719f45d2b5d83b887f283 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerprma Date: Thu, 23 Jan 2014 05:58:36 +0000 Subject: [PATCH 13/62] Launchpad automatic translations update. --- product_warranty/i18n/es.po | 174 ++++++++++++++++++++++++------------ product_warranty/i18n/fr.po | 157 ++++++++++++++++++++++++-------- 2 files changed, 238 insertions(+), 93 deletions(-) diff --git a/product_warranty/i18n/es.po b/product_warranty/i18n/es.po index 09567c732..e2d613ac0 100644 --- a/product_warranty/i18n/es.po +++ b/product_warranty/i18n/es.po @@ -6,94 +6,156 @@ msgid "" msgstr "" "Project-Id-Version: product_warranty.es\n" "Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-10-20 10:07+0000\n" -"PO-Revision-Date: 2013-01-15 16:31+0100\n" -"Last-Translator: Rafa Soler \n" +"POT-Creation-Date: 2013-11-21 15:06+0000\n" +"PO-Revision-Date: 2014-01-22 19:43+0000\n" +"Last-Translator: Pedro Manuel Baeza \n" "Language-Team: Domatix Technologies\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-SourceCharset: utf-8\n" +"X-Launchpad-Export-Date: 2014-05-24 06:50+0000\n" +"X-Generator: Launchpad (build 17017)\n" "Language: es_ES\n" -"X-Generator: Poedit 1.5.4\n" +"X-Poedit-SourceCharset: utf-8\n" #. module: product_warranty -#: field:product.supplierinfo,warranty_duration:0 -msgid "Warranty" -msgstr "Garantía" +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id +#: field:product.supplierinfo,warranty_return_address:0 +#: field:product.supplierinfo,warranty_return_other_address_id:0 +msgid "Return address" +msgstr "Dirección de devolución" + +#. module: product_warranty +#: view:product.supplierinfo:0 +msgid "Warranty informations" +msgstr "Información de garantía" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +msgid "" +"Who is in charge of the warranty return treatment toward the end customer. " +"Company will use the current compagny delivery or default address and so on " +"for supplier and brand manufacturer. Doesn't necessarly mean that the " +"warranty to be applied is the one of the return partner (ie: can be returned " +"to the company and be under the brand warranty" +msgstr "" +"Especifica quién es el responsable del tratamiento de la devolución de " +"garantía para el cliente final. La compañía utilizará la dirección por " +"defecto o la dirección de envío de la compañía, y así sucesivamente por " +"proveedor y marca del fabricante. No significa necesariamente que la " +"garantía que se aplica es el de la empresa que hace la devolución (es decir: " +"se puede devolver a la empresa y estar bajo la garantía de la marca)" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_other_address_id:0 +msgid "" +"Where the customer has to send back the product(s) if warranty return is " +"setto 'other'." +msgstr "" +"Dónde debe enviar el cliente de vuelta el/los producto/s si la garantía de " +"devolución se establece a 'otra'." #. module: product_warranty #: help:product.supplierinfo,warranty_duration:0 msgid "" -"Warranty in month for this product/supplier relation. Only for company/" -"supplier relation (purchase order) ; the customer/company relation (sale " -"order) always use the product main warranty field" +"Warranty in month for this product/supplier relation. Only for " +"company/supplier relation (purchase order) ; the customer/company relation " +"(sale order) always use the product main warranty field" msgstr "" "Garantía en meses para este producto/proveedor. Únicamente para relaciones " "empresa/proveedor (Orden de compra); la relación cliente/proveedor (Orden de " "venta) usa siempre el campo garantía de la ficha de producto." #. module: product_warranty -#: model:ir.module.module,description:product_warranty.module_meta_information -msgid "" -"\n" -"Akretion - Emmanuel Samyn\n" -"Extend the product warranty management with warranty details on product / " -"supplier relation\n" -"* supplier warranty duration\n" -"* return product to company, supplier, brand, other\n" -" " -msgstr "" -"\n" -"Akretion - Emmanuel Samyn\n" -"Extiende la gestión de la garantía de los productos incorporando los plazos " -"de garantía a los productos (por proveedor)\n" -"* plazo de garntía dle proveedor\n" -"* devolución del producto a la empresa /proveedor/matriz/otro\n" -" " +#: view:res.company:0 +msgid "Crm product return address" +msgstr "Dirección de devolución del producto" #. module: product_warranty -#: model:ir.model,name:product_warranty.model_product_supplierinfo -msgid "Information about a product supplier" -msgstr "Información sobre un proveedor de producto" +#: model:ir.model,name:product_warranty.model_return_instruction +#: help:product.supplierinfo,return_instructions:0 +#: help:return.instruction,instructions:0 +msgid "Instructions for product return" +msgstr "Instrucciones para la devolución del producto" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration +#: field:product.supplierinfo,warranty_duration:0 +msgid "Period" +msgstr "Periodo" #. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name +#: field:return.instruction,name:0 +msgid "Title" +msgstr "Título" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier #: field:product.supplierinfo,active_supplier:0 msgid "Active supplier" msgstr "Proveedor activo" #. module: product_warranty -#: constraint:product.supplierinfo:0 +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default +#: field:return.instruction,is_default:0 +msgid "Is default" +msgstr "Por defecto" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_address:0 +msgid "" +"Where the goods should be returned (computed field based on other infos.)" +msgstr "" +"Dónde se devolverán los bienes (campo calculado basado en otra información)." + +#. module: product_warranty +#: help:return.instruction,is_default:0 msgid "" -"Error: The default UOM and the Supplier Product UOM must be in the same " -"category." +"If is default, will be use to set the default value in supplier infos. Be " +"careful to have only one default" msgstr "" -"Error: El UOM y el UOM del proveedor del producto debe estar en la misma " -"categoría." +"Si es por defecto, se usará para establecer el valor por defecto en la " +"información del proveedor. Tenga cuidado de tener sólo un por defecto." #. module: product_warranty -#: model:ir.module.module,shortdesc:product_warranty.module_meta_information -msgid "Product warranty" -msgstr "Garantía de producto" +#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action +#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action +msgid "Products return instructions" +msgstr "Instrucciones de devolución de los productos" #. module: product_warranty +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" +msgstr "Información sobre un proveedor de producto" + +#. module: product_warranty +#: help:product.supplierinfo,active_supplier:0 +msgid "Is this supplier still active, only for information" +msgstr "Indica si el proveedor todavía está activo. Sólo para información." + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner #: field:product.supplierinfo,warranty_return_partner:0 -msgid "Warrantee return" -msgstr "Devolución en garantía" +msgid "Return type" +msgstr "Tipo de devolución" #. module: product_warranty -#: help:product.supplierinfo,warranty_return_partner:0 -#, fuzzy -msgid "" -"Who is in charge of the warranty return treatment toward the end customer. " -"Company will use the current compagny delivery or default address and so on " -"for supplier and brand manufacturer. Doesn't necessarly mean that the " -"warranty to be applied is the one of the return partner (ie: can be returned " -"to the company and be under the brand warranty" -msgstr "" -"Indique quien se encarga de la gestión de postventa frente al cliente final. " -"La empresa utilizará la dirección de envío de la empresa o la dirección " -"predeterminadaL'entreprise utilise l'adresse de livraison, et sinon " -"l'adresse par défaut. Il en va de même pour les options fournisseur ou " -"fabricant. Ce champ n'implique pas forcément que la garantie qui va " -"s'appliquer est celle de celui qui gère le retour." +#: view:return.instruction:0 +msgid "Return instructions" +msgstr "Instrucciones de devolución" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions +#: field:product.supplierinfo,return_instructions:0 +#: view:return.instruction:0 +#: field:return.instruction,instructions:0 +msgid "Instructions" +msgstr "Instrucciones" diff --git a/product_warranty/i18n/fr.po b/product_warranty/i18n/fr.po index 0fa3b0718..7de5da022 100644 --- a/product_warranty/i18n/fr.po +++ b/product_warranty/i18n/fr.po @@ -6,67 +6,150 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 6.0.2\n" "Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-10-20 10:07+0000\n" -"PO-Revision-Date: 2011-10-20 10:07+0000\n" -"Last-Translator: <>\n" +"POT-Creation-Date: 2013-11-21 15:06+0000\n" +"PO-Revision-Date: 2014-01-22 19:17+0000\n" +"Last-Translator: Joël Grand-Guillaume @ camptocamp " +"\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-05-24 06:50+0000\n" +"X-Generator: Launchpad (build 17017)\n" #. module: product_warranty -#: field:product.supplierinfo,warranty_duration:0 -msgid "Warranty" -msgstr "Garantie" +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id +#: field:product.supplierinfo,warranty_return_address:0 +#: field:product.supplierinfo,warranty_return_other_address_id:0 +msgid "Return address" +msgstr "" + +#. module: product_warranty +#: view:product.supplierinfo:0 +msgid "Warranty informations" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +msgid "" +"Who is in charge of the warranty return treatment toward the end customer. " +"Company will use the current compagny delivery or default address and so on " +"for supplier and brand manufacturer. Doesn't necessarly mean that the " +"warranty to be applied is the one of the return partner (ie: can be returned " +"to the company and be under the brand warranty" +msgstr "" +"Indique qui est en charge du traitement du retour garantie envers le client " +"final. L'entreprise utilise l'adresse de livraison, et sinon l'adresse par " +"défaut. Il en va de même pour les options fournisseur ou fabricant. Ce champ " +"n'implique pas forcément que la garantie qui va s'appliquer est celle de " +"celui qui gère le retour." + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_other_address_id:0 +msgid "" +"Where the customer has to send back the product(s) if warranty return is " +"setto 'other'." +msgstr "" #. module: product_warranty #: help:product.supplierinfo,warranty_duration:0 -msgid "Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field" -msgstr "Garantie en nombre de mois pour ce fournisseur. Uniquement pour la relation entreprise/fournisseur (commandes d'achat) ; La relation entreprise/client (commandes de vente) utilise toujours le champ de garantie de la fiche produit" +msgid "" +"Warranty in month for this product/supplier relation. Only for " +"company/supplier relation (purchase order) ; the customer/company relation " +"(sale order) always use the product main warranty field" +msgstr "" +"Garantie en nombre de mois pour ce fournisseur. Uniquement pour la relation " +"entreprise/fournisseur (commandes d'achat) ; La relation entreprise/client " +"(commandes de vente) utilise toujours le champ de garantie de la fiche " +"produit" #. module: product_warranty -#: model:ir.module.module,description:product_warranty.module_meta_information -msgid "\n" -"Akretion - Emmanuel Samyn\n" -"Extend the product warranty management with warranty details on product / supplier relation\n" -"* supplier warranty duration\n" -"* return product to company, supplier, brand, other\n" -" " -msgstr "\n" -"Akretion - Emmanuel Samyn\n" -"Extend the product warranty management with warranty details on product / supplier relation\n" -"* supplier warranty duration\n" -"* return product to company, supplier, brand, other\n" -" " +#: view:res.company:0 +msgid "Crm product return address" +msgstr "" #. module: product_warranty -#: model:ir.model,name:product_warranty.model_product_supplierinfo -msgid "Information about a product supplier" -msgstr "Information sur le fournisseur du produit" +#: model:ir.model,name:product_warranty.model_return_instruction +#: help:product.supplierinfo,return_instructions:0 +#: help:return.instruction,instructions:0 +msgid "Instructions for product return" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration +#: field:product.supplierinfo,warranty_duration:0 +msgid "Period" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name +#: field:return.instruction,name:0 +msgid "Title" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_res_company +msgid "Companies" +msgstr "" #. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier #: field:product.supplierinfo,active_supplier:0 msgid "Active supplier" msgstr "Fournisseur actif" #. module: product_warranty -#: constraint:product.supplierinfo:0 -msgid "Error: The default UOM and the Supplier Product UOM must be in the same category." -msgstr "Erreur : l'UdM par défaut et l'UdM du fournisseur doivent appartenir à la même catégorie." +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default +#: field:return.instruction,is_default:0 +msgid "Is default" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_address:0 +msgid "" +"Where the goods should be returned (computed field based on other infos.)" +msgstr "" #. module: product_warranty -#: model:ir.module.module,shortdesc:product_warranty.module_meta_information -msgid "Product warranty" -msgstr "Garantie du produit" +#: help:return.instruction,is_default:0 +msgid "" +"If is default, will be use to set the default value in supplier infos. Be " +"careful to have only one default" +msgstr "" + +#. module: product_warranty +#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action +#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action +msgid "Products return instructions" +msgstr "" #. module: product_warranty +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" +msgstr "Information sur le fournisseur du produit" + +#. module: product_warranty +#: help:product.supplierinfo,active_supplier:0 +msgid "Is this supplier still active, only for information" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner #: field:product.supplierinfo,warranty_return_partner:0 -msgid "Warrantee return" -msgstr "Retour garantie" +msgid "Return type" +msgstr "" #. module: product_warranty -#: help:product.supplierinfo,warranty_return_partner:0 -msgid "Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty" -msgstr "Indique qui est en charge du traitement du retour garantie envers le client final. L'entreprise utilise l'adresse de livraison, et sinon l'adresse par défaut. Il en va de même pour les options fournisseur ou fabricant. Ce champ n'implique pas forcément que la garantie qui va s'appliquer est celle de celui qui gère le retour." +#: view:return.instruction:0 +msgid "Return instructions" +msgstr "" +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions +#: field:product.supplierinfo,return_instructions:0 +#: view:return.instruction:0 +#: field:return.instruction,instructions:0 +msgid "Instructions" +msgstr "" From 56d7bb08e1c135ce0bdeddbbfde35eab26f180d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Grand-Guillaume?= Date: Wed, 16 Jul 2014 14:46:22 +0200 Subject: [PATCH 14/62] Clean a bit of PEP8 things --- product_warranty/__openerp__.py | 2 +- product_warranty/res_company.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py index 6ffdaca7a..f63f0296d 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__openerp__.py @@ -51,7 +51,7 @@ 'test': [], 'installable': True, 'active': False, - 'certificate' : '', + 'certificate': '', 'images': ['images/product_warranty.png'], } diff --git a/product_warranty/res_company.py b/product_warranty/res_company.py index 30618813e..a36251700 100644 --- a/product_warranty/res_company.py +++ b/product_warranty/res_company.py @@ -2,7 +2,7 @@ ############################################################################## # # Copyright 2013 Camptocamp -# Copyright 2009-2013 Akretion, +# Copyright 2009-2013 Akretion, # Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, Joel Grand-Guillaume # # This program is free software: you can redistribute it and/or modify From e7f2cd2c8431e4007e4090911838022c00393319 Mon Sep 17 00:00:00 2001 From: StefanRijnhart Date: Mon, 2 Feb 2015 12:03:38 +0100 Subject: [PATCH 15/62] [PRT] Move modules to __unported__ for 8.0 branch creation --- product_warranty/__init__.py | 23 --- product_warranty/__openerp__.py | 58 ------- product_warranty/i18n/es.po | 161 ------------------ product_warranty/i18n/fr.po | 155 ----------------- product_warranty/i18n/product_warranty.pot | 132 -------------- product_warranty/images/product_warranty.png | Bin 85387 -> 0 bytes product_warranty/product_warranty.py | 123 ------------- product_warranty/product_warranty_view.xml | 110 ------------ product_warranty/res_company.py | 37 ---- product_warranty/res_company_view.xml | 23 --- product_warranty/security/ir.model.access.csv | 4 - 11 files changed, 826 deletions(-) delete mode 100644 product_warranty/__init__.py delete mode 100644 product_warranty/__openerp__.py delete mode 100644 product_warranty/i18n/es.po delete mode 100644 product_warranty/i18n/fr.po delete mode 100644 product_warranty/i18n/product_warranty.pot delete mode 100644 product_warranty/images/product_warranty.png delete mode 100644 product_warranty/product_warranty.py delete mode 100644 product_warranty/product_warranty_view.xml delete mode 100644 product_warranty/res_company.py delete mode 100644 product_warranty/res_company_view.xml delete mode 100644 product_warranty/security/ir.model.access.csv diff --git a/product_warranty/__init__.py b/product_warranty/__init__.py deleted file mode 100644 index 7c715039b..000000000 --- a/product_warranty/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -######################################################################### -# # -# # -######################################################################### -# # -# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # -# # -#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 . import product_warranty -from . import res_company \ No newline at end of file diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py deleted file mode 100644 index f63f0296d..000000000 --- a/product_warranty/__openerp__.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- -######################################################################### -# # -# # -######################################################################### -# # -# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # -# # -#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 . # -######################################################################### - - -{ - 'name': 'Product warranty', - 'version': '1.0', - 'category': 'Generic Modules/Product', - 'description': """ -Product Warranty -================ - -Extend the product warranty management with warranty details on product / supplier relation: - -* supplier warranty duration -* Set default return address for company (if different from standard one) -* return product to company, supplier, other - - -Those informations are used in the RMA Claim (Product Return Management) module. - -""", - 'author': 'Akretion', - 'website': 'http://akretion.com', - 'depends': ['product'], - 'data': [ - 'security/ir.model.access.csv', - 'res_company_view.xml', - 'product_warranty_view.xml', - ], - 'demo_xml': [], - 'test': [], - 'installable': True, - 'active': False, - 'certificate': '', - 'images': ['images/product_warranty.png'], -} - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/product_warranty/i18n/es.po b/product_warranty/i18n/es.po deleted file mode 100644 index e2d613ac0..000000000 --- a/product_warranty/i18n/es.po +++ /dev/null @@ -1,161 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * product_warranty -# -msgid "" -msgstr "" -"Project-Id-Version: product_warranty.es\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2013-11-21 15:06+0000\n" -"PO-Revision-Date: 2014-01-22 19:43+0000\n" -"Last-Translator: Pedro Manuel Baeza \n" -"Language-Team: Domatix Technologies\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2014-05-24 06:50+0000\n" -"X-Generator: Launchpad (build 17017)\n" -"Language: es_ES\n" -"X-Poedit-SourceCharset: utf-8\n" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id -#: field:product.supplierinfo,warranty_return_address:0 -#: field:product.supplierinfo,warranty_return_other_address_id:0 -msgid "Return address" -msgstr "Dirección de devolución" - -#. module: product_warranty -#: view:product.supplierinfo:0 -msgid "Warranty informations" -msgstr "Información de garantía" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_partner:0 -msgid "" -"Who is in charge of the warranty return treatment toward the end customer. " -"Company will use the current compagny delivery or default address and so on " -"for supplier and brand manufacturer. Doesn't necessarly mean that the " -"warranty to be applied is the one of the return partner (ie: can be returned " -"to the company and be under the brand warranty" -msgstr "" -"Especifica quién es el responsable del tratamiento de la devolución de " -"garantía para el cliente final. La compañía utilizará la dirección por " -"defecto o la dirección de envío de la compañía, y así sucesivamente por " -"proveedor y marca del fabricante. No significa necesariamente que la " -"garantía que se aplica es el de la empresa que hace la devolución (es decir: " -"se puede devolver a la empresa y estar bajo la garantía de la marca)" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_other_address_id:0 -msgid "" -"Where the customer has to send back the product(s) if warranty return is " -"setto 'other'." -msgstr "" -"Dónde debe enviar el cliente de vuelta el/los producto/s si la garantía de " -"devolución se establece a 'otra'." - -#. module: product_warranty -#: help:product.supplierinfo,warranty_duration:0 -msgid "" -"Warranty in month for this product/supplier relation. Only for " -"company/supplier relation (purchase order) ; the customer/company relation " -"(sale order) always use the product main warranty field" -msgstr "" -"Garantía en meses para este producto/proveedor. Únicamente para relaciones " -"empresa/proveedor (Orden de compra); la relación cliente/proveedor (Orden de " -"venta) usa siempre el campo garantía de la ficha de producto." - -#. module: product_warranty -#: view:res.company:0 -msgid "Crm product return address" -msgstr "Dirección de devolución del producto" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_return_instruction -#: help:product.supplierinfo,return_instructions:0 -#: help:return.instruction,instructions:0 -msgid "Instructions for product return" -msgstr "Instrucciones para la devolución del producto" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration -#: field:product.supplierinfo,warranty_duration:0 -msgid "Period" -msgstr "Periodo" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name -#: field:return.instruction,name:0 -msgid "Title" -msgstr "Título" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_res_company -msgid "Companies" -msgstr "Compañías" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier -#: field:product.supplierinfo,active_supplier:0 -msgid "Active supplier" -msgstr "Proveedor activo" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default -#: field:return.instruction,is_default:0 -msgid "Is default" -msgstr "Por defecto" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_address:0 -msgid "" -"Where the goods should be returned (computed field based on other infos.)" -msgstr "" -"Dónde se devolverán los bienes (campo calculado basado en otra información)." - -#. module: product_warranty -#: help:return.instruction,is_default:0 -msgid "" -"If is default, will be use to set the default value in supplier infos. Be " -"careful to have only one default" -msgstr "" -"Si es por defecto, se usará para establecer el valor por defecto en la " -"información del proveedor. Tenga cuidado de tener sólo un por defecto." - -#. module: product_warranty -#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action -#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action -msgid "Products return instructions" -msgstr "Instrucciones de devolución de los productos" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_product_supplierinfo -msgid "Information about a product supplier" -msgstr "Información sobre un proveedor de producto" - -#. module: product_warranty -#: help:product.supplierinfo,active_supplier:0 -msgid "Is this supplier still active, only for information" -msgstr "Indica si el proveedor todavía está activo. Sólo para información." - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner -#: field:product.supplierinfo,warranty_return_partner:0 -msgid "Return type" -msgstr "Tipo de devolución" - -#. module: product_warranty -#: view:return.instruction:0 -msgid "Return instructions" -msgstr "Instrucciones de devolución" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions -#: field:product.supplierinfo,return_instructions:0 -#: view:return.instruction:0 -#: field:return.instruction,instructions:0 -msgid "Instructions" -msgstr "Instrucciones" diff --git a/product_warranty/i18n/fr.po b/product_warranty/i18n/fr.po deleted file mode 100644 index 7de5da022..000000000 --- a/product_warranty/i18n/fr.po +++ /dev/null @@ -1,155 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * product_warranty -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0.2\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2013-11-21 15:06+0000\n" -"PO-Revision-Date: 2014-01-22 19:17+0000\n" -"Last-Translator: Joël Grand-Guillaume @ camptocamp " -"\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2014-05-24 06:50+0000\n" -"X-Generator: Launchpad (build 17017)\n" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id -#: field:product.supplierinfo,warranty_return_address:0 -#: field:product.supplierinfo,warranty_return_other_address_id:0 -msgid "Return address" -msgstr "" - -#. module: product_warranty -#: view:product.supplierinfo:0 -msgid "Warranty informations" -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_partner:0 -msgid "" -"Who is in charge of the warranty return treatment toward the end customer. " -"Company will use the current compagny delivery or default address and so on " -"for supplier and brand manufacturer. Doesn't necessarly mean that the " -"warranty to be applied is the one of the return partner (ie: can be returned " -"to the company and be under the brand warranty" -msgstr "" -"Indique qui est en charge du traitement du retour garantie envers le client " -"final. L'entreprise utilise l'adresse de livraison, et sinon l'adresse par " -"défaut. Il en va de même pour les options fournisseur ou fabricant. Ce champ " -"n'implique pas forcément que la garantie qui va s'appliquer est celle de " -"celui qui gère le retour." - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_other_address_id:0 -msgid "" -"Where the customer has to send back the product(s) if warranty return is " -"setto 'other'." -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_duration:0 -msgid "" -"Warranty in month for this product/supplier relation. Only for " -"company/supplier relation (purchase order) ; the customer/company relation " -"(sale order) always use the product main warranty field" -msgstr "" -"Garantie en nombre de mois pour ce fournisseur. Uniquement pour la relation " -"entreprise/fournisseur (commandes d'achat) ; La relation entreprise/client " -"(commandes de vente) utilise toujours le champ de garantie de la fiche " -"produit" - -#. module: product_warranty -#: view:res.company:0 -msgid "Crm product return address" -msgstr "" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_return_instruction -#: help:product.supplierinfo,return_instructions:0 -#: help:return.instruction,instructions:0 -msgid "Instructions for product return" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration -#: field:product.supplierinfo,warranty_duration:0 -msgid "Period" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name -#: field:return.instruction,name:0 -msgid "Title" -msgstr "" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_res_company -msgid "Companies" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier -#: field:product.supplierinfo,active_supplier:0 -msgid "Active supplier" -msgstr "Fournisseur actif" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default -#: field:return.instruction,is_default:0 -msgid "Is default" -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_address:0 -msgid "" -"Where the goods should be returned (computed field based on other infos.)" -msgstr "" - -#. module: product_warranty -#: help:return.instruction,is_default:0 -msgid "" -"If is default, will be use to set the default value in supplier infos. Be " -"careful to have only one default" -msgstr "" - -#. module: product_warranty -#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action -#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action -msgid "Products return instructions" -msgstr "" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_product_supplierinfo -msgid "Information about a product supplier" -msgstr "Information sur le fournisseur du produit" - -#. module: product_warranty -#: help:product.supplierinfo,active_supplier:0 -msgid "Is this supplier still active, only for information" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner -#: field:product.supplierinfo,warranty_return_partner:0 -msgid "Return type" -msgstr "" - -#. module: product_warranty -#: view:return.instruction:0 -msgid "Return instructions" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions -#: field:product.supplierinfo,return_instructions:0 -#: view:return.instruction:0 -#: field:return.instruction,instructions:0 -msgid "Instructions" -msgstr "" diff --git a/product_warranty/i18n/product_warranty.pot b/product_warranty/i18n/product_warranty.pot deleted file mode 100644 index 7c7fd45b7..000000000 --- a/product_warranty/i18n/product_warranty.pot +++ /dev/null @@ -1,132 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * product_warranty -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 7.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-21 15:06+0000\n" -"PO-Revision-Date: 2013-11-21 15: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: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id -#: field:product.supplierinfo,warranty_return_address:0 -#: field:product.supplierinfo,warranty_return_other_address_id:0 -msgid "Return address" -msgstr "" - -#. module: product_warranty -#: view:product.supplierinfo:0 -msgid "Warranty informations" -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_partner:0 -msgid "Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty" -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_other_address_id:0 -msgid "Where the customer has to send back the product(s) if warranty return is setto 'other'." -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_duration:0 -msgid "Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field" -msgstr "" - -#. module: product_warranty -#: view:res.company:0 -msgid "Crm product return address" -msgstr "" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_return_instruction -#: help:product.supplierinfo,return_instructions:0 -#: help:return.instruction,instructions:0 -msgid "Instructions for product return" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration -#: field:product.supplierinfo,warranty_duration:0 -msgid "Period" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name -#: field:return.instruction,name:0 -msgid "Title" -msgstr "" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_res_company -msgid "Companies" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier -#: field:product.supplierinfo,active_supplier:0 -msgid "Active supplier" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default -#: field:return.instruction,is_default:0 -msgid "Is default" -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_address:0 -msgid "Where the goods should be returned (computed field based on other infos.)" -msgstr "" - -#. module: product_warranty -#: help:return.instruction,is_default:0 -msgid "If is default, will be use to set the default value in supplier infos. Be careful to have only one default" -msgstr "" - -#. module: product_warranty -#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action -#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action -msgid "Products return instructions" -msgstr "" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_product_supplierinfo -msgid "Information about a product supplier" -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,active_supplier:0 -msgid "Is this supplier still active, only for information" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner -#: field:product.supplierinfo,warranty_return_partner:0 -msgid "Return type" -msgstr "" - -#. module: product_warranty -#: view:return.instruction:0 -msgid "Return instructions" -msgstr "" - -#. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions -#: field:product.supplierinfo,return_instructions:0 -#: view:return.instruction:0 -#: field:return.instruction,instructions:0 -msgid "Instructions" -msgstr "" - diff --git a/product_warranty/images/product_warranty.png b/product_warranty/images/product_warranty.png deleted file mode 100644 index c2eb36e6080badb69696ff6003d06c72a568c1c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85387 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. # -######################################################################### - -from openerp.osv import orm, fields - - -class return_instruction(orm.Model): - _name = "return.instruction" - _description = "Instructions for product return" - _columns = { - 'name': fields.char('Title', required=True), - 'instructions': fields.text( - 'Instructions', - help="Instructions for product return"), - 'is_default': fields.boolean( - 'Is default', - help="If is default, will be use to set the default value in " - "supplier infos. Be careful to have only one default"), - } - - -class product_supplierinfo(orm.Model): - _inherit = "product.supplierinfo" - - def get_warranty_return_partner(self, cr, uid, context=None): - result = [('company', 'Company'), - ('supplier', 'Supplier'), - ('other', 'Other'), - ] - return result - - def _get_default_instructions(self, cr, uid, context=None): - """ Get selected lines to add to exchange """ - instr_obj = self.pool.get('return.instruction') - instruction_ids = instr_obj.search(cr, uid, - [('is_default', '=', 'FALSE')], - context=context) - if instruction_ids: - return instruction_ids[0] - return False - - def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, context=None): - """ Method to return the partner delivery address or if none, the default address - - dedicated_delivery_address stand for the case a new type of - address more particularly dedicated to return delivery would be - implemented. - - """ - result = {} - for supplier_info in self.browse(cr, uid, ids, context=context): - result[supplier_info.id] = False - return_partner = supplier_info.warranty_return_partner - partner_id = supplier_info.company_id.partner_id.id - if return_partner: - if return_partner == 'supplier': - partner_id = supplier_info.name.id - elif return_partner == 'company': - if supplier_info.company_id.crm_return_address_id: - partner_id = supplier_info.company_id.crm_return_address_id.id - elif return_partner == 'other': - if supplier_info.warranty_return_other_address_id: - partner_id = supplier_info.warranty_return_other_address_id.id - result[supplier_info.id] = partner_id - return result - - _columns = { - "warranty_duration": fields.float( - 'Period', - help="Warranty in month for this product/supplier relation. Only for " - "company/supplier relation (purchase order) ; the customer/company " - "relation (sale order) always use the product main warranty field"), - "warranty_return_partner": fields.selection( - get_warranty_return_partner, - 'Return type', - required=True, - help="Who is in charge of the warranty return treatment toward the end customer. " - "Company will use the current compagny delivery or default address and so on for " - "supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be " - "applied is the one of the return partner (ie: can be returned to the company and " - "be under the brand warranty"), - 'return_instructions': fields.many2one( - 'return.instruction', - 'Instructions', - help="Instructions for product return"), - 'active_supplier': fields.boolean( - 'Active supplier', - help="Is this supplier still active, only for information"), - 'warranty_return_address': fields.function( - _get_warranty_return_address, - type='many2one', relation='res.partner', string="Return address", - help="Where the goods should be returned " - "(computed field based on other infos.)"), - "warranty_return_other_address_id": fields.many2one( - 'res.partner', - 'Return address', - help="Where the customer has to send back the product(s) " - "if warranty return is set to 'other'."), - } - - _defaults = { - 'warranty_return_partner': 'company', - 'return_instructions': _get_default_instructions, - } diff --git a/product_warranty/product_warranty_view.xml b/product_warranty/product_warranty_view.xml deleted file mode 100644 index bf59e48bb..000000000 --- a/product_warranty/product_warranty_view.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - product.return.instructions.tree - return.instruction - - - - - - - - - - - - product.return.instructions.form - return.instruction - - - - - - - - - - - - Products return instructions - return.instruction - form - tree,form - - - - - - - - product.supplierinfo.warranty.tree - product.supplierinfo - - - - - - - - - - - - - - - product.supplierinfo.warranty.form - product.supplierinfo - - - - - - - - - - - - -
-
-
-
-
-
-
-
- -
-
diff --git a/product_warranty/res_company.py b/product_warranty/res_company.py deleted file mode 100644 index a36251700..000000000 --- a/product_warranty/res_company.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright 2013 Camptocamp -# Copyright 2009-2013 Akretion, -# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, Joel Grand-Guillaume -# -# 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 . -# -############################################################################## - -from openerp.osv import fields, orm - - -class res_company(orm.Model): - - _inherit = "res.company" - - _columns = { - 'crm_return_address_id': fields.many2one( - 'res.partner', - 'Return address', - help="Default address where the customers has to send back the " - "returned product. If empty, the address is the " - "company address"), - } diff --git a/product_warranty/res_company_view.xml b/product_warranty/res_company_view.xml deleted file mode 100644 index 492be6702..000000000 --- a/product_warranty/res_company_view.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - crm_claim_rma.company_form - res.company - - - - - - - - - - - - - - - diff --git a/product_warranty/security/ir.model.access.csv b/product_warranty/security/ir.model.access.csv deleted file mode 100644 index b8cc8fffc..000000000 --- a/product_warranty/security/ir.model.access.csv +++ /dev/null @@ -1,4 +0,0 @@ -"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_return_instruction_user","return.instruction.user","model_return_instruction","base.group_user","True","False","False","False" -"access_return_instruction_manager","return.instruction.manager","model_return_instruction","base.group_sale_manager","True","True","True","True" -"access_return_instruction_salesman","return.instruction.salesman","model_return_instruction","base.group_sale_salesman","True","True","True","True" From a9993cabc13e2ef1c0c373c00a7b43f126a03997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Thu, 23 Apr 2015 16:31:49 +0100 Subject: [PATCH 16/62] [IMP] Port product_warranty --- product_warranty/README.rst | 48 ++++++ product_warranty/__init__.py | 21 +++ product_warranty/__openerp__.py | 38 +++++ product_warranty/i18n/es.po | 161 ++++++++++++++++++ product_warranty/i18n/fr.po | 155 +++++++++++++++++ product_warranty/i18n/product_warranty.pot | 131 ++++++++++++++ product_warranty/images/product_warranty.png | Bin 0 -> 85387 bytes product_warranty/product_warranty.py | 128 ++++++++++++++ product_warranty/product_warranty_view.xml | 113 ++++++++++++ product_warranty/res_company.py | 38 +++++ product_warranty/res_company_view.xml | 23 +++ product_warranty/security/ir.model.access.csv | 4 + 12 files changed, 860 insertions(+) create mode 100644 product_warranty/README.rst create mode 100644 product_warranty/__init__.py create mode 100644 product_warranty/__openerp__.py create mode 100644 product_warranty/i18n/es.po create mode 100644 product_warranty/i18n/fr.po create mode 100644 product_warranty/i18n/product_warranty.pot create mode 100644 product_warranty/images/product_warranty.png create mode 100644 product_warranty/product_warranty.py create mode 100644 product_warranty/product_warranty_view.xml create mode 100644 product_warranty/res_company.py create mode 100644 product_warranty/res_company_view.xml create mode 100644 product_warranty/security/ir.model.access.csv diff --git a/product_warranty/README.rst b/product_warranty/README.rst new file mode 100644 index 000000000..70f169feb --- /dev/null +++ b/product_warranty/README.rst @@ -0,0 +1,48 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License: AGPL-3 + +Product Warranty +================ + +Extends the product warranty management with warranty details on product / +supplier relation: + +* supplier warranty duration +* Set default return address for company (if different from standard one) +* Whether to return product to company, supplier, other + +Usage +===== + +The new information is not explicitly used by the system until you install +another module that makes use of it, e.g. RMA Claim (Product Return +Management). + +Credits +======= + +Contributors +------------ + +* Emmanuel Samyn +* Paulius Sladkevičius +* Benoît Guillot +* David Beal +* Maxime Chambreuil +* Joël Grand-Guillaume +* Ondřej Kuzník + +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. diff --git a/product_warranty/__init__.py b/product_warranty/__init__.py new file mode 100644 index 000000000..4e914a855 --- /dev/null +++ b/product_warranty/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn +# +# 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 . +# +############################################################################## +from . import product_warranty +from . import res_company diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py new file mode 100644 index 000000000..f0d15262f --- /dev/null +++ b/product_warranty/__openerp__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn +# +# 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 . +# +############################################################################## + +{ + 'name': 'Product warranty', + 'version': '1.0', + 'category': 'Generic Modules/Product', + 'author': "Akretion,Odoo Community Association (OCA)", + 'website': 'http://akretion.com', + 'license': 'AGPL-3', + 'depends': ['product'], + 'data': [ + 'security/ir.model.access.csv', + 'res_company_view.xml', + 'product_warranty_view.xml', + ], + 'demo_xml': [], + 'test': [], + 'installable': True, + 'images': ['images/product_warranty.png'], +} diff --git a/product_warranty/i18n/es.po b/product_warranty/i18n/es.po new file mode 100644 index 000000000..93d58607d --- /dev/null +++ b/product_warranty/i18n/es.po @@ -0,0 +1,161 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * product_warranty +# +msgid "" +msgstr "" +"Project-Id-Version: product_warranty.es\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2013-11-21 15:06+0000\n" +"PO-Revision-Date: 2014-01-22 19:43+0000\n" +"Last-Translator: Pedro Manuel Baeza \n" +"Language-Team: Domatix Technologies\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-05-24 06:50+0000\n" +"X-Generator: Launchpad (build 17017)\n" +"Language: es_ES\n" +"X-Poedit-SourceCharset: utf-8\n" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id +#: field:product.supplierinfo,warranty_return_address:0 +#: field:product.supplierinfo,warranty_return_other_address_id:0 +msgid "Return address" +msgstr "Dirección de devolución" + +#. module: product_warranty +#: view:product.supplierinfo:0 +msgid "Warranty informations" +msgstr "Información de garantía" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +msgid "" +"Who is in charge of the warranty return treatment toward the end customer. " +"Company will use the current company delivery or default address and so on " +"for supplier and brand manufacturer. Doesn't necessarily mean that the " +"warranty to be applied is the one of the return partner (i.e. can be returned " +"to the company and be under the brand warranty" +msgstr "" +"Especifica quién es el responsable del tratamiento de la devolución de " +"garantía para el cliente final. La compañía utilizará la dirección por " +"defecto o la dirección de envío de la compañía, y así sucesivamente por " +"proveedor y marca del fabricante. No significa necesariamente que la " +"garantía que se aplica es el de la empresa que hace la devolución (es decir: " +"se puede devolver a la empresa y estar bajo la garantía de la marca)" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_other_address_id:0 +msgid "" +"Where the customer has to send back the product(s) if warranty return is " +"set to 'other'." +msgstr "" +"Dónde debe enviar el cliente de vuelta el/los producto/s si la garantía de " +"devolución se establece a 'otra'." + +#. module: product_warranty +#: help:product.supplierinfo,warranty_duration:0 +msgid "" +"Warranty in month for this product/supplier relation. Only for " +"company/supplier relation (purchase order) ; the customer/company relation " +"(sale order) always use the product main warranty field" +msgstr "" +"Garantía en meses para este producto/proveedor. Únicamente para relaciones " +"empresa/proveedor (Orden de compra); la relación cliente/proveedor (Orden de " +"venta) usa siempre el campo garantía de la ficha de producto." + +#. module: product_warranty +#: view:res.company:0 +msgid "Crm product return address" +msgstr "Dirección de devolución del producto" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_return_instruction +#: help:product.supplierinfo,return_instructions:0 +#: help:return.instruction,instructions:0 +msgid "Instructions for product return" +msgstr "Instrucciones para la devolución del producto" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration +#: field:product.supplierinfo,warranty_duration:0 +msgid "Period" +msgstr "Periodo" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name +#: field:return.instruction,name:0 +msgid "Title" +msgstr "Título" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier +#: field:product.supplierinfo,active_supplier:0 +msgid "Active supplier" +msgstr "Proveedor activo" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default +#: field:return.instruction,is_default:0 +msgid "Is default" +msgstr "Por defecto" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_address:0 +msgid "" +"Where the goods should be returned (computed field based on other infos.)" +msgstr "" +"Dónde se devolverán los bienes (campo calculado basado en otra información)." + +#. module: product_warranty +#: help:return.instruction,is_default:0 +msgid "" +"If is default, will be use to set the default value in supplier infos. Be " +"careful to have only one default" +msgstr "" +"Si es por defecto, se usará para establecer el valor por defecto en la " +"información del proveedor. Tenga cuidado de tener sólo un por defecto." + +#. module: product_warranty +#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action +#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action +msgid "Products return instructions" +msgstr "Instrucciones de devolución de los productos" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" +msgstr "Información sobre un proveedor de producto" + +#. module: product_warranty +#: help:product.supplierinfo,active_supplier:0 +msgid "Is this supplier still active, only for information" +msgstr "Indica si el proveedor todavía está activo. Sólo para información." + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner +#: field:product.supplierinfo,warranty_return_partner:0 +msgid "Return type" +msgstr "Tipo de devolución" + +#. module: product_warranty +#: view:return.instruction:0 +msgid "Return instructions" +msgstr "Instrucciones de devolución" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions +#: field:product.supplierinfo,return_instructions:0 +#: view:return.instruction:0 +#: field:return.instruction,instructions:0 +msgid "Instructions" +msgstr "Instrucciones" diff --git a/product_warranty/i18n/fr.po b/product_warranty/i18n/fr.po new file mode 100644 index 000000000..60c3abc7a --- /dev/null +++ b/product_warranty/i18n/fr.po @@ -0,0 +1,155 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * product_warranty +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 6.0.2\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2013-11-21 15:06+0000\n" +"PO-Revision-Date: 2014-01-22 19:17+0000\n" +"Last-Translator: Joël Grand-Guillaume @ camptocamp " +"\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-05-24 06:50+0000\n" +"X-Generator: Launchpad (build 17017)\n" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id +#: field:product.supplierinfo,warranty_return_address:0 +#: field:product.supplierinfo,warranty_return_other_address_id:0 +msgid "Return address" +msgstr "" + +#. module: product_warranty +#: view:product.supplierinfo:0 +msgid "Warranty informations" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +msgid "" +"Who is in charge of the warranty return treatment toward the end customer. " +"Company will use the current company delivery or default address and so on " +"for supplier and brand manufacturer. Doesn't necessarily mean that the " +"warranty to be applied is the one of the return partner (i.e. can be returned " +"to the company and be under the brand warranty" +msgstr "" +"Indique qui est en charge du traitement du retour garantie envers le client " +"final. L'entreprise utilise l'adresse de livraison, et sinon l'adresse par " +"défaut. Il en va de même pour les options fournisseur ou fabricant. Ce champ " +"n'implique pas forcément que la garantie qui va s'appliquer est celle de " +"celui qui gère le retour." + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_other_address_id:0 +msgid "" +"Where the customer has to send back the product(s) if warranty return is " +"set to 'other'." +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_duration:0 +msgid "" +"Warranty in month for this product/supplier relation. Only for " +"company/supplier relation (purchase order) ; the customer/company relation " +"(sale order) always use the product main warranty field" +msgstr "" +"Garantie en nombre de mois pour ce fournisseur. Uniquement pour la relation " +"entreprise/fournisseur (commandes d'achat) ; La relation entreprise/client " +"(commandes de vente) utilise toujours le champ de garantie de la fiche " +"produit" + +#. module: product_warranty +#: view:res.company:0 +msgid "Crm product return address" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_return_instruction +#: help:product.supplierinfo,return_instructions:0 +#: help:return.instruction,instructions:0 +msgid "Instructions for product return" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration +#: field:product.supplierinfo,warranty_duration:0 +msgid "Period" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name +#: field:return.instruction,name:0 +msgid "Title" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_res_company +msgid "Companies" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier +#: field:product.supplierinfo,active_supplier:0 +msgid "Active supplier" +msgstr "Fournisseur actif" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default +#: field:return.instruction,is_default:0 +msgid "Is default" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_address:0 +msgid "" +"Where the goods should be returned (computed field based on other infos.)" +msgstr "" + +#. module: product_warranty +#: help:return.instruction,is_default:0 +msgid "" +"If is default, will be use to set the default value in supplier infos. Be " +"careful to have only one default" +msgstr "" + +#. module: product_warranty +#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action +#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action +msgid "Products return instructions" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" +msgstr "Information sur le fournisseur du produit" + +#. module: product_warranty +#: help:product.supplierinfo,active_supplier:0 +msgid "Is this supplier still active, only for information" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner +#: field:product.supplierinfo,warranty_return_partner:0 +msgid "Return type" +msgstr "" + +#. module: product_warranty +#: view:return.instruction:0 +msgid "Return instructions" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions +#: field:product.supplierinfo,return_instructions:0 +#: view:return.instruction:0 +#: field:return.instruction,instructions:0 +msgid "Instructions" +msgstr "" diff --git a/product_warranty/i18n/product_warranty.pot b/product_warranty/i18n/product_warranty.pot new file mode 100644 index 000000000..fe6295d53 --- /dev/null +++ b/product_warranty/i18n/product_warranty.pot @@ -0,0 +1,131 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * product_warranty +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-11-21 15:06+0000\n" +"PO-Revision-Date: 2013-11-21 15: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: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id +#: field:product.supplierinfo,warranty_return_address:0 +#: field:product.supplierinfo,warranty_return_other_address_id:0 +msgid "Return address" +msgstr "" + +#. module: product_warranty +#: view:product.supplierinfo:0 +msgid "Warranty informations" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +msgid "Who is in charge of the warranty return treatment toward the end customer. Company will use the current company delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarily mean that the warranty to be applied is the one of the return partner (i.e. can be returned to the company and be under the brand warranty" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_other_address_id:0 +msgid "Where the customer has to send back the product(s) if warranty return is set to 'other'." +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_duration:0 +msgid "Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field" +msgstr "" + +#. module: product_warranty +#: view:res.company:0 +msgid "Crm product return address" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_return_instruction +#: help:product.supplierinfo,return_instructions:0 +#: help:return.instruction,instructions:0 +msgid "Instructions for product return" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration +#: field:product.supplierinfo,warranty_duration:0 +msgid "Period" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name +#: field:return.instruction,name:0 +msgid "Title" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_res_company +msgid "Companies" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier +#: field:product.supplierinfo,active_supplier:0 +msgid "Active supplier" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default +#: field:return.instruction,is_default:0 +msgid "Is default" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_address:0 +msgid "Where the goods should be returned (computed field based on other infos.)" +msgstr "" + +#. module: product_warranty +#: help:return.instruction,is_default:0 +msgid "If is default, will be use to set the default value in supplier infos. Be careful to have only one default" +msgstr "" + +#. module: product_warranty +#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action +#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action +msgid "Products return instructions" +msgstr "" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,active_supplier:0 +msgid "Is this supplier still active, only for information" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner +#: field:product.supplierinfo,warranty_return_partner:0 +msgid "Return type" +msgstr "" + +#. module: product_warranty +#: view:return.instruction:0 +msgid "Return instructions" +msgstr "" + +#. module: product_warranty +#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions +#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions +#: field:product.supplierinfo,return_instructions:0 +#: view:return.instruction:0 +#: field:return.instruction,instructions:0 +msgid "Instructions" +msgstr "" diff --git a/product_warranty/images/product_warranty.png b/product_warranty/images/product_warranty.png new file mode 100644 index 0000000000000000000000000000000000000000..c2eb36e6080badb69696ff6003d06c72a568c1c4 GIT binary patch literal 85387 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. +# +############################################################################## + +from openerp.osv import orm, fields + + +class return_instruction(orm.Model): + _name = "return.instruction" + _description = "Instructions for product return" + _columns = { + 'name': fields.char('Title', required=True), + 'instructions': fields.text( + 'Instructions', + help="Instructions for product return"), + 'is_default': fields.boolean( + 'Is default', + help="If is default, will be use to set the default value in " + "supplier infos. Be careful to have only one default"), + } + + +class product_supplierinfo(orm.Model): + _inherit = "product.supplierinfo" + + def get_warranty_return_partner(self, cr, uid, context=None): + result = [('company', 'Company'), + ('supplier', 'Supplier'), + ('other', 'Other'), + ] + return result + + def _get_default_instructions(self, cr, uid, context=None): + """ Get selected lines to add to exchange """ + instr_obj = self.pool.get('return.instruction') + instruction_ids = instr_obj.search(cr, uid, + [('is_default', '=', True)], + context=context) + if instruction_ids: + return instruction_ids[0] + return False + + def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, + context=None): + """ Method to return the partner delivery address or if none, the + default address + + dedicated_delivery_address stand for the case a new type of + address more particularly dedicated to return delivery would be + implemented. + + """ + result = {} + for supplier_info in self.browse(cr, uid, ids, context=context): + result[supplier_info.id] = False + return_partner = supplier_info.warranty_return_partner + partner_id = supplier_info.company_id.partner_id.id + if return_partner: + if return_partner == 'supplier': + partner_id = supplier_info.name.id + elif return_partner == 'company': + if supplier_info.company_id.crm_return_address_id: + partner_id = supplier_info.company_id.\ + crm_return_address_id.id + elif return_partner == 'other': + if supplier_info.warranty_return_other_address_id: + partner_id = supplier_info.\ + warranty_return_other_address_id.id + result[supplier_info.id] = partner_id + return result + + _columns = { + "warranty_duration": fields.float( + 'Period', + help="Warranty in month for this product/supplier relation. " + "Only for company/supplier relation (purchase order) ; " + "the customer/company relation (sale order) always use " + "the product main warranty field"), + "warranty_return_partner": fields.selection( + get_warranty_return_partner, + 'Return type', + required=True, + help="Who is in charge of the warranty return treatment toward " + "the end customer. Company will use the current company " + "delivery or default address and so on for supplier and " + "brand manufacturer. Doesn't necessarily mean that " + "the warranty to be applied is the one of the return partner " + "(i.e. can be returned to the company and be under the brand " + "warranty"), + 'return_instructions': fields.many2one( + 'return.instruction', + 'Instructions', + help="Instructions for product return"), + 'active_supplier': fields.boolean( + 'Active supplier', + help="Is this supplier still active, only for information"), + 'warranty_return_address': fields.function( + _get_warranty_return_address, + type='many2one', relation='res.partner', string="Return address", + help="Where the goods should be returned " + "(computed field based on other infos.)"), + "warranty_return_other_address_id": fields.many2one( + 'res.partner', + 'Return address', + help="Where the customer has to send back the product(s) " + "if warranty return is set to 'other'."), + } + + _defaults = { + 'warranty_return_partner': 'company', + 'return_instructions': _get_default_instructions, + } diff --git a/product_warranty/product_warranty_view.xml b/product_warranty/product_warranty_view.xml new file mode 100644 index 000000000..5160ed2bf --- /dev/null +++ b/product_warranty/product_warranty_view.xml @@ -0,0 +1,113 @@ + + + + + + + + + product.return.instructions.tree + return.instruction + + + + + + + + + + + + product.return.instructions.form + return.instruction + +
+ + + + + + + + +
+ + + Products return instructions + return.instruction + form + tree,form + + + + + + + + product.supplierinfo.warranty.tree + product.supplierinfo + + + + + + + + + + + + + + + product.supplierinfo.warranty.form + product.supplierinfo + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ +
+
diff --git a/product_warranty/res_company.py b/product_warranty/res_company.py new file mode 100644 index 000000000..146979ee8 --- /dev/null +++ b/product_warranty/res_company.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright 2013 Camptocamp +# Copyright 2009-2013 Akretion, +# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, +# Joel Grand-Guillaume +# +# 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 . +# +############################################################################## + +from openerp.osv import fields, orm + + +class res_company(orm.Model): + + _inherit = "res.company" + + _columns = { + 'crm_return_address_id': fields.many2one( + 'res.partner', + 'Return address', + help="Default address where the customers has to send back the " + "returned product. If empty, the address is the " + "company address"), + } diff --git a/product_warranty/res_company_view.xml b/product_warranty/res_company_view.xml new file mode 100644 index 000000000..34bdf2ee8 --- /dev/null +++ b/product_warranty/res_company_view.xml @@ -0,0 +1,23 @@ + + + + + + + crm_claim_rma.company_form + res.company + + + + + + + + + + + + + + + diff --git a/product_warranty/security/ir.model.access.csv b/product_warranty/security/ir.model.access.csv new file mode 100644 index 000000000..b8cc8fffc --- /dev/null +++ b/product_warranty/security/ir.model.access.csv @@ -0,0 +1,4 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_return_instruction_user","return.instruction.user","model_return_instruction","base.group_user","True","False","False","False" +"access_return_instruction_manager","return.instruction.manager","model_return_instruction","base.group_sale_manager","True","True","True","True" +"access_return_instruction_salesman","return.instruction.salesman","model_return_instruction","base.group_sale_salesman","True","True","True","True" From f33748d0810f796d5a0bb387f48e144c22155884 Mon Sep 17 00:00:00 2001 From: "Yanina Aular (Vauxoo)" Date: Mon, 3 Aug 2015 16:52:51 -0430 Subject: [PATCH 17/62] [IMP] product_warranty module is migrated to API 8.0 and odoo 8.0 --- product_warranty/README.rst | 1 + product_warranty/__init__.py | 42 +++--- product_warranty/__openerp__.py | 50 ++++--- product_warranty/demo/product_warranty.xml | 64 +++++++++ product_warranty/demo/res_company.xml | 10 ++ product_warranty/i18n/es.po | 133 ++++++++++++++++++ product_warranty/i18n/es_MX.po | 16 +++ product_warranty/i18n/es_PA.po | 16 +++ product_warranty/i18n/es_VE.po | 16 +++ product_warranty/i18n/product_warranty.pot | 123 +++++++++------- product_warranty/models/__init__.py | 25 ++++ .../models/product_supplierinfo.py | 107 ++++++++++++++ product_warranty/{ => models}/res_company.py | 19 ++- product_warranty/models/return_instruction.py | 40 ++++++ product_warranty/product_warranty.py | 128 ----------------- product_warranty/tests/__init__.py | 22 +++ .../tests/test_product_warranty.py | 80 +++++++++++ .../{ => views}/product_warranty_view.xml | 15 +- .../{ => views}/res_company_view.xml | 14 +- 19 files changed, 670 insertions(+), 251 deletions(-) create mode 100644 product_warranty/demo/product_warranty.xml create mode 100644 product_warranty/demo/res_company.xml create mode 100644 product_warranty/i18n/es_MX.po create mode 100644 product_warranty/i18n/es_PA.po create mode 100644 product_warranty/i18n/es_VE.po create mode 100644 product_warranty/models/__init__.py create mode 100644 product_warranty/models/product_supplierinfo.py rename product_warranty/{ => models}/res_company.py (73%) create mode 100644 product_warranty/models/return_instruction.py delete mode 100644 product_warranty/product_warranty.py create mode 100644 product_warranty/tests/__init__.py create mode 100644 product_warranty/tests/test_product_warranty.py rename product_warranty/{ => views}/product_warranty_view.xml (86%) rename product_warranty/{ => views}/res_company_view.xml (57%) diff --git a/product_warranty/README.rst b/product_warranty/README.rst index 70f169feb..aba2e4b28 100644 --- a/product_warranty/README.rst +++ b/product_warranty/README.rst @@ -31,6 +31,7 @@ Contributors * Maxime Chambreuil * Joël Grand-Guillaume * Ondřej Kuzník +* Yanina Aular Maintainer ---------- diff --git a/product_warranty/__init__.py b/product_warranty/__init__.py index 4e914a855..7297bf897 100644 --- a/product_warranty/__init__.py +++ b/product_warranty/__init__.py @@ -1,21 +1,23 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn -# -# 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 . -# -############################################################################## -from . import product_warranty -from . import res_company +######################################################################### +# # +# # +######################################################################### +# # +# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # +# # +# 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 . import models diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py index f0d15262f..7eb6fbbbe 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__openerp__.py @@ -1,38 +1,44 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn -# -# 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 . -# -############################################################################## +######################################################################### +# # +# # +######################################################################### +# # +# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # +# # +# 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 . # +######################################################################### { 'name': 'Product warranty', 'version': '1.0', 'category': 'Generic Modules/Product', - 'author': "Akretion,Odoo Community Association (OCA)", + 'author': "Akretion,Odoo Community Association (OCA),Vauxoo", 'website': 'http://akretion.com', 'license': 'AGPL-3', 'depends': ['product'], 'data': [ 'security/ir.model.access.csv', - 'res_company_view.xml', - 'product_warranty_view.xml', + 'views/res_company_view.xml', + 'views/product_warranty_view.xml', + ], + 'demo': [ + 'demo/product_warranty.xml', + 'demo/res_company.xml', ], - 'demo_xml': [], 'test': [], 'installable': True, + 'active': False, 'images': ['images/product_warranty.png'], } diff --git a/product_warranty/demo/product_warranty.xml b/product_warranty/demo/product_warranty.xml new file mode 100644 index 000000000..6f7f3f8ef --- /dev/null +++ b/product_warranty/demo/product_warranty.xml @@ -0,0 +1,64 @@ + + + + + + Default Instruction + To return a product purchased through our platform vendor Marketplace access our online Returns Center and click Return products to begin the application process for the return. +Select the product you want to return and the reason for the return. You will need you to provide detailed information to enable the seller to handle your request. Once the seller has reviewed your application, it will respond by e-mail within 3 working days. + 1 + + + + Provisional Instruction + Under the provisions of these Conditions of Sale, you may return the products received once you have contacted our customer service department adidas Mexico and the request is authorized. If you choose to return your order, we will refund: the full purchase price, as long as we have previously returned the products you order in perfect condition: (i) new product unused, (ii) with packaging, original box and tags (iii) be in the period of 30 calendar days after receiving the product. If you do not return the products to fulfill the above conditions, we are entitled to charge the products or the costs of recovery. + + + + + + 5 + + + + + other + + 8 + + + 5 + 1 + + + + + supplier + 12 + + + 5 + 1 + + + + + + 5 + + + + + supplier + 10 + + + + + supplier + 6 + + + + diff --git a/product_warranty/demo/res_company.xml b/product_warranty/demo/res_company.xml new file mode 100644 index 000000000..63f047934 --- /dev/null +++ b/product_warranty/demo/res_company.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_warranty/i18n/es.po b/product_warranty/i18n/es.po index 93d58607d..b7902cd8b 100644 --- a/product_warranty/i18n/es.po +++ b/product_warranty/i18n/es.po @@ -159,3 +159,136 @@ msgstr "Instrucciones de devolución" #: field:return.instruction,instructions:0 msgid "Instructions" msgstr "Instrucciones" + +#. module: product_warranty +#: field:product.supplierinfo,active_supplier:0 +msgid "Active supplier" +msgstr "Proveedor activo" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: product_warranty +#: field:return.instruction,create_uid:0 +msgid "Created by" +msgstr "Creado por" + +#. module: product_warranty +#: field:return.instruction,create_date:0 +msgid "Created on" +msgstr "Creado en" + +#. module: product_warranty +#: view:res.company:product_warranty.company_form +msgid "Crm product return address" +msgstr "Dirección de devolución del producto" + +#. module: product_warranty +#: help:res.company,crm_return_address_id:0 +msgid "Default address where the customers has to send back the returned product. If empty, the address is the company address" +msgstr "Dirección por defecto donde los clientes deben enviar de regresa los productos devueltos. Si está vacío, la dirección es la dirección de la compañía" + +#. module: product_warranty +#: field:return.instruction,id:0 +msgid "ID" +msgstr "ID" + +#. module: product_warranty +#: help:return.instruction,is_default:0 +msgid "If is default, will be use to set the default value in supplier infos. Be careful to have only one default" +msgstr "Si es por defecto, se usará para establecer el valor por defecto en la información del proveedor. Tenga cuidado de tener sólo un por defecto." + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" +msgstr "Información sobre un proveedor de producto" + +#. module: product_warranty +#: field:product.supplierinfo,return_instructions:0 +#: view:return.instruction:product_warranty.product_return_instructions_form_view +#: field:return.instruction,instructions:0 +msgid "Instructions" +msgstr "Instrucciones" + +#. module: product_warranty +#: model:ir.model,name:product_warranty.model_return_instruction +#: help:product.supplierinfo,return_instructions:0 +#: help:return.instruction,instructions:0 +msgid "Instructions for product return" +msgstr "Instrucciones para la devolución del producto" + +#. module: product_warranty +#: field:return.instruction,is_default:0 +msgid "Is default" +msgstr "Por defecto" + +#. module: product_warranty +#: help:product.supplierinfo,active_supplier:0 +msgid "Is this supplier still active, only for information" +msgstr "Indica si el proveedor todavía está activo. Sólo para información." + +#. module: product_warranty +#: field:return.instruction,write_uid:0 +msgid "Last Updated by" +msgstr "Last Updated by" + +#. module: product_warranty +#: field:return.instruction,write_date:0 +msgid "Last Updated on" +msgstr "Last Updated on" + +#. module: product_warranty +#: field:product.supplierinfo,warranty_duration:0 +msgid "Period" +msgstr "Periodo" + +#. module: product_warranty +#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action +#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action +msgid "Products Return Instructions" +msgstr "Intrucciones para devolución de productos" + +#. module: product_warranty +#: field:product.supplierinfo,warranty_return_other_address:0 +#: field:res.company,crm_return_address_id:0 +msgid "Return address" +msgstr "Dirección de retorno" + +#. module: product_warranty +#: view:return.instruction:product_warranty.product_return_instructions_form_view +#: view:return.instruction:product_warranty.product_return_instructions_tree_view +msgid "Return instructions" +msgstr "Instrucciones de devolución" + +#. module: product_warranty +#: field:product.supplierinfo,warranty_return_partner:0 +msgid "Return type" +msgstr "Tipo de devolución" + +#. module: product_warranty +#: field:return.instruction,name:0 +msgid "Title" +msgstr "Título" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_duration:0 +msgid "Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field" +msgstr "Garantía en meses para la relación producto/proveedor. Sólo para la relación producto/compañía (orden de compra); la relación cliente/compañía (orden de venta) siempre usa el producto principal para el campo garantía" + +#. module: product_warranty +#: view:product.supplierinfo:product_warranty.product_supplierinfo_warranty_form_view +msgid "Warranty informations" +msgstr "Información de garantía" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_other_address:0 +msgid "Where the customer has to send back the product(s) if warranty return is set to 'other'." +msgstr "Donde el cliente debe enviar el producto si la garantía es 'otros'" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +msgid "Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty" +msgstr "Quién se encarga del tratamiento de retorno de garantía hacia el cliente final. Compañía utilizará la entrega compagny actual o la dirección por defecto y así sucesivamente para el proveedor y el fabricante de la marca. No significa necessarly que la garantía que se aplica es el de la pareja de retorno (es decir: pueden ser devueltos a la empresa y estar bajo la garantía de la marca" + diff --git a/product_warranty/i18n/es_MX.po b/product_warranty/i18n/es_MX.po new file mode 100644 index 000000000..2481cca0b --- /dev/null +++ b/product_warranty/i18n/es_MX.po @@ -0,0 +1,16 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_warranty +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-07-17 20:41+0000\n" +"PO-Revision-Date: 2015-07-17 20:41+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" diff --git a/product_warranty/i18n/es_PA.po b/product_warranty/i18n/es_PA.po new file mode 100644 index 000000000..2481cca0b --- /dev/null +++ b/product_warranty/i18n/es_PA.po @@ -0,0 +1,16 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_warranty +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-07-17 20:41+0000\n" +"PO-Revision-Date: 2015-07-17 20:41+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" diff --git a/product_warranty/i18n/es_VE.po b/product_warranty/i18n/es_VE.po new file mode 100644 index 000000000..2481cca0b --- /dev/null +++ b/product_warranty/i18n/es_VE.po @@ -0,0 +1,16 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_warranty +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-07-17 20:41+0000\n" +"PO-Revision-Date: 2015-07-17 20:41+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" diff --git a/product_warranty/i18n/product_warranty.pot b/product_warranty/i18n/product_warranty.pot index fe6295d53..982757ab0 100644 --- a/product_warranty/i18n/product_warranty.pot +++ b/product_warranty/i18n/product_warranty.pot @@ -1,13 +1,13 @@ -# Translation of OpenERP Server. +# Translation of Odoo Server. # This file contains the translation of the following modules: # * product_warranty # msgid "" msgstr "" -"Project-Id-Version: OpenERP Server 7.0\n" +"Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-21 15:06+0000\n" -"PO-Revision-Date: 2013-11-21 15:06+0000\n" +"POT-Creation-Date: 2015-07-18 02:03+0000\n" +"PO-Revision-Date: 2015-07-18 02:03+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -16,116 +16,133 @@ msgstr "" "Plural-Forms: \n" #. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_address -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_other_address_id -#: field:product.supplierinfo,warranty_return_address:0 -#: field:product.supplierinfo,warranty_return_other_address_id:0 -msgid "Return address" +#: field:product.supplierinfo,active_supplier:0 +msgid "Active supplier" msgstr "" #. module: product_warranty -#: view:product.supplierinfo:0 -msgid "Warranty informations" +#: model:ir.model,name:product_warranty.model_res_company +msgid "Companies" msgstr "" #. module: product_warranty -#: help:product.supplierinfo,warranty_return_partner:0 -msgid "Who is in charge of the warranty return treatment toward the end customer. Company will use the current company delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarily mean that the warranty to be applied is the one of the return partner (i.e. can be returned to the company and be under the brand warranty" +#: field:return.instruction,create_uid:0 +msgid "Created by" msgstr "" #. module: product_warranty -#: help:product.supplierinfo,warranty_return_other_address_id:0 -msgid "Where the customer has to send back the product(s) if warranty return is set to 'other'." +#: field:return.instruction,create_date:0 +msgid "Created on" msgstr "" #. module: product_warranty -#: help:product.supplierinfo,warranty_duration:0 -msgid "Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field" +#: view:res.company:product_warranty.company_form +msgid "Crm product return address" msgstr "" #. module: product_warranty -#: view:res.company:0 -msgid "Crm product return address" +#: help:res.company,crm_return_address_id:0 +msgid "Default address where the customers has to send back the returned product. If empty, the address is the company address" msgstr "" #. module: product_warranty -#: model:ir.model,name:product_warranty.model_return_instruction -#: help:product.supplierinfo,return_instructions:0 -#: help:return.instruction,instructions:0 -msgid "Instructions for product return" +#: field:return.instruction,id:0 +msgid "ID" msgstr "" #. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_duration -#: field:product.supplierinfo,warranty_duration:0 -msgid "Period" +#: help:return.instruction,is_default:0 +msgid "If is default, will be use to set the default value in supplier infos. Be careful to have only one default" msgstr "" #. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_name -#: field:return.instruction,name:0 -msgid "Title" +#: model:ir.model,name:product_warranty.model_product_supplierinfo +msgid "Information about a product supplier" msgstr "" #. module: product_warranty -#: model:ir.model,name:product_warranty.model_res_company -msgid "Companies" +#: field:product.supplierinfo,return_instructions:0 +#: view:return.instruction:product_warranty.product_return_instructions_form_view +#: field:return.instruction,instructions:0 +msgid "Instructions" msgstr "" #. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_active_supplier -#: field:product.supplierinfo,active_supplier:0 -msgid "Active supplier" +#: model:ir.model,name:product_warranty.model_return_instruction +#: help:product.supplierinfo,return_instructions:0 +#: help:return.instruction,instructions:0 +msgid "Instructions for product return" msgstr "" #. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_is_default #: field:return.instruction,is_default:0 msgid "Is default" msgstr "" #. module: product_warranty -#: help:product.supplierinfo,warranty_return_address:0 -msgid "Where the goods should be returned (computed field based on other infos.)" +#: help:product.supplierinfo,active_supplier:0 +msgid "Is this supplier still active, only for information" msgstr "" #. module: product_warranty -#: help:return.instruction,is_default:0 -msgid "If is default, will be use to set the default value in supplier infos. Be careful to have only one default" +#: field:return.instruction,write_uid:0 +msgid "Last Updated by" +msgstr "" + +#. module: product_warranty +#: field:return.instruction,write_date:0 +msgid "Last Updated on" +msgstr "" + +#. module: product_warranty +#: field:product.supplierinfo,warranty_duration:0 +msgid "Period" msgstr "" #. module: product_warranty #: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action #: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action -msgid "Products return instructions" +msgid "Products Return Instructions" msgstr "" #. module: product_warranty -#: model:ir.model,name:product_warranty.model_product_supplierinfo -msgid "Information about a product supplier" +#: field:product.supplierinfo,warranty_return_other_address:0 +#: field:res.company,crm_return_address_id:0 +msgid "Return address" msgstr "" #. module: product_warranty -#: help:product.supplierinfo,active_supplier:0 -msgid "Is this supplier still active, only for information" +#: view:return.instruction:product_warranty.product_return_instructions_form_view +#: view:return.instruction:product_warranty.product_return_instructions_tree_view +msgid "Return instructions" msgstr "" #. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_warranty_return_partner #: field:product.supplierinfo,warranty_return_partner:0 msgid "Return type" msgstr "" #. module: product_warranty -#: view:return.instruction:0 -msgid "Return instructions" +#: field:return.instruction,name:0 +msgid "Title" msgstr "" #. module: product_warranty -#: model:ir.model.fields,field_description:product_warranty.field_product_supplierinfo_return_instructions -#: model:ir.model.fields,field_description:product_warranty.field_return_instruction_instructions -#: field:product.supplierinfo,return_instructions:0 -#: view:return.instruction:0 -#: field:return.instruction,instructions:0 -msgid "Instructions" +#: help:product.supplierinfo,warranty_duration:0 +msgid "Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field" +msgstr "" + +#. module: product_warranty +#: view:product.supplierinfo:product_warranty.product_supplierinfo_warranty_form_view +msgid "Warranty informations" +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_other_address:0 +msgid "Where the customer has to send back the product(s) if warranty return is set to 'other'." +msgstr "" + +#. module: product_warranty +#: help:product.supplierinfo,warranty_return_partner:0 +msgid "Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty" msgstr "" diff --git a/product_warranty/models/__init__.py b/product_warranty/models/__init__.py new file mode 100644 index 000000000..8e2e25802 --- /dev/null +++ b/product_warranty/models/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +######################################################################### +# # +# # +######################################################################### +# # +# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # +# # +# 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 . import return_instruction +from . import product_supplierinfo +from . import res_company diff --git a/product_warranty/models/product_supplierinfo.py b/product_warranty/models/product_supplierinfo.py new file mode 100644 index 000000000..3139fc660 --- /dev/null +++ b/product_warranty/models/product_supplierinfo.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +# ######################################################################## +# # +# # +# ######################################################################## +# # +# Copyright 2015 Vauxoo +# Copyright (C) 2009-2011 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 import api, fields, models + + +class ProductSupplierInfo(models.Model): + + _inherit = "product.supplierinfo" + + @api.model + def get_warranty_return_partner(self): + result = [('company', 'Company'), + ('supplier', 'Supplier'), + ('other', 'Other'), + ] + return result + + @api.model + def _get_default_instructions(self): + """ Get selected lines to add to exchange """ + instruction_ids = self.env['return.instruction']\ + .search([('is_default', '=', True)], limit=1) + return instruction_ids + + @api.one + @api.depends('warranty_return_partner') + def _compute_warranty_return_address(self): + """ Method to return the partner delivery address or if none, + the default address + + dedicated_delivery_address stand for the case a new type of + address more particularly dedicated to return delivery would be + implemented. + + """ + return_partner = self.warranty_return_partner + partner_id = self.company_id.partner_id.id + if return_partner: + if return_partner == 'supplier': + partner_id = self.name.id + elif return_partner == 'company': + if self.company_id.crm_return_address_id: + partner_id = self.company_id.\ + crm_return_address_id.id + elif return_partner == 'other': + if self.warranty_return_other_address: + partner_id = self.\ + warranty_return_other_address.id + self.warranty_return_address = partner_id + + warranty_duration = fields.Float( + 'Period', + help="Warranty in month for this product/supplier relation. Only " + "for company/supplier relation (purchase order) ; the " + "customer/company relation (sale order) always use the " + "product main warranty field") + warranty_return_partner = fields.Selection( + get_warranty_return_partner, + 'Return type', + required=True, + default='company', + help="Who is in charge of the warranty return treatment toward the" + " end customer. Company will use the current compagny " + " delivery or default address and so on for supplier and " + "brand manufacturer. Doesn't necessarly mean that the " + "warranty to be applied is the one of the return partner " + "(ie: can be returned to the company and be under the " + "brand warranty") + return_instructions = fields.Many2one( + 'return.instruction', + 'Instructions', + default=_get_default_instructions, + help="Instructions for product return") + active_supplier = fields.Boolean( + help="Is this supplier still active, only for information") + warranty_return_address = fields.Many2one( + 'res.partner', + compute='_compute_warranty_return_address', + string="Return address", + help="Where the goods should be returned " + "(computed field based on other infos.)") + warranty_return_other_address = fields.Many2one( + 'res.partner', + string='Return address', + help="Where the customer has to send back the product(s) " + "if warranty return is set to 'other'.") diff --git a/product_warranty/res_company.py b/product_warranty/models/res_company.py similarity index 73% rename from product_warranty/res_company.py rename to product_warranty/models/res_company.py index 146979ee8..fce2579ef 100644 --- a/product_warranty/res_company.py +++ b/product_warranty/models/res_company.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- ############################################################################## # +# Copyright 2015 Vauxoo # Copyright 2013 Camptocamp # Copyright 2009-2013 Akretion, # Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, @@ -21,18 +22,16 @@ # ############################################################################## -from openerp.osv import fields, orm +from openerp import fields, models -class res_company(orm.Model): +class ResCompany(models.Model): _inherit = "res.company" - _columns = { - 'crm_return_address_id': fields.many2one( - 'res.partner', - 'Return address', - help="Default address where the customers has to send back the " - "returned product. If empty, the address is the " - "company address"), - } + crm_return_address_id = fields.Many2one( + 'res.partner', + string='Return address', + help="Default address where the customers has to send back the " + "returned product. If empty, the address is the " + "company address") diff --git a/product_warranty/models/return_instruction.py b/product_warranty/models/return_instruction.py new file mode 100644 index 000000000..0c430d46e --- /dev/null +++ b/product_warranty/models/return_instruction.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# ######################################################################## +# # +# # +# ######################################################################## +# # +# Copyright 2015 Vauxoo +# Copyright (C) 2009-2011 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 import fields, models + + +class ReturnInstruction(models.Model): + + _name = "return.instruction" + _description = "Instructions for product return" + + name = fields.Char('Title', required=True) + instructions = fields.Text( + 'Instructions', + help="Instructions for product return") + is_default = fields.Boolean('Is default', + help="If is default, will be use " + "to set the default value in " + "supplier infos. Be careful to " + "have only one default") diff --git a/product_warranty/product_warranty.py b/product_warranty/product_warranty.py deleted file mode 100644 index c34cb4e9a..000000000 --- a/product_warranty/product_warranty.py +++ /dev/null @@ -1,128 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2009-2011 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 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 . -# -############################################################################## - -from openerp.osv import orm, fields - - -class return_instruction(orm.Model): - _name = "return.instruction" - _description = "Instructions for product return" - _columns = { - 'name': fields.char('Title', required=True), - 'instructions': fields.text( - 'Instructions', - help="Instructions for product return"), - 'is_default': fields.boolean( - 'Is default', - help="If is default, will be use to set the default value in " - "supplier infos. Be careful to have only one default"), - } - - -class product_supplierinfo(orm.Model): - _inherit = "product.supplierinfo" - - def get_warranty_return_partner(self, cr, uid, context=None): - result = [('company', 'Company'), - ('supplier', 'Supplier'), - ('other', 'Other'), - ] - return result - - def _get_default_instructions(self, cr, uid, context=None): - """ Get selected lines to add to exchange """ - instr_obj = self.pool.get('return.instruction') - instruction_ids = instr_obj.search(cr, uid, - [('is_default', '=', True)], - context=context) - if instruction_ids: - return instruction_ids[0] - return False - - def _get_warranty_return_address(self, cr, uid, ids, field_names, arg, - context=None): - """ Method to return the partner delivery address or if none, the - default address - - dedicated_delivery_address stand for the case a new type of - address more particularly dedicated to return delivery would be - implemented. - - """ - result = {} - for supplier_info in self.browse(cr, uid, ids, context=context): - result[supplier_info.id] = False - return_partner = supplier_info.warranty_return_partner - partner_id = supplier_info.company_id.partner_id.id - if return_partner: - if return_partner == 'supplier': - partner_id = supplier_info.name.id - elif return_partner == 'company': - if supplier_info.company_id.crm_return_address_id: - partner_id = supplier_info.company_id.\ - crm_return_address_id.id - elif return_partner == 'other': - if supplier_info.warranty_return_other_address_id: - partner_id = supplier_info.\ - warranty_return_other_address_id.id - result[supplier_info.id] = partner_id - return result - - _columns = { - "warranty_duration": fields.float( - 'Period', - help="Warranty in month for this product/supplier relation. " - "Only for company/supplier relation (purchase order) ; " - "the customer/company relation (sale order) always use " - "the product main warranty field"), - "warranty_return_partner": fields.selection( - get_warranty_return_partner, - 'Return type', - required=True, - help="Who is in charge of the warranty return treatment toward " - "the end customer. Company will use the current company " - "delivery or default address and so on for supplier and " - "brand manufacturer. Doesn't necessarily mean that " - "the warranty to be applied is the one of the return partner " - "(i.e. can be returned to the company and be under the brand " - "warranty"), - 'return_instructions': fields.many2one( - 'return.instruction', - 'Instructions', - help="Instructions for product return"), - 'active_supplier': fields.boolean( - 'Active supplier', - help="Is this supplier still active, only for information"), - 'warranty_return_address': fields.function( - _get_warranty_return_address, - type='many2one', relation='res.partner', string="Return address", - help="Where the goods should be returned " - "(computed field based on other infos.)"), - "warranty_return_other_address_id": fields.many2one( - 'res.partner', - 'Return address', - help="Where the customer has to send back the product(s) " - "if warranty return is set to 'other'."), - } - - _defaults = { - 'warranty_return_partner': 'company', - 'return_instructions': _get_default_instructions, - } diff --git a/product_warranty/tests/__init__.py b/product_warranty/tests/__init__.py new file mode 100644 index 000000000..07376694d --- /dev/null +++ b/product_warranty/tests/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yanina Aular +# Copyright 2015 Vauxoo +# +# 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 . +# +############################################################################## + +from . import test_product_warranty diff --git a/product_warranty/tests/test_product_warranty.py b/product_warranty/tests/test_product_warranty.py new file mode 100644 index 000000000..b6eb670c4 --- /dev/null +++ b/product_warranty/tests/test_product_warranty.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yanina Aular +# Copyright 2015 Vauxoo +# +# 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 . +# +############################################################################## + +from openerp.tests.common import TransactionCase + + +class TestProductWarranty(TransactionCase): + + def setUp(self): + super(TestProductWarranty, self).setUp() + self.instruction_model = self.env['return.instruction'] + self.supplierinfo = self.env['product.supplierinfo'] + self.create_product_supplierinfo() + + def create_product_supplierinfo(self): + """ + Create a record of product.supplier for next tests + """ + + product_tmpl_id = self.env.ref('product.product_product_3') + + partner_id = self.env.ref('base.res_partner_4') + + supplierinfo_data = dict(name=partner_id.id, + product_name='Test SupplierInfo for' + ' display Default Instruction', + min_qty=4, + delay=5, + warranty_return_partner='supplier', + product_tmpl_id=product_tmpl_id.id,) + self.supplierinfo_brw = \ + self.supplierinfo.create(supplierinfo_data) + + def test_default_instruction(self): + """ + Test for return.instruction record with + default field in True. If is assigned + correctly when one record of + product.supplierinfo is created + """ + + return_instructions_id = self.env.ref('product_warranty.' + 'return_instruction_1') + + self.assertEquals(self.supplierinfo_brw.return_instructions.id, + return_instructions_id.id) + + def test_warranty_return_address(self): + """ + Test warranty_return_address field is calculate correctly depends of + warranty_return_partner + """ + self.create_product_supplierinfo() + + self.assertEquals(self.supplierinfo_brw.warranty_return_address.id, + self.supplierinfo_brw.name.id) + + self.supplierinfo_brw.write({'warranty_return_partner': 'company'}) + + self.assertEquals(self.supplierinfo_brw.warranty_return_address.id, + self.supplierinfo_brw.company_id. + crm_return_address_id.id) diff --git a/product_warranty/product_warranty_view.xml b/product_warranty/views/product_warranty_view.xml similarity index 86% rename from product_warranty/product_warranty_view.xml rename to product_warranty/views/product_warranty_view.xml index 5160ed2bf..6148dc306 100644 --- a/product_warranty/product_warranty_view.xml +++ b/product_warranty/views/product_warranty_view.xml @@ -53,7 +53,7 @@
- Products return instructions + Products Return Instructions return.instruction form tree,form @@ -71,13 +71,13 @@ product.supplierinfo - + - + @@ -97,13 +97,10 @@ -
-
-
+ + + diff --git a/product_warranty/res_company_view.xml b/product_warranty/views/res_company_view.xml similarity index 57% rename from product_warranty/res_company_view.xml rename to product_warranty/views/res_company_view.xml index 34bdf2ee8..973bd889f 100644 --- a/product_warranty/res_company_view.xml +++ b/product_warranty/views/res_company_view.xml @@ -6,18 +6,14 @@ crm_claim_rma.company_form res.company - - + - - - - - - + + + + - From 59eab5b4beb1b4213688cfbc1407645c6fd49317 Mon Sep 17 00:00:00 2001 From: Nhomar Hernandez Date: Wed, 5 Aug 2015 02:54:26 -0500 Subject: [PATCH 18/62] [FIX] typo on comment being refered to an unexistent field. --- product_warranty/README.rst | 2 +- product_warranty/models/product_supplierinfo.py | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/product_warranty/README.rst b/product_warranty/README.rst index aba2e4b28..ebe7a63c3 100644 --- a/product_warranty/README.rst +++ b/product_warranty/README.rst @@ -7,7 +7,7 @@ Product Warranty Extends the product warranty management with warranty details on product / supplier relation: -* supplier warranty duration +* Supplier warranty duration * Set default return address for company (if different from standard one) * Whether to return product to company, supplier, other diff --git a/product_warranty/models/product_supplierinfo.py b/product_warranty/models/product_supplierinfo.py index 3139fc660..937eb284f 100644 --- a/product_warranty/models/product_supplierinfo.py +++ b/product_warranty/models/product_supplierinfo.py @@ -46,13 +46,8 @@ def _get_default_instructions(self): @api.one @api.depends('warranty_return_partner') def _compute_warranty_return_address(self): - """ Method to return the partner delivery address or if none, - the default address - - dedicated_delivery_address stand for the case a new type of - address more particularly dedicated to return delivery would be - implemented. - + """ Method to return the partner delivery address or if none, the + default address """ return_partner = self.warranty_return_partner partner_id = self.company_id.partner_id.id From 6200c91a099ae6669d8eecd3bf51293d06b495e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Fri, 9 Oct 2015 10:02:59 +0200 Subject: [PATCH 19/62] [UPD] prefix versions with 8.0 --- product_warranty/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py index 7eb6fbbbe..77f075cb1 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__openerp__.py @@ -22,7 +22,7 @@ { 'name': 'Product warranty', - 'version': '1.0', + 'version': '8.0.1.0.0', 'category': 'Generic Modules/Product', 'author': "Akretion,Odoo Community Association (OCA),Vauxoo", 'website': 'http://akretion.com', From e7d039e7ace4780b8eee6adb3dbcc8dd97f2e9e3 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 14 Oct 2015 03:32:04 +0200 Subject: [PATCH 20/62] [MIG] Make modules uninstallable --- product_warranty/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py index 77f075cb1..79f4e8c17 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__openerp__.py @@ -38,7 +38,7 @@ 'demo/res_company.xml', ], 'test': [], - 'installable': True, + 'installable': False, 'active': False, 'images': ['images/product_warranty.png'], } From 435314ea63f6336d613714a61fcb138f43aa8887 Mon Sep 17 00:00:00 2001 From: Cyril Gaudin Date: Thu, 21 Apr 2016 16:32:59 +0200 Subject: [PATCH 21/62] product_warranty: migration V9 --- product_warranty/README.rst | 1 + product_warranty/__init__.py | 23 +---- product_warranty/__openerp__.py | 4 +- product_warranty/demo/product_warranty.xml | 2 +- product_warranty/models/__init__.py | 23 +---- .../models/product_supplierinfo.py | 83 +++++++------------ product_warranty/models/res_company.py | 25 +----- product_warranty/models/return_instruction.py | 25 +----- .../tests/test_product_warranty.py | 50 +++++------ .../views/product_warranty_view.xml | 40 +++------ product_warranty/views/res_company_view.xml | 6 +- 11 files changed, 84 insertions(+), 198 deletions(-) diff --git a/product_warranty/README.rst b/product_warranty/README.rst index ebe7a63c3..a7ad16614 100644 --- a/product_warranty/README.rst +++ b/product_warranty/README.rst @@ -32,6 +32,7 @@ Contributors * Joël Grand-Guillaume * Ondřej Kuzník * Yanina Aular +* Cyril Gaudin Maintainer ---------- diff --git a/product_warranty/__init__.py b/product_warranty/__init__.py index 7297bf897..0d135c281 100644 --- a/product_warranty/__init__.py +++ b/product_warranty/__init__.py @@ -1,23 +1,6 @@ # -*- coding: utf-8 -*- -######################################################################### -# # -# # -######################################################################### -# # -# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # -# # -# 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 . # -######################################################################### +# © 2016 Cyril Gaudin (Camptocamp) +# © 2009-2011 Akretion, Emmanuel Samyn +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import models diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py index 79f4e8c17..64864487f 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__openerp__.py @@ -22,7 +22,7 @@ { 'name': 'Product warranty', - 'version': '8.0.1.0.0', + 'version': '9.0.1.0.0', 'category': 'Generic Modules/Product', 'author': "Akretion,Odoo Community Association (OCA),Vauxoo", 'website': 'http://akretion.com', @@ -38,7 +38,7 @@ 'demo/res_company.xml', ], 'test': [], - 'installable': False, + 'installable': True, 'active': False, 'images': ['images/product_warranty.png'], } diff --git a/product_warranty/demo/product_warranty.xml b/product_warranty/demo/product_warranty.xml index 6f7f3f8ef..faea7cc5d 100644 --- a/product_warranty/demo/product_warranty.xml +++ b/product_warranty/demo/product_warranty.xml @@ -37,7 +37,7 @@ Select the product you want to return and the reason for the return. You will ne supplier 12 - + 5 1
diff --git a/product_warranty/models/__init__.py b/product_warranty/models/__init__.py index 8e2e25802..b29d709fa 100644 --- a/product_warranty/models/__init__.py +++ b/product_warranty/models/__init__.py @@ -1,24 +1,7 @@ # -*- coding: utf-8 -*- -######################################################################### -# # -# # -######################################################################### -# # -# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # -# # -# 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 . # -######################################################################### +# © 2016 Cyril Gaudin (Camptocamp) +# © 2009-2011 Akretion, Emmanuel Samyn +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import return_instruction from . import product_supplierinfo diff --git a/product_warranty/models/product_supplierinfo.py b/product_warranty/models/product_supplierinfo.py index 937eb284f..c406f98c5 100644 --- a/product_warranty/models/product_supplierinfo.py +++ b/product_warranty/models/product_supplierinfo.py @@ -1,25 +1,8 @@ # -*- coding: utf-8 -*- -# ######################################################################## -# # -# # -# ######################################################################## -# # -# Copyright 2015 Vauxoo -# Copyright (C) 2009-2011 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 . # -########################################################################## +# © 2016 Cyril Gaudin (Camptocamp) +# © 2015 Vauxoo +# © 2009-2011 Akretion, Emmanuel Samyn, Benoît Guillot +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import api, fields, models @@ -28,14 +11,6 @@ class ProductSupplierInfo(models.Model): _inherit = "product.supplierinfo" - @api.model - def get_warranty_return_partner(self): - result = [('company', 'Company'), - ('supplier', 'Supplier'), - ('other', 'Other'), - ] - return result - @api.model def _get_default_instructions(self): """ Get selected lines to add to exchange """ @@ -43,36 +18,35 @@ def _get_default_instructions(self): .search([('is_default', '=', True)], limit=1) return instruction_ids - @api.one @api.depends('warranty_return_partner') def _compute_warranty_return_address(self): """ Method to return the partner delivery address or if none, the default address """ - return_partner = self.warranty_return_partner - partner_id = self.company_id.partner_id.id - if return_partner: - if return_partner == 'supplier': - partner_id = self.name.id - elif return_partner == 'company': - if self.company_id.crm_return_address_id: - partner_id = self.company_id.\ - crm_return_address_id.id - elif return_partner == 'other': - if self.warranty_return_other_address: - partner_id = self.\ - warranty_return_other_address.id - self.warranty_return_address = partner_id + for record in self: + return_partner = record.warranty_return_partner + partner_id = record.company_id.partner_id.id + if return_partner: + if return_partner == 'supplier': + partner_id = record.name.id + elif return_partner == 'company': + if record.company_id.crm_return_address_id: + partner_id = record.company_id.crm_return_address_id.id + elif return_partner == 'other': + if record.warranty_return_other_address: + partner_id = record.warranty_return_other_address.id + record.warranty_return_address = partner_id warranty_duration = fields.Float( 'Period', help="Warranty in month for this product/supplier relation. Only " "for company/supplier relation (purchase order) ; the " "customer/company relation (sale order) always use the " - "product main warranty field") + "product main warranty field" + ) warranty_return_partner = fields.Selection( - get_warranty_return_partner, - 'Return type', + [('company', 'Company'), ('supplier', 'Supplier'), ('other', 'Other')], + string='Return type', required=True, default='company', help="Who is in charge of the warranty return treatment toward the" @@ -81,22 +55,27 @@ def _compute_warranty_return_address(self): "brand manufacturer. Doesn't necessarly mean that the " "warranty to be applied is the one of the return partner " "(ie: can be returned to the company and be under the " - "brand warranty") + "brand warranty)" + ) return_instructions = fields.Many2one( 'return.instruction', 'Instructions', default=_get_default_instructions, - help="Instructions for product return") + help="Instructions for product return" + ) active_supplier = fields.Boolean( - help="Is this supplier still active, only for information") + help="Is this supplier still active, only for information" + ) warranty_return_address = fields.Many2one( 'res.partner', compute='_compute_warranty_return_address', string="Return address", help="Where the goods should be returned " - "(computed field based on other infos.)") + "(computed field based on other infos.)" + ) warranty_return_other_address = fields.Many2one( 'res.partner', string='Return address', help="Where the customer has to send back the product(s) " - "if warranty return is set to 'other'.") + "if warranty return is set to 'other'." + ) diff --git a/product_warranty/models/res_company.py b/product_warranty/models/res_company.py index fce2579ef..8c7258cf9 100644 --- a/product_warranty/models/res_company.py +++ b/product_warranty/models/res_company.py @@ -1,26 +1,7 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright 2015 Vauxoo -# Copyright 2013 Camptocamp -# Copyright 2009-2013 Akretion, -# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau, -# Joel Grand-Guillaume -# -# 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 . -# -############################################################################## +# © 2016 Joel Grand-Guillaume, Cyril Gaudin (Camptocamp) +# © 2009-2013 Akretion, Emmanuel Samyn, Raphaël Valyi, Sébastien Beau +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import fields, models diff --git a/product_warranty/models/return_instruction.py b/product_warranty/models/return_instruction.py index 0c430d46e..cb646a610 100644 --- a/product_warranty/models/return_instruction.py +++ b/product_warranty/models/return_instruction.py @@ -1,25 +1,8 @@ # -*- coding: utf-8 -*- -# ######################################################################## -# # -# # -# ######################################################################## -# # -# Copyright 2015 Vauxoo -# Copyright (C) 2009-2011 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 . # -########################################################################## +# © 2016 Cyril Gaudin (Camptocamp) +# © 2015 Vauxoo +# © 2009-2011 Akretion, Emmanuel Samyn, Benoît Guillot +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import fields, models diff --git a/product_warranty/tests/test_product_warranty.py b/product_warranty/tests/test_product_warranty.py index b6eb670c4..98bb2ad8e 100644 --- a/product_warranty/tests/test_product_warranty.py +++ b/product_warranty/tests/test_product_warranty.py @@ -1,23 +1,7 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Author: Yanina Aular -# Copyright 2015 Vauxoo -# -# 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 . -# -############################################################################## +# © 2016 Cyril Gaudin (Camptocamp) +# © 2015 Vauxoo, Yanina Aular +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp.tests.common import TransactionCase @@ -38,16 +22,19 @@ def create_product_supplierinfo(self): product_tmpl_id = self.env.ref('product.product_product_3') partner_id = self.env.ref('base.res_partner_4') + other_partner = self.env.ref('base.res_partner_12') - supplierinfo_data = dict(name=partner_id.id, - product_name='Test SupplierInfo for' - ' display Default Instruction', - min_qty=4, - delay=5, - warranty_return_partner='supplier', - product_tmpl_id=product_tmpl_id.id,) - self.supplierinfo_brw = \ - self.supplierinfo.create(supplierinfo_data) + supplierinfo_data = dict( + name=partner_id.id, + product_name='Test SupplierInfo for display Default Instruction', + min_qty=4, + delay=5, + warranty_return_partner='supplier', + product_tmpl_id=product_tmpl_id.id, + warranty_return_other_address=other_partner.id, + ) + + self.supplierinfo_brw = self.supplierinfo.create(supplierinfo_data) def test_default_instruction(self): """ @@ -78,3 +65,10 @@ def test_warranty_return_address(self): self.assertEquals(self.supplierinfo_brw.warranty_return_address.id, self.supplierinfo_brw.company_id. crm_return_address_id.id) + + self.supplierinfo_brw.write({'warranty_return_partner': 'other'}) + + self.assertEquals( + self.supplierinfo_brw.warranty_return_address.id, + self.supplierinfo_brw.warranty_return_other_address.id + ) diff --git a/product_warranty/views/product_warranty_view.xml b/product_warranty/views/product_warranty_view.xml index 6148dc306..aef144f2a 100644 --- a/product_warranty/views/product_warranty_view.xml +++ b/product_warranty/views/product_warranty_view.xml @@ -1,29 +1,7 @@ - - - - + product.return.instructions.tree return.instruction @@ -36,7 +14,7 @@ - + product.return.instructions.form return.instruction @@ -64,20 +42,20 @@ groups="base.group_no_one" id="menu_product_return_instructions_action" parent="product.prod_config_main" sequence="3"/> - + product.supplierinfo.warranty.tree product.supplierinfo - + - + @@ -87,7 +65,7 @@ product.supplierinfo - + @@ -97,12 +75,14 @@ - + - + diff --git a/product_warranty/views/res_company_view.xml b/product_warranty/views/res_company_view.xml index 973bd889f..831c09d89 100644 --- a/product_warranty/views/res_company_view.xml +++ b/product_warranty/views/res_company_view.xml @@ -8,9 +8,11 @@ res.company - + - + + + From d01f19c55bab9308b124e7fdff241dd05d16bc83 Mon Sep 17 00:00:00 2001 From: "Yanina Aular (Vauxoo)" Date: Mon, 16 May 2016 11:58:55 -0400 Subject: [PATCH 22/62] [FIX] file naming of view files --- product_warranty/__openerp__.py | 4 ++-- .../views/{product_warranty_view.xml => product_warranty.xml} | 0 .../views/{res_company_view.xml => res_company.xml} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename product_warranty/views/{product_warranty_view.xml => product_warranty.xml} (100%) rename product_warranty/views/{res_company_view.xml => res_company.xml} (100%) diff --git a/product_warranty/__openerp__.py b/product_warranty/__openerp__.py index 64864487f..ebe22030d 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__openerp__.py @@ -30,8 +30,8 @@ 'depends': ['product'], 'data': [ 'security/ir.model.access.csv', - 'views/res_company_view.xml', - 'views/product_warranty_view.xml', + 'views/res_company.xml', + 'views/product_warranty.xml', ], 'demo': [ 'demo/product_warranty.xml', diff --git a/product_warranty/views/product_warranty_view.xml b/product_warranty/views/product_warranty.xml similarity index 100% rename from product_warranty/views/product_warranty_view.xml rename to product_warranty/views/product_warranty.xml diff --git a/product_warranty/views/res_company_view.xml b/product_warranty/views/res_company.xml similarity index 100% rename from product_warranty/views/res_company_view.xml rename to product_warranty/views/res_company.xml From 3b1e1e9542219f8fc625bd15d02bf7512275c984 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 6 Oct 2016 16:06:55 +0200 Subject: [PATCH 23/62] [MIG] Make modules uninstallable --- product_warranty/{__openerp__.py => __manifest__.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename product_warranty/{__openerp__.py => __manifest__.py} (98%) diff --git a/product_warranty/__openerp__.py b/product_warranty/__manifest__.py similarity index 98% rename from product_warranty/__openerp__.py rename to product_warranty/__manifest__.py index ebe22030d..54b4e53bf 100644 --- a/product_warranty/__openerp__.py +++ b/product_warranty/__manifest__.py @@ -38,7 +38,7 @@ 'demo/res_company.xml', ], 'test': [], - 'installable': True, + 'installable': False, 'active': False, 'images': ['images/product_warranty.png'], } From b01c7b0d46e7332045d0d7fb3fd96a8304fcb363 Mon Sep 17 00:00:00 2001 From: bima Date: Wed, 24 May 2017 20:46:48 +0700 Subject: [PATCH 24/62] Migrate to v10.0 - Add dependency sale because group "group_sale_salesman" and "group_sale_manager" are defined on modul sales_team * sale depend to sales_team * update ir.model.access base. -> sales_team. - Fix product.prod_config_main not compatible and moved to sale.prod_config_main - Make removed col="6 when add product supplier info field too small (width) --- product_warranty/README.rst | 1 + product_warranty/__manifest__.py | 6 +++--- product_warranty/demo/product_warranty.xml | 4 ++-- product_warranty/demo/res_company.xml | 4 ++-- product_warranty/models/product_supplierinfo.py | 2 +- product_warranty/models/res_company.py | 2 +- product_warranty/models/return_instruction.py | 2 +- product_warranty/security/ir.model.access.csv | 4 ++-- product_warranty/tests/test_product_warranty.py | 2 +- product_warranty/views/product_warranty.xml | 12 ++++++------ product_warranty/views/res_company.xml | 4 ++-- 11 files changed, 22 insertions(+), 21 deletions(-) diff --git a/product_warranty/README.rst b/product_warranty/README.rst index a7ad16614..a07914af0 100644 --- a/product_warranty/README.rst +++ b/product_warranty/README.rst @@ -33,6 +33,7 @@ Contributors * Ondřej Kuzník * Yanina Aular * Cyril Gaudin +* Bima Jati Wijaya Maintainer ---------- diff --git a/product_warranty/__manifest__.py b/product_warranty/__manifest__.py index 54b4e53bf..e2b6badbb 100644 --- a/product_warranty/__manifest__.py +++ b/product_warranty/__manifest__.py @@ -22,12 +22,12 @@ { 'name': 'Product warranty', - 'version': '9.0.1.0.0', + 'version': '10.0.1.0.0', 'category': 'Generic Modules/Product', 'author': "Akretion,Odoo Community Association (OCA),Vauxoo", 'website': 'http://akretion.com', 'license': 'AGPL-3', - 'depends': ['product'], + 'depends': ['product', 'sale'], 'data': [ 'security/ir.model.access.csv', 'views/res_company.xml', @@ -38,7 +38,7 @@ 'demo/res_company.xml', ], 'test': [], - 'installable': False, + 'installable': True, 'active': False, 'images': ['images/product_warranty.png'], } diff --git a/product_warranty/demo/product_warranty.xml b/product_warranty/demo/product_warranty.xml index faea7cc5d..570568cf1 100644 --- a/product_warranty/demo/product_warranty.xml +++ b/product_warranty/demo/product_warranty.xml @@ -1,5 +1,5 @@ - + @@ -61,4 +61,4 @@ Select the product you want to return and the reason for the return. You will ne - + diff --git a/product_warranty/demo/res_company.xml b/product_warranty/demo/res_company.xml index 63f047934..43f0a72f6 100644 --- a/product_warranty/demo/res_company.xml +++ b/product_warranty/demo/res_company.xml @@ -1,5 +1,5 @@ - + @@ -7,4 +7,4 @@ - + diff --git a/product_warranty/models/product_supplierinfo.py b/product_warranty/models/product_supplierinfo.py index c406f98c5..7bf4c88a1 100644 --- a/product_warranty/models/product_supplierinfo.py +++ b/product_warranty/models/product_supplierinfo.py @@ -4,7 +4,7 @@ # © 2009-2011 Akretion, Emmanuel Samyn, Benoît Guillot # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import api, fields, models +from odoo import api, fields, models class ProductSupplierInfo(models.Model): diff --git a/product_warranty/models/res_company.py b/product_warranty/models/res_company.py index 8c7258cf9..30009796e 100644 --- a/product_warranty/models/res_company.py +++ b/product_warranty/models/res_company.py @@ -3,7 +3,7 @@ # © 2009-2013 Akretion, Emmanuel Samyn, Raphaël Valyi, Sébastien Beau # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import fields, models +from odoo import fields, models class ResCompany(models.Model): diff --git a/product_warranty/models/return_instruction.py b/product_warranty/models/return_instruction.py index cb646a610..b1798a6e5 100644 --- a/product_warranty/models/return_instruction.py +++ b/product_warranty/models/return_instruction.py @@ -4,7 +4,7 @@ # © 2009-2011 Akretion, Emmanuel Samyn, Benoît Guillot # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import fields, models +from odoo import fields, models class ReturnInstruction(models.Model): diff --git a/product_warranty/security/ir.model.access.csv b/product_warranty/security/ir.model.access.csv index b8cc8fffc..ba6c463ee 100644 --- a/product_warranty/security/ir.model.access.csv +++ b/product_warranty/security/ir.model.access.csv @@ -1,4 +1,4 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "access_return_instruction_user","return.instruction.user","model_return_instruction","base.group_user","True","False","False","False" -"access_return_instruction_manager","return.instruction.manager","model_return_instruction","base.group_sale_manager","True","True","True","True" -"access_return_instruction_salesman","return.instruction.salesman","model_return_instruction","base.group_sale_salesman","True","True","True","True" +"access_return_instruction_manager","return.instruction.manager","model_return_instruction","sales_team.group_sale_manager","True","True","True","True" +"access_return_instruction_salesman","return.instruction.salesman","model_return_instruction","sales_team.group_sale_salesman","True","True","True","True" diff --git a/product_warranty/tests/test_product_warranty.py b/product_warranty/tests/test_product_warranty.py index 98bb2ad8e..38a687072 100644 --- a/product_warranty/tests/test_product_warranty.py +++ b/product_warranty/tests/test_product_warranty.py @@ -3,7 +3,7 @@ # © 2015 Vauxoo, Yanina Aular # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp.tests.common import TransactionCase +from odoo.tests.common import TransactionCase class TestProductWarranty(TransactionCase): diff --git a/product_warranty/views/product_warranty.xml b/product_warranty/views/product_warranty.xml index aef144f2a..23741c1ca 100644 --- a/product_warranty/views/product_warranty.xml +++ b/product_warranty/views/product_warranty.xml @@ -1,5 +1,5 @@ - + @@ -20,7 +20,7 @@ return.instruction
- + @@ -41,7 +41,7 @@ + parent="sale.prod_config_main" sequence="3"/> @@ -66,11 +66,11 @@ - + - + @@ -87,4 +87,4 @@ - + diff --git a/product_warranty/views/res_company.xml b/product_warranty/views/res_company.xml index 831c09d89..51317c052 100644 --- a/product_warranty/views/res_company.xml +++ b/product_warranty/views/res_company.xml @@ -1,5 +1,5 @@ - + @@ -18,4 +18,4 @@ - + From 161afad500891b548ce1750b5c36049f52c21ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul=20=28ACSONE=29?= Date: Fri, 15 Jun 2018 23:39:05 +0200 Subject: [PATCH 25/62] remove obsolete .pot files [ci skip] --- product_warranty/i18n/product_warranty.pot | 148 --------------------- 1 file changed, 148 deletions(-) delete mode 100644 product_warranty/i18n/product_warranty.pot diff --git a/product_warranty/i18n/product_warranty.pot b/product_warranty/i18n/product_warranty.pot deleted file mode 100644 index 982757ab0..000000000 --- a/product_warranty/i18n/product_warranty.pot +++ /dev/null @@ -1,148 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * product_warranty -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-07-18 02:03+0000\n" -"PO-Revision-Date: 2015-07-18 02:03+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: product_warranty -#: field:product.supplierinfo,active_supplier:0 -msgid "Active supplier" -msgstr "" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_res_company -msgid "Companies" -msgstr "" - -#. module: product_warranty -#: field:return.instruction,create_uid:0 -msgid "Created by" -msgstr "" - -#. module: product_warranty -#: field:return.instruction,create_date:0 -msgid "Created on" -msgstr "" - -#. module: product_warranty -#: view:res.company:product_warranty.company_form -msgid "Crm product return address" -msgstr "" - -#. module: product_warranty -#: help:res.company,crm_return_address_id:0 -msgid "Default address where the customers has to send back the returned product. If empty, the address is the company address" -msgstr "" - -#. module: product_warranty -#: field:return.instruction,id:0 -msgid "ID" -msgstr "" - -#. module: product_warranty -#: help:return.instruction,is_default:0 -msgid "If is default, will be use to set the default value in supplier infos. Be careful to have only one default" -msgstr "" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_product_supplierinfo -msgid "Information about a product supplier" -msgstr "" - -#. module: product_warranty -#: field:product.supplierinfo,return_instructions:0 -#: view:return.instruction:product_warranty.product_return_instructions_form_view -#: field:return.instruction,instructions:0 -msgid "Instructions" -msgstr "" - -#. module: product_warranty -#: model:ir.model,name:product_warranty.model_return_instruction -#: help:product.supplierinfo,return_instructions:0 -#: help:return.instruction,instructions:0 -msgid "Instructions for product return" -msgstr "" - -#. module: product_warranty -#: field:return.instruction,is_default:0 -msgid "Is default" -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,active_supplier:0 -msgid "Is this supplier still active, only for information" -msgstr "" - -#. module: product_warranty -#: field:return.instruction,write_uid:0 -msgid "Last Updated by" -msgstr "" - -#. module: product_warranty -#: field:return.instruction,write_date:0 -msgid "Last Updated on" -msgstr "" - -#. module: product_warranty -#: field:product.supplierinfo,warranty_duration:0 -msgid "Period" -msgstr "" - -#. module: product_warranty -#: model:ir.actions.act_window,name:product_warranty.product_return_instructions_action -#: model:ir.ui.menu,name:product_warranty.menu_product_return_instructions_action -msgid "Products Return Instructions" -msgstr "" - -#. module: product_warranty -#: field:product.supplierinfo,warranty_return_other_address:0 -#: field:res.company,crm_return_address_id:0 -msgid "Return address" -msgstr "" - -#. module: product_warranty -#: view:return.instruction:product_warranty.product_return_instructions_form_view -#: view:return.instruction:product_warranty.product_return_instructions_tree_view -msgid "Return instructions" -msgstr "" - -#. module: product_warranty -#: field:product.supplierinfo,warranty_return_partner:0 -msgid "Return type" -msgstr "" - -#. module: product_warranty -#: field:return.instruction,name:0 -msgid "Title" -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_duration:0 -msgid "Warranty in month for this product/supplier relation. Only for company/supplier relation (purchase order) ; the customer/company relation (sale order) always use the product main warranty field" -msgstr "" - -#. module: product_warranty -#: view:product.supplierinfo:product_warranty.product_supplierinfo_warranty_form_view -msgid "Warranty informations" -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_other_address:0 -msgid "Where the customer has to send back the product(s) if warranty return is set to 'other'." -msgstr "" - -#. module: product_warranty -#: help:product.supplierinfo,warranty_return_partner:0 -msgid "Who is in charge of the warranty return treatment toward the end customer. Company will use the current compagny delivery or default address and so on for supplier and brand manufacturer. Doesn't necessarly mean that the warranty to be applied is the one of the return partner (ie: can be returned to the company and be under the brand warranty" -msgstr "" From e2ea68855be2b336c41e927dffcf43234e3cbef3 Mon Sep 17 00:00:00 2001 From: osi-scampbell Date: Fri, 4 Jan 2019 15:37:56 -0700 Subject: [PATCH 26/62] [MIG] Migrate product_warranty to 11.0 --- product_warranty/README.rst | 87 +++- product_warranty/__init__.py | 1 - product_warranty/__manifest__.py | 45 +- product_warranty/models/__init__.py | 10 +- .../models/product_supplierinfo.py | 2 - product_warranty/models/product_template.py | 16 + product_warranty/models/res_company.py | 2 - product_warranty/models/return_instruction.py | 2 - product_warranty/readme/CONTRIBUTORS.rst | 10 + product_warranty/readme/CREDITS.rst | 10 + product_warranty/readme/DESCRIPTION.rst | 6 + product_warranty/readme/USAGE.rst | 3 + product_warranty/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 459 ++++++++++++++++++ product_warranty/tests/__init__.py | 23 +- .../tests/test_product_warranty.py | 1 - product_warranty/views/product_template.xml | 24 + product_warranty/views/res_company.xml | 2 +- 18 files changed, 632 insertions(+), 71 deletions(-) create mode 100644 product_warranty/models/product_template.py create mode 100644 product_warranty/readme/CONTRIBUTORS.rst create mode 100644 product_warranty/readme/CREDITS.rst create mode 100644 product_warranty/readme/DESCRIPTION.rst create mode 100644 product_warranty/readme/USAGE.rst create mode 100644 product_warranty/static/description/icon.png create mode 100644 product_warranty/static/description/index.html create mode 100644 product_warranty/views/product_template.xml diff --git a/product_warranty/README.rst b/product_warranty/README.rst index a07914af0..9cdd668b3 100644 --- a/product_warranty/README.rst +++ b/product_warranty/README.rst @@ -1,9 +1,30 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :alt: License: AGPL-3 - +================ Product Warranty ================ +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Frma-lightgray.png?logo=github + :target: https://github.com/OCA/rma/tree/11.0/product_warranty + :alt: OCA/rma +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/rma-11-0/rma-11-0-product_warranty + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/145/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + Extends the product warranty management with warranty details on product / supplier relation: @@ -11,6 +32,11 @@ supplier relation: * Set default return address for company (if different from standard one) * Whether to return product to company, supplier, other +**Table of contents** + +.. contents:: + :local: + Usage ===== @@ -18,11 +44,27 @@ The new information is not explicitly used by the system until you install another module that makes use of it, e.g. RMA Claim (Product Return Management). +Bug Tracker +=========== + +Bugs are tracked on `GitHub 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 `_. + +Do not contact contributors directly about support or help with technical issues. + Credits ======= +Authors +~~~~~~~ + +* Akretion +* Vauxoo + Contributors ------------- +~~~~~~~~~~~~ * Emmanuel Samyn * Paulius Sladkevičius @@ -35,17 +77,44 @@ Contributors * Cyril Gaudin * Bima Jati Wijaya -Maintainer ----------- +Other credits +~~~~~~~~~~~~~ + +This module has been financially supported by: + +* Inovera +* Akretion Brazil +* Akretion +* Savoir-faire Linux +* Credativ +* Vauxoo +* Camp 2 Camp +* Open Source Integrators + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. .. 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. +.. |maintainer-osi-scampbell| image:: https://github.com/osi-scampbell.png?size=40px + :target: https://github.com/osi-scampbell + :alt: osi-scampbell +.. |maintainer-max3903| image:: https://github.com/max3903.png?size=40px + :target: https://github.com/max3903 + :alt: max3903 + +Current `maintainers `__: + +|maintainer-osi-scampbell| |maintainer-max3903| + +This module is part of the `OCA/rma `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/product_warranty/__init__.py b/product_warranty/__init__.py index 0d135c281..466cdd813 100644 --- a/product_warranty/__init__.py +++ b/product_warranty/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # © 2016 Cyril Gaudin (Camptocamp) # © 2009-2011 Akretion, Emmanuel Samyn # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). diff --git a/product_warranty/__manifest__.py b/product_warranty/__manifest__.py index e2b6badbb..563ab9caa 100644 --- a/product_warranty/__manifest__.py +++ b/product_warranty/__manifest__.py @@ -1,44 +1,31 @@ -# -*- coding: utf-8 -*- -######################################################################### -# # -# # -######################################################################### -# # -# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn # -# # -# 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 . # -######################################################################### +# Copyright (C) 2009-2011 Akretion, Emmanuel Samyn +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { - 'name': 'Product warranty', - 'version': '10.0.1.0.0', + 'name': 'Product Warranty', + 'version': '11.0.1.0.0', 'category': 'Generic Modules/Product', - 'author': "Akretion,Odoo Community Association (OCA),Vauxoo", - 'website': 'http://akretion.com', + 'author': 'Akretion, Vauxoo, Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/rma', 'license': 'AGPL-3', - 'depends': ['product', 'sale'], + 'depends': [ + 'product', + 'sale', + ], 'data': [ 'security/ir.model.access.csv', 'views/res_company.xml', 'views/product_warranty.xml', + 'views/product_template.xml' ], 'demo': [ 'demo/product_warranty.xml', 'demo/res_company.xml', ], - 'test': [], - 'installable': True, - 'active': False, 'images': ['images/product_warranty.png'], + 'development_status': 'Production/Stable', + 'maintainers': [ + 'osi-scampbell', + 'max3903', + ] } diff --git a/product_warranty/models/__init__.py b/product_warranty/models/__init__.py index b29d709fa..226359785 100644 --- a/product_warranty/models/__init__.py +++ b/product_warranty/models/__init__.py @@ -1,8 +1,10 @@ -# -*- coding: utf-8 -*- # © 2016 Cyril Gaudin (Camptocamp) # © 2009-2011 Akretion, Emmanuel Samyn # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import return_instruction -from . import product_supplierinfo -from . import res_company +from . import ( + return_instruction, + product_supplierinfo, + res_company, + product_template +) diff --git a/product_warranty/models/product_supplierinfo.py b/product_warranty/models/product_supplierinfo.py index 7bf4c88a1..ec8ea4d24 100644 --- a/product_warranty/models/product_supplierinfo.py +++ b/product_warranty/models/product_supplierinfo.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # © 2016 Cyril Gaudin (Camptocamp) # © 2015 Vauxoo # © 2009-2011 Akretion, Emmanuel Samyn, Benoît Guillot @@ -8,7 +7,6 @@ class ProductSupplierInfo(models.Model): - _inherit = "product.supplierinfo" @api.model diff --git a/product_warranty/models/product_template.py b/product_warranty/models/product_template.py new file mode 100644 index 000000000..bc985aa20 --- /dev/null +++ b/product_warranty/models/product_template.py @@ -0,0 +1,16 @@ +# Copyright (C) 2018 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + warranty = fields.Integer(string='Warranty Duration') + warranty_type = fields.Selection([('day', 'Day(s)'), + ('week', 'Week(s)'), + ('month', 'Month(s)'), + ('year', 'Year(s)')], + string='Warranty Type', + required=True, default='day') diff --git a/product_warranty/models/res_company.py b/product_warranty/models/res_company.py index 30009796e..9c917fd05 100644 --- a/product_warranty/models/res_company.py +++ b/product_warranty/models/res_company.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # © 2016 Joel Grand-Guillaume, Cyril Gaudin (Camptocamp) # © 2009-2013 Akretion, Emmanuel Samyn, Raphaël Valyi, Sébastien Beau # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). @@ -7,7 +6,6 @@ class ResCompany(models.Model): - _inherit = "res.company" crm_return_address_id = fields.Many2one( diff --git a/product_warranty/models/return_instruction.py b/product_warranty/models/return_instruction.py index b1798a6e5..c06492140 100644 --- a/product_warranty/models/return_instruction.py +++ b/product_warranty/models/return_instruction.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # © 2016 Cyril Gaudin (Camptocamp) # © 2015 Vauxoo # © 2009-2011 Akretion, Emmanuel Samyn, Benoît Guillot @@ -8,7 +7,6 @@ class ReturnInstruction(models.Model): - _name = "return.instruction" _description = "Instructions for product return" diff --git a/product_warranty/readme/CONTRIBUTORS.rst b/product_warranty/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..d810a2eb6 --- /dev/null +++ b/product_warranty/readme/CONTRIBUTORS.rst @@ -0,0 +1,10 @@ +* Emmanuel Samyn +* Paulius Sladkevičius +* Benoît Guillot +* David Beal +* Maxime Chambreuil +* Joël Grand-Guillaume +* Ondřej Kuzník +* Yanina Aular +* Cyril Gaudin +* Bima Jati Wijaya diff --git a/product_warranty/readme/CREDITS.rst b/product_warranty/readme/CREDITS.rst new file mode 100644 index 000000000..b6f1055fe --- /dev/null +++ b/product_warranty/readme/CREDITS.rst @@ -0,0 +1,10 @@ +This module has been financially supported by: + +* Inovera +* Akretion Brazil +* Akretion +* Savoir-faire Linux +* Credativ +* Vauxoo +* Camp 2 Camp +* Open Source Integrators diff --git a/product_warranty/readme/DESCRIPTION.rst b/product_warranty/readme/DESCRIPTION.rst new file mode 100644 index 000000000..da2b8af9a --- /dev/null +++ b/product_warranty/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +Extends the product warranty management with warranty details on product / +supplier relation: + +* Supplier warranty duration +* Set default return address for company (if different from standard one) +* Whether to return product to company, supplier, other diff --git a/product_warranty/readme/USAGE.rst b/product_warranty/readme/USAGE.rst new file mode 100644 index 000000000..af4534340 --- /dev/null +++ b/product_warranty/readme/USAGE.rst @@ -0,0 +1,3 @@ +The new information is not explicitly used by the system until you install +another module that makes use of it, e.g. RMA Claim (Product Return +Management). diff --git a/product_warranty/static/description/icon.png b/product_warranty/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/product_warranty/static/description/index.html b/product_warranty/static/description/index.html new file mode 100644 index 000000000..ab9187234 --- /dev/null +++ b/product_warranty/static/description/index.html @@ -0,0 +1,459 @@ + + + + + + +Product Warranty + + + +
+

Product Warranty

+ + +

Production/Stable License: AGPL-3 OCA/rma Translate me on Weblate Try me on Runbot

+

Extends the product warranty management with warranty details on product / +supplier relation:

+
    +
  • Supplier warranty duration
  • +
  • Set default return address for company (if different from standard one)
  • +
  • Whether to return product to company, supplier, other
  • +
+

Table of contents

+ +
+

Usage

+

The new information is not explicitly used by the system until you install +another module that makes use of it, e.g. RMA Claim (Product Return +Management).

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub 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.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
  • Vauxoo
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

This module has been financially supported by:

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

Current maintainers:

+

osi-scampbell max3903

+

This module is part of the OCA/rma project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/product_warranty/tests/__init__.py b/product_warranty/tests/__init__.py index 07376694d..1d0ff0c37 100644 --- a/product_warranty/tests/__init__.py +++ b/product_warranty/tests/__init__.py @@ -1,22 +1,5 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Author: Yanina Aular -# Copyright 2015 Vauxoo -# -# 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 . -# -############################################################################## +# Author: Yanina Aular +# Copyright 2015 Vauxoo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import test_product_warranty diff --git a/product_warranty/tests/test_product_warranty.py b/product_warranty/tests/test_product_warranty.py index 38a687072..7ddca7759 100644 --- a/product_warranty/tests/test_product_warranty.py +++ b/product_warranty/tests/test_product_warranty.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # © 2016 Cyril Gaudin (Camptocamp) # © 2015 Vauxoo, Yanina Aular # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). diff --git a/product_warranty/views/product_template.xml b/product_warranty/views/product_template.xml new file mode 100644 index 000000000..868a7a3cb --- /dev/null +++ b/product_warranty/views/product_template.xml @@ -0,0 +1,24 @@ + + + + + product.template + + + + + + + + + + + + + diff --git a/product_warranty/views/res_company.xml b/product_warranty/views/res_company.xml index 51317c052..88c76b066 100644 --- a/product_warranty/views/res_company.xml +++ b/product_warranty/views/res_company.xml @@ -9,7 +9,7 @@ - + From b77e46af52a81741b970ee8316209409eb920e41 Mon Sep 17 00:00:00 2001 From: Murtuza Saleh Date: Tue, 23 Apr 2019 13:41:35 +0530 Subject: [PATCH 27/62] [MIG][12.0] product_warranty --- product_warranty/README.rst | 11 +- product_warranty/__init__.py | 2 - product_warranty/__manifest__.py | 5 +- product_warranty/demo/product_warranty.xml | 125 ++++++++------- product_warranty/demo/res_company.xml | 12 +- product_warranty/models/__init__.py | 2 - .../models/product_supplierinfo.py | 56 +++---- product_warranty/models/res_company.py | 2 +- product_warranty/models/return_instruction.py | 6 +- product_warranty/readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 9 +- product_warranty/tests/__init__.py | 2 - product_warranty/views/product_template.xml | 4 +- product_warranty/views/product_warranty.xml | 151 +++++++++--------- product_warranty/views/res_company.xml | 27 ++-- 15 files changed, 209 insertions(+), 206 deletions(-) diff --git a/product_warranty/README.rst b/product_warranty/README.rst index 9cdd668b3..4224e5258 100644 --- a/product_warranty/README.rst +++ b/product_warranty/README.rst @@ -14,13 +14,13 @@ Product Warranty :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Frma-lightgray.png?logo=github - :target: https://github.com/OCA/rma/tree/11.0/product_warranty + :target: https://github.com/OCA/rma/tree/12.0/product_warranty :alt: OCA/rma .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/rma-11-0/rma-11-0-product_warranty + :target: https://translation.odoo-community.org/projects/rma-12-0/rma-12-0-product_warranty :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/145/11.0 + :target: https://runbot.odoo-community.org/runbot/145/12.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -50,7 +50,7 @@ Bug Tracker Bugs are tracked on `GitHub 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -76,6 +76,7 @@ Contributors * Yanina Aular * Cyril Gaudin * Bima Jati Wijaya +* Serpent Consulting Services Pvt. Ltd. Other credits ~~~~~~~~~~~~~ @@ -115,6 +116,6 @@ Current `maintainers `__: |maintainer-osi-scampbell| |maintainer-max3903| -This module is part of the `OCA/rma `_ project on GitHub. +This module is part of the `OCA/rma `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/product_warranty/__init__.py b/product_warranty/__init__.py index 466cdd813..83e553ac4 100644 --- a/product_warranty/__init__.py +++ b/product_warranty/__init__.py @@ -1,5 +1,3 @@ -# © 2016 Cyril Gaudin (Camptocamp) -# © 2009-2011 Akretion, Emmanuel Samyn # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import models diff --git a/product_warranty/__manifest__.py b/product_warranty/__manifest__.py index 563ab9caa..b025a7a74 100644 --- a/product_warranty/__manifest__.py +++ b/product_warranty/__manifest__.py @@ -3,14 +3,13 @@ { 'name': 'Product Warranty', - 'version': '11.0.1.0.0', + 'version': '12.0.1.0.0', 'category': 'Generic Modules/Product', 'author': 'Akretion, Vauxoo, Odoo Community Association (OCA)', 'website': 'https://github.com/OCA/rma', 'license': 'AGPL-3', 'depends': [ - 'product', - 'sale', + 'sale_management', ], 'data': [ 'security/ir.model.access.csv', diff --git a/product_warranty/demo/product_warranty.xml b/product_warranty/demo/product_warranty.xml index 570568cf1..dfd444560 100644 --- a/product_warranty/demo/product_warranty.xml +++ b/product_warranty/demo/product_warranty.xml @@ -1,64 +1,81 @@ - - - + + - - Default Instruction - To return a product purchased through our platform vendor Marketplace access our online Returns Center and click Return products to begin the application process for the return. -Select the product you want to return and the reason for the return. You will need you to provide detailed information to enable the seller to handle your request. Once the seller has reviewed your application, it will respond by e-mail within 3 working days. - 1 - + + Default Instruction + To return a product purchased through our + platform vendor Marketplace access our online Returns Center and + click Return products to begin the application process for the + return. + Select the product you want to return and the reason for the + return. You will need you to provide detailed information to enable + the seller to handle your request. Once the seller has reviewed + your application, it will respond by e-mail within 3 working days. + + 1 + - - Provisional Instruction - Under the provisions of these Conditions of Sale, you may return the products received once you have contacted our customer service department adidas Mexico and the request is authorized. If you choose to return your order, we will refund: the full purchase price, as long as we have previously returned the products you order in perfect condition: (i) new product unused, (ii) with packaging, original box and tags (iii) be in the period of 30 calendar days after receiving the product. If you do not return the products to fulfill the above conditions, we are entitled to charge the products or the costs of recovery. - + + Provisional Instruction + Under the provisions of these Conditions of + Sale, you may return the products received once you have contacted + our customer service department adidas Mexico and the request is + authorized. If you choose to return your order, we will refund: the + full purchase price, as long as we have previously returned the + products you order in perfect condition: (i) new product unused, + (ii) with packaging, original box and tags (iii) be in the period + of 30 calendar days after receiving the product. If you do not + return the products to fulfill the above conditions, we are + entitled to charge the products or the costs of recovery. + + - + + + 5 + - - 5 - + + + other + + 8 + + + 5 + 1 + - - - other - - 8 - - - 5 - 1 - + + + supplier + 12 + + + 5 + 1 + - - - supplier - 12 - - - 5 - 1 - + + + 5 + - + + + supplier + 10 + - - 5 - + + + supplier + 6 + - - - supplier - 10 - - - - - supplier - 6 - - - diff --git a/product_warranty/demo/res_company.xml b/product_warranty/demo/res_company.xml index 43f0a72f6..d73828594 100644 --- a/product_warranty/demo/res_company.xml +++ b/product_warranty/demo/res_company.xml @@ -1,10 +1,8 @@ - - - + + - - - + + + - diff --git a/product_warranty/models/__init__.py b/product_warranty/models/__init__.py index 226359785..2f4c9e983 100644 --- a/product_warranty/models/__init__.py +++ b/product_warranty/models/__init__.py @@ -1,5 +1,3 @@ -# © 2016 Cyril Gaudin (Camptocamp) -# © 2009-2011 Akretion, Emmanuel Samyn # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import ( diff --git a/product_warranty/models/product_supplierinfo.py b/product_warranty/models/product_supplierinfo.py index ec8ea4d24..0dc7c5474 100644 --- a/product_warranty/models/product_supplierinfo.py +++ b/product_warranty/models/product_supplierinfo.py @@ -12,9 +12,8 @@ class ProductSupplierInfo(models.Model): @api.model def _get_default_instructions(self): """ Get selected lines to add to exchange """ - instruction_ids = self.env['return.instruction']\ + return self.env['return.instruction']\ .search([('is_default', '=', True)], limit=1) - return instruction_ids @api.depends('warranty_return_partner') def _compute_warranty_return_address(self): @@ -24,15 +23,14 @@ def _compute_warranty_return_address(self): for record in self: return_partner = record.warranty_return_partner partner_id = record.company_id.partner_id.id - if return_partner: - if return_partner == 'supplier': - partner_id = record.name.id - elif return_partner == 'company': - if record.company_id.crm_return_address_id: - partner_id = record.company_id.crm_return_address_id.id - elif return_partner == 'other': - if record.warranty_return_other_address: - partner_id = record.warranty_return_other_address.id + if return_partner and return_partner == 'supplier': + partner_id = record.name.id + elif return_partner and return_partner == 'company' and \ + record.company_id.crm_return_address_id: + partner_id = record.company_id.crm_return_address_id.id + elif return_partner and return_partner == 'other' and \ + record.warranty_return_other_address: + partner_id = record.warranty_return_other_address.id record.warranty_return_address = partner_id warranty_duration = fields.Float( @@ -40,40 +38,32 @@ def _compute_warranty_return_address(self): help="Warranty in month for this product/supplier relation. Only " "for company/supplier relation (purchase order) ; the " "customer/company relation (sale order) always use the " - "product main warranty field" - ) + "product main warranty field.") warranty_return_partner = fields.Selection( [('company', 'Company'), ('supplier', 'Supplier'), ('other', 'Other')], - string='Return type', - required=True, - default='company', - help="Who is in charge of the warranty return treatment toward the" - " end customer. Company will use the current compagny " - " delivery or default address and so on for supplier and " - "brand manufacturer. Doesn't necessarly mean that the " - "warranty to be applied is the one of the return partner " - "(ie: can be returned to the company and be under the " - "brand warranty)" - ) + string='Return type', required=True, default='company', + help="Who is in charge of the warranty return treatment toward the " + "end customer. Company will use the current company " + "delivery or default address and so on for supplier and " + "brand manufacturer. Doesn't necessarily mean that the " + "warranty to be applied is the one of the return partner " + "(ie: can be returned to the company and be under the " + "brand warranty).") return_instructions = fields.Many2one( 'return.instruction', 'Instructions', default=_get_default_instructions, - help="Instructions for product return" - ) + help="Instructions for product return.") active_supplier = fields.Boolean( - help="Is this supplier still active, only for information" - ) + help="Is this supplier still active, only for information.") warranty_return_address = fields.Many2one( 'res.partner', compute='_compute_warranty_return_address', string="Return address", help="Where the goods should be returned " - "(computed field based on other infos.)" - ) + "(computed field based on other infos.)") warranty_return_other_address = fields.Many2one( 'res.partner', - string='Return address', + string='Return other address', help="Where the customer has to send back the product(s) " - "if warranty return is set to 'other'." - ) + "if warranty return is set to 'other'.") diff --git a/product_warranty/models/res_company.py b/product_warranty/models/res_company.py index 9c917fd05..ec64c51af 100644 --- a/product_warranty/models/res_company.py +++ b/product_warranty/models/res_company.py @@ -13,4 +13,4 @@ class ResCompany(models.Model): string='Return address', help="Default address where the customers has to send back the " "returned product. If empty, the address is the " - "company address") + "company address.") diff --git a/product_warranty/models/return_instruction.py b/product_warranty/models/return_instruction.py index c06492140..e9e1ca3ac 100644 --- a/product_warranty/models/return_instruction.py +++ b/product_warranty/models/return_instruction.py @@ -13,9 +13,9 @@ class ReturnInstruction(models.Model): name = fields.Char('Title', required=True) instructions = fields.Text( 'Instructions', - help="Instructions for product return") + help="Instructions for product return.") is_default = fields.Boolean('Is default', help="If is default, will be use " "to set the default value in " - "supplier infos. Be careful to " - "have only one default") + "supplier info's. Be careful to " + "have only one default.") diff --git a/product_warranty/readme/CONTRIBUTORS.rst b/product_warranty/readme/CONTRIBUTORS.rst index d810a2eb6..48dad3127 100644 --- a/product_warranty/readme/CONTRIBUTORS.rst +++ b/product_warranty/readme/CONTRIBUTORS.rst @@ -8,3 +8,4 @@ * Yanina Aular * Cyril Gaudin * Bima Jati Wijaya +* Serpent Consulting Services Pvt. Ltd. diff --git a/product_warranty/static/description/index.html b/product_warranty/static/description/index.html index ab9187234..c7ed0462d 100644 --- a/product_warranty/static/description/index.html +++ b/product_warranty/static/description/index.html @@ -3,7 +3,7 @@ - + Product Warranty