[REF] account_payment_pro_receiptbook: batch made_sequence_gap writes - #1187
[REF] account_payment_pro_receiptbook: batch made_sequence_gap writes#1187ica-adhoc wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Pull request overview
Este PR refactoriza _update_receiptbook_made_sequence_gap() en el módulo account_payment_pro_receiptbook para evitar writes registro-por-registro sobre account.move (y el costo de overrides aguas abajo), manteniendo el mismo resultado funcional del flag made_sequence_gap.
Changes:
- Acumula los
account.moveque deben quedar conmade_sequence_gap=Truey difiere la escritura. - Reduce los writes a como mucho 2 operaciones (set/unset) y solo cuando el valor almacenado realmente difiere.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| if to_set := moves_to_check.filtered(lambda m: m.id in gap_ids and not m.made_sequence_gap): | ||
| to_set.made_sequence_gap = True | ||
| if to_unset := moves_to_check.filtered(lambda m: m.id not in gap_ids and m.made_sequence_gap): | ||
| to_unset.made_sequence_gap = False |
- Collect the ids that make a gap instead of assigning move by move in _update_receiptbook_made_sequence_gap - Write at most twice (True / False) and only on the moves whose stored value actually changes, same criterion as the core _update_sequence_made_gap - Each assignment is a write on account.move and drags the overrides of every installed module (purchase maps line_ids.purchase_line_id.order_id per move), so the previous per-record loop scaled badly on large recordsets - No functional change: the resulting made_sequence_gap is identical - Add tests: gap detection inside a receiptbook, scoping to the receiptbook instead of the journal, and no write when the stored value is already correct Change note: Mejora interna de rendimiento. Al registrar o postear recibos en tandas grandes, el sistema ya no reescribe uno por uno el control de numeración de los talonarios: actualiza solamente los recibos cuyo valor cambia. No hay cambios visibles en pantalla ni en el comportamiento de la numeración.
323c014 to
77377c5
Compare
|
Sumé tests al PR (amend sobre el mismo commit).
El conteo se hace envolviendo
Los números de secuencia se asertan de forma relativa, no absoluta: CorridasLos 9 tests del módulo, sobre una base 19.0 limpia con el módulo instalado: Y contra el código anterior al PR, revirtiendo solo Los cinco writes separados —uno por asiento, todos escribiendo el valor que ya estaba guardado— son exactamente el comportamiento que el PR elimina. Los otros dos tests pasan en ambas versiones, que es lo esperado: son guardas de regresión, no del cambio. |
|
@roboadhoc r+ nobump |

Problema
_update_receiptbook_made_sequence_gap()asignamade_sequence_gapregistro por registro, y escribe siempre, cambie o no el valor guardado:Como el campo es stored, cada asignación es un
write()sobreaccount.movey arrastra los overrides de todos los módulos instalados. El más caro es el de Purchase, que hacemove.mapped('line_ids.purchase_line_id.order_id')por asiento. Sobre recordsets grandes eso escala mal — en el caso extremo (barrido de toda la tabla) termina enMemoryError, que es lo que corrige #1186.El core evita exactamente esto en
_update_sequence_made_gap():Solución
Acumular los ids que hacen hueco y escribir al final, como mucho dos veces (
True/False), solo sobre los asientos cuyo valor guardado difiere. En la práctica lo habitual es 0 writes, porque el valor ya es el correcto.Sin cambio funcional: el
made_sequence_gapresultante es idéntico.Test plan
Simulación de ambas versiones del método sobre datos sintéticos, comparando estado final y contando writes. 25 escenarios: el barrido completo más 24 llamadas puntuales de 1 a 3 asientos, que es la forma en que el método se llama en runtime desde
_update_sequence_made_gap().Este PR es independiente de #1186 y se puede mergear en cualquier orden: aquel toca solo
migrations/19.0.2.4.0/post-migration.py, este solomodels/account_move.py.Ticket: https://www.adhoc.inc/odoo/helpdesk.ticket/126129