美文网首页
基于短信猫的Odoo银行对账单同步方案

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

作者: ShangHai_Fei | 来源:发表于2023-12-20 10:43 被阅读0次

    业务背景

    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来收发短信

    功能实现

    有两种方式

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

    相关文章

      网友评论

          本文标题:基于短信猫的Odoo银行对账单同步方案

          本文链接:https://www.haomeiwen.com/subject/fkvtndtx.html