Odoo 如何通过代码将 account.move.line 插入到 account.move?

Odoo How to insert account.move.line to account.move by code?

我用代码插入account.move.line到account.move时遇到问题

一直说'Cannot create unbalanced journal entry.'。

是否有办法通过代码将 account.move.line 添加到 account.move?

ps。 debit_line 和 credit_line 的贷方和借方金额相同。

以下是我的代码:

 # -*- coding: utf-8 -*-

 from odoo import models, fields, api
 import logging

 _logger = logging.getLogger(__name__)

 class JobLine(models.Model):
     _inherit = 'product.job_line'
     value = fields.Float()
     journal_entry = fields.Many2one('account.move')
     cost = fields.Float()

     @api.onchange('is_finish')
     def update_journal(self):
         if self.is_finish:
            revenue_account = self.product.revenue_account
             deferred_receivable_account = self.env['ir.values'].get_default('job.config.settings','deferred_receivable_account')
             journal = self.env['ir.values'].get_default('job.config.settings','journal')
            if not self.journal_entry :
                self.journal_entry = self.env['account.move'].create({
                    'journal_id': journal,
                    'partner_id': self.container.partner.id,
                    'date': fields.Date.context_today(self)
                    })
             # if self.container.order.invoice_count > 0:
             #  _logger.info('Type 1  : ')
             # else:
            #   _logger.info('Type 2  : ')
            debit_line = self.env['account.move.line'].create({
                 'move_id': self.journal_entry.id,
                 'account_id': deferred_receivable_account,
                'partner_id': self.container.partner.id,
                'name': 'Finish '+self.job_name,
                'debit': self.cost
            })
            credit_line = self.env['account.move.line'].create({
                'move_id': self.journal_entry.id,
                'account_id': self.product.revenue_account,
                'partner_id': self.container.partner.id,
                'name': 'Finish '+self.job_name,
                'credit': self.cost
             })
             _logger.info(str(debit_line)+' '+str(credit_line))
            self.journal_entry.line_ids+=debit_line
            self.journal_entry.line_ids+=credit_line
        else:
            self.journal_entry.unlink()
            _logger.info('No finish Yet '+str(self.journal_entry))

而不是这个

credit_line = self.env['account.move.line'].create({
            'move_id': self.journal_entry.id,
            'account_id': self.product.revenue_account,
            'partner_id': self.container.partner.id,
            'name': 'Finish '+self.job_name,
            'credit': self.cost
         })

试试这个

credit_line = self.env['account.move.line'].with_context(
            check_move_validity=False).create({
            'move_id': self.journal_entry.id,
            'account_id': self.product.revenue_account,
            'partner_id': self.container.partner.id,
            'name': 'Finish '+self.job_name,
            'credit': self.cost
         })

通过在上下文中将 check_move_validity 传递给 False,可以防止模型在创建移动线后检查数据一致性。 link to source code

希望他能帮上忙:-)