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
- Atualiza a lista de módulos: Apps → Atualizar.
- Instala Real Time Sum in Tree View.
- Navega para Vendas ▶ Linhas de Encomenda.
- 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!