from odoo import models, api, fields import logging _logger = logging.getLogger(__name__) class AccountAnalyticLine(models.Model): _inherit = 'account.analytic.line' @api.model_create_multi def create(self, vals_list): records = super().create(vals_list) for record in records: self._stc_auto_link_so_line(self.browse(record.id)) return records def write(self, vals): res = super().write(vals) for record in self: # Si se está actualizando el empleado o no hay so_line, volver a buscar la línea if 'employee_id' in vals or not record.so_line: self._stc_auto_link_so_line(self.browse(record.id)) return res def _stc_auto_link_so_line(self, record): _logger.info('[STC] Analizando línea de tiempo ID %s', record.id) if record.project_id: _logger.info('[STC] Proyecto: %s', record.project_id.id) sale_order = record.project_id.reinvoiced_sale_order_id if sale_order: _logger.info('[STC] Proyecto tiene reinvoiced_sale_order_id: %s', sale_order.id) template_lines = self.env['sale.order.template.line'].search([ ('project_id', '=', record.project_id.id) ]) _logger.info('[STC] Líneas de plantilla encontradas para el proyecto: %s', template_lines.ids) if template_lines: order_lines = sale_order.order_line.filtered(lambda l: l.template_line_id in template_lines) _logger.info('[STC] Líneas de pedido encontradas en el SO: %s', order_lines.ids) if record.employee_id: template_lines_with_employee = template_lines.filtered(lambda l: l.employee_id == record.employee_id) _logger.info('[STC] Líneas de plantilla con empleado %s: %s', record.employee_id.id, template_lines_with_employee.ids) order_lines_with_employee = order_lines.filtered(lambda l: l.template_line_id in template_lines_with_employee) _logger.info('[STC] Líneas de pedido con empleado: %s', order_lines_with_employee.ids) if order_lines_with_employee: record.so_line = order_lines_with_employee[0].id _logger.info('[STC] Asociada so_line %s por empleado', order_lines_with_employee[0].id) return if order_lines: record.so_line = order_lines[0].id _logger.info('[STC] Asociada so_line %s por default', order_lines[0].id) else: _logger.info('[STC] No se encontraron líneas de pedido asociables') else: _logger.info('[STC] No se encontraron líneas de plantilla para el proyecto') else: _logger.info('[STC] Proyecto no tiene reinvoiced_sale_order_id') else: _logger.info('[STC] No tiene proyecto') class ProjectProject(models.Model): _inherit = 'project.project' sale_order_template_project = fields.Boolean( string='Disponible para plantillas de venta', help='Si está activo, este proyecto puede ser seleccionado en líneas de plantillas de venta.' )