analytic_line.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from odoo import models, api, fields
  2. import logging
  3. _logger = logging.getLogger(__name__)
  4. class AccountAnalyticLine(models.Model):
  5. _inherit = 'account.analytic.line'
  6. @api.model_create_multi
  7. def create(self, vals_list):
  8. records = super().create(vals_list)
  9. for record in records:
  10. self._stc_auto_link_so_line(self.browse(record.id))
  11. return records
  12. def write(self, vals):
  13. res = super().write(vals)
  14. for record in self:
  15. # Si se está actualizando el empleado o no hay so_line, volver a buscar la línea
  16. if 'employee_id' in vals or not record.so_line:
  17. self._stc_auto_link_so_line(self.browse(record.id))
  18. return res
  19. def _stc_auto_link_so_line(self, record):
  20. _logger.info('[STC] Analizando línea de tiempo ID %s', record.id)
  21. if record.project_id:
  22. _logger.info('[STC] Proyecto: %s', record.project_id.id)
  23. sale_order = record.project_id.reinvoiced_sale_order_id
  24. if sale_order:
  25. _logger.info('[STC] Proyecto tiene reinvoiced_sale_order_id: %s', sale_order.id)
  26. template_lines = self.env['sale.order.template.line'].search([
  27. ('project_id', '=', record.project_id.id)
  28. ])
  29. _logger.info('[STC] Líneas de plantilla encontradas para el proyecto: %s', template_lines.ids)
  30. if template_lines:
  31. order_lines = sale_order.order_line.filtered(lambda l: l.template_line_id in template_lines)
  32. _logger.info('[STC] Líneas de pedido encontradas en el SO: %s', order_lines.ids)
  33. if record.employee_id:
  34. template_lines_with_employee = template_lines.filtered(lambda l: l.employee_id == record.employee_id)
  35. _logger.info('[STC] Líneas de plantilla con empleado %s: %s', record.employee_id.id, template_lines_with_employee.ids)
  36. order_lines_with_employee = order_lines.filtered(lambda l: l.template_line_id in template_lines_with_employee)
  37. _logger.info('[STC] Líneas de pedido con empleado: %s', order_lines_with_employee.ids)
  38. if order_lines_with_employee:
  39. record.so_line = order_lines_with_employee[0].id
  40. _logger.info('[STC] Asociada so_line %s por empleado', order_lines_with_employee[0].id)
  41. return
  42. if order_lines:
  43. record.so_line = order_lines[0].id
  44. _logger.info('[STC] Asociada so_line %s por default', order_lines[0].id)
  45. else:
  46. _logger.info('[STC] No se encontraron líneas de pedido asociables')
  47. else:
  48. _logger.info('[STC] No se encontraron líneas de plantilla para el proyecto')
  49. else:
  50. _logger.info('[STC] Proyecto no tiene reinvoiced_sale_order_id')
  51. else:
  52. _logger.info('[STC] No tiene proyecto')
  53. class ProjectProject(models.Model):
  54. _inherit = 'project.project'
  55. sale_order_template_project = fields.Boolean(
  56. string='Disponible para plantillas de venta',
  57. help='Si está activo, este proyecto puede ser seleccionado en líneas de plantillas de venta.'
  58. )