Odoo 14 POS会话中准确读取现金支付总额的教程与调试指南


Odoo 14 POS会话中准确读取现金支付总额的教程与调试指南

本教程详细指导如何在odoo 14的pos会话中,通过j*ascript代码准确获取所有订单的现金支付总额。文章强调了利用浏览器开发者工具进行对象结构检查和调试的重要性,并提供了具体的代码示例和调试技巧,帮助开发者有效解决前端数据访问问题,确保准确地遍历订单及其支付行,识别并累加现金支付金额。

在Odoo 14的销售点(POS)模块中,开发者经常需要访问当前会话中的订单数据,例如获取特定支付方式(如现金)的总金额。这要求我们深入理解Odoo前端数据模型的结构,并掌握有效的调试方法。

理解Odoo POS会话数据结构

在Odoo POS前端,所有活动订单和其相关的支付信息都存储在 this.env.pos 对象中。要获取当前POS会话中的所有订单,我们通常会使用 this.env.pos.get_order_list() 方法。

每个订单对象内部,其支付行(payment lines)通常存储在一个集合中,在Odoo 14这类版本中,这通常是Backbone.js模型的集合,因此需要通过 .models 属性来访问实际的支付行数组。每个支付行对象又包含了支付方式(cashregister)和金额(amount)等关键信息。

为了准确识别现金支付,我们需要检查支付行关联的日记账类型。现金支付通常对应于类型为 'cash' 的日记账。

核心代码实现:计算现金支付总额

以下代码片段展示了如何正确遍历当前POS会话中的所有订单及其支付行,并计算现金支付的总额:

get totalCash() {
    // 在此处设置断点,以便在浏览器开发者工具中进行详细检查
    debugger; 

    // 获取当前POS会话中的所有订单列表
    const orders = this.env.pos.get_order_list();
    let totalCash = 0;

    console.log("订单列表: ", orders);

    // 遍历每个订单
    for (const order of orders) {
        console.log("当前订单: ", order);

        // 遍历订单中的每个支付行。
        // 注意:order.paymentlines通常是一个集合对象,需要通过.models访问其内部数组。
        for (const paymentLine of order.paymentlines.models) {
            console.log("当前支付行: ", paymentLine);

            // 检查支付方式是否为现金
            // 支付方式的类型信息通常存储在 paymentLine.cashregister.journal.type 中
            if (paymentLine.cashregister && paymentLine.cashregister.journal && paymentLine.cashregister.journal.type === 'cash') {
                console.log("支付方式类型: ", paymentLine.cashregister.journal.type);
                console.log("累加前金额: ", totalCash);
                totalCash += paymentLine.amount;
                console.log("累加后金额: ", totalCash);
            }
        }
    }

    // 返回总现金金额,并保留两位小数
    return totalCash.toFixed(2);
}

代码解析:

AletheaAI AletheaAI

世界上第一个从自然语言描述中生成交互式 AI 角色的多模态 AI 系统。

AletheaAI 83 查看详情 AletheaAI
  1. const orders = this.env.pos.get_order_list();: 获取当前POS会话中的所有订单对象。
  2. for (const order of orders): 遍历 orders 数组中的每一个订单。
  3. for (const paymentLine of order.paymentlines.models): 这是关键一步。order.paymentlines 是一个集合(Collection)对象,其内部实际的模型数组需要通过 .models 属性来访问。遍历这个数组以获取每个支付行对象。
  4. if (paymentLine.cashregister && paymentLine.cashregister.journal && paymentLine.cashregister.journal.type === 'cash'): 这是一个健壮的检查,确保 cashregister 和 journal 属性存在,然后判断 journal.type 是否为 'cash'。
  5. totalCash += paymentLine.amount;: 如果是现金支付,则将支付行的金额累加到 totalCash 变量中。
  6. return totalCash.toFixed(2);: 返回计算出的总现金金额,并使用 toFixed(2) 方法将其格式化为两位小数的字符串,这对于货币金额显示是常见的做法。

强大的调试利器:浏览器开发者工具

在Odoo前端开发中,理解和检查J*aScript对象的结构至关重要。当遇到“似乎找到了对象,但属性名称不对”的问题时,浏览器开发者工具是解决此类问题的最佳途径。

使用步骤:

  1. 插入 debugger; 语句: 在你想要检查代码执行流程和变量状态的位置,例如在 get totalCash() 方法的开头,添加 debugger; 语句。
    get totalCash() {
        debugger; // 在这里设置一个断点
        // ... 你的代码 ...
    }
  2. 打开开发者工具: 在浏览器中,右键点击Odoo页面,选择“检查”(Inspect)或按下 Ctrl+Shift+I(Mac上是 Cmd+Option+I)。
  3. 触发代码执行: 执行会调用你插入 debugger; 语句的代码逻辑(例如,在POS界面中执行一个操作,该操作会调用 totalCash 方法)。
  4. 在断点处暂停: 当代码执行到 debugger; 语句时,浏览器会自动暂停在“Sources”或“源”面板中。
  5. 检查变量和对象:
    • 在“Scope”或“作用域”面板中,你可以查看当前作用域内的所有变量及其值。
    • 在“Console”或“控制台”面板中,你可以手动输入变量名(例如 orders 或 paymentLine),然后按回车键来检查其完整的对象结构和所有可用属性。你可以展开这些对象来层层深入地查看其内容。
    • 通过这种方式,你可以准确地发现 paymentLine 对象中,金额属性是 amount,而支付类型信息位于 cashregister.journal.type。

这种交互式调试方法远比简单的 console.log 更强大和直观,它能让你实时地探索复杂的数据结构,从而快速定位并修正属性访问错误。

注意事项与最佳实践

  • 数据模型变动: Odoo的不同版本或自定义模块可能会对前端数据模型结构进行修改。因此,即使是看似正确的代码,在升级Odoo版本后也可能需要重新检查和调试。
  • 健壮性检查: 在访问嵌套属性(如 paymentLine.cashregister.journal.type)时,最好进行空值或 undefined 检查,例如 if (paymentLine.cashregister && paymentLine.cashregister.journal && ...),以避免运行时错误。
  • 异步操作: 如果你的数据获取涉及异步操作(例如通过RPC调用后端),请确保正确处理Promise,使用 async/await 或 .then() 方法来确保在数据可用时才进行处理。本教程中的 get_order_list() 通常是同步的。
  • 性能考量: 对于非常大量的订单和支付行,频繁的循环和复杂的逻辑可能会影响POS前端的性能。在设计时应考虑优化算法。

总结

在Odoo 14 POS会话中准确获取现金支付总额,需要对前端数据模型有清晰的理解,并熟练运用浏览器开发者工具进行调试。通过本文提供的代码示例和调试指南,开发者可以有效地遍历订单和支付行,准确识别并累加现金支付金额,同时也能掌握解决类似前端数据访问问题的通用方法。始终记住,当不确定对象结构时,debugger; 和控制台是你的最佳伙伴。

以上就是Odoo 14 POS会话中准确读取现金支付总额的教程与调试指南的详细内容,更多请关注其它相关文章!


# java  # 火锅小碗菜营销推广方案  # 2018淘宝店营销推广  # 重庆网站推广徽xiala5  # 新公众号seo优化  # 兰溪网站建设方案  # 东莞网站建设求职简历  # 杨浦区营销策划推广公司  # 广东短视频营销推广方法  # phpweb文章添加seo  # 有什么区别  # 如何使用  # 两位  # 是一个  # 如何实现  # 支付方式  # 数据结构  # 你可以  # 遍历  #   # 作用域  # 数据访问  # ai  # 前端开发  # mac  # 后端  # 工具  # 浏览器  # 前端  # js  # javascript  # 小金口网站优化外包服务 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: Go语言反射机制:如何访问被嵌入结构体遮蔽的方法  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践  智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析  Dash应用多值文本输入处理与类型转换教程  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程  铁路12306座位怎么选_12306官方选座操作方法  如何外贸网站设计-能留住客户提升用户体验!  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  PHP页面重载时变量值不重置的实现方法  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  《环球网校》设置报考省市方法  海外搜索引擎推广效果怎么样,怎么分析效果!  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  网页版网易云音乐入口_网易云音乐在线官网登录  sublime text 4如何安装_最新版sublime下载与汉化教程  优化2xN网格最大路径和的动态规划算法实践  《三国:谋定天下》平民全阶段通用阵容  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  J*a实现任务清单管理_集合框架综合入门练手  sf漫画官网登录入口直达_sf漫画官方正版网址  mysql导入sql文件能分批导入吗_mysql分批次导入大sql文件的实用技巧  Go反射进阶:访问内嵌结构体中的被遮蔽方法  《植物大战僵尸3》火龙草作用介绍  J*aScript大数运算_BigInt使用指南  Lar*el Eloquent中通过Join查询关联数据表:解决多行子查询问题  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明  《荔枝fm》导出文件教程  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  《腾讯相册管家》注销账号方法  rabbitmq 持久化有什么缺点?  苹果手机聊天记录删除了如何恢复  J*aScript:从子元素中批量移除特定CSS类  在VS Code中利用AI辅助进行代码迁移  OpenWeatherMap API:通过城市名称获取天气预报数据指南  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  睡觉时心跳快是什么原因 夜间心悸如何应对  Animex动漫社社登录官网 Animex动漫社资源社入口直达  AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  中大网校app做题记录清除方法  小红书网页版首页入口 小红书网页版电脑端官方登录链接  漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程  HTML中多图片上传与预览:解决ID冲突的专业指南  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明  百度浏览器无法安装扩展程序_百度浏览器插件安装失败原因解析  《全民k歌》网页版最新登录入口一览  VS Code快捷键when上下文子句的妙用  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】 

 2025-12-12

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.