业务背景
Odoo的银行对账一般采购银行标准的对账单格式csv,xls,ofx,qif等格式进行导入,再与收付款单进行匹配;
在国内银行下载对账单需要经过繁琐操作(装驱动,插Ukey,不同银行还会冲突)登录网银下载对账单再导入;
针对这个场景进行自动化改造大的企业一般是采用银企直联的方式,不过针对中小企业使用此方案周期长成本高,需要不少的开发,可能还需要额外部署本地前置机(对采购云端部署odoo来说架构比较麻烦);
方案介绍
这里提供一个比较轻量的方案来解决这个问题:使用短信猫来代收银行的到账短信,拿到短信之后进行发信人与内容解析银行进行一些自动化的操作(自动创建对账单,付款单等)。
短信猫
短信猫本质上可以看成是一个只能收发短信的手机,可以用程序去控制它的收发动作。
推荐型号:http://www.jdsms.com/JDSMS/node_330/node_332/MG35-FT
这个我们用了十多年了,一直比较稳定。
短信猫附带一个web管理后台
- 基于java,可win/linux部署
- MSSQL,MySQL,PostgreSQL等主流数据库都可使用。
- 提供API来收发短信
功能实现
有两种方式
- 使用它的web API来进行收发短信操作,具体参考它的文档开发即可。
- 将短信猫的数据库与odoo数据库部署在同一主机上,使用数据库层面交互。
- 发短信:在odoo中往其数据库发信表插数据
- 收短信:在短信数据库的收信表,创建触发器,往odoo中插入数据
第一种方式开发简单,第二种方式更稳定(遇到odoo server挂了仍不影响短信收发)
触发器代码,Odoo中需安装queue_job模块
DROP FUNCTION trigger_sms_in_fun;
CREATE OR REPLACE FUNCTION public.trigger_sms_in_fun()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
-- 声明变量
DECLARE sql TEXT := 'ss';
DECLARE uuid TEXT;
BEGIN
-- 添加dblink扩展
CREATE EXTENSION IF NOT EXISTS dblink;
-- 添加uuid-ossp扩展(用于生成uuid)
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- 将收到的短信插入队列
uuid := (SELECT uuid_generate_v4());
sql := 'INSERT INTO queue_job (uuid, user_id, company_id, job_function_id, channel, name,model_name, method_name, channel_method_name, record_ids, args, kwargs, state, func_string, date_created)
VALUES (
''' || uuid || ''',
1,
1,
387,
''root'',
''sms.sms.deal_receive_sms'',
''sms.sms'',
''deal_receive_sms'',
''<sms.sms>.deal_receive_sms'',
''[]'',
''["' || NEW.originator || '","' || NEW.message_date || '","' || NEW.text || '"]'',
''{}'',
''pending'',
''sms.sms().deal_receive_sms(''''' || NEW.originator || ''''', ''''' || NEW.message_date || ''''', ''''' || NEW.text || ''''', ' || NEW.id || ')'',
NOW() - interval ''8 hours''
)';
-- 输出日志,用于调试
-- RAISE NOTICE 'SQL: %', sql;
-- 创建远程数据库连接
PERFORM (SELECT dblink_connect('odoo_db', 'host=127.0.0.1 user=dbuser password=dbpwd dbname=dbname'));
-- 执行SQL
PERFORM (SELECT dblink_exec('odoo_db', sql));
-- 关闭远程数据库
PERFORM (SELECT dblink_disconnect('odoo_db'));
RETURN NEW;
END;
$function$
CREATE TRIGGER trigger_sms_receive_notify_odoo AFTER INSERT ON
smsserver_in FOR EACH ROW EXECUTE PROCEDURE trigger_sms_in_fun()
注:以上代码仅在odoo12上测试投产,其它版本请自行适配。