我试图在odoo 15的发票模块产品线中获取定制模块的产品线

  • 本文关键字:产品线 模块 获取 odoo odoo odoo-15
  • 更新时间 :
  • 英文 :


我继承了账户。移动模型并在其中添加job_card_id字段(many2one),如下所示:

形象下面是所选工作卡的图片:

形象下面给出的是我的模型的代码,我也试着在字段下面创建函数:

class JobCard(models.Model):
_name = "job.card"
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "Job Card Master"
_rec_name = 'job_card_number'
job_card_number = fields.Char(string='Job Card No.', readonly=True)
customer_id = fields.Many2one('res.partner', string="Customer Name", tracking=True)
vehicle_id = fields.Many2one('res.partner.line', string="Vehicle", tracking=True,
domain="[('x_customer_id','=',customer_id)]")
date_time_of_invoice = fields.Datetime(string='Date & Time of Invoice', tracking=True, default=fields.Datetime.now)
start_date_time = fields.Datetime(string='Start Date & Time', tracking=True)
end_date_time = fields.Datetime(string='End Date & Time', tracking=True)
priority = fields.Selection([
('0', 'Normal'),
('1', 'Low'),
('2', 'High'),
('3', 'Very High')], string="Priority")  # priority widget
state = fields.Selection([
('draft', 'Draft'),
('in_progress', 'In Progress'),
('done', 'Done'),
('cancel', 'Cancelled')], string="Status", default='draft', required=True)  # status bar
active = fields.Boolean(string="Active", default=True, tracking=True)
x_product_ids = fields.Many2many('job.card.line', 'product_id', string="Job Card Details")
x_quantity_ids = fields.One2many('job.card.line', 'quantity', string="Job Card Details")
x_price_ids = fields.One2many('job.card.line', 'price', string="Job Card Details")
x_total_ids = fields.One2many('job.card.line', 'total', string="Job Card Details")
x_employee_ids = fields.One2many('job.card.line', 'employee_id', string="Job Card Details")
x_job_card_ids = fields.One2many('job.card.line', 'job_card_id', string="Job Card Details")
job_card_count = fields.Integer(compute='compute_job_card_count', string='Job Card Count')
def get_invoice_line_vals(self):
vals_list = []
for job_card_line in self.x_product_ids:
vals_list.append({
' price_unit': job_card_line.price_unit,
'quantity': job_card_line.quantity
})
return vals_list

下面是继承模型的代码,还增加了onchange函数:

class CustomInvoice(models.Model):
_inherit = "account.move"
job_card_id = fields.Many2one('job.card', string="Job Card", domain="[('customer_id','=',partner_id)]",
tracking=True)
@api.onchange('job_card_id')
def _onchange_job_card_id(self):
# creates your invoice lines vals according to your values
invoice_lines_vals = self.job_card_id.get_invoice_line_vals()
self.update({'invoice_line_ids': [(5, 0)] + [(0, 0, vals) for vals in invoice_lines_vals]})

下面是我的名片行代码:

class JobCardLine(models.Model):
_name = "job.card.line"
job_card_id = fields.Many2one('job.card', string="Job Card Id", tracking=True)
product_id = fields.Many2one('product.template', string="Product", tracking=True)
quantity = fields.Integer(string="Quantity", tracking=True)
# price = fields.Char(string="Price")
price = fields.Float(string="Price")
total = fields.Integer(string='Total', compute='_compute_total', tracking=True,
help="This field will be calculated from quantity and price !")
employee_id = fields.Many2one('hr.employee', string="Employee", tracking=True)
x_job_card_id = fields.Many2one('res.partner', string="Vehicle Details")
@api.onchange('product_id')
def _on_change_product_id(self):
self.price = self.product_id.list_price
@api.depends('quantity', 'price')
def _compute_total(self):
print("self........", self)
for rec in self:
rec.total = rec.quantity * rec.price

其实我是想在选择作业卡时,自动将所选作业卡的产品线添加到Invoice产品线中。

但是我得到错误,如下所示:

误差

您得到了这个错误,因为您在job.card模型中没有名为line_ids的字段。也许你需要把它改成x_product_ids

TyprError(int对象不可迭代)是由传递给写方法的第一个元组引起的:

(6, 0, 0)

Odoo期望第三个形参是可迭代的。如果您需要清除列表,请使用(5,0)

避免在onchange函数中调用write方法。您可以在官方onchange文档中阅读以下危险通知:

危险

由于@onchange返回伪记录的记录集,在上述
记录集上调用任何一个
CRUD方法(create(),read(),write(),unlink())是未定义的行为,因为它们可能还不存在
数据库中。

相反,只需像上面的示例那样设置记录的字段,或者调用
update()方法。

编辑:

get_invoice_line_vals函数有两个错误

1/ValueError:

Invalid field ' price_unit' on model 'account.move.line'

你需要去掉开头的空格。

2/AttributeError:

'job.card.line' object has no attribute 'price_unit'.

请使用price字段。

最新更新