问题描述
odoo社区版本11.0-20190311
我有一个父类(dt_tst001),其o2m字段(itens)与一个类(dt_tst002)相关,另一个o2m字段(tributos)与第三类(dt_tst003)相关。
在父类中还有另一个字段(seguro_total),并且当其值更改时,我需要在第二类中对字段(seguro)和第三类中的字段(base_calculo,valor_tributo)开始重新计算(_upd_seguro)。
第二类中的重新计算有效,但第三类中没有。
逐步调试值,但检查表单时会显示原始值,并将这些值发送到数据库。
示例代码:
class DT_TST001(models.Model):
_name = "dt_tst001"
_rec_name = "documento"
documento = fields.Char(string = "Documento",size = 9,required = True)
seguro_total = fields.Float(string = "Seguro total")
itens = fields.One2many("dt_tst002",inverse_name = "documento_id",required = True)
@api.onchange('seguro_total')
def _upd_seguro(self):
for item in self.itens:
item.update({
'seguro' : ((item.quantidade * item.valor_unitario) / item.valor_total) * self.seguro_total})
for tributo in item.tributos:
tributo.update({'base_calculo' : (item.valor_total + item.seguro)})
tributo.update({'valor_tributo' : (item.valor_total + item.seguro) * tributo.aliquota / 100})
class DT_TST002(models.Model):
_name = "dt_tst002"
_rec_name = "documento_id"
documento_id = fields.Many2one("dt_tst001",string = "Documento",required = True,ondelete='cascade')
produto_id = fields.Char(string = "Produto",size = 15,required = True)
quantidade = fields.Float(string="Quantidade",default = 0.00)
valor_unitario = fields.Float(string="Valor unitário",default = 0.00)
valor_total = fields.Float(string="Valor total",default = 0.00)
seguro = fields.Float(string="Seguro",compute='_recalc_impostos',store=True)
tributos = fields.One2many("dt_tst003",inverse_name = "item_id")
@api.onchange('quantidade','valor_unitario','seguro')
def _upd_valor_total(self):
self.valor_total = (self.quantidade * self.valor_unitario) + self.seguro
class DT_TST003(models.Model):
_name = "dt_tst003"
item_id = fields.Many2one("dt_tst002",string = "Ítem",ondelete='cascade')
tributo_id = fields.Char(string = "Tributo",required = True)
base_calculo = fields.Float(string = "Base de cálculo")
aliquota = fields.Float(string = "Alíquota")
valor_tributo = fields.Float(string = "Valor do tributo")
@api.multi
def name_get(self):
result = []
for m_tst003 in self:
name = m_tst003.item_id.documento_id._name + " - " + m_tst003.item_id._name + " - " + m_tst003.tributo_id._name
result.append((m_tst003.id,name))
return result
示例视图定义:
<odoo>
<data>
<!-- VIEWS Para NOTAS DE ENTradA -->
<record model="ir.ui.view" id="tst001_form">
<field name="model">dt_tst001</field>
<field name="name">tst001_form</field>
<field name="arch" type="xml">
<form string="Documento de enTrada">
<group colspan="1" style="margin: 0px">
<field name="documento" style="text-transform: uppercase;"/>
<field name="seguro_total"/>
</group>
<notebook>
<page string="Ítens">
<group>
<h6>
<field name="itens" context="{'form_view_ref' : 'dt_tst.tst002_form','tree_view_ref' : 'dt_tst.tst002_tree','default_itens' : itens}" force_save="1" class="oe_horizontal_separator oe_clear"/>
</h6>
</group>
</page>
</notebook>
</form>
</field>
</record>
<record model="ir.ui.view" id="tst001_tree">
<field name="model">dt_tst001</field>
<field name="name">tst001_tree</field>
<field name="arch" type="xml">
<tree string="Documentos de enTrada">
<field name="documento"/>
<field name="seguro_total"/>
</tree>
</field>
</record>
<!-- ITENS -->
<record model="ir.ui.view" id="tst002_form">
<field name="model">dt_tst002</field>
<field name="name">tst002_form</field>
<field name="arch" type="xml">
<form string="Ítem de documento de enTrada">
<group style="margin: 0px">
<group colspan="4" style="margin: 0px">
<field name="produto_id"/>
</group>
<group colspan="4" style="margin: 0px">
<group style="margin: 0px">
<field name="quantidade"/>
</group>
<group style="margin: 0px">
<field name="valor_unitario"/>
</group>
<group colspan="4" style="margin: 0px">
<field name="valor_total" readonly="1" options='{"always_reload": True}' />
</group>
</group>
<group colspan="4" style="margin: 0px">
<field name="seguro"/>
</group>
<field name="valor_total" invisible="1"/>
</group>
<notebook>
<page string="Tributos">
<group>
<h6>
<field name="tributos" context="{'form_view_ref' : 'dt_test.tst003_form','tree_view_ref' : 'dt_test.tst003_tree','default_tributos' : tributos,'default_valor_total' : valor_total}" force_save="1" class="oe_horizontal_separator oe_clear"/>
</h6>
</group>
</page>
</notebook>
</form>
</field>
</record>
<record model="ir.ui.view" id="dt_fis.tst002_tree">
<field name="model">dt_tst002</field>
<field name="name">tst002_tree</field>
<field name="arch" type="xml">
<tree string="Ítens de documentos de enTrada">
<field name="produto_id"/>
<field name="quantidade"/>
<field name="valor_unitario"/>
<!-- Enviar campos invisíveis para que seu conteúdo seja resgatado no formulário -->
<field name="seguro" invisible="1"/>
<field name="tributos" invisible="1"/>
</tree>
</field>
</record>
<!-- VIEWS Para DOCUMENTOS DE ENTradA E SAÍDA -->
<record model="ir.ui.view" id="tst003_form">
<field name="model">dt_tst003</field>
<field name="name">tst003_form</field>
<field name="arch" type="xml">
<form string="Tributos de ítem de documento fiscal">
<sheet>
<group>
<field name="tributo_id"/>
<field name="base_calculo"/>
<field name="aliquota"/>
<field name="valor_tributo"/>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="tst003_tree">
<field name="model">dt_tst003</field>
<field name="name">tst003_tree</field>
<field name="arch" type="xml">
<tree string="Tributos de ítem de documento fiscal">
<field name="tributo_id"/>
<field name="base_calculo"/>
<field name="aliquota"/>
<field name="valor_tributo"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="dt_test.tst001_action">
<field name="name">Documentos de enTrada - teste</field>
<field name="res_model">dt_tst001</field>
<field name="view_mode">tree,form</field>
<field name="view_type">form</field>
<field name="view_ids" eval="[(5,0),(0,{'view_mode': 'tree','view_id': ref('tst001_tree')}),{'view_mode': 'form','view_id': ref('tst001_form')})]"/>
<field name="view_type">form</field>
</record>
<menuitem name="Documentos de enTrada" id="dt_test.tst001_menu" parent="dt_test.tst_menu_registros" action="dt_test.tst001_action" sequence="10"/>
</data>
</odoo>
谢谢!
解决方法
好吧,在第二个类中似乎起作用了,因为类seguro
的{{1}}字段是基于DT_TST002
函数计算的。它不使用_recalc_impostos
。还有一点要注意,类 DT_TST001 和 DT_TST003 之间没有关系。
根据您的评论, on_change 方法如下:
on_change
另外,请注意,您可以按以下方式处理关系字段
@api.onchange('seguro_total')
def _upd_seguro(self):
for item in self.itens:
seguro = ((item.quantidade * item.valor_unitario) / item.valor_total) * self.seguro_total
tributes = []
for tributo in item.tributos:
base_calculo = (item.valor_total + item.seguro)
valor_tributo = (item.valor_total + item.seguro) * tributo.aliquota / 100
tributes.append((1,tributo.id,{'base_calculo' : base_calculo,'valor_tributo' : valor_tributo}))
item.update({
'seguro' : seguro
'tributos' : tributes,})