Fundamentos de BPMN: Business Process Model and Notation
Business Process Model and Notation (BPMN) es el estándar internacional para la representación gráfica de procesos empresariales. BPMN 2.0 ofrece una notación estandarizada para modelar, analizar y optimizar flujos de trabajo empresariales.
¿Qué es BPMN?
BPMN es un lenguaje de notación gráfica para describir procesos empresariales. Fue desarrollado por la Object Management Group (OMG) y está estandarizado desde 2011 como norma ISO 19510.
Características principales de BPMN
- Notación estandarizada: Símbolos y reglas uniformes
- Representación gráfica: Modelado visual de procesos
- Independencia tecnológica: Aplicación multiplataforma
- Procesos ejecutables: Implementación directa en motores de flujo de trabajo
Elementos fundamentales de BPMN
1. Flow Objects (Objetos de flujo)
Events (Eventos)
Los eventos son disparadores o resultados en un proceso:
<!-- Start Event -->
<bpmn:startEvent id="startEvent" name="Prozess starten"/>
<!-- End Event -->
<bpmn:endEvent id="endEvent" name="Prozess beenden"/>
<!-- Intermediate Event -->
<bpmn:intermediateCatchEvent id="timerEvent" name="Wartezeit">
<bpmn:timerEventDefinition/>
</bpmn:intermediateCatchEvent>
Tipos de eventos:
- Start Event: Inicio del proceso
- End Event: Fin del proceso
- Intermediate Event: Eventos intermedios
Activities (Actividades)
Las actividades representan pasos de trabajo en el proceso:
<!-- Task -->
<bpmn:task id="task1" name="Daten eingeben"/>
<!-- User Task -->
<bpmn:userTask id="userTask1" name="Genehmigung erforderlich"/>
<!-- Service Task -->
<bpmn:serviceTask id="serviceTask1" name="Automatische Prüfung"/>
<!-- Sub-Process -->
<bpmn:subProcess id="subProcess1" name="Detailprozess">
<bpmn:startEvent id="subStart"/>
<bpmn:task id="subTask1"/>
<bpmn:endEvent id="subEnd"/>
</bpmn:subProcess>
Gateways (Compuertas)
Las compuertas controlan el flujo del proceso:
<!-- Exclusive Gateway (XOR) -->
<bpmn:exclusiveGateway id="gateway1" name="Entscheidung"/>
<!-- Parallel Gateway (AND) -->
<bpmn:parallelGateway id="gateway2" name="Parallelisierung"/>
<!-- Inclusive Gateway (OR) -->
<bpmn:inclusiveGateway id="gateway3" name="Mehrfachauswahl"/>
2. Connecting Objects (Objetos de conexión)
Sequence Flows (Flujos de secuencia)
Conectan actividades y compuertas:
<bpmn:sequenceFlow id="flow1" sourceRef="startEvent" targetRef="task1"/>
<bpmn:sequenceFlow id="flow2" sourceRef="task1" targetRef="gateway1"/>
Message Flows (Flujos de mensajes)
Comunicación entre diferentes procesos:
<bpmn:messageFlow id="msgFlow1" sourceRef="pool1" targetRef="pool2"/>
Associations (Asociaciones)
Conectan artefactos con objetos de flujo:
<bpmn:association id="assoc1" sourceRef="dataObject1" targetRef="task1"/>
3. Pools and Lanes
Pools (Carriles)
Representan participantes en el proceso:
<bpmn:pool id="pool1" name="Abteilung A">
<bpmn:laneSet>
<bpmn:lane id="lane1" name="Mitarbeiter"/>
<bpmn:lane id="lane2" name="Management"/>
</bpmn:laneSet>
</bpmn:pool>
Lanes (Subcurriles)
Organizan actividades dentro de los carriles:
<bpmn:lane id="lane1" name="Vertrieb">
<bpmn:flowNodeRef>task1</bpmn:flowNodeRef>
<bpmn:flowNodeRef>gateway1</bpmn:flowNodeRef>
</bpmn:lane>
4. Data Objects
Data Objects
Representan información en el proceso:
<bpmn:dataObject id="data1" name="Kundendaten"/>
<bpmn:dataStoreReference id="store1" name="Datenbank"/>
Ejemplo práctico de BPMN
Modelado de proceso de pedidos
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
<bpmn:process id="Bestellprozess" isExecutable="false">
<!-- Start Event -->
<bpmn:startEvent id="StartEvent_1" name="Bestellung eingegangen">
<bpmn:outgoing>Flow_1</bpmn:outgoing>
</bpmn:startEvent>
<!-- Task: Bestellung prüfen -->
<bpmn:userTask id="Task_1" name="Bestellung prüfen">
<bpmn:incoming>Flow_1</bpmn:incoming>
<bpmn:outgoing>Flow_2</bpmn:outgoing>
</bpmn:userTask>
<!-- Gateway: Entscheidung -->
<bpmn:exclusiveGateway id="Gateway_1" name="Bestellung gültig?">
<bpmn:incoming>Flow_2</bpmn:incoming>
<bpmn:outgoing>Flow_3</bpmn:outgoing>
<bpmn:outgoing>Flow_4</bpmn:outgoing>
</bpmn:exclusiveGateway>
<!-- Task: Lager prüfen -->
<bpmn:serviceTask id="Task_2" name="Lagerbestand prüfen">
<bpmn:incoming>Flow_3</bpmn:incoming>
<bpmn:outgoing>Flow_5</bpmn:outgoing>
</bpmn:serviceTask>
<!-- Task: Ablehnung -->
<bpmn:userTask id="Task_3" name="Bestellung ablehnen">
<bpmn:incoming>Flow_4</bpmn:incoming>
<bpmn:outgoing>Flow_6</bpmn:outgoing>
</bpmn:userTask>
<!-- End Events -->
<bpmn:endEvent id="EndEvent_1" name="Bestellung bestätigt">
<bpmn:incoming>Flow_5</bpmn:incoming>
</bpmn:endEvent>
<bpmn:endEvent id="EndEvent_2" name="Bestellung abgelehnt">
<bpmn:incoming>Flow_6</bpmn:incoming>
</bpmn:endEvent>
<!-- Sequence Flows -->
<bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="Task_1"/>
<bpmn:sequenceFlow id="Flow_2" sourceRef="Task_1" targetRef="Gateway_1"/>
<bpmn:sequenceFlow id="Flow_3" name="Ja" sourceRef="Gateway_1" targetRef="Task_2"/>
<bpmn:sequenceFlow id="Flow_4" name="Nein" sourceRef="Gateway_1" targetRef="Task_3"/>
<bpmn:sequenceFlow id="Flow_5" sourceRef="Task_2" targetRef="EndEvent_1"/>
<bpmn:sequenceFlow id="Flow_6" sourceRef="Task_3" targetRef="EndEvent_2"/>
</bpmn:process>
</bpmn:definitions>
Tipos de compuertas BPMN en detalle
Exclusive Gateway (XOR)
Solo se puede seleccionar una ruta de salida:
// Implementación Java de una compuerta exclusiva
public class ExclusiveGateway {
private Map<String, String> conditions;
public String evaluateCondition(Map<String, Object> context) {
for (Map.Entry<String, String> condition : conditions.entrySet()) {
if (evaluateExpression(condition.getKey(), context)) {
return condition.getValue();
}
}
return null; // Default Path
}
private boolean evaluateExpression(String expression, Map<String, Object> context) {
// Implementación de la evaluación de condiciones
return context.containsKey(expression) && (Boolean) context.get(expression);
}
}
Parallel Gateway (AND)
Todas las rutas de salida se activan simultáneamente:
// Implementación Java de una compuerta paralela
public class ParallelGateway {
private List<String> outgoingFlows;
private List<String> incomingFlows;
public List<String> execute() {
if (allIncomingFlowsCompleted()) {
return new ArrayList<>(outgoingFlows);
}
return Collections.emptyList();
}
private boolean allIncomingFlowsCompleted() {
// Verificación de que todos los flujos entrantes se completaron
return true; // Implementación simplificada
}
}
Inclusive Gateway (OR)
Se pueden seleccionar varios caminos de salida:
// Java Implementierung eines Inclusive Gateway
public class InclusiveGateway {
private List<ConditionFlow> conditionFlows;
public List<String> evaluateConditions(Map<String, Object> context) {
List<String> activeFlows = new ArrayList<>();
for (ConditionFlow conditionFlow : conditionFlows) {
if (conditionFlow.evaluate(context)) {
activeFlows.add(conditionFlow.getTargetId());
}
}
return activeFlows;
}
}
Eventos BPMN y tipos de evento
Timer Events
Procesos controlados por tiempo:
<bpmn:intermediateCatchEvent id="timerEvent" name="Wartezeit">
<bpmn:timerEventDefinition>
<bpmn:timeDuration>P2DT3H4M</bpmn:timeDuration> <!-- 2 Tage, 3 Stunden, 4 Minuten -->
</bpmn:timerEventDefinition>
</bpmn:intermediateCatchEvent>
Message Events
Comunicación controlada por mensajes:
<bpmn:intermediateCatchEvent id="messageEvent" name="Nachricht empfangen">
<bpmn:messageEventDefinition messageRef="message1"/>
</bpmn:intermediateCatchEvent>
Error Events
Manejo de errores en procesos:
<bpmn:boundaryEvent id="errorBoundary" attachedToRef="task1">
<bpmn:errorEventDefinition errorRef="error1"/>
</bpmn:boundaryEvent>
Implementar BPMN con Camunda
Deployment del proceso
// Camunda BPMN Prozessdeployment
@Service
public class ProcessDeploymentService {
@Autowired
private RepositoryService repositoryService;
public void deployProcess(String processName, String bpmnFile) {
try (InputStream inputStream = getClass().getResourceAsStream(bpmnFile)) {
Deployment deployment = repositoryService.createDeployment()
.addClassnameResource(processName + ".class")
.addInputStream(processName + ".bpmn", inputStream)
.deploy();
System.out.println("Prozess deployed: " + deployment.getId());
} catch (IOException e) {
throw new RuntimeException("Fehler beim Deployment", e);
}
}
}
Iniciar una instancia del proceso
// Camunda Prozessinstanz starten
@Service
public class ProcessInstanceService {
@Autowired
private RuntimeService runtimeService;
public String startProcess(String processKey, Map<String, Object> variables) {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
processKey,
variables
);
return processInstance.getId();
}
public List<Task> getUserTasks(String processInstanceId) {
return taskService.createTaskQuery()
.processInstanceId(processInstanceId)
.list();
}
}
Task Handler
// Camunda Task Handler
@Component
public class OrderTaskHandler {
@EventListener
public void handleTaskCreated(TaskCreatedEvent event) {
String taskId = event.getTaskId();
String taskName = event.getTaskName();
if ("Bestellung prüfen".equals(taskName)) {
processOrderTask(taskId);
}
}
private void processOrderTask(String taskId) {
// Business Logik für Bestellprüfung
Map<String, Object> variables = new HashMap<>();
variables.put("orderValid", true);
variables.put("orderAmount", 1000.0);
taskService.complete(taskId, variables);
}
}
Mejores prácticas en BPMN
1. Directrices de modelado de procesos
// BPMN Validierungsregeln
public class BPMNValidator {
public ValidationResult validateProcess(Process process) {
ValidationResult result = new ValidationResult();
// Jeder Prozess muss ein Start Event haben
if (!hasStartEvent(process)) {
result.addError("Prozess benötigt mindestens ein Start Event");
}
// Jeder Prozess muss ein End Event haben
if (!hasEndEvent(process)) {
result.addError("Prozess benötigt mindestens ein End Event");
}
// Alle Tasks müssen verbunden sein
if (hasDisconnectedTasks(process)) {
result.addError("Es existieren nicht verbundene Tasks");
}
return result;
}
private boolean hasStartEvent(Process process) {
return process.getFlowElements().stream()
.anyMatch(element -> element instanceof StartEvent);
}
private boolean hasEndEvent(Process process) {
return process.getFlowElements().stream()
.anyMatch(element -> element instanceof EndEvent);
}
}
2. Convenciones de nombres
<!-- Gute Namenskonventionen -->
<bpmn:userTask id="checkOrderTask" name="Bestellung prüfen"/>
<bpmn:exclusiveGateway id="isValidGateway" name="Bestellung gültig?"/>
<bpmn:serviceTask id="sendEmailTask" name="Bestätigung senden"/>
<!-- Schlechte Namenskonventionen -->
<bpmn:userTask id="task1" name="Task 1"/>
<bpmn:exclusiveGateway id="gw1" name="Gateway"/>
3. Optimización de procesos
// Prozessperformance Analyse
@Service
public class ProcessAnalyticsService {
@Autowired
private HistoryService historyService;
public ProcessMetrics analyzeProcess(String processDefinitionKey) {
List<HistoricProcessInstance> instances = historyService
.createHistoricProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.finished()
.list();
ProcessMetrics metrics = new ProcessMetrics();
metrics.setTotalInstances(instances.size());
metrics.setAverageDuration(calculateAverageDuration(instances));
metrics.setSuccessRate(calculateSuccessRate(instances));
return metrics;
}
private Duration calculateAverageDuration(List<HistoricProcessInstance> instances) {
return instances.stream()
.map(instance -> Duration.between(
instance.getStartTime(),
instance.getEndTime()
))
.reduce(Duration.ZERO, Duration::plus)
.dividedBy(instances.size());
}
}
Herramientas y frameworks BPMN
1. Camunda Modeler
// Camunda Modeler Plugin Beispiel
const customPlugin = {
id: 'custom-validation-plugin',
init: function(modeler) {
// Custom Validation Rule
modeler.get('validationRules').add('task-name-required', function(element) {
if (element.type === 'bpmn:Task' && !element.name) {
return 'Task muss einen Namen haben';
}
});
// Custom Property Panel
modeler.get('propertiesPanel').registerProvider({
getTabs: function(element) {
if (element.type === 'bpmn:UserTask') {
return {
'custom-task-tab': {
label: 'Custom Task Properties',
entries: [
{
id: 'task-priority',
label: 'Priority',
component: 'textfield',
bindTo: 'customPriority'
}
]
}
};
}
}
});
}
};
2. Integración con BPMN.js
// BPMN.js Viewer Integration
import BpmnViewer from 'bpmn-js/lib/Viewer';
class BPMNViewer {
constructor(container) {
this.viewer = new BpmnViewer({
container: container,
width: '100%',
height: '500px'
});
}
async loadDiagram(xml) {
try {
await this.viewer.importXML(xml);
// Zoom to fit
const canvas = this.viewer.get('canvas');
canvas.zoom('fit-viewport');
} catch (err) {
console.error('Error loading BPMN diagram:', err);
}
}
addClickListener(callback) {
this.viewer.on('element.click', function(event) {
const element = event.element;
callback(element);
});
}
}
// Uso
const viewer = new BPMNViewer('#bpmn-container');
viewer.loadDiagram(bpmnXml);
viewer.addClickListener((element) => {
console.log('Clicked element:', element.id, element.name);
});
BPMN en la práctica
Proceso de pedido en e-commerce
<!-- Proceso de pedido complejo con múltiples participantes -->
<bpmn:definitions>
<!-- Pool: Cliente -->
<bpmn:pool id="customerPool" name="Cliente">
<bpmn:lane id="customerLane" name="Cliente">
<bpmn:userTask id="placeOrder" name="Realizar pedido"/>
<bpmn:userTask id="makePayment" name="Realizar pago"/>
</bpmn:lane>
</bpmn:pool>
<!-- Pool: Sistema de tienda -->
<bpmn:pool id="shopPool" name="Sistema de tienda">
<bpmn:lane id="orderLane" name="Procesamiento de pedidos">
<bpmn:serviceTask id="validateOrder" name="Validar pedido"/>
<bpmn:serviceTask id="checkInventory" name="Verificar inventario"/>
<bpmn:userTask id="processPayment" name="Procesar pago"/>
</bpmn:lane>
<bpmn:lane id="warehouseLane" name="Almacén">
<bpmn:userTask id="pickItems" name="Preparar artículos"/>
<bpmn:userTask id="packageItems" name="Empacar"/>
</bpmn:lane>
</bpmn:pool>
<!-- Pool: Servicio de entrega -->
<bpmn:pool id="deliveryPool" name="Servicio de entrega">
<bpmn:lane id="deliveryLane" name="Entrega">
<bpmn:serviceTask id="scheduleDelivery" name="Programar entrega"/>
<bpmn:userTask id="deliverPackage" name="Entregar paquete"/>
</bpmn:lane>
</bpmn:pool>
<!-- Message Flows entre pools -->
<bpmn:messageFlow id="orderMessage" sourceRef="placeOrder" targetRef="validateOrder"/>
<bpmn:messageFlow id="paymentMessage" sourceRef="makePayment" targetRef="processPayment"/>
<bpmn:messageFlow id="deliveryMessage" sourceRef="packageItems" targetRef="scheduleDelivery"/>
</bpmn:definitions>
Proceso de aprobación
// Proceso de aprobación con escalado
@Service
public class ApprovalProcessService {
public String startApprovalProcess(ApprovalRequest request) {
Map<String, Object> variables = new HashMap<>();
variables.put("requestId", request.getId());
variables.put("amount", request.getAmount());
variables.put("requester", request.getRequester());
variables.put("approvalLevel", determineApprovalLevel(request.getAmount()));
return runtimeService.startProcessInstanceByKey(
"approval-process",
variables
).getId();
}
private String determineApprovalLevel(Double amount) {
if (amount < 1000) return "manager";
if (amount < 10000) return "director";
return "executive";
}
@EventListener
public void handleEscalation(TaskEscalationEvent event) {
String taskId = event.getTaskId();
String escalationLevel = event.getEscalationLevel();
// Pasar la escalación al nivel superior
Map<String, Object> escalationVariables = new HashMap<>();
escalationVariables.put("escalatedFrom", taskId);
escalationVariables.put("escalationReason", event.getReason());
taskService.delegateTask(taskId, escalateLevel + "_approval");
}
}
Preparación para exámenes de BPMN
Temas importantes del examen
- Elementos básicos de BPMN: Events, Activities, Gateways
- Flow Objects: Diferentes tipos y sus aplicaciones
- Connecting Objects: Sequence Flows, Message Flows, Associations
- Pools y Lanes: Organización de procesos y responsabilidades
- Tipos de Gateway: Exclusive, Parallel, Inclusive, Complex
- Tipos de Event: Start, End, Intermediate Events
- Sub-Processes: Embedded y Call Activities
- Data Objects: Representación de información
Tareas típicas del examen
- Análisis de procesos: Interpretar diagramas BPMN dados
- Modelado de procesos: Representar procesos empresariales en BPMN
- Aplicación de Gateway: Seleccionar correctamente los tipos de Gateway
- Manejo de eventos: Modelar procesos dirigidos por eventos
- Optimización de procesos: Identificar ineficiencias en procesos BPMN
Conceptos relevantes para el examen
// Conceptos BPMN relevantes para el examen
public class BPMNExamConcepts {
// 1. Rutas de proceso y lógica de Gateway
public void demonstrateGatewayLogic() {
// Exclusive Gateway: Solo una ruta
// Parallel Gateway: Todas las rutas simultáneamente
// Inclusive Gateway: Múltiples rutas posibles
}
// 2. Control de proceso basado en eventos
public void demonstrateEventHandling() {
// Start Events inician procesos
// Intermediate Events controlan el flujo
// End Events terminan procesos
}
// 3. Flujo de datos en BPMN
public void demonstrateDataFlow() {
// Data Objects representan información
// Data Stores para datos persistentes
// Associations vinculan datos con Activities
}
}
Resumen
BPMN es una herramienta estándar potente para el modelado de procesos que:
- Estandarización permite una representación uniforme de procesos
- Visualización hace que los procesos empresariales complejos sean comprensibles
- Automatización facilita la implementación directa en sistemas de flujo de trabajo
- Colaboración promueve el desarrollo conjunto de procesos
- Optimización permite mejoras sistemáticas de procesos
El dominio de BPMN es esencial para profesionales de TI y analistas empresariales para modelar, analizar y automatizar eficazmente los procesos empresariales modernos.
Recursos adicionales:

