diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md deleted file mode 100644 index 6495dec..0000000 --- a/.github/copilot-instructions.md +++ /dev/null @@ -1,411 +0,0 @@ -# GitHub Copilot Instructions - Kidekoop Addons Custom - -## Project Overview - -Este repositorio contiene addons personalizados y modificados de Odoo 18.0. El proyecto combina: - -- **OCB (Odoo Community Backports)**: Base de Odoo 18.0 community en `/ocb` -- **Addons OCA**: Módulos de la comunidad OCA de los que heredan nuestros addons, modificados para adaptarse a nuestras necesidades -- **Addons Custom**: Módulos desarrollados por este proyecto - -## Architecture & Stack - -- **Odoo Version**: 18.0 (OCB) -- **Python Version**: 3.10+ -- **Framework**: Odoo ORM -- **Deployment**: Docker Compose -- **DB**: PostgreSQL -- **Languages**: Python, XML, JavaScript, QWeb - -## Code Standards - -### Python Style - -- Seguir **OCA guidelines** estrictamente -- Usar **black** para formateo (configurado en `pyproject.toml`) -- **isort** para ordenar imports (perfil black) -- **flake8** para linting -- **pylint** con pylint-odoo para verificaciones específicas de Odoo -- Pre-commit hooks activos (ver `.pre-commit-config.yaml`) - -### Odoo Conventions - -- **Model names**: snake_case con punto (`product.price.category`) -- **Class names**: PascalCase (`ProductPriceCategory`) -- **File names**: snake_case (`product_price_category.py`) -- **XML IDs**: módulo.nombre_descriptivo (`product_price_category.view_form`) -- **Manifest**: Siempre `__manifest__.py`, nunca `__openerp__.py` - -### XML/View Standards - -- **Indent**: 4 espacios (no tabs) -- **XPath**: Usar `position` explícito (`before`, `after`, `inside`, `replace`, `attributes`) -- **Groups**: Referenciar grupos con módulo.xml_id (`sales_team.group_sale_manager`) -- **Sequence**: Usar `sequence` attribute para ordenar campos en vistas - -### Translation System - -**IMPORTANTE**: El sistema de traducciones está funcionando correctamente. Seguir estas reglas: - -1. **Estructura de carpeta i18n/**: - - ``` - addon_name/ - ├── i18n/ - │ ├── es.po # Español (obligatorio) - │ ├── eu.po # Euskera (obligatorio) - │ └── addon_name.pot # Template (generado) - ``` - -2. **NO usar `_()` en definiciones de campos a nivel de módulo**: - - ```python - # ❌ INCORRECTO - causa warnings - from odoo import _ - name = fields.Char(string=_("Name")) - - # ✅ CORRECTO - traducción se maneja por .po files - name = fields.Char(string="Name") - ``` - -3. **Usar `_()` solo en métodos y código ejecutable**: - - ```python - def action_confirm(self): - message = _("Confirmed successfully") - return {'warning': {'message': message}} - ``` - -4. **Generar/actualizar traducciones**: - - ```bash - # Exportar términos a traducir - Pedir al usuario generar a través de UI, no sabemos el método correcto para exportar SÓLO las cadenas del addon sin incluir todo el sistema. - ``` - -Usar sólo polib para trataer los archivos .po, msmerge corrompe los archivos. - -``` - -5. **Formato de archivos .po**: -- Encoding: UTF-8 -- Content-Type: text/plain; charset=UTF-8 -- Language codes: `es`, `eu`, `ca`, `gl`, `pt`, `fr`, `it` - -## Project Structure - -``` - -addons-cm/ -├── .github/ # GitHub configs -│ └── copilot-instructions.md # Este archivo -├── ocb/ # Odoo Community Backports (18.0) -│ └── addons/ # Addons core de Odoo -├── oca_dependencies.txt # Dependencias OCA -├── requirements.txt # Dependencias Python -├── docker-compose.yml # Configuración Docker -├── Makefile # Comandos útiles -│ -├── # === ADDONS OCA NO MODIFICADOS === -├── account_invoice_triple_discount/ # Triple descuento en facturas (OCA) -├── purchase_triple_discount/ # Triple descuento en compras (OCA) -├── product_origin/ # Origen del producto (OCA) -├── product_get_price_helper/ # Helper de precios (OCA) -├── product_main_seller/ # Proveedor principal (OCA) -├── product_price_category/ # Categorías de precio (OCA) -│ -├── # === ADDONS CUSTOM === -├── account_invoice_triple_discount_readonly/ # Fix para triple descuento -├── product_price_category_supplier/ # Extensión categorías precio -├── product_sale_price_from_pricelist/ # Auto-cálculo precio venta -└── website_sale_aplicoop/ # Sistema eskaera (compras grupo) - -```` - -## Addon References - -**Para arquitectura, detalles de implementación y uso específico de cada addon, consultar su `README.md` individual.** - -### Addons OCA No Modificados - -- [account_invoice_triple_discount](../account_invoice_triple_discount/README.rst) -- [purchase_triple_discount](../purchase_triple_discount/README.rst) -- [product_origin](../product_origin/README.rst) -- [product_get_price_helper](../product_get_price_helper/README.rst) -- [product_main_seller](../product_main_seller/README.rst) -- [product_price_category](../product_price_category/README.rst) - -### Addons Custom Propios - -- [account_invoice_triple_discount_readonly](../account_invoice_triple_discount_readonly/README.md) - Fix bug descuentos -- [product_price_category_supplier](../product_price_category_supplier/README.md) - Gestión categorías por proveedor -- [product_sale_price_from_pricelist](../product_sale_price_from_pricelist/README.md) - Auto-precio basado en compra -- [website_sale_aplicoop](../website_sale_aplicoop/README.md) - Sistema eskaera completo - -## Development Workflow - -### Local Development - -```bash -# Iniciar entorno -docker-compose up -d - -# Actualizar addon -docker-compose exec odoo odoo -d odoo -u addon_name --stop-after-init - -# Ver logs -docker-compose logs -f odoo - -# Ejecutar tests -docker-compose exec odoo odoo -d odoo --test-enable --stop-after-init -u addon_name -```` - -### Quality Checks - -```bash -# Ejecutar todos los checks -pre-commit run --all-files - -# O usar Makefile -make lint # Solo linting -make format # Formatear código -make check-addon # Verificar addon específico -``` - -### Testing - -- Tests en `tests/` de cada addon -- Naming: `test_*.py` -- Herencia: `odoo.tests.common.TransactionCase` -- Ejecutar: `--test-enable` flag - -## Common Patterns - -### Extending Models - -```python -from odoo import models, fields, api - -class ResPartner(models.Model): - _inherit = 'res.partner' - - custom_field = fields.Char(string="Custom Field") - - @api.depends('field1', 'field2') - def _compute_custom(self): - for record in self: - record.custom_computed = record.field1 + record.field2 -``` - -### Creating Wizards (Transient Models) - -```python -class WizardModel(models.TransientModel): - _name = 'wizard.model.name' - _description = "Wizard Description" - - def action_confirm(self): - # Business logic - return {'type': 'ir.actions.act_window_close'} -``` - -### Bulk Updates - -```python -# Prefer SQL-level updates for performance -self.env['product.template'].search([ - ('default_supplier_id', '=', partner_id) -]).write({'price_category_id': category_id}) -``` - -### Notifications - -```python -return { - 'type': 'ir.actions.client', - 'tag': 'display_notification', - 'params': { - 'title': _('Success'), - 'message': _('Operation completed'), - 'type': 'success', # or 'warning', 'danger', 'info' - 'sticky': False, - } -} -``` - -## Dependencies Management - -### OCA Dependencies (`oca_dependencies.txt`) - -``` -account-invoicing -product-attribute -purchase-workflow -sale-workflow -``` - -### Python Dependencies (`requirements.txt`) - -- Versiones específicas para evitar breaking changes -- Incluir herramientas de desarrollo (linters, etc) - -## Security & Access Rights - -### Grupos Comunes - -- `base.group_user` - Usuario interno -- `base.group_system` - Administrador -- `sales_team.group_sale_manager` - Manager de ventas -- `sales_team.group_sale_salesman` - Vendedor -- `purchase.group_purchase_manager` - Manager de compras - -### Security Files - -```xml - -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_model_user,model.name.user,model_model_name,base.group_user,1,1,1,0 -``` - -## Common Issues & Solutions - -### Translation Warnings - -**Problem**: `WARNING: _() called at import time at module...` -**Solution**: Remove `_()` from field definitions, use only in methods - -### XPath Not Found - -**Problem**: `Element ... not found in parent view` -**Solution**: Check view inheritance chain, verify XML IDs are correct - -### Discount Reset Issue - -**Problem**: Multiple discounts being accumulated in discount1 -**Solution**: Use `account_invoice_triple_discount_readonly` addon - -### Price Calculation - -**Problem**: Prices not updating from pricelist -**Solution**: Use `product_sale_price_from_pricelist` with proper configuration - -## Testing Guidelines - -### Unit Tests - -- Test business logic in isolation -- Mock external dependencies -- Use `TransactionCase` for DB tests - -### Integration Tests - -- Test workflow end-to-end -- Verify computed fields -- Check access rights - -### UI Tests (Tours) - -```javascript -odoo.define("module.tour", function (require) { - "use strict"; - var tour = require("web_tour.tour"); - tour.register( - "tour_name", - { - test: true, - url: "/web", - }, - [ - // Tour steps - ], - ); -}); -``` - -## Debugging Tips - -### Enable Developer Mode - -``` -Settings > Activate Developer Mode -``` - -### Check Logs - -```bash -docker-compose logs -f odoo | grep ERROR -docker-compose logs -f odoo | grep addon_name -``` - -### Python Debugger - -```python -import pdb; pdb.set_trace() # Set breakpoint -``` - -### Performance Profiling - -```bash ---log-level=debug_sql # Show SQL queries -``` - -## Documentation Standards - -### README.md Structure - -Cada addon debe tener un README.md con: - -1. **Title & Summary**: Qué hace el addon -2. **Features**: Lista de funcionalidades -3. **Dependencies**: Addons requeridos -4. **Installation**: Comandos de instalación -5. **Configuration**: Settings necesarios -6. **Usage**: Flujo de trabajo típico -7. **Technical Details**: Modelos, campos, métodos -8. **Translations**: Estado de traducciones (si aplica) - -### Code Comments - -- Docstrings en clases y métodos públicos -- Comentarios inline para lógica compleja -- TODOs con contexto completo - -## Version Control - -### Commit Messages - -``` -[TAG] module: Brief description - -Longer explanation if needed -``` - -Tags: `[ADD]`, `[FIX]`, `[IMP]`, `[REF]`, `[REM]`, `[I18N]`, `[DOC]` - -### Branch Strategy - -- `main` - Production ready -- `dev` - Development -- `feature/*` - New features -- `fix/*` - Bug fixes - -## Performance Considerations - -- Use `@api.depends` correctamente para computed fields -- Prefer `search()` + `write()` sobre loops con `write()` -- Use `create()` con lista de vals para bulk creates -- Indexes en campos frecuentemente buscados -- Avoid N+1 queries con `prefetch` - -## Resources - -- **OCA Guidelines**: https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst -- **Odoo Documentation**: https://www.odoo.com/documentation/18.0/ -- **OCB Repository**: https://github.com/OCA/OCB -- **OCA Repositories**: https://github.com/OCA/ - ---- - -**Last Updated**: 2026-02-12 -**Odoo Version**: 18.0 -**Python Version**: 3.10+ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index beb2928..748e132 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -125,7 +125,7 @@ repos: - "types-requests" - "types-setuptools" - repo: https://github.com/PyCQA/pylint - rev: v4.0.4 + rev: v3.1.1 hooks: - id: pylint name: pylint with optional checks @@ -134,7 +134,7 @@ repos: - --exit-zero verbose: true additional_dependencies: &pylint_deps - - pylint-odoo==10.0.0 + - pylint-odoo==9.1.2 - id: pylint name: pylint with mandatory checks args: diff --git a/.pylintrc b/.pylintrc index 20cb606..a2ac445 100644 --- a/.pylintrc +++ b/.pylintrc @@ -2,6 +2,14 @@ load-plugins=pylint_odoo score=n +[ODOOLINT] +readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" +manifest_required_authors=Odoo Community Association (OCA) +manifest_required_keys=license +manifest_deprecated_keys=description,active +license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3,Other OSI approved licence,Other proprietary +valid_odoo_versions=16.0,17.0,18.0 + [MESSAGES CONTROL] disable=all @@ -14,76 +22,67 @@ disable=all # checks. enable=anomalous-backslash-in-string, + api-one-deprecated, + api-one-multi-together, assignment-from-none, attribute-deprecated, - attribute-string-redundant, - bad-builtin-groupby, - category-allowed, - category-allowed-app, - consider-merging-classes-inherited, + class-camelcase, context-overridden, + copy-wo-api-one, dangerous-default-value, - deprecated-name-get, - deprecated-odoo-model-method, + dangerous-view-replace-wo-priority, development-status-allowed, + duplicate-id-csv, duplicate-key, - except-pass, - external-request-timeout, - inheritable-method-lambda, - inheritable-method-string, - invalid-commit, - invalid-email, + duplicate-xml-fields, + duplicate-xml-record-id, + eval-referenced, + eval-used, + incoherent-interpreter-exec-perm, license-allowed, manifest-author-string, - manifest-behind-migrations, - manifest-data-duplicated, manifest-deprecated-key, - manifest-external-assets, - manifest-maintainers-list, manifest-required-author, manifest-required-key, - manifest-required-key-app, - manifest-superfluous-key, manifest-version-format, method-compute, method-inverse, method-required-super, method-search, - missing-odoo-file, - missing-odoo-file-app, - missing-readme, - missing-return, - no-raise-unlink, - no-search-all, - no-wizard-in-models, - no-write-in-compute, - odoo-addons-relative-import, - odoo-exception-warning, + missing-import-error, + missing-manifest-dependency, + openerp-exception-warning, pointless-statement, pointless-string-statement, - prefer-env-translation, print-used, - prohibited-method-override, redundant-keyword-arg, - renamed-field-parameter, - resource-not-exist, + redundant-modulename-xml, + reimported, + relative-import, + return-in-init, + rst-syntax-error, sql-injection, - super-method-mismatch, - test-folder-imported, too-few-format-args, - translation-contains-variable, translation-field, - translation-format-interpolation, - translation-format-truncated, - translation-fstring-interpolation, - translation-not-lazy, - translation-positional-used, translation-required, - translation-too-few-args, - translation-too-many-args, - translation-unsupported-format, + unreachable, use-vim-comment, - website-manifest-key-not-valid-uri + wrong-tabs-instead-of-spaces, + xml-syntax-error + # messages that do not cause the lint step to fail + consider-merging-classes-inherited, + create-user-wo-reset-password, + deprecated-module, + file-not-used, + invalid-commit, + missing-newline-extrafiles, + missing-readme, + no-utf8-coding-comment, + odoo-addons-relative-import, + old-api7-method-defined, + redefined-builtin, + too-complex, + unnecessary-utf8-coding-comment [REPORTS] msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory index 277f3b8..a413790 100644 --- a/.pylintrc-mandatory +++ b/.pylintrc-mandatory @@ -2,58 +2,65 @@ load-plugins=pylint_odoo score=n +[ODOOLINT] +readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" +manifest_required_authors=Odoo Community Association (OCA) +manifest_required_keys=license +manifest_deprecated_keys=description,active +license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3,Other OSI approved licence,Other proprietary +valid_odoo_versions=16.0,17.0,18.0 + [MESSAGES CONTROL] disable=all enable=anomalous-backslash-in-string, + api-one-deprecated, + api-one-multi-together, assignment-from-none, attribute-deprecated, - consider-merging-classes-inherited, + class-camelcase, context-overridden, + copy-wo-api-one, dangerous-default-value, - deprecated-name-get, - deprecated-odoo-model-method, + dangerous-view-replace-wo-priority, development-status-allowed, + duplicate-id-csv, duplicate-key, - except-pass, - external-request-timeout, - inheritable-method-lambda, - inheritable-method-string, - invalid-commit, + duplicate-xml-fields, + duplicate-xml-record-id, + eval-referenced, + eval-used, + incoherent-interpreter-exec-perm, license-allowed, manifest-author-string, - manifest-behind-migrations, - manifest-data-duplicated, manifest-deprecated-key, - manifest-maintainers-list, manifest-required-author, manifest-required-key, - manifest-superfluous-key, manifest-version-format, method-compute, method-inverse, method-required-super, method-search, - missing-readme, - missing-return, - no-raise-unlink, - no-write-in-compute, - odoo-addons-relative-import, - odoo-exception-warning, + missing-import-error, + missing-manifest-dependency, + openerp-exception-warning, pointless-statement, pointless-string-statement, print-used, - prohibited-method-override, redundant-keyword-arg, - renamed-field-parameter, - resource-not-exist, + redundant-modulename-xml, + reimported, + relative-import, + return-in-init, + rst-syntax-error, sql-injection, - test-folder-imported, too-few-format-args, translation-field, - translation-positional-used, translation-required, - use-vim-comment + unreachable, + use-vim-comment, + wrong-tabs-instead-of-spaces, + xml-syntax-error [REPORTS] msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} diff --git a/docs/CORRECCION_PRECIOS_IVA.md b/CORRECCION_PRECIOS_IVA.md similarity index 100% rename from docs/CORRECCION_PRECIOS_IVA.md rename to CORRECCION_PRECIOS_IVA.md diff --git a/docs/INSTALACION_COMPLETA.md b/INSTALACION_COMPLETA.md similarity index 100% rename from docs/INSTALACION_COMPLETA.md rename to INSTALACION_COMPLETA.md diff --git a/docs/LINTERS_README.md b/LINTERS_README.md similarity index 100% rename from docs/LINTERS_README.md rename to LINTERS_README.md diff --git a/README.md b/README.md deleted file mode 100644 index 4ce28ad..0000000 --- a/README.md +++ /dev/null @@ -1,249 +0,0 @@ -# Kidekoop - Addons Custom para Odoo 18.0 - -Sistema de gestión de compras colaborativas (grupo de consumo) basado en Odoo 18.0 con módulos personalizados y modificados. - -## 🎯 Descripción - -Este repositorio contiene los addons personalizados para Kidekoop, un sistema completo de gestión de grupos de consumo que permite: - -- **Gestión de compras colaborativas** (eskaera) -- **Sistema de precios multinivel** con categorías y descuentos múltiples -- **Integración con proveedores** y gestión de precios automática -- **Interfaz web moderna** para pedidos grupales -- **Multiidioma** (ES, EU, CA, GL, PT, FR, IT) - -## 📦 Componentes del Proyecto - -### 1. OCB - Odoo Community Backports -- **Ubicación**: `/ocb` -- **Versión**: 18.0 -- **Descripción**: Base de Odoo Community Edition -- **Repositorio**: https://github.com/OCA/OCB - -### 2. Addons OCA Modificados - -| Addon | Propósito | Repositorio OCA | -|-------|-----------|-----------------| -| [account_invoice_triple_discount](account_invoice_triple_discount/) | Sistema de triple descuento en facturas | account-invoicing | -| [purchase_triple_discount](purchase_triple_discount/) | Sistema de triple descuento en compras | purchase-workflow | -| [product_origin](product_origin/) | Campo de origen del producto | product-attribute | -| [product_get_price_helper](product_get_price_helper/) | Helper para cálculo de precios | product-attribute | -| [product_main_seller](product_main_seller/) | Proveedor principal por producto | purchase-workflow | -| [product_price_category](product_price_category/) | Sistema de categorías de precio | product-attribute | - -### 3. Addons Custom Propios - -| Addon | Propósito | Estado | -|-------|-----------|--------| -| [account_invoice_triple_discount_readonly](account_invoice_triple_discount_readonly/) | Fix para bug de descuentos acumulados | ✅ Estable | -| [product_price_category_supplier](product_price_category_supplier/) | Gestión de categorías por proveedor | ✅ Estable | -| [product_sale_price_from_pricelist](product_sale_price_from_pricelist/) | Auto-cálculo precio venta desde compra | ✅ Estable | -| [website_sale_aplicoop](website_sale_aplicoop/) | Sistema completo de eskaera web | ✅ Estable | - -## 🚀 Quick Start - -### Requisitos - -- Docker & Docker Compose -- Python 3.10+ -- PostgreSQL 14+ - -### Instalación - -```bash -# Clonar repositorio -git clone [URL_REPO] -cd addons-cm - -# Iniciar entorno -docker-compose up -d - -# Verificar logs -docker-compose logs -f odoo -``` - -### Instalar un addon - -```bash -docker-compose exec odoo odoo -d odoo -u addon_name --stop-after-init -``` - -## 🛠️ Desarrollo - -### Estructura de Carpetas - -``` -addons-cm/ -├── .github/ # GitHub Copilot instructions -├── ocb/ # Odoo 18.0 base -├── account_invoice_*/ # Addons de facturación -├── purchase_*/ # Addons de compras -├── product_*/ # Addons de productos -├── website_sale_aplicoop/ # Sistema eskaera -├── docker-compose.yml # Configuración Docker -├── requirements.txt # Dependencias Python -├── oca_dependencies.txt # Dependencias OCA -├── Makefile # Comandos útiles -└── .pre-commit-config.yaml # Hooks de pre-commit -``` - -### Herramientas de Calidad - -```bash -# Ejecutar checks de código -make lint - -# Formatear código -make format - -# Ejecutar todos los pre-commit hooks -pre-commit run --all-files - -# Verificar addon específico -./check_addon.sh addon_name -``` - -### Tests - -```bash -# Ejecutar tests de un addon -docker-compose exec odoo odoo -d odoo --test-enable --stop-after-init -u addon_name - -# Tests específicos con Python unittest -docker-compose exec odoo python -m pytest addons/addon_name/tests/ -``` - -## 🌍 Sistema de Traducciones - -Todos los addons custom incluyen traducciones completas en: - -- **Español** (es) - Obligatorio -- **Euskera** (eu) - Obligatorio -- **Catalán** (ca) -- **Gallego** (gl) -- **Portugués** (pt) -- **Francés** (fr) -- **Italiano** (it) - -### Actualizar Traducciones - -```bash -# Exportar términos traducibles -docker-compose exec odoo odoo \ - --addons-path=/mnt/extra-addons \ - --i18n-export=/tmp/addon_name.pot \ - --modules=addon_name \ - --db=odoo - -# Actualizar archivos .po -cd addon_name/i18n -msgmerge --update es.po addon_name.pot -msgmerge --update eu.po addon_name.pot -``` - -**Importante**: No usar `_()` en definiciones de campos a nivel de módulo. Solo usar en métodos. - -📖 **[Ver guía completa de traducciones](docs/TRANSLATIONS.md)** - -## 📖 Documentación Adicional - -Cada addon incluye su propio README.md con: -- Arquitectura y diseño -- Detalles de implementación -- Ejemplos de uso -- Casos de prueba - -### Documentos Principales - -- [GitHub Copilot Instructions](.github/copilot-instructions.md) - Guía para desarrollo con AI -- [Documentación Técnica](docs/) - Guías de instalación, linters, y troubleshooting -- [Makefile](Makefile) - Comandos disponibles -- [requirements.txt](requirements.txt) - Dependencias Python -- [oca_dependencies.txt](oca_dependencies.txt) - Repositorios OCA necesarios - -## 🔧 Configuración - -### Dependencias OCA - -Este proyecto depende de los siguientes repositorios OCA: - -- **account-invoicing**: Sistema de facturación extendido -- **product-attribute**: Gestión avanzada de productos -- **purchase-workflow**: Flujos de compra personalizados -- **sale-workflow**: Flujos de venta personalizados - -### Configuración de Odoo - -Archivo `odoo.conf` incluye: -- Configuración de addons path -- Parámetros de base de datos -- Configuración de workers y límites - -## 🐛 Issues Conocidos y Soluciones - -### Descuentos Acumulándose en discount1 - -**Problema**: Al usar triple descuento, todos los descuentos se acumulan en el primer campo. - -**Solución**: Instalar `account_invoice_triple_discount_readonly` - -### Precio de Venta No Actualiza - -**Problema**: El precio de venta no se calcula automáticamente desde el precio de compra. - -**Solución**: Configurar `product_sale_price_from_pricelist` correctamente. - -### Warnings de Traducción - -**Problema**: `WARNING: _() called at import time at module...` - -**Solución**: No usar `_()` en definiciones de campos, solo en métodos ejecutables. - -## 🤝 Contribuir - -### Estándares de Código - -- Seguir [OCA Guidelines](https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst) -- Usar **black** para formateo -- Usar **isort** para imports -- Pasar **flake8** y **pylint-odoo** -- Todos los commits deben pasar pre-commit hooks - -### Estructura de Commits - -``` -[TAG] module_name: Brief description - -Detailed explanation if needed - -Tags: [ADD], [FIX], [IMP], [REF], [REM], [I18N], [DOC] -``` - -### Testing - -Todos los nuevos features deben incluir: -- Tests unitarios -- Tests de integración (si aplica) -- Documentación actualizada - -## 📝 License - -AGPL-3.0 or later - -## 👥 Autores - -- **Criptomart** - Development -- **OCA Community** - Base addons - -## 🔗 Enlaces - -- **Odoo Documentation**: https://www.odoo.com/documentation/18.0/ -- **OCA**: https://github.com/OCA -- **OCB**: https://github.com/OCA/OCB -- **OCA Guidelines**: https://github.com/OCA/odoo-community.org - ---- - -**Versión Odoo**: 18.0 -**Python**: 3.10+ -**Última Actualización**: 2026-02-12 diff --git a/docs/RESUMEN_INSTALACION.md b/RESUMEN_INSTALACION.md similarity index 100% rename from docs/RESUMEN_INSTALACION.md rename to RESUMEN_INSTALACION.md diff --git a/docs/TEST_MANUAL.md b/TEST_MANUAL.md similarity index 100% rename from docs/TEST_MANUAL.md rename to TEST_MANUAL.md diff --git a/account_invoice_triple_discount_readonly/__manifest__.py b/account_invoice_triple_discount_readonly/__manifest__.py index c65b03e..bdd4c26 100644 --- a/account_invoice_triple_discount_readonly/__manifest__.py +++ b/account_invoice_triple_discount_readonly/__manifest__.py @@ -1,11 +1,13 @@ -# Copyright 2025 - Today Criptomart +# Copyright 2025 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -{ # noqa: B018 +{ "name": "Account Invoice Triple Discount Readonly", "version": "18.0.1.0.0", "summary": "Make total discount readonly and fix discount2/discount3 write issue", "license": "AGPL-3", - "author": "Odoo Community Association (OCA), Criptomart", - "website": "https://git.criptomart.net/criptomart/addons-cm", + "author": "Criptomart", + "website": "https://github.com/OCA/account-invoicing", "depends": ["account_invoice_triple_discount", "purchase_triple_discount"], + "data": [], + "installable": True, } diff --git a/account_invoice_triple_discount_readonly/models/triple_discount_mixin.py b/account_invoice_triple_discount_readonly/models/triple_discount_mixin.py index 2d727da..d222b00 100644 --- a/account_invoice_triple_discount_readonly/models/triple_discount_mixin.py +++ b/account_invoice_triple_discount_readonly/models/triple_discount_mixin.py @@ -1,5 +1,4 @@ -from odoo import fields -from odoo import models +from odoo import fields, models class TripleDiscountMixin(models.AbstractModel): diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 6fdd6e2..0000000 --- a/docs/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Documentación Técnica - -Esta carpeta contiene documentación técnica y de referencia del proyecto. - -## Contenido - -### Configuración y Desarrollo - -- **[LINTERS_README.md](LINTERS_README.md)** - Guía de herramientas de calidad de código (black, isort, flake8, pylint) -- **[TRANSLATIONS.md](TRANSLATIONS.md)** - Guía completa del sistema de traducciones (IMPORTANTE) -- **[INSTALACION_COMPLETA.md](INSTALACION_COMPLETA.md)** - Documentación detallada del proceso de instalación -- **[RESUMEN_INSTALACION.md](RESUMEN_INSTALACION.md)** - Resumen ejecutivo de la instalación - -### Resolución de Problemas - -- **[CORRECCION_PRECIOS_IVA.md](CORRECCION_PRECIOS_IVA.md)** - Correcciones relacionadas con precios e IVA -- **[TEST_MANUAL.md](TEST_MANUAL.md)** - Guía de tests manuales - -## Documentación Principal - -Para información general del proyecto y cómo empezar, ver: - -- **[README.md](../README.md)** - Documentación principal del repositorio -- **[.github/copilot-instructions.md](../.github/copilot-instructions.md)** - Instrucciones para GitHub Copilot - -## Documentación por Addon - -Cada addon tiene su propio README: - -### Addons Custom -- [account_invoice_triple_discount_readonly](../account_invoice_triple_discount_readonly/README.md) -- [product_price_category_supplier](../product_price_category_supplier/README.md) -- [product_sale_price_from_pricelist](../product_sale_price_from_pricelist/README.md) -- [website_sale_aplicoop](../website_sale_aplicoop/README.md) - -### Addons OCA Modificados -- [account_invoice_triple_discount](../account_invoice_triple_discount/README.rst) -- [purchase_triple_discount](../purchase_triple_discount/README.rst) -- [product_origin](../product_origin/README.md) -- [product_get_price_helper](../product_get_price_helper/README.md) -- [product_main_seller](../product_main_seller/README.md) -- [product_price_category](../product_price_category/README.rst) diff --git a/docs/TRANSLATIONS.md b/docs/TRANSLATIONS.md deleted file mode 100644 index 2751789..0000000 --- a/docs/TRANSLATIONS.md +++ /dev/null @@ -1,314 +0,0 @@ -# Sistema de Traducciones - Guía Completa - -## Estado Actual - -✅ **El sistema de traducciones está funcionando correctamente** - -Todos los addons custom incluyen traducciones para: -- **Español (es)** - Obligatorio -- **Euskera (eu)** - Obligatorio -- Catalán (ca), Gallego (gl), Portugués (pt), Francés (fr), Italiano (it) - Opcional - -## Estructura de Archivos - -Cada addon debe tener la siguiente estructura: - -``` -addon_name/ -├── i18n/ -│ ├── es.po # Español (obligatorio) -│ ├── eu.po # Euskera (obligatorio) -│ ├── ca.po # Catalán (opcional) -│ ├── gl.po # Gallego (opcional) -│ ├── pt.po # Portugués (opcional) -│ ├── fr.po # Francés (opcional) -│ ├── it.po # Italiano (opcional) -│ └── addon_name.pot # Template (generado automáticamente) -``` - -## Reglas Importantes - -### ❌ NO Hacer - -**NUNCA usar `_()` en definiciones de campos a nivel de módulo:** - -```python -# ❌ INCORRECTO - Causa warnings -from odoo import _ - -class MyModel(models.Model): - _name = 'my.model' - - name = fields.Char(string=_("Name")) # ❌ MAL - description = fields.Text(string=_("Description")) # ❌ MAL -``` - -**Por qué está mal**: `_()` se ejecuta en tiempo de importación del módulo, antes de que el sistema de traducciones esté inicializado, causando warnings. - -### ✅ Hacer - -**Usar strings literales en definiciones de campos:** - -```python -# ✅ CORRECTO -from odoo import models, fields - -class MyModel(models.Model): - _name = 'my.model' - - name = fields.Char(string="Name") # ✅ BIEN - description = fields.Text(string="Description") # ✅ BIEN -``` - -**Usar `_()` solo en métodos y código ejecutable:** - -```python -# ✅ CORRECTO -from odoo import _, models - -class MyModel(models.Model): - _name = 'my.model' - - def action_confirm(self): - message = _("Order confirmed successfully") # ✅ BIEN - return { - 'type': 'ir.actions.client', - 'tag': 'display_notification', - 'params': { - 'title': _('Success'), # ✅ BIEN - 'message': message, - 'type': 'success', - } - } - - def _compute_display_name(self): - for record in self: - record.display_name = _("Order %s") % record.name # ✅ BIEN -``` - -## Cómo Generar/Actualizar Traducciones - -### 1. Exportar Términos Traducibles - -```bash -# Exportar términos del addon -docker-compose exec odoo odoo \ - --addons-path=/mnt/extra-addons \ - --i18n-export=/tmp/addon_name.pot \ - --modules=addon_name \ - --db=odoo \ - --stop-after-init - -# Copiar el archivo generado -docker-compose cp odoo:/tmp/addon_name.pot ./addon_name/i18n/ -``` - -### 2. Actualizar Archivos .po Existentes - -```bash -cd addon_name/i18n - -# Actualizar español -msgmerge --update es.po addon_name.pot - -# Actualizar euskera -msgmerge --update eu.po addon_name.pot - -# Actualizar otros idiomas (si existen) -msgmerge --update ca.po addon_name.pot -msgmerge --update gl.po addon_name.pot -``` - -### 3. Traducir Términos Nuevos - -Editar los archivos `.po` y completar las traducciones: - -```po -#: models/my_model.py:25 -msgid "Order confirmed successfully" -msgstr "Pedido confirmado correctamente" # Español - -#: models/my_model.py:30 -msgid "Success" -msgstr "Éxito" -``` - -### 4. Cargar Traducciones en Odoo - -```bash -# Actualizar addon con nuevas traducciones -docker-compose exec odoo odoo -d odoo -u addon_name --stop-after-init - -# O reiniciar Odoo para que cargue los cambios -docker-compose restart odoo -``` - -## Formato de Archivos .po - -### Cabecera Requerida - -```po -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * addon_name -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 18.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-12 10:00+0000\n" -"PO-Revision-Date: 2026-02-12 10:00+0000\n" -"Last-Translator: Your Name \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -``` - -### Campos Traducibles - -Odoo automáticamente detecta y exporta: - -1. **String en definiciones de campos**: `fields.Char(string="Name")` -2. **Help text**: `fields.Char(help="Enter the product name")` -3. **Selection options**: `fields.Selection([('draft', 'Draft'), ('done', 'Done')])` -4. **Texto en vistas XML**: `