# -*- coding: utf-8 -*- from odoo import models, fields, api, _ from odoo.exceptions import UserError import logging _logger = logging.getLogger(__name__) class SaleOrder(models.Model): _inherit = 'sale.order' is_lab_request = fields.Boolean( string="Es Orden de Laboratorio", default=False, copy=False, help="Campo técnico para identificar si la orden de venta es una solicitud de laboratorio." ) doctor_id = fields.Many2one( 'res.partner', string="Médico Referente", domain="[('is_doctor', '=', True)]", help="El médico que refirió al paciente para esta solicitud de laboratorio." ) generated_sample_ids = fields.Many2many( 'stock.lot', 'sale_order_stock_lot_rel', 'order_id', 'lot_id', string='Muestras Generadas', domain="[('is_lab_sample', '=', True)]", readonly=True, help="Muestras de laboratorio generadas automáticamente cuando se confirmó esta orden" ) def action_confirm(self): """Override to generate laboratory samples automatically""" res = super(SaleOrder, self).action_confirm() # Generate samples only for laboratory requests for order in self.filtered('is_lab_request'): try: order._generate_lab_samples() except Exception as e: _logger.error(f"Error generating samples for order {order.name}: {str(e)}") # Continue with order confirmation even if sample generation fails # But notify the user order.message_post( body=_("Error al generar muestras automáticamente: %s. " "Por favor, genere las muestras manualmente.") % str(e), message_type='notification' ) return res def _generate_lab_samples(self): """Generate laboratory samples based on the analyses in the order""" self.ensure_one() _logger.info(f"Generating laboratory samples for order {self.name}") # Group analyses by sample type sample_groups = self._group_analyses_by_sample_type() if not sample_groups: _logger.warning(f"No analyses with sample types found in order {self.name}") return # Create samples for each group created_samples = self.env['stock.lot'] for sample_type_id, group_data in sample_groups.items(): sample = self._create_sample_for_group(group_data) if sample: created_samples |= sample # Link created samples to the order if created_samples: self.generated_sample_ids = [(6, 0, created_samples.ids)] _logger.info(f"Created {len(created_samples)} samples for order {self.name}") # Post message with created samples sample_list = "