diff --git a/create_lifecycle_issues.sh b/create_lifecycle_issues.sh
new file mode 100644
index 0000000..d9f4592
--- /dev/null
+++ b/create_lifecycle_issues.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+# Script para crear issues específicos sobre el ciclo de vida y automatización de muestras.
+
+# Issue 8: Implementar Ciclo de Vida para Muestras de Laboratorio
+tea issue create --title "feat: Implementar Ciclo de Vida para Muestras de Laboratorio" --labels "feature,enhancement" --description "$(cat <<'EOT'
+**Objetivo:** Implementar una máquina de estados para el modelo de muestra (`stock.lot`) que permita seguir su ciclo de vida desde la recolección hasta el descarte.
+
+**Tareas:**
+
+1. **Modelo (`stock.lot`):**
+ * Añadir un campo `state` de tipo `Selection` con los siguientes estados:
+ - `collected` (Recolectada)
+ - `received` (Recibida en Laboratorio)
+ - `in_process` (En Proceso)
+ - `analyzed` (Analizada)
+ - `stored` (Almacenada)
+ - `disposed` (Desechada)
+ * Definir métodos para las transiciones de estado (ej. `action_receive`, `action_start_analysis`, etc.).
+
+2. **Vistas (`stock_lot_views.xml`):**
+ * Añadir un `statusbar` en la vista de formulario para visualizar y gestionar el estado.
+ * Incorporar botones en el `header` para ejecutar las acciones de cambio de estado.
+ * Mostrar el campo `state` en la vista de lista y añadirlo a los filtros.
+ * Aplicar `readonly` a campos clave en función del estado para prevenir modificaciones no deseadas.
+EOT
+)"
+
+# Issue 9: Automatizar Creación de Muestras desde la Solicitud de Laboratorio
+tea issue create --title "feat: Automatizar Creación de Muestras desde la Solicitud" --labels "feature,automation" --description "$(cat <<'EOT'
+**Objetivo:** Automatizar la generación de registros de muestra (`stock.lot`) cuando una Solicitud de Laboratorio (`sale.order`) es confirmada.
+
+**Tareas:**
+
+1. **Lógica de Negocio (`sale_order.py`):**
+ * Heredar y extender el método `action_confirm` del modelo `sale.order`.
+ * Dentro del método, añadir la lógica para crear un nuevo registro en `stock.lot` por cada tipo de muestra requerido en la solicitud.
+ * Asociar la muestra creada con la solicitud (`request_id`) y el paciente (`patient_id`) correspondientes.
+ * Asegurarse de que la muestra se cree en el estado inicial correcto (ej. 'Recolectada' o 'Pendiente de Recolección').
+EOT
+)"
+
+echo "Script 'create_lifecycle_issues.sh' generado. Ejecútalo para crear los nuevos issues."
\ No newline at end of file
diff --git a/documents/plans/ISSUE31_PLAN.md b/documents/plans/ISSUE31_PLAN.md
new file mode 100644
index 0000000..85965e5
--- /dev/null
+++ b/documents/plans/ISSUE31_PLAN.md
@@ -0,0 +1,70 @@
+# Plan de Actividades: Issue #31 - Ciclo de Vida de la Muestra
+
+## Objetivo
+
+Implementar una máquina de estados completa para el modelo `stock.lot` con el fin de gestionar y trazar el ciclo de vida de una muestra de laboratorio, desde su recolección hasta su descarte.
+
+---
+
+## Plan de Ejecución
+
+### 1. Modificación del Modelo (`stock.lot`)
+
+- **Archivo:** `lims_management/models/stock_lot.py`
+- **Tareas:**
+ - [ ] **Añadir campo `state`:**
+ - Tipo: `Selection`
+ - Nombre técnico: `state`
+ - String: "Estado"
+ - Opciones:
+ - `collected`: 'Recolectada' (Estado por defecto)
+ - `received`: 'Recibida en Laboratorio'
+ - `in_process`: 'En Proceso'
+ - `analyzed`: 'Analizada'
+ - `stored`: 'Almacenada'
+ - `disposed`: 'Desechada'
+ - Atributos: `tracking=True` para registrar cambios en el chatter.
+ - [ ] **Definir métodos para transiciones:**
+ - `action_receive()`: Cambia el estado a `received`.
+ - `action_start_analysis()`: Cambia el estado a `in_process`.
+ - `action_complete_analysis()`: Cambia el estado a `analyzed`.
+ - `action_store()`: Cambia el estado a `stored`.
+ - `action_dispose()`: Cambia el estado a `disposed`.
+ - Cada método debe realizar una transición de estado simple y registrar un mensaje en el chatter.
+
+### 2. Adaptación de las Vistas (`stock_lot_views.xml`)
+
+- **Archivo:** `lims_management/views/stock_lot_views.xml`
+- **Tareas:**
+ - [ ] **Vista de Formulario:**
+ - [ ] **Añadir `header`:**
+ - Incorporar botones para las acciones (`action_receive`, `action_start_analysis`, etc.).
+ - Controlar la visibilidad de los botones según el estado actual (ej. el botón "Recibir" solo debe ser visible si el estado es 'Recolectada').
+ - [ ] **Añadir `statusbar`:**
+ - Visualizar el campo `state` usando el widget `statusbar`.
+ - Definir el `statusbar_visible` para mostrar los estados clave del flujo principal.
+ - [ ] **Hacer campos `readonly`:**
+ - Campos como `patient_id`, `request_id`, `collection_date` deben volverse de solo lectura después de que la muestra es recibida para asegurar la integridad de los datos. Se usará el atributo `attrs` con el nuevo formato `invisible` o `readonly` basado en el campo `state`.
+ - [ ] **Vista de Lista:**
+ - [ ] Añadir el campo `state` para que sea visible.
+ - [ ] Añadir el campo `state` a los filtros por defecto en el `search` para poder agrupar por estado fácilmente.
+
+### 3. Seguridad (Opcional, si es necesario)
+
+- **Archivo:** `lims_management/security/lims_security.xml` o `ir.model.access.csv`
+- **Tareas:**
+ - [ ] Evaluar si se necesitan reglas de seguridad específicas para controlar quién puede ejecutar las transiciones de estado. Por ahora, se asumirá que los grupos existentes (`group_lims_technician`, `group_lims_admin`) tienen los permisos.
+
+### 4. Verificación y Pruebas
+
+- **Pasos:**
+ - [ ] Reiniciar la instancia de Odoo con el módulo actualizado.
+ - [ ] Crear una nueva muestra de laboratorio manualmente.
+ - [ ] Verificar que el estado por defecto sea 'Recolectada'.
+ - [ ] Probar cada uno de los botones de transición de estado en la vista de formulario.
+ - [ ] Confirmar que el `statusbar` se actualiza correctamente.
+ - [ ] Revisar el chatter para asegurarse de que los cambios de estado se están registrando.
+ - [ ] Verificar la visibilidad condicional de los botones y el modo de solo lectura de los campos.
+ - [ ] Filtrar y agrupar por estado en la vista de lista.
+
+---
diff --git a/lims_management/models/stock_lot.py b/lims_management/models/stock_lot.py
index 1c37cfc..5bbc29d 100644
--- a/lims_management/models/stock_lot.py
+++ b/lims_management/models/stock_lot.py
@@ -33,3 +33,27 @@ class StockLot(models.Model):
string='Collected by',
default=lambda self: self.env.user
)
+
+ state = fields.Selection([
+ ('collected', 'Recolectada'),
+ ('received', 'Recibida en Laboratorio'),
+ ('in_process', 'En Proceso'),
+ ('analyzed', 'Analizada'),
+ ('stored', 'Almacenada'),
+ ('disposed', 'Desechada')
+ ], string='Estado', default='collected', tracking=True)
+
+ def action_receive(self):
+ self.write({'state': 'received'})
+
+ def action_start_analysis(self):
+ self.write({'state': 'in_process'})
+
+ def action_complete_analysis(self):
+ self.write({'state': 'analyzed'})
+
+ def action_store(self):
+ self.write({'state': 'stored'})
+
+ def action_dispose(self):
+ self.write({'state': 'disposed'})
diff --git a/lims_management/views/stock_lot_views.xml b/lims_management/views/stock_lot_views.xml
index 9c5587a..c5c0c78 100644
--- a/lims_management/views/stock_lot_views.xml
+++ b/lims_management/views/stock_lot_views.xml
@@ -14,6 +14,7 @@
+
@@ -24,6 +25,14 @@
stock.lot