categorias-productos #51 #52

Open
mono wants to merge 13 commits from feat/51-categorias-productos into main
Owner

Related: #51

Resumen

Implementa la discriminación y administración de las categorías de productos
en Don Confiao, manteniendo a Tryton como fuente de verdad para name /
external_id y dejando los campos de descripción, nombre alternativo y estado
activo administrados por Don Confiao.

Cambios

Modelo y migración

  • ProductCategory gana description, alternative_name y active
    (migración 0056_productcategory_active_and_more).

Sincronización con Tryton

  • Fix: un cambio de categorías en Tryton ahora marca el producto como
    actualizado (_need_update / _describe_changes reportan
    Categoría: +Bebidas, -Abarrotes).
  • Nuevo CategoryTrytonService.import_from_external() que importa solo las
    categorías asociadas a productos salables, hace upsert por external_id
    (fallback por nombre), preserva los campos administrados por Don Confiao y
    reporta checked/created/updated/untouched/failed.
  • Upsert compartido (upsert_category) reutilizado por ProductTrytonService.

API /api/product_categories/

  • Listado con filtro ?active=all|true|false; lectura con IsNotPublico.
  • PATCH (admin) de description, alternative_name, active
    (name/external_id son de solo lectura).
  • POST deactivate/ y POST activate/ con {ids} → devuelve
    {deactivated|activated, failed}; ignora ids inexistentes.
  • POST import_from_external/ (admin).
  • create/destroy deshabilitados (la fuente es Tryton).

JSON de productos

  • ProductSerializer.categories pasa de lista de ids a objetos anidados
    (id, name, alternative_name, active).
  • Product.to_list() (endpoint legacy /don_confiao/productos) idem.

Otros

  • ProductCategoryAdmin (list_display + filtro por active).
  • Endpoints documentados en doc/requests.org.

Notas

  • Se verificó empíricamente contra Tryton staging: product.category no
    expone active, por lo que activar/desactivar es solo local.
  • No se excluyen categorías contables (las categorías en uso en staging son
    accounting=True).

Tests

  • 209 en total, todos en verde (docker compose -f docker-compose.dev.yml run --rm django python manage.py test).
  • 18 tests nuevos: modelo, serializers, servicio de import, API
    (permisos, activación/desactivación, import externo) y sync de productos.
Related: #51 ## Resumen Implementa la discriminación y administración de las categorías de productos en Don Confiao, manteniendo a Tryton como fuente de verdad para `name` / `external_id` y dejando los campos de descripción, nombre alternativo y estado activo administrados por Don Confiao. ## Cambios ### Modelo y migración - `ProductCategory` gana `description`, `alternative_name` y `active` (migración `0056_productcategory_active_and_more`). ### Sincronización con Tryton - Fix: un cambio de categorías en Tryton ahora marca el producto como actualizado (`_need_update` / `_describe_changes` reportan `Categoría: +Bebidas, -Abarrotes`). - Nuevo `CategoryTrytonService.import_from_external()` que importa solo las categorías asociadas a productos salables, hace upsert por `external_id` (fallback por nombre), preserva los campos administrados por Don Confiao y reporta `checked/created/updated/untouched/failed`. - Upsert compartido (`upsert_category`) reutilizado por `ProductTrytonService`. ### API `/api/product_categories/` - Listado con filtro `?active=all|true|false`; lectura con `IsNotPublico`. - PATCH (admin) de `description`, `alternative_name`, `active` (`name`/`external_id` son de solo lectura). - `POST deactivate/` y `POST activate/` con `{ids}` → devuelve `{deactivated|activated, failed}`; ignora ids inexistentes. - `POST import_from_external/` (admin). - `create`/`destroy` deshabilitados (la fuente es Tryton). ### JSON de productos - `ProductSerializer.categories` pasa de lista de ids a objetos anidados (`id`, `name`, `alternative_name`, `active`). - `Product.to_list()` (endpoint legacy `/don_confiao/productos`) idem. ### Otros - `ProductCategoryAdmin` (list_display + filtro por `active`). - Endpoints documentados en `doc/requests.org`. ## Notas - Se verificó empíricamente contra Tryton `staging`: `product.category` no expone `active`, por lo que activar/desactivar es solo local. - No se excluyen categorías contables (las categorías en uso en staging son `accounting=True`). ## Tests - 209 en total, todos en verde (`docker compose -f docker-compose.dev.yml run --rm django python manage.py test`). - 18 tests nuevos: modelo, serializers, servicio de import, API (permisos, activación/desactivación, import externo) y sync de productos.
mono self-assigned this 2026-10-10 17:38:10 -05:00
mono added 7 commits 2026-10-10 17:38:10 -05:00
Issue #51: discriminacion y administracion de categorias de productos.

