account-invoicing是一个专为Odoo企业资源规划系统设计的发票管理增强套件。该项目包含多个功能模块,全面覆盖发票处理的各个环节,从创建、折扣计算、发送到后期管理,为企业提供完整的发票解决方案。所有模块均基于Odoo Community Association (OCA)开发,确保代码质量和兼容性。
module install account_invoice_auto_send_by_email
# 为合作伙伴设置全局折扣示例
partner_id = self.env['res.partner'].browse(partner_id)
partner_id.customer_global_discount_ids = [(6, 0, [discount_id])]
配置传输方法为邮件的发票会自动加入发送队列:
# 检查待发送的发票
invoices = self.env['account.move'].search([
('transmit_method_id', '=', email_method_id),
('state', '=', 'posted'),
('is_move_sent', '=', False)
])
启用到期日期编辑功能:
<!-- 安全组配置 -->
<record id="group_account_invoice_date_due" model="res.groups">
<field name="name">Allow to change due date</field>
</record>
在供应商发票中检查和更新产品信息:
def update_supplierinfo(self):
"""更新产品供应商信息"""
for line in self.line_ids:
if not line.supplierinfo_id:
# 创建新的供应商信息
vals = line._prepare_supplierinfo()
self.env['product.supplierinfo'].create(vals)
else:
# 更新现有供应商信息
vals = line._prepare_supplierinfo_update()
line.supplierinfo_id.write(vals)
def _pre_init_global_discount_fields(env):
"""预初始化全局折扣字段"""
if not column_exists(env.cr, "account_move", "amount_global_discount"):
env.cr.execute("""
ALTER TABLE "account_move"
ADD COLUMN "amount_global_discount" double precision DEFAULT 0
""")
env.cr.execute("""
ALTER TABLE "account_move" ALTER COLUMN "amount_global_discount" DROP DEFAULT
""")
# 初始化税前金额字段
if not column_exists(env.cr, "account_move", "amount_untaxed_before_global_discounts"):
env.cr.execute("""
ALTER TABLE "account_move"
ADD COLUMN "amount_untaxed_before_global_discounts" double precision
""")
env.cr.execute("""
update account_move set amount_untaxed_before_global_discounts = amount_untaxed
""")
class AccountMoveReversal(models.TransientModel):
_inherit = "account.move.reversal"
reason_id = fields.Many2one("account.move.refund.reason", string="退款原因")
reason = fields.Char(
compute="_compute_reason", precompute=True, store=True, readonly=False
)
@api.depends("reason_id")
def _compute_reason(self):
"""计算退款原因"""
for record in self:
if record.reason_id:
record.reason = record.reason_id.name
def reverse_moves(self, is_modify=False):
"""重写退款创建方法,设置原因字段"""
res = super().reverse_moves(is_modify=is_modify)
# 为新创建的退款设置原因
self.move_ids.reversal_move_ids.filtered(lambda x: not x.reason_id).write(
{"reason_id": self.reason_id.id}
)
return res
class WizardUpdateInvoiceSupplierinfo(models.TransientModel):
_name = "wizard.update.invoice.supplierinfo"
_description = "更新供应商信息向导"
line_ids = fields.One2many(
comodel_name="wizard.update.invoice.supplierinfo.line",
inverse_name="wizard_id",
string="明细行",
)
invoice_id = fields.Many2one(
comodel_name="account.move",
required=True,
readonly=True,
ondelete="cascade",
)
def update_supplierinfo(self):
"""执行供应商信息更新"""
self.ensure_one()
supplierinfo_obj = self.env["product.supplierinfo"]
for line in self.line_ids:
supplierinfo = line.supplierinfo_id
if not supplierinfo:
# 创建新的供应商信息记录
vals = line._prepare_supplierinfo()
supplierinfo_obj.create(vals)
else:
# 更新现有供应商信息
vals = line._prepare_supplierinfo_update()
supplierinfo.write(vals)
# 更新产品的采购单位
if ("product_uom" in vals and
vals["product_uom"] != line.product_id.uom_po_id.id):
line.product_id.uom_po_id = vals["product_uom"]
# 标记发票为已检查
self.invoice_id.write({"supplierinfo_ok": True})
def match_origin_lines(refund):
"""通过产品或描述匹配退款行与原始发票行"""
invoice = refund.reversed_entry_id
invoice_lines = invoice.invoice_line_ids
for refund_line in refund.invoice_line_ids:
for invoice_line in invoice_lines:
# 通过产品或名称匹配
match = (
refund_line.product_id
and refund_line.product_id == invoice_line.product_id
or refund_line.name == invoice_line.name
)
if match:
invoice_lines -= invoice_line
refund_line.origin_line_id = invoice_line.id
break
if not invoice_lines:
break
这些核心代码展示了项目的技术实现,包括数据库操作、业务逻辑处理和用户交互设计,体现了代码的专业性和可维护性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。