企业 POS 挂账

Odoo 企业版 POS:挂账结清为什么既算欠款又要做应收核销

pos_settle_due 不是简单做一笔补收款。它同时要回答两个问题:客户现在还欠多少、这次前台结清后应收分录如何和旧单或发票核上。

POS 企业
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 4 阅读

门店前台最容易把“客户还钱”理解成收一笔现金就结束。但在系统里,真正麻烦的是两套口径要同时成立:前台界面要知道客户还欠多少,会计又要知道这笔钱冲掉了哪几张旧单或发票。

这篇文章主要参考了以下企业版源码入口:

  • enterprise/pos_settle_due/models/pos_order.py
  • enterprise/pos_settle_due/models/pos_session.py

一、这篇功能真正解决什么问题

pos_settle_due 解决的是 POS 前台补收客户欠款时的业务口径与会计口径对齐。如果只记“收了一笔钱”,门店看似顺畅,但客户总欠款、旧单状态、应收对账都会越来越乱。

二、核心链路怎么走

1. 前台先算出这张结清单应该承接多少欠款

customer_due_total 不是随便汇总的,它会检查订单是否有关联客户、是否使用 pay_later 付款方式、订单是否尚未开票。只有满足这些前提,系统才会把这张 POS 单当作“挂账结清单”来处理。

2. 结清过程会记录自己冲了哪些旧单

settled_order_line_idssettled_orders_count 让这张结清单不仅知道“收了钱”,还知道“替哪些单子还了钱”。因此界面可以反查已结清订单,业务上也能解释本次补款覆盖了哪些欠款来源。

3. 关班时还要把应收分录真正核上

pos.session._reconcile_account_move_lines() 会把本 session 里的 pay later 分录、被本次结清触达的旧 session 分录,以及相关发票分录按 (partner, account) 聚合后统一 reconcile()。这一步是会计闭环的关键:如果不做,前台看着结清了,总账上却还是挂着未核应收。

三、新手最容易踩的坑

  • 以为 POS 结清只是“新开一单收款”。源码清楚表明它还要回头处理历史应收。
  • 以为所有客户付款都该出现欠款逻辑。没有客户、没有 pay later、或者已开票场景,计算口径都不同。
  • 以为关班才是财务的事,和 POS 无关。实际上 reconcile 就写在 POS session 关闭链路里。

四、实战落地时最该盯的点

  • 先统一门店何时使用 pay_later,不要把赊销和普通收款混用成习惯动作。
  • 如果用户反馈“前台显示已还,但会计还挂着”,优先排查 session 关闭与核销是否成功完成。
  • 对接报表时要区分“这次收了多少钱”和“这次冲掉了哪些历史欠款”,这是两层含义。

五、结论

POS 挂账结清真正难的,不是补收一笔钱,而是让客户欠款显示、结清来源记录和应收核销同时成立。pos_settle_due 的价值,就在于把这三件事放进同一条链里处理。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。