门店前台最容易把“客户还钱”理解成收一笔现金就结束。但在系统里,真正麻烦的是两套口径要同时成立:前台界面要知道客户还欠多少,会计又要知道这笔钱冲掉了哪几张旧单或发票。
这篇文章主要参考了以下企业版源码入口:
enterprise/pos_settle_due/models/pos_order.pyenterprise/pos_settle_due/models/pos_session.py
一、这篇功能真正解决什么问题
pos_settle_due 解决的是 POS 前台补收客户欠款时的业务口径与会计口径对齐。如果只记“收了一笔钱”,门店看似顺畅,但客户总欠款、旧单状态、应收对账都会越来越乱。
二、核心链路怎么走
1. 前台先算出这张结清单应该承接多少欠款
customer_due_total 不是随便汇总的,它会检查订单是否有关联客户、是否使用 pay_later 付款方式、订单是否尚未开票。只有满足这些前提,系统才会把这张 POS 单当作“挂账结清单”来处理。
2. 结清过程会记录自己冲了哪些旧单
settled_order_line_ids 与 settled_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
评论区