你这是干了嘛!钱呢!
最近在看“杨光的快乐生活”,说啥都想加个“嘛”,你说这是因为嘛!但是今天我们不聊电视,聊正事:一段费钱的代码
账务系统对于一个公司来说非常重要,不仅管理这客户的各项交易信息和余额,也记录这公司内部的相关核算数据;对它的准确性和安全性要求极高;你可以想象你的100万存在某银行,他的数据丢失了,你找谁要钱去!是不是突然感觉你的银行存款不安全了。货币电子化带来方便的同时,必然潜在着巨大的风险;今天我们就聊一个我接手的一个账务系统中的一段“奇葩”代码,它是怎么样像寄生虫一样吸干了用户的余额......
警惕不为人知的逻辑
我想大家都有这样的经历,就是技术在实现产品方案时,会按照自己的理解增加一些逻辑,而这些逻辑有时候没有人知道,但是随着时间的推移,它在慢慢侵蚀着一切。也不能说他是病毒,只能说是一个逻辑漏洞。如果症状不明显,没有人会发现,直到有一天它爆发了!所以特别是账务系统,一定要不断地强化校验机制,确保数据准确性
旧主体转新主体
有些公司的业务在经营一段时间以后会更换公司主体,那么势必要进行新旧主体相关事物的清算,特别是用户的债权债务关系的转移
我们今天的主角是商家保证金;很多平台都会要求商家缴纳经营性的保证金。当要从旧经营主体转为新经营主体时,商家的保证金也要跟着转过去,而这个转移需要签订一个债权转移协议,并基于电子合同指令对账务进行处理
批量转签,起初全部商家签订新主体协议,然后基于签约电子合同消息,对商家保证金账户发起转账指令,完成余额转移;但是这里要提一个旧系统的问题,就是账户并没有分2个账户,而是为账户打了一个标志,这个标志是“新/旧”,也就是真正的转账动作实际上是把账户的“旧”标志改成了“新”标志,并插入转出转入的2条流水
收到合同转签指令以后,如果商家账户有余额则将账户的标志改为“新”,然后插入2条流水,如果旧账户没有余额,直接将账户标志改为“新”即可;如果后续商家进行充值,实际上账务流水标志是“新”,所以债权是在新主体
到目前为止,整个产品方案是没有问题的......但是,经过一段时间的运行之后发现问题了:财务发现旧保证金科目余额慢慢的成为了“负”值,而且截止到开始排查问题时,这个负值近百万,这意味着什么,这意味本来是你欠商家的保证金,变成了商家欠你保证金,就像你的工资成了负值,你要给公司发工资一样,这是一个比较荒唐的事情
这个问题的产生要从一串代码说起
如果没有就插入
这段代码是在核算历史明细的时候发现的,发现有些商家的保证金账户明细多了一对流水,而这一对流水给新充值的流水时间几乎一致
这里就是问题所在,你核对新旧的结转发现能对的上,你核对充值跟银行资金收款也能对的上,但是你单单看两个主体,你就会发现问题,商家的旧主体保证金是-1000了,新主体是2000;但是财务又不会去核算单个商家的账户余额,所以这个问题在正常的记账过程中没有发现
直到保证金账户余额出现了负的情况,才意识到,账务有问题
排查之后发现了这样一段逻辑:商家充值保证金记账时,如果账户中没有结转记录就插入2笔结转流水
就是这个逻辑,让很多商家的旧主体保证金成为负发生额,并且绕过了很多核算不断地积累到很大的规模,幸好把新旧主体放到一起整体来看企业和用户都没有损失,通过账务反向入账抵消不应该存在的发生额即可修复整体账务问题,但是有些时候可能就没这么幸运了;就像之前遇到过刷数据回滚账务造成已经提现的余额回滚问题,这个就真丢钱了;在某更大的企业也出现过因为运营直接找到技术做了一个简单的处理,瞬间几十万就没有......
前一段工作中也遇到的账务问题,因为业务侧的一些改动造成了重复扣了商家几十万的税,这里就不细说了;总之账务无小事,一定要盯紧,定期核算检查核心逻辑,核对关键的环节,但无论怎样,事前拦截是一方面,事中校验也很重要,事后核算也很重要;一旦事故发生,制定账务调整策略及时封住漏洞修复账务数据也很重要。
总之,丰富全面的会计知识,会有助于你全局的去制定合理的账务处理方案;账务无小事,一朝不慎,轻则不能晋升没有年终奖,重则小组全开!
扫码或者点击阅读原文访问支付课堂
每天和105091位支付产品经理一起学习