Skip to content

Conversation

@migration-bot-adhoc
Copy link
Contributor

No description provided.

@roboadhoc
Copy link

Pull request status dashboard

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR realiza la migración del módulo product_uoms_purchase de Odoo 18.0 a 19.0, simplificando significativamente la arquitectura del módulo al eliminar la dependencia del módulo product_uoms y adoptar un enfoque más directo basado en campos Many2many y la nueva API de Odoo 19 para control de UOMs permitidas en líneas de compra.

  • Se elimina la dependencia de product_uoms y se reemplaza la funcionalidad con campos directos en product.template
  • Se migra de un sistema basado en modelo intermedio (product.uoms con flag purchase_ok) a campos Many2many directos (uom_po_ids) con control boolean (only_po_packagings)
  • Se adapta la lógica de control de UOMs para usar el nuevo método _compute_allowed_uom_ids de Odoo 19 en lugar de onchanges y constraints

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
product_uoms_purchase/__manifest__.py Actualiza versión a 19.0.1.0.0, elimina dependencia de product_uoms, comenta archivo de seguridad obsoleto y marca módulo como instalable
product_uoms_purchase/models/__init__.py Elimina imports de modelos product_uoms y product_product que ya no existen
product_uoms_purchase/models/product_template.py Reemplaza método compute _compute_uom_po_id por dos campos nuevos: uom_po_ids (Many2many) y only_po_packagings (Boolean)
product_uoms_purchase/models/purchase_order_line.py Migra de sistema con onchange/constraints a implementación de _compute_allowed_uom_ids que extiende funcionalidad base de Odoo 19
product_uoms_purchase/models/product_uoms.py Archivo eliminado completamente - modelo intermedio ya no necesario
product_uoms_purchase/models/product_product.py Archivo eliminado completamente - método get_product_uoms ya no necesario
product_uoms_purchase/views/purchase_order_views.xml Archivo eliminado - la funcionalidad ahora se maneja a nivel de modelo con allowed_uom_ids
product_uoms_purchase/views/product_template_views.xml Reemplaza herencia de vista de product_uoms por herencia directa de product, añade sección "Packaging" con campos uom_po_ids y only_po_packagings

product.display_name,
)
)
@api.depends("product_id.product_tmpl_id.only_po_packagings")
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

El decorador @api.depends está incompleto. La dependencia declarada es "product_id.product_tmpl_id.only_po_packagings", pero el método también accede a "product_id.seller_ids" y "product.uom_po_ids" (líneas 17 y 19). Deberías agregar estas dependencias al decorador para que el campo compute se recalcule correctamente cuando cambien esos valores relacionados.

Suggested change
@api.depends("product_id.product_tmpl_id.only_po_packagings")
@api.depends(
"product_id.product_tmpl_id.only_po_packagings",
"product_id.seller_ids.product_uom_id",
"product_id.uom_po_ids",
)

