planning_slot.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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.utils import Intervals, sum_intervals, string_to_datetime, timezone_datetime
  12. from odoo.exceptions import UserError, AccessError
  13. from odoo.osv import expression
  14. from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, float_utils, format_datetime
  15. _logger = logging.getLogger(__name__)
  16. class PlanningSlot(models.Model):
  17. _inherit = 'planning.slot'
  18. real_working_days_count = fields.Float(
  19. string='Real Working Days',
  20. compute='_compute_working_days_count',
  21. store=True,
  22. help='Number of working days available in the month, regardless of slot start and end dates'
  23. )
  24. @api.depends('start_datetime', 'end_datetime', 'resource_id', 'company_id')
  25. def _compute_working_days_count(self):
  26. for slot in self:
  27. if not slot.start_datetime:
  28. slot.real_working_days_count = 0
  29. continue
  30. # Obtener el primer día del mes
  31. start_of_month = slot.start_datetime.replace(day=1, hour=0, minute=0, second=0)
  32. _logger.info(start_of_month)
  33. # Obtener el último día del mes
  34. end_of_month = (start_of_month + relativedelta(months=1, days=-1)).replace(hour=23, minute=59, second=59)
  35. _logger.info(end_of_month)
  36. # Obtener el calendario de trabajo
  37. calendar = slot.resource_id.calendar_id or slot.company_id.resource_calendar_id
  38. if not calendar:
  39. slot.real_working_days_count = 0
  40. continue
  41. # Calcular los días laborables del mes completo
  42. real_working_days = calendar.get_work_duration_data(
  43. timezone_datetime(start_of_month),
  44. timezone_datetime(end_of_month),
  45. compute_leaves=True
  46. )
  47. _logger.info(real_working_days)
  48. _logger.info(calendar)
  49. _logger.info(calendar.hours_per_day)
  50. # El resultado viene en horas, lo convertimos a días
  51. slot.real_working_days_count = real_working_days['hours'] / calendar.hours_per_day