【魅力开源】第5集:通过Odoo实现将EXCEL表费用明细,快速导入到ERP总账系统生成凭证
文章目录
- 前言
- 一、拿到这样的一张表
- 二、实现过程
- 1. 控制器(Controller)
- 2. 模型(Model)
- 3. 视图(View)
- 4. 返回生成的凭证号
- 最后
前言
这是一个小功能。
财务小姐姐每个月需要不少的时间去手录费用凭证,这个功能可以实现将半天一天时间内完成的事情,在1小时内(或者更快)完成。
涉及如下9项费用类型:汽油费、维修保养费、停车费、运杂费、邮寄费、名片费、手机费、福利费、机票。
特点是:涉及大多数职工,工作量相对重复,并且工作量会随职工人数增加面增加。
下面将展示,快速对这一类凭证快速登账的方法。
一、拿到这样的一张表
拿到财务小姐姐的一张EXCEL表,包括如下表头内容。
先来对上面进行分析,将涉及几个关键内容。
首先,费用类型分解:汽油费、维修保养费、停车费、运杂费、邮寄费、名片费、手机费、福利费、机票。
其次,辅助帐名分解,按费用类型与辅助帐名对应关系,如下表:
第三,凭证类型分别为:现金、银行、转账。涉及费用挂账凭证及费用支付凭证。
接下来,我们看如何实现将EXCEL表内容导入快速生成总账凭证。
当然,优秀的业务实践是通过报销系统填报及审批,实现业务财务一体化联动处理。
二、实现过程
系统集成关键点:
- 数据格式统一 (统一数据模板)
- 数据推送前检验 (将检验信息提醒到操作人员)
- 数据同步成功后双方能相互校对(凭证号与单据号系统间存档、相互校验)
整个系统模块架构还是遵循MVC【模型(Model)、视图(View)、控制器(Controller)】方式处理。
1. 控制器(Controller)
url链接下载模板 把导入模板放到系统中并提供统一下载链接,并提供简要说明,可以避免模板不统一而产生的各种导入不正常问题。
controllers模块 EXCEL模板的代码实现:
# -*- coding: utf-8 -*-
from odoo.http import Controller, content_disposition
from odoo import http
...
@http.route('/account/account_template_excel', auth='user', method=['get'])
def account_template_excel_download(self):
path = r"./dyaddons/account_dy/template/account_template.xlsx"
with open(path, 'rb') as f:
data = f.read()
return http.request.make_response(
data,
[('Content-Type', 'application/octet-stream'),
('Content-Disposition', content_disposition('辅助帐导入模板.xlsx'))]
)
该处使用的ur去请求系统预置的下载模板。
2. 模型(Model)
Model实现导出分录功能,点一下“导出”按钮,将会在ERP系统生成一张完整凭证,关键代码如下:
('1', '汽油费'),
('2', '维修保养费'),
('3', '停车费'),
('4', '运杂费'),
('5', '邮寄费'),
('6', '名片费'),
('7', '手机费'),
('8', '福利费'),
('9', '机票')
def create_assist_line(self, cur):
""" 导出凭证分录 """
if cur:
ostate = cur.var(cx_Oracle.NUMBER)
oretmsg = cur.var(cx_Oracle.STRING)
if not self.hfid:
if self.bill_id.fusage in ('1', '2', '3'):
sp_name = "Pdy_NewAHG_Fleet" # 辅助帐横表记录,[0012]用途+部门+职员+车牌号
...
elif self.bill_id.fusage in ('8', '9'):
sp_name = "Pdy_NewAHG_Usage" # 辅助帐横表记录,[0010]部门+职员
...
else:
sp_name = "Pdy_NewAHG" # 辅助帐横表记录,[0011]用途+部门+职员
...
try:
cur.callproc(sp_name, [self.bill_id.atype, self.bill_id.name, self.emp, self.dept,
self.usage or '', self.fleet or '', oretmsg, ostate])
....
def import_vassist(self):
""" 导出凭证主方法 """
config = self.env['api.synch.server'].search([('name', '=', 'eas_db')])[0]
conn = cx_Oracle.connect(config.synch_user, config.synch_pwd, '%s:%s/%s'
% (config.synch_server, config.synch_port, config.synch_db))
cur = conn.cursor()
for rs in self:
if not rs.active:
continue
all_done = True
for line in rs.assist_line:
if not line.note or line.note == 'ERROR':
ret = line.create_assist_line(cur) # 执行凭证导出主方法调用
all_done &= ret
if all_done:
rs.write({'state': 'OK', 'active': False})
else:
rs.write({'state': 'Fix -> Retry'})
conn.commit()
cur.close()
conn.close()
return {'type': 'ir.actions.act_window_close'}
3. 视图(View)
视图(View)层代码如何实现可联系作者或参考
https://www.odoo.com/documentation/16.0/developer/reference/backend/views.html?highlight=views
4. 返回生成的凭证号
这个是很重要的一步。有不少系统只做到单向传递,没有返回对方系统信息(即忽略了双方相互校验逻辑)。
导出数据后,将返回凭证号信息到ODOO系统。
最后
重要事情说三遍:
- 统一数据模板,你可以解决关于导入的50%问题;
- 将检验信息提醒到操作人员,你又可以解决关于导入的40%问题;
- 数据同步成功后双方能相互校对,如果前面90%问题都做了控制,注意返回数据,双方校验就行了
以上就是今天要讲的内容,本文仅仅简单介绍了Odoo集成ERP使用的一个场景,但实际使用过程中,还可以处理更多的场景。