Saltar a contenido

Arquitectura — PC Manager

Visión general

PC Manager es el sistema con el que Compulandia arma y publica productos compuestos (combos: PCs armadas, notebooks ampliadas, promos). Consume el catálogo de productos simples del Integrador, permite al operador definir combos en el admin de Django, calcula automáticamente qué componentes van en cada combo (precio, stock real y disponibilidad incluidos) y empuja cada combo actualizado de vuelta al Integrador, que lo publica en la tienda.

Componentes

Componente Responsabilidad Tecnología
Admin de Django UI del operador: alta de combos, asignación de componentes (inline con prioridad, always_include, regalos), precio manual, acciones de sincronización masiva Django 5.1 admin + django-admin-interface, autocompletes con django-autocomplete-light
API REST POST /api/products/receive (push del Integrador, token estático X-API-TOKEN), GET /api/categories (categorías a sincronizar), GET /api/product/ (combos activos y disponibles) Django REST Framework
Motor de combos (PcManager/models.py) select_components (1 componente por categoría según prioridad → supplier preferido → stock), calculate_price / calculate_special_price, calculate_component_stock (stock real), update_availability, reevaluate_and_sync Django ORM
Push al Integrador Señal pre_save sobre campos vigilados + queue_product_sync (deduplica en un solo POST post-commit) + WebhookService → POST /api/supplier-products/sync requests
Jobs de sincronización manage.py sync_components (pull diario de stock/precio/estado de los componentes en uso y reevaluación de combos afectados), manage.py sync_categories; también invocables como acciones del admin (actions.py, incluye importación masiva de productos por categoría) Django management commands
Base de datos Catálogo local: categorías, productos simples (espejo del Integrador), combos y sus recetas (product_component), imágenes MySQL 8 (contenedor db_mariadb)

Notas:

  • SERVER/celery.py existe pero Celery no está en requirements.txt ni hay workers: es código vestigial, las tareas corren como management commands síncronos.
  • PcManager/services/syncronize.py (conexión directa a la base del Integrador) es código legacy sin referencias; la integración vigente es solo por API HTTP (ver ADR-0001).

Dependencias externas

Dependencia Uso ¿Qué pasa si no está?
Integrador (API en API_DOMAIN, login con credenciales de usuario → Bearer token) Fuente de categorías y productos simples (pull), y destino de los combos (push a /api/supplier-products/sync) No hay pull ni push: stock/precio de componentes quedan desactualizados y los cambios de combos no llegan a la tienda. La edición local sigue funcionando; los pushes fallidos no se reintentan (se pierden hasta la próxima reevaluación)
MySQL 8 (db_mariadb) Toda la persistencia Caída total del sistema

Diagrama

flowchart LR
    OP[Operador] -->|HTTP admin /pc-manager/| PCM[PC Manager<br/>Django + DRF]
    PCM -->|SQL| DB[(MySQL 8<br/>db_mariadb)]
    INT[Integrador] -->|"POST /api/products/receive<br/>(X-API-TOKEN)"| PCM
    PCM -->|"POST /api/supplier-products/sync<br/>(Bearer token)"| INT
    PCM -->|"GET /api/category, /api/products<br/>(pull diario sync_components)"| INT

Flujo principal: venta de un componente → combo actualizado en la tienda

  1. Se vende (o cambia de precio/estado) un producto simple en SAP; el Integrador lo empuja a POST /api/products/receive con el token estático.
  2. ProductReceiveApiView aplica un PATCH por campo sobre el producto local, solo si los valores difieren (idempotente). Si el sku no existe y vienen los campos mínimos, lo crea.
  3. Si hubo cambios, busca los combos activos que usan ese componente y llama reevaluate_and_sync() una vez por combo: re-selecciona componentes, recalcula disponibilidad, stock real (min(floor(stock/cantidad))) y precio (salvo precio manual), y regenera la descripción corta.
  4. Los cambios en campos vigilados disparan la señal pre_save, que encola el push con queue_product_sync; todos los disparadores del mismo guardado colapsan en un único POST /api/supplier-products/sync después del commit, con receta completa (type: composite + components; los SERVICIO se excluyen, los regalos se incluyen).
  5. El Integrador aplica la receta, reindexa el combo y responde con warnings por componente no resoluble; PC Manager los registra en el log product_sync (en un combo confirmado, un warning significa que la receta nueva no quedó vigente).