[FIX] website_sale_aplicoop: Correct XPath for block element
- Changed xpath from div[@id='website_info_settings'] to block[@id='website_info_settings'] - Fixes RPC error when loading res.config.settings view [FIX] product_price_category_supplier: Convert README to reStructuredText - Converted README.md to README.rst for proper Odoo documentation - Fixed docutils warnings and formatting issues - Updated reStructuredText syntax for code blocks and literals
This commit is contained in:
parent
0d5f0be88c
commit
5ba8ddda92
3 changed files with 410 additions and 44 deletions
189
product_price_category_supplier/README.rst
Normal file
189
product_price_category_supplier/README.rst
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
======================================
|
||||
Product Price Category - Supplier
|
||||
======================================
|
||||
|
||||
Extiende ``res.partner`` (proveedores) con un campo de categoría de precio por
|
||||
defecto y permite actualizar masivamente todos los productos de un proveedor con
|
||||
esta categoría mediante un wizard.
|
||||
|
||||
Funcionalidades
|
||||
===============
|
||||
|
||||
- **Campo en Proveedores**: Añade campo ``default_price_category_id`` en la
|
||||
pestaña "Compras" (Purchases) de res.partner
|
||||
- **Actualización Masiva**: Botón que abre wizard modal para confirmar
|
||||
actualización de todos los productos del proveedor
|
||||
- **Columna Configurable**: Campo oculto en vista tree de partner,
|
||||
visible/configurable desde menú de columnas
|
||||
- **Control de Permisos**: Acceso restringido a
|
||||
``sales_team.group_sale_manager`` (Gestores de Ventas)
|
||||
|
||||
Dependencias
|
||||
============
|
||||
|
||||
- ``product_price_category`` (OCA addon base)
|
||||
- ``product_pricelists_margins_custom`` (Addon del proyecto)
|
||||
- ``sales_team`` (Odoo core)
|
||||
|
||||
Instalación
|
||||
===========
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker-compose exec -T odoo odoo -d odoo -u product_price_category_supplier --stop-after-init
|
||||
|
||||
Flujo de Uso
|
||||
============
|
||||
|
||||
1. Abrir formulario de un **Proveedor** (res.partner)
|
||||
2. Ir a pestaña **"Compras"** (Purchases)
|
||||
3. En sección **"Price Category Settings"**, seleccionar **categoría de precio
|
||||
por defecto**
|
||||
4. Hacer clic en botón **"Apply to All Products"**
|
||||
5. Se abre modal de confirmación mostrando:
|
||||
|
||||
- Nombre del proveedor
|
||||
- Categoría de precio a aplicar
|
||||
- Cantidad de productos que serán actualizados
|
||||
|
||||
6. Hacer clic **"Confirm"** para ejecutar actualización en bulk
|
||||
7. Notificación de éxito mostrando cantidad de productos actualizados
|
||||
|
||||
Campos
|
||||
======
|
||||
|
||||
res.partner
|
||||
-----------
|
||||
|
||||
- ``default_price_category_id`` (Many2one → product.price.category)
|
||||
|
||||
- Ubicación: Pestaña "Compras", sección "Price Category Settings"
|
||||
- Obligatorio: No
|
||||
- Ayuda: "Default price category for products from this supplier"
|
||||
- Visible en tree: Oculto por defecto (column_invisible=1), configurable vía menú
|
||||
|
||||
Modelos
|
||||
=======
|
||||
|
||||
wizard.update.product.category (Transient)
|
||||
-------------------------------------------
|
||||
|
||||
- ``partner_id`` (Many2one → res.partner) - Readonly
|
||||
- ``partner_name`` (Char, related to partner_id.name) - Readonly
|
||||
- ``price_category_id`` (Many2one → product.price.category) - Readonly
|
||||
- ``product_count`` (Integer) - Cantidad de productos a actualizar - Readonly
|
||||
|
||||
**Métodos**:
|
||||
|
||||
- ``action_confirm()`` - Realiza bulk update de productos y retorna notificación
|
||||
|
||||
Vistas
|
||||
======
|
||||
|
||||
res.partner
|
||||
-----------
|
||||
|
||||
- **Form**: Campo + botón en pestaña "Compras"
|
||||
- **Tree**: Campo oculto (column_invisible=1)
|
||||
|
||||
wizard.update.product.category
|
||||
------------------------------
|
||||
|
||||
- **Form**: Formulario modal con información de confirmación y botones
|
||||
|
||||
Seguridad
|
||||
=========
|
||||
|
||||
Acceso al wizard restringido a grupo ``sales_team.group_sale_manager``:
|
||||
|
||||
- Lectura: Sí
|
||||
- Escritura: Sí
|
||||
- Creación: Sí
|
||||
- Borrado: Sí
|
||||
|
||||
Comportamiento
|
||||
==============
|
||||
|
||||
Actualización de Productos
|
||||
--------------------------
|
||||
|
||||
Cuando el usuario confirma la acción:
|
||||
|
||||
1. Se buscan todos los productos (``product.template``) donde:
|
||||
|
||||
- ``default_supplier_id = partner_id`` (este proveedor es su proveedor por
|
||||
defecto)
|
||||
|
||||
2. Se actualizan en bulk (single SQL UPDATE) con:
|
||||
|
||||
- ``price_category_id = default_price_category_id``
|
||||
|
||||
3. Se retorna notificación de éxito:
|
||||
|
||||
- "X products updated with category 'CATEGORY_NAME'."
|
||||
|
||||
**Nota**: La actualización SOBRESCRIBE cualquier ``price_category_id``
|
||||
existente en los productos.
|
||||
|
||||
Extensión Futura
|
||||
================
|
||||
|
||||
Para implementar defaults automáticos al crear productos desde un proveedor:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# En models/product_template.py
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
# Si se proporciona default_supplier_id sin price_category_id,
|
||||
# usar default_price_category_id del proveedor
|
||||
for vals in vals_list:
|
||||
if vals.get('default_supplier_id') and not vals.get('price_category_id'):
|
||||
supplier = self.env['res.partner'].browse(vals['default_supplier_id'])
|
||||
if supplier.default_price_category_id:
|
||||
vals['price_category_id'] = supplier.default_price_category_id.id
|
||||
return super().create(vals_list)
|
||||
|
||||
Traducciones
|
||||
============
|
||||
|
||||
Para añadir/actualizar traducciones:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Exportar strings
|
||||
docker-compose exec -T odoo odoo -d odoo \
|
||||
--addons-path=/mnt/extra-addons/product_price_category_supplier \
|
||||
-i product_price_category_supplier \
|
||||
--i18n-export=/tmp/product_price_category_supplier.pot \
|
||||
--stop-after-init
|
||||
|
||||
# Mergar en archivos .po existentes
|
||||
cd product_price_category_supplier/i18n
|
||||
for lang in es eu; do
|
||||
msgmerge -U ${lang}.po product_price_category_supplier.pot
|
||||
done
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Ejecutar tests:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker-compose exec -T odoo odoo -d odoo \
|
||||
-i product_price_category_supplier \
|
||||
--test-enable --stop-after-init
|
||||
|
||||
Créditos
|
||||
========
|
||||
|
||||
Autor
|
||||
-----
|
||||
|
||||
Your Company - 2026
|
||||
|
||||
Licencia
|
||||
--------
|
||||
|
||||
AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
||||
Loading…
Add table
Add a link
Reference in a new issue