基于短信猫的Odoo银行对账单同步方案

2023-12-20  本文已影响0人  ShangHai_Fei

业务背景

Odoo的银行对账一般采购银行标准的对账单格式csv,xls,ofx,qif等格式进行导入,再与收付款单进行匹配;
在国内银行下载对账单需要经过繁琐操作(装驱动,插Ukey,不同银行还会冲突)登录网银下载对账单再导入;
针对这个场景进行自动化改造大的企业一般是采用银企直联的方式,不过针对中小企业使用此方案周期长成本高,需要不少的开发,可能还需要额外部署本地前置机(对采购云端部署odoo来说架构比较麻烦);

方案介绍

这里提供一个比较轻量的方案来解决这个问题:使用短信猫来代收银行的到账短信,拿到短信之后进行发信人与内容解析银行进行一些自动化的操作(自动创建对账单,付款单等)。

短信猫

短信猫本质上可以看成是一个只能收发短信的手机,可以用程序去控制它的收发动作。
推荐型号:http://www.jdsms.com/JDSMS/node_330/node_332/MG35-FT
这个我们用了十多年了,一直比较稳定。

短信猫附带一个web管理后台

功能实现

有两种方式

  1. 使用它的web API来进行收发短信操作,具体参考它的文档开发即可。
  2. 将短信猫的数据库与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上测试投产,其它版本请自行适配。

上一篇 下一篇

猜你喜欢

热点阅读