Skip to Content
Menu
This question has been flagged

Hi there! I'm developing a custom module that allows users to add related stock moves to invoices. I want each one of this related stock moves added as an invoice line to the current invoice so I'm trying to create an invoice_line_ids from this related stock moves but its not working. I've been doing some modifications to the code and I get several errors, but I can't understand why the code is not working properly.


Here is my custom view

<odoo>
	<record id="invoice_stock_moves" model="ir.ui.view">
	    <field name="name">account.invoice.related_stock_moves</field>
	    <field name="model">account.invoice</field>
	    <field name="inherit_id" ref="account.invoice_supplier_form"/>
	    <field name="arch" type="xml">
	        <xpath expr="//page" position="after">
				<page string="Movimientos asociados" attrs="{'invisible': [('partner_id', '=', False)]}">
					<field name="related_stock_moves" widget="many2many" options="{'no_create': True}" domain="['&amp;', ('state','=','done'), ('picking_partner_id','=',context.get('partner_id')), '&amp;', ('x_invoice_id','=',False)]" attrs="{'readonly':[('state','not in',('draft',))]}">
					  <tree>
						<field name="state" invisible="1"/>
						<field name="date" />
						<field name="picking_partner_id" invisible="1"/>
						<field name="reference" />
						<field name="product_id" />
						<field name="product_uom_qty" string="Cantidad" />
						<field name="product_uom" />
					  </tree>
					</field>
				</page>
	        </xpath>
	    </field>
	</record>
</odoo>


And here my .py defining the model

# -*- coding: utf-8 -*-
from odoo import api, fields, models

import logging
_logger = logging.getLogger(__name__)

class Move(models.Model):
    _inherit = 'stock.move'


    x_invoice_id = fields.Many2one('account.invoice',
        string="Factura de referencia", ondelete='set null')


class Invoice(models.Model):
    _inherit = 'account.invoice'

    related_stock_moves = fields.One2many('stock.move',
        'x_invoice_id', 'related_stock_moves', string="Movimiento asociado")


    invoice_line_ids = fields.One2many('account.invoice.line',
        'invoice_id', string="Líneas de la factura", compute='_add_lines')

## Retrieve product_id and product_uom_qty
    @api.depends('related_stock_moves')
    @api.one
    def _add_lines(self):
        for move in self.related_stock_moves:
            self.env['account.invoice.line'].create({
                    'account_id': self.account_id.id,
                    'invoice_id': self.id,
                    'product_id': move.product_id.id,
                    'quantity': move.product_uom_qty,
                    'name': move.product_id.description,
                    'price_unit': '0.0'
            })

I'm not sure if I should be using a computed field, I want the invoice lines added when a related stock move is added. 


Any help is kindly appreciated, thanks for your time <3

Avatar
Discard

I have updated my answer for your requirement, please check to it.

Best Answer

Hello,

You can do this by using a button function.

In .py

@api.multi

def action_add_lines(self):

    invoice_line_obj = self.env['account.invoice.line']

    for each in self:

        for move in each.related_stock_moves:

            invoice_line_obj.create({

            'account_id': each.account_id.id, 
            'invoice_id': each.id,
            'product_id': move.product_id.id,
            'quantity': move.product_uom_qty,
            'name': move.product_id.description,
            'price_unit': '0.0'

})            
    return True

In xml,

You can define the button using xpath since your inheriting account.invoice,

<record model="ir.ui.view" id="invoice_form_inherit">

            <field name="name">account.invoice.form</field>

            <field name="model">account.invoice</field>

            <field name="inherit_id" ref="account.invoice_form"/>

            <field name="arch" type="xml">

            <xpath expr="/form/header/button[@name='action_invoice_open']" position="after">

                <button name="action_add_lines" string="Add Lines" type="object" class="oe_highlight" states="draft"/>

            </xpath>

            </field>

</record>


Okay without a button function you can do it by onchange of related_stock_moves field,

class Invoice(models.Model):

    _inherit = 'account.invoice'

    

    @api.onchange('related_stock_moves')   

    def onchange_related_stock_moves(self):

        if self.related_stock_moves:

            new_lines = self.env['account.invoice.line']

            for move in self.related_stock_moves - self.invoice_line_ids.mapped('stock_move_id'):

                data = {

                    'account_id': self.account_id.id, 

                    'invoice_id': self.id, 

                    'product_id': move.product_id.id, 

                    'quantity': move.product_uom_qty, 

                    'name': move.product_id.description, 

                    'price_unit': 0.0

                    'stock_move_id': move.id

                }

                new_line = new_lines.new(data)

                new_lines += new_line

            self.invoice_line_ids = new_lines

        return {}

        

class InvoiceLine(models.Model):

    _inherit = 'account.invoice.line'


    stock_move_id = fields.Many2one('stock.move', string='Stock Move')


In order to do this, you should have a many2one link of stock move in account.invoice.line

Avatar
Discard
Author Best Answer

Thanks @Karthikeyan N R, I've been able to add the invoice lines with your action button. I'll be trying now to do this without requiring a button click from the user and I will share the updates here :)

status of my code atm

.py
from odoo import api, fields, models

import logging
_logger = logging.getLogger(__name__)

class Move(models.Model):
    _inherit = 'stock.move'


    x_invoice_id = fields.Many2one('account.invoice',
        string="Factura de referencia", ondelete='set null')


class Invoice(models.Model):
    _inherit = 'account.invoice'

    related_stock_moves = fields.One2many('stock.move',
        'x_invoice_id', string="Movimiento asociado")


    @api.multi
    def action_add_lines(self):
        invoice_line_obj = self.env['account.invoice.line']
        for each in self:
            for move in each.related_stock_moves:
                rec = {
                    'account_id': each.account_id.id,
                    'invoice_id': each.id,
                    'product_id': move.product_id.id,
                    'quantity': move.product_uom_qty,
                    'name': move.product_id.name,
                    'price_unit': '0.0'
                }
                invoice_line_obj.create(rec)
        return True
my custom view

<odoo>
	<record id="invoice_stock_moves" model="ir.ui.view">
	    <field name="name">account.invoice.related_stock_moves</field>
	    <field name="model">account.invoice</field>
	    <field name="inherit_id" ref="account.invoice_supplier_form"/>
	    <field name="arch" type="xml">
	        <xpath expr="//page" position="after">
				<page string="Movimientos asociados" attrs="{'invisible': [('partner_id', '=', False)]}">
					<field name="related_stock_moves" widget="many2many" options="{'no_create': True}" domain="['&amp;', ('state','=','done'), ('picking_partner_id','=',context.get('partner_id')), '&amp;', ('x_invoice_id','=',False)]" attrs="{'readonly':[('state','not in',('draft',))]}">
					  <tree>
						<field name="state" invisible="1"/>
						<field name="date" />
						<field name="picking_partner_id" invisible="1"/>
						<field name="reference" />
						<field name="product_id" />
						<field name="product_uom_qty" string="Cantidad" />
						<field name="product_uom" />
					  </tree>
					</field>
					<button name="action_add_lines" string="Añadir a factura" type="object" class="oe_highlight" states="draft"/>
				</page>
	        </xpath>
	</record>
</odoo>
I'm still trying to understand how to do this without requiring a button click
Avatar
Discard
Related Posts Replies Views Activity
3
Mar 19
2328
1
May 20
5384
1
Jan 19
4805
3
Dec 18
7542
0
Nov 18
4710