Files
suite/rma/wizard/rma_make_rtv.py

91 lines
4.1 KiB
Python

# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import api, fields, models
from odoo.exceptions import UserError
class RMAMakeRTV(models.TransientModel):
_name = 'rma.make.rtv'
_description = 'Make RTV Batch'
partner_id = fields.Many2one('res.partner', string='Vendor')
partner_shipping_id = fields.Many2one('res.partner', string='Shipping Address')
rma_line_ids = fields.One2many('rma.make.rtv.line', 'rma_make_rtv_id', string='Lines')
@api.model
def default_get(self, fields):
result = super().default_get(fields)
if 'rma_line_ids' in fields and self._context.get('active_model') == 'rma.rma' and self._context.get('active_ids'):
active_ids = self._context.get('active_ids')
rmas = self.env['rma.rma'].browse(active_ids)
result['rma_line_ids'] = [(0, 0, {
'rma_id': r.id,
'rma_state': r.state,
'rma_claim_number': r.claim_number,
}) for r in rmas]
rma_partner = rmas.mapped('partner_id')
if rma_partner:
result['partner_id'] = rma_partner[0].id
return result
def create_batch(self):
self.ensure_one()
if self.rma_line_ids.filtered(lambda rl: rl.rma_id.state != 'draft'):
raise UserError('All RMAs must be in the draft state.')
rma_partner = self.rma_line_ids.mapped('rma_id.partner_id')
if rma_partner and len(rma_partner) != 1:
raise UserError('All RMAs must be for the same partner.')
elif not rma_partner and not self.partner_id:
raise UserError('Please select a Vendor')
elif not rma_partner:
rma_partner = self.partner_id
rma_partner_shipping = self.partner_shipping_id or rma_partner
# update all RMA's to the currently selected vendor
self.rma_line_ids.mapped('rma_id').write({
'partner_id': rma_partner.id,
'partner_shipping_id': rma_partner_shipping.id,
})
if len(self.rma_line_ids.mapped('rma_id.template_id')) != 1:
raise UserError('All RMAs must be of the same template.')
in_values = None
out_values = None
for rma in self.rma_line_ids.mapped('rma_id'):
if rma.template_id.create_in_picking:
if not in_values:
in_values = rma.template_id._values_for_in_picking(rma)
in_values['origin'] = [in_values['origin']]
else:
other_in_values = rma.template_id._values_for_in_picking(rma)
in_values['move_lines'] += other_in_values['move_lines']
if rma.template_id.create_out_picking:
if not out_values:
out_values = rma.template_id._values_for_out_picking(rma)
out_values['origin'] = [out_values['origin']]
else:
other_out_values = rma.template_id._values_for_out_picking(rma)
out_values['move_lines'] += other_out_values['move_lines']
in_picking_id = False
out_picking_id = False
if in_values:
in_values['origin'] = ', '.join(in_values['origin'])
in_picking = self.env['stock.picking'].sudo().create(in_values)
in_picking_id = in_picking.id
if out_values:
out_values['origin'] = ', '.join(out_values['origin'])
out_picking = self.env['stock.picking'].sudo().create(out_values)
out_picking_id = out_picking.id
rmas = self.rma_line_ids.mapped('rma_id').with_context(rma_in_picking_id=in_picking_id, rma_out_picking_id=out_picking_id)
# action_confirm known to be multi-aware and makes only one context
rmas.action_confirm()
class RMAMakeRTVLine(models.TransientModel):
_name = 'rma.make.rtv.line'
_description = 'Make RTV Batch RMA'
rma_make_rtv_id = fields.Many2one('rma.make.rtv')
rma_id = fields.Many2one('rma.rma')
rma_state = fields.Selection(related='rma_id.state')
rma_claim_number = fields.Char(related='rma_id.claim_number', readonly=False)