送货单 Odoo 15 上显示的地址不正确

问题描述 投票:0回答:1

我的公司已经有这个问题好几个月了。即使我们的第三方咨询机构也无法找到此问题的原因。我们使用的是 Odoo 15 企业版。

有时,当为销售订单的装运打印交货单时,看似随机,生成并发送给客户的 PDF 显示客户地址而不是交货地址。我还没有找到发生这种情况的 SO 的共同点。

过去几天我一直在谷歌上搜索,在 Odoo shell 中的一个临时分支中闲逛,并挖掘 Odoo 15 存储库。

这是基础

report_deliveryslip.xml
模块中
stock
文件的相关部分。我已经完成了
git grep
并发现了许多其他模块继承和修改了此报告,但没有任何一个模块引用了送货地址的 xpath。

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
    <template id="report_delivery_document">
        <t t-call="web.html_container">
            <t t-call="web.external_layout">
                <t t-set="o" t-value="o.with_context(lang=o._get_report_lang())" />
                <t t-set="partner" t-value="o.partner_id or (o.move_lines and o.move_lines[0].partner_id) or False"/>

                <t t-set="address">
                    <div name="div_outgoing_address">
                        <div t-if="o.should_print_delivery_address()">
                            <span><strong>Delivery Address:</strong></span>
                            <div t-field="o.move_lines[0].partner_id"
                                t-options='{"widget": "contact", "fields": ["address", "name", "phone"], "no_marker": True, "phone_icons": True}'/>
                        </div>

这是我在 Odoo shell 中使用示例进行的一些测试的总结,所以我是由我们的运输部门提供的,并且私人信息经过编辑:

IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: so = self.env['sale.order'].search([('name', '=', 'S12345')])           

In [2]: so.partner_id                                                           
Out[2]: res.partner(XXXXXX,)

In [3]: so.partner_shipping_id                                                  
Out[3]: res.partner(YYYYYY,)

In [4]: pick = self.env['stock.picking'].search([('origin', '=', so.name)])     

In [5]: pick.partner_id                                                         
Out[5]: res.partner(YYYYYY,)

In [6]: pick.move_lines[0].partner_id                                           
Out[6]: res.partner(YYYYYY,)

In [7]: print(pick.move_lines[0].partner_id._display_address())                 
Correct Contact Name
123 Correct Street
Unit 456
New York NY 01234
United States

In [8]: pick.should_print_delivery_address()                                    
Out[8]: True

In [9]:     

最后几点说明。我尝试了 Odoo shell 中的

_render_qweb_html
方法以及
_render_qweb_pdf
_render_qweb_text
方法来手动生成交货单的新副本,这三个方法都显示了“客户地址”,但显示了错误的地址,而不是“送货地址”和正确的地址。

python odoo odoo-15
1个回答
0
投票

最终找到了解决方案。在

report_deliveryslip.xml
文件中,有以下标签:

<t t-set="address">
    <div name="div_outgoing_address">
        <div t-if="o.should_print_delivery_address()">
            <span><strong>Delivery Address:</strong></span>
            <div t-field="o.move_lines[0].partner_id"
                t-options='{"widget": "contact", "fields": ["address", "name", "phone"], "no_marker": True, "phone_icons": True}'/>
        </div>
        <div t-elif="o.picking_type_id.code != 'internal' and o.picking_type_id.warehouse_id.partner_id">
            <span><strong>Warehouse Address:</strong></span>
            <div t-field="o.picking_type_id.warehouse_id.partner_id"
                t-options='{"widget": "contact", "fields": ["address", "name", "phone"], "no_marker": True, "phone_icons": True}'/>
        </div>
    </div>
</t>

我原本以为这就是生成 HTML,然后用于生成 PDF 的原因。然而,这个

<t>
标签用于“发货”地址,与直觉相反的是,该地址是货件“发货”的地方,也称为我们工厂的地址。下一个 XML 片段是提取客户地址并为其生成 HTML 的位置。

<t t-set="information_block">
    <div class="row">
        <div class="col-7" name="div_incoming_address">
            <t t-set="show_partner" t-value="False" />
            <div t-if="o.picking_type_id.code=='incoming' and partner">
                <span><strong>Vendor Address:</strong></span>
                <t t-set="show_partner" t-value="True" />
            </div>
            <div t-if="o.picking_type_id.code=='outgoing' and partner and partner != partner.commercial_partner_id">
                <span><strong>Customer Address:</strong></span>
                <t t-set="show_partner" t-value="True" />
            </div>
            <div t-if="show_partner" name="partner_header">
                <div t-field="partner.commercial_partner_id"
                    t-options='{"widget": "contact", "fields": ["address", "name", "phone"], "no_marker": True, "phone_icons": True}'/>
                <p t-if="partner.sudo().commercial_partner_id.vat"><t t-esc="o.company_id.country_id.vat_label or 'Tax ID'"/>: <span t-field="partner.sudo().commercial_partner_id.vat"/></p>
            </div>
        </div>
    </div>
</t>

下面这行就是最终的答案。

<div t-if="o.picking_type_id.code=='outgoing' and partner and partner != partner.commercial_partner_id">

我在 Odoo shell 中做了一些进一步的测试,并将

res.partner
记录分配给我们的其中一个有送货地址问题的货件,并发现运行
partner == partner.commercial_partner_id
返回了
False
。最初,当我看到这个时,我认为我们可能有一些记录的
commercial_partner_id
设置不正确。然后我在
commercial_partner_id
模型中找到了
res.partner
的字段定义,如下所示。

commercial_partner_id = fields.Many2one('res.partner', string='Commercial Entity',
                                        compute='_compute_commercial_partner', recursive=True,
                                        store=True, index=True)

然后我找到了计算方法,如下所示。

@api.depends('is_company', 'parent_id.commercial_partner_id')
def _compute_commercial_partner(self):
    for partner in self:
        if partner.is_company or not partner.parent_id:
            partner.commercial_partner_id = partner
        else:
            partner.commercial_partner_id = partner.parent_id.commercial_partner_id

Odoo shell 中的一些最终测试(以及针对具有相同送货地址问题的其他 5 个货件的健全性检查)揭示了这些货件在送货单上生成的送货地址不正确的原因。这是因为送货地址的

res.partner
记录未标记为“公司”类型记录,而是列为“个人”记录,并且主“公司”记录被设置为其父记录。

我们尚未确定此问题的具体解决方案。将送货地址

res.partner
记录更改为“公司”类型会破坏联系人层次结构,并且更改母公司记录的地址可能会导致将来出现潜在问题。

© www.soinside.com 2019 - 2024. All rights reserved.