- ProductCategory.description (TextField blank)
- ProductCategory.alternative_name (CharField 100 nullable)
- ProductCategory.active (Boolean default True)
- Migracion 0056_productcategory_active_and_more
- Tests de modelo (campo don confiao y active por defecto)
Issue #51: discriminacion y administracion de categorias de productos.

- _need_update compara las categorias (external_id) local vs Tryton
- _describe_changes reporta categorias agregadas (+Nombre) y removidas (-Nombre)
- Actualiza test que asumia asignacion de categorias sin marcar update
Issue #51: discriminacion y administracion de categorias de productos.

- ProductCategorySerializer (name/external_id read_only)
- ProductCategoryBriefSerializer para el JSON de productos
- ProductSerializer.categories ahora devuelve objetos anidados
Issue #51: discriminacion y administracion de categorias de productos.

- CategoryTrytonService.import_from_external: lee categorias asociadas a
  productos salables, hace upsert por external_id (fallback nombre),
  preserva description/alternative_name/active, reporta
  checked/created/updated/untouched/failed
- upsert_category compartido y reutilizado por ProductTrytonService
Issue #51: discriminacion y administracion de categorias de productos.

- ProductCategoryView en /api/product_categories (list/retrieve IsNotPublico,
  mutaciones admin): filtro ?active, PATCH de description/alternative_name/active
- POST deactivate/activate con body {ids} -> {deactivated|activated, failed}
  (ignora ids inexistentes)
- POST import_from_external admin via CategoryTrytonService
- create/destroy deshabilitados (la fuente de categorias es Tryton)
Issue #51: discriminacion y administracion de categorias de productos.

- Product.to_list() devuelve categorias como objetos
  (id, name, alternative_name, active) en vez de solo nombres
Issue #51: discriminacion y administracion de categorias de productos.

- ProductCategoryAdmin con list_display/filtro por active
- doc/requests.org: GET/PATCH product_categories, import_from_external,
  deactivate, activate
mono added 1 commit 2026-10-12 13:10:23 -05:00
Issue #51: discriminacion y administracion de categorias de productos.

- product.read ahora solicita template.categories.name; se elimina la
  llamada separada model.product.category.read

- ProductTrytonService y CategoryTrytonService construyen el mapa
  {id_tryton: nombre} desde 'template.categories.' de los productos leídos
- import_from_external pasa de 3 llamadas RPC a 2
mono added 1 commit 2026-10-12 16:32:05 -05:00
Documenta como hacer requests RPC de prueba contra Tryton con
sabatron-tryton-rpc-client:
- .opencode/skills/tryton-rpc-probe/SKILL.md: comando base con docker compose
  dev (--no-deps), credenciales desde .env, como revelar estados HTTP
  (401/403/429) que la libreria enmascara, convencion de agrupacion de campos
  con punto ('template.' -> 'categories.') y sondas de ejemplo
- .opencode/agents/tryton-rpc-probe.md: subagente que obliga a cargar el skill
- AGENTS.md: referencia al skill para todos los agents del proyecto
mono added 1 commit 2026-10-12 16:45:51 -05:00
- docker-compose.coolify.yaml: stack postgres+django sin env_file (variables
  via UI de Coolify), sin puertos publicos de BD, sin nginx, expose 8000
- django.coolify.Dockerfile: copia el codigo dentro de la imagen (no toca
  django.Dockerfile usado por dev/staging/prod)
mono added 1 commit 2026-10-12 21:57:01 -05:00
- django.registry.Dockerfile: imagen autocontenida (codigo + entrypoint)
- docker/entrypoint.sh: migrate + collectstatic + gunicorn; con args ejecuta ese comando
- scripts/build-push-image.sh: build y push a gitea.onecluster.org/oneteam/don_confiao_backend (latest + git sha)
mono added 1 commit 2026-10-12 22:30:23 -05:00
mono added 1 commit 2026-10-17 17:53:45 -05:00
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/51-categorias-productos:feat/51-categorias-productos
git checkout feat/51-categorias-productos
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OneTeam/don_confiao_backend#52
No description provided.