Odoo API:发票在验证后具有“已付款”状态

2024-09-26 18:07:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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)

结果:

^{pr2}$

我认为在我的发票创建过程中有一些缺失或错误的地方,但是我没有找到确切应该修改的内容,以便按照从UI创建发票的方式创建发票。 有谁能帮我找出我剧本里的错误吗?在


Tags: odooenvidpartnersettings状态account发票
1条回答
网友
1楼 · 发布于 2024-09-26 18:07:27

我找到了一个解决办法。似乎发票和发票行的account_id必须不同。为了解决这个问题,我检索了ID为1的account.journal实例(用于“Customers Invoices”日记账),然后使用它根据日记账的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,
    # [...]
})

相关问题 更多 >

    热门问题