odoo广州帽峰山基地挂牌,乡村振兴时代,新农村包围城市策略逐渐开始落地,欢迎来和我们一起依山傍水。。。
基地坐落于山脚萤泉谷养生文化邨,集山脉、森林、湖泊、山泉为一体,交通便利出则繁华入则桃园,是天然且理想的一线城市近郊研发与培训基地。
odoo广州帽峰山基地挂牌,乡村振兴时代,新农村包围城市策略逐渐开始落地,欢迎来和我们一起依山傍水。。。
基地坐落于山脚萤泉谷养生文化邨,集山脉、森林、湖泊、山泉为一体,交通便利出则繁华入则桃园,是天然且理想的一线城市近郊研发与培训基地。
从疫情开始迭代了近三年的OdooApp极速版重大更新:全面支持欧度WebSite模块低代码配置底部自定义TabBar标签导航栏,突破平台原生只允许绑定页面访问无法直接Button操作,且最多只能支持到五个的数量限制,Icon则支持直接使用FontAwesome图标字体大小可随意调,也可以用网络图片来表达选中态和默认态,还支持右上角Badge信息,同时接入全局标准的默认主题色和自定义色,至此odoo移动端和小程序的本土化应用又上了一个大台阶。
b/s系统以前集成闭源硬件比较麻烦,当年做欧度地产管理系统时,需要在认购签约与财务收款环节快速刷卡验证客户二代身份证信息,根据当时的sdk能力,h5浏览器最佳的方案是模拟hid键盘输入,可以将读取到的所有文本信息字段用分隔符组合成长字符串输入到odoo前端window窗口并通过onkeydown事件获得并拆分成具体业务模型字段输出到编辑状态的表单视图上。
该方案优势是不用任何插件就可以兼容所有浏览器,缺点是焦点聚焦input输入框时前端还需要额外再跳转下一个分段输入处理,以及非文本字段如身份证照片二进制数据就无法获得,虽然理论上也可以通过编码成base64字符串一并处理,但是实际中会影响整个交互体验效率。
这些年由于IE浏览器的彻底没落,原来主流的ActiveX控件模式也跟着完全淘汰,各大商业硬件纷纷推出了HttpServer或WebSocket应用api接口替代,这不仅让桌面Web系统甚至移动App小程序都非常容易的通过网络来共享集成专业硬件服务。
odoo序列standard模式其实是pg数据库sequence特性的无代码应用,分别在sql层封装了db序列的创建、删除、修改、查询和预测下一号码的基础能力。然后再根据实施灵活性增强了前后缀、长度不足补0、每个日期范围使用不同序列的层级关系等扩展功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
def _create_sequence(cr, seq_name, number_increment, number_next): """ Create a PostreSQL sequence. """ if number_increment == 0: raise UserError(_('Step must not be zero.')) sql = "CREATE SEQUENCE %s INCREMENT BY %%s START WITH %%s" % seq_name cr.execute(sql, (number_increment, number_next)) def _drop_sequences(cr, seq_names): """ Drop the PostreSQL sequences if they exist. """ names = sql.SQL(',').join(map(sql.Identifier, seq_names)) # RESTRICT is the default; it prevents dropping the sequence if an # object depends on it. cr.execute(sql.SQL("DROP SEQUENCE IF EXISTS {} RESTRICT").format(names)) def _alter_sequence(cr, seq_name, number_increment=None, number_next=None): """ Alter a PostreSQL sequence. """ if number_increment == 0: raise UserError(_("Step must not be zero.")) cr.execute("SELECT relname FROM pg_class WHERE relkind=%s AND relname=%s", ('S', seq_name)) if not cr.fetchone(): # sequence is not created yet, we're inside create() so ignore it, will be set later return statement = sql.SQL("ALTER SEQUENCE") + sql.Identifier(seq_name) params = [] if number_increment is not None: statement += sql.SQL("INCREMENT BY") + sql.Placeholder() params.append(number_increment) if number_next is not None: statement += sql.SQL("RESTART WITH") + sql.Placeholder() params.append(number_next) cr.execute(statement.join(' '), params) def _select_nextval(cr, seq_name): cr.execute("SELECT nextval(%s)", [seq_name]) return cr.fetchone() def _predict_nextval(self, seq_id): """Predict next value for PostgreSQL sequence without consuming it""" # Cannot use currval() as it requires prior call to nextval() seqname = 'ir_sequence_%s' % seq_id seqtable = sql.Identifier(seqname) query = sql.SQL("""SELECT last_value, (SELECT increment_by FROM pg_sequences WHERE sequencename = %s), is_called FROM {}""") params = [seqname] if self.env.cr._cnx.server_version < 100000: query = sql.SQL("SELECT last_value, increment_by, is_called FROM {}") params = [] self.env.cr.execute(query.format(seqtable), params) (last_value, increment_by, is_called) = self.env.cr.fetchone() if is_called: return last_value + increment_by # sequence has just been RESTARTed to return last_value next time return last_value |
odoo同时也额外用select for update nowait数据锁能力来互补实现了一套无间隔的no_gap模式,用来弥补纯sequence在欧度无处不在的事务应用中不会被连带回滚的特性,牺牲一些性能换取序列绝对连号用于某些特殊高要求的场景。如业财一体化应用中的会计分录凭证编号。
1 2 3 4 5 6 |
def _update_nogap(self, number_increment): number_next = self.number_next self._cr.execute("SELECT number_next FROM %s WHERE id=%%s FOR UPDATE NOWAIT" % self._table, [self.id]) self._cr.execute("UPDATE %s SET number_next=number_next+%%s WHERE id=%%s " % self._table, (number_increment, self.id)) self.invalidate_cache(['number_next'], [self.id]) return number_next |
odoo应用于c端相关的场景时,支付是其绕不开的一道坎,不管是pos、商城还是小程序或app,都需要接入payment网关模块来进行统一的聚合支付。
经历过的各种平台接口联调,https协议是标配,md5和sha系列散列摘要加密二选一,aes对称密钥加解密大部分都有,rsa非对称公私钥签名验算很常见,但最复杂难点莫过于odoo端私钥加密,平台端公钥解密。
python多个rsa相关库都不能完全互相替代,也没有现成的分段加解密方法需要自己实现,大部分库还不支持公私钥互相加解密,再加上平台端往往都是非python系统,经过多实例验证最终发现只有M2Crypto库可以完美配套与第三方平台的各种rsa加解密组合需求。
odooerp产品模板订单明细数量,结合生产工序工价进行的odoomes员工自助计件报工,同时支持扫菲计划报工与扫唛全量报工,所有特色工种都可以通过odooapp自由选择适合自己实际情况的报工方式
odooerp款式合同订单根据供货批次生成相应的主生产计划与分批明细,odoomes系统实时报工计件模式下,手机odooapp小程序可以动态根据汇总产值来查看详细的计划进度执行情况
odoo构建业财融合实时会计系统,支持包括社区版和企业版的所有版本。
odoo官方企业版原生的动态财务报表能力虽然很强,但是也很难做出与中国会计准则财务报表格式完全一样。其中最主要的两大难点分别是:水平账户式结构的资产负债表和多表头特色的所有者权益变动表。
odoo开源社区版财会功能看是简单好多东西都没有,但其erp基础框架扎实、应用市场模块众多、全球民间高手如云,持之以恒只有想不到没有做不到。
odoo原生基于WebKit的报表引擎非常强大,但是打印过程体验非常不好,特别是pdf格式报表需要非常多的点击才能完成一次打印。本地下载目录留下不少文档不说,还依赖安装对应格式的阅读器,当然每台客户机也要安装配置好相应的打印机驱动。
1、本机操作系统打印机:这是最常用的方式,可优化引入PDF.js,让浏览器同窗口内通过odoo直接生成并在线预览pdf报表,确认没问题就一次点击按钮菜单或ctrl+p快捷键触发浏览器的系统打印功能。注意不同浏览器的静默打印开关方式都是不同的,比如Chrome的启动参数是–kiosk-printing。
2、服务器系统打印机:适合非云端的本地网络,如同时安装多种打印机还需要远程设备管理模块,技术报表模型增加设置服务端打印项,非缺省打印机还需从设备列表中显式指定。如标签、小票、照片、发票、工业等特种打印机还需根据实际情况扩展一些可灵活实施的参数。每当用户前端进行相关报表的批量打印操作时,后台直接将渲染结果发送到指定的打印机队列上实现静默打印。
3、IoT网关路由打印机:支持定制各种场景化需求实施,客户机、服务端、打印机都可以分别部署在不同的异构网络里。两端操作系统都不用额外安装配置相关打印机,odoo系统社区版智能iot模块可自动发现所有网关之下的蓝牙、RS232、USB、有线和无线网络共享打印机设备。再通过报表模块完善相关的物联网打印设置,就可以实现所有操作系统网络结构的主动、被动、消息模式以及APP小程序的静默打印功能。
毕马威KPMG都开始选择开源欧度Odoo软件来为自己和客户构建实时会计系统,做为使用了将近六年的Odoo业财一体化老用户,总算可以根据亲身经历且完全真实的业务和财务数据,来全周期的深度学习理解三大报表的每一项细节,当实际与理论融合之后便可低代码灵活实施出非常强大的任意期间同比环比随便比的动态财务报表。
Odoo中西结合的动态资产负债表:因为要支持无限个任意日期比较,所以主体布局没有采用国内常用的账户式左右横向结构。所有者权益的未分配利润项也被扩展分解出损益表的当前净利润与已分配两个虚拟子项方便直观查阅。
Odoo中国会计实务的利润表:支持无限层级项目明细按凭证账簿、科目、业务伙伴、日期分组汇总展开,不仅人性化的补充了毛利润和总费用栏目,每个子项最后都增加了其他虚拟项来归集父类项目的额外结余。
Odoo国内特色的现金流量表:支持期初现金余额正向推算和期末现金余额倒算两种验证方式,支持现金净增加额变化导致账面结果不平时可直接进一步进行明细核对来平账。
至此具有欧度软件财会体系本地化基础设施的三大报表总算圆满重构完成,接下来可以长期不断深耕成本核算,同时静等去SAP的浪潮到来,就如同十多年前经历的去IOE时代一样,机会永远是给有准备的人,最后祝愿各大类型企业都可以独立自主建设完全开源可控的实时会计智能财务系统。