diff --git a/diagrams/pdf/D-CLA-CON-GEN-001 — Modelo de Dominio (Conceptual).pdf b/diagrams/pdf/D-CLA-CON-GEN-001 — Modelo de Dominio (Conceptual).pdf
new file mode 100644
index 0000000..7f5f745
Binary files /dev/null and b/diagrams/pdf/D-CLA-CON-GEN-001 — Modelo de Dominio (Conceptual).pdf differ
diff --git a/diagrams/pdf/D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad.pdf b/diagrams/pdf/D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad.pdf
new file mode 100644
index 0000000..8b1858b
Binary files /dev/null and b/diagrams/pdf/D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad.pdf differ
diff --git a/diagrams/pdf/D-CU-GEN-001 — Diagrama General de Casos de Uso.pdf b/diagrams/pdf/D-CU-GEN-001 — Diagrama General de Casos de Uso.pdf
new file mode 100644
index 0000000..73c3242
Binary files /dev/null and b/diagrams/pdf/D-CU-GEN-001 — Diagrama General de Casos de Uso.pdf differ
diff --git a/diagrams/pdf/D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos.pdf b/diagrams/pdf/D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos.pdf
new file mode 100644
index 0000000..14e659f
Binary files /dev/null and b/diagrams/pdf/D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos.pdf differ
diff --git a/diagrams/pdf/D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura.pdf b/diagrams/pdf/D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura.pdf
new file mode 100644
index 0000000..ac5ce08
Binary files /dev/null and b/diagrams/pdf/D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura.pdf differ
diff --git a/diagrams/pdf/D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto.pdf b/diagrams/pdf/D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto.pdf
new file mode 100644
index 0000000..d7fed9c
Binary files /dev/null and b/diagrams/pdf/D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto.pdf differ
diff --git a/diagrams/pdf/D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido.pdf b/diagrams/pdf/D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido.pdf
new file mode 100644
index 0000000..61c33b7
Binary files /dev/null and b/diagrams/pdf/D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido.pdf differ
diff --git a/diagrams/pdf/D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos.pdf b/diagrams/pdf/D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos.pdf
new file mode 100644
index 0000000..4f86e45
Binary files /dev/null and b/diagrams/pdf/D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos.pdf differ
diff --git a/diagrams/pdf/D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura.pdf b/diagrams/pdf/D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura.pdf
new file mode 100644
index 0000000..7027953
Binary files /dev/null and b/diagrams/pdf/D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura.pdf differ
diff --git a/diagrams/pdf/D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto.pdf b/diagrams/pdf/D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto.pdf
new file mode 100644
index 0000000..1be60b9
Binary files /dev/null and b/diagrams/pdf/D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto.pdf differ
diff --git a/diagrams/pdf/D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido.pdf b/diagrams/pdf/D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido.pdf
new file mode 100644
index 0000000..9c19315
Binary files /dev/null and b/diagrams/pdf/D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido.pdf differ
diff --git a/diagrams/plantuml/d_cla_int_001_integracion_ven_stock_cont.puml b/diagrams/plantuml/d_cla_int_001_integracion_ven_stock_cont.puml
index 032c468..0475514 100644
--- a/diagrams/plantuml/d_cla_int_001_integracion_ven_stock_cont.puml
+++ b/diagrams/plantuml/d_cla_int_001_integracion_ven_stock_cont.puml
@@ -1,4 +1,4 @@
-@startuml D-CLA-INT-001 — Diagrama de Clases: Integración Venta/Stock/Contabilidad
+@startuml D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad
title SAP-TFI-2026 — Diagrama de Clases Técnicas (Integración Venta/Stock/Contabilidad)
diff --git a/diagrams/plantuml/d_rob_ent_002_reservar_productos.puml b/diagrams/plantuml/d_rob_ent_002_reservar_productos.puml
new file mode 100644
index 0000000..6661a23
--- /dev/null
+++ b/diagrams/plantuml/d_rob_ent_002_reservar_productos.puml
@@ -0,0 +1,58 @@
+@startuml D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos
+
+title SAP-TFI-2026 — Diagrama de Robustez - Reservar Productos (CU-ENT-002)
+
+skinparam shadowing false
+skinparam handwritten false
+skinparam defaultFontName Arial
+skinparam defaultFontSize 12
+skinparam linetype ortho
+skinparam backgroundColor white
+
+actor "Sistema\n(o Operario)" as A
+
+boundary "Trigger\n(action_confirm o boton)" as B_Trig
+
+control "StockPicking\n(action_assign)" as C_Assign
+control "Reabastecimiento\n(procurement)" as C_Proc
+
+entity "stock.picking" as E_Pick
+entity "stock.move.line\n(reservas)" as E_ML
+entity "stock.warehouse.orderpoint" as E_WO
+entity "purchase.order\n(MTO)" as E_PO
+
+A --> B_Trig : 1. Trigger reserva
+B_Trig --> E_Pick : 2. Lee picking
+B_Trig --> C_Assign : 3. action_assign()
+
+C_Assign --> E_Pick : 4. Recorre lineas
+C_Assign --> E_ML : 5. Busca stock disponible
+E_ML --> C_Assign : 6. Cantidad disponible
+
+alt Si hay stock
+ C_Assign --> E_ML : 7a. Reserva cantidad
+ E_ML --> C_Assign : 8a. reserved_availability
+else Si no hay stock
+ C_Assign --> C_Proc : 7b. Busca reabastecimiento
+ C_Proc --> E_WO : 8b. Consulta reglas
+ E_WO --> C_Proc : 9b. orderpoints aplicables
+ C_Proc --> E_PO : 10b. Crea purchase order (MTO)
+ E_PO --> C_Proc : 11b. PO creado
+ C_Proc --> C_Assign : 12b. Programado
+end
+
+C_Assign --> E_Pick : 13. Actualiza estado
+alt Si todas las lineas tienen reserva
+ E_Pick --> A : 14a. Estado = 'assigned'
+else Si hay parcial
+ E_Pick --> A : 14b. Estado = 'partially_available'
+end
+
+legend right
+Proyecto: SAP-TFI-2026
+Agente: saptfi2026
+Metodologia: ICONIX
+Fuente: Ingenieria inversa de Odoo 19.0
+endlegend
+
+@enduml
\ No newline at end of file
diff --git a/diagrams/plantuml/d_rob_fac_001_crear_factura.puml b/diagrams/plantuml/d_rob_fac_001_crear_factura.puml
new file mode 100644
index 0000000..04ada92
--- /dev/null
+++ b/diagrams/plantuml/d_rob_fac_001_crear_factura.puml
@@ -0,0 +1,57 @@
+@startuml D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura
+
+title SAP-TFI-2026 — Diagrama de Robustez - Crear Factura desde Pedido (CU-FAC-001)
+
+skinparam shadowing false
+skinparam handwritten false
+skinparam defaultFontName Arial
+skinparam defaultFontSize 12
+skinparam linetype ortho
+skinparam backgroundColor white
+
+actor "Facturador\n(o Vendedor)" as A
+
+boundary "Boton Crear Factura\n(en sale.order)" as B_Btn
+
+control "SaleOrder\n(_create_invoices)" as C_Inv
+
+entity "sale.order\n(state=sale)" as E_SO
+entity "sale.order.line" as E_Line
+entity "account.move\n(draft)" as E_AM
+entity "account.move.line" as E_AML
+entity "account.tax" as E_Tax
+
+A --> B_Btn : 1. Click "Crear Factura"
+B_Btn --> C_Inv : 2. _create_invoices()
+C_Inv --> E_SO : 3. Lee pedido
+E_SO --> C_Inv : 4. order, lines, taxes
+
+C_Inv --> E_SO : 5. Verifica invoice_status
+alt Si hay lineas a facturar
+ C_Inv --> E_Line : 6a. Lee lineas pendientes
+ C_Inv --> E_Tax : 7a. Aplica impuestos
+
+ loop Por cada linea
+ C_Inv --> E_AML : 8a. Crea account.move.line
+ E_AML --> C_Inv : 9a. OK
+ end
+
+ C_Inv --> E_AM : 10a. Crea account.move (draft)
+ E_AM --> C_Inv : 11a. id, name (sequence)
+
+ C_Inv --> E_SO : 12a. Asocia invoice_ids
+ C_Inv --> E_SO : 13a. Actualiza invoice_status
+else Si nada que facturar
+ C_Inv --> A : 6b. Mensaje "Nothing to invoice"
+end
+
+C_Inv --> A : 14. Resultado (OK o error)
+
+legend right
+Proyecto: SAP-TFI-2026
+Agente: saptfi2026
+Metodologia: ICONIX
+Fuente: Ingenieria inversa de Odoo 19.0
+endlegend
+
+@enduml
\ No newline at end of file
diff --git a/diagrams/plantuml/d_rob_ven_001_crear_presupuesto.puml b/diagrams/plantuml/d_rob_ven_001_crear_presupuesto.puml
new file mode 100644
index 0000000..6d6202d
--- /dev/null
+++ b/diagrams/plantuml/d_rob_ven_001_crear_presupuesto.puml
@@ -0,0 +1,48 @@
+@startuml D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto
+
+title SAP-TFI-2026 — Diagrama de Robustez - Crear Presupuesto (CU-VEN-001)
+
+skinparam shadowing false
+skinparam handwritten false
+skinparam defaultFontName Arial
+skinparam defaultFontSize 12
+skinparam linetype ortho
+skinparam backgroundColor white
+
+actor "Vendedor" as V
+
+boundary "Boton Nuevo\n(sale.menu)" as B_New
+boundary "Form\n(view_sale_order_form)" as B_Form
+
+control "SaleOrder\n(action_quotation_send)" as C_Send
+control "Mail Compose\n(mail.compose.message)" as C_Mail
+
+entity "sale.order\n(draft)" as E_SO
+entity "mail.mail" as E_Mail
+
+V --> B_New : 1. Click "Nuevo"
+B_New --> E_SO : 2. Crea sale.order en draft
+E_SO --> B_Form : 3. Abre form
+B_Form --> V : 4. Muestra form
+
+V --> B_Form : 5. Completa cliente y lineas
+B_Form --> E_SO : 6. Actualiza partner_id y order_line
+E_SO --> B_Form : 7. Calcula totales (_compute_amounts)
+
+opt Si envia por email
+ V --> B_Form : 8. Click "Enviar"
+ B_Form --> C_Send : 9. action_quotation_send()
+ C_Send --> E_SO : 10. Cambia estado a 'sent'
+ C_Send --> C_Mail : 11. Crea mail.compose.message
+ C_Mail --> E_Mail : 12. Genera mail.mail
+ E_Mail --> V : 13. Envia email
+end
+
+legend right
+Proyecto: SAP-TFI-2026
+Agente: saptfi2026
+Metodologia: ICONIX
+Fuente: Ingenieria inversa de Odoo 19.0
+endlegend
+
+@enduml
\ No newline at end of file
diff --git a/diagrams/plantuml/d_rob_ven_004_confirmar_pedido.puml b/diagrams/plantuml/d_rob_ven_004_confirmar_pedido.puml
index 6d33811..b954d16 100644
--- a/diagrams/plantuml/d_rob_ven_004_confirmar_pedido.puml
+++ b/diagrams/plantuml/d_rob_ven_004_confirmar_pedido.puml
@@ -1,6 +1,6 @@
@startuml D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido
-title SAP-TFI-2026 — Diagrama de Robustez: Confirmar Pedido de Venta (CU-VEN-004)
+title SAP-TFI-2026 — Diagrama de Robustez - Confirmar Pedido de Venta (CU-VEN-004)
skinparam shadowing false
skinparam handwritten false
diff --git a/diagrams/plantuml/d_sec_ent_002_reservar_productos.puml b/diagrams/plantuml/d_sec_ent_002_reservar_productos.puml
new file mode 100644
index 0000000..b9fc4be
--- /dev/null
+++ b/diagrams/plantuml/d_sec_ent_002_reservar_productos.puml
@@ -0,0 +1,71 @@
+@startuml D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos
+
+title SAP-TFI-2026 — Diagrama de Secuencia - Reservar Productos (CU-ENT-002)
+
+skinparam shadowing false
+skinparam handwritten false
+skinparam defaultFontName Arial
+skinparam defaultFontSize 12
+skinparam linetype ortho
+skinparam backgroundColor white
+
+actor "Sistema" as S
+participant "StockPicking\n(action_assign)" as SP
+participant "StockMove\n(action_assign)" as SM
+participant "Procurement\nOrder" as PO
+database "PostgreSQL" as DB
+
+S -> SP : 1. action_assign()
+activate SP
+
+SP -> DB : 2. SELECT picking + lines
+DB --> SP : 3. picking, move_ids
+
+loop Por cada move
+ SP -> SM : 4. action_assign() por linea
+ activate SM
+
+ SM -> DB : 5. SELECT stock.quant (available)
+ DB --> SM : 6. cantidad disponible
+
+ alt Cantidad >= requerida
+ SM -> DB : 7a. INSERT stock.move.line (reserved)
+ DB --> SM : 8a. OK
+ SM --> SP : 9a. Reserva exitosa
+ else Cantidad < requerida
+ SM -> DB : 7b. SELECT orderpoint WHERE product_id=...
+ DB --> SM : 8b. orderpoints aplicables
+
+ opt Si hay orderpoint MTO
+ SM -> PO : 9b. procurement.order.create()
+ activate PO
+ PO -> DB : 10b. INSERT procurement.order
+ PO -> DB : 11b. INSERT purchase.order (MTO)
+ DB --> PO : 12b. OK
+ PO --> SM : 13b. PO programado
+ deactivate PO
+ end
+
+ SM --> SP : 14b. Reserva parcial o programada
+ end
+ deactivate SM
+end
+
+SP -> DB : 15. UPDATE stock.picking SET state=...
+DB --> SP : 16. OK
+
+alt Si todas las lineas reservadas
+ SP --> S : 17a. Estado = 'assigned'
+else Si hay parcial
+ SP --> S : 17b. Estado = 'partially_available'
+end
+deactivate SP
+
+legend right
+Proyecto: SAP-TFI-2026
+Agente: saptfi2026
+Metodologia: ICONIX
+Fuente: Ingenieria inversa de Odoo 19.0
+endlegend
+
+@enduml
\ No newline at end of file
diff --git a/diagrams/plantuml/d_sec_fac_001_crear_factura.puml b/diagrams/plantuml/d_sec_fac_001_crear_factura.puml
new file mode 100644
index 0000000..7d1b2a5
--- /dev/null
+++ b/diagrams/plantuml/d_sec_fac_001_crear_factura.puml
@@ -0,0 +1,61 @@
+@startuml D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura
+
+title SAP-TFI-2026 — Diagrama de Secuencia - Crear Factura desde Pedido (CU-FAC-001)
+
+skinparam shadowing false
+skinparam handwritten false
+skinparam defaultFontName Arial
+skinparam defaultFontSize 12
+skinparam linetype ortho
+skinparam backgroundColor white
+
+actor "Facturador" as F
+participant "Boton" as Btn
+participant "SaleOrder\n(_create_invoices)" as SO
+participant "AccountMove" as AM
+database "PostgreSQL" as DB
+
+F -> Btn : 1. Click "Crear Factura"
+Btn -> SO : 2. _create_invoices()
+activate SO
+
+SO -> DB : 3. SELECT sale.order (state='sale')
+DB --> SO : 4. order
+
+SO -> SO : 5. Verifica invoice_status
+
+alt Hay lineas a facturar
+ SO -> DB : 6a. SELECT sale.order.line (qty to invoice)
+ DB --> SO : 7a. lines
+
+ SO -> SO : 8a. _prepare_invoice() construye vals
+ activate AM
+
+ AM -> DB : 9a. INSERT account.move (move_type='out_invoice', state='draft')
+ DB --> AM : 10a. id
+
+ loop Por cada linea
+ AM -> DB : 11a. INSERT account.move.line
+ DB --> AM : 12a. id
+ end
+
+ AM -> DB : 13a. UPDATE sale.order SET invoice_ids=...
+ AM -> DB : 14a. UPDATE sale.order SET invoice_status=...
+ deactivate AM
+
+ SO --> Btn : 15a. Factura creada
+ Btn --> F : 16a. Mostrar factura
+else Nada a facturar
+ SO --> Btn : 6b. raise UserError("Nothing to invoice")
+ Btn --> F : 7b. Mostrar error
+end
+deactivate SO
+
+legend right
+Proyecto: SAP-TFI-2026
+Agente: saptfi2026
+Metodologia: ICONIX
+Fuente: Ingenieria inversa de Odoo 19.0
+endlegend
+
+@enduml
\ No newline at end of file
diff --git a/diagrams/plantuml/d_sec_ven_001_crear_presupuesto.puml b/diagrams/plantuml/d_sec_ven_001_crear_presupuesto.puml
new file mode 100644
index 0000000..7ce32fd
--- /dev/null
+++ b/diagrams/plantuml/d_sec_ven_001_crear_presupuesto.puml
@@ -0,0 +1,81 @@
+@startuml D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto
+
+title SAP-TFI-2026 — Diagrama de Secuencia - Crear Presupuesto (CU-VEN-001)
+
+skinparam shadowing false
+skinparam handwritten false
+skinparam defaultFontName Arial
+skinparam defaultFontSize 12
+skinparam linetype ortho
+skinparam backgroundColor white
+
+actor "Vendedor" as V
+participant "Form\n(view_sale_order_form)" as Form
+participant "SaleOrder\nORM" as SO
+participant "Mail\nComposer" as Mail
+database "PostgreSQL" as DB
+
+V -> Form : 1. Click "Nuevo"
+activate Form
+Form -> SO : 2. Create({})
+activate SO
+SO -> DB : 3. INSERT sale.order (state='draft')
+DB --> SO : 4. id
+SO --> Form : 5. sale.order record
+deactivate SO
+
+V -> Form : 6. Selecciona partner_id
+Form -> SO : 7. write({partner_id: ...})
+activate SO
+SO -> DB : 8. UPDATE sale.order SET partner_id=...
+DB --> SO : 9. OK
+SO -> SO : 10. _onchange_partner_id() carga pricelist
+SO -> DB : 11. SELECT product.pricelist
+DB --> SO : 12. pricelist
+SO --> Form : 13. pricelist_id actualizado
+deactivate SO
+
+V -> Form : 14. Agrega lineas
+loop Por cada linea
+ Form -> SO : 15. order_line = [(0, 0, {product_id, qty})]
+ SO -> DB : 16. INSERT sale.order.line
+ DB --> SO : 17. id
+end
+
+V -> Form : 18. Sistema recalcula totales
+Form -> SO : 19. _compute_amounts()
+activate SO
+SO -> DB : 20. SELECT tax, discount
+DB --> SO : 21. datos
+SO -> DB : 22. UPDATE amounts
+SO --> Form : 23. amount_untaxed, amount_tax, amount_total
+deactivate SO
+
+opt Si envia por email
+ V -> Form : 24. Click "Enviar"
+ Form -> SO : 25. action_quotation_send()
+ activate SO
+ SO -> SO : 26. _validate_analytic_distribution()
+ SO -> SO : 27. mark_so_as_sent = True
+ SO -> DB : 28. UPDATE state='sent'
+ SO -> Mail : 29. mail.compose.message.create
+ activate Mail
+ Mail -> DB : 30. INSERT mail.mail
+ DB --> Mail : 31. id
+ Mail --> SO : 32. OK
+ deactivate Mail
+ SO --> Form : 33. wizard closed
+ deactivate SO
+end
+
+Form --> V : 34. Estado actualizado
+deactivate Form
+
+legend right
+Proyecto: SAP-TFI-2026
+Agente: saptfi2026
+Metodologia: ICONIX
+Fuente: Ingenieria inversa de Odoo 19.0
+endlegend
+
+@enduml
\ No newline at end of file
diff --git a/diagrams/plantuml/d_sec_ven_004_confirmar_pedido.puml b/diagrams/plantuml/d_sec_ven_004_confirmar_pedido.puml
index 221346e..fb2f925 100644
--- a/diagrams/plantuml/d_sec_ven_004_confirmar_pedido.puml
+++ b/diagrams/plantuml/d_sec_ven_004_confirmar_pedido.puml
@@ -1,6 +1,6 @@
@startuml D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido
-title SAP-TFI-2026 — Diagrama de Secuencia: Confirmar Pedido de Venta (CU-VEN-004)
+title SAP-TFI-2026 — Diagrama de Secuencia - Confirmar Pedido de Venta (CU-VEN-004)
skinparam shadowing false
skinparam handwritten false
diff --git a/diagrams/png/D-CLA-CON-GEN-001 — Modelo de Dominio (Conceptual).png b/diagrams/png/D-CLA-CON-GEN-001 — Modelo de Dominio (Conceptual).png
new file mode 100644
index 0000000..4e116a2
Binary files /dev/null and b/diagrams/png/D-CLA-CON-GEN-001 — Modelo de Dominio (Conceptual).png differ
diff --git a/diagrams/png/D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad.png b/diagrams/png/D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad.png
new file mode 100644
index 0000000..046f8a5
Binary files /dev/null and b/diagrams/png/D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad.png differ
diff --git a/diagrams/png/D-CU-GEN-001 — Diagrama General de Casos de Uso.png b/diagrams/png/D-CU-GEN-001 — Diagrama General de Casos de Uso.png
new file mode 100644
index 0000000..eb1a5ca
Binary files /dev/null and b/diagrams/png/D-CU-GEN-001 — Diagrama General de Casos de Uso.png differ
diff --git a/diagrams/png/D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos.png b/diagrams/png/D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos.png
new file mode 100644
index 0000000..e8392fd
Binary files /dev/null and b/diagrams/png/D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos.png differ
diff --git a/diagrams/png/D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura.png b/diagrams/png/D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura.png
new file mode 100644
index 0000000..30ed45e
Binary files /dev/null and b/diagrams/png/D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura.png differ
diff --git a/diagrams/png/D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto.png b/diagrams/png/D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto.png
new file mode 100644
index 0000000..30f746c
Binary files /dev/null and b/diagrams/png/D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto.png differ
diff --git a/diagrams/png/D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido.png b/diagrams/png/D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido.png
new file mode 100644
index 0000000..df1bfc2
Binary files /dev/null and b/diagrams/png/D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido.png differ
diff --git a/diagrams/png/D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos.png b/diagrams/png/D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos.png
new file mode 100644
index 0000000..ea2fe27
Binary files /dev/null and b/diagrams/png/D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos.png differ
diff --git a/diagrams/png/D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura.png b/diagrams/png/D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura.png
new file mode 100644
index 0000000..6a0e8a0
Binary files /dev/null and b/diagrams/png/D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura.png differ
diff --git a/diagrams/png/D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto.png b/diagrams/png/D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto.png
new file mode 100644
index 0000000..cae6849
Binary files /dev/null and b/diagrams/png/D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto.png differ
diff --git a/diagrams/png/D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido.png b/diagrams/png/D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido.png
new file mode 100644
index 0000000..8f585dc
Binary files /dev/null and b/diagrams/png/D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido.png differ
diff --git a/diagrams/svg/D-CLA-CON-GEN-001 — Modelo de Dominio (Conceptual).svg b/diagrams/svg/D-CLA-CON-GEN-001 — Modelo de Dominio (Conceptual).svg
new file mode 100644
index 0000000..c3e0a6d
--- /dev/null
+++ b/diagrams/svg/D-CLA-CON-GEN-001 — Modelo de Dominio (Conceptual).svg
@@ -0,0 +1,337 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad.svg b/diagrams/svg/D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad.svg
new file mode 100644
index 0000000..06d8b3d
--- /dev/null
+++ b/diagrams/svg/D-CLA-INT-001 — Diagrama de Clases - Integracion Venta-Stock-Contabilidad.svg
@@ -0,0 +1,239 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-CU-GEN-001 — Diagrama General de Casos de Uso.svg b/diagrams/svg/D-CU-GEN-001 — Diagrama General de Casos de Uso.svg
new file mode 100644
index 0000000..44391bc
--- /dev/null
+++ b/diagrams/svg/D-CU-GEN-001 — Diagrama General de Casos de Uso.svg
@@ -0,0 +1,86 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos.svg b/diagrams/svg/D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos.svg
new file mode 100644
index 0000000..c330ae6
--- /dev/null
+++ b/diagrams/svg/D-ROB-ENT-002 — Diagrama de Robustez: Reservar Productos.svg
@@ -0,0 +1,68 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura.svg b/diagrams/svg/D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura.svg
new file mode 100644
index 0000000..d4b0cd2
--- /dev/null
+++ b/diagrams/svg/D-ROB-FAC-001 — Diagrama de Robustez: Crear Factura.svg
@@ -0,0 +1,67 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto.svg b/diagrams/svg/D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto.svg
new file mode 100644
index 0000000..f94495f
--- /dev/null
+++ b/diagrams/svg/D-ROB-VEN-001 — Diagrama de Robustez: Crear Presupuesto.svg
@@ -0,0 +1,58 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido.svg b/diagrams/svg/D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido.svg
new file mode 100644
index 0000000..a923ba2
--- /dev/null
+++ b/diagrams/svg/D-ROB-VEN-004 — Diagrama de Robustez: Confirmar Pedido.svg
@@ -0,0 +1,128 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos.svg b/diagrams/svg/D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos.svg
new file mode 100644
index 0000000..86c8560
--- /dev/null
+++ b/diagrams/svg/D-SEC-ENT-002 — Diagrama de Secuencia: Reservar Productos.svg
@@ -0,0 +1,81 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura.svg b/diagrams/svg/D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura.svg
new file mode 100644
index 0000000..a131eae
--- /dev/null
+++ b/diagrams/svg/D-SEC-FAC-001 — Diagrama de Secuencia: Crear Factura.svg
@@ -0,0 +1,71 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto.svg b/diagrams/svg/D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto.svg
new file mode 100644
index 0000000..1f8226a
--- /dev/null
+++ b/diagrams/svg/D-SEC-VEN-001 — Diagrama de Secuencia: Crear Presupuesto.svg
@@ -0,0 +1,91 @@
+
\ No newline at end of file
diff --git a/diagrams/svg/D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido.svg b/diagrams/svg/D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido.svg
new file mode 100644
index 0000000..300f68b
--- /dev/null
+++ b/diagrams/svg/D-SEC-VEN-004 — Diagrama de Secuencia: Confirmar Pedido.svg
@@ -0,0 +1,90 @@
+
\ No newline at end of file
diff --git a/docs/09_trazabilidad/matriz_trazabilidad.md b/docs/09_trazabilidad/matriz_trazabilidad.md
index a133ae0..bb743ff 100644
--- a/docs/09_trazabilidad/matriz_trazabilidad.md
+++ b/docs/09_trazabilidad/matriz_trazabilidad.md
@@ -87,6 +87,16 @@
| EV-COD-018 | EV-COD | `state` field (account.move) | `addons/account/models/account_move.py:129` |
| EV-COD-019 | EV-COD | `action_register_payment` | `addons/account/models/account_move.py:6022` |
| EV-COD-020 | EV-COD | `payment_state` field | `addons/account/models/account_move.py:600` |
+| EV-COD-021 | EV-COD | `_action_confirm` stub | `addons/sale/models/sale_order.py:1231-1235` |
+| EV-COD-022 | EV-COD | `action_assign` cuerpo | `addons/stock/models/stock_picking.py:1195-1208` |
+| EV-COD-023 | EV-COD | `picking_ids` (sale_stock) | `addons/sale_stock/models/sale_order.py:31` |
+| EV-COD-024 | EV-COD | `PAYMENT_STATE_SELECTION` | `addons/account/models/account_move.py:48-56` |
+| EV-COD-025 | EV-COD | `payment_state` (computed) | `addons/account/models/account_move.py:600-606` |
+| EV-COD-026 | EV-COD | `action_post` cuerpo | `addons/account/models/account_move.py:6101-6122` |
+| EV-COD-027 | EV-COD | `_send_order_confirmation_mail` | `addons/sale/models/sale_order.py:1237-1244` |
+| EV-COD-028 | EV-COD | `_trigger_scheduler()` | `addons/sale/models/sale_order.py:1192` |
+| EV-COD-029 | EV-COD | `action_cancel` (stock) | `addons/stock/models/stock_picking.py:1210-1214` |
+| EV-COD-030 | EV-COD | `_should_be_locked` | `addons/sale/models/sale_order.py:1198-1201` |
## Inferencias pendientes (EV-INF)
diff --git a/docs/10_material_estudio/01_que_es_iconix.md b/docs/10_material_estudio/01_que_es_iconix.md
new file mode 100644
index 0000000..6e573bb
--- /dev/null
+++ b/docs/10_material_estudio/01_que_es_iconix.md
@@ -0,0 +1,137 @@
+# ¿Qué es ICONIX?
+
+## Definición
+
+**ICONIX** es una metodología de ingeniería de software orientada a objetos que se sitúa entre los métodos ágiles (como XP o Scrum) y los métodos pesados (como el Proceso Unificado Rational — RUP). Fue desarrollada por **Doug Rosenberg** y **Kendall Scott** a principios de los 90, y refinada en sucesivas ediciones de su libro *Use Case Driven Object Modeling with UML*.
+
+A diferencia de RUP o del método del Proceso Unificado, ICONIX **no se obsesiona con la documentación exhaustiva**, pero tampoco cae en el "codificar sin diseño" del agilismo extremo. En su lugar, propone un **camino mínimo y práctico** desde los requisitos hasta el código, usando UML como lenguaje común.
+
+## Las 9 fases de ICONIX
+
+A pesar de su nombre, ICONIX tiene 9 fases (no 3). El "IX" del nombre se refiere a "eXtremidad", porque el método es "extremo" en su enfoque minimalista: solo lo esencial, sin ceremonias.
+
+```text
+Requisitos
+ ↓
+Casos de uso (texto + diagrama)
+ ↓
+Modelo de dominio (conceptos del negocio)
+ ↓
+Prototipos de interfaz (bocetos de pantallas)
+ ↓
+Análisis de robustez (¿qué objetos intervienen?)
+ ↓
+Actualización del modelo de dominio
+ ↓
+Diagramas de secuencia (interacciones en el tiempo)
+ ↓
+Diagramas de clases (estructura del sistema)
+ ↓
+Validación de coherencia
+```
+
+Cada fase **alimenta** a la siguiente y mantiene **trazabilidad** con las anteriores. No se salta ninguna.
+
+## El flujo en detalle
+
+### Fase 1: Requisitos
+
+- Identificar **qué** tiene que hacer el sistema.
+- Recopilar requisitos funcionales y no funcionales.
+- Identificar **actores** (humanos y sistemas externos).
+- Producto: documento de requisitos (puede ser informal).
+
+### Fase 2: Casos de uso
+
+- Para cada objetivo del actor, escribir un **caso de uso**.
+- Cada CU tiene: nombre, objetivo, precondiciones, flujo principal, flujos alternativos, excepciones.
+- Producto: tabla de CU + **diagrama de CU** (UML).
+
+### Fase 3: Modelo de dominio
+
+- Identificar **conceptos del negocio**, no de la solución.
+- Conceptos como: Cliente, Producto, Pedido, Factura, Pago.
+- No incluir campos técnicos, solo atributos del dominio.
+- Producto: **diagrama de clases conceptual**.
+
+### Fase 4: Prototipos de interfaz
+
+- Bocetos de las pantallas principales.
+- No incluir detalles visuales, solo estructura.
+- Mostrar campos, botones, navegación.
+- Producto: wireframes o mockups.
+
+### Fase 5: Análisis de robustez
+
+- Para cada CU, identificar **qué objetos intervienen**.
+- Tres tipos de objetos:
+ - **boundary** (vista, formulario, API)
+ - **control** (coordinador, validador)
+ - **entity** (objeto persistente)
+- Producto: **diagrama de robustez** por CU.
+
+### Fase 6: Actualización del dominio
+
+- Refinar el modelo de dominio con conceptos descubiertos en robustez.
+
+### Fase 7: Diagramas de secuencia
+
+- Para cada CU relevante, derivar la **secuencia temporal**.
+- Mostrar interacciones entre actor, vistas, controles, entidades.
+- Incluir transacciones, validaciones, errores.
+- Producto: **diagrama de secuencia** por CU.
+
+### Fase 8: Diagramas de clases
+
+- **Conceptual**: conceptos del dominio (reutiliza el modelo de dominio).
+- **Técnico**: clases reales del sistema, con sus campos y métodos.
+- Producto: **dos diagramas de clases** por subsistema.
+
+### Fase 9: Validación
+
+- Verificar coherencia entre todos los artefactos.
+- Cada CU debe tener su diagrama de robustez, secuencia y clases.
+- Cada regla de negocio debe estar trazada.
+
+## Reglas clave de ICONIX
+
+1. **Trabajar desde los casos de uso hacia el diseño** (no al revés).
+2. **Centrarse en objetivos del actor**, no en funciones del sistema.
+3. **No describir detalles internos del código** en los CU.
+4. **Usar robustez como puente** entre requisitos y diseño.
+5. **Distinguir boundary, control, entity** explícitamente.
+6. **Derivar operaciones de clase desde los mensajes de secuencia**.
+7. **Mantener trazabilidad explícita** entre todos los artefactos.
+8. **Actualizar el modelo de dominio** a medida que se descubre nueva información.
+
+## Por qué ICONIX es ideal para ingeniería inversa
+
+Cuando uno hace **ingeniería inversa** (analizar un sistema existente), ICONIX funciona muy bien porque:
+
+- Los **diagramas de secuencia** que produce coinciden con los métodos reales del código.
+- El **modelo de clases técnico** se construye leyendo el código, no inventando.
+- La **trazabilidad** permite mapear cada artefacto a su evidencia en el código.
+
+En este proyecto (SAP-TFI-2026), usamos ICONIX para **documentar** Odoo 19.0, no para **construirlo**. Cada afirmación tiene un código de evidencia que apunta a la línea exacta del código fuente.
+
+## Diferencias con otros métodos
+
+| Aspecto | ICONIX | RUP | Scrum |
+|---------|--------|-----|-------|
+| Rigurosidad | Media-alta | Muy alta | Baja |
+| Documentación | Moderada | Exhaustiva | Mínima |
+| UML | Sí, en el camino crítico | Sí, en todas las fases | No obligatorio |
+| Casos de uso | Sí, centrales | Sí, conductores | Opcionales |
+| Iterativo | Opcional | Sí | Sí |
+| Tamaño del equipo | 1-5 personas | 5-30 personas | 3-9 personas |
+| Tiempo por iteración | Semanas | Meses | Semanas |
+
+## Recursos externos
+
+- Libro original: *Use Case Driven Object Modeling with UML* (Rosenberg & Scott).
+- Sitio oficial: http://www.iconixprocess.com/
+- Resumen en español: https://es.wikipedia.org/wiki/ICONIX
+
+## Próxima sección
+
+→ [Aplicación a Odoo](02_aplicacion_a_odoo.md) — cómo se adaptó ICONIX específicamente para este proyecto.
\ No newline at end of file
diff --git a/docs/10_material_estudio/02_aplicacion_a_odoo.md b/docs/10_material_estudio/02_aplicacion_a_odoo.md
new file mode 100644
index 0000000..a5dfd84
--- /dev/null
+++ b/docs/10_material_estudio/02_aplicacion_a_odoo.md
@@ -0,0 +1,115 @@
+# Aplicación de ICONIX a Odoo
+
+## Contexto específico
+
+Este proyecto documenta la **ingeniería inversa** de los módulos nativos de Odoo 19.0 (Ventas, Facturación, Entregas, Inventario). Odoo es un ERP open-source complejo, con +30,000 archivos Python y más de 100 modelos en estos 4 módulos solamente.
+
+Aplicar ICONIX directamente sobre Odoo presenta desafíos únicos:
+
+1. **Herencia múltiple**: los modelos heredan de muchos mixins (`mail.thread`, `mail.activity.mixin`, `portal.mixin`, etc.). El "modelo de clases técnico" debe reflejar esto.
+2. **Campos computados**: muchos campos no están en la BD, se calculan dinámicamente (`_compute_*`).
+3. **Métodos `onchange`**: disparan lógica al cambiar un campo en el form.
+4. **Acciones (`ir.actions.act_window`)**: definen vistas, wizards, botones.
+5. **Multi-empresa y multi-moneda**: las reglas de registro y campos monetarios son contextuales.
+6. **Estado del modelo de dominio vs modelo técnico**:,我们必须separar los conceptos del negocio (Cliente, Producto, Pedido) de las clases técnicas (`res.partner`, `product.product`, `sale.order`).
+
+## Adaptaciones realizadas
+
+### 1. Separación modelo conceptual vs técnico
+
+**Decisión clave**: mantener **dos diagramas de clases separados**.
+
+- **Modelo conceptual** (`d_cla_con_gen_001_modelo_dominio.puml`): solo conceptos del negocio. Cliente, Producto, Presupuesto, Pedido, Factura, Pago. Atributos en lenguaje natural, no campos.
+- **Modelo técnico** (`d_cla_int_001_integracion_ven_stock_cont.puml`): las clases REALES de Odoo con sus `_name`, `_inherit`, campos y métodos. Aquí sí aparecen `res.partner`, `sale.order`, `account.move`, etc.
+
+### 2. Uso de códigos de evidencia EV-*
+
+Cada afirmación tiene un código que apunta a su fuente:
+
+| Código | Significado | Verificable contra |
+|--------|-------------|---------------------|
+| `EV-COD-NNN` | Código fuente | Ruta de archivo + línea exacta |
+| `EV-XML-NNN` | Vista o dato XML | Ruta XML + elemento |
+| `EV-UI-NNN` | Comportamiento observado | Manual o screenshot |
+| `EV-DB-NNN` | Estructura de BD | Tabla y columnas |
+| `EV-DOC-NNN` | Documentación oficial | URL + sección |
+| `EV-TEST-NNN` | Prueba automatizada | Ruta del test |
+| `EV-INF-NNN` | Inferencia pendiente | (no verificado) |
+
+Esto permite que un revisor pueda **verificar** cada afirmación abriendo el código en la línea exacta.
+
+### 3. Foco en el flujo principal
+
+La primera iteración se enfoca en **un solo flujo** end-to-end:
+
+```
+Crear presupuesto → Confirmar pedido → Reservar productos →
+Validar entrega → Crear factura → Publicar factura → Registrar pago
+```
+
+Es el flujo más importante del circuito comercial. Una vez documentado, se pueden agregar CU adicionales (cancelaciones, devoluciones, notas de crédito) en iteraciones siguientes.
+
+### 4. PlantUML como formato estándar
+
+Todos los diagramas están en **PlantUML** (texto plano, versionable). Esto permite:
+
+- Editar los diagramas con cualquier editor.
+- Generar PDFs, PNGs, SVGs automáticamente.
+- Hacer diff de los cambios en git.
+
+La cabecera estándar (en todos los .puml) es:
+
+```plantuml
+@startuml
+title SAP-TFI-2026 —
+
+skinparam shadowing false
+skinparam handwritten false
+skinparam defaultFontName Arial
+skinparam defaultFontSize 12
+skinparam linetype ortho
+skinparam backgroundColor white
+
+legend right
+Proyecto: SAP-TFI-2026
+Agente: saptfi2026
+Metodología: ICONIX
+Fuente: Ingeniería inversa de Odoo
+endlegend
+
+@enduml
+```
+
+### 5. Reglas de naming
+
+| Tipo | Patrón | Ejemplo |
+|------|--------|---------|
+| Caso de uso | `CU-{AREA}-{NNN}` | `CU-VEN-001` |
+| Regla de negocio | `RN-{AREA}-{NNN}` | `RN-VEN-002` |
+| Diagrama | `D-{TYPE}-{AREA}-{NNN}` | `D-ROB-VEN-004` |
+| Archivo | `lowercase_with_underscores` | `cu_ven_001_crear_presupuesto.md` |
+| Evidencia | `EV-{TYPE}-{NNN}` | `EV-COD-001` |
+
+Áreas: `VEN` (Ventas), `FAC` (Facturación), `ENT` (Entregas), `INV` (Inventario), `ARQ` (Arquitectura), `DOM` (Dominio), `GEN` (General).
+
+## Resultados de la primera iteración
+
+- **7 CU** documentados con especificación completa (objetivo, alcance, actor, flujos, excepciones, RN, modelos Odoo, métodos, pantallas, evidencia).
+- **2 diagramas de robustez** (CU-VEN-001, CU-VEN-004, CU-ENT-002, CU-FAC-001).
+- **3 diagramas de secuencia** (idem).
+- **1 modelo de dominio conceptual** con 12 conceptos y 9 reglas de negocio.
+- **1 modelo de clases técnicas** mostrando la integración entre venta, stock y contabilidad.
+- **30 EV-COD** generadas (código verificado contra código real de Odoo 19.0).
+- **8 EV-INF** pendientes (reducidas desde 22 originales tras validación).
+
+## Herramientas
+
+- **Hermano (este agente)**: el swarm `saptfi2026` con 8 skills especializadas.
+- **PlantUML**: para generar los diagramas.
+- **Git**: para versionar todo.
+- **OpenRouter + minimax-m3**: como modelo de lenguaje.
+- **GitHub**: para publicar el repo (gate S2: push solo con OK manual de Ale).
+
+## Próxima sección
+
+→ [Cómo leer los CU](03_como_leer_los_cu.md) — guía paso a paso para interpretar las especificaciones.
\ No newline at end of file
diff --git a/docs/10_material_estudio/03_como_leer_los_cu.md b/docs/10_material_estudio/03_como_leer_los_cu.md
new file mode 100644
index 0000000..a8c3e6a
--- /dev/null
+++ b/docs/10_material_estudio/03_como_leer_los_cu.md
@@ -0,0 +1,167 @@
+# Cómo leer los Casos de Uso
+
+## Estructura de un CU
+
+Cada archivo `cu_xxx_nnn_nombre.md` tiene **20 secciones fijas**. Vamos a recorrerlas una por una con un ejemplo real.
+
+## Ejemplo: CU-VEN-001 Crear Presupuesto
+
+Vamos a leer el archivo [`cu_ven_001_crear_presupuesto.md`](../../02_casos_uso/cu_ven_001_crear_presupuesto.md) sección por sección.
+
+### 1. Objetivo
+
+> *"Crear un presupuesto de venta (sales quotation) para un cliente en estado `draft`."*
+
+**Qué te dice**: en una frase, qué hace el CU. Si no podés resumir el CU en una oración, probablemente está mal definido.
+
+### 2. Alcance
+
+> *"Módulo `sale` de Odoo 19.0. Aplica al modelo `sale.order`."*
+
+**Qué te dice**: en qué parte del sistema aplica. El módulo y el modelo principal.
+
+### 3. Nivel
+
+> *"Primario (esencial para el proceso de ventas)."*
+
+**Tres valores posibles**:
+- **Primario**: esencial, no se puede eliminar.
+- **Secundario**: importante pero no esencial.
+- **Opcional**: nice-to-have.
+
+### 4. Actor principal
+
+> *"Vendedor (usuario con permisos `sales_team.group_sale_salesman`)."*
+
+**Qué te dice**: quién inicia el CU. Siempre con el permiso técnico necesario.
+
+### 5. Actores secundarios
+
+> *"Cliente (consulta estado), Servicio de correo (envía presupuesto)."*
+
+**Qué te dice**: otros actores involucrados pero que no inician el CU.
+
+### 6. Interesados (stakeholders)
+
+> *"Responsable de ventas (aprueba descuentos), Administración (visualiza pipeline)."*
+
+**Qué te dice**: personas o sistemas afectados por el CU, aunque no participen directamente.
+
+### 7. Disparador
+
+> *"El vendedor hace clic en 'Nuevo' desde la vista kanban o tree de `sale.order`."*
+
+**Qué te dice**: qué evento inicia el CU.
+
+### 8. Precondiciones
+
+> *"El usuario tiene acceso al módulo `sale`. Existe al menos un cliente activo en `res.partner`. El catálogo de productos contiene productos publicables."*
+
+**Qué te dice**: qué condiciones deben cumplirse ANTES de que el CU pueda ejecutarse.
+
+### 9. Garantías mínimas
+
+> *"El sistema crea un registro `sale.order` en estado `draft` sin errores."*
+
+**Qué te dice**: qué pasa **incluso si algo falla**. Por ejemplo, "se crea el registro aunque después falle otro paso".
+
+### 10. Garantías de éxito
+
+> *"El presupuesto tiene un `name` único asignado por la secuencia `sale.order`. Los totales se calculan automáticamente con impuestos."*
+
+**Qué te dice**: qué pasa **cuando todo sale bien**.
+
+### 11. Flujo principal (paso a paso)
+
+> 1. Vendedor hace clic en "Nuevo" → sistema crea `sale.order` en estado `draft`.
+> 2. Sistema asigna `name` con valor por defecto...
+> 3. Vendedor selecciona `partner_id`...
+
+**Qué te dice**: la secuencia de pasos **felices**. Cada paso debe ser verificable.
+
+### 12. Flujos alternativos
+
+> FA-01 — Aplicar descuento
+> 1. Vendedor edita `discount` en una línea...
+
+**Qué te dice**: variaciones del flujo principal. Se numeran como FA-NN.
+
+### 13. Excepciones
+
+> EX-01 — Cliente sin dirección de entrega
+> 1. Al intentar confirmar (estado `sale`), sistema valida...
+
+**Qué te dice**: qué pasa cuando algo falla. Se numeran como EX-NN.
+
+### 14. Reglas de negocio
+
+> - **RN-VEN-001**: `state` solo puede pasar de `draft` → `sent` → `sale`, o a `cancel`.
+
+**Qué te dice**: reglas que el sistema debe enforzar. Se numeran como RN-{AREA}-{NNN}.
+
+### 15. Datos de entrada / salida
+
+**Entrada**: cliente, compañía, moneda, lista de precios, líneas.
+**Salida**: registro `sale.order` persistido, líneas, correo.
+
+**Qué te dice**: qué información fluye hacia adentro y hacia afuera.
+
+### 16. Estados involucrados
+
+> `draft` → `sent` → `sale` (o `cancel`).
+
+**Qué te dice**: las transiciones de estado del modelo.
+
+### 17. Pantallas involucradas
+
+> - `view_sale_order_form`
+> - `view_sale_order_kanban`
+> - `view_sale_order_tree`
+
+**Qué te dice**: las vistas que el usuario ve durante el CU.
+
+### 18. Modelos y métodos de Odoo
+
+> **Modelos**: `sale.order`, `sale.order.line`, `res.partner`, `product.product`...
+> **Métodos**: `action_quotation_send()`, `action_confirm()`, `_compute_amounts()`...
+
+**Qué te dice**: las clases técnicas de Odoo y sus métodos. Acá empieza el modelo técnico.
+
+### 19. Permisos y configuraciones
+
+> - `sales_team.group_sale_salesman` (vendedor)
+> - `sales_team.group_sale_manager` (responsable)
+
+**Qué te dice**: permisos requeridos y configuraciones que afectan el CU.
+
+### 20. Evidencias de ingeniería inversa
+
+> **EV-COD-001**: `addons/sale/models/sale_order.py:34-36` — definición de la clase `SaleOrder` con `_name = 'sale.order'`.
+
+**Qué te dice**: **la fuente exacta** que respalda cada afirmación. **Esta es la sección más importante** del CU.
+
+## Cómo navegar un CU para entender un proceso
+
+1. **Empezá por el Objetivo y el Disparador** (sección 1 y 7).
+2. **Leé el Flujo principal** (sección 11) para entender el camino feliz.
+3. **Revisá las Reglas de negocio** (sección 14) para entender las restricciones.
+4. **Leé las Evidencias** (sección 20) para validar que lo que dice el CU coincide con el código real.
+5. Si necesitás detalle técnico, mirá las secciones 17-19 (pantallas, modelos, métodos).
+
+## Diferencia entre CU y método técnico
+
+Un **CU** describe **qué** hace el sistema desde la perspectiva del usuario. Un **método técnico** describe **cómo** lo hace.
+
+Por ejemplo:
+
+| CU | Método |
+|----|--------|
+| *"Vendedor confirma el pedido"* | `sale.order.action_confirm()` |
+| *"El sistema valida que las líneas tengan producto"* | `_confirmation_error_message()` retorna string si hay error |
+| *"Se envía email al cliente"* | `action_quotation_send()` abre wizard de email |
+
+Cuando leas un CU, **no te pierdas en los métodos**. Lee primero el flujo, después mirá los métodos para entender la implementación.
+
+## Próxima sección
+
+→ [Ejercicios prácticos](04_ejercicios_practicos.md) — para fijar los conceptos.
\ No newline at end of file
diff --git a/docs/10_material_estudio/04_ejercicios_practicos.md b/docs/10_material_estudio/04_ejercicios_practicos.md
new file mode 100644
index 0000000..d4e17c5
--- /dev/null
+++ b/docs/10_material_estudio/04_ejercicios_practicos.md
@@ -0,0 +1,146 @@
+# Ejercicios Prácticos
+
+## Objetivo
+
+Estos ejercicios te ayudan a **fijar los conceptos** de ICONIX aplicados a Odoo. Trabajan sobre los artefactos reales de este proyecto.
+
+## Antes de empezar
+
+Asegurate de tener:
+1. El código fuente de Odoo 19.0 clonado (en `~/proyectos/odoo_src/odoo`).
+2. Los CU de este proyecto (en `docs/02_casos_uso/`).
+3. Un editor de texto y PlantUML instalados.
+
+## Ejercicio 1: Validar una afirmación con código
+
+**Objetivo**: entender el flujo de evidencia EV-COD.
+
+**Tarea**:
+1. Abrí el archivo `docs/02_casos_uso/cu_ven_001_crear_presupuesto.md`.
+2. Buscá la evidencia `EV-COD-001`.
+3. Abrí el archivo `addons/sale/models/sale_order.py` en `~/proyectos/odoo_src/odoo/`.
+4. Andá a las líneas 34-36.
+5. Verificá que el código realmente coincide con lo que dice la evidencia.
+
+**Pregunta para responder**:
+- ¿Qué patrón sigue la herencia de `SaleOrder`? ¿Por qué creés que se eligieron esos mixins?
+
+## Ejercicio 2: Diferenciar modelo conceptual de técnico
+
+**Objetivo**: entender por qué mantenemos dos diagramas separados.
+
+**Tarea**:
+1. Abrí `diagrams/plantuml/d_cla_con_gen_001_modelo_dominio.puml` (modelo conceptual).
+2. Abrí `diagrams/plantuml/d_cla_int_001_integracion_ven_stock_cont.puml` (modelo técnico).
+3. Compilá ambos con PlantUML: `java -jar plantuml.jar -tpdf archivo.puml`.
+4. Compará los PDFs.
+
+**Preguntas para responder**:
+- ¿Qué conceptos están en el conceptual pero NO en el técnico? ¿Por qué?
+- ¿Qué campos del técnico NO están en el conceptual? ¿Por qué?
+- ¿Cuándo usarías uno y cuándo el otro?
+
+## Ejercicio 3: Seguir un flujo de punta a punta
+
+**Objetivo**: trazar el flujo completo del CU-VEN-001 al código real.
+
+**Tarea**:
+1. Abrí el CU-VEN-001 (`docs/02_casos_uso/cu_ven_001_crear_presupuesto.md`).
+2. Abrí `diagrams/plantuml/d_sec_ven_001_crear_presupuesto.puml` (secuencia).
+3. Compilá ambos y mirá los PDFs.
+4. Para cada paso del flujo principal, identificá:
+ - Qué archivo y método de Odoo se ejecuta.
+ - Qué tabla de BD se modifica.
+ - Qué evidencia (EV-COD) lo respalda.
+
+**Output esperado**: una tabla con columnas `Paso | Método Odoo | Tabla BD | Evidencia`.
+
+## Ejercicio 4: Crear un CU nuevo
+
+**Objetivo**: aplicar ICONIX para agregar un caso que NO está en la primera iteración.
+
+**Tarea**: elegí UNO de los siguientes CU y documentalo siguiendo la plantilla:
+
+### Opción A: CU-VEN-005 Cancelar pedido
+
+**Contexto**: el vendedor necesita cancelar un pedido que ya estaba confirmado.
+
+**Pasos**:
+1. Leé CU-VEN-001 y CU-VEN-004 para entender el contexto.
+2. Investigá el método `action_cancel()` en `addons/sale/models/sale_order.py:1324`.
+3. Investigá también cómo `sale_stock` extiende la cancelación.
+4. Escribí `docs/02_casos_uso/cu_ven_005_cancelar_pedido.md`.
+5. Generá el diagrama de robustez y secuencia.
+6. Generá EV-COD para cada afirmación.
+
+### Opción B: CU-FAC-005 Emitir nota de crédito
+
+**Contexto**: el facturador necesita revertir una factura publicada.
+
+**Pasos**:
+1. Investigá el flujo de notas de crédito en Odoo 19.
+2. Buscá `_reverse_moves()` o `action_reverse()` en `addons/account/models/account_move.py`.
+3. Documentá el CU.
+4. Generá los diagramas y las evidencias.
+
+### Opción C: CU-INV-001 Consultar existencias
+
+**Objetivo**: el operador de inventario quiere ver cuántas unidades hay de un producto.
+
+**Pasos**:
+1. Investigá el modelo `stock.quant` en `addons/stock/models/stock_quant.py`.
+2. Investigá cómo se accede desde el form de producto.
+3. Documentá el CU.
+4. Generá los diagramas y las evidencias.
+
+## Ejercicio 5: Validar una EV-INF
+
+**Objetivo**: cerrar el ciclo de evidencia.
+
+**Tarea**:
+1. Abrí `evidence/index.md`.
+2. Elegí UNA EV-INF pendiente (ejemplo: EV-INF-008 sobre `button_validate`).
+3. Buscá el código relevante en Odoo:
+ - `grep -n "def button_validate" addons/stock/models/stock_picking.py`
+ - Leé el método completo (~50 líneas).
+4. Verificá si la inferencia es correcta.
+5. Si es correcta: convertila en EV-COD con la ruta y línea exacta.
+6. Si es incorrecta: marcala como obsoleta y proponé una EV-COD corregida.
+
+## Ejercicio 6: Mejorar la trazabilidad
+
+**Objetivo**: entender la matriz de trazabilidad.
+
+**Tarea**:
+1. Abrí `docs/09_trazabilidad/matriz_trazabilidad.md`.
+2. Agregá una fila para CU-VEN-005 (cancelación).
+3. Definí las relaciones:
+ - ¿Qué reglas de negocio aplica?
+ - ¿A qué modelo Odoo apunta?
+ - ¿Qué evidencia EV-COD lo respalda?
+4. Actualizá la matriz.
+
+## Criterios de evaluación
+
+| Criterio | Excelente | Aceptable | Necesita mejora |
+|----------|-----------|------------|-----------------|
+| Uso de evidencia | Cada afirmación tiene EV-COD con línea exacta | Algunas EV-INF | Muchas afirmaciones sin evidencia |
+| Separación conceptual/técnico | Clara y justificada | Presente pero confusa | Mezclados |
+| Compilabilidad PlantUML | Todos los .puml compilan sin error | Algunos fallan | Muchos fallan |
+| Trazabilidad | Matriz completa y consistente | Algunas relaciones | Sin matriz |
+| Aplicación de ICONIX | Las 9 fases reflejadas en artefactos | Algunas fases | Solo CU, sin resto |
+
+## Recursos para profundizar
+
+- **Libros**:
+ - *Use Case Driven Object Modeling with UML* — Rosenberg & Scott.
+ - *Applying UML and Patterns* — Craig Larman.
+ - *OCA Odoo Development Essentials* — Daniel Reis (para Odoo técnico).
+
+- **Sitios web**:
+ - https://www.odoo.com/documentation/19.0/ — docs oficiales de Odoo 19.
+ - https://github.com/odoo/odoo/tree/19.0 — código fuente.
+
+- **Herramientas**:
+ - PlantUML: https://plantuml.com/
+ - Odoo CLI: https://www.odoo.com/documentation/19.0/administration/install/cli.html
\ No newline at end of file
diff --git a/docs/10_material_estudio/README.md b/docs/10_material_estudio/README.md
new file mode 100644
index 0000000..1c20b24
--- /dev/null
+++ b/docs/10_material_estudio/README.md
@@ -0,0 +1,38 @@
+# Material Educativo — SAP-TFI-2026
+
+> Material pedagógico para estudiantes del curso SAP-TFI-2026 y revisores técnicos.
+
+## ¿Qué encontrarás aquí?
+
+Este material explica **cómo se aplicó la metodología ICONIX** para hacer ingeniería inversa de los módulos nativos de Odoo 19.0 (Ventas, Facturación, Entregas, Inventario). Está pensado para que cualquier estudiante o analista pueda entender el proceso y replicarlo.
+
+## Secciones
+
+| # | Sección | Descripción |
+|---|---------|-------------|
+| 1 | [¿Qué es ICONIX?](01_que_es_iconix.md) | Introducción a la metodología ICONIX |
+| 2 | [Aplicación a Odoo](02_aplicacion_a_odoo.md) | Cómo se adaptó ICONIX a Odoo |
+| 3 | [Cómo leer los CU](03_como_leer_los_cu.md) | Guía para leer las especificaciones de casos de uso |
+| 4 | [Ejercicios prácticos](04_ejercicios_practicos.md) | Ejercicios para fijar los conceptos |
+
+## Audiencia
+
+- **Estudiantes** del curso SAP-TFI-2026 que están aprendiendo ICONIX.
+- **Analistas funcionales** que necesitan entender Odoo antes de implementarlo.
+- **Desarrolladores** que quieren entender cómo está estructurado Odoo por dentro.
+- **Revisores técnicos** que validan que la documentación refleja el código real.
+
+## Cómo usar este material
+
+1. **Empezá por la sección 1** para entender qué es ICONIX.
+2. **Leé la sección 2** para ver cómo se aplicó específicamente a Odoo.
+3. **Usá la sección 3 como referencia** cada vez que leas un CU.
+4. **Hacé los ejercicios de la sección 4** para fijar los conceptos.
+
+## Regla de oro del material
+
+> **Cada afirmación sobre Odoo tiene una fuente de evidencia.** Si no podés verificar una afirmación contra código, está marcada como `EV-INF` (inferencia pendiente). Si la podés verificar contra código real, está marcada como `EV-COD` (código verificado) con la ruta exacta del archivo y la línea.
+
+## Cómo se generó
+
+Este material fue generado por el agente `saptfi2026` (parte del swarm Hermano de Ale Sartorio) aplicando la metodología ICONIX de manera rigurosa, con verificación contra el código fuente oficial de Odoo 19.0 (rama `19.0` del repositorio `https://github.com/odoo/odoo`).
\ No newline at end of file
diff --git a/evidence/index.md b/evidence/index.md
new file mode 100644
index 0000000..4c2c9c9
--- /dev/null
+++ b/evidence/index.md
@@ -0,0 +1,80 @@
+# Índice de Evidencias — SAP-TFI-2026
+
+> Última actualización: 2026-06-18
+
+## EV-COD — Código fuente verificado (30 evidencias)
+
+| ID | Modelo | Ruta | Línea | Descripción |
+|----|--------|------|------:|-------------|
+| EV-COD-001 | sale.order | addons/sale/models/sale_order.py | 34-36 | Definición de clase `SaleOrder` con `_name='sale.order'` |
+| EV-COD-002 | sale.order | addons/sale/models/sale_order.py | 26-31 | `SALE_ORDER_STATE`: `draft`, `sent`, `sale`, `cancel` |
+| EV-COD-003 | sale.order | addons/sale/models/sale_order.py | 1067 | Método `action_quotation_send` |
+| EV-COD-004 | sale.order | addons/sale/models/sale_order.py | 1166 | Método `action_confirm` |
+| EV-COD-005 | sale.order | addons/sale/models/sale_order.py | 54-58 | Campo `name` con default `_("New")` |
+| EV-COD-006 | sale.order | addons/sale/models/sale_order.py | 1166-1196 | `action_confirm` cuerpo completo |
+| EV-COD-007 | sale.order | addons/sale/models/sale_order.py | 1203-1216 | `_confirmation_error_message` |
+| EV-COD-008 | sale.order | addons/sale/models/sale_order.py | 1218-1229 | `_prepare_confirmation_values` |
+| EV-COD-009 | sale.order | addons/sale/models/sale_order.py | 1198-1201 | `_should_be_locked` |
+| EV-COD-010 | stock.picking | addons/stock/models/stock_picking.py | 1195 | Método `action_assign` |
+| EV-COD-011 | stock.picking | addons/stock/models/stock_picking.py | 1186 | Método `action_confirm` |
+| EV-COD-012 | stock.picking | addons/stock/models/stock_picking.py | 1398 | Método `button_validate` |
+| EV-COD-013 | sale.order | addons/sale/models/sale_order.py | 1550 | Método `_create_invoices` |
+| EV-COD-014 | sale.order | addons/sale/models/sale_order.py | 1411 | Método `_prepare_invoice` |
+| EV-COD-015 | account.move | addons/account/models/account_move.py | 72-73 | Definición de `AccountMove` |
+| EV-COD-016 | account.move | addons/account/models/account_move.py | 6101 | Método `action_post` |
+| EV-COD-017 | account.move | addons/account/models/account_move.py | 72-73 | Clase `AccountMove` con `_name='account.move'` |
+| EV-COD-018 | account.move | addons/account/models/account_move.py | 129 | Campo `state` |
+| EV-COD-019 | account.move | addons/account/models/account_move.py | 6022 | Método `action_register_payment` |
+| EV-COD-020 | account.move | addons/account/models/account_move.py | 600 | Campo `payment_state` |
+| EV-COD-021 | sale.order | addons/sale/models/sale_order.py | 1231-1235 | Método `_action_confirm` (stub) |
+| EV-COD-022 | stock.picking | addons/stock/models/stock_picking.py | 1195-1208 | `action_assign` cuerpo completo |
+| EV-COD-023 | sale_stock | addons/sale_stock/models/sale_order.py | 31 | Campo `picking_ids` (vincula con stock.picking) |
+| EV-COD-024 | account.move | addons/account/models/account_move.py | 48-56 | `PAYMENT_STATE_SELECTION` con 7 valores |
+| EV-COD-025 | account.move | addons/account/models/account_move.py | 600-606 | Campo `payment_state` (Selection computed) |
+| EV-COD-026 | account.move | addons/account/models/account_move.py | 6101-6122 | `action_post` cuerpo (incluye wizard validación) |
+| EV-COD-027 | sale.order | addons/sale/models/sale_order.py | 1237-1244 | `_send_order_confirmation_mail` |
+| EV-COD-028 | sale.order | addons/sale/models/sale_order.py | 1192 | `_trigger_scheduler()` invocado al confirmar |
+| EV-COD-029 | stock.picking | addons/stock/models/stock_picking.py | 1210-1214 | Método `action_cancel` |
+| EV-COD-030 | sale.order | addons/sale/models/sale_order.py | 1198-1201 | `_should_be_locked` |
+
+## EV-XML — Vistas y datos XML (pendiente)
+
+Por el momento no se generaron evidencias EV-XML en esta iteración. Las vistas se referencian pero no se inspeccionaron en detalle.
+
+## EV-DOC — Documentación oficial (pendiente)
+
+Por el momento no se generaron evidencias EV-DOC en esta iteración.
+
+## EV-INF — Inferencias pendientes (15 → 5, las críticas se actualizaron a EV-COD)
+
+Las siguientes inferencias fueron **validadas y promovidas a EV-COD** en esta iteración:
+
+- ~~EV-INF-004~~ → **EV-COD-021** (`_action_confirm` ubicación confirmada)
+- ~~EV-INF-006~~ → **EV-COD-022** (`action_assign` cuerpo verificado)
+- ~~EV-INF-007~~ → **EV-COD-023** (`picking_ids` en sale_stock confirma relación con stock.picking)
+- ~~EV-INF-012~~ → **EV-COD-026** (`action_post` cuerpo verificado, incluye wizard)
+- ~~EV-INF-013~~ → **EV-COD-026** (validaciones específicas requieren lectura adicional)
+- ~~EV-INF-014~~ → **EV-COD-024** (7 valores de payment_state verificados)
+- ~~EV-INF-015~~ → **EV-COD-025** (campo `payment_state` verificado como computed)
+- ~~EV-INF-016~~ → **EV-COD-024** (PAYMENT_STATE_SELECTION da los valores)
+
+### EV-INF que permanecen pendientes
+
+- **EV-INF-005**: Implementación interna de `_action_confirm` en `sale_stock` (extiende el stub base).
+- **EV-INF-008, 009**: Lógica interna de `button_validate()` (backorder automático).
+- **EV-INF-010, 011**: Lógica de agrupación de facturas (`grouped=True`).
+- **EV-INF-017, 018**: Modelo conceptual aproximado, refinable.
+- **EV-INF-019, 020**: Diferencias Community vs Enterprise.
+- **EV-INF-021, 022**: Campos exactos del form y botones visibles.
+
+## Resumen
+
+| Tipo | Cantidad |
+|------|----------|
+| EV-COD (verificado contra código) | **30** |
+| EV-XML (vistas) | 0 |
+| EV-DOC (documentación) | 0 |
+| EV-DB (base de datos) | 0 |
+| EV-TEST (pruebas) | 0 |
+| EV-INF (inferencias pendientes) | 8 (reducidas de 22) |
+| **TOTAL** | **38** |