【问题标题】:Odoo API: invoice has "paid" status after validationOdoo API:发票在验证后具有“已付款”状态
【发布时间】:2019-06-27 10:51:43
【问题描述】:

我正在编写一个 Python 脚本,它将把我所有的现有发票导入到一个 Odoo 12 实例中。我正在使用 odoorpc 库来简化对我的 Odoo 实例的 RPC 调用。

我实现了使用 API 创建发票,并将其注册为“草稿”状态。然后,我想“验证”它并将其状态更新为“打开”。不幸的是,使用 Odoo UI 中的“验证”按钮或从 RPC API 调用操作执行相同的操作:发票状态更改为“已付款”。我不理解这种行为,因为我没有注册任何付款(这将是我的下一个目标)。

这是我的脚本的简化版本,可用于重现问题:

import odoorpc

import settings
"""settings module contains various constants used
to connect with Odoo on my VPS"""


if __name__ == "__main__":
    odoo = odoorpc.ODOO(settings.ODOO_HOST, port=settings.ODOO_PORT, timeout=10)
    odoo.login(settings.ODOO_DB, settings.ODOO_USER, settings.ODOO_PASSWORD)

    Partner = odoo.env["res.partner"]
    # This partner already exists in DB
    customer = Partner.browse([22])

    Invoice = odoo.env["account.invoice"]
    invoice_id = Invoice.create({
        'partner_id' : customer.id,
        'state': 'draft',
        # This is ID for "Customers Invoices" journal
        'journal_id': 1,
        'account_id': customer.property_account_receivable_id.id,
        # This is ID for default bank account, already registered
        'partner_bank_id': 1,
        'payment_term_id': odoo.env.ref("account.account_payment_term_net").id,
    })

    InvoiceLine = odoo.env["account.invoice.line"]
    InvoiceLine.create({
        "invoice_id": invoice_id,
        "name": "A basic product",
        "quantity": 6,
        "price_unit": 100.0,
        # Not sure about this one:
        "uom_id": 1,
        # No tax
        "invoice_line_tax_ids": [],
        'journal_id': 1,
        'account_id': customer.property_account_receivable_id.id,
    })

    inv = Invoice.browse([invoice_id])
    print("Before validating:", inv.state)

    inv.action_invoice_open()

    inv = Invoice.browse([invoice_id])
    print("After validating:", inv.state)

结果:

Before validating: draft
After validating: paid

我认为在我的发票创建过程中存在一些缺失或错误,但我没有找到应该修改哪些内容才能让发票的创建方式与从 UI 中创建的方式相同。 谁能帮我找出我的脚本有什么问题?

【问题讨论】:

  • 尝试触发对行和发票本身的所有总计和小计等字段的计算。我的猜测:没有它,一切都为 0,总金额等于 0 的发票将被设置为立即付款。
  • 你说得对,我认为应付总额仍为 0,这使发票在验证时已支付。但是如何触发这些字段的计算呢?我尝试调用 on_change 方法,如_onchange_invoice_line_ids、_onchange_payment_term_date_invoice 等,但 Odoo 禁止通过 XML-RPC 调用私有方法。
  • 能否在创建行后尝试在发票上写字?只需将date_invoice 写入False。这可能会触发重新计算。
  • 这是个好主意,但不幸的是,它没有奏效。致电action_invoice_open() 后,最终发票仍处于已付款状态
  • 我认为您在 Line 中缺少 'product_id' ?在 product_id onchange 之后,计算函数将触发。

标签: python odoo odoo-12 odoo-rpc


【解决方案1】:

我找到了自己的解决方案。似乎发票和发票行的account_id 必须不同。为了解决这个问题,我检索了 ID 为 1 的 account.journal 实例(用于“客户发票”日记帐),然后根据日记帐的 default_credit_account_id 字段使用它来填写发票行的 account_id:

cust_invoices_journal = odoo.env["account.journal"].browse([1])
# [...]
invoice_id = Invoice.create({
    # [...]
    'journal_id': cust_invoices_journal.id,
    'account_id': customer.property_account_receivable_id.id,
    # [...]
})
# [...]
InvoiceLine.create({
    # [...]
    'account_id': cust_invoices_journal.default_credit_account_id.id,
    # [...]
})

【讨论】:

  • 你救了我的命!我一直在努力通过 python 创建自定义发票,最后检查了 account.invoice.line 中正确制作的发票上的 postgres account_id 表明我必须对 account.invoice 使用 account_id = 188,对 account.invoice.line 使用 account_id = 356 但是我对自定义发票使用相同的 ID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多