From 820c05ffa9114284298601de55c6e48f5a511499 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Tue, 15 Jul 2025 01:17:37 -0600 Subject: [PATCH] =?UTF-8?q?fix:=20Implementar=20generaci=C3=B3n=20autom?= =?UTF-8?q?=C3=A1tica=20de=20pruebas=20y=20mejorar=20selecci=C3=B3n=20de?= =?UTF-8?q?=20muestras?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Agregar método _generate_lab_tests() en sale.order para crear pruebas automáticamente al confirmar orden - Agregar método _find_sample_for_analysis() para asociar muestras con análisis según tipo - Mejorar dominio de sample_id en lims.test para filtrar por paciente y estado (collected/in_analysis) - Agregar método _onchange_sale_order_line() para actualizar dominio de muestra dinámicamente - Las pruebas ahora se crean automáticamente con la muestra correcta asignada Esto resuelve el problema reportado donde las órdenes aprobadas no generaban pruebas y las muestras no estaban disponibles para selección manual. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../__pycache__/sale_order.cpython-312.pyc | Bin 7204 -> 10422 bytes lims_management/models/lims_test.py | 32 ++++++- lims_management/models/sale_order.py | 81 ++++++++++++++++-- 3 files changed, 106 insertions(+), 7 deletions(-) diff --git a/lims_management/models/__pycache__/sale_order.cpython-312.pyc b/lims_management/models/__pycache__/sale_order.cpython-312.pyc index 50afd7af0e0aa273ce2fdea2a8ef176822a247e3..b4b681664a49a97e4f3ca138d394e42d08680818 100644 GIT binary patch delta 3444 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 delta 1036 zcmYk4OK1~O6o%){D@~fDV`381nmSEF(jbW%AC#I#`|?q>(i9){6^CZ5Dbpn0nTUpp z8wEudmJ7NPT)0pK5dxw}vAR)kQ&Fi5g18bl8lMYM@Sa4$yZGkZbN+Mgx#!N^k?UQ~ zXAXyrp(|M{AHBC^#`zY_&3t@dJI95CqonMR{b zh%xG^kRE36;ZvMp2OHL8OXK@LbL=!bDUlJchvN)4dC!NChbT+k9^XGzj=zN(HjS?q z;%J&Ef*Y+RWg$jx2!VmnAjU;3PpAbID@MLBA?wOiNmF(C2z3{6PQ`MC?Uu{?X_$T)rkd{A} zmcNqXHG%qTt>lx%-`_ts_+;qO&|K;%ewo=dzkAP%%-;EtvHA9WFQxr8ky+$jkb=*p z;2VEyjX_Jdpsx&S-HP698-9B1*}BghYR!=0rZ&Hq_IOk3VP~y<5#f>8>+S0h9(M?R zk?NVI42LRYp}E~(;ZtQTO{wM66;6)J6(O|(Y~r-94nqkHtNyzmLIJnyZG9U=B0P6D)G28=p1E3p|KdxvxUJv^y zg$^pXg!SJ&lEm+iqO;Xre-5!RiQJBCAA?p*>kg%GGC4(o*Fbt3AOJ`Jk`$&Rn;q8_ zT_0C9Et`!Y+)2GU{Pi0fQ?h~-&;)_AU`V+uQpIaRBt-ehnO_+jinn^IHsO*A!)HB#za{test.name} - {test.product_id.name}" + test_list += "" + + self.message_post( + body=_("Pruebas generadas automáticamente: %s") % test_list, + message_type='notification' + ) + _logger.info(f"Created {len(created_tests)} tests for order {self.name}") + + def _find_sample_for_analysis(self, product): + """Find the appropriate sample for an analysis product""" + # Check if the analysis has a required sample type + if not product.required_sample_type_id: + return False + + # Find a generated sample with matching sample type + for sample in self.generated_sample_ids: + if sample.sample_type_product_id.id == product.required_sample_type_id.id: + return sample + + return False