[11.0] MIG: RMA module

This commit is contained in:
Bhavesh Odedra
2018-02-09 21:56:28 +05:30
committed by ahenriquez
parent f9c7b28af8
commit ae0a75499a
40 changed files with 640 additions and 781 deletions

21
rma/README.rst Normal file → Executable file
View File

@@ -59,16 +59,16 @@ steps:
Other Settings
--------------
#. Go to Inventory > Settings > Return Merchandising Authorization and select
the option "Display 3 fields on rma: partner, invoice address, delivery
address" if needed.
#. Go to Inventory > Settings > Configuration > Warehouse management >
Warehouses and add a default RMA location and RMA picking type for customers
and suppliers RMA picking type. In case the warehouse is configured to
use routes, you need to create at least one route per rma type with at
least two push rules (one for inbound another for outbound) it's very
important to select the type of operation supplier if we are moving in the
company and customer if we are moving out of the company.
#. Go to Inventory > Configuration > Settings > Return Merchandising
Authorization and select the option "Display 3 fields on rma: partner,
invoice address, delivery address" if needed.
#. Go to Inventory > Configuration > Warehouse management > Warehouses and add
a default RMA location and RMA picking type for customers and suppliers RMA
picking type. In case the warehouse is configured to use routes, you need to
create at least one route per rma type with at least two push rules (one for
inbound another for outbound) it's very important to select the type of
operation supplier if we are moving in the company and customer if we are
moving out of the company.
Usage
=====
@@ -105,6 +105,7 @@ Contributors
* Jordi Ballester Alomar <jordi.ballester@eficent.com>
* Aaron Henriquez <ahenriquez@eficent.com>
* Lois Rilo <lois.rilo@eficent.com>
* Bhavesh Odedra <bodedra@opensourceintegrators.com>
Maintainer
----------

1
rma/__init__.py Normal file → Executable file
View File

@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
# © 2017 Eficent Business and IT Consulting Services S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)
from . import models
from . import wizards

5
rma/__manifest__.py Normal file → Executable file
View File