Copilot uses AI. Check for mistakes.
Comment on lines 27 to 28
"depends": [
"product_uoms",
# TODO when migrate analyze if this depends are necessary or
# we do the part of the "stock.rule" in a bridge module
"purchase_stock",
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se eliminó la dependencia de "product_uoms" del manifest, pero la vista hereda de "product.product_template_only_form_view" en lugar de la referencia original que era "product_uoms.product_template_only_form_view" (línea 7). Esto es correcto si el módulo "product_uoms" ya no es necesario, pero debes verificar que esta nueva herencia es la correcta para Odoo 19 y que no quedan referencias rotas. Además, dado que se eliminaron varios modelos (product_uoms, product_product), necesitas un script de migración para limpiar los datos huérfanos de esos modelos eliminados en la base de datos.

Copilot generated this review using guidance from repository custom instructions.
Comment on lines 11 to 24
uom_po_ids = fields.Many2many(
"uom.uom",
"product_template_uom_po_rel",
"product_tmpl_id",
"uom_id",
string="Purchase Packagings",
help="Additional packagings for this product which can be used for purchase",
domain="[('id', '!=', uom_id)]",
)

only_po_packagings = fields.Boolean(
default=False,
help="When enabled, only UoMs defined in product packagings will be available for selection in purchase orders.",
)
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se están agregando dos campos nuevos almacenados (uom_po_ids y only_po_packagings) al modelo product.template, lo cual constituye un cambio estructural. Según las guías de migración, necesitas crear un script de migración en migrations/19.0.1.0.0/ (carpeta post) para:

  1. Poblar el campo uom_po_ids con los valores existentes de las UOMs de compra que había en el módulo anterior (si hay datos a migrar)
  2. Configurar el campo only_po_packagings con valores por defecto apropiados para productos existentes
  3. Hacer el backfill en lotes si el modelo tiene muchos registros

El script debe ser idempotente y registrar logs claros de las operaciones realizadas.

Copilot generated this review using guidance from repository custom instructions.
if product:
supplier_uoms = product.seller_ids.mapped("product_uom_id")
if product.product_tmpl_id.only_po_packagings:
line.allowed_uom_ids = product.uom_po_ids | supplier_uoms
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

En la línea 19, cuando only_po_packagings es True, se asigna directamente product.uom_po_ids | supplier_uoms, pero esto podría resultar en un conjunto vacío si no hay UOMs configuradas en uom_po_ids. Considera verificar si es necesario incluir al menos la UOM base del producto (product.uom_id o product.uom_po_id) para evitar que las líneas de compra queden sin opciones válidas de UOM. En la línea 21, para el caso contrario, estás combinando correctamente con allowed_uom_ids del super(), lo que sugiere que el caso de la línea 19 también debería considerar valores base.

Suggested change
line.allowed_uom_ids = product.uom_po_ids | supplier_uoms
uoms = product.uom_po_ids | supplier_uoms
if not uoms:
uoms = product.uom_po_id | product.uom_id
line.allowed_uom_ids = uoms

Copilot uses AI. Check for mistakes.
Comment on lines +11 to +17
<field
name="uom_po_ids"
widget="many2many_uom_tags"
options="{'no_create': True, 'edit_tags': True}"
groups="uom.group_uom"
force_save="1"
context="{'product_id': product_variant_id if product_variant_count == 1 else False, 'product_ids': product_variant_ids, 'show_variant_name': product_variant_count > 1}"/>
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

El campo uom_po_ids se presenta con el widget "many2many_uom_tags", pero la ayuda visible para el usuario ("Purchase Packagings") podría no ser clara sin más contexto. Considera si el string actual es suficientemente descriptivo para el usuario final, o si debería llamarse "Purchase UoMs" o algo más explícito. Además, verifica que el widget "many2many_uom_tags" esté disponible en Odoo 19 y funcione correctamente, ya que es un widget específico que puede haber cambiado entre versiones.

Copilot uses AI. Check for mistakes.
<odoo>

<record id="product_template_only_form_view" model="ir.ui.view">
<field name="name">product.sale.uom.form</field>
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

El name de la vista es "product.sale.uom.form", pero esta vista es para compras (purchase), no para ventas (sale). El nombre debería ser algo como "product.purchase.uom.form" o "product.po.uom.form" para reflejar correctamente su propósito y evitar confusión.

Suggested change
<field name="name">product.sale.uom.form</field>
<field name="name">product.purchase.uom.form</field>

Copilot uses AI. Check for mistakes.
"views/product_template_views.xml",
"views/purchase_order_views.xml",
"security/ir.model.access.csv",
# "security/ir.model.access.csv",
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

El archivo de seguridad está comentado pero todavía existe en el módulo. Este archivo ir.model.access.csv contiene permisos de acceso para el modelo product_uoms que ya no existe en esta migración (fue eliminado en los cambios). Deberías eliminar completamente este archivo del módulo y la referencia comentada del manifest, ya que no tiene utilidad alguna.

Suggested change
# "security/ir.model.access.csv",

Copilot uses AI. Check for mistakes.
@mav-adhoc mav-adhoc force-pushed the 19.0-mig-product_uoms_purchase branch from b2796ac to 650ba29 Compare January 2, 2026 17:51
@mav-adhoc mav-adhoc force-pushed the 19.0-mig-product_uoms_purchase branch from 650ba29 to 8d8c6ea Compare January 2, 2026 17:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants