Cálculos em Tempo Real no Odoo: Somas Dinâmicas em Vistas...

May 30, 2025 by
Cálculos em Tempo Real no Odoo: Somas Dinâmicas em Vistas...
OdooBot

Cálculos em Tempo Real no Odoo: Somas Dinâmicas em Vistas de Árvore com OWL e JavaScript

Descobre como levar os teus relatórios de linha no Odoo a outro nível: somas e cálculos em tempo real diretamente na vista de árvore, sem refresh de página. Aprende a criar um módulo simples que implementa esta funcionalidade e descobre como a OpenCloud pode ajudar-te a acelerar essas customizações.


Porquê Cálculos em Tempo Real?

  • Experiência do Utilizador: informações instantâneas eliminam a necessidade de pressionar “Atualizar”.
  • Decisões Mais Rápidas: ao veres os totais em tempo real, identificas desvios e oportunidades de imediato.
  • Menos Códigos no Servidor: toda a lógica de soma passa para o cliente, reduzindo chamadas RPC.

1. Estrutura do Módulo

Vamos criar o módulo real_time_sum:

real_time_sum/ ├── __init__.py ├── __manifest__.py ├── static/ │ ├── src/ │ │ ├── js/ │ │ │ └── sum_in_tree.js │ │ └── xml/ │ │ └── sum_in_tree_templates.xml ├── views/ │ └── real_time_sum_views.xml

1.1 manifest.py

python { 'name': 'Real Time Sum in Tree View', 'version': '16.0.1.0.0', 'category': 'Tools', 'summary': 'Exibe somas dinâmicas em vista de árvore', 'author': 'OpenCloud', 'website': 'https://www.opencloud.pro', 'depends': ['web'], 'assets': { 'web.assets_backend': [ 'real_time_sum/static/src/js/sum_in_tree.js', 'real_time_sum/static/src/xml/sum_in_tree_templates.xml', ], }, 'installable': True, 'application': False, }


2. Lógica JavaScript: sum_in_tree.js

Neste ficheiro vai residir o “motor” que escuta mudanças e recalcula totais:

```javascript / @odoo-module /

import { patch } from '@web/core/utils/patch'; import ListRenderer from 'web.ListRenderer';

patch(ListRenderer.prototype, 'real_time_sum', { _renderView() { const result = this._super(...arguments); this._computeSums(); return result; }, _computeSums() { const rows = this.el.querySelectorAll('tbody tr'); let total = 0; rows.forEach(row => { const cell = row.querySelector('td.o_data_cell[data-field="amount"]'); if (cell) { const value = parseFloat(cell.innerText) || 0; total += value; } }); this._updateFooter(total); }, _updateFooter(total) { let footer = this.el.querySelector('tfoot tr.sum-row'); if (!footer) { footer = document.createElement('tr'); footer.classList.add('sum-row'); footer.innerHTML = <td colspan="3"><strong>Total em Tempo Real:</strong></td> <td class="o_data_cell">${total.toFixed(2)}</td>; this.el.querySelector('tfoot').appendChild(footer); } else { footer.querySelector('td.o_data_cell').innerText = total.toFixed(2); } }, }); ```


3. Template XML: sum_in_tree_templates.xml

Regista um footer fixo que receberá o total:

xml <templates xml:space="preserve"> <t t-name="ListView.Footer"> <tfoot> <!-- A nossa soma será injetada aqui --> </tfoot> </t> </templates>


4. Ativar a Feature na Vista

Por fim, adiciona um atributo à tua vista de árvore no ficheiro real_time_sum_views.xml:

xml <odoo> <record id="view_order_tree_sum" model="ir.ui.view"> <field name="name">sale.order.tree.real_time_sum</field> <field name="model">sale.order.line</field> <field name="inherit_id" ref="sale.view_order_line_tree"/> <field name="arch" type="xml"> <xpath expr="//tree" position="attributes"> <attribute name="js_class">o_real_time_sum</attribute> </xpath> </field> </record> </odoo>


5. Testa e Valida

  1. Atualiza a lista de módulos: Apps → Atualizar.
  2. Instala Real Time Sum in Tree View.
  3. Navega para Vendas ▶ Linhas de Encomenda.
  4. Altera quantidades ou preços unitários e vê a soma atualizar no rodapé da tabela automaticamente!

Vantagens e Próximos Passos

  • Flexibilidade: adapta o script para outros campos ou modelos.
  • Internacionalização: aplica traduções e formatação de moeda.
  • Performance: para milhares de linhas, considera debouncing e lazy rendering.

Se queres acelerar estas customizações no teu Odoo, a equipa da OpenCloud está pronta para ajudar-te. Visita-nos em www.opencloud.pro e torna-te parceiro de quem entende de Odoo.


Sobre a OpenCloud

A OpenCloud é Parceiro Oficial Odoo em Portugal. Oferecemos:

  • Implementação e suporte técnico
  • Desenvolvimento de módulos personalizados
  • Otimização de performance e escalabilidade
  • Formação e suporte contínuo

Contacta-nos e impulsiona o teu ERP Odoo para o próximo nível!