@@ -4,14 +4,14 @@
{
'name': 'RMA (Return Merchandise Authorization)',
'version': '10.0.1.0.0',
'version': '11.0.1.0.0',
'license': 'LGPL-3',
'category': 'RMA',
'summary': 'Introduces the return merchandise authorization (RMA) process '
'in odoo',
'author': "Eficent, Odoo Community Association (OCA)",
'website': 'http://www.github.com/OCA/rma',
'depends': ['stock', 'mail', 'procurement'],
'depends': ['stock', 'mail'],
'demo': ['demo/stock_demo.xml',
],
'data': ['security/rma.xml',
@@ -25,7 +25,6 @@
'views/stock_view.xml',
'views/stock_warehouse.xml',
'views/product_view.xml',
'views/procurement_view.xml',
'views/res_partner_view.xml',
'wizards/rma_make_picking_view.xml',
'wizards/rma_add_stock_move_view.xml',

0
rma/data/rma_operation.xml Normal file → Executable file
View File

0
rma/data/rma_sequence.xml Normal file → Executable file
View File

0
rma/data/stock_data.xml Normal file → Executable file
View File

0
rma/demo/stock_demo.xml Normal file → Executable file
View File

0
rma/models/__init__.py Normal file → Executable file
View File

22
rma/models/procurement.py Normal file → Executable file
View File

@@ -2,22 +2,28 @@
# © 2017 Eficent Business and IT Consulting Services S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)
from odoo import api, fields, models
from odoo import fields, models
class ProcurementOrder(models.Model):
_inherit = 'procurement.order'
class ProcurementRule(models.Model):
_inherit = 'procurement.rule'
rma_line_id = fields.Many2one(
comodel_name='rma.order.line', string='RMA line',
ondelete="set null",
)
@api.model
def _get_stock_move_values(self):
res = super(ProcurementOrder, self)._get_stock_move_values()
if self.rma_line_id:
line = self.rma_line_id
def _get_stock_move_values(self, product_id, product_qty, product_uom,
location_id, name, origin, values, group_id):
res = super(ProcurementRule, self)._get_stock_move_values(product_id,
product_qty,
product_uom,
location_id,
name, origin,
values,
group_id)
if 'rma_line_id' in values:
line = self.env['rma.order.line'].browse(values.get('rma_line_id'))
res['rma_line_id'] = line.id
if line.delivery_address_id:
res['partner_id'] = line.delivery_address_id.id

0
rma/models/product.py Normal file → Executable file
View File

0
rma/models/product_category.py Normal file → Executable file
View File

0
rma/models/res_partner.py Normal file → Executable file
View File

0
rma/models/rma_operation.py Normal file → Executable file
View File

65
rma/models/rma_order.py Normal file → Executable file
View File

@@ -3,7 +3,7 @@
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)
from odoo import api, fields, models, _
from odoo.exceptions import UserError
from odoo.exceptions import UserError, ValidationError
from datetime import datetime
@@ -20,18 +20,18 @@ class RmaOrder(models.Model):
@api.multi
def _compute_in_shipment_count(self):
for rec in self:
rec.in_shipment_count = len(rec.rma_line_ids.mapped(
'move_ids').filtered(
lambda m: m.location_dest_id.usage == 'internal').mapped(
'picking_id'))
rec.in_shipment_count = len(
rec.rma_line_ids.mapped('move_ids').filtered(
lambda m: m.location_dest_id.usage == 'internal').mapped(
'picking_id'))
@api.multi
def _compute_out_shipment_count(self):
for rec in self:
rec.out_shipment_count = len(rec.rma_line_ids.mapped(
'move_ids').filtered(
lambda m: m.location_id.usage == 'internal').mapped(
'picking_id'))
rec.out_shipment_count = len(
rec.rma_line_ids.mapped('move_ids').filtered(
lambda m: m.location_id.usage == 'internal').mapped(
'picking_id'))
@api.multi
def _compute_supplier_line_count(self):
@@ -111,14 +111,16 @@ class RmaOrder(models.Model):
if move.picking_id.location_id == suppliers:
picking_ids.append(move.picking_id.id)
shipments = list(set(picking_ids))
if not shipments:
raise ValidationError(_("No shipments found!"))
# choose the view_mode accordingly
if len(shipments) != 1:
result['domain'] = "[('id', 'in', " + \
str(shipments) + ")]"
elif len(shipments) == 1:
res = self.env.ref('stock.view_picking_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = shipments[0]
if shipments:
if len(shipments) > 1:
result['domain'] = [('id', 'in', shipments)]
else:
res = self.env.ref('stock.view_picking_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = shipments[0]
return result
@api.multi
@@ -138,11 +140,12 @@ class RmaOrder(models.Model):
if move.picking_id.location_id != suppliers:
picking_ids.append(move.picking_id.id)
shipments = list(set(picking_ids))
if not shipments:
raise ValidationError(_("No deliveries found!"))
# choose the view_mode accordingly
if len(shipments) != 1:
result['domain'] = "[('id', 'in', " + \
str(shipments) + ")]"
elif len(shipments) == 1:
if len(shipments) > 1:
result['domain'] = [('id', 'in', shipments)]
else:
res = self.env.ref('stock.view_picking_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = shipments[0]
@@ -159,20 +162,21 @@ class RmaOrder(models.Model):
def action_view_lines(self):
if self.type == 'customer':
action = self.env.ref('rma.action_rma_customer_lines')
res = self.env.ref('rma.view_rma_line_form', False)
else:
action = self.env.ref('rma.action_rma_supplier_lines')
res = self.env.ref('rma.view_rma_line_supplier_form', False)
result = action.read()[0]
lines = self._get_valid_lines()
if not lines:
raise ValidationError(_("No rma %s lines found!") % self.type)
# choose the view_mode accordingly
if len(lines) != 1:
if len(lines.ids) > 1:
result['domain'] = [('id', 'in', lines.ids)]
elif len(lines) == 1:
if self.type == 'customer':
res = self.env.ref('rma.view_rma_line_form', False)
else:
res = self.env.ref('rma.view_rma_line_supplier_form', False)
else:
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = lines.id
result['context'] = {}
return result
@api.multi
@@ -182,11 +186,12 @@ class RmaOrder(models.Model):
lines = self.rma_line_ids
for line_id in lines:
related_lines = [line.id for line in line_id.supplier_rma_line_ids]
if not related_lines:
raise ValidationError(_("No rma supplier lines found!"))
# choose the view_mode accordingly
if len(related_lines) != 1:
result['domain'] = "[('id', 'in', " + \
str(related_lines) + ")]"
elif len(related_lines) == 1:
if len(related_lines) > 1:
result['domain'] = [('id', 'in', related_lines)]
else:
res = self.env.ref('rma.view_rma_line_supplier_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = related_lines[0]

139
rma/models/rma_order_line.py Normal file → Executable file
View File

@@ -47,20 +47,16 @@ class RmaOrderLine(models.Model):
@api.multi
def _compute_in_shipment_count(self):
for line in self:
moves = line.procurement_ids.mapped('move_ids').filtered(
lambda m: m.location_dest_id.usage == 'internal' and
m.state != 'cancel')
pickings = moves.mapped('picking_id')
line.in_shipment_count = len(pickings)
line.in_shipment_count = len(self.env['stock.picking'].search(
[('origin', '=', line.name),
('picking_type_code', '=', 'incoming')]).ids)
@api.multi
def _compute_out_shipment_count(self):
for line in self:
moves = line.procurement_ids.mapped('move_ids').filtered(
lambda m: m.location_dest_id.usage != 'internal' and
m.state != 'cancel')
pickings = moves.mapped('picking_id')
line.out_shipment_count = len(pickings)
line.out_shipment_count = len(self.env['stock.picking'].search(
[('origin', '=', line.name),
('picking_type_code', '=', 'outgoing')]).ids)
@api.multi
def _get_rma_move_qty(self, states, direction='in'):
@@ -147,12 +143,6 @@ class RmaOrderLine(models.Model):
rec.qty_to_supplier_rma = rec.qty_to_receive - qty
rec.qty_in_supplier_rma = qty
@api.multi
def _compute_procurement_count(self):
for rec in self:
rec.procurement_count = len(rec.procurement_ids.filtered(
lambda p: p.state == 'exception'))
delivery_address_id = fields.Many2one(
comodel_name='res.partner', string='Partner delivery address',
default=_default_delivery_address,
@@ -210,7 +200,7 @@ class RmaOrderLine(models.Model):
product_tracking = fields.Selection(related="product_id.tracking")
lot_id = fields.Many2one(
comodel_name="stock.production.lot", string="Lot/Serial Number",
readonly=True, states={"new": [("readonly", False)]},
readonly=True, states={"draft": [("readonly", False)]},
)
product_qty = fields.Float(
string='Ordered Qty', copy=False, default=1.0,
@@ -226,9 +216,6 @@ class RmaOrderLine(models.Model):
string='Price Unit',
readonly=True, states={'draft': [('readonly', False)]},
)
procurement_count = fields.Integer(compute=_compute_procurement_count,
string='# of Procurements', copy=False,
default=0)
in_shipment_count = fields.Integer(compute=_compute_in_shipment_count,
string='# of Shipments', default=0)
out_shipment_count = fields.Integer(compute=_compute_out_shipment_count,
@@ -241,10 +228,6 @@ class RmaOrderLine(models.Model):
copy=False,
readonly=True, states={'draft': [('readonly', False)]},
)
procurement_ids = fields.One2many('procurement.order', 'rma_line_id',
string='Procurements', readonly=True,
states={'draft': [('readonly', False)]},
copy=False)
currency_id = fields.Many2one('res.currency', string="Currency")
company_id = fields.Many2one(
comodel_name='res.company', string='Company', required=True,
@@ -413,21 +396,12 @@ class RmaOrderLine(models.Model):
@api.onchange('reference_move_id')
def _onchange_reference_move_id(self):
self.ensure_one()
sm = self.reference_move_id
if not sm:
return
if sm.lot_ids:
if len(sm.lot_ids) > 1:
raise UserError(_('To manage lots use RMA groups.'))
else:
data = self._prepare_rma_line_from_stock_move(
sm, lot=sm.lot_ids[0])
self.update(data)
else:
data = self._prepare_rma_line_from_stock_move(
sm, lot=False)
for move in self.reference_move_id:
data = self._prepare_rma_line_from_stock_move(move, lot=False)
self.update(data)
self._remove_other_data_origin('reference_move_id')
self._remove_other_data_origin('reference_move_id')
lot_ids = [x.lot_id.id for x in move.move_line_ids if x.lot_id]
return {'domain': {'lot_id': [('id', 'in', lot_ids)]}}
@api.multi
@api.constrains('reference_move_id', 'partner_id')
@@ -527,90 +501,45 @@ class RmaOrderLine(models.Model):
elif self.type == 'customer' and self.supplier_to_customer:
self.delivery_policy = 'no'
@api.onchange('product_id')
def _onchange_product_id(self):
self.uom_id = self.product_id.uom_id
if self.lot_id.product_id != self.product_id:
self.lot_id = False
if self.product_id:
return {'domain': {
'lot_id': [('product_id', '=', self.product_id.id)]}}
return {'domain': {'lot_id': []}}
@api.onchange("lot_id")
def _onchange_lot_id(self):
product = self.lot_id.product_id
if product:
self.product_id = product
self.uom_id = product.uom_id
if self.lot_id and self.reference_move_id:
data = self._prepare_rma_line_from_stock_move(
self.reference_move_id, lot=self.lot_id)
self.update(data)
@api.multi
def action_view_in_shipments(self):
action = self.env.ref('stock.action_picking_tree_all')
result = action.read()[0]
picking_ids = []
suppliers = self.env.ref('stock.stock_location_suppliers')
customers = self.env.ref('stock.stock_location_customers')
for line in self:
if line.type == 'customer':
for move in line.move_ids:
if move.picking_id.location_id == customers:
picking_ids.append(move.picking_id.id)
else:
for move in line.move_ids:
if move.picking_id.location_id == suppliers:
picking_ids.append(move.picking_id.id)
shipments = list(set(picking_ids))
picking_ids = self.env['stock.picking'].search(
[('origin', '=', self.name),
('picking_type_code', '=', 'incoming')]).ids
if not picking_ids:
raise ValidationError(_("No shipments found!"))
# choose the view_mode accordingly
if len(shipments) != 1:
result['domain'] = "[('id', 'in', " + \
str(shipments) + ")]"
elif len(shipments) == 1:
if len(picking_ids) > 1:
result['domain'] = [('id', 'in', picking_ids)]
else:
res = self.env.ref('stock.view_picking_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = shipments[0]
result['res_id'] = picking_ids[0]
return result
@api.multi
def action_view_out_shipments(self):
action = self.env.ref('stock.action_picking_tree_all')
result = action.read()[0]
picking_ids = []
suppliers = self.env.ref('stock.stock_location_suppliers')
customers = self.env.ref('stock.stock_location_customers')
for line in self:
if line.type == 'customer':
for move in line.move_ids:
if move.picking_id.location_id != customers:
picking_ids.append(move.picking_id.id)
else:
for move in line.move_ids:
if move.picking_id.location_id != suppliers:
picking_ids.append(move.picking_id.id)
shipments = list(set(picking_ids))
picking_ids = self.env['stock.picking'].search(
[('origin', '=', self.name),
('picking_type_code', '=', 'outgoing')]).ids
if not picking_ids:
raise ValidationError(_("No deliveries found!"))
# choose the view_mode accordingly
if len(shipments) != 1:
result['domain'] = "[('id', 'in', " + \
str(shipments) + ")]"
elif len(shipments) == 1:
if len(picking_ids) > 1:
result['domain'] = [('id', 'in', picking_ids)]
else:
res = self.env.ref('stock.view_picking_form', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = shipments[0]
return result
@api.multi
def action_view_procurements(self):
action = self.env.ref(
'procurement.procurement_order_action_exceptions')
result = action.read()[0]
procurements = self.procurement_ids.filtered(
lambda p: p.state == 'exception').ids
# choose the view_mode accordingly
if len(procurements) != 1:
result['domain'] = "[('id', 'in', " + \
str(procurements) + ")]"
elif len(procurements) == 1:
res = self.env.ref('procurement.procurement_form_view', False)
result['views'] = [(res and res.id or False, 'form')]
result['res_id'] = procurements[0]
result['res_id'] = picking_ids[0]
return result

9
rma/models/stock.py Normal file → Executable file
View File

@@ -30,9 +30,8 @@ class StockMove(models.Model):
@api.model
def create(self, vals):
if vals.get('procurement_id'):
procurement = self.env['procurement.order'].browse(
vals['procurement_id'])
if procurement.rma_line_id:
vals['rma_line_id'] = procurement.rma_line_id.id
if vals.get('group_id'):
group = self.env['procurement.group'].browse(vals['group_id'])
if group.rma_line_id:
vals['rma_line_id'] = group.rma_line_id.id
return super(StockMove, self).create(vals)

0
rma/models/stock_warehouse.py Normal file → Executable file
View File

2
rma/security/ir.model.access.csv Normal file → Executable file
View File

@@ -8,4 +8,4 @@ access_rma_line_manager,rma.order.line,model_rma_order_line,group_rma_manager,1,
access_rma_operation_manager,access_rma_operation,model_rma_operation,group_rma_manager,1,1,1,1
access_rma_operation_customer_user,access_rma_operation,model_rma_operation,group_rma_customer_user,1,0,0,0
access_rma_operation_supplier_user,access_rma_operation,model_rma_operation,group_rma_supplier_user,1,0,0,0
access_stock_config_settings,access_stock_config_settings,model_stock_config_settings,stock.group_stock_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
8 access_rma_operation_manager access_rma_operation model_rma_operation group_rma_manager 1 1 1 1
9 access_rma_operation_customer_user access_rma_operation model_rma_operation group_rma_customer_user 1 0 0 0
10 access_rma_operation_supplier_user access_rma_operation model_rma_operation group_rma_supplier_user 1 0 0 0
11

0
rma/security/rma.xml Normal file → Executable file
View File

0
rma/tests/__init__.py Normal file → Executable file
View File

0
rma/tests/test_rma.py Normal file → Executable file
View File

0
rma/tests/test_rma_dropship.py Normal file → Executable file
View File

0
rma/tests/test_supplier_rma.py Normal file → Executable file
View File

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="procurement_form_view_0" model="ir.ui.view">
<field name="name">procurement.order.form</field>
<field name="model">procurement.order</field>
<field name="inherit_id"
ref="procurement.procurement_form_view"/>
<field name="arch" type="xml">
<field name="origin" position="after">
<field name="rma_line_id"/>
</field>
</field>
</record>
<record id="procurement_form_view_usage" model="ir.ui.view">
<field name="name">procurement.order.form.stock.inherit</field>
<field name="model">procurement.order</field>
<field name="inherit_id"
ref="stock.view_procurement_form_stock_inherit"/>
<field name="arch" type="xml">
<field name="location_id" position="attributes">
<attribute name="domain">[('usage', '!=', 'view')]</attribute>
</field>
</field>
</record>
</data>
</odoo>

56
rma/views/product_view.xml Normal file → Executable file
View File

@@ -1,36 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="product_category_form_view" model="ir.ui.view">
<field name="name">product.category.form</field>
<field name="model">product.category</field>
<field name="inherit_id" ref="product.product_category_form_view" />
<field name="arch" type="xml">
<field name="type" position="after">
<group name="rma">
<field name="rma_approval_policy" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
<field name="rma_customer_operation_id" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
<field name="rma_supplier_operation_id" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
</group>
</field>
</field>
</record>
<record id="product_template_form_view" model="ir.ui.view">
<field name="name">product.template.stock.property.form.inherit</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_form_view"/>
<field name="arch" type="xml">
<group name="inventory" position="inside">
<group name="rma" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user">
<field name="rma_approval_policy"/>
<field name="rma_customer_operation_id" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
<field name="rma_supplier_operation_id" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
</group>
<record id="product_category_form_view" model="ir.ui.view">
<field name="name">product.category.form</field>
<field name="model">product.category</field>
<field name="inherit_id" ref="product.product_category_form_view" />
<field name="arch" type="xml">
<field name="parent_id" position="after">
<group name="rma">
<field name="rma_approval_policy" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
<field name="rma_customer_operation_id" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
<field name="rma_supplier_operation_id" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
</group>
</field>
</record>
</field>
</record>
</data>
<record id="product_template_form_view" model="ir.ui.view">
<field name="name">product.template.stock.property.form.inherit</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_form_view"/>
<field name="arch" type="xml">
<group name="inventory" position="inside">
<group name="rma" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user">
<field name="rma_approval_policy"/>
<field name="rma_customer_operation_id" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
<field name="rma_supplier_operation_id" groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"/>
</group>
</group>
</field>
</record>
</odoo>

0
rma/views/res_partner_view.xml Normal file → Executable file
View File

159
rma/views/rma_operation_view.xml Normal file → Executable file
View File

@@ -1,90 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="rma_operation_tree" model="ir.ui.view">
<field name="name">rma.operation.tree</field>
<field name="model">rma.operation</field>
<field name="arch" type="xml">
<tree string="RMA Operations">
<field name="active" invisible="1"/>
<field name="code"/>
<field name="name"/>
<field name="receipt_policy"/>
<field name="delivery_policy"/>
</tree>
</field>
</record>
<record id="rma_operation_tree" model="ir.ui.view">
<field name="name">rma.operation.tree</field>
<field name="model">rma.operation</field>
<field name="arch" type="xml">
<tree string="RMA Operations">
<field name="active" invisible="1"/>
<field name="code"/>
<field name="name"/>
<field name="receipt_policy"/>
<field name="delivery_policy"/>
</tree>
</field>
</record>
<record id="rma_operation_form" model="ir.ui.view">
<field name="name">rma.operation.form</field>
<field name="model">rma.operation</field>
<field name="arch" type="xml">
<form string="RMA Operations">
<group colspan="4" col="2">
<group name="description"
string="Description">
<field name="code"/>
<field name="name"/>
<field name="type"/>
<field name="active"/>
</group>
<group name="policies"
string="Policies">
<field name="receipt_policy"/>
<field name="delivery_policy"/>
</group>
<group name="inbound" string="Inbound">
<field name="in_route_id"/>
<field name="in_warehouse_id"/>
<field name="location_id"
domain="[('usage', '=', 'internal')]"/>
<field name="customer_to_supplier"
attrs="{'invisible':[('type', '=', 'customer')]}"/>
</group>
<group name="outbound" string="Outbound">
<field name="out_route_id"/>
<field name="out_warehouse_id"/>
<field name="supplier_to_customer"
attrs="{'invisible':[('type', '=', 'supplier')]}"/>
</group>
<record id="rma_operation_form" model="ir.ui.view">
<field name="name">rma.operation.form</field>
<field name="model">rma.operation</field>
<field name="arch" type="xml">
<form string="RMA Operations">
<group colspan="4" col="2">
<group name="description"
string="Description">
<field name="code"/>
<field name="name"/>
<field name="type"/>
<field name="active"/>
</group>
</form>
</field>
</record>
<group name="policies"
string="Policies">
<field name="receipt_policy"/>
<field name="delivery_policy"/>
</group>
<group name="inbound" string="Inbound">
<field name="in_route_id"/>
<field name="in_warehouse_id"/>
<field name="location_id"
domain="[('usage', '=', 'internal')]"/>
<field name="customer_to_supplier"
attrs="{'invisible':[('type', '=', 'customer')]}"/>
</group>
<group name="outbound" string="Outbound">
<field name="out_route_id"/>
<field name="out_warehouse_id"/>
<field name="supplier_to_customer"
attrs="{'invisible':[('type', '=', 'supplier')]}"/>
</group>
</group>
</form>
</field>
</record>
<record id="action_rma_operation_customer" model="ir.actions.act_window">
<field name="name">Customer Operations</field>
<field name="res_model">rma.operation</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'default_type': "customer"}</field>
<field name="domain">[('type','=', 'customer')]</field>
<field name="view_id" ref="rma_operation_tree"/>
</record>
<record id="action_rma_operation_customer" model="ir.actions.act_window">
<field name="name">Customer Operations</field>
<field name="res_model">rma.operation</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'default_type': "customer"}</field>
<field name="domain">[('type','=', 'customer')]</field>
<field name="view_id" ref="rma_operation_tree"/>
</record>
<record id="action_rma_operation_supplier" model="ir.actions.act_window">
<field name="name">Supplier Operations</field>
<field name="res_model">rma.operation</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'default_type': "supplier"}</field>
<field name="domain">[('type','=', 'supplier')]</field>
<field name="view_id" ref="rma_operation_tree"/>
</record>
<record id="action_rma_operation_supplier" model="ir.actions.act_window">
<field name="name">Supplier Operations</field>
<field name="res_model">rma.operation</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'default_type': "supplier"}</field>
<field name="domain">[('type','=', 'supplier')]</field>
<field name="view_id" ref="rma_operation_tree"/>
</record>
<menuitem id="menu_rma_operation_customer"
name="Customer Operations"
groups="rma.group_rma_manager"
sequence="35"
parent="rma.menu_rma_config"
action="action_rma_operation_customer"/>
<menuitem id="menu_rma_operation_customer"
name="Customer Operations"
groups="rma.group_rma_manager"
sequence="35"
parent="rma.menu_rma_config"
action="action_rma_operation_customer"/>
<menuitem id="menu_rma_operation_supplier"
name="Supplier Operations"
groups="rma.group_rma_manager"
sequence="40"
parent="rma.menu_rma_config"
action="action_rma_operation_supplier"/>
</data>
<menuitem id="menu_rma_operation_supplier"
name="Supplier Operations"
groups="rma.group_rma_manager"
sequence="40"
parent="rma.menu_rma_config"
action="action_rma_operation_supplier"/>
</odoo>

14
rma/views/rma_order_line_view.xml Normal file → Executable file
View File

@@ -83,13 +83,6 @@
<field name="out_shipment_count" widget="statinfo"
string="Deliveries"/>
</button>
<button type="object" name="action_view_procurements"
class="oe_stat_button"
icon="fa-warning"
groups="stock.group_stock_user">
<field name="procurement_count" widget="statinfo"
string="Proc. Exceptions"/>
</button>
</div>
<div class="oe_title" name="title">
<h1>
@@ -242,13 +235,6 @@
icon="fa-pencil-square-o"
string="Origin Inv">
</button>
<button type="object" name="action_view_procurements"
class="oe_stat_button"
icon="fa-warning"
groups="stock.group_stock_user">
<field name="procurement_count" widget="statinfo"
string="Exceptions"/>
</button>
</div>
<div class="oe_title" name="title">
<h1>

550
rma/views/rma_order_view.xml Normal file → Executable file
View File

@@ -1,299 +1,295 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_rma_tree" model="ir.ui.view">
<field name="name">rma.order.tree</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<tree string="RMA">
<field name="name"/>
<field name="reference"/>
<field name="partner_id" groups="base.group_user" string="Customer"/>
<field name="date_rma"/>
</tree>
</field>
</record>
<record id="view_rma_tree" model="ir.ui.view">
<field name="name">rma.order.tree</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<tree string="RMA">
<field name="name"/>
<record id="view_rma_supplier_tree" model="ir.ui.view">
<field name="name">rma.order.supplier.tree</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<tree string="RMA">
<field name="name"/>
<field name="reference"/>
<field name="partner_id" groups="base.group_user"
string="Supplier"/>
<field name="date_rma"/>
</tree>
</field>
</record>
<record id="view_rma_form" model="ir.ui.view">
<field name="name">rma.order.form</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<form string="RMA">
<header/>
<sheet name='rma' string="RMA">
<div class="oe_button_box" name="button_box">
<button type="object" name="action_view_in_shipments"
class="oe_stat_button"
icon="fa-truck"
groups="stock.group_stock_user">
<field name="in_shipment_count" widget="statinfo"
string="Shipments"/>
</button>
<button type="object" name="action_view_out_shipments"
class="oe_stat_button"
icon="fa-truck"
groups="stock.group_stock_user">
<field name="out_shipment_count" widget="statinfo"
string="Deliveries"/>
</button>
<button type="object" name="action_view_lines"
class="oe_stat_button"
icon="fa-list"
groups="rma.group_rma_customer_user">
<field name="line_count" widget="statinfo"
string="RMA Lines"/>
</button>
<button type="object" name="action_view_supplier_lines"
class="oe_stat_button"
attrs="{'invisible':[('supplier_line_count', '=', 0)]}"
icon="fa-list"
groups="rma.group_rma_supplier_user">
<field name="supplier_line_count" widget="statinfo"
string="Rel. RMA Lines"/>
</button>
</div>
<div class="oe_title" name="title">
<h1>
<field name="name"/>
</h1>
</div>
<group name="partner">
<field name="partner_id"
domain="[('customer','=',True)]"
string="Customer"
colspan="4"
/>
</group>
<group name="info">
<field name="reference"/>
<field name="partner_id" groups="base.group_user" string="Customer"/>
<field name="date_rma"/>
</tree>
</field>
</record>
</group>
<notebook colspan="4">
<page string="RMA Lines" name="lines">
<field name="rma_line_ids" context="{'default_rma_id': active_id,
'default_partner_id': partner_id,
'hide_title': True}">
<tree string="RMA Lines" name="lines">
<field name="sequence" widget="handle"/>
<field name="state" invisible="True"/>
<field name="product_id"/>
<field name="lot_id" groups="stock.group_production_lot"/>
<field name="name"/>
<field name="uom_id" groups="product.group_uom"/>
<field name="operation_id"/>
<field name="product_qty"/>
<field name="price_unit"/>
</tree>
</field>
</page>
<page name="other_info" string="Other Info">
<group name="company">
<field name="company_id"
groups="base.group_multi_company"/>
</group>
<group name="comments">
<field name="comment"/>
<field name="type" readonly="1"/>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="view_rma_supplier_tree" model="ir.ui.view">
<field name="name">rma.order.supplier.tree</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<tree string="RMA">
<field name="name"/>
<field name="reference"/>
<field name="partner_id" groups="base.group_user"
<record id="view_rma_supplier_form" model="ir.ui.view">
<field name="name">rma.order.supplier.form</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<form string="RMA">
<header/>
<sheet string="RMA">
<div class="oe_button_box" name="button_box">
<button type="object" name="action_view_in_shipments"
class="oe_stat_button"
icon="fa-truck"
groups="stock.group_stock_user">
<field name="in_shipment_count" widget="statinfo"
string="Shipments"/>
</button>
<button type="object" name="action_view_out_shipments"
class="oe_stat_button"
icon="fa-truck"
groups="stock.group_stock_user">
<field name="out_shipment_count" widget="statinfo"
string="Deliveries"/>
</button>
<button type="object" name="action_view_lines"
class="oe_stat_button"
icon="fa-list"
groups="rma.group_rma_supplier_user">
<field name="line_count" widget="statinfo"
string="RMA Lines"/>
</button>
</div>
<div class="oe_title" name="title">
<h1>
<field name="name"/>
</h1>
</div>
<group name="partner">
<field name="partner_id"
domain="[('supplier','=',True)]"
string="Supplier"/>
<field name="date_rma"/>
</tree>
</field>
</record>
<record id="view_rma_form" model="ir.ui.view">
<field name="name">rma.order.form</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<form string="RMA">
<header/>
<sheet name='rma' string="RMA">
<div class="oe_button_box" name="button_box">
<button type="object" name="action_view_in_shipments"
class="oe_stat_button"
icon="fa-truck"
groups="stock.group_stock_user">
<field name="in_shipment_count" widget="statinfo"
string="Shipments"/>
</button>
<button type="object" name="action_view_out_shipments"
class="oe_stat_button"
icon="fa-truck"
groups="stock.group_stock_user">
<field name="out_shipment_count" widget="statinfo"
string="Deliveries"/>
</button>
<button type="object" name="action_view_lines"
class="oe_stat_button"
icon="fa-list"
groups="rma.group_rma_customer_user">
<field name="line_count" widget="statinfo"
string="RMA Lines"/>
</button>
<button type="object" name="action_view_supplier_lines"
class="oe_stat_button"
attrs="{'invisible':[('supplier_line_count', '=', 0)]}"
icon="fa-list"
groups="rma.group_rma_supplier_user">
<field name="supplier_line_count" widget="statinfo"
string="Rel. RMA Lines"/>
</button>
</div>
<div class="oe_title" name="title">
<h1>
<field name="name"/>
</h1>
</div>
<group name="partner">
<field name="partner_id"
domain="[('customer','=',True)]"
string="Customer"
colspan="4"
/>
</group>
<group name="info">
</group>
<group>
<group col="4">
<field name="reference"/>
<field name="date_rma"/>
</group>
<notebook colspan="4">
<page string="RMA Lines" name="lines">
<field name="rma_line_ids" context="{'default_rma_id': active_id,
'default_partner_id': partner_id,
'hide_title': True}">
<tree string="RMA Lines" name="lines">
<field name="sequence" widget="handle"/>
<field name="state" invisible="True"/>
<field name="product_id"/>
<field name="lot_id" groups="stock.group_production_lot"/>
<field name="name"/>
<field name="uom_id" groups="product.group_uom"/>
<field name="operation_id"/>
<field name="product_qty"/>
<field name="price_unit"/>
</tree>
</field>
</page>
<page name="other_info" string="Other Info">
<group name="company">
<field name="company_id"
groups="base.group_multi_company"/>
</group>
<group name="comments">
<field name="comment"/>
<field name="type" readonly="1"/>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="view_rma_supplier_form" model="ir.ui.view">
<field name="name">rma.order.supplier.form</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<form string="RMA">
<header/>
<sheet string="RMA">
<div class="oe_button_box" name="button_box">
<button type="object" name="action_view_in_shipments"
class="oe_stat_button"
icon="fa-truck"
groups="stock.group_stock_user">
<field name="in_shipment_count" widget="statinfo"
string="Shipments"/>
</button>
<button type="object" name="action_view_out_shipments"
class="oe_stat_button"
icon="fa-truck"
groups="stock.group_stock_user">
<field name="out_shipment_count" widget="statinfo"
string="Deliveries"/>
</button>
<button type="object" name="action_view_lines"
class="oe_stat_button"
icon="fa-list"
groups="rma.group_rma_supplier_user">
<field name="line_count" widget="statinfo"
string="RMA Lines"/>
</button>
</div>
<div class="oe_title" name="title">
<h1>
<field name="name"/>
</h1>
</div>
<group name="partner">
<field name="partner_id"
domain="[('supplier','=',True)]"
string="Supplier"/>
</group>
<group>
<group col="4">
<field name="reference"/>
<field name="date_rma"/>
</group>
<notebook colspan="4">
<page string="RMA Lines" name="lines">
<field name="rma_line_ids"
context="{'form_view_ref':'rma.view_rma_line_supplier_form',
'default_rma_id': active_id,
'default_partner_id': partner_id,
'supplier': 1,
'hide_title': True}">
<tree string="RMA Lines">
<field name="sequence" widget="handle"/>
<field name="state" invisible="True"/>
<field name="name"/>
<field name="product_id"/>
<field name="lot_id" groups="stock.group_production_lot"/>
<field name="name"/>
<field name="uom_id" groups="product.group_uom"/>
<field name="operation_id"/>
<field name="product_qty"/>
<field name="origin"/>
</tree>
</field>
</page>
<page name="other_info" string="Other Info">
<group name="company">
<field name="company_id"
groups="base.group_multi_company"/>
</group>
</group>
<notebook colspan="4">
<page string="RMA Lines" name="lines">
<field name="rma_line_ids"
context="{'form_view_ref':'rma.view_rma_line_supplier_form',
'default_rma_id': active_id,
'default_partner_id': partner_id,
'supplier': 1,
'hide_title': True}">
<tree string="RMA Lines">
<field name="sequence" widget="handle"/>
<field name="state" invisible="True"/>
<field name="name"/>
<field name="product_id"/>
<field name="lot_id" groups="stock.group_production_lot"/>
<field name="name"/>
<field name="uom_id" groups="product.group_uom"/>
<field name="operation_id"/>
<field name="product_qty"/>
<field name="origin"/>
</tree>
</field>
</page>
<page name="other_info" string="Other Info">
<group name="company">
<field name="company_id"
groups="base.group_multi_company"/>
</group>
<group name="comments">
<field name="comment"/>
<field name="type" readonly="1"/>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<group name="comments">
<field name="comment"/>
<field name="type" readonly="1"/>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="view_rma_rma_filter" model="ir.ui.view">
<field name="name">rma.order.select</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<search string="Search RMA">
<field name="reference"/>
<field name="name"/>
<field name="partner_id"/>
<separator/>
<group expand="0" string="Group By">
<filter name="partner" string="Partner" domain="[]"
context="{'group_by':'partner_id'}"/>
<filter name="rma_date" string="RMA Date" domain="[]"
context="{'group_by':'rma_date'}"/>
</group>
</search>
</field>
</record>
<record id="view_rma_rma_filter" model="ir.ui.view">
<field name="name">rma.order.select</field>
<field name="model">rma.order</field>
<field name="arch" type="xml">
<search string="Search RMA">
<field name="reference"/>
<field name="name"/>
<field name="partner_id"/>
<separator/>
<group expand="0" string="Group By">
<filter name="partner" string="Partner" domain="[]"
context="{'group_by':'partner_id'}"/>
<filter name="rma_date" string="RMA Date" domain="[]"
context="{'group_by':'rma_date'}"/>
</group>
</search>
</field>
</record>
<record id="action_rma_customer" model="ir.actions.act_window">
<field name="name">Customer RMA Group</field>
<field name="res_model">rma.order</field>
<field name="view_type">form</field>
<field name="domain">[('type','=', 'customer')]</field>
<field name="context">{'customer':1}</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_rma_tree"/>
</record>
<record id="action_rma_customer" model="ir.actions.act_window">
<field name="name">Customer RMA Group</field>
<field name="res_model">rma.order</field>
<field name="view_type">form</field>
<field name="domain">[('type','=', 'customer')]</field>
<field name="context">{'customer':1}</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_rma_tree"/>
</record>
<record id="action_rma_supplier" model="ir.actions.act_window">
<field name="name">Supplier RMA Group</field>
<field name="res_model">rma.order</field>
<field name="view_type">form</field>
<field name="domain">[('type','=', 'supplier')]</field>
<field name="context">{'supplier':1}</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_rma_supplier_tree"/>
</record>
<record id="action_rma_supplier" model="ir.actions.act_window">
<field name="name">Supplier RMA Group</field>
<field name="res_model">rma.order</field>
<field name="view_type">form</field>
<field name="domain">[('type','=', 'supplier')]</field>
<field name="context">{'supplier':1}</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_rma_supplier_tree"/>
</record>
<record id="action_rma_supplier_tree"
model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">tree</field>
<field name="act_window_id" ref="action_rma_supplier"/>
</record>
<record id="action_rma_supplier_tree"
model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">tree</field>
<field name="act_window_id" ref="action_rma_supplier"/>
</record>
<record id="action_rma_supplier_form"
model="ir.actions.act_window.view">
<field eval="2" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="view_rma_supplier_form"/>
<field name="act_window_id" ref="action_rma_supplier"/>
</record>
<record id="action_rma_supplier_form"
model="ir.actions.act_window.view">
<field eval="2" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="view_rma_supplier_form"/>
<field name="act_window_id" ref="action_rma_supplier"/>
</record>
<menuitem id="menu_customer_rma"
name="Customer RMA"
groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"
sequence="30"
parent="stock.menu_stock_root"/>
<menuitem id="menu_customer_rma"
name="Customer RMA"
groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"
sequence="30"
parent="stock.menu_stock_root"/>
<menuitem id="menu_supplier_rma"
name="Supplier RMA"
groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"
sequence="31"
parent="stock.menu_stock_root"/>
<menuitem id="menu_supplier_rma"
name="Supplier RMA"
groups="rma.group_rma_customer_user,rma.group_rma_supplier_user"
sequence="31"
parent="stock.menu_stock_root"/>
<menuitem
id="menu_rma_act_customer"
sequence="50"
parent="menu_customer_rma"
groups="rma.group_rma_customer_user"
action="action_rma_customer"/>
<menuitem
id="menu_rma_act_customer"
sequence="50"
parent="menu_customer_rma"
groups="rma.group_rma_customer_user"
action="action_rma_customer"/>
<menuitem
id="menu_rma_act_supplier"
sequence="50"
parent="menu_supplier_rma"
groups="rma.group_rma_supplier_user"
action="action_rma_supplier"/>
<menuitem
id="menu_rma_act_supplier"
sequence="50"
parent="menu_supplier_rma"
groups="rma.group_rma_supplier_user"
action="action_rma_supplier"/>
<menuitem id="menu_rma_config"
name="RMA"
groups="rma.group_rma_manager"
sequence="30"
parent="stock.menu_stock_config_settings"/>
</data>
<menuitem id="menu_rma_config"
name="RMA"
groups="rma.group_rma_manager"
sequence="30"
parent="stock.menu_stock_config_settings"/>
</odoo>

82
rma/views/stock_view.xml Normal file → Executable file
View File

@@ -1,55 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_move_form" model="ir.ui.view">
<field name="name">rma.move.form</field>
<field name="model">stock.move</field>
<field name="inherit_id" ref="stock.view_move_form" />
<field name="arch" type="xml">
<group name="destination_grp" position="after">
<group name="rma">
<field name="rma_line_id"/>
</group>
<record id="view_move_form" model="ir.ui.view">
<field name="name">rma.move.form</field>
<field name="model">stock.move</field>
<field name="inherit_id" ref="stock.view_move_form" />
<field name="arch" type="xml">
<group name="origin_grp" position="after">
<group name="rma">
<field name="rma_line_id"/>
</group>
</field>
</record>
</group>
</field>
</record>
<record id="view_move_picking_form" model="ir.ui.view" >
<field name="name">stock.move.form</field>
<field name="model">stock.move</field>
<field name="inherit_id" ref="stock.view_move_picking_form" />
<field name="arch" type="xml">
<xpath expr="//group[1]" position="inside">
<group name="rma" colspan="4">
<field name="rma_line_id"/>
</group>
</xpath>
</field>
</record>
<record id="view_move_picking_form" model="ir.ui.view" >
<field name="name">stock.move.form</field>
<field name="model">stock.move</field>
<field name="inherit_id" ref="stock.view_move_picking_form" />
<field name="arch" type="xml">
<xpath expr="//group[1]" position="inside">
<group name="rma" colspan="4">
<field name="rma_line_id"/>
</group>
</xpath>
</field>
</record>
<record id="stock_location_route_form_view_inherit_rma_stock" model="ir.ui.view">
<field name="name">stock.location.route.form</field>
<field name="inherit_id" ref="stock.stock_location_route_form_view"/>
<field name="model">stock.location.route</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='warehouse_ids']" position="before">
<field name="rma_selectable" string="RMA Order Lines"/>
</xpath>
</field>
</record>
<record id="procurement_form_view" model="ir.ui.view">
<field name="name">procurement.order.form.stock.inherit</field>
<field name="model">procurement.order</field>
<field name="inherit_id"
ref="stock.view_procurement_form_stock_inherit"/>
<field name="arch" type="xml">
<field name="location_id" position="attributes">
<attribute name="domain">[('usage', '!=', 'view')]</attribute>
</field>
</field>
</record>
</data>
<record id="stock_location_route_form_view_inherit_rma_stock" model="ir.ui.view">
<field name="name">stock.location.route.form</field>
<field name="inherit_id" ref="stock.stock_location_route_form_view"/>
<field name="model">stock.location.route</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='warehouse_ids']" position="before">
<field name="rma_selectable" string="RMA Order Lines"/>
</xpath>
</field>
</record>
</odoo>

