Oportunidades de Venta — Documentacion Tecnica¶
Documento consolidado de analisis y diseno del modulo de Oportunidades de Venta. Generado: febrero 2026
Modo de funcionamiento de la operación de gestión de la oportunidad:¶
etapas¶
- Lead
- Cotización (Negociación)
- Oferta (Negociación)
- Confirmado(Abastecimiento)
- Cierre
Definición de las etapas¶
- Lead: en esta etapa se recibe un cliente potencial y se tiene prospecto de su interés por algún producto.
- Cotización: cuando el producto de interés del cliente no existe para oferta, el vendedor pasa el interés del cliente al departamento de compras para saber de la disponibilidad de un producto. Potencialmente, el vendedor produce un documento en borrador de la cotización de oferta. Deberá producir el documento de cotización en draft para cerrar la actividad.
- Oferta: En esta etapa el Vendedor propone la cotización presentada por el departamento de ventas. en este paso puede retornar al anterior dependiendo de la respuesta del cliente. Ya existe un documento de cotización en draft.
- Confirmado: Esta etapa es de confirmación de la compra de parte del cliente. A esta etapa se pasa confirmando el draft de cotizacion que se pasara a compras. El vendedor solicita al departamento de compras el abastecimiento de el o los items de la Cotización aceptada por el cliente. En esta etapa compras crea productos si es necesario.
- Cierre: Fase final de determinación del estado de la oportunidad de venta. Si la oportunidad es ganada Confirma el documento de la cotización en un Pedido y cierra la oportunidad. Si la oportunidad es perdida, el vendedor reporta brevemente el motivo.
Condiciones de paso de etapas.¶
Transiciones de etapa¶
Las etapas avanzan automáticamente por evento, no por accion manual del vendedor.
| # | Transicion | Evento que la dispara | Quien lo ejecuta |
|---|---|---|---|
| T1 | Lead (10%) → Cotizacion (30%) | Vendedor envia primer mensaje en la oportunidad | VEND (el sistema crea la Actividad de Cotizacion automaticamente) |
| T2 | Cotizacion (30%) → Oferta (50%) | Vendedor envia la oferta al cliente | VEND (accion explicita) |
| T3 | Oferta (50%) → Confirmado (80%) | Vendedor registra que el cliente confirmo la compra | VEND (accion explicita o confirmacion de cotizacion draft) |
| T4 | Confirmado (80%) → Cierre Ganado (100%) | Cotizacion convertida a Orden de Venta | Sistema (al crear la Orden de Venta desde la Cotizacion) |
| T5 | Cualquier etapa → Cierre Perdido (0%) | Vendedor registra la oportunidad como perdida | VEND (accion explicita, requiere motivo) |
Convencion de nombres¶
Este documento usa nombres del SAP B1 Service Layer en lugar de codigos de tabla.
| Entidad | Codigo SAP | Descripcion |
|---|---|---|
| SalesOpportunity | OOPR | Oportunidad de venta (nodo central) |
| OpportunityLine | OOPR.Lines | Linea de etapa dentro de la oportunidad |
| Quotation | OQUT | Cotizacion al cliente |
| QuotationTextLine | OQUT.SpecialLines | Linea de texto libre (draft) |
| QuotationItemLine | OQUT.Lines | Linea con item real (formal) |
| SalesOrder | ORDR | Pedido de venta |
| Activity | OACT | Tarea, reunion, llamada |
| Item | OITM | Producto o servicio en catalogo |
| PurchaseOrder | OPOR | Orden de compra al proveedor |
| GoodsReceipt | OPDN | Recepcion de mercaderia |
A1. Flujo principal¶
Ciclo de una oportunidad de venta en 5 etapas, desde apertura hasta cierre.
Etapas¶
| # | Etapa | % Cierre | Trigger |
|---|---|---|---|
| 1 | Lead | 10% | Alta de oportunidad |
| 2 | Cotizacion | 30% | VEND solicita disponibilidad/precio a COMP |
| 3 | Oferta | 50% | VEND envia cotizacion al cliente |
| 4 | Confirmado | 80% | Cliente acepta, VEND solicita abastecimiento |
| 5 | Cierre | 100%/0% | Quotation → SalesOrder (Won) o rechazo (Missed) |
Pasos por etapa¶
Etapa 1: Lead¶
Cliente potencial con interes en algun producto.
| # | Actor | Accion | Entidad | Resultado |
|---|---|---|---|---|
| 1.1 | VEND | Crea oportunidad | SalesOpportunity | Status=sos_Open, Stage=Lead |
| 1.2 | VEND | Registra interes del cliente | Firebase comments/OOPR/{id} |
Contexto inicial |
| 1.3 | VEND | Evalua disponibilidad | — | Disponible → Etapa 3 / No → Etapa 2 |
Etapa 2: Cotizacion¶
Producto no disponible. VEND solicita a COMP investigar precio y disponibilidad.
| # | Actor | Accion | Entidad | Resultado |
|---|---|---|---|---|
| 2.1 | VEND | Crea Activity de Cotizacion | Activity | Solicitud a COMP |
| 2.2 | VEND | Detalla specs y cantidad | Firebase comments/OACT/{id} |
Requerimientos del cliente |
| 2.3 | COMP | Investiga con proveedores | (externo) | Precio costo, plazo, disponibilidad |
| 2.4 | COMP | Responde con oferta interna | Firebase comments/OACT/{id} |
Precio + plazo |
| 2.5 | COMP | Calcula precio de venta | — | Aplica margen sobre costo |
| 2.6 | COMP | Genera Quotation draft | Quotation | Lineas dslt_Text (texto libre) |
Salida: Quotation draft creado → Etapa 3. El item NO existe en SAP; el Quotation tiene lineas de texto con descripcion y precio.
Etapa 3: Oferta¶
VEND presenta cotizacion al cliente. Negociación hasta decision.
| # | Actor | Accion | Resultado |
|---|---|---|---|
| 3.1 | VEND | Envia cotizacion al cliente | PDF en Firebase comments/OQUT/{id} |
| 3.2 | CLI | Revisa y responde | Feedback |
| 3.3 | VEND | Ajusta Quotation si hay cambios | Loop hasta decision |
| 3.4 | CLI | Comunica decision final | Acepta o rechaza |
Salida: Acepta + disponible → Etapa 5 (Won) / Acepta + requiere compra → Etapa 4 / Rechaza → Etapa 5 (Missed)
Variante: Si cambio requiere nueva consulta a COMP → retorna a Etapa 2
Etapa 4: Confirmado (Abastecimiento)¶
Cliente confirmo. VEND solicita abastecimiento a COMP.
| # | Actor | Accion | Entidad | Resultado |
|---|---|---|---|---|
| 4.1 | VEND | Crea Activity de Compra | Activity | Solicitud formal |
| 4.2 | VEND | Adjunta Quotation aceptado | Firebase comments/OACT/{id} |
Precio acordado |
| 4.3 | COMP | Crea item en SAP (si no existe) | Item | ItemCode + precio costo |
| 4.4 | COMP | Genera Orden de Compra | PurchaseOrder | PO al proveedor |
| 4.5 | COMP | Recibe mercaderia | GoodsReceipt | Stock actualizado |
| 4.6 | COMP | Formaliza Quotation | Quotation | Reemplaza texto por ItemCode real |
| 4.7 | COMP | Notifica a VEND | Firebase comments/OACT/{id} |
"Listo para cerrar" |
Salida: Producto en stock, Quotation formalizado → Etapa 5 (Won)
Etapa 5: Cierre¶
| Resultado | Actor | Accion | Entidad |
|---|---|---|---|
| Ganado | VEND | Convierte Quotation a SalesOrder | SalesOrder creado → Status=sos_Won |
| Perdido | VEND | Registra motivo de rechazo | ReasonForClosing obligatorio → Status=sos_Missed |
Diagrama Mermaid¶
flowchart TD
subgraph LEAD["1. Lead (10%)"]
START([Inicio]) --> A1[VEND: Crea oportunidad<br/>OOPR Status=Open]
A1 --> A2[VEND: Registra interes<br/>Firebase comments/OOPR]
A2 --> CHECK{Producto disponible<br/>en SAP?}
end
subgraph COTIZACION["2. Cotizacion (30%)"]
CHECK -->|No| TASK[VEND: Crea Actividad<br/>de Cotizacion OACT]
TASK --> SPECS[VEND: Detalla specs<br/>Firebase comments/OACT]
SPECS --> INVEST[COMP: Investiga<br/>con proveedores]
INVEST --> OFFER[COMP: Responde con<br/>oferta interna]
OFFER --> PRICE[COMP: Calcula precio<br/>de venta con margen]
PRICE --> QUOT[COMP: Genera Quotation<br/>draft OQUT dslt_Text]
end
subgraph OFERTA["3. Oferta (50%)"]
CHECK -->|Si| SEND
QUOT --> SEND[VEND: Envia cotizacion<br/>al cliente]
SEND --> CLI_REVIEW[CLI: Revisa cotizacion<br/>y responde]
CLI_REVIEW --> CHANGES{Pide<br/>cambios?}
CHANGES -->|Si| EDIT[VEND: Ajusta OQUT]
EDIT -->|Nueva consulta COMP| TASK
EDIT -->|Ajuste menor| SEND
CHANGES -->|Decision final| DECISION{Cliente<br/>acepta?}
end
subgraph CONFIRMADO["4. Confirmado (80%)"]
DECISION -->|Acepta + requiere compra| ACT_COMPRA[VEND: Crea Actividad<br/>de Compra OACT]
ACT_COMPRA --> COMP_ITEM[COMP: Crea item<br/>en SAP OITM]
COMP_ITEM --> COMP_PO[COMP: Genera Orden<br/>de Compra OPOR]
COMP_PO --> COMP_REC[COMP: Recibe<br/>mercaderia OPDN]
COMP_REC --> COMP_FORM[COMP: Formaliza OQUT<br/>ItemCode real]
COMP_FORM --> COMP_NOT[COMP: Notifica a VEND<br/>Listo para cerrar]
end
subgraph CIERRE["5. Cierre"]
DECISION -->|Acepta + disponible| CONVERT
COMP_NOT --> CONVERT[VEND: Convierte<br/>OQUT a ORDR]
CONVERT --> WON([Ganada<br/>sos_Won])
DECISION -->|Rechaza| REASON[VEND: Registra<br/>ReasonForClosing]
REASON --> LOST([Perdida<br/>sos_Missed])
end
%% Estilos
classDef vendor fill:#dbeafe,stroke:#2563eb,color:#1e40af
classDef compras fill:#fef3c7,stroke:#d97706,color:#92400e
classDef cliente fill:#d1fae5,stroke:#059669,color:#065f46
classDef decision fill:#fce7f3,stroke:#db2777,color:#9d174d
classDef endpoint fill:#f3f4f6,stroke:#6b7280,color:#374151
class A1,A2,TASK,SPECS,SEND,EDIT,ACT_COMPRA,CONVERT,REASON vendor
class INVEST,OFFER,PRICE,QUOT,COMP_ITEM,COMP_PO,COMP_REC,COMP_FORM,COMP_NOT compras
class CLI_REVIEW cliente
class CHECK,CHANGES,DECISION decision
class START,WON,LOST endpoint
Leyenda¶
| Color | Actor | Responsabilidad |
|---|---|---|
| Azul | VEND (Vendedor) | Gestiona el ciclo de venta, presenta cotizacion al cliente |
| Amarillo | COMP (Compras) | Investiga proveedores, calcula margenes/precio, genera Quotation draft, abastece items |
| Verde | CLI (Cliente) | Negocia y decide |
| Rosa | Decision | Bifurcaciones del flujo |
Version PlantUML¶
@startuml Flujo_Oportunidad_Venta
skinparam backgroundColor #FEFEFE
skinparam ActivityBackgroundColor #FFFFFF
skinparam ActivityBorderColor #64748B
skinparam ActivityDiamondBackgroundColor #FCE7F3
skinparam ActivityDiamondBorderColor #DB2777
skinparam ArrowColor #64748B
|#DBEAFE| VEND |
|#FEF3C7| COMP |
|#D1FAE5| CLI |
|VEND|
start
:**Etapa 1: Lead (10%)**; <<#E0E7FF>>
:Crea oportunidad
----
OOPR Status=Open, Stage=Lead
CardCode + MaxLocalTotal;
:Registra interes del cliente
----
Firebase comments/OOPR/{id};
:Evalua disponibilidad del producto;
if (Producto disponible en SAP?) then (Si)
else (No)
:**Etapa 2: Cotizacion (30%)**; <<#FFF7ED>>
:Crea Actividad de Cotizacion
----
OACT Solicitud a Compras;
:Detalla specs y cantidad
----
Firebase comments/OACT/{id};
|COMP|
:Investiga con proveedores
----
Precio costo, tiempo, disponibilidad;
:Responde con oferta interna
----
Precio + plazo estimado
Firebase comments/OACT/{id};
:Calcula precio de venta
----
Aplica margen sobre costo;
:Genera Quotation draft
----
OQUT lineas dslt_Text
(texto libre, item no existe en SAP);
|VEND|
endif
:**Etapa 3: Oferta (50%)**; <<#EDE9FE>>
:Envia cotizacion al cliente
----
PDF opcional
Firebase comments/OQUT/{id};
|CLI|
:Revisa cotizacion y responde;
while (Pide cambios?) is (Si)
|VEND|
:Ajusta OQUT
----
Si requiere nueva consulta
a COMP retorna a Etapa 2;
:Reenvia cotizacion;
|CLI|
:Revisa cotizacion y responde;
endwhile (Decision final)
if (Cliente acepta?) then (Acepta)
|VEND|
if (Requiere abastecimiento?) then (Si - no hay stock)
:**Etapa 4: Confirmado (80%)**; <<#FEF3C7>>
:Crea Actividad de Compra
----
OACT Solicitud formal a Compras;
:Adjunta OQUT aceptado
----
Firebase comments/OACT/{id};
|COMP|
:Crea item en SAP
----
OITM ItemCode + precio costo;
:Genera Orden de Compra
----
OPOR PO al proveedor;
:Recibe mercaderia
----
OPDN Stock actualizado;
:Formaliza OQUT
----
Reemplaza texto por ItemCode real;
:Notifica a VEND
----
Listo para cerrar
Firebase comments/OACT/{id};
|VEND|
else (No - producto en stock)
endif
:**Etapa 5: Cierre Ganado (100%)**; <<#DCFCE7>>
:Convierte OQUT a ORDR
----
Pedido de venta creado;
:Oportunidad **GANADA**
----
OOPR Status = sos_Won; <<#90EE90>>
stop
else (Rechaza)
|VEND|
:**Etapa 5: Cierre Perdido (0%)**; <<#FEE2E2>>
:Registra motivo de rechazo
----
OOPR ReasonForClosing (obligatorio);
:Oportunidad **PERDIDA**
----
OOPR Status = sos_Missed; <<#FFB6C1>>
stop
endif
@enduml
Para visualizar: PlantUML Online Server o extension de VS Code.
A2. Estados de SalesOpportunity¶
@startuml Estados_OOPR_A2
skinparam backgroundColor #FEFEFE
skinparam StateBackgroundColor #FFFFFF
skinparam StateBorderColor #64748B
skinparam ArrowColor #64748B
state "sos_Open" as OPEN #DBEAFE {
state "Lead (10%)" as LEAD #E0E7FF
state "Cotizacion (30%)" as COT #FFF7ED
state "Oferta (50%)" as OFERTA #EDE9FE
state "Confirmado (80%)" as CONF #FEF3C7
[*] --> LEAD : Alta oportunidad
LEAD --> COT : Producto no disponible\nVEND solicita a COMP
LEAD --> OFERTA : Producto disponible
COT --> OFERTA : OQUT draft creado
OFERTA --> COT : Cambio requiere\nnueva consulta COMP
OFERTA --> CONF : Cliente acepta\nrequiere abastecimiento
OFERTA --> OFERTA : Negociacion\n(loop cambios)
}
state "sos_Won" as WON #86EFAC
state "sos_Missed" as MISSED #FCA5A5
OFERTA --> WON : Acepta + disponible\nOQUT convertido a ORDR
CONF --> WON : Abastecido\nOQUT convertido a ORDR
OFERTA --> MISSED : Cliente rechaza\n(ReasonForClosing obligatorio)
WON --> [*]
MISSED --> [*]
note right of OPEN
La oportunidad permanece Open
mientras se negocia.
Las etapas internas actualizan
CurrentStageNo y ClosingPercentage.
end note
note bottom of WON
Status final.
ORDR generado.
No se puede reabrir.
end note
note bottom of MISSED
Status final.
Historial preservado.
No se elimina.
end note
@enduml
Transiciones¶
| Desde | Hacia | Trigger | Campos actualizados |
|---|---|---|---|
| — | Lead | Alta de oportunidad | Status, CurrentStageNo, StartDate |
| Lead | Cotizacion | Producto no disponible, VEND solicita a COMP | CurrentStageNo, ClosingPercentage |
| Lead | Oferta | Producto disponible en stock | CurrentStageNo, ClosingPercentage |
| Cotizacion | Oferta | Quotation draft creado por COMP | CurrentStageNo, ClosingPercentage |
| Oferta | Cotizacion | Cambio requiere nueva consulta a COMP | CurrentStageNo, ClosingPercentage |
| Oferta | Confirmado | Cliente acepta, requiere abastecimiento | CurrentStageNo, ClosingPercentage |
| Oferta | sos_Won |
Cliente acepta + disponible, Quotation → SalesOrder | Status, CloseDate |
| Confirmado | sos_Won |
Abastecido, Quotation → SalesOrder | Status, CloseDate |
| Oferta | sos_Missed |
Cliente rechaza | Status, CloseDate, ReasonForClosing |
Porcentajes por etapa¶
| Etapa | StageKey | ClosingPercentage |
|---|---|---|
| Lead | 1 | 10% |
| Cotizacion | 2 | 30% |
| Oferta | 3 | 50% |
| Confirmado | 4 | 80% |
| Cierre | 5 | 100% / 0% |
A5. Reglas y restricciones¶
Recopilacion de todas las reglas de negocio, validaciones y restricciones que gobiernan el ciclo de vida de la oportunidad de venta y sus entidades relacionadas.
Transiciones de etapa¶
Las etapas avanzan automaticamente por evento, no por accion manual del vendedor.
| # | Transicion | Evento que la dispara | Quien lo ejecuta |
|---|---|---|---|
| T1 | Lead (10%) → Cotizacion (30%) | Vendedor solicita actividad de cotizacion | VEND (el sistema crea la Actividad de Cotizacion) |
| T2 | Cotizacion (30%) → Oferta (50%) | COMP proporciono precios y VEND marca el borrador como listo | VEND (accion explicita: "Marcar borrador como listo") |
| T3 | Oferta (50%) → Confirmado (80%) | VEND registra que el cliente acepto la cotizacion (comunicacion externa via WhatsApp u otro medio) | VEND (accion explicita: "Confirmar cotizacion — cliente acepto") |
| T4 | Confirmado (80%) → Cierre Ganado (100%) | Cotizacion confirmada por COMP (campo de control) + VEND convierte a Orden de Venta | VEND (requiere confirmacion previa de COMP en actividad de Compra) |
| T5 | Cualquier etapa → Cierre Perdido (0%) | Vendedor registra la oportunidad como perdida | VEND (accion explicita, requiere motivo) |
Restricciones de transicion:
- No se puede saltar etapas — el flujo es estrictamente secuencial
- No se puede retroceder de etapa — si hay cambios se manejan con nuevas actividades dentro de la misma etapa
- Cierre Perdido requiere motivo obligatorio (campo
ReasonForClosingen SAP) - Cierre Ganado requiere que exista una Orden de Venta generada desde la Cotizacion
Actividades¶
Creacion:
| # | Regla |
|---|---|
| A1 | Actividad de Cotizacion se crea automaticamente cuando el vendedor envia un mensaje y no existe actividad abierta para la oportunidad |
| A2 | Actividad de Compra se crea explicitamente mediante el boton "Solicitar abastecimiento". El boton se muestra desactivado en etapa Oferta (el vendedor debe primero confirmar la cotizacion con el cliente) y se habilita al llegar a la etapa Confirmado |
| A3 | El campo Subject se define automaticamente en la creacion: valor fijo "Cotizacion" o "Compra". No es editable por el usuario |
| A4 | No puede haber dos actividades del mismo tipo abiertas simultaneamente para la misma oportunidad |
Cierre:
| # | Regla |
|---|---|
| A5 | Solo COMP puede cerrar la actividad (cierre manual) |
| A6 | Validacion de cierre para Cotizacion: debe existir una Cotizacion en borrador vinculada a la oportunidad |
| A7 | Validacion de cierre para Compra: todos los productos de la Cotizacion deben tener un ItemCode vinculado. COMP confirma el draft para cerrar la actividad |
| A8 | Si despues de cerrar una actividad el vendedor necesita comunicarse de nuevo con Compras, se crea una nueva actividad. La anterior queda como registro historico |
| A9 | El estado "En Proceso" es logico (modelado en la UI). SAP solo tiene open y closed |
Cotizacion (Quotation)¶
| # | Regla |
|---|---|
| Q1 | La Cotizacion en borrador puede contener lineas de texto (DocumentSpecialLines) y/o lineas de producto (DocumentLines con ItemCode). Ambos tipos coexisten en el mismo documento |
| Q2 | VEND o COMP pueden crear la Cotizacion en borrador. VEND puede agregar lineas de texto y lineas de producto. COMP investiga proveedores, calcula margenes y define precios |
| Q3 | Tanto VEND como COMP pueden agregar lineas al borrador. COMP valida precios y margenes |
| Q4 | La Cotizacion se confirma en la etapa Confirmado mediante la actividad de Compra: COMP verifica precios, vincula items reales de SAP, y marca la cotizacion como confirmada (campo de control en OQUT). Solo despues de la confirmacion VEND puede convertir a Orden |
| Q5 | La formalizacion requiere que los items existan en el maestro de productos de SAP. Si no existen, COMP los crea |
| Q6 | Solo una Cotizacion activa por oportunidad a la vez. Las versiones anteriores quedan como historico |
| Q7 | No se puede confirmar (formalizar) el borrador si alguna linea de producto no tiene precio asignado. Todas las lineas deben tener precio antes de pasar de Draft a Formal |
| Q8 | No se puede confirmar el borrador si el precio de un producto difiere del precio registrado en el maestro de items de SAP (OITM.Price). Esta restriccion asegura consistencia con el catalogo y requiere que COMP actualice el precio en SAP o ajuste la cotizacion |
| Q9 | No se puede confirmar el borrador si los productos de tipo texto no han sido vinculados a un ItemCode existente en SAP (deben existir en stock/catalogo) |
| Q10 | La cotizacion tiene un campo de control que indica si fue confirmada por COMP. Este campo se utiliza como prerequisito para la conversion a Orden de Venta (OQUT → ORDR) |
Orden de Venta¶
| # | Regla |
|---|---|
| O1 | La Orden de Venta se genera exclusivamente por conversion desde una Cotizacion formalizada |
| O2 | No se puede crear una Orden de Venta manualmente desde la oportunidad |
| O3 | Al generar la Orden de Venta, la oportunidad avanza automaticamente a Cierre Ganado (100%) |
Abastecimiento¶
| # | Regla |
|---|---|
| AB1 | El abastecimiento es opcional. Si los productos ya estan en stock, el vendedor puede indicar "No requiere" y avanzar directamente a generar la Orden de Venta |
| AB2 | Si se solicita abastecimiento, se crea una Actividad de Compra y COMP gestiona la Orden de Compra y Recepcion de Mercaderia |
| AB3 | La Recepcion de Mercaderia es prerequisito para que COMP pueda formalizar la Cotizacion con items reales |
Conversacion¶
| # | Regla |
|---|---|
| CV1 | Los mensajes entre vendedor y Compras se almacenan en el contexto de la Actividad, no de la Oportunidad |
| CV2 | Los mensajes entre vendedor y cliente se almacenan en el contexto de la Cotizacion |
| CV3 | La vista de la oportunidad agrega los mensajes de todas las Actividades hijas en un timeline unificado |
| CV4 | Las notas del vendedor (no conversacion) se almacenan en el contexto de la Oportunidad |
| CV5 | Cuando el vendedor escribe un mensaje y no hay Actividad abierta, el sistema crea una automaticamente antes de enviar el mensaje |
Documentos en la vista de oportunidad¶
| # | Regla |
|---|---|
| UI1 | Los documentos vinculados (Cotizaciones, Ordenes de Venta) se acceden desde la tab "Documentos" de la oportunidad. El detalle de cada documento se abre en un modal sin salir de la pagina |
| UI2 | VEND puede editar el borrador de cotizacion: agregar/modificar lineas de texto y lineas de producto |
| UI3 | Desde el modal de documento se puede enviar la cotizacion al cliente, descargar PDF, y convertir a Orden de Venta |
| UI4 | La conversion a Orden de Venta solo esta disponible cuando la cotizacion es formalizada por COMP |
Permisos por actor¶
| Accion | VEND | COMP | GER |
|---|---|---|---|
| Crear oportunidad | Si | No | No |
| Escribir mensajes en oportunidad | Si | No | No |
| Responder mensajes en actividad | No | Si | No |
| Cerrar actividad | No | Si | No |
| Crear Cotizacion en borrador | Si | Si | No |
| Agregar lineas de texto al borrador | Si | Si | No |
| Agregar lineas de producto al borrador | Si | Si | No |
| Editar lineas del borrador de cotizacion | Si | Si | No |
| Formalizar Cotizacion (vincular items SAP) | No | Si | No |
| Confirmar draft (cierra actividad Compra) | No | Si | No |
| Enviar oferta al cliente | Si | No | No |
| Registrar confirmacion del cliente | Si | No | No |
| Solicitar abastecimiento | Si | No | No |
| Indicar "No requiere abastecimiento" | Si | No | No |
| Registrar como perdida | Si | No | Si |
| Convertir Cotizacion a Orden de Venta | Si | No | No |
| Ver pipeline | Si | Si | Si |
| Ver detalle de oportunidad | Si | Si | Si |
Bloque B — Activity¶
B1. Flujo de Activity¶
VEND crea y asigna la Activity; COMP ejecuta, completa el trabajo, y cierra con validacion.
flowchart TD
classDef vend fill:#DBEAFE,stroke:#1D4ED8,color:#1E3A5F
classDef comp fill:#FEF3C7,stroke:#D97706,color:#78350F
classDef validation fill:#FEE2E2,stroke:#DC2626,color:#7F1D1D
classDef state fill:#F3F4F6,stroke:#6B7280,color:#374151
classDef done fill:#DCFCE7,stroke:#16A34A,color:#14532D
START([VEND crea Activity<br/>desde la Oportunidad]):::vend
START --> ASSIGN[Asigna a COMP <br/>SalesOpportunityId + Line]:::vend
ASSIGN --> DETAIL[Detalla contexto en Firebase<br/>comments/OACT/id]:::vend
DETAIL --> PENDING[/Status: Pendiente/]:::state
PENDING --> TAKE[COMP toma la actividad - Usuario que responde se asigna]:::comp
TAKE --> IN_PROGRESS[/Status: En Proceso/]:::state
IN_PROGRESS --> TYPE{Tipo de<br/>Activity?}
TYPE -->|Cotizacion - Etapa 2| COT_WORK[Investiga proveedores<br/>Responde con precio y plazo<br/>Calcula margen<br/>Genera OQUT draft]:::comp
TYPE -->|Compra - Etapa 4| COM_WORK[Crea Item OITM<br/>Genera PO OPOR<br/>Recibe mercaderia OPDN<br/>Formaliza OQUT con ItemCode]:::comp
COT_WORK --> COT_CLOSE[COMP solicita cerrar Activity]:::comp
COT_CLOSE --> COT_VAL{OQUT draft<br/>vinculado?}:::validation
COT_VAL -->|No| COT_BLOCK[Bloqueado: debe vincular OQUT]:::validation
COT_BLOCK --> COT_WORK
COT_VAL -->|Si| DONE
COM_WORK --> COM_CLOSE[COMP solicita cerrar Activity]:::comp
COM_CLOSE --> COM_VAL{OQUT<br/>formalizado?}:::validation
COM_VAL -->|No| COM_BLOCK[Bloqueado: debe confirmar OQUT]:::validation
COM_BLOCK --> COM_WORK
COM_VAL -->|Si| DONE
DONE[/Status: Terminado/]:::done
DONE --> NOTIFY[Notifica a VEND en Firebase<br/>comments/OACT/id]:::comp
NOTIFY --> FIN([Activity cerrada]):::done
Validaciones de cierre¶
| Tipo | Condicion para cerrar | Que se valida |
|---|---|---|
| Cotizacion | Quotation draft vinculado | Existe Quotation con SalesOpportunityId en las lineas de la oportunidad |
| Compra | Quotation formalizado | El Quotation tiene DocumentLines con ItemCode (no solo texto) |
Re-negociacion: Si despues de cerrar una Activity de Cotizacion el cliente pide cambios que afectan precio, se crea una nueva Activity. La anterior queda como registro historico.
B2. Estados de Activity¶
stateDiagram-v2
direction LR
[*] --> Pendiente : VEND crea Activity\ndesde la oportunidad
Pendiente --> EnProceso : COMP toma la actividad(Autoasinacion)
EnProceso --> EnProceso : Trabajo en curso\n(investiga, compra, etc.)
EnProceso --> Terminado : COMP cierra\n(validacion OK)
Terminado --> [*]
state Pendiente {
direction LR
[*] --> EsperandoCOMP
EsperandoCOMP : Activity creada
EsperandoCOMP : Contexto en Firebase
}
state EnProceso {
direction LR
[*] --> Trabajando
Trabajando : COMP ejecuta segun tipo
Trabajando --> Comunicando : Avance/resultado
Comunicando : Firebase comments/OACT/id
Comunicando : Alta de Draft de Quotation
Comunicando --> Trabajando : Mas trabajo pendiente
Comunicando --> ValidandoCierre : Solicita cerrar
ValidandoCierre --> Trabajando : Validacion falla
}
state Terminado {
direction LR
[*] --> Cerrado
Cerrado : Resultado entregado
Cerrado : Notificacion a VEND
}
Transiciones¶
| Estado origen | Trigger | Estado destino | Quien | Condicion |
|---|---|---|---|---|
| — | VEND crea Activity con SalesOpportunityId | Pendiente | VEND | Oportunidad en etapa correcta |
| Pendiente | COMP toma la actividad | En Proceso | COMP | HandledBy = usuario actual |
| En Proceso | COMP solicita cerrar | Terminado | COMP | Validacion de cierre OK |
| En Proceso | Trabajo continua | En Proceso | COMP | Self-loop |
Una Activity cerrada no se reabre. Si se necesita retomar trabajo, se crea una nueva.
B3. Tipos de Activity¶
| Aspecto | Cotizacion (Etapa 2) | Compra (Etapa 4) |
|---|---|---|
| ActivityType SAP | task |
task |
| Creada por | VEND | VEND |
| Ejecutada por | COMP | COMP |
| Proposito | Obtener precio/disponibilidad | Abastecer producto y formalizar Quotation |
| Input de VEND | Specs, cantidades, requerimientos | Quotation aceptado por cliente |
| Output de COMP | Quotation draft (lineas dslt_Text) |
Quotation formalizado (lineas con ItemCode) |
| Entidades generadas | Quotation (draft) | Item + PurchaseOrder + GoodsReceipt + Quotation (formal) |
| Validacion de cierre | Quotation draft vinculado | Quotation formalizado con items |
Vista de detalle: Cotizacion vs Compra¶
La vista de detalle de la actividad cambia segun el tipo:
Actividad de Cotizacion (Etapa 2):
- VEND o COMP pueden agregar lineas al borrador de cotizacion
- Tipos de linea disponibles: Linea de texto (descripcion libre) o Producto (item con cantidad y precio)
- Debe existir un documento de cotizacion en draft para cerrar la actividad
- Mockup: mockups/detalle-actividad.html
Actividad de Compra (Etapa 4):
- COMP puede reemplazar lineas de texto por productos SAP reales (vincular ItemCode)
- Progreso visible: indicador de productos vinculados vs pendientes
- Accion principal: Confirmar Draft — valida que todos los productos tengan item SAP vinculado
- Al confirmar, la actividad se cierra y se notifica al vendedor
- Mockup: mockups/detalle-actividad-compra.html
Otros tipos (fuera del flujo principal)¶
| ActivityType | Uso tipico | Quien crea |
|---|---|---|
meeting |
Reunion con cliente | VEND |
call |
Llamada telefonica | VEND |
email |
Correo electronico | VEND |
Estos tipos no tienen validacion de cierre especial. Son registros informativos en el timeline.
B4. Vinculo Activity — SalesOpportunity¶
Campos de vinculacion¶
| Campo | Tipo | Obligatorio | Descripcion |
|---|---|---|---|
SalesOpportunityId |
int (FK) | Si | ID de la oportunidad. Sin este campo la Activity NO aparece en el timeline |
SalesOpportunityLine |
int | Recomendado | Linea de etapa. Ubica la Activity en la etapa correcta |
HandledBy |
int (FK) | Si | Empleado asignado. Para Cotizacion y Compra siempre es COMP |
Reglas de vinculacion¶
- Toda Activity del flujo debe crearse desde la oportunidad. El sistema setea
SalesOpportunityIdautomaticamente. SalesOpportunityLineapunta a la linea de etapa activa al crear.- Relacion N:1 — una Activity pertenece a una sola oportunidad.
- El vinculo es inmutable —
SalesOpportunityIdno se modifica post-creacion.
Snippet de creacion (Service Layer)¶
{
"ActivityCode": -1,
"ActivityType": "cn_TaskNote",
"SalesOpportunityId": 142,
"SalesOpportunityLine": 1,
"HandledBy": 115,
"ActivityDate": "2026-02-26",
"StartTime": "09:00:00",
"Status": "open",
"Notes": "Solicitud de cotizacion - ver comentarios en Firebase"
}
En SAP B1,
ActivityTypeusa constantes:cn_TaskNote(task),cn_Meeting(meeting),cn_PhoneCall(call).
Diagrama de vinculacion¶
graph LR
classDef opp fill:#DBEAFE,stroke:#1D4ED8
classDef act fill:#FEF3C7,stroke:#D97706
classDef doc fill:#D1FAE5,stroke:#16A34A
classDef fb fill:#FEE2E2,stroke:#DC2626
OPP[SalesOpportunity<br/>OOPR #142]:::opp
OPP -->|SalesOpportunityId=142<br/>Line=0| ACT1[Activity Cotizacion<br/>OACT #365]:::act
OPP -->|SalesOpportunityId=142<br/>Line=2| ACT2[Activity Compra<br/>OACT #380]:::act
ACT1 -->|genera| OQUT1[OQUT #04862<br/>draft]:::doc
ACT2 -->|formaliza| OQUT2[OQUT #04862<br/>formal]:::doc
ACT2 -->|genera| OITM[Item OITM]:::doc
ACT2 -->|genera| OPOR[PO OPOR]:::doc
ACT2 -->|genera| OPDN[GR OPDN]:::doc
ACT1 -.->|comments| FB1[Firebase<br/>comments/OACT/365]:::fb
ACT2 -.->|comments| FB2[Firebase<br/>comments/OACT/380]:::fb