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.pyexiste pero Celery no está enrequirements.txtni 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¶
- Se vende (o cambia de precio/estado) un producto simple en SAP; el
Integrador lo empuja a
POST /api/products/receivecon el token estático. ProductReceiveApiViewaplica 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.- 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. - Los cambios en campos vigilados disparan la señal
pre_save, que encola el push conqueue_product_sync; todos los disparadores del mismo guardado colapsan en un únicoPOST /api/supplier-products/syncdespués del commit, con receta completa (type: composite+components; los SERVICIO se excluyen, los regalos se incluyen). - El Integrador aplica la receta, reindexa el combo y responde con
warningspor componente no resoluble; PC Manager los registra en el logproduct_sync(en un combo confirmado, un warning significa que la receta nueva no quedó vigente).