0
rma/views/stock_warehouse.xml Normal file → Executable file
View File

0
rma/wizards/__init__.py Normal file → Executable file
View File

0
rma/wizards/rma_add_stock_move.py Normal file → Executable file
View File

2
rma/wizards/rma_add_stock_move_view.xml Normal file → Executable file
View File

@@ -18,7 +18,7 @@
<field name="product_id"/>
<field name="product_uom_qty"/>
<field name="product_uom" string="Unit of Measure" groups="product.group_uom"/>
<field name="product_packaging" domain="[('product_tmpl_id','=',product_tmpl_id)]" groups="product.group_stock_packaging"/>
<field name="product_packaging" domain="[('product_id','=',product_id)]" groups="product.group_stock_packaging"/>
<field name="picking_id"/>
<field name="location_id" groups="stock.group_locations"/>
<field name="location_dest_id" groups="stock.group_locations"/>

76
rma/wizards/rma_make_picking.py Normal file → Executable file
View File

@@ -32,6 +32,7 @@ class RmaMakePicking(models.TransientModel):
lines the supplier field is empty otherwise is the unique line
supplier.
"""
context = self._context.copy()
res = super(RmaMakePicking, self).default_get(fields)
rma_line_obj = self.env['rma.order.line']
rma_line_ids = self.env.context['active_ids'] or []
@@ -51,6 +52,7 @@ class RmaMakePicking(models.TransientModel):
for line in lines:
items.append([0, 0, self._prepare_item(line)])
res['item_ids'] = items
context.update({'items_ids': items})
return res
item_ids = fields.One2many(
@@ -67,6 +69,7 @@ class RmaMakePicking(models.TransientModel):
def _get_procurement_group_data(self, item):
group_data = {
'partner_id': item.line_id.partner_id.id,
'name': item.line_id.rma_id.name or item.line_id.name,
'rma_id': item.line_id.rma_id and item.line_id.rma_id.id or False,
'rma_line_id': item.line_id.id if not item.line_id.rma_id else
@@ -116,17 +119,17 @@ class RmaMakePicking(models.TransientModel):
raise ValidationError(_("No warehouse specified"))
procurement_data = {
'name': line.rma_id and line.rma_id.name or line.name,
'group_id': group.id,
'group_id': group,
'origin': line.name,
'warehouse_id': warehouse.id,
'warehouse_id': warehouse,
'date_planned': time.strftime(DT_FORMAT),
'product_id': item.product_id.id,
'product_id': item.product_id,
'product_qty': qty,
'partner_dest_id': delivery_address_id.id,
'partner_id': delivery_address_id.id,
'product_uom': line.product_id.product_tmpl_id.uom_id.id,
'location_id': location.id,
'location_id': location,
'rma_line_id': line.id,
'route_ids': [(4, route.id)]
'route_ids': route
}
return procurement_data
@@ -140,18 +143,23 @@ class RmaMakePicking(models.TransientModel):
qty = item.qty_to_receive
else:
qty = item.qty_to_deliver
procurement_data = self._get_procurement_data(
item, group, qty, picking_type)
values = self._get_procurement_data(item, group, qty, picking_type)
# create picking
procurement = self.env['procurement.order'].create(procurement_data)
procurement.run()
return procurement.id
self.env['procurement.group'].run(
item.line_id.product_id,
qty,
item.line_id.product_id.product_tmpl_id.uom_id,
values.get('location_id'),
values.get('origin'),
values.get('origin'),
values
)
return values.get('origin')
@api.multi
def _create_picking(self):
"""Method called when the user clicks on create picking"""
picking_type = self.env.context.get('picking_type')
procurement_list = []
for item in self.item_ids:
line = item.line_id
if line.state != 'approved':
@@ -167,9 +175,7 @@ class RmaMakePicking(models.TransientModel):
raise ValidationError(
_('No deliveries needed for this operation'))
procurement = self._create_procurement(item, picking_type)
procurement_list.append(procurement)
procurements = self.env['procurement.order'].browse(procurement_list)
return procurements
return procurement
@api.model
def _get_action(self, pickings, procurements):
@@ -179,30 +185,32 @@ class RmaMakePicking(models.TransientModel):
action = self.env.ref(
'procurement.procurement_order_action_exceptions')
action = action.read()[0]
# choose the view_mode accordingly
procurement_ids = procurements.ids
if len(procurement_ids) != 1:
action['domain'] = "[('id', 'in', " + \
str(procurement_ids) + ")]"
elif len(procurements) == 1:
res = self.env.ref('procurement.procurement_form_view',
False)
action['views'] = [(res and res.id or False, 'form')]
action['res_id'] = procurement_ids[0]
if procurements:
# choose the view_mode accordingly
if len(procurements.ids) <= 1:
res = self.env.ref('procurement.procurement_form_view',
False)
action['views'] = [(res and res.id or False, 'form')]
action['res_id'] = procurements.ids[0]
else:
action['domain'] = [('id', 'in', procurements.ids)]
return action
@api.multi
def action_create_picking(self):
procurements = self._create_picking()
groups = []
for proc in procurements:
if proc.group_id:
groups.append(proc.group_id.id)
if len(groups):
procurement = self._create_picking()
pickings = False
action = self.env.ref('stock.do_view_pickings')
action = action.read()[0]
if procurement:
pickings = self.env['stock.picking'].search(
[('group_id', 'in', groups)])
action = self._get_action(pickings, procurements)
[('origin', '=', procurement)]).ids
if len(pickings) > 1:
action['domain'] = [('id', 'in', pickings)]
else:
form = self.env.ref('stock.view_picking_form', False)
action['views'] = [(form and form.id or False, 'form')]
action['res_id'] = pickings[0]
return action
@api.multi

19
rma/wizards/rma_make_picking_view.xml Normal file → Executable file
View File

@@ -115,23 +115,4 @@
</field>
</record>
<record model="ir.values" id="values_action_rma_picking_in">
<field name="model_id" ref="model_rma_order_line"/>
<field name="name">Create Incoming Shipment</field>
<field name="key2">client_action_multi</field>
<field name="value" eval="'ir.actions.act_window,' + str(ref('action_rma_picking_in'))" />
<field name="key">action</field>
<field name="model">rma.order.line</field>
</record>
<record model="ir.values" id="values_action_rma_picking_out">
<field name="model_id" ref="model_rma_order_line"/>
<field name="name">Create Delivery</field>
<field name="key2">client_action_multi</field>
<field name="value"
eval="'ir.actions.act_window,' + str(ref('action_rma_picking_out'))" />
<field name="key">action</field>
<field name="model">rma.order.line</field>
</record>
</odoo>

0
rma/wizards/rma_order_line_make_supplier_rma.py Normal file → Executable file
View File

131
rma/wizards/rma_order_line_make_supplier_rma_view.xml Normal file → Executable file
View File

@@ -2,72 +2,71 @@
<!-- Copyright 2016 Eficent Business and IT Consulting Services S.L.
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<odoo>
<data>
<record id="view_rma_order_line_make_supplier_rma"
model="ir.ui.view">
<field name="name">RMA Line Make Supplier RMA</field>
<field name="model">rma.order.line.make.supplier.rma</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Create Supplier RMA">
<separator string="Existing Supplier RMA to update:"/>
<newline/>
<group>
<field name="supplier_rma_id" domain="[('partner_id', '=', partner_id)]"/>
</group>
<newline/>
<separator
string="New RMA details:"/>
<newline/>
<group>
<field name="partner_id"/>
</group>
<newline/>
<group>
<field name="item_ids" nolabel="1" colspan="2">
<tree string="Details" editable="bottom" create="false">
<field name="line_id"
options="{'no_open': true}"/>
<field name="product_id"/>
<field name="name"/>
<field name="product_qty"/>
<field name="uom_id"
groups="product.group_uom"/>
</tree>
</field>
</group>
<newline/>
<group colspan="2">
<button name="make_supplier_rma"
string="Create/Update Supplier RMA"
type="object"
class="oe_highlight"/>
<button special="cancel" string="Cancel" class="oe_link"/>
</group>
</form>
</field>
</record>
<record id="view_rma_order_line_make_supplier_rma"
model="ir.ui.view">
<field name="name">RMA Line Make Supplier RMA</field>
<field name="model">rma.order.line.make.supplier.rma</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Create Supplier RMA">
<separator string="Existing Supplier RMA to update:"/>
<newline/>
<group>
<field name="supplier_rma_id" domain="[('partner_id', '=', partner_id)]"/>
</group>
<newline/>
<separator
string="New RMA details:"/>
<newline/>
<group>
<field name="partner_id"/>
</group>
<newline/>
<group>
<field name="item_ids" nolabel="1" colspan="2">
<tree string="Details" editable="bottom" create="false">
<field name="line_id"
options="{'no_open': true}"/>
<field name="product_id"/>
<field name="name"/>
<field name="product_qty"/>
<field name="uom_id"
groups="product.group_uom"/>
</tree>
</field>
</group>
<newline/>
<group colspan="2">
<button name="make_supplier_rma"
string="Create/Update Supplier RMA"
type="object"
class="oe_highlight"/>
<button special="cancel" string="Cancel" class="oe_link"/>
</group>
</form>
</field>
</record>
<record id="action_rma_order_line_make_supplier_rma"
model="ir.actions.act_window">
<field name="name">Create Supplier RMA Group</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">rma.order.line.make.supplier.rma</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_rma_order_line_make_supplier_rma"/>
<field name="target">new</field>
</record>
<record id="action_rma_order_line_make_supplier_rma"
model="ir.actions.act_window">
<field name="name">Create Supplier RMA Group</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">rma.order.line.make.supplier.rma</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_rma_order_line_make_supplier_rma"/>
<field name="target">new</field>
</record>
<record model="ir.values" id="rma_order_line_make_supplier_rma">
<field name="model_id" ref="model_rma_order_line" />
<field name="name">Create Supplier RMA Group</field>
<field name="key2">client_action_multi</field>
<field name="value"
eval="'ir.actions.act_window,' + str(ref('action_rma_order_line_make_supplier_rma'))" />
<field name="key">action</field>
<field name="model">rma.order.line</field>
</record>
<!--record model="ir.values" id="rma_order_line_make_supplier_rma">
<field name="model_id" ref="model_rma_order_line" />
<field name="name">Create Supplier RMA Group</field>
<field name="key2">client_action_multi</field>
<field name="value"
eval="'ir.actions.act_window,' + str(ref('action_rma_order_line_make_supplier_rma'))" />
<field name="key">action</field>
<field name="model">rma.order.line</field>
</record-->
<record id="view_rma_line_supplier_rma_button_form" model="ir.ui.view">
<field name="name">rma.order.line.supplier.rma.form</field>
@@ -82,8 +81,4 @@
</header>
</field>
</record>
</data>
</odoo>

2
rma/wizards/stock_config_settings.py Normal file → Executable file
View File

@@ -6,7 +6,7 @@ from odoo import models, fields
class StockConfigSettings(models.TransientModel):
_inherit = 'stock.config.settings'
_inherit = 'res.config.settings'
group_rma_delivery_address = fields.Selection([
(0, "Invoicing and shipping addresses are always the same "

35
rma/wizards/stock_config_settings.xml Normal file → Executable file
View File

@@ -1,17 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_stock_config_settings_rma" model="ir.ui.view">
<field name="name">stock.config.settings.rma</field>
<field name="model">stock.config.settings</field>
<field name="inherit_id" ref="stock.view_stock_config_settings"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='shipping']" position="after">
<group string="Return Merchandise Authorization">
<field name="group_rma_delivery_address" widget="radio"/>
</group>
</xpath>
</field>
</record>
</data>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">stock.config.settings.rma</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="stock.res_config_settings_view_form"/>
<field name="arch" type="xml">
<div id="production_lot_info" position="after">
<h2>Return Merchandise Authorization</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-12 o_setting_box">
<div class="o_setting_right_pane">
<div class="content-group">
<div class="mt16">
<field name="group_rma_delivery_address" class="o_light_label" widget="radio"/>
</div>
</div>
</div>
</div>
</div>
</div>
</field>
</record>
</odoo>