planning_slot.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import calendar
  2. from collections import defaultdict
  3. from datetime import date, datetime, timedelta, time
  4. from dateutil.relativedelta import relativedelta
  5. import logging
  6. import pytz
  7. import uuid
  8. from math import modf
  9. from random import randint
  10. from odoo import api, fields, models, _
  11. from odoo.addons.resource.models.resource import Intervals, sum_intervals, string_to_datetime
  12. from odoo.addons.resource.models.resource_mixin import timezone_datetime
  13. from odoo.exceptions import UserError, AccessError
  14. from odoo.osv import expression
  15. from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, float_utils, format_datetime
  16. _logger = logging.getLogger(__name__)
  17. class PlanningSlot(models.Model):
  18. _inherit = 'planning.slot'
  19. real_working_days_count = fields.Float(
  20. string='Real Working Days',
  21. store=True,
  22. )
  23. def _compute_working_days_count(self):
  24. super(PlanningSlot, self)._compute_working_days_count()
  25. for slot in self:
  26. if not slot.start_datetime:
  27. slot.real_working_days_count = 0
  28. continue
  29. # Obtener el primer día del mes
  30. start_of_month = slot.start_datetime.replace(day=1, hour=0, minute=0, second=0)
  31. # Obtener el último día del mes
  32. end_of_month = (start_of_month + relativedelta(months=1, days=-1)).replace(hour=23, minute=59, second=59)
  33. # Obtener el calendario de trabajo
  34. calendar = slot.resource_id.calendar_id or slot.company_id.resource_calendar_id
  35. if not calendar:
  36. slot.real_working_days_count = 0
  37. continue
  38. # Calcular los días laborables del mes completo
  39. real_working_days = calendar.get_work_duration_data(
  40. start_of_month,
  41. end_of_month,
  42. compute_leaves=True
  43. )
  44. # El resultado viene en horas, lo convertimos a días
  45. slot.real_working_days_count = real_working_days['hours'] / calendar.hours_per_day