Marketplace & Auctions
1. Descripción General de la Funcionalidad
El marketplace es el mecanismo central para la selección de proveedores en Algesta, implementando un modelo de subasta inversa donde los proveedores compiten enviando ofertas para órdenes de mantenimiento publicadas. Las características clave incluyen: ofertas anónimas para prevenir manipulación de precios, mínimo de 3 ofertas para visibilidad para proteger la confidencialidad del proveedor, validación de elegibilidad basada en cumplimiento de documentación, selección discrecional por agentes permitiendo consideración de factores más allá del precio, e integración completa con el ciclo de vida de la orden para transiciones de flujo de trabajo sin interrupciones. El marketplace se volvió obligatorio para todos los servicios externos, asegurando precios competitivos y estándares de calidad, mientras que los servicios internos evitan las subastas y se marcan en consecuencia.
2. Contexto de Negocio
Algesta quería asegurar precios competitivos mientras mantenía la calidad del proveedor a través de requisitos de documentación y proporcionar transparencia mientras protegía el anonimato del proveedor durante las ofertas. El modelo anterior de asignación directa carecía de descubrimiento de precios y presión competitiva, lo que llevaba a costos inflados y responsabilidad limitada del proveedor. El marketplace introduce fuerzas de mercado mientras mantiene el control a través de validación de elegibilidad y selección discrecional. Este equilibrio entre competencia y calidad es crítico para operaciones sostenibles y satisfacción del cliente.
3. Flujo de Trabajo de Subastas
flowchart TD
A[Agente publica orden en marketplace] --> B{¿Existen proveedores elegibles?}
B -->|No| C[Error: No hay proveedores disponibles]
B -->|Sí| D[Crear subasta con duración]
D --> E[Notificar proveedores elegibles]
E --> F[Proveedores ven orden anonimizada]
F --> G{¿Proveedor elegible?}
G -->|No - docs vencidos| H[Mostrar mensaje 'No elegible']
G -->|Sí| I[Proveedor envía oferta]
I --> J{¿Mínimo 3 ofertas?}
J -->|No| K[Ofertas permanecen ocultas]
J -->|Sí| L[Ofertas se vuelven visibles para agente]
L --> M[Agente revisa todas las ofertas]
M --> N{Decisión del agente}
N -->|Seleccionar proveedor| O[Agente selecciona proveedor]
O --> P[Actualizar estado de orden a ProveedorSeleccionado]
P --> Q[Notificar proveedor seleccionado]
Q --> R[Notificar proveedores no seleccionados]
R --> S[Subasta cerrada]
N -->|Extender subasta| T[Extender duración de subasta]
T --> F
N -->|Cancelar| U[Cancelar subasta]
U --> V[Devolver orden a EnRevision]
4. Historias de Usuario por Sprint
Sprint 4: Lanzamiento del Marketplace
US-S4-010: Publicar Orden en Marketplace (Agente)
- Descripción: Como agente, quiero publicar una orden en el marketplace para que los proveedores elegibles puedan enviar ofertas
- Criterios de Aceptación:
- Botón “Publicar en Marketplace” visible para órdenes en estado correcto (EnRevision)
- Formulario para configurar duración de subasta (horas/días)
- Opción para agregar preguntas personalizadas para proveedores
- Validación de datos requeridos de la orden (ubicación, tipo de servicio, fotos)
- Validación de que al menos un proveedor elegible existe
- Estado cambia a “PublicadaParaOfertas”
- Proveedores elegibles reciben notificación
- Estado: ✅ Completo
- Implementación:
algesta-ms-provider-nestjs/src/application/handlers/commands/auction/publish-order-for-auction.handler.ts- Creación de subastaalgesta-dashboard-react/src/Funcionalidades/marketplace/- UI de Marketplace
- Pruebas: Sprint 4 Pruebas notes - Historia 16544
- API:
POST /api/auctions/publish
US-S4-011: Ver Órdenes Disponibles (Proveedor)
- Descripción: Como proveedor, quiero ver órdenes disponibles para ofertar en mi área de servicio
- Criterios de Aceptación:
- Lista muestra solo órdenes que coinciden con servicios y ubicación del proveedor
- Detalles de orden están anonimizados (sin nombre de cliente, solo ubicación general)
- Muestra: tipo de servicio, urgencia, fotos, descripción, fecha límite
- Filtrar por tipo de servicio, urgencia, ubicación
- Clic para ver detalles completos
- Actualizaciones en tiempo real cuando se publican nuevas órdenes
- Estado: ✅ Completo
- Implementación:
algesta-ms-provider-nestjs/src/application/handlers/queries/auction/list-auctions.handler.ts- Listar subastasalgesta-dashboard-react/src/Funcionalidades/providers/- Portal de proveedor
- API:
GET /api/auctions?providerId=:id&Estado=Activo
US-S4-012: Enviar Oferta (Proveedor)
- Descripción: Como proveedor, quiero enviar una oferta por una orden para poder competir por el trabajo
- Criterios de Aceptación:
- Formulario con campos: costo estimado, duración estimada, comentarios, respuestas a preguntas personalizadas
- Validación: proveedor debe ser elegible (documentos válidos)
- Si no es elegible, mostrar mensaje explicando por qué (qué documentos vencieron)
- Oferta se envía anónimamente
- Proveedor puede editar oferta antes de que cierre la subasta
- Mensaje de confirmación después del envío
- Notificación enviada al agente (nueva oferta recibida)
- Estado: ✅ Completo
- Implementación:
algesta-ms-provider-nestjs/src/application/handlers/commands/auction/create-auction-offer.handler.ts- Crear ofertaalgesta-ms-provider-nestjs/src/application/handlers/commands/auction/edit-auction-offer.handler.ts- Editar oferta
- Pruebas: Sprint 4 - envío de oferta validado
- API:
POST /api/auctions/:auctionId/offers- Enviar ofertaPUT /api/auctions/:auctionId/offers/:offerId- Editar oferta
US-S4-013: Ver Ofertas (Agente)
- Descripción: Como agente, quiero ver todas las ofertas de una subasta para poder seleccionar el mejor proveedor
- Criterios de Aceptación:
- Ofertas solo visibles si ≥3 ofertas enviadas (protección de anonimato)
- Si <3 ofertas, mostrar mensaje: “Esperando mínimo 3 ofertas”
- Tabla con columnas: Proveedor (anonimizado inicialmente), Costo, Duración, Calificación, Estado de Documentos
- Ordenable por costo, calificación, duración
- Fila expandible para ver detalles del proveedor (nombre revelado)
- Mostrar historial del proveedor y métricas de desempeño
- Botón para seleccionar proveedor
- Estado: ✅ Completo
- Implementación:
algesta-ms-provider-nestjs/src/application/handlers/queries/auction/list-auction-offers.handler.ts- Listar ofertasalgesta-dashboard-react/src/Funcionalidades/marketplace/auction/- Detalle de subasta
- API:
GET /api/auctions/:auctionId/offers
US-S4-014: Seleccionar Proveedor (Agente)
- Descripción: Como agente, quiero seleccionar el proveedor ganador para que la orden pueda proceder
- Criterios de Aceptación:
- Botón “Seleccionar Proveedor” para cada oferta
- Diálogo de confirmación mostrando detalles del proveedor
- Campo opcional para justificación de selección
- Estado de orden cambia a “ProveedorSeleccionado”
- Proveedor seleccionado recibe notificación
- Proveedores no seleccionados reciben notificación
- Subasta es cerrada
- Orden es asignada al proveedor seleccionado
- Estado: ✅ Completo
- Implementación:
algesta-ms-provider-nestjs/src/application/handlers/commands/auction/assign-provider.handler.ts- Asignar proveedoralgesta-dashboard-react/src/Funcionalidades/marketplace/auction/hooks/use-assign-provider-form.ts- UI de asignación
- Pruebas: Sprint 4 - selección de proveedor validada
- API:
POST /api/auctions/:auctionId/assign
Sprint 5-8: Mejoras
US-S6-020: Cotización Detallada en Subasta
- Descripción: Como agente, quiero que los proveedores envíen cotizaciones detalladas (no solo costo total) para mejor transparencia
- Criterios de Aceptación:
- Agente crea lista de ítems (materiales, mano de obra, transporte, partes, equipo)
- Cada ítem tiene: descripción, cantidad, unidad
- Proveedor llena precio unitario para cada ítem
- Sistema calcula subtotal automáticamente
- Agente puede revisar y ajustar ítems
- Agente aplica margen (automático o manual)
- Cliente ve desglose detallado
- Estado: ✅ Completo
- Implementación:
algesta-ms-provider-nestjs/src/application/handlers/commands/auction/create-dynamic-items.handler.ts- Crear estructura de ítemsalgesta-ms-provider-nestjs/src/application/handlers/commands/auction/create-offer-inflation.handler.ts- Aplicar margen
- Sprint: S6-S8
- API:
POST /api/auctions/:auctionId/items- Crear estructura de ítemsPOST /api/auctions/:auctionId/offers/:offerId/inflate- Aplicar margen
US-S7-025: Marketplace con Información del Agente
- Descripción: Como proveedor, quiero ver qué agente está gestionando la orden para mejor comunicación
- Criterios de Aceptación:
- Detalle de orden muestra nombre y contacto del agente
- Proveedor puede enviar mensajes al agente a través de la plataforma
- Información del agente visible solo para proveedores que enviaron ofertas
- Estado: ✅ Completo
- Sprint: S7-S8
US-S8-030: Inflar Valores de Cotización
- Descripción: Como agente, quiero aplicar un margen a la cotización del proveedor antes de enviarla al cliente
- Criterios de Aceptación:
- Ver cotización detallada del proveedor
- Aplicar margen porcentual (ej., 15%) o ajuste manual por ítem
- Ver costo original, margen y costo final
- Guardar cotización inflada
- Enviar al cliente para aprobación
- Cliente ve solo precios finales (costos del proveedor ocultos)
- Estado: ✅ Completo
- Implementación:
algesta-dashboard-react/src/Funcionalidades/marketplace/auction/hooks/use-inflate-quotation-state.ts- UI de inflación
- Sprint: S8
US-S8-031: Extender Duración de Subasta
- Descripción: Como agente, quiero extender una subasta si no he recibido suficientes ofertas
- Criterios de Aceptación:
- Botón “Extender Subasta” visible antes de la fecha límite
- Agregar horas o días a la duración
- Todos los proveedores notificados de la extensión
- Subasta permanece activa
- Estado: 🟡 En Progreso
US-S8-032: Cancelar Subasta
- Descripción: Como agente, quiero cancelar una subasta si los requisitos de la orden cambiaron
- Criterios de Aceptación:
- Botón “Cancelar Subasta” con confirmación
- Todos los proveedores notificados de la cancelación
- Estado de orden revierte a “EnRevision”
- Subasta marcada como cancelada
- Estado: 🟡 En Progreso
5. Modelo de Datos de Subasta
Entidad Auction
Referencia: algesta-ms-provider-nestjs/src/domain/entities/auction.entity.ts
| Campo | Tipo | Descripción | Requerido |
|---|---|---|---|
_id | ObjectId | Identificador único | Sí |
orderId | ObjectId | Orden relacionada | Sí |
Estado | Enum | Activo, CLOSED, CANCELLED | Sí |
startDate | Date | Inicio de subasta | Sí |
endDate | Date | Fecha límite de subasta | Sí |
eligibleProviders | Array | Proveedores que pueden ofertar | Sí |
offers | Array | Ofertas enviadas | No |
selectedProviderId | ObjectId | Ganador | No |
customQuestions | Array | Preguntas del agente | No |
items | Array | Estructura de cotización detallada | No |
createdAt | Date | Marca de tiempo de creación | Sí |
updatedAt | Date | Última actualización | Sí |
createdBy | ObjectId | Agente que publicó | Sí |
selectionRationale | String | Por qué se seleccionó el proveedor | No |
Sub-documento Offer
| Campo | Tipo | Descripción |
|---|---|---|
providerId | ObjectId | Proveedor oferente |
totalCost | Number | Monto total de oferta |
estimatedDuration | Number | Días para completar |
comments | String | Notas del proveedor |
answers | Array | Respuestas a preguntas personalizadas |
items | Array | Precio detallado |
submittedAt | Date | Marca de tiempo de envío |
Estado | Enum | Pendiente, SELECTED, REJECTED |
inflatedItems | Array | Ítems con margen del agente aplicado |
inflationPercentage | Number | Porcentaje de margen total |
Sub-documento AuctionItem
| Campo | Tipo | Descripción |
|---|---|---|
Descripción | String | Descripción del ítem |
quantity | Number | Cantidad requerida |
unit | String | Unidad de medida (ej., unidad, m², hora) |
category | Enum | MATERIAL, LABOR, TRANSPORT, PART, EQUIPMENT, OTHER |
Sub-documento OfferItem
| Campo | Tipo | Descripción |
|---|---|---|
auctionItemId | ObjectId | Referencia al ítem de subasta |
unitPrice | Number | Precio por unidad |
subtotal | Number | quantity × unitPrice |
Sub-documento InflatedItem
| Campo | Tipo | Descripción |
|---|---|---|
offerItemId | ObjectId | Referencia al ítem de oferta |
originalUnitPrice | Number | Precio del proveedor |
margin | Number | Margen de Algesta (monto o porcentaje) |
finalUnitPrice | Number | Precio mostrado al cliente |
finalSubtotal | Number | quantity × finalUnitPrice |
6. Reglas de Elegibilidad
Validación de Elegibilidad del Proveedor
Los proveedores deben cumplir TODOS los criterios para ofertar en una subasta:
-
Validación de Documentos:
- ARL (seguro de riesgos laborales) - subido y no vencido
- EPS (seguro de salud) - subido y no vencido
- RUT (registro tributario) - subido y no vencido
- Certificado de experiencia - subido y no vencido
- Otros documentos según tipo de servicio
-
Coincidencia de Servicio:
- El proveedor debe ofrecer el tipo de servicio solicitado en la orden
- Tipo de servicio verificado contra servicios registrados del proveedor
-
Coincidencia de Ubicación:
- El proveedor debe servir la ubicación de la orden (ciudad/región)
- Ubicación verificada contra áreas de servicio del proveedor
-
Estado Activo:
- La cuenta del proveedor debe estar activa (no suspendida)
- Sin problemas de cumplimiento pendientes
-
Asistencia a Videollamada (si aplica):
- Para ciertos tipos de servicio, el proveedor debe haber asistido a videollamada técnica
- Asistencia a videollamada rastreada en perfil del proveedor
Implementación: algesta-ms-provider-nestjs/src/application/handlers/queries/provider/validate-provider-eligibility.handler.ts
Flujo de Verificación de Elegibilidad
flowchart TD
A[Proveedor ve subasta] --> B{¿Documentos válidos?}
B -->|No| C[Mostrar: 'Documentos vencidos: ARL, RUT']
B -->|Sí| D{¿Coincide servicio?}
D -->|No| E[Mostrar: 'Tipo de servicio no ofrecido']
D -->|Sí| F{¿Coincide ubicación?}
F -->|No| G[Mostrar: 'Ubicación no servida']
F -->|Sí| H{¿Estado activo?}
H -->|No| I[Mostrar: 'Cuenta suspendida']
H -->|Sí| J{¿Videollamada requerida?}
J -->|Sí| K{¿Asistió a videollamada?}
K -->|No| L[Mostrar: 'Asistencia a videollamada requerida']
K -->|Sí| M[Proveedor elegible - Mostrar formulario de oferta]
J -->|No| M
7. Reglas de Anonimato y Visibilidad
La Regla de las 3 Ofertas
Propósito: Proteger a los proveedores de la manipulación de precios y asegurar competencia justa
Reglas:
- Las ofertas se envían anónimamente (identidad del proveedor oculta)
- El agente no puede ver NINGUNA oferta hasta que al menos 3 ofertas sean enviadas
- Una vez que existen 3+ ofertas, TODAS se vuelven visibles para el agente
- Las identidades de los proveedores se revelan solo cuando el agente expande los detalles de la oferta
- Los proveedores no seleccionados permanecen anónimos para el cliente
Implementación: Lógica en algesta-ms-provider-nestjs/src/application/handlers/queries/auction/list-auction-offers.handler.ts
Estados de Vista del Agente
stateDiagram-v2
[*] --> SinOfertas: Subasta publicada
SinOfertas --> Oferta1: 1 oferta recibida
Oferta1 --> Oferta2: 2 ofertas recibidas
Oferta2 --> OfertasVisibles: 3+ ofertas recibidas
OfertasVisibles --> ProveedorSeleccionado: Agente selecciona proveedor
note right of SinOfertas: Agente ve: "Esperando ofertas"
note right of Oferta1: Agente ve: "1 oferta recibida (oculta)"
note right of Oferta2: Agente ve: "2 ofertas recibidas (ocultas)"
note right of OfertasVisibles: Agente ve: Todas las ofertas con detalles
8. Criterios de Selección
Selección Discrecional
Filosofía: Los agentes de Algesta tienen autoridad de decisión final, considerando múltiples factores más allá del precio
Factores Considerados:
- Costo: Monto total de oferta (no necesariamente el más bajo)
- Duración: Tiempo estimado para completar
- Calificación del Proveedor: Desempeño histórico (1-5 estrellas)
- Cumplimiento de Documentos: Todos los documentos válidos y actualizados
- Desempeño Pasado: Tasa de completitud, entrega a tiempo, satisfacción del cliente
- Calidad de Oferta: Completitud, profesionalismo, respuestas a preguntas personalizadas
- Evaluación de Riesgo: Capacidad del proveedor, carga de trabajo actual, disponibilidad
Soporte del Sistema:
- Etiqueta de recomendación (ej., “Mejor Oferta”) basada en puntuación ponderada
- Métricas de desempeño del proveedor visibles en detalles expandibles
- Columnas ordenables para fácil comparación
- Campo de justificación para documentar razón de selección (rastro de auditoría)
No Automatizado:
- Sin asignación automática (siempre selección manual)
- Sin selección forzada de oferta más baja
- Sin auto-selección basada en tiempo
9. Resumen de Endpoints API
| Endpoint | Método | Descripción | Actor | Sprint |
|---|---|---|---|---|
/api/auctions/publish | POST | Publicar orden en marketplace | Agente | S4 |
/api/auctions | GET | Listar subastas activas | Proveedor | S4 |
/api/auctions/:id | GET | Obtener detalles de subasta | Agente/Proveedor | S4 |
/api/auctions/:id/offers | POST | Enviar oferta | Proveedor | S4 |
/api/auctions/:id/offers/:offerId | PUT | Editar oferta | Proveedor | S4 |
/api/auctions/:id/offers | GET | Listar ofertas (si ≥3) | Agente | S4 |
/api/auctions/:id/assign | POST | Seleccionar proveedor | Agente | S4 |
/api/auctions/:id/items | POST | Crear estructura detallada | Agente | S6 |
/api/auctions/:id/offers/:offerId/inflate | POST | Aplicar margen | Agente | S8 |
/api/auctions/finished | GET | Listar subastas cerradas | Agente/Proveedor | S7 |
/api/auctions/:id/extend | POST | Extender duración de subasta | Agente | S8 |
/api/auctions/:id/cancel | POST | Cancelar subasta | Agente | S8 |
/api/auctions/:id/eligibility/:providerId | GET | Verificar elegibilidad de proveedor | Sistema | S4 |
Referencia: algesta-ms-provider-nestjs/src/infrastructure/controllers/auctions.controller.ts
10. Puntos de Integración
Integración de Servicios Internos
-
Servicio de Órdenes:
- Creación de subasta dispara cambio de estado de orden (EnRevision → PublicadaParaOfertas)
- Selección de proveedor actualiza orden (PublicadaParaOfertas → ProveedorSeleccionado)
- Transiciones de estado de orden rastreadas en OrderHistory
-
Servicio de Proveedores:
- Validación de elegibilidad antes del envío de oferta
- Envío de oferta crea registro de actividad del proveedor
- Seguimiento de desempeño después de completar la orden
-
Servicio de Notificaciones:
- Notificar proveedores de nuevas subastas (email + WhatsApp)
- Notificar agente de nuevas ofertas
- Notificar todas las partes de selección de proveedor
-
Dashboard:
- Monitoreo de subastas en tiempo real
- Comparación de ofertas y UI de selección de proveedor
- Filtros y búsqueda de marketplace
Integración Externa
- Azure Blob Storage: Almacenar documentos y fotos de subasta
- WhatsApp (Jelou): Notificar proveedores de nuevas subastas
11. Flujos de Trabajo Clave con Diagramas de Secuencia
Publicación de Subasta
sequenceDiagram
participant Agente
participant Dashboard
participant Gateway
participant ProviderMS
participant OrdersMS
participant NotificationsMS
Agente->>Dashboard: Clic en "Publicar en Marketplace"
Dashboard->>Agente: Mostrar formulario de configuración de subasta
Agente->>Dashboard: Configurar duración, agregar preguntas
Dashboard->>Gateway: POST /api/auctions/publish
Gateway->>ProviderMS: PublishOrderForAuctionCommand
ProviderMS->>ProviderMS: Validar datos de orden
ProviderMS->>ProviderMS: Obtener proveedores elegibles
alt Sin proveedores elegibles
ProviderMS-->>Dashboard: Error: No hay proveedores disponibles
else Proveedores encontrados
ProviderMS->>ProviderMS: Crear entidad Auction (estado: ACTIVE)
ProviderMS->>OrdersMS: Actualizar estado de orden a PublicadaParaOfertas
OrdersMS->>OrdersMS: Crear registro OrderHistory
ProviderMS->>NotificationsMS: Notificar proveedores elegibles
NotificationsMS->>NotificationsMS: Enviar emails/WhatsApp a proveedores
ProviderMS-->>Dashboard: Subasta creada exitosamente
Dashboard->>Agente: Mostrar detalles de subasta
end
Envío de Oferta
sequenceDiagram
participant Proveedor
participant PortalProveedor
participant Gateway
participant ProviderMS
Proveedor->>PortalProveedor: Navegar subastas disponibles
PortalProveedor->>Gateway: GET /api/auctions?providerId=:id
Gateway->>ProviderMS: ListAuctionsQuery
ProviderMS-->>PortalProveedor: Lista de subastas
Proveedor->>PortalProveedor: Ver detalles de subasta
PortalProveedor->>Gateway: GET /api/auctions/:id
Gateway->>ProviderMS: GetAuctionDetailQuery
ProviderMS->>ProviderMS: Verificar elegibilidad del proveedor
alt No elegible
ProviderMS-->>PortalProveedor: Mostrar mensaje "No elegible" con razones
else Elegible
ProviderMS-->>PortalProveedor: Mostrar detalles de subasta con formulario de oferta
Proveedor->>PortalProveedor: Llenar formulario de oferta (costo, duración, comentarios)
PortalProveedor->>Gateway: POST /api/auctions/:id/offers
Gateway->>ProviderMS: CreateAuctionOfferCommand
ProviderMS->>ProviderMS: Validar datos de oferta
ProviderMS->>ProviderMS: Guardar oferta (estado: PENDING)
ProviderMS->>ProviderMS: Verificar si ahora existen 3+ ofertas
alt 3+ ofertas alcanzadas
ProviderMS->>NotificationsMS: Notificar agente (ofertas ahora visibles)
end
ProviderMS-->>PortalProveedor: Oferta enviada exitosamente
PortalProveedor->>Proveedor: Mostrar confirmación
end
Selección de Proveedor
sequenceDiagram
participant Agente
participant Dashboard
participant Gateway
participant ProviderMS
participant OrdersMS
participant NotificationsMS
Agente->>Dashboard: Ver subasta con ≥3 ofertas
Dashboard->>Gateway: GET /api/auctions/:id/offers
Gateway->>ProviderMS: ListAuctionOffersQuery
ProviderMS-->>Dashboard: Lista de ofertas con detalles de proveedor
Agente->>Dashboard: Revisar ofertas, comparar proveedores
Agente->>Dashboard: Seleccionar proveedor con justificación
Dashboard->>Gateway: POST /api/auctions/:id/assign
Gateway->>ProviderMS: AssignProviderCommand
ProviderMS->>ProviderMS: Actualizar estado de subasta a CLOSED
ProviderMS->>ProviderMS: Actualizar estado de oferta seleccionada a SELECTED
ProviderMS->>ProviderMS: Actualizar ofertas no seleccionadas a REJECTED
ProviderMS->>OrdersMS: Actualizar orden con proveedor seleccionado
OrdersMS->>OrdersMS: Actualizar estado a ProveedorSeleccionado
OrdersMS->>OrdersMS: Crear registro OrderHistory
ProviderMS->>NotificationsMS: Notificar proveedor seleccionado
ProviderMS->>NotificationsMS: Notificar proveedores no seleccionados
NotificationsMS->>NotificationsMS: Enviar notificaciones (email/WhatsApp)
ProviderMS-->>Dashboard: Proveedor asignado exitosamente
Dashboard->>Agente: Mostrar mensaje de éxito
Inflación de Cotización (Sprint 8)
sequenceDiagram
participant Agente
participant Dashboard
participant Gateway
participant ProviderMS
participant OrdersMS
Note over Agente,OrdersMS: Después de selección de proveedor, antes de enviar al cliente
Agente->>Dashboard: Ver cotización detallada del proveedor
Dashboard->>Agente: Mostrar ítems con precios del proveedor
Agente->>Dashboard: Aplicar margen (15% o manual por ítem)
Dashboard->>Dashboard: Calcular precios inflados
Dashboard->>Agente: Mostrar vista previa (original vs. final)
Agente->>Dashboard: Confirmar inflación
Dashboard->>Gateway: POST /api/auctions/:id/offers/:offerId/inflate
Gateway->>ProviderMS: CreateOfferInflationCommand
ProviderMS->>ProviderMS: Guardar ítems inflados
ProviderMS->>OrdersMS: Actualizar orden con cotización inflada
OrdersMS->>OrdersMS: Actualizar estado a CotizacionEnviada
ProviderMS-->>Dashboard: Inflación aplicada exitosamente
Dashboard->>Agente: Mostrar cotización inflada
Agente->>Dashboard: Enviar al cliente para aprobación
12. Evidencia de Pruebas
De unified_Pruebas_notes.md:
Sprint 4 - Historia 16544: Publicación de Marketplace
Pre-requisitos:
- Rol de agente con permisos de marketplace
- Órdenes en estado “EnRevision”
- Al menos un proveedor elegible (documentos válidos, coincidencia de servicio/ubicación)
- Datos de orden válidos (ubicación, tipo de servicio, descripción, fotos)
Escenarios Probados:
-
Publicación con Proveedores Elegibles:
- Acción: Agente publica orden en marketplace
- Esperado: Subasta creada, proveedores notificados, estado de orden cambiado
- Resultado: ✅ Validado
-
Publicación sin Proveedores Elegibles:
- Acción: Agente intenta publicar orden sin proveedores elegibles
- Esperado: Mensaje de error “No hay proveedores disponibles para este servicio/ubicación”
- Resultado: ✅ Validado
-
Publicación con Datos Insuficientes:
- Acción: Agente intenta publicar orden con campos requeridos faltantes
- Esperado: Error de validación listando campos faltantes
- Resultado: ✅ Validado
-
Verificación de Elegibilidad del Proveedor:
- Acción: Proveedor con documentos vencidos ve subasta
- Esperado: Mensaje “No elegible” con nombres de documentos vencidos
- Resultado: ✅ Validado
-
Vista de Orden Anonimizada:
- Acción: Proveedor ve detalles de subasta
- Esperado: Nombre de cliente oculto, solo ubicación general mostrada
- Resultado: ✅ Validado
-
Seguimiento Post-Publicación:
- Acción: Agente ve dashboard de marketplace
- Esperado: Subasta visible con estado correcto y conteo de ofertas
- Resultado: ✅ Validado
-
Control de Acceso:
- Acción: Proveedor no elegible intenta enviar oferta
- Esperado: Envío de oferta bloqueado
- Resultado: ✅ Validado
Todos los criterios de aceptación validados ✅
13. Known Issues and Future Enhancements
From Completo_backlog_analysis.md:
🟨 Essential MVP Improvements
- Mark “Best Offer” Visually: Implement recommendation algorithm and UI tag
- Improve Marketplace Filters: Add filters by service type, location, urgency, date range
- Migrate List View to Card View: Better UX for marketplace orders
- Auction Extension Logic: Allow agents to extend auctions with insufficient offers
- Cancellation Workflow: Completo auction cancellation with provider notifications
🟩 Post-MVP Operaciones
- Automatic Provider Assignment: Rules-based selection (lowest bid, highest rating, etc.)
- Real-time Auction Updates: SignalR/WebSockets for live offer tracking
- Provider Reputation System: Detailed Métricas (response time, quality, reliability)
- Historical Pricing Analysis: Help agents validate offer reasonableness
- Auction Templates: Pre-configured settings for common service types
🟦 Future Backlog
- Provider Bidding Strategy Analytics: Insights for providers on competitive positioning
- Multi-Round Auctions: Allow counter-offers and negotiation
- Auction Automation: Auto-extend if <3 offers near deadline
- Provider Performance Prediction: ML model to predict provider success probability
14. Referencias Cruzadas
Arquitectura Documentoation
Data Flows
- All Process Flows (includes auction and provider selection flows)
Related Funcionalidades
Sprint Documentoation
Sprint 4, 6, 8 Documentoation - see docs/Sprint_4.md, Sprint_6.md, Sprint_8.md in project Repositorio
Pruebas
Unified Pruebas Notes (Sprint 4 - Historia 16544) - see test/unified_Pruebas_notes.md in project Repositorio
Last Updated: 2025-11-20 | Next Review: End of Guarantee Phase